ariadne_view_components 0.0.93.2 → 0.0.94

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 (141) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +7 -0
  3. data/README.md +13 -4
  4. data/app/assets/javascripts/ariadne_view_components.js +14 -14
  5. data/app/assets/javascripts/ariadne_view_components.js.br +0 -0
  6. data/app/assets/javascripts/ariadne_view_components.js.gz +0 -0
  7. data/app/assets/javascripts/ariadne_view_components.js.map +1 -1
  8. data/app/assets/stylesheets/ariadne_view_components.css +1 -1
  9. data/app/assets/stylesheets/ariadne_view_components.css.br +0 -0
  10. data/app/assets/stylesheets/ariadne_view_components.css.gz +0 -0
  11. data/app/components/ariadne/base_component.rb +25 -22
  12. data/app/components/ariadne/behaviors/tooltipable.rb +12 -12
  13. data/app/components/ariadne/form/checkbox/component.rb +2 -2
  14. data/app/components/ariadne/form/group/component.rb +1 -1
  15. data/app/components/ariadne/form/radio_button/component.rb +2 -2
  16. data/app/components/ariadne/form/select/component.rb +1 -1
  17. data/app/components/ariadne/form/text_field/component.html.erb +2 -2
  18. data/app/components/ariadne/form/text_field/component.rb +14 -7
  19. data/app/components/ariadne/form/toggle/component.rb +2 -2
  20. data/app/components/ariadne/form/toggle_group/component.rb +1 -1
  21. data/app/components/ariadne/form/toggle_group/option/component.rb +1 -1
  22. data/app/components/ariadne/layout/grid/component.rb +1 -1
  23. data/app/components/ariadne/layout/grid/item/component.rb +2 -2
  24. data/app/components/ariadne/layout/label_block/component.rb +1 -1
  25. data/app/components/ariadne/layout/narrow/component.rb +1 -1
  26. data/app/components/ariadne/ui/accordion/component.rb +3 -1
  27. data/app/components/ariadne/ui/accordion/item/component.html.erb +10 -10
  28. data/app/components/ariadne/ui/accordion/item/component.rb +12 -3
  29. data/app/components/ariadne/ui/avatar/component.html.erb +9 -7
  30. data/app/components/ariadne/ui/avatar/component.rb +55 -7
  31. data/app/components/ariadne/ui/badge/component.rb +35 -16
  32. data/app/components/ariadne/ui/banner/component.html.erb +23 -0
  33. data/app/components/ariadne/ui/banner/component.rb +226 -0
  34. data/app/components/ariadne/ui/banner/component.ts +46 -0
  35. data/app/components/ariadne/ui/blankslate/component.html.erb +2 -2
  36. data/app/components/ariadne/ui/blankslate/component.rb +12 -1
  37. data/app/components/ariadne/ui/button/component.rb +35 -24
  38. data/app/components/ariadne/ui/card/body/component.rb +1 -1
  39. data/app/components/ariadne/ui/card/component.rb +11 -7
  40. data/app/components/ariadne/ui/card/footer/component.rb +1 -1
  41. data/app/components/ariadne/ui/card/header/component.html.erb +2 -2
  42. data/app/components/ariadne/ui/card/header/component.rb +25 -16
  43. data/app/components/ariadne/ui/clipboard_copy/component.html.erb +1 -0
  44. data/app/components/ariadne/ui/clipboard_copy/component.rb +17 -21
  45. data/app/components/ariadne/ui/clipboard_copy/component.ts +15 -0
  46. data/app/components/ariadne/ui/color_dot/component.html.erb +5 -5
  47. data/app/components/ariadne/ui/color_dot/component.rb +19 -4
  48. data/app/components/ariadne/ui/combobox/component.html.erb +1 -1
  49. data/app/components/ariadne/ui/combobox/component.rb +54 -23
  50. data/app/components/ariadne/ui/combobox/component.ts +2 -0
  51. data/app/components/ariadne/ui/dialog/body/component.html.erb +3 -0
  52. data/app/components/ariadne/ui/dialog/body/component.rb +28 -0
  53. data/app/components/ariadne/ui/dialog/component.html.erb +25 -24
  54. data/app/components/ariadne/ui/dialog/component.rb +87 -18
  55. data/app/components/ariadne/ui/dialog/component.ts +5 -1
  56. data/app/components/ariadne/ui/dialog/footer/component.html.erb +3 -0
  57. data/app/components/ariadne/ui/dialog/footer/component.rb +34 -0
  58. data/app/components/ariadne/ui/heroicon/component.rb +21 -21
  59. data/app/components/ariadne/ui/image/component.rb +11 -23
  60. data/app/components/ariadne/ui/link/component.html.erb +1 -3
  61. data/app/components/ariadne/ui/link/component.rb +17 -4
  62. data/app/components/ariadne/ui/list/component.html.erb +5 -9
  63. data/app/components/ariadne/ui/list/component.rb +31 -7
  64. data/app/components/ariadne/ui/list/item/component.rb +6 -5
  65. data/app/components/ariadne/ui/pagination/component.rb +1 -2
  66. data/app/components/ariadne/ui/popover/component.html.erb +1 -1
  67. data/app/components/ariadne/ui/popover/component.rb +31 -26
  68. data/app/components/ariadne/ui/relative_time/component.html.erb +1 -0
  69. data/app/components/ariadne/ui/{time_ago → relative_time}/component.rb +15 -15
  70. data/app/components/ariadne/ui/{time_ago → relative_time}/component.ts +1 -1
  71. data/app/components/ariadne/ui/shortcut/component.html.erb +0 -1
  72. data/app/components/ariadne/ui/shortcut/component.rb +31 -5
  73. data/app/components/ariadne/ui/shortcut/component.ts +1 -1
  74. data/app/components/ariadne/ui/skeleton/component.rb +2 -8
  75. data/app/components/ariadne/ui/stats_panel/component.html.erb +3 -3
  76. data/app/components/ariadne/ui/stats_panel/component.rb +25 -1
  77. data/app/components/ariadne/ui/stats_panel/item/component.html.erb +3 -3
  78. data/app/components/ariadne/ui/stats_panel/item/component.rb +6 -6
  79. data/app/components/ariadne/ui/table/cell/component.rb +1 -1
  80. data/app/components/ariadne/ui/table/row/component.rb +1 -1
  81. data/app/components/ariadne/ui/typography/component.rb +3 -1
  82. data/app/frontend/controllers/tooltip_controller.ts +8 -3
  83. data/app/frontend/stylesheets/ariadne_view_components.css +1 -0
  84. data/app/frontend/stylesheets/theme.css +88 -0
  85. data/app/frontend/utils/createController.ts +9 -0
  86. data/app/helpers/ariadne/color_helper.rb +158 -0
  87. data/app/helpers/ariadne/form_helper.rb +1 -0
  88. data/app/helpers/ariadne/size_helper.rb +7 -0
  89. data/app/lib/ariadne/attributes_helper.rb +4 -4
  90. data/app/lib/ariadne/view_component/style_variants.rb +1 -1
  91. data/app/lib/ariadne/view_helper.rb +0 -6
  92. data/lib/ariadne/accessibility.rb +64 -0
  93. data/lib/ariadne/forms/dsl/form_object.rb +5 -1
  94. data/lib/ariadne/forms/dsl/input.rb +1 -1
  95. data/lib/ariadne/static/generate_arguments.rb +54 -0
  96. data/lib/ariadne/static/generate_audited_at.rb +17 -0
  97. data/lib/ariadne/static/generate_constants.rb +19 -0
  98. data/lib/ariadne/static/generate_previews.rb +53 -0
  99. data/lib/ariadne/static/generate_statuses.rb +17 -0
  100. data/lib/ariadne/static/generate_structure.rb +279 -0
  101. data/lib/ariadne/static.rb +68 -0
  102. data/lib/ariadne/view_components/constants.rb +2 -2
  103. data/lib/ariadne/view_components/version.rb +1 -1
  104. data/lib/ariadne/view_components.rb +0 -51
  105. data/lib/ariadne/yard/component_manifest.rb +81 -81
  106. data/lib/ariadne/yard/component_ref.rb +1 -1
  107. data/lib/ariadne/yard/docs_helper.rb +24 -16
  108. data/lib/ariadne/yard/dry_initializer/common_handler.rb +103 -0
  109. data/lib/ariadne/yard/dry_initializer/option_handler.rb +38 -0
  110. data/lib/ariadne/yard/dry_initializer/param_handler.rb +57 -0
  111. data/lib/ariadne/yard/registry.rb +2 -5
  112. data/lib/ariadne/yard/{info_arch_docs_helper.rb → structure_docs_helper.rb} +5 -5
  113. data/lib/ariadne/yard.rb +20 -8
  114. data/lib/rubocop/config/default.yml +0 -3
  115. metadata +34 -37
  116. data/app/components/ariadne/behaviors/captionable.rb +0 -55
  117. data/app/components/ariadne/turbo/frame/component.html.erb +0 -3
  118. data/app/components/ariadne/turbo/frame/component.rb +0 -16
  119. data/app/components/ariadne/turbo/stream_action/component.html.erb +0 -4
  120. data/app/components/ariadne/turbo/stream_action/component.rb +0 -25
  121. data/app/components/ariadne/ui/data_table/component.html.erb +0 -1
  122. data/app/components/ariadne/ui/data_table/component.rb +0 -11
  123. data/app/components/ariadne/ui/flash/component.html.erb +0 -18
  124. data/app/components/ariadne/ui/flash/component.rb +0 -151
  125. data/app/components/ariadne/ui/flash/component.ts +0 -56
  126. data/app/components/ariadne/ui/overlay/component.html.erb +0 -12
  127. data/app/components/ariadne/ui/overlay/component.rb +0 -54
  128. data/app/components/ariadne/ui/overlay/component.ts +0 -92
  129. data/app/components/ariadne/ui/time_ago/component.html.erb +0 -1
  130. data/lib/ariadne/view_components/commands.rb +0 -90
  131. data/lib/ariadne/view_components/statuses.rb +0 -14
  132. data/lib/ariadne/view_components/upstream.rb +0 -19
  133. data/lib/ariadne/yard/lookbook_pages_backend.rb +0 -235
  134. data/lib/rubocop/cop/ariadne/no_tag_memoize.rb +0 -44
  135. data/static/arguments.yml +0 -879
  136. data/static/assets/view-components.svg +0 -18
  137. data/static/classes.yml +0 -211
  138. data/static/constants.json +0 -743
  139. data/static/statuses.json +0 -58
  140. data/static/tailwindcss.yml +0 -727
  141. /data/app/components/ariadne/ui/{time_ago → relative_time}/en.yml +0 -0
@@ -4,21 +4,35 @@
4
4
  module Ariadne
5
5
  module UI
6
6
  module ColorDot
7
+ # Creates a colored circle.
7
8
  class Component < Ariadne::BaseComponent
9
+ # @param [Symbol] color The hex color of the dot (without the hash)
8
10
  option :color
9
- option :size, default: -> { :base }
11
+
12
+ DEFAULT_SIZE = :md
13
+ # @param [Symbol] size (Ariadne::UI::ColorDot::DEFAULT_SIZE) Indicates the button's size. <%= one_of(Ariadne::SizeHelper::VALID_SIZES) %>
14
+ option :size, default: -> { DEFAULT_SIZE }
15
+
16
+ def before_render
17
+ raise ArgumentError, "Color must be a 6-character hex string" unless color.match?(/\A[a-fA-F0-9]{6}\z/)
18
+ end
10
19
 
11
20
  style do
12
21
  base do
13
- "ariadne-inline-flex ariadne-items-center ariadne-truncate"
22
+ [
23
+ "ariadne-inline-flex",
24
+ "ariadne-items-center",
25
+ "ariadne-truncate",
26
+ ]
14
27
  end
15
28
 
16
29
  variants do
17
30
  size do
18
31
  xs { "ariadne-ps-0.5" }
19
32
  sm { "ariadne-ps-0.5" }
20
- base { "ariadne-ps-1" }
21
33
  md { "ariadne-ps-1" }
34
+ lg { "ariadne-ps-1" }
35
+ xl { "ariadne-ps-1" }
22
36
  end
23
37
  end
24
38
  end
@@ -28,8 +42,9 @@ module Ariadne
28
42
  size do
29
43
  xs { "ariadne-size-2" }
30
44
  sm { "ariadne-size-2.5" }
31
- base { "ariadne-size-3" }
32
45
  md { "ariadne-size-3" }
46
+ lg { "ariadne-size-3" }
47
+ xl { "ariadne-ps-1" }
33
48
  end
34
49
  end
35
50
  end
@@ -1,6 +1,6 @@
1
1
  <details class="ariadne-inline" <%= html_attrs.to_html %>>
2
2
  <summary class="ariadne-list-none ariadne-rounded" data-<%= stimulus_name %>-target="button" data-action="click-><%= stimulus_name %>#toggle">
3
- <%= button %>
3
+ <%= reveal_button %>
4
4
  </summary>
5
5
  <details-menu
6
6
  class="<%= merged_styles(:popover, size:) %>"
@@ -4,41 +4,71 @@
4
4
  module Ariadne
5
5
  module UI
6
6
  module Combobox
7
+ # The combobox is used to present a list of options for selection.
8
+ #
9
+ # Style overrides:
10
+ #
11
+ # - `popover` - The popover that contains the combobox options.
7
12
  class Component < Ariadne::BaseComponent
8
- option :size, default: proc { :md }
13
+ DEFAULT_SIZE = :md
9
14
 
10
- option :placement, default: proc { "bottom" }
15
+ # @param [Symbol] size (Ariadne::UI::Combobox::DEFAULT_SIZE) The size of the badge. <%= one_of(Ariadne::SizeHelper::VALID_SIZES) %>
16
+ option :size, default: proc { DEFAULT_SIZE }
17
+
18
+ DEFAULT_PLACEMENT = "bottom"
19
+ # according to `floating-ui/dom`
20
+ VALID_PLACEMENTS = ["top", "right", "bottom", "left", "top-start", "top-end", "right-start", "right-end", "bottom-start", "bottom-end", "left-start", "left-end"]
21
+ # @param [String] size (bottom) The location of the menu.
22
+ option :placement, default: proc { DEFAULT_PLACEMENT }
23
+
24
+ # @param [Boolean] clamped (false) Indicates if the menu should be clamped to the viewport.
11
25
  option :clamped, default: proc { false }
12
26
 
27
+ # @param [String] changed_action A stimulus action to call when a value within the combobox changes.
13
28
  option :changed_action, optional: true
14
29
 
30
+ # The list of options to display in the combobox.
31
+ #
32
+ # @param options [Hash] Same arguments as <%= link_to_component(Ariadne::UI::List::Component) %>.
15
33
  renders_one :list, lambda { |**options|
16
- options[:as_menu] = true
17
- Ariadne::UI::List::Component.new(**options)
34
+ options[:as_menu] = true
35
+ Ariadne::UI::List::Component.new(**options)
36
+ }
37
+
38
+ # The button which renders the combobox.
39
+ #
40
+ # @param options [Hash] Same arguments as <%= link_to_component(Ariadne::UI::Button::Component) %>.
41
+ renders_one :reveal_button, lambda { |**options|
42
+ options[:html_attrs] ||= {}
43
+ options[:html_attrs][:role] = "combobox"
44
+
45
+ options[:html_attrs][:aria] = merge_aria(
46
+ options[:html_attrs], {
47
+ aria: {
48
+ haspopup: "dialog",
49
+ expanded: "false",
50
+ },
51
+ }
52
+ )
53
+
54
+ options[:scheme] ||= :nude
55
+ options[:html_attrs][:id] ||= Ariadne::UI::Button::Component.generate_id
56
+ Ariadne::UI::Button::Component.new(**options)
18
57
  }
19
- renders_one :button, Ariadne::UI::Button::Component
20
58
 
21
59
  accepts_html_attributes do |html_attrs|
22
- html_attrs[:data] ||= {}
23
- html_attrs[:data] = {
24
- controller: "#{stimulus_name} #{html_attrs[:data].delete(:controller)}".strip,
60
+ component_data_attrs = {
61
+ controller: stimulus_name,
25
62
  "#{stimulus_name}-target": "wrapper",
26
63
  "#{stimulus_name}-placement-value": placement,
27
64
  "#{stimulus_name}-clamped-value": clamped,
28
- }.merge(html_attrs[:data])
65
+ }
29
66
 
30
67
  if changed_action
31
- html_attrs[:data][:action] = "#{stimulus_name}:changed->#{changed_action}"
68
+ component_data_attrs[:action] = "#{stimulus_name}:changed->#{changed_action}"
32
69
  end
33
- end
34
-
35
- def initialize(**options)
36
- super
37
- validate!
38
- end
39
70
 
40
- private def validate!
41
- # raise ArgumentError, "Must provide only `options` or `items`, not both" if items? && options?
71
+ html_attrs[:data] = merge_data_attributes(html_attrs, component_data_attrs)
42
72
  end
43
73
 
44
74
  accepts_styles :popover
@@ -52,10 +82,8 @@ module Ariadne
52
82
  "ariadne-scrollbar-trigger",
53
83
  "ariadne-rounded-lg",
54
84
  "ariadne-shadow-lg",
55
- "ariadne-bg-foreground",
56
- "dark:ariadne-bg-foreground-dark",
57
- "ariadne-text-content",
58
- "dark:ariadne-text-content-dark",
85
+ "ariadne-bg-popover",
86
+ "text-popover-foreground",
59
87
  ]
60
88
  end
61
89
 
@@ -72,7 +100,10 @@ module Ariadne
72
100
 
73
101
  style :options do
74
102
  base do
75
- ["ariadne-overflow-auto", "ariadne-p-2"]
103
+ [
104
+ "ariadne-overflow-auto",
105
+ "ariadne-p-2",
106
+ ]
76
107
  end
77
108
  end
78
109
  end
@@ -29,6 +29,7 @@ export default class ComboboxController extends controllerFactory<HTMLDetailsEle
29
29
  if (this.changedIds.size > 0) {
30
30
  this.dispatch('changed')
31
31
  this.changedIds.clear()
32
+ this.buttonTarget.setAttribute('aria-expanded', 'false')
32
33
  }
33
34
  }
34
35
 
@@ -115,5 +116,6 @@ export default class ComboboxController extends controllerFactory<HTMLDetailsEle
115
116
  toggle(): void {
116
117
  this.element.open = !this.element.open
117
118
  this.setupAutoUpdate()
119
+ this.buttonTarget.setAttribute('aria-expanded', 'true')
118
120
  }
119
121
  }
@@ -0,0 +1,3 @@
1
+ <div class="<%= html_attrs[:class] %>" <%= html_attributes %>>
2
+ <%= content %>
3
+ </div>
@@ -0,0 +1,28 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ module Ariadne
5
+ module UI
6
+ module Dialog
7
+ module Body
8
+ # A `Dialog::Body` is a compositional component, used to render the
9
+ # innards of a dialog. See <%= link_to_component(Ariadne::UI::Dialog::Component) %>.
10
+ class Component < Ariadne::BaseComponent
11
+ attr_accessor :context
12
+
13
+ accepts_html_attributes do |html_attrs|
14
+ html_attrs[:class] = merge_tailwind_classes([style, html_attrs[:class]].join(" "))
15
+
16
+ html_attrs
17
+ end
18
+
19
+ style do
20
+ base do
21
+ []
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,29 +1,30 @@
1
1
  <div
2
- class="ariadne-contents"
3
2
  data-controller="<%= stimulus_name %>"
4
- data-action="click@window-><%= stimulus_name %>#windowClick"
5
- <%= html_attrs.to_html %>>
6
- <%= trigger %>
7
-
3
+ data-action="click@window-><%= stimulus_name %>#windowClick">
4
+ <%= reveal_button %>
8
5
  <dialog
9
- class="<%= style %>"
10
- data-<%= stimulus_name %>-target="dialog">
11
- <div>
12
- <div class="ariadne-p-6 ariadne-space-y-6">
13
- <div class="ariadne-flex ariadne-flex-col ariadne-gap-3 ariadne-pe-5">
14
- <h2 class="ariadne-text-lg ariadne-font-semibold ariadne-leading-none ariadne-tracking-tight"><%= title %></h2>
15
- <% if description %><p class="ariadne-text-sm ariadne-text-muted-foreground"><%= description %></p><% end %>
16
- </div>
17
- <div><%= content %></div>
18
- <% if footer? %>
19
- <div class="ariadne-flex ariadne-gap-2 ariadne-flex-wrap"><%= footer %></div>
20
- <% end %>
21
- </div>
22
- <div class="ariadne-absolute ariadne-end-3 ariadne-top-3">
23
- <%= render Ariadne::UI::Button::Component.new(
24
- theme: :nude,
25
- html_attrs: { "data-action": "click->#{stimulus_name}#triggerClick", aria: { label: trigger_close_label } }).as_icon(icon: "x-mark", variant: :outline) %>
26
- </div>
6
+ class="<%= html_attrs[:class] %>"
7
+ data-<%= stimulus_name %>-target="dialog"
8
+ <%= html_attributes %>>
9
+ <div class="ariadne-flex ariadne-flex-col ariadne-space-y-2 ariadne-text-center sm:ariadne-text-left">
10
+ <span id="<%= dialog_id %>-title" class="ariadne-text-lg ariadne-font-semibold"><%= title %></span>
11
+ <% if content.present? %>
12
+ <%= content %>
13
+ <% else %>
14
+ <div data-labelled-by="<%= labelledby %>">
15
+ <%= body %>
27
16
  </div>
28
- </dialog>
17
+ <% end %>
18
+ <% if footer? %>
19
+ <%= footer %>
20
+ <% end %>
21
+ </div>
22
+ <div class="ariadne-absolute ariadne-end-3 ariadne-top-3">
23
+ <%= render Ariadne::UI::Button::Component.new(
24
+ scheme: :nude,
25
+ size: :xs,
26
+ html_attrs: { "data-action": "click->#{stimulus_name}#swapVisibility", aria: { label: dialog_close_label } }).as_icon(icon: "x-mark", variant: :outline) %>
27
+ </div>
28
+ </div>
29
+ </dialog>
29
30
  </div>
@@ -4,16 +4,83 @@
4
4
  module Ariadne
5
5
  module UI
6
6
  module Dialog
7
+ # A `Dialog` is used to remove the user from the main application flow,
8
+ # to confirm actions, ask for disambiguation or to present small forms.
9
+ #
10
+ # @accessibility
11
+ # - **Dialog Accessible Name**: A dialog should have an accessible name,
12
+ # so screen readers are aware of the purpose of the dialog when it opens.
13
+ # Give an accessible name by setting `:title`. The accessible name will be
14
+ # used as the main heading inside the dialog.
15
+ # - **Dialog unique id**: A dialog should be unique. Give a unique id by
16
+ # setting `:dialog_id`. If no `:dialog_id` is given, a random
17
+ # hex id is generated.
18
+ #
19
+ # The combination of both `:title` and `:dialog_id` establishes an
20
+ # `aria-labelledby` relationship between the title and the unique id of
21
+ # the dialog.
7
22
  class Component < Ariadne::BaseComponent
23
+ # @param title [String] The id of the dialog.
8
24
  option :title
9
- option :trigger_close_label
10
- option :description, optional: true
11
- option :width, default: proc { :base }
25
+ # @param dialog_close_label [String] ("Close") The aria label for the button which closes the dialog. Necessary if using the `close_button` slot.
26
+ option :dialog_close_label, default: -> { "Close" }
12
27
 
13
- renders_one :trigger
14
- renders_one :footer
28
+ # @param dialog_id [String] (UUID) The id of the dialog. If no `:dialog_id` is given, a random
29
+ # UUID-based ID is generated.
30
+ option :dialog_id, default: -> { self.class.generate_id }
15
31
 
16
- accepts_html_attributes
32
+ # @param [Symbol] width (:narrow) Indicates the width of the button. Can be either `:narrow` or `:full`.
33
+ option :width, default: proc { :narrow }
34
+
35
+ # The button to open the dialog.
36
+ #
37
+ # @param options [Hash] Same arguments as <%= link_to_component(Ariadne::UI::Button::Component) %>.
38
+ renders_one :reveal_button, lambda { |**options|
39
+ component_data_attrs = {
40
+ action: "#{Ariadne::UI::Dialog::Component.stimulus_name}#swapVisibility",
41
+ }
42
+
43
+ options[:html_attrs] ||= {}
44
+ options[:html_attrs][:data] = merge_data_attributes(options[:html_attrs], component_data_attrs)
45
+ Ariadne::UI::Button::Component.new(**options)
46
+ }
47
+
48
+ # The content.
49
+ #
50
+ # @param system_arguments [Hash] Same arguments as <%= link_to_component(Ariadne::UI::Dialog::Body::Component) %>.
51
+ renders_one :body, Ariadne::UI::Dialog::Body::Component
52
+
53
+ # Optional footer content to the dialog; usually buttons.
54
+ #
55
+ # @param system_arguments [Hash] Same arguments as <%= link_to_component(Ariadne::UI::Dialog::Footer::Component) %>.
56
+ renders_one :footer, Ariadne::UI::Dialog::Footer::Component
57
+
58
+ accepts_html_attributes do |html_attrs|
59
+ html_attrs[:class] = merge_tailwind_classes([style(width:), html_attrs[:class]].join(" "))
60
+
61
+ @dialog_id = html_attrs[:id].presence || @dialog_id
62
+ html_attrs[:id] = @dialog_id
63
+
64
+ html_attrs[:aria] = { modal: true }
65
+ html_attrs[:aria] = merge_aria(
66
+ html_attrs, {
67
+ aria: {
68
+ labelledby: labelledby,
69
+ describedby: describedby,
70
+ },
71
+ }
72
+ )
73
+
74
+ html_attrs
75
+ end
76
+
77
+ def labelledby
78
+ "#{@dialog_id}-title"
79
+ end
80
+
81
+ def describedby
82
+ "#{@dialog_id}-description"
83
+ end
17
84
 
18
85
  style do
19
86
  base do
@@ -22,27 +89,29 @@ module Ariadne
22
89
  "ariadne-max-h-[90-vh]",
23
90
  "ariadne-shadow-xl",
24
91
  "ariadne-rounded-2xl",
25
- "ariadne-bg-foreground",
26
- "dark:ariadne-bg-foreground-dark",
92
+ "ariadne-bg-card",
93
+ "ariadne-text-card-foreground",
27
94
  "ariadne-text-content",
28
95
  "dark:ariadne-text-content-dark",
29
96
  "backdrop:ariadne-bg-zinc-900/20",
30
97
  "backdrop:dark:ariadne-bg-zinc-100/20",
98
+ "ariadne-relative",
99
+ "ariadne-px-4",
100
+ "ariadne-pb-4",
101
+ "ariadne-pt-5",
102
+ "ariadne-text-left",
103
+ "ariadne-shadow-xl",
104
+ "ariadne-transition-all",
105
+ "sm:ariadne-w-full",
106
+ "sm:ariadne-max-w-xl",
107
+ "sm:ariadne-p-6",
31
108
  ]
32
109
  end
33
110
  variants do
34
111
  width do
35
- base do
36
- [
37
- "ariadne-w-96",
38
- "ariadne-max-w-[90vw]",
39
- ]
40
- end
41
-
42
- wide do
112
+ full do
43
113
  [
44
- "ariadne-w-3/5",
45
- "ariadne-max-w-[90vw]",
114
+ "ariadne-w-full",
46
115
  ]
47
116
  end
48
117
  end
@@ -9,17 +9,21 @@ export default class DialogController extends controllerFactory()({
9
9
  this.dialogTarget.close()
10
10
  enableBodyScroll(this.dialogTarget)
11
11
  }
12
+
12
13
  disconnect() {
13
14
  this.close()
14
15
  }
16
+
15
17
  open() {
16
18
  this.dialogTarget.showModal()
17
19
  disableBodyScroll(this.dialogTarget, {reserveScrollBarGap: true})
18
20
  }
19
- triggerClick() {
21
+
22
+ swapVisibility() {
20
23
  if (this.dialogTarget.open) this.close()
21
24
  else this.open()
22
25
  }
26
+
23
27
  windowClick(e: MouseEvent) {
24
28
  if (e.target === this.dialogTarget) {
25
29
  this.close()
@@ -0,0 +1,3 @@
1
+ <div class="<%= html_attrs[:class] %>" <%= html_attributes %>>
2
+ <%= content %>
3
+ </div>
@@ -0,0 +1,34 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ module Ariadne
5
+ module UI
6
+ module Dialog
7
+ module Footer
8
+ # A `Dialog::Footer` is a compositional component, used to render the
9
+ # innards of a dialog. See <%= link_to_component(Ariadne::UI::Dialog::Component) %>.
10
+ class Component < Ariadne::BaseComponent
11
+ attr_accessor :context
12
+
13
+ accepts_html_attributes do |html_attrs|
14
+ html_attrs[:class] = merge_tailwind_classes([style, html_attrs[:class]].join(" "))
15
+
16
+ html_attrs
17
+ end
18
+
19
+ style do
20
+ base do
21
+ [
22
+ "ariadne-flex",
23
+ "ariadne-flex-col-reverse",
24
+ "sm:ariadne-flex-row",
25
+ "sm:ariadne-justify-end",
26
+ "sm:ariadne-space-x-2",
27
+ ]
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -6,36 +6,36 @@ require "heroicons_helper"
6
6
  module Ariadne
7
7
  module UI
8
8
  module Heroicon
9
- # @example Default
10
- # <%= render(Ariadne::UI::Heroicon::Component.new(icon: :check, variant: HeroiconsHelper::Icon::VARIANT_OUTLINE)) %>
11
- # <%= render(Ariadne::UI::Heroicon::Component.new(icon: :check, variant: HeroiconsHelper::Icon::VARIANT_SOLID)) %>
12
- #
13
- # @example Medium
14
- # <%= render(Ariadne::UI::Heroicon::Component.new(icon: :"user-group", variant: HeroiconsHelper::Icon::VARIANT_OUTLINE, size: :md)) %>
15
- #
16
- # @example Helper
17
- # <%= ariadne_heroicon(icon: :check, variant: HeroiconsHelper::Icon::VARIANT_OUTLINE) %>
18
- #
19
- # @param tag [Symbol, String] The rendered tag name
20
- # @param classes [String] <%= link_to_classes_docs %>
21
- # @param icon [Symbol, String] Name of <%= link_to_heroicons %> to use.
22
- # @param variant [String] <%= one_of(HeroiconsHelper::Icon::VALID_VARIANTS, sort: false) %>
23
- # @param size [Symbol] <%= one_of(Ariadne::UI::Heroicon::Component::SIZE_MAPPINGS, sort: false) %>
9
+ # Use this component whenever you need to render a [Heroicon](https://heroicons.com/) SVG icon.
24
10
  class Component < Ariadne::BaseComponent
25
- attr_accessor :dark_mode
11
+ DEFAULT_SIZE = :md
26
12
 
13
+ # @param icon [Symbol, String] The name of <%= link_to_heroicons %> to use.
27
14
  option :icon
15
+ # @param variant [String] The type of variant to use. <%= one_of(HeroiconsHelper::Icon::VALID_VARIANTS) %>
28
16
  option :variant
29
- option :size, default: -> { :md }
17
+ # @param [Symbol] size (Ariadne::UI::Heroicon::DEFAULT_SIZE) The size of the badge. <%= one_of(Ariadne::SizeHelper::VALID_SIZES) %>
18
+ option :size, default: proc { DEFAULT_SIZE }
30
19
 
31
20
  include IconHelper
32
21
  include HeroiconsHelper
33
22
 
34
23
  accepts_html_attributes do |html_attrs|
35
- classes = [@heroicon.attributes["class"], style(size: @size)]
36
- classes << ["dark:ariadne-invert"] if dark_mode == :invert
37
- classes << html_attrs[:class]
38
- html_attrs[:class] = Ariadne::ViewComponents.tailwind_merger.merge(classes)
24
+ classes = [
25
+ @heroicon.attributes["class"],
26
+ style(size: @size),
27
+ html_attrs[:class],
28
+ ]
29
+
30
+ html_attrs[:class] = merge_tailwind_classes(classes)
31
+
32
+ html_attrs[:aria] ||= {}
33
+
34
+ if html_attrs[:aria][:label] || html_attrs[:"aria-label"]
35
+ html_attrs[:role] = "img"
36
+ else
37
+ html_attrs[:aria][:hidden] = true
38
+ end
39
39
  end
40
40
 
41
41
  def initialize(**options)
@@ -4,36 +4,24 @@
4
4
  module Ariadne
5
5
  module UI
6
6
  module Image
7
- # @example Default
7
+ # Component for rendering images.
8
8
  #
9
- # <%= render(Ariadne::ImageComponent.new(src: "https://github.com/github.png", alt: "GitHub")) %>
10
- #
11
- # @example Helper
12
- #
13
- # <%= ariadne_image(src: "https://github.com/github.png", alt: "GitHub") %>
14
- #
15
- # @example Lazy loading
16
- #
17
- # <%= render(Ariadne::ImageComponent.new(src: "https://github.com/github.png", alt: "GitHub", lazy: true)) %>
18
- #
19
- # @example Custom size
20
- #
21
- # <%= render(Ariadne::ImageComponent.new(src: "https://github.com/github.png", alt: "GitHub", attributes: { height: 100, width: 100 })) %>
22
- #
23
- # @param tag [Symbol, String] The rendered tag name
24
- # @param src [String] The source url of the image.
25
- # @param alt [String] Specifies an alternate text for the image.
26
- # @param lazy [Boolean] Whether or not to lazily load the image.
27
- # @param classes [String] <%= link_to_classes_docs %>
28
- # @param attributes [Hash] <%= link_to_attributes_docs %>
9
+ # @accessibility
10
+ # Always provide a meaningful `alt`.
29
11
  class Component < Ariadne::BaseComponent
12
+ DEFAULT_SIZE = :md
13
+
14
+ # @param src [String] The source url of the image.
30
15
  option :src
16
+ # @param alt [String] Specifies an alternate text for the image.
31
17
  option :alt
32
- option :size, default: -> { :original }
18
+ # @param [Symbol] size (Ariadne::UI::Image::DEFAULT_SIZE) The size of the badge. <%= one_of(Ariadne::SizeHelper::VALID_SIZES) %>
19
+ option :size, default: -> { DEFAULT_SIZE }
20
+ # @param lazy [Boolean] Whether or not to lazily load the image.
33
21
  option :lazy, default: -> { false }
34
22
 
35
23
  accepts_html_attributes do |html_attrs|
36
- html_attrs[:class] = Ariadne::ViewComponents.tailwind_merger.merge([style(size: @size), html_attrs[:class]].join(" "))
24
+ html_attrs[:class] = merge_tailwind_classes([style(size: @size), html_attrs[:class]].join(" "))
37
25
 
38
26
  html_attrs[:src] = @src
39
27
  html_attrs[:alt] = @alt
@@ -1,3 +1 @@
1
- <a href="<%= href %>" class="<%= html_attrs[:class] %>" <%= html_attributes %>>
2
- <%= content %>
3
- </a>
1
+ <a href="<%= href %>" class="<%= html_attrs[:class] %>" <%= html_attributes %>><%= content %></a>
@@ -4,16 +4,27 @@
4
4
  module Ariadne
5
5
  module UI
6
6
  module Link
7
+ # Use this to navigate from one page to another. `Link` styles anchor tags with default styling and hover text-decoration.
8
+ #
9
+ # @behaviors <%= link_to_component(Ariadne::Behaviors::Tooltipable) %>
7
10
  class Component < Ariadne::BaseComponent
11
+ # @param [String] href URL to be used for the link.
8
12
  option :href
9
13
 
10
- option :theme, default: proc { :base }
11
- option :size, default: proc { :base }
14
+ DEFAULT_SIZE = :md
15
+ DEFAULT_SCHEME = :base
16
+ SCHEME_OPTIONS = [DEFAULT_SCHEME, :nude, :none, :thick].freeze
17
+
18
+ # @param [Symbol] theme (:primary) Indicates the link's design scheme. <%= one_of(Ariadne::UI::Link::Component::SCHEME_OPTIONS) %>
19
+ option :scheme, default: -> { :base }
20
+
21
+ # @param [Symbol] size (Ariadne::UI::Link::DEFAULT_SIZE) The size of the link. <%= one_of(Ariadne::SizeHelper::VALID_SIZES) %>
22
+ option :size, default: proc { DEFAULT_SIZE }
12
23
 
13
24
  include Ariadne::Behaviors::Tooltipable
14
25
 
15
26
  accepts_html_attributes do |html_attrs|
16
- html_attrs[:class] = Ariadne::ViewComponents.tailwind_merger.merge([style(theme:, size:), html_attrs[:class]].join(" "))
27
+ html_attrs[:class] = merge_tailwind_classes([style(scheme:, size:), html_attrs[:class]].join(" "))
17
28
  end
18
29
 
19
30
  style do
@@ -30,7 +41,7 @@ module Ariadne
30
41
  end
31
42
 
32
43
  variants do
33
- theme do
44
+ scheme do
34
45
  base do
35
46
  [
36
47
  "ariadne-text-indigo-600",
@@ -75,11 +86,13 @@ module Ariadne
75
86
  ]
76
87
  end
77
88
  end
89
+
78
90
  size do
79
91
  xs { "ariadne-text-xs ariadne-gap-0.5 [&>svg]:ariadne-size-3" }
80
92
  sm { "ariadne-text-sm ariadne-gap-0.5 [&>svg]:ariadne-size-4" }
81
93
  md { "ariadne-text-base ariadne-gap-1 [&>svg]:ariadne-size-4" }
82
94
  lg { "ariadne-text-lg ariadne-gap-1 [&>svg]:ariadne-size-5" }
95
+ xl { "ariadne-text-xl ariadne-gap-1 [&>svg]:ariadne-size-6" }
83
96
  end
84
97
  end
85
98
  end