maquina-components 0.1.1 → 0.2.0

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 (107) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +410 -13
  3. data/app/assets/images/maquina.svg +1 -0
  4. data/app/assets/stylesheets/alert.css +143 -0
  5. data/app/assets/stylesheets/badge.css +145 -0
  6. data/app/assets/stylesheets/breadcrumbs.css +163 -0
  7. data/app/assets/stylesheets/card.css +128 -0
  8. data/app/assets/stylesheets/dropdown_menu.css +248 -0
  9. data/app/assets/stylesheets/empty.css +133 -0
  10. data/app/assets/stylesheets/form.css +617 -0
  11. data/app/assets/stylesheets/header.css +61 -0
  12. data/app/assets/stylesheets/maquina_components.css +178 -0
  13. data/app/assets/stylesheets/pagination.css +154 -0
  14. data/app/assets/stylesheets/sidebar.css +477 -0
  15. data/app/assets/stylesheets/table.css +205 -0
  16. data/app/assets/stylesheets/toggle_group.css +151 -0
  17. data/app/assets/tailwind/maquina_components_engine/engine.css +16 -0
  18. data/app/helpers/maquina_components/breadcrumbs_helper.rb +118 -0
  19. data/app/helpers/maquina_components/dropdown_menu_helper.rb +249 -0
  20. data/app/helpers/maquina_components/empty_helper.rb +102 -0
  21. data/app/helpers/maquina_components/icons_helper.rb +161 -0
  22. data/app/helpers/maquina_components/pagination_helper.rb +153 -0
  23. data/app/helpers/maquina_components/sidebar_helper.rb +63 -0
  24. data/app/helpers/maquina_components/table_helper.rb +144 -0
  25. data/app/helpers/maquina_components/toggle_group_helper.rb +172 -0
  26. data/app/javascript/controllers/breadcrumb_controller.js +71 -0
  27. data/app/javascript/controllers/dropdown_menu_controller.js +203 -0
  28. data/app/javascript/controllers/menu_button_controller.js +59 -0
  29. data/app/javascript/controllers/sidebar_controller.js +316 -0
  30. data/app/javascript/controllers/sidebar_trigger_controller.js +32 -0
  31. data/app/javascript/controllers/toggle_group_controller.js +178 -0
  32. data/app/views/components/_alert.html.erb +12 -0
  33. data/app/views/components/_badge.html.erb +10 -0
  34. data/app/views/components/_breadcrumbs.html.erb +16 -0
  35. data/app/views/components/_card.html.erb +6 -0
  36. data/app/views/components/_dropdown.html.erb +25 -0
  37. data/app/views/components/_dropdown_menu.html.erb +9 -0
  38. data/app/views/components/_empty.html.erb +10 -0
  39. data/app/views/components/_header.html.erb +8 -0
  40. data/app/views/components/_menu_button.html.erb +44 -0
  41. data/app/views/components/_pagination.html.erb +13 -0
  42. data/app/views/components/_separator.html.erb +11 -0
  43. data/app/views/components/_sidebar.html.erb +40 -0
  44. data/app/views/components/_simple_table.html.erb +49 -0
  45. data/app/views/components/_table.html.erb +21 -0
  46. data/app/views/components/_toggle_group.html.erb +24 -0
  47. data/app/views/components/alert/_description.html.erb +6 -0
  48. data/app/views/components/alert/_title.html.erb +6 -0
  49. data/app/views/components/breadcrumbs/_ellipsis.html.erb +9 -0
  50. data/app/views/components/breadcrumbs/_item.html.erb +8 -0
  51. data/app/views/components/breadcrumbs/_link.html.erb +8 -0
  52. data/app/views/components/breadcrumbs/_list.html.erb +8 -0
  53. data/app/views/components/breadcrumbs/_page.html.erb +8 -0
  54. data/app/views/components/breadcrumbs/_separator.html.erb +17 -0
  55. data/app/views/components/card/_action.html.erb +6 -0
  56. data/app/views/components/card/_content.html.erb +9 -0
  57. data/app/views/components/card/_description.html.erb +6 -0
  58. data/app/views/components/card/_footer.html.erb +17 -0
  59. data/app/views/components/card/_header.html.erb +9 -0
  60. data/app/views/components/card/_title.html.erb +9 -0
  61. data/app/views/components/dropdown_menu/_content.html.erb +20 -0
  62. data/app/views/components/dropdown_menu/_group.html.erb +12 -0
  63. data/app/views/components/dropdown_menu/_item.html.erb +29 -0
  64. data/app/views/components/dropdown_menu/_label.html.erb +13 -0
  65. data/app/views/components/dropdown_menu/_separator.html.erb +11 -0
  66. data/app/views/components/dropdown_menu/_shortcut.html.erb +12 -0
  67. data/app/views/components/dropdown_menu/_trigger.html.erb +24 -0
  68. data/app/views/components/empty/_content.html.erb +8 -0
  69. data/app/views/components/empty/_description.html.erb +12 -0
  70. data/app/views/components/empty/_header.html.erb +8 -0
  71. data/app/views/components/empty/_media.html.erb +13 -0
  72. data/app/views/components/empty/_title.html.erb +12 -0
  73. data/app/views/components/pagination/_content.html.erb +8 -0
  74. data/app/views/components/pagination/_ellipsis.html.erb +28 -0
  75. data/app/views/components/pagination/_item.html.erb +8 -0
  76. data/app/views/components/pagination/_link.html.erb +23 -0
  77. data/app/views/components/pagination/_next.html.erb +57 -0
  78. data/app/views/components/pagination/_previous.html.erb +57 -0
  79. data/app/views/components/sidebar/_content.html.erb +8 -0
  80. data/app/views/components/sidebar/_footer.html.erb +8 -0
  81. data/app/views/components/sidebar/_group.html.erb +12 -0
  82. data/app/views/components/sidebar/_header.html.erb +8 -0
  83. data/app/views/components/sidebar/_inset.html.erb +8 -0
  84. data/app/views/components/sidebar/_menu.html.erb +8 -0
  85. data/app/views/components/sidebar/_menu_button.html.erb +14 -0
  86. data/app/views/components/sidebar/_menu_item.html.erb +7 -0
  87. data/app/views/components/sidebar/_menu_link.html.erb +32 -0
  88. data/app/views/components/sidebar/_provider.html.erb +16 -0
  89. data/app/views/components/sidebar/_trigger.html.erb +12 -0
  90. data/app/views/components/stats/_stats_card.html.erb +100 -0
  91. data/app/views/components/stats/_stats_grid.html.erb +38 -0
  92. data/app/views/components/table/_body.html.erb +5 -0
  93. data/app/views/components/table/_caption.html.erb +5 -0
  94. data/app/views/components/table/_cell.html.erb +5 -0
  95. data/app/views/components/table/_footer.html.erb +5 -0
  96. data/app/views/components/table/_head.html.erb +8 -0
  97. data/app/views/components/table/_header.html.erb +8 -0
  98. data/app/views/components/table/_row.html.erb +8 -0
  99. data/app/views/components/toggle_group/_item.html.erb +19 -0
  100. data/config/importmap.rb +1 -0
  101. data/lib/generators/maquina_components/install/USAGE +39 -0
  102. data/lib/generators/maquina_components/install/install_generator.rb +123 -0
  103. data/lib/generators/maquina_components/install/templates/maquina_components_helper.rb.tt +68 -0
  104. data/lib/generators/maquina_components/install/templates/theme.css.tt +179 -0
  105. data/lib/maquina_components/engine.rb +10 -0
  106. data/lib/maquina_components/version.rb +1 -1
  107. metadata +121 -5
@@ -0,0 +1,11 @@
1
+ <%# locals: (orientation: :horizontal) -%>
2
+
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>
@@ -0,0 +1,40 @@
1
+ <%# locals: (id: nil, state: :collapsed, collapsible: :offcanvas, variant: :inset, side: :left, css_classes: "", **html_options) %>
2
+ <% random_id = id || "sidebar-#{SecureRandom.hex(6)}"
3
+
4
+ merged_data = (html_options.delete(:data) || {}).merge(
5
+ sidebar_part: :root,
6
+ sidebar_target: "sidebar",
7
+ state: state,
8
+ variant: variant,
9
+ collapsible: collapsible,
10
+ side: side
11
+ ) %>
12
+
13
+ <aside
14
+ id="<%= random_id %>"
15
+ class="group peer sidebar-loading <%= css_classes %>"
16
+ <%= tag.attributes(data: merged_data, **html_options) %>
17
+ >
18
+ <%# Sidebar gap (creates space for sidebar on desktop) %>
19
+ <div id="<%= random_id %>-gap" data-sidebar-part="gap"></div>
20
+
21
+ <%# Mobile backdrop overlay %>
22
+ <div
23
+ id="<%= random_id %>-overlay"
24
+ data-sidebar-part="backdrop"
25
+ data-sidebar-target="backdrop"
26
+ data-action="click->sidebar#backdropClick"
27
+ ></div>
28
+
29
+ <%# Sidebar container (fixed positioned) %>
30
+ <div
31
+ id="<%= random_id %>-container"
32
+ data-sidebar-part="container"
33
+ data-sidebar-target="container"
34
+ >
35
+ <%# Inner sidebar content wrapper %>
36
+ <div id="<%= random_id %>-inner" data-sidebar-part="inner">
37
+ <%= yield %>
38
+ </div>
39
+ </div>
40
+ </aside>
@@ -0,0 +1,49 @@
1
+ <%# locals: (collection:, columns:, caption: nil, variant: nil, table_variant: nil, empty_message: "No data available", row_id: nil, html_options: {}) %>
2
+ <%= render "components/table", variant: variant, table_variant: table_variant, **html_options do %>
3
+ <% if caption.present? %>
4
+ <%= render "components/table/caption" do %><%= caption %><% end %>
5
+ <% end %>
6
+
7
+ <%= render "components/table/header" do %>
8
+ <%= render "components/table/row" do %>
9
+ <% columns.each do |column| %>
10
+ <%= render "components/table/head", css_classes: table_alignment_class(column[:align]) do %>
11
+ <%= column[:label] %>
12
+ <% end %>
13
+ <% end %>
14
+ <% end %>
15
+ <% end %>
16
+
17
+ <%= render "components/table/body" do %>
18
+ <% if collection.empty? %>
19
+ <%= render "components/table/row" do %>
20
+ <%= render "components/table/cell", colspan: columns.size, data: { empty: "true" } do %>
21
+ <%= empty_message %>
22
+ <% end %>
23
+ <% end %>
24
+ <% else %>
25
+ <% collection.each do |item| %>
26
+ <%
27
+ row_options = {}
28
+ row_options[:id] = "row-#{item.public_send(row_id)}" if row_id && item.respond_to?(row_id)
29
+ %>
30
+ <%= render "components/table/row", **row_options do %>
31
+ <% columns.each do |column| %>
32
+ <%
33
+ value = if column[:key].is_a?(Proc)
34
+ column[:key].call(item)
35
+ elsif item.is_a?(Hash)
36
+ item[column[:key]] || item[column[:key].to_s]
37
+ elsif item.respond_to?(column[:key])
38
+ item.public_send(column[:key])
39
+ end
40
+ %>
41
+ <%= render "components/table/cell", css_classes: table_alignment_class(column[:align]) do %>
42
+ <%= value %>
43
+ <% end %>
44
+ <% end %>
45
+ <% end %>
46
+ <% end %>
47
+ <% end %>
48
+ <% end %>
49
+ <% end %>
@@ -0,0 +1,21 @@
1
+ <%# locals: (css_classes: "", container: true, variant: nil, table_variant: nil, **html_options) %>
2
+ <%
3
+ # Table data attributes - merge user data with component defaults
4
+ table_data = (html_options.delete(:data) || {}).merge(component: :table)
5
+ table_data[:variant] = table_variant if table_variant
6
+
7
+ # Container data attributes
8
+ container_data = { table_part: :container }
9
+ container_data[:variant] = variant if variant
10
+ %>
11
+ <% if container %>
12
+ <div data-table-part="container"<%= " data-variant=\"#{variant}\"" if variant %>>
13
+ <%= content_tag :table, class: css_classes.presence, data: table_data, **html_options do %>
14
+ <%= yield %>
15
+ <% end %>
16
+ </div>
17
+ <% else %>
18
+ <%= content_tag :table, class: css_classes.presence, data: table_data, **html_options do %>
19
+ <%= yield %>
20
+ <% end %>
21
+ <% end %>
@@ -0,0 +1,24 @@
1
+ <%# locals: (type: :single, variant: :default, size: :default, value: nil, disabled: false, css_classes: "", **html_options) %>
2
+ <% selected_values = case value
3
+ when Array then value.map(&:to_s)
4
+ when nil then []
5
+ else [value.to_s]
6
+ end
7
+
8
+ merged_data = (html_options.delete(:data) || {}).merge(
9
+ controller: "toggle-group",
10
+ component: "toggle-group",
11
+ variant: variant,
12
+ size: size,
13
+ "toggle-group-type-value": type,
14
+ "toggle-group-selected-value": selected_values.to_json
15
+ ) %>
16
+
17
+ <%= content_tag :div,
18
+ role: "group",
19
+ class: css_classes.presence,
20
+ data: merged_data,
21
+ "aria-disabled": (disabled ? "true" : nil),
22
+ **html_options do %>
23
+ <%= yield %>
24
+ <% end %>
@@ -0,0 +1,6 @@
1
+ <%# locals: (text: nil, css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(alert_part: :description) %>
3
+
4
+ <%= content_tag :div, class: css_classes.presence, data: merged_data, **html_options do %>
5
+ <%= text || yield %>
6
+ <% end %>
@@ -0,0 +1,6 @@
1
+ <%# locals: (text: nil, css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(alert_part: :title) %>
3
+
4
+ <%= content_tag :div, class: css_classes.presence, data: merged_data, **html_options do %>
5
+ <%= text || yield %>
6
+ <% end %>
@@ -0,0 +1,9 @@
1
+ <%# locals: (css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(
3
+ breadcrumb_part: :ellipsis
4
+ ) %>
5
+
6
+ <%= content_tag :span, role: "presentation", class: css_classes, data: merged_data, **html_options do %>
7
+ <%= icon_for(:ellipsis) %>
8
+ <span class="sr-only">More</span>
9
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <%# locals: (css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(
3
+ breadcrumb_part: :item
4
+ ) %>
5
+
6
+ <%= content_tag :li, class: css_classes, data: merged_data, **html_options do %>
7
+ <%= yield %>
8
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <%# locals: (href:, css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(
3
+ breadcrumb_part: :link
4
+ ) %>
5
+
6
+ <%= link_to href, class: css_classes, data: merged_data, **html_options do %>
7
+ <%= yield %>
8
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <%# locals: (css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(
3
+ breadcrumb_part: :list
4
+ ) %>
5
+
6
+ <%= content_tag :ol, class: css_classes, data: merged_data, **html_options do %>
7
+ <%= yield %>
8
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <%# locals: (css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(
3
+ breadcrumb_part: :page
4
+ ) %>
5
+
6
+ <%= content_tag :span, role: "link", aria: {current: "page", disabled: true}, class: css_classes, data: merged_data, **html_options do %>
7
+ <%= yield %>
8
+ <% end %>
@@ -0,0 +1,17 @@
1
+ <%# locals: (icon: :chevron_right, css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(
3
+ breadcrumb_part: :separator
4
+ ) %>
5
+
6
+ <li
7
+ role="presentation"
8
+ aria-hidden="true"
9
+ class="<%= css_classes %>"
10
+ <%= tag.attributes(data: merged_data, **html_options) %>
11
+ >
12
+ <% if icon == :custom %>
13
+ <%= yield %>
14
+ <% else %>
15
+ <%= icon_for(icon) %>
16
+ <% end %>
17
+ </li>
@@ -0,0 +1,6 @@
1
+ <%# locals: (css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(card_part: :action) %>
3
+
4
+ <%= content_tag :div, class: css_classes.presence, data: merged_data, **html_options do %>
5
+ <%= yield %>
6
+ <% end %>
@@ -0,0 +1,9 @@
1
+ <%# locals: (spacing: :default, css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(
3
+ card_part: :content,
4
+ spacing: (spacing == :full ? :full : nil)
5
+ ).compact %>
6
+
7
+ <%= content_tag :div, class: css_classes.presence, data: merged_data, **html_options do %>
8
+ <%= yield %>
9
+ <% end %>
@@ -0,0 +1,6 @@
1
+ <%# locals: (text: nil, css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(card_part: :description) %>
3
+
4
+ <%= content_tag :div, class: css_classes.presence, data: merged_data, **html_options do %>
5
+ <%= text || yield %>
6
+ <% end %>
@@ -0,0 +1,17 @@
1
+ <%# locals: (align: :start, spacing: :default, css_classes: "", **html_options) %>
2
+ <% align_value = case align.to_sym
3
+ when :between then :between
4
+ when :end then :end
5
+ when :center then :center
6
+ else nil
7
+ end
8
+
9
+ merged_data = (html_options.delete(:data) || {}).merge(
10
+ card_part: :footer,
11
+ align: align_value,
12
+ spacing: (spacing == :full ? :full : nil)
13
+ ).compact %>
14
+
15
+ <%= content_tag :div, class: css_classes.presence, data: merged_data, **html_options do %>
16
+ <%= yield %>
17
+ <% end %>
@@ -0,0 +1,9 @@
1
+ <%# locals: (layout: :column, css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(
3
+ card_part: :header,
4
+ layout: (layout == :row ? :row : nil)
5
+ ).compact %>
6
+
7
+ <%= content_tag :div, class: css_classes.presence, data: merged_data, **html_options do %>
8
+ <%= yield %>
9
+ <% end %>
@@ -0,0 +1,9 @@
1
+ <%# locals: (text: nil, size: :default, css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(
3
+ card_part: :title,
4
+ size: (size == :sm ? :sm : nil)
5
+ ).compact %>
6
+
7
+ <%= content_tag :div, class: css_classes.presence, data: merged_data, **html_options do %>
8
+ <%= text || yield %>
9
+ <% end %>
@@ -0,0 +1,20 @@
1
+ <%# locals: (align: :start, side: :bottom, width: :default, css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(
3
+ "dropdown-menu-part": "content",
4
+ "dropdown-menu-target": "content",
5
+ align: align,
6
+ side: side,
7
+ width: width,
8
+ state: "closed"
9
+ ) %>
10
+
11
+ <%= content_tag :div,
12
+ role: "menu",
13
+ aria: { orientation: "vertical" },
14
+ tabindex: "-1",
15
+ class: css_classes.presence,
16
+ data: merged_data,
17
+ hidden: true,
18
+ **html_options do %>
19
+ <%= yield %>
20
+ <% end %>
@@ -0,0 +1,12 @@
1
+ <%# locals: (css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(
3
+ "dropdown-menu-part": "group"
4
+ ) %>
5
+
6
+ <%= content_tag :div,
7
+ role: "group",
8
+ class: css_classes.presence,
9
+ data: merged_data,
10
+ **html_options do %>
11
+ <%= yield %>
12
+ <% end %>
@@ -0,0 +1,29 @@
1
+ <%# locals: (href: nil, method: nil, variant: :default, disabled: false, css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(
3
+ "dropdown-menu-part": "item",
4
+ variant: variant
5
+ ) %>
6
+
7
+ <% merged_data["turbo-method"] = method if method.present? %>
8
+
9
+ <% aria_attrs = {} %>
10
+ <% aria_attrs[:disabled] = "true" if disabled %>
11
+
12
+ <% tag_name = href.present? ? :a : :button %>
13
+
14
+ <% tag_options = {
15
+ role: "menuitem",
16
+ tabindex: "-1",
17
+ class: css_classes.presence,
18
+ data: merged_data,
19
+ aria: aria_attrs.presence,
20
+ disabled: (disabled unless href.present?),
21
+ **html_options
22
+ } %>
23
+
24
+ <% tag_options[:href] = href if href.present? %>
25
+ <% tag_options[:type] = "button" if tag_name == :button %>
26
+
27
+ <%= content_tag tag_name, **tag_options.compact do %>
28
+ <%= yield %>
29
+ <% end %>
@@ -0,0 +1,13 @@
1
+ <%# locals: (text: nil, inset: false, css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(
3
+ "dropdown-menu-part": "label",
4
+ inset: inset
5
+ ) %>
6
+
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 %>
13
+ <% end %>
@@ -0,0 +1,11 @@
1
+ <%# locals: (css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(
3
+ "dropdown-menu-part": "separator"
4
+ ) %>
5
+
6
+ <%= content_tag :div, nil,
7
+ role: "separator",
8
+ aria: { orientation: "horizontal" },
9
+ class: css_classes.presence,
10
+ data: merged_data,
11
+ **html_options %>
@@ -0,0 +1,12 @@
1
+ <%# locals: (text: nil, css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(
3
+ "dropdown-menu-part": "shortcut"
4
+ ) %>
5
+
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 %>
12
+ <% end %>
@@ -0,0 +1,24 @@
1
+ <%# locals: (variant: :outline, size: :default, as_child: false, css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(
3
+ "dropdown-menu-target": "trigger",
4
+ action: "dropdown-menu#toggle"
5
+ ) %>
6
+
7
+ <% if as_child %>
8
+ <%= yield %>
9
+ <% else %>
10
+ <% button_data = merged_data.merge(
11
+ component: "button",
12
+ variant: variant,
13
+ size: size
14
+ ) %>
15
+ <%= content_tag :button,
16
+ type: "button",
17
+ class: css_classes.presence,
18
+ data: button_data,
19
+ aria: { haspopup: "menu", expanded: "false" },
20
+ **html_options do %>
21
+ <%= yield %>
22
+ <%= icon_for :chevron_down, data: { "dropdown-menu-target": "chevron" } %>
23
+ <% end %>
24
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <%# locals: (css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(
3
+ "empty-part": "content"
4
+ ) %>
5
+
6
+ <%= content_tag :div, class: css_classes.presence, data: merged_data, **html_options do %>
7
+ <%= yield %>
8
+ <% end %>
@@ -0,0 +1,12 @@
1
+ <%# locals: (text: nil, css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(
3
+ "empty-part": "description"
4
+ ) %>
5
+
6
+ <%= content_tag :p, class: css_classes.presence, data: merged_data, **html_options do %>
7
+ <% if text.present? %>
8
+ <%= text %>
9
+ <% else %>
10
+ <%= yield %>
11
+ <% end %>
12
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <%# locals: (css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(
3
+ "empty-part": "header"
4
+ ) %>
5
+
6
+ <%= content_tag :div, class: css_classes.presence, data: merged_data, **html_options do %>
7
+ <%= yield %>
8
+ <% end %>
@@ -0,0 +1,13 @@
1
+ <%# locals: (icon: nil, variant: :icon, css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(
3
+ "empty-part": "media",
4
+ variant: variant
5
+ ) %>
6
+
7
+ <%= content_tag :div, class: css_classes.presence, data: merged_data, **html_options do %>
8
+ <% if icon.present? && respond_to?(:icon_for) %>
9
+ <%= icon_for(icon) %>
10
+ <% elsif block_given? %>
11
+ <%= yield %>
12
+ <% end %>
13
+ <% end %>
@@ -0,0 +1,12 @@
1
+ <%# locals: (text: nil, css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(
3
+ "empty-part": "title"
4
+ ) %>
5
+
6
+ <%= content_tag :h3, class: css_classes.presence, data: merged_data, **html_options do %>
7
+ <% if text.present? %>
8
+ <%= text %>
9
+ <% else %>
10
+ <%= yield %>
11
+ <% end %>
12
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <%# locals: (css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(
3
+ "pagination-part": "content"
4
+ ) %>
5
+
6
+ <%= content_tag :ul, class: css_classes.presence, data: merged_data, **html_options do %>
7
+ <%= yield %>
8
+ <% end %>
@@ -0,0 +1,28 @@
1
+ <%# locals: (css_classes: "", **html_options) %>
2
+ <% sr_label = t("maquina_components.pagination.more_pages", default: "More pages") %>
3
+
4
+ <span
5
+ class="<%= css_classes.presence %>"
6
+ data-pagination-part="ellipsis"
7
+ aria-hidden="true"
8
+ <%= tag.attributes(html_options.except(:data)) %>
9
+ >
10
+ <svg
11
+ xmlns="http://www.w3.org/2000/svg"
12
+ width="24"
13
+ height="24"
14
+ viewBox="0 0 24 24"
15
+ fill="none"
16
+ stroke="currentColor"
17
+ stroke-width="2"
18
+ stroke-linecap="round"
19
+ stroke-linejoin="round"
20
+ aria-hidden="true"
21
+ >
22
+ <circle cx="12" cy="12" r="1" />
23
+ <circle cx="19" cy="12" r="1" />
24
+ <circle cx="5" cy="12" r="1" />
25
+ </svg>
26
+
27
+ <span class="sr-only"><%= sr_label %></span>
28
+ </span>
@@ -0,0 +1,8 @@
1
+ <%# locals: (css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(
3
+ "pagination-part": "item"
4
+ ) %>
5
+
6
+ <%= content_tag :li, class: css_classes.presence, data: merged_data, **html_options do %>
7
+ <%= yield %>
8
+ <% end %>
@@ -0,0 +1,23 @@
1
+ <%# locals: (href:, active: false, disabled: false, css_classes: "", **html_options) %>
2
+ <% merged_data = (html_options.delete(:data) || {}).merge(
3
+ "pagination-part": "link",
4
+ active: active
5
+ ) %>
6
+
7
+ <% if disabled %>
8
+ <%= content_tag :span,
9
+ class: css_classes.presence,
10
+ data: merged_data,
11
+ "aria-disabled": "true",
12
+ **html_options do %>
13
+ <%= yield %>
14
+ <% end %>
15
+ <% else %>
16
+ <%= link_to href,
17
+ class: css_classes.presence,
18
+ data: merged_data,
19
+ "aria-current": (active ? "page" : nil),
20
+ **html_options do %>
21
+ <%= yield %>
22
+ <% end %>
23
+ <% end %>
@@ -0,0 +1,57 @@
1
+ <%# locals: (href: nil, label: nil, disabled: false, show_label: true, css_classes: "", **html_options) %>
2
+ <% is_disabled = disabled || href.nil?
3
+ display_label = label || t("maquina_components.pagination.next", default: "Next")
4
+ merged_data = (html_options.delete(:data) || {}).merge("pagination-part": "next") %>
5
+
6
+ <% if is_disabled %>
7
+ <span
8
+ class="<%= css_classes.presence %>"
9
+ data-pagination-part="next"
10
+ aria-disabled="true"
11
+ <%= tag.attributes(html_options.except(:data)) %>
12
+ >
13
+ <% if show_label %>
14
+ <span><%= display_label %></span>
15
+ <% end %>
16
+
17
+ <svg
18
+ xmlns="http://www.w3.org/2000/svg"
19
+ width="24"
20
+ height="24"
21
+ viewBox="0 0 24 24"
22
+ fill="none"
23
+ stroke="currentColor"
24
+ stroke-width="2"
25
+ stroke-linecap="round"
26
+ stroke-linejoin="round"
27
+ aria-hidden="true"
28
+ >
29
+ <path d="m9 18 6-6-6-6" />
30
+ </svg>
31
+ </span>
32
+ <% else %>
33
+ <%= link_to href,
34
+ class: css_classes.presence,
35
+ data: merged_data,
36
+ "aria-label": display_label,
37
+ **html_options do %>
38
+ <% if show_label %>
39
+ <span><%= display_label %></span>
40
+ <% end %>
41
+
42
+ <svg
43
+ xmlns="http://www.w3.org/2000/svg"
44
+ width="24"
45
+ height="24"
46
+ viewBox="0 0 24 24"
47
+ fill="none"
48
+ stroke="currentColor"
49
+ stroke-width="2"
50
+ stroke-linecap="round"
51
+ stroke-linejoin="round"
52
+ aria-hidden="true"
53
+ >
54
+ <path d="m9 18 6-6-6-6" />
55
+ </svg>
56
+ <% end %>
57
+ <% end %>