maquina-components 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -1
  3. data/app/assets/stylesheets/breadcrumbs.css +21 -0
  4. data/app/assets/stylesheets/combobox.css +36 -1
  5. data/app/assets/stylesheets/drawer.css +15 -0
  6. data/app/assets/stylesheets/menu_button.css +155 -0
  7. data/app/assets/stylesheets/separator.css +20 -0
  8. data/app/assets/stylesheets/sidebar.css +12 -0
  9. data/app/assets/stylesheets/stats.css +101 -0
  10. data/app/assets/tailwind/maquina_components_engine/engine.css +3 -0
  11. data/app/helpers/maquina_components/combobox_helper.rb +2 -1
  12. data/app/helpers/maquina_components/components_helper.rb +33 -0
  13. data/app/helpers/maquina_components/icons_helper.rb +58 -0
  14. data/app/javascript/controllers/breadcrumb_controller.js +39 -30
  15. data/app/javascript/controllers/combobox_controller.js +9 -0
  16. data/app/javascript/controllers/drawer_controller.js +43 -9
  17. data/app/javascript/controllers/drawer_trigger_controller.js +33 -3
  18. data/app/javascript/controllers/menu_button_controller.js +107 -29
  19. data/app/javascript/controllers/sidebar_controller.js +6 -8
  20. data/app/javascript/controllers/sidebar_trigger_controller.js +33 -4
  21. data/app/javascript/controllers/toaster_controller.js +12 -0
  22. data/app/views/components/_alert.html.erb +3 -1
  23. data/app/views/components/_badge.html.erb +7 -1
  24. data/app/views/components/_breadcrumbs.html.erb +1 -1
  25. data/app/views/components/_calendar.html.erb +1 -1
  26. data/app/views/components/_card.html.erb +1 -1
  27. data/app/views/components/_combobox.html.erb +3 -2
  28. data/app/views/components/_date_picker.html.erb +4 -3
  29. data/app/views/components/_drawer.html.erb +8 -2
  30. data/app/views/components/_dropdown.html.erb +21 -24
  31. data/app/views/components/_dropdown_menu.html.erb +1 -1
  32. data/app/views/components/_empty.html.erb +1 -1
  33. data/app/views/components/_header.html.erb +1 -1
  34. data/app/views/components/_menu_button.html.erb +29 -34
  35. data/app/views/components/_pagination.html.erb +1 -1
  36. data/app/views/components/_separator.html.erb +9 -10
  37. data/app/views/components/_sidebar.html.erb +1 -1
  38. data/app/views/components/_simple_table.html.erb +3 -1
  39. data/app/views/components/_table.html.erb +1 -1
  40. data/app/views/components/_toast.html.erb +6 -1
  41. data/app/views/components/_toaster.html.erb +1 -1
  42. data/app/views/components/_toggle_group.html.erb +1 -1
  43. data/app/views/components/alert/_description.html.erb +1 -1
  44. data/app/views/components/alert/_title.html.erb +1 -1
  45. data/app/views/components/breadcrumbs/_ellipsis.html.erb +1 -1
  46. data/app/views/components/breadcrumbs/_item.html.erb +1 -1
  47. data/app/views/components/breadcrumbs/_link.html.erb +1 -1
  48. data/app/views/components/breadcrumbs/_list.html.erb +1 -1
  49. data/app/views/components/breadcrumbs/_page.html.erb +1 -1
  50. data/app/views/components/breadcrumbs/_separator.html.erb +1 -1
  51. data/app/views/components/calendar/_header.html.erb +1 -1
  52. data/app/views/components/calendar/_week.html.erb +1 -1
  53. data/app/views/components/card/_action.html.erb +1 -1
  54. data/app/views/components/card/_content.html.erb +1 -1
  55. data/app/views/components/card/_description.html.erb +1 -1
  56. data/app/views/components/card/_footer.html.erb +1 -1
  57. data/app/views/components/card/_header.html.erb +1 -1
  58. data/app/views/components/card/_title.html.erb +1 -1
  59. data/app/views/components/combobox/_content.html.erb +1 -1
  60. data/app/views/components/combobox/_empty.html.erb +3 -3
  61. data/app/views/components/combobox/_group.html.erb +1 -1
  62. data/app/views/components/combobox/_input.html.erb +1 -1
  63. data/app/views/components/combobox/_label.html.erb +1 -1
  64. data/app/views/components/combobox/_list.html.erb +1 -1
  65. data/app/views/components/combobox/_option.html.erb +1 -1
  66. data/app/views/components/combobox/_separator.html.erb +1 -1
  67. data/app/views/components/combobox/_trigger.html.erb +1 -1
  68. data/app/views/components/drawer/_close.html.erb +1 -1
  69. data/app/views/components/drawer/_content.html.erb +1 -1
  70. data/app/views/components/drawer/_footer.html.erb +1 -1
  71. data/app/views/components/drawer/_header.html.erb +2 -2
  72. data/app/views/components/drawer/_provider.html.erb +2 -2
  73. data/app/views/components/drawer/_trigger.html.erb +1 -1
  74. data/app/views/components/dropdown_menu/_content.html.erb +1 -1
  75. data/app/views/components/dropdown_menu/_group.html.erb +1 -1
  76. data/app/views/components/dropdown_menu/_item.html.erb +1 -1
  77. data/app/views/components/dropdown_menu/_label.html.erb +3 -7
  78. data/app/views/components/dropdown_menu/_separator.html.erb +1 -1
  79. data/app/views/components/dropdown_menu/_shortcut.html.erb +3 -7
  80. data/app/views/components/dropdown_menu/_trigger.html.erb +1 -1
  81. data/app/views/components/empty/_content.html.erb +1 -1
  82. data/app/views/components/empty/_description.html.erb +3 -7
  83. data/app/views/components/empty/_header.html.erb +1 -1
  84. data/app/views/components/empty/_media.html.erb +5 -3
  85. data/app/views/components/empty/_title.html.erb +3 -7
  86. data/app/views/components/pagination/_content.html.erb +1 -1
  87. data/app/views/components/pagination/_item.html.erb +1 -1
  88. data/app/views/components/pagination/_link.html.erb +1 -1
  89. data/app/views/components/pagination/_next.html.erb +1 -1
  90. data/app/views/components/pagination/_previous.html.erb +1 -1
  91. data/app/views/components/sidebar/_content.html.erb +1 -1
  92. data/app/views/components/sidebar/_footer.html.erb +1 -1
  93. data/app/views/components/sidebar/_group.html.erb +1 -1
  94. data/app/views/components/sidebar/_header.html.erb +1 -1
  95. data/app/views/components/sidebar/_inset.html.erb +1 -1
  96. data/app/views/components/sidebar/_menu.html.erb +1 -1
  97. data/app/views/components/sidebar/_menu_button.html.erb +1 -1
  98. data/app/views/components/sidebar/_menu_item.html.erb +1 -1
  99. data/app/views/components/sidebar/_menu_link.html.erb +4 -7
  100. data/app/views/components/sidebar/_provider.html.erb +1 -1
  101. data/app/views/components/sidebar/_trigger.html.erb +1 -1
  102. data/app/views/components/stats/_stats_card.html.erb +32 -92
  103. data/app/views/components/stats/_stats_grid.html.erb +18 -24
  104. data/app/views/components/table/_body.html.erb +1 -1
  105. data/app/views/components/table/_caption.html.erb +3 -3
  106. data/app/views/components/table/_cell.html.erb +3 -3
  107. data/app/views/components/table/_footer.html.erb +1 -1
  108. data/app/views/components/table/_head.html.erb +3 -3
  109. data/app/views/components/table/_header.html.erb +1 -1
  110. data/app/views/components/table/_row.html.erb +1 -1
  111. data/app/views/components/toast/_action.html.erb +1 -1
  112. data/app/views/components/toast/_description.html.erb +1 -1
  113. data/app/views/components/toast/_title.html.erb +1 -1
  114. data/app/views/components/toggle_group/_item.html.erb +1 -1
  115. data/lib/generators/maquina_components/install/templates/maquina_components_helper.rb.tt +1 -0
  116. data/lib/maquina-components.rb +5 -0
  117. data/lib/maquina_components/engine.rb +7 -3
  118. data/lib/maquina_components/version.rb +1 -1
  119. metadata +33 -2
  120. data/app/assets/stylesheets/maquina_components.css +0 -178
@@ -1,6 +1,6 @@
1
- <%# locals: (id: nil, state: :closed, side: :right, css_classes: "", **html_options) %>
1
+ <%# locals: (id: nil, state: :closed, side: :right, aria_label: "Drawer", css_classes: "", **html_options) %>
2
2
  <% stable_id = id || "drawer-#{side}"
3
- merged_data = (html_options.delete(:data) || {}).merge(
3
+ merged_data = merge_component_data(html_options,
4
4
  drawer_part: :root,
5
5
  drawer_target: "drawer",
6
6
  state: state,
@@ -22,6 +22,12 @@
22
22
  <div
23
23
  id="<%= stable_id %>-panel"
24
24
  data-drawer-part="panel"
25
+ data-drawer-target="panel"
26
+ role="dialog"
27
+ aria-modal="true"
28
+ aria-label="<%= aria_label %>"
29
+ tabindex="-1"
30
+ <%= tag.attributes(aria: {hidden: true}, inert: true) if state.to_s == "closed" %>
25
31
  >
26
32
  <%# Inner drawer content wrapper %>
27
33
  <div id="<%= stable_id %>-inner" data-drawer-part="inner">
@@ -1,25 +1,22 @@
1
- <div
2
- data-menu-button-target="content"
3
- class="
4
- absolute z-10 overflow-hidden border border-border p-1 text-popover-foreground
5
- min-w-56 max-w-56 content-fit shadow-md bottom-full rounded-lg hidden
6
- peer-data-[state=closed]/menu-button:animate-out
7
- peer-data-[state=closed]/menu-button:fade-out-0
8
- peer-data-[state=open]/menu-button:fade-in-0
9
- peer-data-[state=closed]/menu-button:zoom-out-95
10
- peer-data-[state=open]/menu-button:zoom-in-95
11
- peer-data-[side=bottom]/menu-button:slide-in-from-top-2
12
- peer-data-[side=left]/menu-button:slide-in-from-right-2
13
- peer-data-[side=right]/menu-button:slide-in-from-left-2
14
- peer-data-[side=top]/menu-button:slide-in-from-bottom-2
15
- "
16
- role="menu"
17
- aria-orientation="vertical"
18
- aria-labelledby="menu-button"
19
- tabindex="-1"
20
- >
1
+ <%# locals: (id: nil, side: :top, align: :start, css_classes: "", **html_options) %>
2
+ <% merged_data = merge_component_data(html_options,
3
+ "menu-button-part": "content",
4
+ "menu-button-target": "content",
5
+ side: side,
6
+ align: align,
7
+ state: "closed"
8
+ ) %>
9
+ <% aria_attrs = { orientation: "vertical" } %>
10
+ <% aria_attrs[:labelledby] = "#{id}-trigger" if id.present? %>
11
+
12
+ <%= content_tag :div,
13
+ id: (id.present? ? "#{id}-content" : nil),
14
+ role: "menu",
15
+ tabindex: "-1",
16
+ aria: aria_attrs,
17
+ class: css_classes.presence,
18
+ data: merged_data,
19
+ hidden: true,
20
+ **html_options do %>
21
21
  <%= yield %>
22
- </div>
23
- <!--
24
- <div role="separator" aria-orientation="horizontal" class="separator"></div>
25
- -->
22
+ <% end %>
@@ -1,5 +1,5 @@
1
1
  <%# locals: (auto_close: false, css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  component: "dropdown-menu",
4
4
  controller: "dropdown-menu"
5
5
  ) %>
@@ -1,5 +1,5 @@
1
1
  <%# locals: (variant: :default, size: :default, css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  component: :empty,
4
4
  variant: variant,
5
5
  size: size
@@ -1,5 +1,5 @@
1
1
  <%# locals: (css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  component: :header
4
4
  ) %>
5
5
 
@@ -1,44 +1,39 @@
1
- <%# locals: (title: "", subtitle: nil, icon: nil, text_icon: nil, icon_classes: "", submenu: false) %>
1
+ <%# locals: (title: "", subtitle: nil, icon: nil, text_icon: nil, icon_classes: "", submenu: false, id: nil, css_classes: "", **html_options) %>
2
+ <% menu_button_id = id || "menu-button-#{title.to_s.parameterize.presence || "menu"}" %>
3
+ <% merged_data = merge_component_data(html_options,
4
+ component: "menu-button"
5
+ ) %>
2
6
 
3
- <ul class="flex w-full min-w-0 flex-col gap-1">
4
- <li class="group/menu-item relative" data-controller="menu-button">
7
+ <%= content_tag :ul, class: css_classes.presence, data: merged_data, **html_options do %>
8
+ <li data-menu-button-part="item" data-controller="menu-button">
5
9
  <button
10
+ type="button"
11
+ id="<%= menu_button_id %>-trigger"
6
12
  data-state="closed"
7
- class="
8
- peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2
9
- text-left outline-none ring-sidebar-ring transition-[width,height,padding]
10
- focus-visible:ring-2 active:bg-sidebar-accent
11
- active:text-sidebar-accent-foreground disabled:pointer-events-none
12
- disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50
13
- data-[state=open]:bg-sidebar-accent
14
- data-[state=open]text-sidebar-accent-foreground
15
- group-data-[collapsible=icon]:size-8! [&>span:last-child]:truncate
16
- [&>svg]:size-4 [&>svg]:shrink-0 hover:bg-sidebar-accent
17
- hover:text-sidebar-accent-foreground h-12 text-sm
18
- group-data-[collapsible=icon]:p-0!
19
- ", data-action="menu-button#toggle", data-menu-button-target="button" }
13
+ data-menu-button-part="trigger"
14
+ data-menu-button-target="button"
15
+ data-action="menu-button#toggle"
16
+ aria-haspopup="menu"
17
+ aria-expanded="false"
20
18
  >
21
- <% if icon.present? %>
22
- <%= image_tag icon, alt: "maquina", class: "#{icon_classes}" %>
23
- <% elsif text_icon.present? %>
24
- <div
25
- class="
26
- flex aspect-square size-8 items-center justify-center rounded-lg
27
- bg-sidebar-primary text-sidebar-primary-foreground
28
- "
29
- >
30
- <span class="<%= icon_classes %>"><%= text_icon %></span>
31
- </div>
32
- <% end %>
33
- <div class="grid flex-1 text-left text-sm leading-tight">
34
- <span class="truncate font-semibold"><%= title %></span>
19
+ <% if icon.present? %>
20
+ <%= image_tag icon, alt: title.presence || "", class: icon_classes.presence %>
21
+ <% elsif text_icon.present? %>
22
+ <span data-menu-button-part="avatar">
23
+ <span class="<%= icon_classes %>"><%= text_icon %></span>
24
+ </span>
25
+ <% end %>
26
+
27
+ <span data-menu-button-part="text">
28
+ <span data-menu-button-part="title"><%= title %></span>
35
29
  <% if subtitle.present? %>
36
- <span class="truncate text-xs"><%= subtitle %></span>
30
+ <span data-menu-button-part="subtitle"><%= subtitle %></span>
37
31
  <% end %>
38
- </div>
32
+ </span>
33
+
39
34
  <%= builtin_icon_for(:chevron_up_down, class: "ml-auto") if submenu %>
40
35
  </button>
41
36
 
42
- <%= yield %>
37
+ <%= yield menu_button_id %>
43
38
  </li>
44
- </ul>
39
+ <% end %>
@@ -1,5 +1,5 @@
1
1
  <%# locals: (css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  component: :pagination
4
4
  ) %>
5
5
 
@@ -1,11 +1,10 @@
1
- <%# locals: (orientation: :horizontal) -%>
1
+ <%# locals: (orientation: :horizontal, css_classes: "", **html_options) %>
2
+ <% merged_data = merge_component_data(html_options,
3
+ component: :separator,
4
+ orientation: orientation
5
+ ) %>
2
6
 
3
- <div
4
- data-orientation="<%= orientation %>"
5
- role="none"
6
- class="
7
- bg-border shrink-0 data-[orientation=horizontal]:h-px
8
- data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-px mx-2
9
- data-[orientation=vertical]:h-4
10
- "
11
- ></div>
7
+ <%= tag.div role: "none",
8
+ class: css_classes.presence,
9
+ data: merged_data,
10
+ **html_options %>
@@ -1,7 +1,7 @@
1
1
  <%# locals: (id: nil, state: :collapsed, collapsible: :offcanvas, variant: :inset, side: :left, css_classes: "", **html_options) %>
2
2
  <% stable_id = id || "sidebar-#{side}"
3
3
 
4
- merged_data = (html_options.delete(:data) || {}).merge(
4
+ merged_data = merge_component_data(html_options,
5
5
  sidebar_part: :root,
6
6
  sidebar_target: "sidebar",
7
7
  state: state,
@@ -1,4 +1,6 @@
1
- <%# locals: (collection:, columns:, caption: nil, variant: nil, table_variant: nil, empty_message: "No data available", row_id: nil, html_options: {}) %>
1
+ <%# locals: (collection:, columns:, caption: nil, variant: nil, table_variant: nil, empty_message: "No data available", row_id: nil, html_options: {}, **extra_html_options) %>
2
+ <%# html_options: {} is the legacy call style; bare keyword passthrough is the standard one %>
3
+ <% html_options = html_options.merge(extra_html_options) %>
2
4
  <%= render "components/table", variant: variant, table_variant: table_variant, **html_options do %>
3
5
  <% if caption.present? %>
4
6
  <%= render "components/table/caption" do %><%= caption %><% end %>
@@ -1,7 +1,7 @@
1
1
  <%# locals: (css_classes: "", container: true, variant: nil, table_variant: nil, **html_options) %>
2
2
  <%
3
3
  # Table data attributes - merge user data with component defaults
4
- table_data = (html_options.delete(:data) || {}).merge(component: :table)
4
+ table_data = merge_component_data(html_options, component: :table)
5
5
  table_data[:variant] = table_variant if table_variant
6
6
 
7
7
  # Container data attributes
@@ -1,5 +1,10 @@
1
1
  <%# locals: (variant: :default, title: nil, description: nil, icon: nil, duration: 5000, dismissible: true, content: nil, css_classes: "", **html_options) %>
2
2
  <%
3
+ # :destructive is the library-wide danger variant; toast renders it
4
+ # with its existing error styling
5
+ variant = variant.to_s.to_sym
6
+ variant = :error if variant == :destructive
7
+
3
8
  # Auto-select icon based on variant if not provided
4
9
  default_icons = {
5
10
  default: nil,
@@ -10,7 +15,7 @@
10
15
  }
11
16
  toast_icon = icon || default_icons[variant]
12
17
  %>
13
- <% merged_data = (html_options.delete(:data) || {}).merge(
18
+ <% merged_data = merge_component_data(html_options,
14
19
  component: :toast,
15
20
  controller: "toast",
16
21
  variant: variant,
@@ -1,5 +1,5 @@
1
1
  <%# locals: (position: :bottom_right, content: nil, css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  component: :toaster,
4
4
  controller: "toaster",
5
5
  position: position.to_s.dasherize,
@@ -5,7 +5,7 @@
5
5
  else [value.to_s]
6
6
  end
7
7
 
8
- merged_data = (html_options.delete(:data) || {}).merge(
8
+ merged_data = merge_component_data(html_options,
9
9
  controller: "toggle-group",
10
10
  component: "toggle-group",
11
11
  variant: variant,
@@ -1,5 +1,5 @@
1
1
  <%# locals: (text: nil, content: nil, css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(alert_part: :description) %>
2
+ <% merged_data = merge_component_data(html_options, alert_part: :description) %>
3
3
 
4
4
  <%= content_tag :div, class: css_classes.presence, data: merged_data, **html_options do %>
5
5
  <%= text || content %>
@@ -1,5 +1,5 @@
1
1
  <%# locals: (text: nil, content: nil, css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(alert_part: :title) %>
2
+ <% merged_data = merge_component_data(html_options, alert_part: :title) %>
3
3
 
4
4
  <%= content_tag :div, class: css_classes.presence, data: merged_data, **html_options do %>
5
5
  <%= text || content %>
@@ -1,5 +1,5 @@
1
1
  <%# locals: (css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  breadcrumb_part: :ellipsis
4
4
  ) %>
5
5
 
@@ -1,5 +1,5 @@
1
1
  <%# locals: (css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  breadcrumb_part: :item
4
4
  ) %>
5
5
 
@@ -1,5 +1,5 @@
1
1
  <%# locals: (href:, css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  breadcrumb_part: :link
4
4
  ) %>
5
5
 
@@ -1,5 +1,5 @@
1
1
  <%# locals: (css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  breadcrumb_part: :list
4
4
  ) %>
5
5
 
@@ -1,5 +1,5 @@
1
1
  <%# locals: (css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  breadcrumb_part: :page
4
4
  ) %>
5
5
 
@@ -1,5 +1,5 @@
1
1
  <%# locals: (icon: :chevron_right, css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  breadcrumb_part: :separator
4
4
  ) %>
5
5
 
@@ -1,5 +1,5 @@
1
1
  <%# locals: (month:, year:, month_name:, css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge("calendar-part": "header") %>
2
+ <% merged_data = merge_component_data(html_options, "calendar-part": "header") %>
3
3
 
4
4
  <%= content_tag :div, class: css_classes.presence, data: merged_data, **html_options do %>
5
5
  <button type="button"
@@ -1,5 +1,5 @@
1
1
  <%# locals: (days:, display_month:, selected_date: nil, selected_end_date: nil, mode: :single, min_date: nil, max_date: nil, disabled_dates: [], show_outside_days: true, css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge("calendar-part": "week") %>
2
+ <% merged_data = merge_component_data(html_options, "calendar-part": "week") %>
3
3
 
4
4
  <%= content_tag :div, role: "row", class: css_classes.presence, data: merged_data, **html_options do %>
5
5
  <% days.each do |day| %>
@@ -1,5 +1,5 @@
1
1
  <%# locals: (css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(card_part: :action) %>
2
+ <% merged_data = merge_component_data(html_options, card_part: :action) %>
3
3
 
4
4
  <%= content_tag :div, class: css_classes.presence, data: merged_data, **html_options do %>
5
5
  <%= yield %>
@@ -1,5 +1,5 @@
1
1
  <%# locals: (spacing: :default, css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  card_part: :content,
4
4
  spacing: (spacing == :full ? :full : nil)
5
5
  ).compact %>
@@ -1,5 +1,5 @@
1
1
  <%# locals: (text: nil, content: nil, css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(card_part: :description) %>
2
+ <% merged_data = merge_component_data(html_options, card_part: :description) %>
3
3
 
4
4
  <%= content_tag :div, class: css_classes.presence, data: merged_data, **html_options do %>
5
5
  <%= text || content %>
@@ -6,7 +6,7 @@
6
6
  else nil
7
7
  end
8
8
 
9
- merged_data = (html_options.delete(:data) || {}).merge(
9
+ merged_data = merge_component_data(html_options,
10
10
  card_part: :footer,
11
11
  align: align_value,
12
12
  spacing: (spacing == :full ? :full : nil)
@@ -1,5 +1,5 @@
1
1
  <%# locals: (layout: :column, css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  card_part: :header,
4
4
  layout: (layout == :row ? :row : nil)
5
5
  ).compact %>
@@ -1,5 +1,5 @@
1
1
  <%# locals: (text: nil, content: nil, size: :default, css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  card_part: :title,
4
4
  size: (size == :sm ? :sm : nil)
5
5
  ).compact %>
@@ -1,5 +1,5 @@
1
1
  <%# locals: (id:, align: :start, width: :default, css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  combobox_part: "content",
4
4
  combobox_target: "content",
5
5
  align: align,
@@ -1,9 +1,9 @@
1
- <%# locals: (text: "No results found.", css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
1
+ <%# locals: (text: "No results found.", content: nil, css_classes: "", **html_options) %>
2
+ <% merged_data = merge_component_data(html_options,
3
3
  combobox_part: "empty",
4
4
  combobox_target: "empty"
5
5
  ) %>
6
6
 
7
7
  <%= content_tag :div, class: css_classes.presence, data: merged_data, hidden: true, **html_options do %>
8
- <%= text %>
8
+ <%= content.presence || text %>
9
9
  <% end %>
@@ -1,5 +1,5 @@
1
1
  <%# locals: (css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  combobox_part: "group"
4
4
  ) %>
5
5
 
@@ -1,5 +1,5 @@
1
1
  <%# locals: (placeholder: "Search...", css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  combobox_part: "input",
4
4
  combobox_target: "input",
5
5
  action: "input->combobox#filter"
@@ -1,5 +1,5 @@
1
1
  <%# locals: (text: nil, content: nil, css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  combobox_part: "label"
4
4
  ) %>
5
5
 
@@ -1,5 +1,5 @@
1
1
  <%# locals: (css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  combobox_part: "list"
4
4
  ) %>
5
5
 
@@ -1,5 +1,5 @@
1
1
  <%# locals: (value:, selected: false, disabled: false, css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  combobox_part: "option",
4
4
  combobox_target: "option",
5
5
  value: value,
@@ -1,5 +1,5 @@
1
1
  <%# locals: (css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  combobox_part: "separator"
4
4
  ) %>
5
5
 
@@ -1,5 +1,5 @@
1
1
  <%# locals: (for_id:, placeholder: "Select...", variant: :outline, size: :default, css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  component: :button,
4
4
  variant: variant,
5
5
  size: size,
@@ -1,5 +1,5 @@
1
1
  <%# locals: (show_icon: true, css_classes: "btn btn-ghost", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  drawer_part: :close,
4
4
  action: "click->drawer#close"
5
5
  ) %>
@@ -1,5 +1,5 @@
1
1
  <%# locals: (css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  drawer_part: :content
4
4
  ) %>
5
5
  <%= content_tag :div, class: css_classes, data: merged_data, **html_options do %>
@@ -1,5 +1,5 @@
1
1
  <%# locals: (css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  drawer_part: :footer
4
4
  ) %>
5
5
  <%= content_tag :div, class: css_classes, data: merged_data, **html_options do %>
@@ -1,9 +1,9 @@
1
1
  <%# locals: (show_close: true, css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  drawer_part: :header
4
4
  ) %>
5
5
  <%= content_tag :div, class: css_classes, data: merged_data, **html_options do %>
6
- <div class="flex-1">
6
+ <div data-drawer-part="header-content">
7
7
  <%= yield %>
8
8
  </div>
9
9
  <% if show_close %>
@@ -1,5 +1,5 @@
1
1
  <%# locals: (id: nil, default_open: false, css_classes: "", cookie_name: "drawer_state", keyboard_shortcut: "d", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  component: :drawer,
4
4
  controller: "drawer",
5
5
  outlet: "drawer",
@@ -7,7 +7,7 @@
7
7
  drawer_open_value: default_open,
8
8
  drawer_cookie_name_value: cookie_name,
9
9
  drawer_keyboard_shortcut_value: keyboard_shortcut,
10
- action: "keydown.meta+#{keyboard_shortcut}@window->drawer#toggleWithKeyboard keydown.ctrl+#{keyboard_shortcut}@window->drawer#toggleWithKeyboard"
10
+ action: "keydown.meta+#{keyboard_shortcut}@window->drawer#toggleWithKeyboard keydown.ctrl+#{keyboard_shortcut}@window->drawer#toggleWithKeyboard keydown.esc@window->drawer#closeOnEscape"
11
11
  ) %>
12
12
  <%= content_tag :div, id: id || "drawer-provider", class: css_classes, data: merged_data, **html_options do %>
13
13
  <%= yield %>
@@ -1,5 +1,5 @@
1
1
  <%# locals: (variant: :default, size: :default, icon_name: nil, css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  drawer_part: :trigger,
4
4
  controller: "drawer-trigger",
5
5
  action: "click->drawer-trigger#triggerClick",
@@ -1,5 +1,5 @@
1
1
  <%# locals: (align: :start, side: :bottom, width: :default, css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  "dropdown-menu-part": "content",
4
4
  "dropdown-menu-target": "content",
5
5
  align: align,
@@ -1,5 +1,5 @@
1
1
  <%# locals: (css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  "dropdown-menu-part": "group"
4
4
  ) %>
5
5
 
@@ -1,5 +1,5 @@
1
1
  <%# locals: (href: nil, method: nil, variant: :default, disabled: false, css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  "dropdown-menu-part": "item",
4
4
  variant: variant
5
5
  ) %>
@@ -1,13 +1,9 @@
1
- <%# locals: (text: nil, inset: false, css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
1
+ <%# locals: (text: nil, content: nil, inset: false, css_classes: "", **html_options) %>
2
+ <% merged_data = merge_component_data(html_options,
3
3
  "dropdown-menu-part": "label",
4
4
  inset: inset
5
5
  ) %>
6
6
 
7
7
  <%= content_tag :div, class: css_classes.presence, data: merged_data, **html_options do %>
8
- <% if text.present? %>
9
- <%= text %>
10
- <% else %>
11
- <%= yield %>
12
- <% end %>
8
+ <%= text.presence || content || yield %>
13
9
  <% end %>
@@ -1,5 +1,5 @@
1
1
  <%# locals: (css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  "dropdown-menu-part": "separator"
4
4
  ) %>
5
5
 
@@ -1,12 +1,8 @@
1
- <%# locals: (text: nil, css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
1
+ <%# locals: (text: nil, content: nil, css_classes: "", **html_options) %>
2
+ <% merged_data = merge_component_data(html_options,
3
3
  "dropdown-menu-part": "shortcut"
4
4
  ) %>
5
5
 
6
6
  <%= content_tag :span, class: css_classes.presence, data: merged_data, **html_options do %>
7
- <% if text.present? %>
8
- <%= text %>
9
- <% else %>
10
- <%= yield %>
11
- <% end %>
7
+ <%= text.presence || content || yield %>
12
8
  <% end %>
@@ -1,5 +1,5 @@
1
1
  <%# locals: (variant: :outline, size: :default, as_child: false, css_classes: "", **html_options) %>
2
- <% merged_data = (html_options.delete(:data) || {}).merge(
2
+ <% merged_data = merge_component_data(html_options,
3
3
  "dropdown-menu-target": "trigger",
4
4
  action: "dropdown-menu#toggle"
5
5
  ) %>