ariadne_view_components 0.0.11-x86_64-darwin → 0.0.13-x86_64-darwin
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.
- checksums.yaml +4 -4
- data/app/assets/javascripts/ariadne.d.ts +1 -0
- data/app/assets/javascripts/ariadne_view_components.js +2 -2
- data/app/assets/javascripts/ariadne_view_components.js.map +1 -1
- data/app/assets/javascripts/tab-container-component.d.ts +1 -0
- data/app/assets/javascripts/tab-nav-component.d.ts +9 -0
- data/app/components/ariadne/ariadne.ts +3 -0
- data/app/components/ariadne/body_component.rb +1 -1
- data/app/components/ariadne/button_component.rb +2 -2
- data/app/components/ariadne/comment_component.html.erb +2 -6
- data/app/components/ariadne/comment_component.rb +1 -1
- data/app/components/ariadne/component.rb +3 -5
- data/app/components/ariadne/container_component.rb +1 -1
- data/app/components/ariadne/counter_component.rb +1 -1
- data/app/components/ariadne/flash_component.rb +1 -1
- data/app/components/ariadne/flex_component.rb +1 -1
- data/app/components/ariadne/footer_component.rb +1 -1
- data/app/components/ariadne/grid_component.html.erb +2 -2
- data/app/components/ariadne/grid_component.rb +10 -8
- data/app/components/ariadne/header_component.rb +1 -1
- data/app/components/ariadne/heroicon_component.html.erb +1 -1
- data/app/components/ariadne/heroicon_component.rb +1 -2
- data/app/components/ariadne/list_component.html.erb +3 -5
- data/app/components/ariadne/list_component.rb +5 -5
- data/app/components/ariadne/main_component.rb +1 -1
- data/app/components/ariadne/narrow_container_component.rb +1 -1
- data/app/components/ariadne/panel_bar_component.rb +2 -2
- data/app/components/ariadne/pill_component.rb +1 -1
- data/app/components/ariadne/rich_text_area_component.html.erb +1 -1
- data/app/components/ariadne/rich_text_area_component.rb +1 -1
- data/app/components/ariadne/slideover_component.rb +2 -2
- data/app/components/ariadne/tab-container-component.ts +24 -0
- data/app/components/ariadne/tab-nav-component.ts +34 -0
- data/app/components/ariadne/tab_component.html.erb +2 -6
- data/app/components/ariadne/tab_component.rb +77 -18
- data/app/components/ariadne/tab_container_component.erb +12 -0
- data/app/components/ariadne/tab_container_component.rb +61 -0
- data/app/components/ariadne/tab_nav_component.html.erb +7 -0
- data/app/components/ariadne/tab_nav_component.rb +72 -0
- data/app/components/ariadne/table_component.html.erb +17 -0
- data/app/components/ariadne/table_component.rb +281 -0
- data/app/components/ariadne/time_ago_component.rb +1 -1
- data/app/components/ariadne/timeline_component.rb +1 -1
- data/app/lib/ariadne/fetch_or_fallback_helper.rb +11 -3
- data/app/lib/ariadne/icon_helper.rb +17 -13
- data/lib/ariadne/view_components/commands.rb +1 -1
- data/lib/ariadne/view_components/constants.rb +2 -2
- data/lib/ariadne/view_components/statuses.rb +2 -2
- data/lib/ariadne/view_components/version.rb +1 -1
- data/lib/rubocop/config/default.yml +1 -1
- data/lib/tasks/docs.rake +5 -96
- data/static/arguments.yml +51 -15
- data/static/audited_at.json +9 -1
- data/static/classes.yml +157 -269
- data/static/constants.json +55 -15
- data/static/statuses.json +9 -1
- data/tailwind.config.js +11 -26
- metadata +13 -10
- data/app/components/ariadne/tab_bar_component.html.erb +0 -3
- data/app/components/ariadne/tab_bar_component.rb +0 -45
- data/app/lib/ariadne/join_style_arguments_helper.rb +0 -14
- data/app/lib/ariadne/tab_nav_helper.rb +0 -35
- data/app/lib/ariadne/tabbed_component_helper.rb +0 -39
- data/app/lib/ariadne/test_selector_helper.rb +0 -20
- data/app/lib/ariadne/underline_nav_helper.rb +0 -44
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Ariadne
|
4
|
+
# A container for a row of tags. Keyboard support is provided.
|
5
|
+
# @accessibility This component requires you to pass in a `sr_label`
|
6
|
+
# attribute, which will be used to label the tabs for screen readers.
|
7
|
+
class TabContainerComponent < Ariadne::Component
|
8
|
+
DEFAULT_TAG = :"tab-container"
|
9
|
+
|
10
|
+
DEFAULT_CLASSES = ""
|
11
|
+
|
12
|
+
# Tabs and panels to be rendered.
|
13
|
+
#
|
14
|
+
# @param id [String] The unique ID of the tab.
|
15
|
+
# @param selected [Boolean] Whether the tab is selected.
|
16
|
+
# @param classes [String] <%= link_to_classes_docs %>
|
17
|
+
# @param attributes [Hash] <%= link_to_attributes_docs %>
|
18
|
+
renders_many :tabs, lambda { |id:, selected: false, href: "", classes: "", attributes: {}|
|
19
|
+
actual_classes = class_names(selected ? DEFAULT_SELECTED_CLASSES : DEFAULT_UNSELECTED_CLASSES, classes)
|
20
|
+
Ariadne::TabComponent.new(
|
21
|
+
id: id,
|
22
|
+
selected: selected,
|
23
|
+
href: href,
|
24
|
+
with_panel: true,
|
25
|
+
|
26
|
+
classes: actual_classes,
|
27
|
+
attributes: attributes,
|
28
|
+
)
|
29
|
+
}
|
30
|
+
|
31
|
+
# @example Default
|
32
|
+
#
|
33
|
+
# <%= render(Ariadne::TabContainerComponent.new(sr_label: "Comments")) do |tab_container| %>
|
34
|
+
# <%= render(Ariadne::TabComponent.new(id: "pub-comment")) do |tab| %>
|
35
|
+
# <% tab.text { "Tab 1" } %>
|
36
|
+
# <% tab.panel { "Panel 1" } %>
|
37
|
+
# <% end %>
|
38
|
+
# <%= render(Ariadne::TabComponent.new(id: "pub-comment")) do |tab| %>
|
39
|
+
# <% tab.text { "Tab 2" } %>
|
40
|
+
# <% tab.panel { "Panel 2" } %>
|
41
|
+
# <% end %>
|
42
|
+
# <% end %>
|
43
|
+
#
|
44
|
+
# %>
|
45
|
+
#
|
46
|
+
# @param sr_label [String] Sets an `aria-label` that helps assistive technology users understand the purpose of the tabs.
|
47
|
+
# @param classes [String] <%= link_to_classes_docs %>
|
48
|
+
# @param attributes [Hash] <%= link_to_attributes_docs %>
|
49
|
+
def initialize(sr_label:, classes: "", attributes: {})
|
50
|
+
@tag = DEFAULT_TAG
|
51
|
+
@classes = class_names(
|
52
|
+
DEFAULT_CLASSES,
|
53
|
+
classes,
|
54
|
+
)
|
55
|
+
|
56
|
+
@attributes = attributes
|
57
|
+
@attributes[:"aria-label"] = sr_label
|
58
|
+
@attributes[:role] = :presentation
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Ariadne
|
4
|
+
# Use `TabNavComponent` to style navigation links, typically placed at the top
|
5
|
+
# of the page.
|
6
|
+
#
|
7
|
+
# For panel navigation, use <%= link_to_component(Ariadne::TabContainerComponent) %> instead.
|
8
|
+
#
|
9
|
+
# @accessibility
|
10
|
+
# - By default, `TabNavComponent` renders links within a `<nav>` element. `<nav>` has an
|
11
|
+
# implicit landmark role of `navigation` which should be reserved for main links.
|
12
|
+
# For all other set of links, set tag to `:div`.
|
13
|
+
# - See <%= link_to_component(Ariadne::TabComponent) %> for additional
|
14
|
+
# accessibility considerations.
|
15
|
+
class TabNavComponent < Ariadne::Component
|
16
|
+
DEFAULT_TAG = :nav
|
17
|
+
TAG_OPTIONS = [DEFAULT_TAG, :div].freeze
|
18
|
+
|
19
|
+
BODY_TAG_DEFAULT = :ul
|
20
|
+
|
21
|
+
# keep this consistent with tab-container-component.ts
|
22
|
+
SELECTED_CLASSES = "ariadne-border-indigo-500 ariadne-text-indigo-600"
|
23
|
+
UNSELECTED_CLASSES = "ariadne-text-gray-500 hover:ariadne-text-gray-700 hover:ariadne-border-gray-300"
|
24
|
+
|
25
|
+
DEFAULT_CLASSES = ""
|
26
|
+
|
27
|
+
# Tabs to be rendered. Use the tabs to list page links.
|
28
|
+
#
|
29
|
+
# @param selected [Boolean] Whether the tab is selected.
|
30
|
+
# @param classes [String] <%= link_to_classes_docs %>
|
31
|
+
# @param attributes [Hash] <%= link_to_attributes_docs %>
|
32
|
+
renders_many :tabs, lambda { |selected: false, href: "", classes: "", attributes: {}|
|
33
|
+
attributes[:href] = href
|
34
|
+
attributes[:"data-tab-nav-component-target"] = "tab"
|
35
|
+
attributes[:"data-action"] = "click->tab-nav-component#toggle"
|
36
|
+
|
37
|
+
actual_classes = class_names(selected ? SELECTED_CLASSES : UNSELECTED_CLASSES, classes)
|
38
|
+
Ariadne::TabComponent.new(
|
39
|
+
selected: selected,
|
40
|
+
|
41
|
+
classes: actual_classes,
|
42
|
+
attributes: attributes,
|
43
|
+
)
|
44
|
+
}
|
45
|
+
|
46
|
+
# @example Default with `<nav>`
|
47
|
+
# @description
|
48
|
+
# `<nav>` is a landmark and should be reserved for main navigation links. See <%= link_to_accessibility %>.
|
49
|
+
# @code
|
50
|
+
# <%= render(Ariadne::TabNavComponent.new(label: "Nav")) do |c| %>
|
51
|
+
# <% c.tab(selected: true, href: "#") { "Tab 1" } %>
|
52
|
+
# <% c.tab(href: "#") { "Tab 2" } %>
|
53
|
+
# <% c.tab(href: "#") { "Tab 3" } %>
|
54
|
+
# <% end %>
|
55
|
+
#
|
56
|
+
# @param label [String] Sets an `aria-label` that helps assistive technology users understand the purpose of the links, and distinguish it from similar elements.
|
57
|
+
# @param tag [Symbol, String] The rendered tag name.
|
58
|
+
# @param classes [String] <%= link_to_classes_docs %>
|
59
|
+
# @param attributes [Hash] <%= link_to_attributes_docs %>
|
60
|
+
def initialize(label:, tag: DEFAULT_TAG, classes: "", attributes: {})
|
61
|
+
@tag = check_incoming_tag(DEFAULT_TAG, tag)
|
62
|
+
@classes = class_names(
|
63
|
+
DEFAULT_CLASSES,
|
64
|
+
classes,
|
65
|
+
)
|
66
|
+
|
67
|
+
@attributes = attributes
|
68
|
+
@attributes[:"aria-label"] = label
|
69
|
+
@attributes[:"data-controller"] = "tab-nav-component"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<div class="ariadne-inline-block ariadne-min-w-full ariadne-py-2 ariadne-align-middle md:ariadne-px-6 lg:ariadne-px-8">
|
2
|
+
<div class="ariadne-overflow-hidden ariadne-shadow ariadne-ring-1 ariadne-ring-black ariadne-ring-opacity-5 md:ariadne-rounded-lg">
|
3
|
+
<%= render Ariadne::BaseComponent.new(tag: @tag, classes: @classes, attributes: @attributes) do |component| %>
|
4
|
+
<% if has_header_row? %>
|
5
|
+
<%= header_row %>
|
6
|
+
<% end %>
|
7
|
+
<ul class="ariadne-divide-y ariadne-divide-gray-200 ariadne-bg-white">
|
8
|
+
<% rows.each do |row| %>
|
9
|
+
<%= row %>
|
10
|
+
<% end %>
|
11
|
+
</ul>
|
12
|
+
<% end %>
|
13
|
+
</div>
|
14
|
+
<% if has_footer? %>
|
15
|
+
<%= footer %>
|
16
|
+
<% end %>
|
17
|
+
</div>
|
@@ -0,0 +1,281 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Ariadne
|
4
|
+
# Add a general description of component here
|
5
|
+
# Add additional usage considerations or best practices that may aid the user to use the component correctly.
|
6
|
+
# @accessibility Add any accessibility considerations
|
7
|
+
class TableComponent < Ariadne::Component
|
8
|
+
DEFAULT_CLASSES = "ariadne-min-w-full ariadne-divide-y ariadne-divide-gray-300 flex flex-col"
|
9
|
+
|
10
|
+
renders_one :header_row, "HeaderRowItem"
|
11
|
+
|
12
|
+
renders_many :rows, "RowItem"
|
13
|
+
|
14
|
+
renders_one :footer, "FooterItem"
|
15
|
+
|
16
|
+
# @example Default
|
17
|
+
#
|
18
|
+
# <%= render(Ariadne::TableComponent.new) do |table| %>
|
19
|
+
# <%= table.header_row do |header_row| %>
|
20
|
+
# <% header_row.cell do %>
|
21
|
+
# State
|
22
|
+
# <% end %>
|
23
|
+
# <% end %>
|
24
|
+
# <%= table.row do |row| %>
|
25
|
+
# <% row.cell do %>
|
26
|
+
# "California"
|
27
|
+
# <% end %>
|
28
|
+
# <% end %>
|
29
|
+
# <%= table.row do |row| %>
|
30
|
+
# <% row.cell do %>
|
31
|
+
# "New York"
|
32
|
+
# <% end %>
|
33
|
+
# <% end %>
|
34
|
+
# <%= table.row do |row| %>
|
35
|
+
# <% row.cell do %>
|
36
|
+
# "Texas"
|
37
|
+
# <% end %>
|
38
|
+
# <% end %>
|
39
|
+
# <% end %>
|
40
|
+
# @param classes [String] <%= link_to_classes_docs %>
|
41
|
+
# @param attributes [Hash] <%= link_to_attributes_docs %>
|
42
|
+
def initialize(classes: "", attributes: {})
|
43
|
+
@tag = :div
|
44
|
+
@classes = class_names(
|
45
|
+
DEFAULT_CLASSES,
|
46
|
+
classes,
|
47
|
+
)
|
48
|
+
|
49
|
+
@attributes = attributes
|
50
|
+
end
|
51
|
+
|
52
|
+
def has_header_row?
|
53
|
+
header_row.present?
|
54
|
+
end
|
55
|
+
|
56
|
+
def has_footer?
|
57
|
+
footer.present?
|
58
|
+
end
|
59
|
+
|
60
|
+
# This component is part of `TableComponent` and should not be
|
61
|
+
# used as a standalone component.
|
62
|
+
class RowItem < Ariadne::Component
|
63
|
+
DEFAULT_ROW_CLASSES = "ariadne-whitespace-nowrap ariadne-py-4 ariadne-pl-4 ariadne-pr-3 ariadne-text-sm sm:ariadne-pl-6 flex flex-row"
|
64
|
+
|
65
|
+
renders_many :cells, lambda { |classes: "", attributes: {}|
|
66
|
+
if @header
|
67
|
+
Ariadne::TableComponent::RowItem::HeaderCellItem.new(classes: classes, attributes: attributes)
|
68
|
+
else
|
69
|
+
Ariadne::TableComponent::RowItem::CellItem.new(classes: classes, attributes: attributes)
|
70
|
+
end
|
71
|
+
}
|
72
|
+
|
73
|
+
# @param link [Hash] #TODO: link attributes
|
74
|
+
def initialize(link: "", classes: "", attributes: {})
|
75
|
+
@header = false
|
76
|
+
@link = link
|
77
|
+
|
78
|
+
@classes = if @link.present?
|
79
|
+
class_names(
|
80
|
+
DEFAULT_ROW_CLASSES,
|
81
|
+
"ariadne-cursor-pointer",
|
82
|
+
classes,
|
83
|
+
)
|
84
|
+
else
|
85
|
+
class_names(
|
86
|
+
DEFAULT_ROW_CLASSES,
|
87
|
+
classes,
|
88
|
+
)
|
89
|
+
end
|
90
|
+
|
91
|
+
@attributes = attributes
|
92
|
+
end
|
93
|
+
|
94
|
+
def call
|
95
|
+
render(Ariadne::BaseComponent.new(tag: :li, classes: @classes, attributes: @attributes)) do
|
96
|
+
if linked?
|
97
|
+
render(Ariadne::LinkComponent.new(href: @link[:href], classes: @link[:classes], attributes: @link[:attributes])) do
|
98
|
+
cells.each do |cell|
|
99
|
+
concat(cell)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
else
|
103
|
+
cells.each do |cell|
|
104
|
+
concat(cell)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
private def linked?
|
111
|
+
@link.present?
|
112
|
+
end
|
113
|
+
|
114
|
+
# This component is part of `TableComponent` and should not be
|
115
|
+
# used as a standalone component.
|
116
|
+
class HeaderCellItem < Ariadne::TableComponent::RowItem
|
117
|
+
DEFAULT_HEADER_CELL_CLASSES = "ariadne-py-3.5 ariadne-pl-4 pr-3 ariadne-text-left ariadne-text-sm ariadne-font-semibold ariadne-text-gray-900 ariadne-sm:pl-6"
|
118
|
+
|
119
|
+
def initialize(classes: "", attributes: {})
|
120
|
+
@classes = class_names(
|
121
|
+
DEFAULT_HEADER_CELL_CLASSES,
|
122
|
+
classes,
|
123
|
+
)
|
124
|
+
|
125
|
+
@attributes = attributes
|
126
|
+
end
|
127
|
+
|
128
|
+
def call
|
129
|
+
render(Ariadne::BaseComponent.new(tag: :span, classes: @classes, attributes: @attributes)) { content }
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
# This component is part of `TableComponent` and should not be
|
134
|
+
# used as a standalone component.
|
135
|
+
class CellItem < Ariadne::TableComponent::RowItem
|
136
|
+
DEFAULT_CELL_CLASSES = ""
|
137
|
+
|
138
|
+
def initialize(classes: "", attributes: {})
|
139
|
+
@classes = class_names(
|
140
|
+
DEFAULT_CELL_CLASSES,
|
141
|
+
classes,
|
142
|
+
)
|
143
|
+
|
144
|
+
@attributes = attributes
|
145
|
+
end
|
146
|
+
|
147
|
+
def call
|
148
|
+
render(Ariadne::BaseComponent.new(tag: :span, classes: @classes, attributes: @attributes)) { content }
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
# This component is part of `TableComponent` and should not be
|
154
|
+
# used as a standalone component.
|
155
|
+
class HeaderRowItem < Ariadne::TableComponent::RowItem
|
156
|
+
DEFAULT_HEADER_CLASSES = "ariadne-bg-gray-50 flex flex-row"
|
157
|
+
|
158
|
+
def initialize(classes: "", attributes: {})
|
159
|
+
@header = true
|
160
|
+
|
161
|
+
@classes = class_names(
|
162
|
+
DEFAULT_HEADER_CLASSES,
|
163
|
+
classes,
|
164
|
+
)
|
165
|
+
|
166
|
+
@attributes = attributes
|
167
|
+
end
|
168
|
+
|
169
|
+
def call
|
170
|
+
render(Ariadne::BaseComponent.new(tag: :div, classes: @classes, attributes: @attributes)) do
|
171
|
+
cells.each do |cell|
|
172
|
+
concat(cell)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
# This component is part of `TableComponent` and should not be
|
179
|
+
# used as a standalone component.
|
180
|
+
class FooterItem < Ariadne::Component
|
181
|
+
DEFAULT_CLASSES = "ariadne-border-none ariadne-flex ariadne-items-center ariadne-justify-between ariadne-px-4 ariadne-py-3 sm:ariadne-px-6"
|
182
|
+
|
183
|
+
DEFAULT_RESULT_CLASSES = "ariadne-text-sm ariadne-text-gray-700"
|
184
|
+
renders_one :records_info, lambda { |classes: "", attributes: {}|
|
185
|
+
actual_classes = class_names(DEFAULT_RESULT_CLASSES, classes)
|
186
|
+
Ariadne::BaseComponent.new(tag: :p, classes: actual_classes, attributes: attributes)
|
187
|
+
}
|
188
|
+
|
189
|
+
renders_one :pagination_bar, "Ariadne::TableComponent::PaginationBarItem"
|
190
|
+
|
191
|
+
def initialize(classes: "", attributes: {})
|
192
|
+
@classes = class_names(
|
193
|
+
DEFAULT_CLASSES,
|
194
|
+
classes,
|
195
|
+
)
|
196
|
+
|
197
|
+
@attributes = attributes
|
198
|
+
end
|
199
|
+
|
200
|
+
def call
|
201
|
+
render(Ariadne::BaseComponent.new(tag: :div, classes: @classes, attributes: @attributes)) do
|
202
|
+
records_info.to_s + pagination_bar.to_s
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
# This component is part of `TableComponent` and should not be
|
208
|
+
# used as a standalone component.
|
209
|
+
class PaginationBarItem < Ariadne::Component
|
210
|
+
DEFAULT_PREV_PAGE_CLASSES = "ariadne-relative ariadne-inline-flex ariadne-items-center ariadne-rounded-l-md ariadne-border ariadne-border-gray-300 ariadne-bg-white ariadne-px-2 ariadne-py-2 ariadne-text-sm ariadne-font-medium ariadne-text-gray-500 focus:ariadne-z-20"
|
211
|
+
renders_one :prev_page, lambda { |disabled: false, href:, classes: "", attributes: {}|
|
212
|
+
if disabled
|
213
|
+
actual_classes = class_names(DEFAULT_PREV_PAGE_CLASSES, classes)
|
214
|
+
|
215
|
+
render(Ariadne::BaseComponent.new(tag: :span, classes: actual_classes, attributes: attributes)) do
|
216
|
+
render(Ariadne::HeroiconComponent.new(icon: "chevron-left", size: :sm, variant: :mini, text_attributes: { "aria-hidden": true }, text_classes: "ariadne-sr-only"))
|
217
|
+
end
|
218
|
+
else
|
219
|
+
actual_classes = class_names(DEFAULT_PREV_PAGE_CLASSES, "hover:ariadne-bg-gray-50", classes)
|
220
|
+
attributes[:"aria-label"] = "previous"
|
221
|
+
|
222
|
+
render(Ariadne::LinkComponent.new(href: href, classes: actual_classes, attributes: attributes)) do
|
223
|
+
render(Ariadne::HeroiconComponent.new(icon: "chevron-left", size: :sm, variant: :mini, text_attributes: { "aria-hidden": true }, text_classes: "ariadne-sr-only"))
|
224
|
+
end
|
225
|
+
end
|
226
|
+
}
|
227
|
+
|
228
|
+
renders_one :page_list, lambda { |disabled: false, href:, classes: "", attributes: {}|
|
229
|
+
if disabled
|
230
|
+
actual_classes = class_names(DEFAULT_NEXT_PAGE_CLASSES, classes)
|
231
|
+
|
232
|
+
render(Ariadne::BaseComponent.new(tag: :span, classes: actual_classes, attributes: attributes)) do
|
233
|
+
render(Ariadne::HeroiconComponent.new(icon: "chevron-left", size: :sm, variant: :mini, text_attributes: { "aria-hidden": true }, text_classes: "ariadne-sr-only"))
|
234
|
+
end
|
235
|
+
else
|
236
|
+
actual_classes = class_names(DEFAULT_NEXT_PAGE_CLASSES, "hover:ariadne-bg-gray-50", classes)
|
237
|
+
attributes[:"aria-label"] = "next"
|
238
|
+
|
239
|
+
render(Ariadne::LinkComponent.new(href: href, classes: actual_classes, attributes: attributes)) do
|
240
|
+
render(Ariadne::HeroiconComponent.new(icon: "chevron-right", size: :sm, variant: :mini, text_attributes: { "aria-hidden": true }, text_classes: "ariadne-sr-only"))
|
241
|
+
end
|
242
|
+
end
|
243
|
+
}
|
244
|
+
|
245
|
+
DEFAULT_NEXT_PAGE_CLASSES = " ariadne-relative ariadne-inline-flex ariadne-items-center ariadne-rounded-r-md ariadne-border ariadne-border-gray-300 ariadne-bg-white ariadne-px-2 ariadne-py-2 ariadne-text-sm ariadne-font-medium ariadne-text-gray-500 focus:ariadne-z-20"
|
246
|
+
renders_one :next_page, lambda { |disabled: false, href:, classes: "", attributes: {}|
|
247
|
+
if disabled
|
248
|
+
actual_classes = class_names(DEFAULT_NEXT_PAGE_CLASSES, classes)
|
249
|
+
|
250
|
+
render(Ariadne::BaseComponent.new(tag: :span, classes: actual_classes, attributes: attributes)) do
|
251
|
+
render(Ariadne::HeroiconComponent.new(icon: "chevron-left", size: :sm, variant: :mini, text_attributes: { "aria-hidden": true }, text_classes: "ariadne-sr-only"))
|
252
|
+
end
|
253
|
+
else
|
254
|
+
actual_classes = class_names(DEFAULT_NEXT_PAGE_CLASSES, "hover:ariadne-bg-gray-50", classes)
|
255
|
+
attributes[:"aria-label"] = "next"
|
256
|
+
|
257
|
+
render(Ariadne::LinkComponent.new(href: href, classes: actual_classes, attributes: attributes)) do
|
258
|
+
render(Ariadne::HeroiconComponent.new(icon: "chevron-right", size: :sm, variant: :mini, text_attributes: { "aria-hidden": true }, text_classes: "ariadne-sr-only"))
|
259
|
+
end
|
260
|
+
end
|
261
|
+
}
|
262
|
+
|
263
|
+
DEFAULT_PAGINATOR_CLASSES = "ariadne-flex ariadne-items-center ariadne-justify-between ariadne-m-10"
|
264
|
+
def initialize(classes: "", attributes: {})
|
265
|
+
@classes = class_names(
|
266
|
+
DEFAULT_PAGINATOR_CLASSES,
|
267
|
+
classes,
|
268
|
+
)
|
269
|
+
|
270
|
+
@attributes = attributes
|
271
|
+
@attributes[:"aria-label"] ||= "paginator"
|
272
|
+
end
|
273
|
+
|
274
|
+
def call
|
275
|
+
render(Ariadne::BaseComponent.new(tag: :nav, classes: @classes, attributes: @attributes)) do
|
276
|
+
prev_page.to_s + next_page.to_s
|
277
|
+
end
|
278
|
+
end
|
279
|
+
end
|
280
|
+
end
|
281
|
+
end
|
@@ -22,14 +22,17 @@ module Ariadne
|
|
22
22
|
|
23
23
|
InvalidValueError = Class.new(StandardError)
|
24
24
|
|
25
|
-
TRUE_OR_FALSE = [true, false].freeze
|
25
|
+
TRUE_OR_FALSE = Set.new([true, false]).freeze
|
26
26
|
|
27
|
-
|
27
|
+
INTEGER_TYPES = Set.new(["Integer"]).freeze
|
28
|
+
|
29
|
+
def fetch_or_raise(allowed_values, given_value, against: nil)
|
28
30
|
if !allowed_values.is_a?(Array) && !allowed_values.is_a?(Set)
|
29
31
|
raise ArgumentError, "allowed_values must be an array or a set; it was #{allowed_values.class}"
|
30
32
|
end
|
31
33
|
|
32
|
-
|
34
|
+
check_against_given_value = against || given_value
|
35
|
+
if allowed_values.include?(check_against_given_value)
|
33
36
|
given_value
|
34
37
|
else
|
35
38
|
raise InvalidValueError, <<~MSG
|
@@ -41,10 +44,15 @@ module Ariadne
|
|
41
44
|
end
|
42
45
|
end
|
43
46
|
|
47
|
+
# TODO: use these two more
|
44
48
|
def fetch_or_raise_boolean(given_value)
|
45
49
|
fetch_or_raise(TRUE_OR_FALSE, given_value)
|
46
50
|
end
|
47
51
|
|
52
|
+
def fetch_or_raise_integer(given_value)
|
53
|
+
fetch_or_raise(INTEGER_TYPES, given_value, against: given_value.class.name)
|
54
|
+
end
|
55
|
+
|
48
56
|
# TODO: test this
|
49
57
|
def check_incoming_tag(preferred_tag, given_tag)
|
50
58
|
return preferred_tag if given_tag.blank? || preferred_tag == given_tag
|
@@ -1,18 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Ariadne::
|
4
|
-
# A
|
3
|
+
# Ariadne::IconHelper
|
4
|
+
# A helper that insists on certain values when
|
5
|
+
# checking herocions and their varients.
|
5
6
|
#
|
6
|
-
# Use this helper to
|
7
|
-
# one that you expect
|
8
|
-
#
|
9
|
-
# allowed_values - allowed options for *value*
|
10
|
-
# given_value - input being coerced
|
11
|
-
# fallback - returned if *given_value* is not included in *allowed_values*
|
12
|
-
#
|
13
|
-
# fetch_or_raise([1,2,3], 5) => 2
|
14
|
-
# fetch_or_raise([1,2,3], 1) => 1
|
15
|
-
# fetch_or_raise([1,2,3], nil) => 2
|
7
|
+
# Use this helper to loudly ensure a value is
|
8
|
+
# one that you expect.
|
16
9
|
module Ariadne
|
17
10
|
# :nodoc:
|
18
11
|
module IconHelper
|
@@ -23,11 +16,22 @@ module Ariadne
|
|
23
16
|
|
24
17
|
icon_presence!(icon, variant)
|
25
18
|
variant_presence!(icon, variant)
|
26
|
-
|
19
|
+
ensure_valid_variant(variant)
|
27
20
|
|
28
21
|
true
|
29
22
|
end
|
30
23
|
|
24
|
+
def ensure_valid_variant(variant)
|
25
|
+
check_variant = if variant.blank? || !variant.respond_to?(:to_s)
|
26
|
+
""
|
27
|
+
else
|
28
|
+
variant.to_s
|
29
|
+
end
|
30
|
+
|
31
|
+
fetch_or_raise(HeroiconsHelper::Icon::VALID_VARIANTS, check_variant)
|
32
|
+
end
|
33
|
+
module_function :ensure_valid_variant
|
34
|
+
|
31
35
|
def has_partial_icon?(icon, variant)
|
32
36
|
icon.present? || variant.present?
|
33
37
|
end
|
@@ -63,7 +63,7 @@ module Ariadne
|
|
63
63
|
[
|
64
64
|
executable(**kwargs),
|
65
65
|
"-i", local_path("app/assets/stylesheets/ariadne_view_components.css"),
|
66
|
-
"-o",
|
66
|
+
"-o", "app/assets/builds/ariadne_view_components.css",
|
67
67
|
"-c", local_path("tailwind.config.js"),
|
68
68
|
].tap do |command|
|
69
69
|
command << "--minify" unless debug
|