ariadne_view_components 0.0.93.1 → 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 +9 -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,88 @@
1
+ [data-ariadne-color-mode] {
2
+ background-color: hsl(var(--background));
3
+ color: hsl(var(--foreground));
4
+ }
5
+
6
+ * {
7
+ border-color: hsl(var(--border));
8
+ }
9
+
10
+ [data-ariadne-light-theme='light'] {
11
+ --background: 0 0% 100%;
12
+ --foreground: 240 10% 3.9%;
13
+
14
+ --muted: 240 4.8% 95.9%;
15
+ --muted-foreground: 240 3.8% 46.1%;
16
+
17
+ --popover: 0 0% 100%;
18
+ --popover-foreground: 240 10% 3.9%;
19
+
20
+ --card: 0 0% 100%;
21
+ --card-foreground: 240 10% 3.9%;
22
+
23
+ --border: 240 5.9% 90%;
24
+ --input: 240 5.9% 90%;
25
+
26
+ --primary: 262.76 30% 36%;
27
+ --primary-foreground: 227.98 6% 99%;
28
+
29
+ --secondary: 240 4.8% 95.9%;
30
+ --secondary-foreground: 240 5.9% 10%;
31
+
32
+ --accent: 240 4.8% 95.9%;
33
+ --accent-foreground: 240 5.9% 10%;
34
+
35
+ --danger: 0 84.2% 60.2%;
36
+ --danger-foreground: 0 0% 98%;
37
+
38
+ --warning: 43 100% 42%;
39
+ --warning-foreground: 210 40% 98%;
40
+
41
+ --success: 93 85% 32%;
42
+ --success-foreground: 0 0% 100%;
43
+
44
+ --info: 211 100% 50%;
45
+ --info-foreground: 199 89% 48%;
46
+
47
+ --ring: 240 5.9% 10%;
48
+ }
49
+
50
+ [data-ariadne-dark-theme='dark'] {
51
+ --background: 240 10% 3.9%;
52
+ --foreground: 0 0% 98%;
53
+
54
+ --muted: 240 3.7% 15.9%;
55
+ --muted-foreground: 240 5% 64.9%;
56
+
57
+ --popover: 240 10% 3.9%;
58
+ --popover-foreground: 0 0% 98%;
59
+
60
+ --card: 240 10% 3.9%;
61
+ --card-foreground: 0 0% 98%;
62
+
63
+ --border: 240 3.7% 15.9%;
64
+ --input: 240 3.7% 15.9%;
65
+
66
+ --primary: 259.98 94% 88%;
67
+ --primary-foreground: 227.98 6% 99%;
68
+
69
+ --secondary: 240 3.7% 15.9%;
70
+ --secondary-foreground: 0 0% 98%;
71
+
72
+ --accent: 240 3.7% 15.9%;
73
+ --accent-foreground: 0 0% 98%;
74
+
75
+ --danger: 0 62.8% 30.6%;
76
+ --danger-foreground: 0 0% 98%;
77
+
78
+ --warning: 43 100% 42%;
79
+ --warning-foreground: 210 40% 98%;
80
+
81
+ --success: 93 85% 32%;
82
+ --success-foreground: 0 0% 100%;
83
+
84
+ --info: 217 91% 60%;
85
+ --info-foreground: 0 0% 100%;
86
+
87
+ --ring: 240 4.9% 83.9%;
88
+ }
@@ -88,6 +88,15 @@ export function controllerFactory<E extends HTMLElement>() {
88
88
  class ExtendedController extends Controller<E> {
89
89
  static targets = Object.keys(targets ?? {})
90
90
  static values = values ?? {}
91
+
92
+ private dispatchEvent(target: HTMLElement, name: string, options: {bubbles?: boolean, cancelable?: boolean} = {}) {
93
+ // Dispatching event to trigger all related actions
94
+ const event = new Event(name, {
95
+ bubbles: options.bubbles || false,
96
+ cancelable: options.cancelable || false,
97
+ });
98
+ target.dispatchEvent(event);
99
+ }
91
100
  }
92
101
 
93
102
  return ExtendedController as unknown as new () => ControllerWithTargets<E, T, Y>
@@ -0,0 +1,158 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ariadne
4
+ module ColorHelper
5
+ VALID_COLORS =
6
+ {
7
+ "red": [
8
+ "ariadne-bg-red-500/15",
9
+ "ariadne-text-red-700",
10
+ "group-data-[hover]:ariadne-bg-red-500/25",
11
+ "dark:ariadne-bg-red-500/10",
12
+ "dark:ariadne-text-red-400",
13
+ "dark:group-data-[hover]:ariadne-bg-red-500/20",
14
+ ],
15
+ "orange": [
16
+ "ariadne-bg-orange-500/15",
17
+ "ariadne-text-orange-700",
18
+ "group-data-[hover]:ariadne-bg-orange-500/25",
19
+ "dark:ariadne-bg-orange-500/10",
20
+ "dark:ariadne-text-orange-400",
21
+ "dark:group-data-[hover]:ariadne-bg-orange-500/20",
22
+ ],
23
+ "amber": [
24
+ "ariadne-bg-amber-400/20",
25
+ "ariadne-text-amber-700",
26
+ "group-data-[hover]:ariadne-bg-amber-400/30",
27
+ "dark:ariadne-bg-amber-400/10",
28
+ "dark:ariadne-text-amber-400",
29
+ "dark:group-data-[hover]:ariadne-bg-amber-400/15",
30
+ ],
31
+ "yellow": [
32
+ "ariadne-bg-yellow-400/20",
33
+ "ariadne-text-yellow-700",
34
+ "group-data-[hover]:ariadne-bg-yellow-400/30",
35
+ "dark:ariadne-bg-yellow-400/10",
36
+ "dark:ariadne-text-yellow-300",
37
+ "dark:group-data-[hover]:ariadne-bg-yellow-400/15",
38
+ ],
39
+ "lime": [
40
+ "ariadne-bg-lime-400/20",
41
+ "ariadne-text-lime-700",
42
+ "group-data-[hover]:ariadne-bg-lime-400/30",
43
+ "dark:ariadne-bg-lime-400/10",
44
+ "dark:ariadne-text-lime-300",
45
+ "dark:group-data-[hover]:ariadne-bg-lime-400/15",
46
+ ],
47
+ "green": [
48
+ "ariadne-bg-green-500/15",
49
+ "ariadne-text-green-700",
50
+ "group-data-[hover]:ariadne-bg-green-500/25",
51
+ "dark:ariadne-bg-green-500/10",
52
+ "dark:ariadne-text-green-400",
53
+ "dark:group-data-[hover]:ariadne-bg-green-500/20",
54
+ ],
55
+ "emerald": [
56
+ "ariadne-bg-emerald-500/15",
57
+ "ariadne-text-emerald-700",
58
+ "group-data-[hover]:ariadne-bg-emerald-500/25",
59
+ "dark:ariadne-bg-emerald-500/10",
60
+ "dark:ariadne-text-emerald-400",
61
+ "dark:group-data-[hover]:ariadne-bg-emerald-500/20",
62
+ ],
63
+ "teal": [
64
+ "ariadne-bg-teal-500/15",
65
+ "ariadne-text-teal-700",
66
+ "group-data-[hover]:ariadne-bg-teal-500/25",
67
+ "dark:ariadne-bg-teal-500/10",
68
+ "dark:ariadne-text-teal-300",
69
+ "dark:group-data-[hover]:ariadne-bg-teal-500/20",
70
+ ],
71
+ "cyan": [
72
+ "ariadne-bg-cyan-400/20",
73
+ "ariadne-text-cyan-700",
74
+ "group-data-[hover]:ariadne-bg-cyan-400/30",
75
+ "dark:ariadne-bg-cyan-400/10",
76
+ "dark:ariadne-text-cyan-300",
77
+ "dark:group-data-[hover]:ariadne-bg-cyan-400/15",
78
+ ],
79
+ "sky": [
80
+ "ariadne-bg-sky-500/15",
81
+ "ariadne-text-sky-700",
82
+ "group-data-[hover]:ariadne-bg-sky-500/25",
83
+ "dark:ariadne-bg-sky-500/10",
84
+ "dark:ariadne-text-sky-300",
85
+ "dark:group-data-[hover]:ariadne-bg-sky-500/20",
86
+ ],
87
+ "blue": [
88
+ "ariadne-bg-blue-500/15",
89
+ "ariadne-text-blue-700",
90
+ "group-data-[hover]:ariadne-bg-blue-500/25",
91
+ "dark:ariadne-text-blue-400",
92
+ "dark:group-data-[hover]:ariadne-bg-blue-500/25",
93
+ ],
94
+ "indigo": [
95
+ "ariadne-bg-indigo-500/15",
96
+ "ariadne-text-indigo-700",
97
+ "group-data-[hover]:ariadne-bg-indigo-500/25",
98
+ "dark:ariadne-text-indigo-400",
99
+ "dark:group-data-[hover]:ariadne-bg-indigo-500/20",
100
+ ],
101
+ "violet": [
102
+ "ariadne-bg-violet-500/15",
103
+ "ariadne-text-violet-700",
104
+ "group-data-[hover]:ariadne-bg-violet-500/25",
105
+ "dark:ariadne-text-violet-400",
106
+ "dark:group-data-[hover]:ariadne-bg-violet-500/20",
107
+ ],
108
+ "purple": [
109
+ "ariadne-bg-purple-500/15",
110
+ "ariadne-text-purple-700",
111
+ "group-data-[hover]:ariadne-bg-purple-500/25",
112
+ "dark:ariadne-text-purple-400",
113
+ "dark:group-data-[hover]:ariadne-bg-purple-500/20",
114
+ ],
115
+ "fuchsia": [
116
+ "ariadne-bg-fuchsia-400/15",
117
+ "ariadne-text-fuchsia-700",
118
+ "group-data-[hover]:ariadne-bg-fuchsia-400/25",
119
+ "dark:ariadne-bg-fuchsia-400/10",
120
+ "dark:ariadne-text-fuchsia-400",
121
+ "dark:group-data-[hover]:ariadne-bg-fuchsia-400/20",
122
+ ],
123
+ "pink": [
124
+ "ariadne-bg-pink-400/15",
125
+ "ariadne-text-pink-700",
126
+ "group-data-[hover]:ariadne-bg-pink-400/25",
127
+ "dark:ariadne-bg-pink-400/10",
128
+ "dark:ariadne-text-pink-400",
129
+ "dark:group-data-[hover]:ariadne-bg-pink-400/20",
130
+ ],
131
+ "rose": [
132
+ "ariadne-bg-rose-400/15",
133
+ "ariadne-text-rose-700",
134
+ "group-data-[hover]:ariadne-bg-rose-400/25",
135
+ "dark:ariadne-bg-rose-400/10",
136
+ "dark:ariadne-text-rose-400",
137
+ "dark:group-data-[hover]:ariadne-bg-rose-400/20",
138
+ ],
139
+ "zinc": [
140
+ "ariadne-bg-zinc-600/10",
141
+ "ariadne-text-zinc-700",
142
+ "group-data-[hover]:ariadne-bg-zinc-600/20",
143
+ "dark:ariadne-bg-white/5",
144
+ "dark:ariadne-text-zinc-400",
145
+ "dark:group-data-[hover]:ariadne-bg-white/10",
146
+ ],
147
+ }.freeze
148
+
149
+ def include_colors!
150
+ @variants[:color] ||= {}
151
+ @variants[:color] = {}
152
+
153
+ VALID_COLORS.each do |color, classes|
154
+ @variants[:color][color] = classes
155
+ end
156
+ end
157
+ end
158
+ end
@@ -5,6 +5,7 @@ module Ariadne
5
5
  # :nodoc:
6
6
  module FormHelper
7
7
  def ariadne_form_with(**kwargs, &block)
8
+ kwargs[:id] ||= Ariadne::BaseComponent.generate_id(base_name: "form")
8
9
  form_with(**kwargs, skip_default_ids: false, builder: Ariadne::Forms::Builder, &block)
9
10
  end
10
11
 
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ariadne
4
+ module SizeHelper
5
+ VALID_SIZES = [:xs, :sm, :md, :lg, :xl].freeze
6
+ end
7
+ end
@@ -43,8 +43,8 @@ module Ariadne
43
43
  # It's designed to be used to normalize and merge aria information from system_arguments
44
44
  # hashes. Consider using this pattern in component initializers:
45
45
  #
46
- # @system_arguments[:aria] = merge_aria(
47
- # @system_arguments,
46
+ # html_attrs[:aria] = merge_aria(
47
+ # html_attrs,
48
48
  # { aria: { labelled_by: id } }
49
49
  # )
50
50
  def merge_aria(*hashes)
@@ -68,8 +68,8 @@ module Ariadne
68
68
  # It's designed to be used to normalize and merge data information from system_arguments
69
69
  # hashes. Consider using this pattern in component initializers:
70
70
  #
71
- # @system_arguments[:data] = merge_aria(
72
- # @system_arguments,
71
+ # html_attrs[:data] = merge_aria(
72
+ # html_attrs,
73
73
  # { data: { foo: "bar" } }
74
74
  # )
75
75
  def merge_data(*hashes)
@@ -59,7 +59,7 @@ module Ariadne
59
59
  # merge Araidne style variants with user provided overrides
60
60
  def merged_styles(name = self.class.default_style_name, **variants)
61
61
  default_styles = self.class.style_config.compile(name.to_sym, **variants)
62
- Ariadne::ViewComponents.tailwind_merger.merge([default_styles, styles.fetch(name, "")])
62
+ merge_tailwind_classes([default_styles, styles.fetch(name, "")])
63
63
  end
64
64
  end
65
65
  end
@@ -6,12 +6,6 @@ module Ariadne
6
6
  module ViewHelper
7
7
  class ViewHelperNotFound < StandardError; end
8
8
 
9
- class << self
10
- def generate_id
11
- SecureRandom.hex(6)
12
- end
13
- end
14
-
15
9
  HELPERS = {
16
10
  heroicon: "Ariadne::UI::Heroicon::Component",
17
11
  }.freeze
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nocov:
4
+ module Ariadne
5
+ # :nodoc:
6
+ module Accessibility
7
+ # Skip axe checks for components that should be tested as part of a larger component.
8
+ # Do not add to this list for any other reason!
9
+ IGNORED_PREVIEWS = [].freeze
10
+
11
+ # Skip `:region` which relates to preview page structure rather than individual component.
12
+ AXE_RULES_TO_SKIP = {
13
+ # these will be skipped in CI
14
+ will_fix: {
15
+ global: [],
16
+
17
+ per_component: {},
18
+ },
19
+
20
+ # these will always be skipped
21
+ wont_fix: {
22
+ global: [
23
+ :region,
24
+ ],
25
+
26
+ per_component: {},
27
+ },
28
+ }.freeze
29
+
30
+ class << self
31
+ def ignore_preview?(preview_class)
32
+ IGNORED_PREVIEWS.include?(preview_class)
33
+ end
34
+
35
+ def axe_rules_to_skip(component: nil, scenario_name: nil, flatten: false)
36
+ to_skip = {
37
+ wont_fix: Set.new(AXE_RULES_TO_SKIP.dig(:wont_fix, :global) || []),
38
+ will_fix: Set.new(AXE_RULES_TO_SKIP.dig(:will_fix, :global) || []),
39
+ }
40
+
41
+ if component
42
+ to_skip[:wont_fix].merge(AXE_RULES_TO_SKIP.dig(:wont_fix, :per_component, component, :all_scenarios) || [])
43
+ to_skip[:will_fix].merge(AXE_RULES_TO_SKIP.dig(:will_fix, :per_component, component, :all_scenarios) || [])
44
+
45
+ if scenario_name
46
+ to_skip[:wont_fix].merge(AXE_RULES_TO_SKIP.dig(:wont_fix, :per_component, component, scenario_name) || [])
47
+ to_skip[:will_fix].merge(AXE_RULES_TO_SKIP.dig(:will_fix, :per_component, component, scenario_name) || [])
48
+ end
49
+ end
50
+
51
+ if flatten
52
+ flattened = to_skip.each_with_object(Set.new) do |(_, rule_set), memo|
53
+ memo.merge(rule_set)
54
+ end
55
+
56
+ return flattened.to_a
57
+ end
58
+
59
+ to_skip.transform_values(&:to_a)
60
+ end
61
+ end
62
+ end
63
+ end
64
+ # :nocov:
@@ -9,7 +9,7 @@ module Ariadne
9
9
 
10
10
  attr_reader :builder, :form, :id
11
11
 
12
- def initialize(builder:, form:, id: ::Ariadne::ViewHelper.generate_id)
12
+ def initialize(builder:, form:, id: Ariadne::BaseComponent.generate_id)
13
13
  @builder = builder
14
14
  @form = form
15
15
  @id = id
@@ -17,6 +17,10 @@ module Ariadne
17
17
  yield(self) if block_given?
18
18
  end
19
19
 
20
+ def generate_id(base_name: "form")
21
+ Ariadne::BaseComponent.generate_id(base_name:)
22
+ end
23
+
20
24
  def group(**options, &block)
21
25
  add_input(InputGroup.new(builder: @builder, form: @form, **options, &block))
22
26
  end
@@ -108,7 +108,7 @@ module Ariadne
108
108
 
109
109
  @options[:invalid] = "true" if invalid?
110
110
 
111
- @base_id = ::Ariadne::ViewHelper.generate_id
111
+ @base_id = Ariadne::BaseComponent.generate_id(base_name: "ariadne-form-input")
112
112
 
113
113
  @ids = {}.tap do |id_map|
114
114
  id_map[:validation] = "validation-#{@base_id}" if supports_validation?
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nocov:
4
+
5
+ require "json"
6
+
7
+ module Ariadne
8
+ module Static
9
+ # :nodoc:
10
+ module GenerateArguments
11
+ class << self
12
+ def call(view_context: self.view_context)
13
+ Ariadne::BaseComponent.descendants.sort_by(&:name).map do |component|
14
+ docs = registry.find(component)
15
+ ref = Ariadne::Yard::ComponentManifest.ref_for(component)
16
+
17
+ args = docs.params.map do |tag|
18
+ default_value = Ariadne::Yard::DocsHelper.pretty_default_value(tag, component)
19
+
20
+ {
21
+ "name" => tag.name,
22
+ "type" => tag.types.join(", "),
23
+ "default" => default_value,
24
+ "description" => view_context.render(inline: tag.text&.squish),
25
+ }
26
+ end
27
+
28
+ {
29
+ "component" => docs.metadata[:title],
30
+ "a11y_reviewed" => docs.metadata[:a11y_reviewed] == "true",
31
+ "short_name" => docs.short_name,
32
+ "source" => ref.source_url,
33
+ "lookbook" => ref.lookbook_url,
34
+ "parameters" => args,
35
+ }
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def view_context
42
+ @view_context ||= ApplicationController.new.tap { |c| c.request = ActionDispatch::TestRequest.create }.view_context.tap do |vc|
43
+ vc.singleton_class.include(Ariadne::Yard::DocsHelper)
44
+ vc.singleton_class.include(Ariadne::ViewHelper)
45
+ end
46
+ end
47
+
48
+ def registry
49
+ @registry ||= Ariadne::Yard::Registry.make
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nocov:
4
+ module Ariadne
5
+ module Static
6
+ # :nodoc:
7
+ module GenerateAuditedAt
8
+ class << self
9
+ def call
10
+ Ariadne::BaseComponent.descendants.sort_by(&:name).each_with_object({}) do |component, mem|
11
+ mem[component.to_s] = component.audited_at.to_s
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nocov:
4
+ module Ariadne
5
+ module Static
6
+ # :nodoc:
7
+ module GenerateConstants
8
+ class << self
9
+ def call
10
+ Ariadne::BaseComponent.descendants.sort_by(&:name).each_with_object({}) do |component, mem|
11
+ mem[component.to_s] = component.constants(false).sort.index_with do |constant|
12
+ component.const_get(constant)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nocov:
4
+
5
+ require "json"
6
+
7
+ module Ariadne
8
+ module Static
9
+ # :nodoc:
10
+ module GeneratePreviews
11
+ class << self
12
+ def call
13
+ Lookbook.previews.filter_map do |preview|
14
+ next if preview.preview_class == Ariadne::FormsPreview
15
+ next if Ariadne::Accessibility.ignore_preview?(preview.preview_class)
16
+
17
+ class_name, _ = Ariadne::Yard::DocsHelper.component_and_short_name(preview.preview_class)
18
+
19
+ {
20
+ type: preview.lookup_path.split("/")[1], # e.g. preview.lookup_path => "ariadne/ui/badge"
21
+ name: preview.name,
22
+ component: class_name,
23
+ lookup_path: preview.lookup_path,
24
+ examples: preview.scenarios.flat_map do |parent_scenario|
25
+ scenarios = parent_scenario.type == :scenario_group ? parent_scenario.scenarios : [parent_scenario]
26
+
27
+ scenarios.map do |scenario|
28
+ snapshot_tag = scenario.tags.find { |tag| tag.tag_name == "snapshot" }
29
+ snapshot = if snapshot_tag.nil?
30
+ "false"
31
+ elsif snapshot_tag.text.blank?
32
+ "true"
33
+ else
34
+ snapshot_tag.text
35
+ end
36
+ {
37
+ preview_path: scenario.lookup_path,
38
+ name: scenario.name,
39
+ snapshot: snapshot,
40
+ skip_rules: Ariadne::Accessibility.axe_rules_to_skip(
41
+ component: class_name,
42
+ scenario_name: scenario.name,
43
+ ),
44
+ }
45
+ end
46
+ end,
47
+ }
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nocov:
4
+ module Ariadne
5
+ module Static
6
+ # :nodoc:
7
+ module GenerateStatuses
8
+ class << self
9
+ def call
10
+ Ariadne::Component.descendants.sort_by(&:name).each_with_object({}) do |component, mem|
11
+ mem[component.to_s] = component.status.to_s
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end