Skip to content

Commit 9f10cbf

Browse files
authored
Refactor: Components tree styling (#291)
* styling without w-full * make only text select node * add underline * remove duplicate styling
1 parent 8bc36ca commit 9f10cbf

4 files changed

Lines changed: 72 additions & 78 deletions

File tree

lib/live_debugger/components.ex

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ defmodule LiveDebugger.Components do
103103
@doc """
104104
Collapsible element that can be toggled open and closed.
105105
It uses the `details` and `summary` HTML elements.
106-
If you add `hide-on-open` class to element it will be hidden when collapsible is opened.
106+
`hide-on-open` and `show-on-open` css classes are used to hide or show elements based on the open state of the collapsible.
107107
108108
## Examples
109109
@@ -142,9 +142,8 @@ defmodule LiveDebugger.Components do
142142
{show_collapsible_assign(@open)}
143143
>
144144
<summary
145-
class={[
146-
"block flex items-center cursor-pointer" | List.wrap(@label_class)
147-
]}
145+
id={@id <> "-summary"}
146+
class={["flex items-center cursor-pointer" | List.wrap(@label_class)]}
148147
{@rest}
149148
>
150149
<.icon name={@icon} class={["rotate-icon shrink-0" | List.wrap(@chevron_class)]} />
@@ -246,7 +245,7 @@ defmodule LiveDebugger.Components do
246245
end
247246

248247
@doc """
249-
Used to add Hook to element based on condition.
248+
Used to add CollapsibleOpen hook to element based on condition.
250249
"""
251250
def show_collapsible_assign(true), do: %{:"phx-hook" => "CollapsibleOpen"}
252251
def show_collapsible_assign(_), do: %{}
@@ -489,7 +488,7 @@ defmodule LiveDebugger.Components do
489488
<svg
490489
{@rest}
491490
class={
492-
["animate-spin", @size_class, unless(@show, do: "hidden")] ++
491+
["animate-spin", @size_class, if(!@show, do: "hidden")] ++
493492
List.wrap(@class)
494493
}
495494
xmlns="http://www.w3.org/2000/svg"
@@ -521,7 +520,7 @@ defmodule LiveDebugger.Components do
521520
@doc """
522521
Renders a tooltip using Tooltip hook.
523522
"""
524-
attr(:id, :string, required: true)
523+
attr(:id, :string, required: true, doc: "ID of the tooltip. Prefix is added automatically.")
525524
attr(:content, :string, default: nil)
526525
attr(:position, :string, default: "top", values: ["top", "bottom"])
527526
attr(:rest, :global)

lib/live_debugger/components/tree.ex

Lines changed: 62 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -31,23 +31,21 @@ defmodule LiveDebugger.Components.Tree do
3131

3232
def tree(assigns) do
3333
~H"""
34-
<div class={["min-h-20 w-full overflow-y-auto flex flex-col", @class]}>
34+
<div class={["min-h-20 px-1 overflow-y-auto overflow-x-hidden flex flex-col", @class]}>
3535
<div class="flex items-center justify-between">
3636
<div class="shrink-0 font-medium text-secondary-text px-6 py-3"><%= @title %></div>
3737
<%= if LiveDebugger.Feature.enabled?(:highlighting) do %>
3838
<.toggle_switch label="Highlight" checked={@highlight?} phx-click="toggle-highlight" />
3939
<% end %>
4040
</div>
41-
<div class="w-full px-1 overflow-y-auto">
42-
<.tree_node
43-
tree_id={@id}
44-
tree_node={@tree_node}
45-
selected_node_id={@selected_node_id}
46-
root?={true}
47-
max_opened_node_level={@max_opened_node_level}
48-
level={0}
49-
/>
50-
</div>
41+
<.tree_node
42+
tree_id={@id}
43+
tree_node={@tree_node}
44+
selected_node_id={@selected_node_id}
45+
root?={true}
46+
max_opened_node_level={@max_opened_node_level}
47+
level={0}
48+
/>
5149
</div>
5250
"""
5351
end
@@ -90,50 +88,46 @@ defmodule LiveDebugger.Components.Tree do
9088
|> assign(:open, assigns.level < assigns.max_opened_node_level)
9189

9290
~H"""
93-
<div class="relative flex max-w-full">
94-
<div class="w-full">
95-
<.collapsible
96-
:if={@collapsible?}
97-
id={"collapsible-#{@tree_node.parsed_id}-#{@tree_id}"}
98-
chevron_class="text-accent-icon h-5 w-5"
99-
open={@open}
100-
label_class="w-full rounded-md py-1 hover:bg-surface-1-bg-hover"
101-
style={style_for_padding(@level, @collapsible?)}
102-
>
103-
<:label>
104-
<.label
105-
tree_id={@tree_id}
106-
selected?={@selected?}
107-
parent_dom_id={@parent_dom_id}
108-
node={@tree_node}
109-
level={@level}
110-
collapsible?={true}
111-
/>
112-
</:label>
113-
<div class="flex flex-col">
114-
<.tree_node
115-
:for={child <- @tree_node.children}
116-
tree_id={@tree_id}
117-
parent_dom_id={if @tree_node[:dom_id], do: @tree_node.dom_id, else: @parent_dom_id}
118-
tree_node={child}
119-
selected_node_id={@selected_node_id}
120-
root?={false}
121-
max_opened_node_level={@max_opened_node_level}
122-
level={@level + 1}
123-
/>
124-
</div>
125-
</.collapsible>
91+
<.collapsible
92+
:if={@collapsible?}
93+
id={"collapsible-#{@tree_node.parsed_id}-#{@tree_id}"}
94+
chevron_class="text-accent-icon h-5 w-5"
95+
open={@open}
96+
label_class="rounded-md py-1 hover:bg-surface-1-bg-hover"
97+
style={style_for_padding(@level, @collapsible?)}
98+
>
99+
<:label>
126100
<.label
127-
:if={not @collapsible?}
128101
tree_id={@tree_id}
129102
selected?={@selected?}
130103
parent_dom_id={@parent_dom_id}
131104
node={@tree_node}
132105
level={@level}
133-
collapsible?={false}
106+
collapsible?={true}
107+
/>
108+
</:label>
109+
<div class="flex flex-col">
110+
<.tree_node
111+
:for={child <- @tree_node.children}
112+
tree_id={@tree_id}
113+
parent_dom_id={if @tree_node[:dom_id], do: @tree_node.dom_id, else: @parent_dom_id}
114+
tree_node={child}
115+
selected_node_id={@selected_node_id}
116+
root?={false}
117+
max_opened_node_level={@max_opened_node_level}
118+
level={@level + 1}
134119
/>
135120
</div>
136-
</div>
121+
</.collapsible>
122+
<.label
123+
:if={not @collapsible?}
124+
tree_id={@tree_id}
125+
selected?={@selected?}
126+
parent_dom_id={@parent_dom_id}
127+
node={@tree_node}
128+
level={@level}
129+
collapsible?={false}
130+
/>
137131
"""
138132
end
139133

@@ -143,43 +137,42 @@ defmodule LiveDebugger.Components.Tree do
143137
attr(:level, :integer, required: true)
144138
attr(:collapsible?, :boolean, required: true)
145139
attr(:selected?, :boolean, required: true)
146-
attr(:class, :string, default: nil)
147140

148141
defp label(assigns) do
149142
assigns =
150-
assign(assigns, :padding_style, style_for_padding(assigns.level, assigns.collapsible?))
143+
assigns
144+
|> assign(:padding_style, style_for_padding(assigns.level, assigns.collapsible?))
145+
|> assign(:button_id, "tree-node-button-#{assigns.node.parsed_id}-#{assigns.tree_id}")
151146

152147
~H"""
153-
<button
154-
id={"tree-node-button-#{@node.parsed_id}-#{@tree_id}"}
155-
phx-click="select_node"
156-
phx-value-node_id={@node.parsed_id}
157-
phx-value-search-attribute={get_search_attribute(@node)}
158-
phx-value-search-value={get_search_value(@node, @parent_dom_id)}
159-
phx-hook="Highlight"
148+
<span
160149
class={[
161-
"flex w-full rounded-md hover:bg-surface-1-bg-hover",
162-
unless(@collapsible?, do: "p-1"),
163-
@class
150+
"flex shrink grow items-center rounded-md hover:bg-surface-1-bg-hover",
151+
if(!@collapsible?, do: "p-1")
164152
]}
165-
style={unless(@collapsible?, do: @padding_style)}
153+
style={if(!@collapsible?, do: @padding_style)}
166154
>
167-
<div class="flex w-full gap-0.5 items-center">
155+
<button
156+
id={@button_id}
157+
phx-hook="Highlight"
158+
phx-click="select_node"
159+
phx-value-node_id={@node.parsed_id}
160+
phx-value-search-attribute={get_search_attribute(@node)}
161+
phx-value-search-value={get_search_value(@node, @parent_dom_id)}
162+
class="flex min-w-0 gap-0.5 items-center"
163+
>
168164
<.icon name={@node.icon} class="text-accent-icon w-5 h-5 shrink-0" />
169165
<.tooltip
170166
id={"tree-node-#{@node.parsed_id}-#{@tree_id}"}
171167
content={@node.tooltip}
172-
class="w-full flex overflow-x-hidden"
168+
class="truncate"
173169
>
174-
<div class={[
175-
"truncate",
176-
if(@selected?, do: "font-semibold")
177-
]}>
170+
<span class={["hover:underline", if(@selected?, do: "font-semibold")]}>
178171
<%= @node.label %>
179-
</div>
172+
</span>
180173
</.tooltip>
181-
</div>
182-
</button>
174+
</button>
175+
</span>
183176
"""
184177
end
185178

lib/live_debugger/live_components/live_dropdown.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ defmodule LiveDebugger.LiveComponents.LiveDropdown do
6262
variant={Map.get(button_slot, :variant, "secondary")}
6363
size={Map.get(button_slot, :size, "sm")}
6464
id={@id <> "-button"}
65-
phx-click={unless @open, do: "open"}
65+
phx-click={if !@open, do: "open"}
6666
phx-target={@myself}
6767
>
6868
<%= render_slot(button_slot) %>

lib/live_debugger/services/module_discovery_service.ex

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ defmodule LiveDebugger.Services.ModuleDiscoveryService do
1111
@spec all_modules() :: [module()]
1212
def all_modules() do
1313
ModuleService.all()
14-
|> Enum.map(fn {module_charlist, _, _} -> module_charlist |> to_string |> String.to_atom() end)
14+
|> Enum.map(fn {module_charlist, _, _} ->
15+
module_charlist |> to_string |> String.to_atom()
16+
end)
1517
end
1618

1719
@doc """

0 commit comments

Comments
 (0)