mirror of
				https://github.com/livebook-dev/livebook.git
				synced 2025-10-31 07:46:18 +08:00 
			
		
		
		
	Respect default elements outline on tab-navigation (#2749)
This commit is contained in:
		
							parent
							
								
									987f706f62
								
							
						
					
					
						commit
						05c9c17b8c
					
				
					 8 changed files with 26 additions and 32 deletions
				
			
		|  | @ -40,7 +40,7 @@ | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   .tabs .tab { |   .tabs .tab { | ||||||
|     @apply flex items-center space-x-2 px-3 py-2 border-b-2 text-gray-400 border-gray-100 whitespace-nowrap; |     @apply flex items-center space-x-2 px-3 py-2 border-b-2 text-gray-400 border-gray-100 whitespace-nowrap focus-visible:bg-gray-50 focus-visible:outline-none focus-visible:rounded-t-lg; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   .tabs .tab.active { |   .tabs .tab.active { | ||||||
|  |  | ||||||
|  | @ -13,12 +13,6 @@ | ||||||
|       "Segoe UI Emoji"; |       "Segoe UI Emoji"; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /* Remove the default outline on focused elements */ |  | ||||||
|   :focus, |  | ||||||
|   button:focus { |  | ||||||
|     outline: none; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   menu { |   menu { | ||||||
|     margin: 0; |     margin: 0; | ||||||
|     padding: 0; |     padding: 0; | ||||||
|  |  | ||||||
|  | @ -51,7 +51,7 @@ solely client-side operations. | ||||||
| 
 | 
 | ||||||
| [data-el-notebook-headline][data-js-focused] [data-el-heading], | [data-el-notebook-headline][data-js-focused] [data-el-heading], | ||||||
| [data-el-section-headline][data-js-focused] [data-el-heading] { | [data-el-section-headline][data-js-focused] [data-el-heading] { | ||||||
|   @apply border-blue-300; |   @apply border-blue-300 outline-none; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| [data-el-section-headline]:not(:hover):not([data-js-focused]) | [data-el-section-headline]:not(:hover):not([data-js-focused]) | ||||||
|  |  | ||||||
|  | @ -200,7 +200,6 @@ defmodule LivebookWeb.CoreComponents do | ||||||
|           role="dialog" |           role="dialog" | ||||||
|           aria-modal="true" |           aria-modal="true" | ||||||
|           tabindex="0" |           tabindex="0" | ||||||
|           autofocus |  | ||||||
|           phx-window-keydown={JS.exec("data-cancel", to: "##{@id}")} |           phx-window-keydown={JS.exec("data-cancel", to: "##{@id}")} | ||||||
|           phx-click-away={JS.exec("data-cancel", to: "##{@id}")} |           phx-click-away={JS.exec("data-cancel", to: "##{@id}")} | ||||||
|           phx-key="escape" |           phx-key="escape" | ||||||
|  | @ -236,6 +235,7 @@ defmodule LivebookWeb.CoreComponents do | ||||||
|   def show_modal(js \\ %JS{}, id) do |   def show_modal(js \\ %JS{}, id) do | ||||||
|     js |     js | ||||||
|     |> JS.show(to: "##{id}") |     |> JS.show(to: "##{id}") | ||||||
|  |     |> JS.dispatch("lb:focus", to: "##{id}-content") | ||||||
|     |> JS.transition( |     |> JS.transition( | ||||||
|       {"ease-out duration-200", "opacity-0", "opacity-100"}, |       {"ease-out duration-200", "opacity-0", "opacity-100"}, | ||||||
|       to: "##{id}-container" |       to: "##{id}-container" | ||||||
|  | @ -455,7 +455,7 @@ defmodule LivebookWeb.CoreComponents do | ||||||
|     ~H""" |     ~H""" | ||||||
|     <li class={[ |     <li class={[ | ||||||
|       "w-full", |       "w-full", | ||||||
|       "[&>:first-child]:w-full [&>:first-child]:flex [&>:first-child]:space-x-3 [&>:first-child]:px-5 [&>:first-child]:py-2 [&>:first-child]:items-center [&>:first-child:hover]:bg-gray-100 [&>:first-child:focus]:bg-gray-100 [&>:first-child]:whitespace-nowrap font-medium", |       "[&>:first-child]:w-full [&>:first-child]:flex [&>:first-child]:space-x-3 [&>:first-child]:px-5 [&>:first-child]:py-2 [&>:first-child]:items-center [&>:first-child:hover]:bg-gray-100 [&>:first-child:focus-visible]:bg-gray-100 [&>:first-child:focus-visible]:outline-none [&>:first-child]:whitespace-nowrap font-medium", | ||||||
|       menu_item_class(@variant), |       menu_item_class(@variant), | ||||||
|       @disabled && "pointer-events-none opacity-50" |       @disabled && "pointer-events-none opacity-50" | ||||||
|     ]}> |     ]}> | ||||||
|  | @ -889,7 +889,7 @@ defmodule LivebookWeb.CoreComponents do | ||||||
|       else |       else | ||||||
|         "px-5 py-2 font-medium text-sm" |         "px-5 py-2 font-medium text-sm" | ||||||
|       end, |       end, | ||||||
|       "inline-flex rounded-lg border whitespace-nowrap items-center justify-center gap-1.5", |       "inline-flex rounded-lg border whitespace-nowrap items-center justify-center gap-1.5 focus-visible:outline-none", | ||||||
|       if disabled do |       if disabled do | ||||||
|         "cursor-default pointer-events-none border-transparent bg-gray-100 text-gray-400" |         "cursor-default pointer-events-none border-transparent bg-gray-100 text-gray-400" | ||||||
|       else |       else | ||||||
|  | @ -961,7 +961,7 @@ defmodule LivebookWeb.CoreComponents do | ||||||
|       if disabled do |       if disabled do | ||||||
|         "cursor-default text-gray-300" |         "cursor-default text-gray-300" | ||||||
|       else |       else | ||||||
|         "text-gray-500 hover:text-gray-900 focus:bg-gray-100" |         "text-gray-500 hover:text-gray-900 hover:bg-gray-50 focus-visible:bg-gray-100 focus-visible:outline-none" | ||||||
|       end |       end | ||||||
|     ] |     ] | ||||||
|   end |   end | ||||||
|  |  | ||||||
|  | @ -39,7 +39,7 @@ defmodule LivebookWeb.FormComponents do | ||||||
| 
 | 
 | ||||||
|   defp input_classes(errors) do |   defp input_classes(errors) do | ||||||
|     [ |     [ | ||||||
|       "w-full px-3 py-2 text-sm font-normal border rounded-lg placeholder-gray-400 disabled:opacity-70 disabled:cursor-not-allowed", |       "w-full px-3 py-2 text-sm font-normal border rounded-lg placeholder-gray-400 disabled:opacity-70 disabled:cursor-not-allowed focus:border-blue-600 focus-visible:outline-none", | ||||||
|       if errors == [] do |       if errors == [] do | ||||||
|         "bg-gray-50 border-gray-200 text-gray-600" |         "bg-gray-50 border-gray-200 text-gray-600" | ||||||
|       else |       else | ||||||
|  | @ -249,7 +249,7 @@ defmodule LivebookWeb.FormComponents do | ||||||
|             type="checkbox" |             type="checkbox" | ||||||
|             value={@checked_value} |             value={@checked_value} | ||||||
|             class={[ |             class={[ | ||||||
|               "appearance-none absolute block w-7 h-7 rounded-full bg-white border-[5px] border-gray-200 cursor-pointer transition-all duration-300", |               "appearance-none absolute block w-7 h-7 rounded-full bg-white border-[5px] border-gray-200 cursor-pointer transition-[transform,border-color] duration-300 outline-none", | ||||||
|               "peer checked:bg-white checked:border-blue-600 checked:translate-x-full" |               "peer checked:bg-white checked:border-blue-600 checked:translate-x-full" | ||||||
|             ]} |             ]} | ||||||
|             name={@name} |             name={@name} | ||||||
|  | @ -258,8 +258,8 @@ defmodule LivebookWeb.FormComponents do | ||||||
|             {@rest} |             {@rest} | ||||||
|           /> |           /> | ||||||
|           <div class={[ |           <div class={[ | ||||||
|             "block h-full w-full rounded-full bg-gray-200 cursor-pointer transition-all duration-300", |             "block h-full w-full rounded-full bg-gray-200 cursor-pointer transition-colors duration-300", | ||||||
|             "peer-checked:bg-blue-600" |             "peer-checked:bg-blue-600 peer-focus-visible:outline peer-focus-visible:outline-offset-2 peer-focus-visible:outline-2 peer-focus-visible:outline-blue-600" | ||||||
|           ]}> |           ]}> | ||||||
|           </div> |           </div> | ||||||
|         </label> |         </label> | ||||||
|  | @ -306,7 +306,7 @@ defmodule LivebookWeb.FormComponents do | ||||||
|           checked={to_string(@value) == @checked_value} |           checked={to_string(@value) == @checked_value} | ||||||
|           {@rest} |           {@rest} | ||||||
|         /> |         /> | ||||||
|         <div class="w-5 h-5 flex items-center justify-center border border-gray-300 peer-checked:border-transparent bg-white peer-checked:bg-blue-600 rounded"> |         <div class="w-5 h-5 flex items-center justify-center border border-gray-300 peer-checked:border-transparent bg-white peer-checked:bg-blue-600 rounded peer-focus-visible:outline peer-focus-visible:outline-offset-2 peer-focus-visible:outline-2 peer-focus-visible:outline-blue-600"> | ||||||
|           <svg viewBox="0 0 16 16" fill="white" xmlns="http://www.w3.org/2000/svg"> |           <svg viewBox="0 0 16 16" fill="white" xmlns="http://www.w3.org/2000/svg"> | ||||||
|             <path d="M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z" /> |             <path d="M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z" /> | ||||||
|           </svg> |           </svg> | ||||||
|  | @ -487,7 +487,7 @@ defmodule LivebookWeb.FormComponents do | ||||||
|           id={@id} |           id={@id} | ||||||
|           name={@name} |           name={@name} | ||||||
|           class={[ |           class={[ | ||||||
|             "w-full px-3 py-2 pr-7 appearance-none text-sm border rounded-lg placeholder-gray-400 disabled:opacity-70 disabled:cursor-not-allowed", |             "w-full px-3 py-2 pr-7 appearance-none text-sm border rounded-lg placeholder-gray-400 disabled:opacity-70 disabled:cursor-not-allowed focus:border-blue-600 focus-visible:outline-none", | ||||||
|             if(@errors == [], |             if(@errors == [], | ||||||
|               do: "bg-gray-50 border-gray-200 text-gray-600", |               do: "bg-gray-50 border-gray-200 text-gray-600", | ||||||
|               else: "bg-red-50 border-red-600 text-red-600" |               else: "bg-red-50 border-red-600 text-red-600" | ||||||
|  |  | ||||||
|  | @ -81,7 +81,7 @@ defmodule LivebookWeb.LayoutComponents do | ||||||
|         <div class="flex flex-col"> |         <div class="flex flex-col"> | ||||||
|           <div class="space-y-3"> |           <div class="space-y-3"> | ||||||
|             <div class="flex items-center mb-5"> |             <div class="flex items-center mb-5"> | ||||||
|               <.link navigate={~p"/"} class="flex items-center border-l-4 border-gray-900 group"> |               <.link navigate={~p"/"} class="flex items-center ml-1 group"> | ||||||
|                 <img |                 <img | ||||||
|                   src={~p"/images/logo.png"} |                   src={~p"/images/logo.png"} | ||||||
|                   class="mx-2" |                   class="mx-2" | ||||||
|  |  | ||||||
|  | @ -315,7 +315,7 @@ defmodule LivebookWeb.SessionLive.CellComponent do | ||||||
|     ~H""" |     ~H""" | ||||||
|     <!-- By setting tabindex we can programmatically focus this element, |     <!-- By setting tabindex we can programmatically focus this element, | ||||||
|          also we actually want to make this element tab-focusable --> |          also we actually want to make this element tab-focusable --> | ||||||
|     <div class="flex relative" data-el-cell-body tabindex="0"> |     <div class="flex relative focus-visible:outline-none" data-el-cell-body tabindex="0"> | ||||||
|       <div class="w-1 h-full rounded-lg absolute top-0 -left-3" data-el-cell-focus-indicator></div> |       <div class="w-1 h-full rounded-lg absolute top-0 -left-3" data-el-cell-focus-indicator></div> | ||||||
|       <div class="w-full"> |       <div class="w-full"> | ||||||
|         <%= render_slot(@inner_block) %> |         <%= render_slot(@inner_block) %> | ||||||
|  | @ -328,7 +328,7 @@ defmodule LivebookWeb.SessionLive.CellComponent do | ||||||
|     ~H""" |     ~H""" | ||||||
|     <div class="flex items-center space-x-1"> |     <div class="flex items-center space-x-1"> | ||||||
|       <button |       <button | ||||||
|         class="text-gray-600 hover:text-gray-800 focus:text-gray-800 flex space-x-1 items-center" |         class="text-gray-600 hover:text-gray-800 flex space-x-1 items-center" | ||||||
|         data-el-queue-cell-evaluation-button |         data-el-queue-cell-evaluation-button | ||||||
|         data-cell-id={@cell_id} |         data-cell-id={@cell_id} | ||||||
|       > |       > | ||||||
|  | @ -346,7 +346,7 @@ defmodule LivebookWeb.SessionLive.CellComponent do | ||||||
|       </button> |       </button> | ||||||
|       <.menu id={"cell-#{@cell_id}-evaluation-menu"} position={:bottom_left} distant> |       <.menu id={"cell-#{@cell_id}-evaluation-menu"} position={:bottom_left} distant> | ||||||
|         <:toggle> |         <:toggle> | ||||||
|           <button class="flex text-gray-600 hover:text-gray-800 focus:text-gray-800"> |           <button class="flex text-gray-600 hover:text-gray-800"> | ||||||
|             <.remix_icon icon="arrow-down-s-line" class="text-xl" /> |             <.remix_icon icon="arrow-down-s-line" class="text-xl" /> | ||||||
|           </button> |           </button> | ||||||
|         </:toggle> |         </:toggle> | ||||||
|  | @ -380,7 +380,7 @@ defmodule LivebookWeb.SessionLive.CellComponent do | ||||||
|   defp cell_evaluation_button(assigns) do |   defp cell_evaluation_button(assigns) do | ||||||
|     ~H""" |     ~H""" | ||||||
|     <button |     <button | ||||||
|       class="text-gray-600 hover:text-gray-800 focus:text-gray-800 flex space-x-1 items-center" |       class="text-gray-600 hover:text-gray-800 flex space-x-1 items-center" | ||||||
|       phx-click="cancel_cell_evaluation" |       phx-click="cancel_cell_evaluation" | ||||||
|       phx-value-cell_id={@cell_id} |       phx-value-cell_id={@cell_id} | ||||||
|     > |     > | ||||||
|  | @ -396,7 +396,7 @@ defmodule LivebookWeb.SessionLive.CellComponent do | ||||||
|     ~H""" |     ~H""" | ||||||
|     <div class="flex items-center space-x-1"> |     <div class="flex items-center space-x-1"> | ||||||
|       <button |       <button | ||||||
|         class="text-gray-600 hover:text-gray-800 focus:text-gray-800 flex space-x-1 items-center" |         class="text-gray-600 hover:text-gray-800 flex space-x-1 items-center" | ||||||
|         data-el-queue-cell-evaluation-button |         data-el-queue-cell-evaluation-button | ||||||
|         data-cell-id={@cell_id} |         data-cell-id={@cell_id} | ||||||
|       > |       > | ||||||
|  | @ -411,7 +411,7 @@ defmodule LivebookWeb.SessionLive.CellComponent do | ||||||
|       <%= unless Livebook.Runtime.fixed_dependencies?(@runtime) do %> |       <%= unless Livebook.Runtime.fixed_dependencies?(@runtime) do %> | ||||||
|         <.menu id="setup-menu" position={:bottom_left} distant> |         <.menu id="setup-menu" position={:bottom_left} distant> | ||||||
|           <:toggle> |           <:toggle> | ||||||
|             <button class="flex text-gray-600 hover:text-gray-800 focus:text-gray-800"> |             <button class="flex text-gray-600 hover:text-gray-800"> | ||||||
|               <.remix_icon icon="arrow-down-s-line" class="text-xl" /> |               <.remix_icon icon="arrow-down-s-line" class="text-xl" /> | ||||||
|             </button> |             </button> | ||||||
|           </:toggle> |           </:toggle> | ||||||
|  | @ -435,7 +435,7 @@ defmodule LivebookWeb.SessionLive.CellComponent do | ||||||
|   defp setup_cell_evaluation_button(assigns) do |   defp setup_cell_evaluation_button(assigns) do | ||||||
|     ~H""" |     ~H""" | ||||||
|     <button |     <button | ||||||
|       class="text-gray-600 hover:text-gray-800 focus:text-gray-800 flex space-x-1 items-center" |       class="text-gray-600 hover:text-gray-800 flex space-x-1 items-center" | ||||||
|       phx-click="cancel_cell_evaluation" |       phx-click="cancel_cell_evaluation" | ||||||
|       phx-value-cell_id={@cell_id} |       phx-value-cell_id={@cell_id} | ||||||
|     > |     > | ||||||
|  |  | ||||||
|  | @ -1231,22 +1231,22 @@ defmodule LivebookWeb.SessionLive.Render do | ||||||
| 
 | 
 | ||||||
|   defp status_button_classes(color) do |   defp status_button_classes(color) do | ||||||
|     [ |     [ | ||||||
|       "text-xl leading-none p-1 flex items-center justify-center rounded-full rounded-full border-2", |       "text-xl leading-none p-1 flex items-center justify-center rounded-full rounded-full border-2 focus-visible:outline-none", | ||||||
|       case color do |       case color do | ||||||
|         :gray -> |         :gray -> | ||||||
|           "text-gray-400 border-gray-200 hover:bg-gray-100 focus:bg-gray-100" |           "text-gray-400 border-gray-200 hover:bg-gray-100 focus-visible:bg-gray-100" | ||||||
| 
 | 
 | ||||||
|         :blue -> |         :blue -> | ||||||
|           "text-blue-500 border-blue-400 hover:bg-blue-50 focus:bg-blue-50" |           "text-blue-500 border-blue-400 hover:bg-blue-50 focus-visible:bg-blue-50" | ||||||
| 
 | 
 | ||||||
|         :green -> |         :green -> | ||||||
|           "text-green-bright-400 border-green-bright-300 hover:bg-green-bright-50 focus:bg-green-bright-50" |           "text-green-bright-400 border-green-bright-300 hover:bg-green-bright-50 focus-visible:bg-green-bright-50" | ||||||
| 
 | 
 | ||||||
|         :yellow -> |         :yellow -> | ||||||
|           "text-yellow-bright-300 border-yellow-bright-200 hover:bg-yellow-bright-50 focus:bg-yellow-bright-50" |           "text-yellow-bright-300 border-yellow-bright-200 hover:bg-yellow-bright-50 focus-visible:bg-yellow-bright-50" | ||||||
| 
 | 
 | ||||||
|         :red -> |         :red -> | ||||||
|           "text-red-400 border-red-300 hover:bg-red-50 focus:bg-red-50" |           "text-red-400 border-red-300 hover:bg-red-50 focus-visible:bg-red-50" | ||||||
|       end |       end | ||||||
|     ] |     ] | ||||||
|   end |   end | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue