ariadne_view_components 0.0.93.2 → 0.0.94

Sign up to get free protection for your applications and to get access to all the features.
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