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
@@ -0,0 +1,279 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nocov:
4
+
5
+ require "json"
6
+
7
+ module Ariadne
8
+ module Static
9
+ # :nodoc:
10
+ module GenerateStructure
11
+ SKIP_METHODS = [:call, :before_render].freeze
12
+
13
+ # This class generates the JSON structure for the Ariadne documentation.
14
+ class << self
15
+ def call
16
+ components = Ariadne::BaseComponent.descendants.sort_by(&:name) - [Ariadne::BaseComponent]
17
+
18
+ component_docs = components.each_with_object({}) do |component, memo|
19
+ docs = registry.find(component)
20
+
21
+ preview_data = previews.find do |preview|
22
+ preview["component"] == docs.metadata[:title]
23
+ end
24
+
25
+ arg_data = args.find do |component_args|
26
+ component_args["component"] == docs.metadata[:title]
27
+ end
28
+
29
+ slot_docs = docs.slot_methods.map do |slot_method|
30
+ param_tags = slot_method.tags(:param)
31
+
32
+ description = if slot_method.base_docstring.to_s.present?
33
+ render_erb_ignoring_markdown_code_fences(slot_method.base_docstring).force_encoding("UTF-8")
34
+ else
35
+ ""
36
+ end
37
+
38
+ {
39
+ "name" => slot_method.name,
40
+ "description" => description,
41
+ "parameters" => serialize_params(param_tags, component),
42
+ }
43
+ end
44
+
45
+ mtds = docs.non_slot_methods.select do |mtd|
46
+ next false if mtd.base_docstring.to_s.blank?
47
+ next false if SKIP_METHODS.include?(mtd.name)
48
+
49
+ method_location, = mtd.files.first
50
+ class_location, = docs.docs.files.first
51
+
52
+ method_location == class_location
53
+ end
54
+
55
+ method_docs = mtds.map do |mtd|
56
+ param_tags = mtd.tags(:param)
57
+
58
+ {
59
+ "name" => mtd.name,
60
+ "description" => render_erb_ignoring_markdown_code_fences(mtd.base_docstring),
61
+ "parameters" => serialize_params(param_tags, component),
62
+ }
63
+ end
64
+
65
+ description =
66
+ if component == Ariadne::BaseComponent
67
+ docs.base_docstring
68
+ else
69
+ render_erb_ignoring_markdown_code_fences(docs.base_docstring)
70
+ end
71
+
72
+ accessibility_docs =
73
+ if (accessibility_tag_text = docs.tags(:accessibility)&.first&.text)
74
+ render_erb_ignoring_markdown_code_fences(accessibility_tag_text)
75
+ end
76
+
77
+ behavior_docs =
78
+ if (behavior_tag_text = docs.tags(:behaviors)&.first&.text)
79
+ render_erb_ignoring_markdown_code_fences(behavior_tag_text)
80
+ end
81
+
82
+ memo[component.name] = {
83
+ "fully_qualified_name" => component.name,
84
+ "description" => description,
85
+ "accessibility_docs" => accessibility_docs,
86
+ "behavior_docs" => behavior_docs,
87
+ "is_form_component" => docs.manifest_entry.form_component?,
88
+ "requires_js" => docs.manifest_entry.requires_js?,
89
+ **arg_data,
90
+ "slots" => slot_docs,
91
+ "methods" => method_docs,
92
+ "previews" => (preview_data || {}).fetch("examples", []),
93
+ "subcomponents" => [],
94
+ }
95
+ end
96
+
97
+ Ariadne::BaseComponent.descendants.sort_by(&:name).each do |component|
98
+ fq_class = component.name.to_s.split("::")
99
+ fq_class.shift # remove Ariadne::
100
+ type = fq_class.shift # remove {UI,Form,*}::
101
+
102
+ parent, *child = *fq_class
103
+
104
+ next if child.empty? || child.length < 2
105
+
106
+ parent_class = "Ariadne::#{type}".constantize
107
+ parent_class = parent_class.const_get(parent)
108
+
109
+ parent_docs = component_docs["#{parent_class}::Component"]
110
+ next unless parent_docs
111
+
112
+ if (child_docs = component_docs.delete(component.name))
113
+ parent_docs["subcomponents"] << child_docs
114
+ end
115
+ end
116
+
117
+ toc_categories = {
118
+ "UI" => [],
119
+ "Form" => [],
120
+ "Layout" => [],
121
+ "Behaviors" => [],
122
+ }
123
+
124
+ component_docs.values.each do |component|
125
+ type, name = component["short_name"].split("::", 2)
126
+ next unless toc_categories[type] # not a required category
127
+
128
+ # removes children from toc, like `Ariadne::UI::Accordion::Item`,
129
+ # by not adding the component to the TOC if it has more than one level of nesting
130
+ next if name.include?("::")
131
+
132
+ slug = component["short_name"].gsub("::", "/").downcase
133
+
134
+ toc_categories[type] << {
135
+ "name" => name,
136
+ "slug" => slug,
137
+ }
138
+
139
+ File.open(File.join(DEFAULT_STATIC_PATH, FILE_NAMES[:toc]), "w") do |f|
140
+ f.write(JSON.pretty_generate(toc_categories))
141
+ f.write($INPUT_RECORD_SEPARATOR)
142
+ end
143
+ end
144
+ component_docs.values
145
+ end
146
+
147
+ def serialize_params(param_tags, component)
148
+ param_tags.map do |tag|
149
+ default_value = Ariadne::Yard::DocsHelper.pretty_default_value(tag, component)
150
+
151
+ {
152
+ "name" => tag.name,
153
+ "type" => tag.types&.join(", ") || "",
154
+ "default" => default_value,
155
+ "description" => render_erb_ignoring_markdown_code_fences(tag.text.squish),
156
+ }
157
+ end
158
+ end
159
+
160
+ def previews
161
+ @previews ||= JSON.parse(Static.read(:previews))
162
+ end
163
+
164
+ def args
165
+ @args ||= Ariadne::Static::GenerateArguments.call(view_context: view_context)
166
+ end
167
+
168
+ def view_context
169
+ @view_context ||= ApplicationController.new.tap { |c| c.request = ActionDispatch::TestRequest.create }.view_context.tap do |vc|
170
+ vc.singleton_class.include(Ariadne::Yard::StructureDocsHelper)
171
+ vc.singleton_class.include(Ariadne::ViewHelper)
172
+ end
173
+ end
174
+
175
+ def generate_args_table(args)
176
+ rows = args.map do |arg|
177
+ parts = [
178
+ "`#{arg.name}`",
179
+ arg.type,
180
+ arg.description.squish,
181
+ ]
182
+
183
+ "| #{parts.join(" | ")} |"
184
+ end
185
+
186
+ <<~MARKDOWN
187
+ | Name | Type | Description |
188
+ | :- | :- | :- |
189
+ #{rows.join("\n")}
190
+ MARKDOWN
191
+ end
192
+
193
+ # Renders ERB code to a string, ignoring markdown code fences. For example, consider the
194
+ # following ERB code inside a markdown document:
195
+ #
196
+ # ### Heading
197
+ # ```erb
198
+ # <%= render(SomeComponent.new) %>
199
+ # ```
200
+ #
201
+ # <%= some_func(a, b) %>
202
+ #
203
+ # The ERB renderer does not understand that the fenced code, i.e. the part inside the triple
204
+ # backticks, should not be rendered. It sees the ERB tags both inside and outside the fence
205
+ # and renders them both.
206
+ #
207
+ # This method renders ERB tags in a markdown string, ignoring any fenced code blocks, so as
208
+ # to prevent rendering fenced ERB code.
209
+ #
210
+ def render_erb_ignoring_markdown_code_fences(markdown_str)
211
+ return view_context.render(inline: markdown_str) if markdown_str.exclude?("```")
212
+
213
+ # identify all fenced code blocks in markdown string
214
+ code_ranges = find_fenced_code_ranges_in(markdown_str)
215
+
216
+ # replace code fences with placeholders
217
+ de_fenced_markdown_str = markdown_str.dup.tap do |memo|
218
+ code_ranges.reverse_each.with_index do |code_range, idx|
219
+ memo[code_range] = "<!--codefence#{idx}-->"
220
+ end
221
+ end
222
+
223
+ # Render ERB tags. The only ones left will explicitly exist _outside_ markdown code fences.
224
+ rendered_str = view_context.render(inline: de_fenced_markdown_str)
225
+
226
+ # replace placeholders with original code fences
227
+ code_ranges.reverse_each.with_index do |code_range, idx|
228
+ rendered_str.sub!("<!--codefence#{idx}-->", markdown_str[code_range])
229
+ end
230
+
231
+ rendered_str
232
+ end
233
+
234
+ def find_fenced_code_ranges_in(str)
235
+ doc = Kramdown::Document.new(str)
236
+ line_starts = find_line_starts_in(str)
237
+
238
+ [].tap do |code_ranges|
239
+ each_codespan_in(doc.root) do |node|
240
+ options = node.options
241
+ delimiter = options[:codespan_delimiter]
242
+ next unless delimiter.start_with?("```")
243
+
244
+ start_pos = line_starts[options[:location]]
245
+ end_pos = start_pos + node.value.size + delimiter.size
246
+ end_pos = str.index("```", end_pos) + 3
247
+
248
+ code_ranges << (start_pos...end_pos)
249
+ end
250
+ end
251
+ end
252
+
253
+ def find_line_starts_in(str)
254
+ line_counter = 2
255
+
256
+ { 1 => 0 }.tap do |memo|
257
+ str.scan(/\r?\n/) do
258
+ memo[line_counter] = Regexp.last_match.end(0)
259
+ line_counter += 1
260
+ end
261
+ end
262
+ end
263
+
264
+ def each_codespan_in(node, &block)
265
+ return unless node.respond_to?(:children)
266
+
267
+ node.children.each do |child|
268
+ yield child if child.type == :codespan
269
+ each_codespan_in(child, &block)
270
+ end
271
+ end
272
+
273
+ def registry
274
+ @registry ||= Ariadne::Yard::Registry.make
275
+ end
276
+ end
277
+ end
278
+ end
279
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nocov:
4
+
5
+ require "json"
6
+
7
+ module Ariadne
8
+ # :nodoc:
9
+ module Static
10
+ DEFAULT_STATIC_PATH = File.join("docs", "src", "_data", "ariadne_view_components").freeze
11
+
12
+ FILE_NAMES = {
13
+ constants: "constants.json",
14
+ audited_at: "audited_at.json",
15
+ arguments: "arguments.json",
16
+ previews: "previews.json",
17
+ structure: "structure.json",
18
+ toc: "toc.json",
19
+ }.freeze
20
+
21
+ class << self
22
+ # Returns a hash mapping component names to an array of the constants defined inside
23
+ # the component's class.
24
+ def generate_constants
25
+ Static::GenerateConstants.call
26
+ end
27
+
28
+ # Returns a hash mapping component names to the date on which the component passed
29
+ # an accessibility audit.
30
+ def generate_audited_at
31
+ Static::GenerateAuditedAt.call
32
+ end
33
+
34
+ # Returns an array of hashes, one per Ariadne component, that contains some metadata and
35
+ # a list of the arguments accepted by the component's constructor. Arguments are enumerated
36
+ # with their value, data type, and docstring.
37
+ def generate_arguments
38
+ Static::GenerateArguments.call
39
+ end
40
+
41
+ # Returns an array of hashes, one per Ariadne component, that contains some metadata and
42
+ # an array of all the component's previews. The preview data contains the Lookbook URL
43
+ # to each preview and its name.
44
+ def generate_previews
45
+ Static::GeneratePreviews.call
46
+ end
47
+
48
+ # Returns an array of hashes, one per Ariadne component, that contains all the data needed
49
+ # for the new primer.style docsite.
50
+ def generate_structure
51
+ Static::GenerateStructure.call
52
+ end
53
+
54
+ # Generates the requested stat hash and outputs it to a file.
55
+ def dump(stats)
56
+ File.open(File.join(DEFAULT_STATIC_PATH, FILE_NAMES[stats]), "w") do |f|
57
+ f.write(JSON.pretty_generate(send(:"generate_#{stats}")))
58
+ f.write($INPUT_RECORD_SEPARATOR)
59
+ end
60
+ end
61
+
62
+ # Returns the contents of the stat file.
63
+ def read(stats)
64
+ File.read(File.join(DEFAULT_STATIC_PATH, FILE_NAMES[stats]))
65
+ end
66
+ end
67
+ end
68
+ end
@@ -8,7 +8,7 @@ module Ariadne
8
8
  class Constants
9
9
  CONSTANTS = JSON.parse(
10
10
  File.read(
11
- File.join(File.dirname(__FILE__), "../../../static/constants.json"),
11
+ File.join(File.dirname(__FILE__), "../../../docs/src/_data/ariadne_view_components/constants.json"),
12
12
  ),
13
13
  ).freeze
14
14
 
@@ -37,7 +37,7 @@ module Ariadne
37
37
  end
38
38
 
39
39
  private def format_array(values, symbolize)
40
- val = values.select(&:present?)
40
+ val = values.compact_blank
41
41
 
42
42
  return val.map { |v| symbolize_value(v) } if symbolize
43
43
 
@@ -3,6 +3,6 @@
3
3
  # :nocov:
4
4
  module Ariadne
5
5
  module ViewComponents
6
- VERSION = "0.0.93.2"
6
+ VERSION = "0.0.94"
7
7
  end
8
8
  end
@@ -2,60 +2,9 @@
2
2
 
3
3
  require "ariadne/view_components/version"
4
4
  require "ariadne/view_components/engine"
5
- require "ariadne/view_components/constants"
6
- require "ariadne/view_components/commands"
7
5
 
8
6
  module Ariadne
9
7
  # :nodoc:
10
8
  module ViewComponents
11
- DEFAULT_STATIC_PATH = File.expand_path("static")
12
- FILE_NAMES = {
13
- statuses: "statuses.json",
14
- constants: "constants.json",
15
- audited_at: "audited_at.json",
16
- }.freeze
17
-
18
- class << self
19
- # generate_statuses returns a hash mapping component name to
20
- # the component's status sorted alphabetically by the component name.
21
- def generate_statuses
22
- Ariadne::Component.descendants.sort_by(&:name).each_with_object({}) do |component, mem|
23
- mem[component.to_s] = component.status.to_s
24
- end
25
- end
26
-
27
- # generate_audited_at returns a hash mapping component name to
28
- # the day the component has passed an accessibility audit.
29
- def generate_audited_at
30
- Ariadne::Component.descendants.sort_by(&:name).each_with_object({}) do |component, mem|
31
- mem[component.to_s] = component.audited_at.to_s
32
- end
33
- end
34
-
35
- # generate_constants returns a hash mapping component name to
36
- # all of its constants.
37
- def generate_constants
38
- Ariadne::Component.descendants.sort_by(&:name).each_with_object({}) do |component, mem|
39
- mem[component.to_s] = component.constants(false).sort.index_with do |constant|
40
- component.const_get(constant)
41
- end
42
- end
43
- end
44
-
45
- # dump generates the requested stat hash and outputs it to a file.
46
- def dump(stats)
47
- require "json"
48
-
49
- File.open(File.join(DEFAULT_STATIC_PATH, FILE_NAMES[stats]), "w") do |f|
50
- f.write(JSON.pretty_generate(send(:"generate_#{stats}")))
51
- f.write($INPUT_RECORD_SEPARATOR)
52
- end
53
- end
54
-
55
- # read returns a JSON string matching the output of the corresponding stat.
56
- def read(stats)
57
- File.read(File.join(DEFAULT_STATIC_PATH, FILE_NAMES[stats]))
58
- end
59
- end
60
9
  end
61
10
  end
@@ -6,95 +6,95 @@ module Ariadne
6
6
  # The set of documented components (and associated metadata).
7
7
  class ComponentManifest
8
8
  COMPONENTS = {
9
- Ariadne::Heading::Component => {},
10
- # Primer::Beta::IconButton => {},
11
- # Primer::Beta::Button => {},
12
- # Primer::Alpha::SegmentedControl => {},
13
- # Primer::Alpha::Layout => {},
14
- # Primer::Alpha::HellipButton => {},
15
- # Primer::Alpha::Image => {},
16
- # Primer::Alpha::OcticonSymbols => {},
17
- # Primer::Alpha::ImageCrop => { js: true },
18
- # Primer::IconButton => { js: true },
19
- # Primer::Beta::AutoComplete => { js: true },
20
- # Primer::Beta::AutoComplete::Item => {},
21
- # Primer::Beta::Avatar => {},
22
- # Primer::Beta::AvatarStack => {},
23
- # Primer::Beta::BaseButton => {},
24
- # Primer::Alpha::Banner => { js: true },
25
- # Primer::Beta::Blankslate => {},
26
- # Primer::BlankslateComponent => {},
27
- # Primer::Beta::BorderBox => {},
28
- # Primer::Beta::BorderBox::Header => {},
29
- # Primer::Box => {},
30
- # Primer::Beta::Breadcrumbs => {},
31
- # Primer::ButtonComponent => { js: true },
32
- # Primer::Beta::ButtonGroup => {},
33
- # Primer::Alpha::ButtonMarketing => {},
34
- # Primer::Beta::ClipboardCopy => { js: true },
35
- # Primer::Beta::CloseButton => {},
36
- # Primer::Beta::Counter => {},
37
- # Primer::Beta::Details => {},
38
- # Primer::Alpha::Dialog => {},
39
- # Primer::Alpha::Dropdown => { js: true },
40
- # Primer::Beta::Flash => {},
41
- # Primer::Beta::Heading => {},
42
- # Primer::Alpha::HiddenTextExpander => {},
43
- # Primer::Beta::Label => {},
44
- # Primer::LayoutComponent => {},
45
- # Primer::Beta::Link => { js: true },
46
- # Primer::Beta::Markdown => {},
47
- # Primer::Alpha::Menu => {},
48
- # Primer::Navigation::TabComponent => {},
49
- # Primer::Alpha::Navigation::Tab => {},
50
- # Primer::Beta::Octicon => {},
51
- # Primer::Beta::Popover => {},
52
- # Primer::Beta::ProgressBar => {},
53
- # Primer::Beta::State => {},
54
- # Primer::Beta::Spinner => {},
55
- # Primer::Beta::Subhead => {},
56
- # Primer::Alpha::TabContainer => { js: true },
57
- # Primer::Beta::Text => {},
58
- # Primer::Beta::TimelineItem => {},
59
- # Primer::Tooltip => {},
60
- # Primer::Truncate => {},
61
- # Primer::Beta::Truncate => {},
62
- # Primer::Alpha::UnderlineNav => {},
63
- # Primer::Alpha::UnderlinePanels => { js: true },
64
- # Primer::Alpha::TabNav => {},
65
- # Primer::Alpha::TabPanels => { js: true },
66
- # Primer::Alpha::Tooltip => { js: true },
67
- # Primer::Alpha::ToggleSwitch => { js: true },
68
- # Primer::Alpha::Overlay => { js: true },
69
- # Primer::Alpha::ActionMenu => { js: true },
9
+ Ariadne::UI::Typography::Component => {},
10
+ # Ariadne::Beta::IconButton => {},
11
+ # Ariadne::Beta::Button => {},
12
+ # Ariadne::Alpha::SegmentedControl => {},
13
+ # Ariadne::Alpha::Layout => {},
14
+ # Ariadne::Alpha::HellipButton => {},
15
+ # Ariadne::Alpha::Image => {},
16
+ # Ariadne::Alpha::OcticonSymbols => {},
17
+ # Ariadne::Alpha::ImageCrop => { js: true },
18
+ # Ariadne::IconButton => { js: true },
19
+ # Ariadne::Beta::AutoComplete => { js: true },
20
+ # Ariadne::Beta::AutoComplete::Item => {},
21
+ # Ariadne::Beta::Avatar => {},
22
+ # Ariadne::Beta::AvatarStack => {},
23
+ # Ariadne::Beta::BaseButton => {},
24
+ # Ariadne::Alpha::Banner => { js: true },
25
+ # Ariadne::Beta::Blankslate => {},
26
+ # Ariadne::BlankslateComponent => {},
27
+ # Ariadne::Beta::BorderBox => {},
28
+ # Ariadne::Beta::BorderBox::Header => {},
29
+ # Ariadne::Box => {},
30
+ # Ariadne::Beta::Breadcrumbs => {},
31
+ # Ariadne::ButtonComponent => { js: true },
32
+ # Ariadne::Beta::ButtonGroup => {},
33
+ # Ariadne::Alpha::ButtonMarketing => {},
34
+ Ariadne::UI::ClipboardCopy::Component => { js: true },
35
+ # Ariadne::Beta::CloseButton => {},
36
+ # Ariadne::Beta::Counter => {},
37
+ # Ariadne::Beta::Details => {},
38
+ # Ariadne::Alpha::Dialog => {},
39
+ # Ariadne::Alpha::Dropdown => { js: true },
40
+ # Ariadne::Beta::Flash => {},
41
+ # Ariadne::Beta::Heading => {},
42
+ # Ariadne::Alpha::HiddenTextExpander => {},
43
+ # Ariadne::Beta::Label => {},
44
+ # Ariadne::LayoutComponent => {},
45
+ # Ariadne::Beta::Link => { js: true },
46
+ # Ariadne::Beta::Markdown => {},
47
+ # Ariadne::Alpha::Menu => {},
48
+ # Ariadne::Navigation::TabComponent => {},
49
+ # Ariadne::Alpha::Navigation::Tab => {},
50
+ # Ariadne::Beta::Octicon => {},
51
+ # Ariadne::Beta::Popover => {},
52
+ # Ariadne::Beta::ProgressBar => {},
53
+ # Ariadne::Beta::State => {},
54
+ # Ariadne::Beta::Spinner => {},
55
+ # Ariadne::Beta::Subhead => {},
56
+ # Ariadne::Alpha::TabContainer => { js: true },
57
+ # Ariadne::Beta::Text => {},
58
+ # Ariadne::Beta::TimelineItem => {},
59
+ # Ariadne::Tooltip => {},
60
+ # Ariadne::Truncate => {},
61
+ # Ariadne::Beta::Truncate => {},
62
+ # Ariadne::Alpha::UnderlineNav => {},
63
+ # Ariadne::Alpha::UnderlinePanels => { js: true },
64
+ # Ariadne::Alpha::TabNav => {},
65
+ # Ariadne::Alpha::TabPanels => { js: true },
66
+ # Ariadne::Alpha::Tooltip => { js: true },
67
+ # Ariadne::Alpha::ToggleSwitch => { js: true },
68
+ # Ariadne::Alpha::Overlay => { js: true },
69
+ # Ariadne::Alpha::ActionMenu => { js: true },
70
70
 
71
71
  # Examples can be seen in the NavList docs
72
- # Primer::Alpha::NavList => { js: true },
73
- # Primer::Alpha::NavList::Item => { js: true, examples: false },
74
- # Primer::Alpha::NavList::Group => { js: true, examples: false },
72
+ # Ariadne::Alpha::NavList => { js: true },
73
+ # Ariadne::Alpha::NavList::Item => { js: true, examples: false },
74
+ # Ariadne::Alpha::NavList::Group => { js: true, examples: false },
75
75
 
76
- # Primer::Beta::NavList => { js: true },
77
- # Primer::Beta::NavList::Item => { js: true, examples: false },
78
- # Primer::Beta::NavList::Group => { js: true, examples: false },
76
+ # Ariadne::Beta::NavList => { js: true },
77
+ # Ariadne::Beta::NavList::Item => { js: true, examples: false },
78
+ # Ariadne::Beta::NavList::Group => { js: true, examples: false },
79
79
 
80
80
  # ActionList is a base component that should not be used by itself, and thus
81
81
  # does not have examples of its own
82
- # Primer::Alpha::ActionList => { js: true, examples: false },
83
- # Primer::Alpha::ActionList::Divider => { examples: false },
84
- # Primer::Alpha::ActionList::Heading => { examples: false },
85
- # Primer::Alpha::ActionList::Item => { examples: false },
82
+ # Ariadne::Alpha::ActionList => { js: true, examples: false },
83
+ # Ariadne::Alpha::ActionList::Divider => { examples: false },
84
+ # Ariadne::Alpha::ActionList::Heading => { examples: false },
85
+ # Ariadne::Alpha::ActionList::Item => { examples: false },
86
86
 
87
87
  # Forms
88
- # Primer::Alpha::TextField => { form_component: true },
89
- # Primer::Alpha::TextArea => { form_component: true, published: false },
90
- # Primer::Alpha::Select => { form_component: true, published: false },
91
- # Primer::Alpha::MultiInput => { form_component: true, js: true, published: false },
92
- # Primer::Alpha::RadioButton => { form_component: true, published: false },
93
- # Primer::Alpha::RadioButtonGroup => { form_component: true, published: false },
94
- # Primer::Alpha::CheckBox => { form_component: true, published: false },
95
- # Primer::Alpha::CheckBoxGroup => { form_component: true, published: false },
96
- # Primer::Alpha::SubmitButton => { form_component: true, published: false },
97
- # Primer::Alpha::FormButton => { form_component: true, published: false }
88
+ Ariadne::Form::TextField::Component => { form_component: true },
89
+ # Ariadne::Alpha::TextArea => { form_component: true, published: false },
90
+ # Ariadne::Alpha::Select => { form_component: true, published: false },
91
+ # Ariadne::Alpha::MultiInput => { form_component: true, js: true, published: false },
92
+ # Ariadne::Alpha::RadioButton => { form_component: true, published: false },
93
+ # Ariadne::Alpha::RadioButtonGroup => { form_component: true, published: false },
94
+ # Ariadne::Alpha::CheckBox => { form_component: true, published: false },
95
+ # Ariadne::Alpha::CheckBoxGroup => { form_component: true, published: false },
96
+ # Ariadne::Alpha::SubmitButton => { form_component: true, published: false },
97
+ # Ariadne::Alpha::FormButton => { form_component: true, published: false }
98
98
  }.freeze
99
99
 
100
100
  include Enumerable
@@ -33,7 +33,7 @@ module Ariadne
33
33
  def source_url
34
34
  @source_url ||= begin
35
35
  path = klass.name.split("::").map(&:underscore).join("/")
36
- "https://github.com/primer/view_components/tree/main/app/components/#{path}.rb"
36
+ "https://github.com/yettoapp/ariadne/tree/main/app/components/#{path}.rb"
37
37
  end
38
38
  end
39
39