ariadne_view_components 0.0.59 → 0.0.65

Sign up to get free protection for your applications and to get access to all the features.
Files changed (279) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +70 -0
  3. data/LICENSE.txt +661 -49
  4. data/README.md +52 -4
  5. data/app/assets/javascripts/ariadne_view_components.js +98 -7
  6. data/app/assets/javascripts/ariadne_view_components.js.br +0 -0
  7. data/app/assets/javascripts/ariadne_view_components.js.gz +0 -0
  8. data/app/assets/javascripts/ariadne_view_components.js.map +1 -1
  9. data/app/assets/stylesheets/ariadne_view_components.css +1 -7
  10. data/app/assets/stylesheets/ariadne_view_components.css.br +0 -0
  11. data/app/assets/stylesheets/ariadne_view_components.css.gz +0 -0
  12. data/app/components/ariadne/base_component.rb +79 -27
  13. data/app/components/ariadne/behaviors/tooltipable.rb +120 -0
  14. data/app/components/ariadne/conditional_wrapper.rb +21 -0
  15. data/app/components/ariadne/form/base_component.rb +74 -0
  16. data/app/components/ariadne/form/base_input_component.rb +60 -0
  17. data/app/components/ariadne/form/caption/component.html.erb +10 -0
  18. data/app/components/ariadne/form/caption/component.rb +29 -0
  19. data/app/components/ariadne/form/form_control/component.html.erb +19 -0
  20. data/app/components/ariadne/form/form_control/component.rb +27 -0
  21. data/app/components/ariadne/form/form_reference/component.html.erb +1 -0
  22. data/app/components/ariadne/form/form_reference/component.rb +18 -0
  23. data/app/components/ariadne/form/group/component.html.erb +5 -0
  24. data/app/components/ariadne/form/group/component.rb +27 -0
  25. data/app/components/ariadne/form/hidden_field/component.html.erb +1 -0
  26. data/app/components/ariadne/form/hidden_field/component.rb +15 -0
  27. data/app/components/ariadne/form/separator/component.html.erb +1 -0
  28. data/app/components/ariadne/form/separator/component.rb +8 -0
  29. data/app/components/ariadne/form/spacing_wrapper/component.html.erb +3 -0
  30. data/app/components/ariadne/form/spacing_wrapper/component.rb +8 -0
  31. data/app/components/ariadne/form/text_field/component.html.erb +25 -0
  32. data/app/components/ariadne/form/text_field/component.rb +132 -0
  33. data/app/components/ariadne/form/validation_message/component.html.erb +5 -0
  34. data/app/components/ariadne/form/validation_message/component.rb +14 -0
  35. data/app/components/ariadne/layout/narrow/component.html.erb +10 -0
  36. data/app/components/ariadne/layout/narrow/component.rb +24 -0
  37. data/app/components/ariadne/layout/nav_bar/component.css +0 -0
  38. data/app/components/ariadne/layout/nav_bar/component.html.erb +123 -0
  39. data/app/components/ariadne/layout/nav_bar/component.rb +77 -0
  40. data/app/components/ariadne/ui/button/component.html.erb +5 -0
  41. data/app/components/ariadne/ui/button/component.rb +184 -0
  42. data/app/components/ariadne/ui/clipboard_copy/component.html.erb +8 -0
  43. data/app/components/ariadne/ui/clipboard_copy/component.rb +102 -0
  44. data/app/components/ariadne/ui/clipboard_copy/component.ts +54 -0
  45. data/app/components/ariadne/ui/combobox/component.html.erb +32 -0
  46. data/app/components/ariadne/ui/combobox/component.rb +83 -0
  47. data/app/components/ariadne/ui/combobox/component.ts +119 -0
  48. data/app/components/ariadne/ui/combobox/menu_item/component.html.erb +9 -0
  49. data/app/components/ariadne/ui/combobox/menu_item/component.rb +53 -0
  50. data/app/components/ariadne/ui/combobox/option/component.html.erb +11 -0
  51. data/app/components/ariadne/ui/combobox/option/component.rb +45 -0
  52. data/app/components/ariadne/ui/heroicon/component.html.erb +3 -0
  53. data/app/components/ariadne/ui/heroicon/component.rb +141 -0
  54. data/app/components/ariadne/ui/image/component.rb +69 -0
  55. data/app/components/ariadne/ui/link/component.html.erb +3 -0
  56. data/app/components/ariadne/ui/link/component.rb +56 -0
  57. data/app/components/ariadne/ui/typography/component.html.erb +3 -0
  58. data/app/components/ariadne/ui/typography/component.rb +41 -0
  59. data/app/frontend/ariadne/index.ts +14 -0
  60. data/app/frontend/ariadne/stimulus_app.ts +53 -0
  61. data/app/frontend/ariadne/theme.ts +8 -0
  62. data/app/frontend/controllers/tooltip.ts +75 -0
  63. data/app/frontend/entrypoints/application.ts +1 -0
  64. data/app/frontend/stylesheets/ariadne_view_components.css +18 -0
  65. data/app/frontend/stylesheets/scrollbar.css +28 -0
  66. data/app/frontend/stylesheets/tippy.js/themes/tomato.css +4 -0
  67. data/app/frontend/stylesheets/typography.css +117 -0
  68. data/app/frontend/utils/createController.ts +95 -0
  69. data/app/helpers/ariadne/form_helper.rb +31 -0
  70. data/app/lib/ariadne/attributes_helper.rb +119 -0
  71. data/app/lib/ariadne/fetch_or_fallback_helper.rb +1 -1
  72. data/app/lib/ariadne/form.rb +16 -0
  73. data/app/lib/ariadne/view_helper.rb +2 -5
  74. data/app/lib/view_components_contrib/html_attrs.rb +64 -0
  75. data/app/lib/view_components_contrib/style_variants.rb +14 -0
  76. data/lib/ariadne/forms/acts_as_component.rb +125 -0
  77. data/lib/ariadne/forms/base.html.erb +8 -0
  78. data/lib/ariadne/forms/base.rb +132 -0
  79. data/lib/ariadne/forms/buffer_rewriter.rb +51 -0
  80. data/lib/ariadne/forms/builder.rb +88 -0
  81. data/lib/ariadne/forms/dsl/button_input.rb +33 -0
  82. data/lib/ariadne/forms/dsl/form_object.rb +26 -0
  83. data/lib/ariadne/forms/dsl/input.rb +322 -0
  84. data/lib/ariadne/forms/dsl/input_group.rb +34 -0
  85. data/lib/ariadne/forms/dsl/input_methods.rb +157 -0
  86. data/lib/ariadne/forms/dsl/submit_button_input.rb +36 -0
  87. data/lib/ariadne/forms/dsl/text_field_input.rb +73 -0
  88. data/lib/ariadne/forms/utils.rb +34 -0
  89. data/lib/ariadne/generate.rb +11 -0
  90. data/lib/ariadne/view_components/engine.rb +24 -7
  91. data/lib/ariadne/view_components/version.rb +1 -1
  92. data/lib/ariadne/view_components.rb +1 -1
  93. data/lib/ariadne/yard/backend.rb +24 -0
  94. data/lib/ariadne/yard/component_manifest.rb +148 -0
  95. data/lib/ariadne/yard/component_ref.rb +49 -0
  96. data/lib/ariadne/yard/docs_helper.rb +98 -0
  97. data/lib/ariadne/yard/info_arch_docs_helper.rb +31 -0
  98. data/lib/ariadne/yard/lookbook_docs_helper.rb +32 -0
  99. data/lib/ariadne/yard/lookbook_pages_backend.rb +235 -0
  100. data/lib/ariadne/yard/registry.rb +136 -0
  101. data/lib/ariadne/yard/renders_many_handler.rb +23 -0
  102. data/lib/ariadne/yard/renders_one_handler.rb +23 -0
  103. data/lib/ariadne/yard.rb +19 -0
  104. data/static/arguments.yml +141 -48
  105. data/static/audited_at.json +0 -9
  106. data/static/classes.yml +210 -209
  107. data/static/constants.json +2 -209
  108. data/static/statuses.json +0 -9
  109. metadata +140 -210
  110. data/app/assets/builds/ariadne_view_components.css +0 -2202
  111. data/app/assets/javascripts/components/ariadne/accumulator_controller/accumulator_controller.d.ts +0 -22
  112. data/app/assets/javascripts/components/ariadne/ariadne-form.d.ts +0 -22
  113. data/app/assets/javascripts/components/ariadne/ariadne.d.ts +0 -2
  114. data/app/assets/javascripts/components/ariadne/clipboard_copy_component/clipboard-copy-component.d.ts +0 -4
  115. data/app/assets/javascripts/components/ariadne/dropdown/menu_component.d.ts +0 -1
  116. data/app/assets/javascripts/components/ariadne/events_controller/events_controller.d.ts +0 -4
  117. data/app/assets/javascripts/components/ariadne/options_controller/options_controller.d.ts +0 -39
  118. data/app/assets/javascripts/components/ariadne/outlet_manager_controller/outlet_manager_controller.d.ts +0 -42
  119. data/app/assets/javascripts/components/ariadne/slideover_component/slideover-component.d.ts +0 -9
  120. data/app/assets/javascripts/components/ariadne/string_match_controller/string_match_controller.d.ts +0 -27
  121. data/app/assets/javascripts/components/ariadne/synced_boolean_attributes_controller/synced_boolean_attributes_controller.d.ts +0 -48
  122. data/app/assets/javascripts/components/ariadne/tab_container_component/tab-container-component.d.ts +0 -1
  123. data/app/assets/javascripts/components/ariadne/tab_nav_component/tab-nav-component.d.ts +0 -9
  124. data/app/assets/javascripts/components/ariadne/time_ago_component/time-ago-component.d.ts +0 -1
  125. data/app/assets/javascripts/components/ariadne/toggleable_controller/toggleable_controller.d.ts +0 -34
  126. data/app/assets/javascripts/components/ariadne/tooltip_component/tooltip-component.d.ts +0 -24
  127. data/app/assets/stylesheets/dropdown.css +0 -46
  128. data/app/assets/stylesheets/prosemirror.css +0 -323
  129. data/app/assets/stylesheets/tooltip-component.css +0 -37
  130. data/app/components/ariadne/accumulator_controller/accumulator_controller.d.ts +0 -22
  131. data/app/components/ariadne/accumulator_controller/accumulator_controller.js +0 -39
  132. data/app/components/ariadne/accumulator_controller/accumulator_controller.ts +0 -48
  133. data/app/components/ariadne/action_card_component.html.erb +0 -13
  134. data/app/components/ariadne/action_card_component.rb +0 -88
  135. data/app/components/ariadne/ariadne-form.d.ts +0 -22
  136. data/app/components/ariadne/ariadne-form.js +0 -85
  137. data/app/components/ariadne/ariadne.d.ts +0 -2
  138. data/app/components/ariadne/ariadne.js +0 -24
  139. data/app/components/ariadne/ariadne.ts +0 -29
  140. data/app/components/ariadne/avatar_component.rb +0 -81
  141. data/app/components/ariadne/avatar_stack_component/avatar_stack_component.html.erb +0 -12
  142. data/app/components/ariadne/avatar_stack_component.rb +0 -75
  143. data/app/components/ariadne/base_button.rb +0 -70
  144. data/app/components/ariadne/blankslate_component/blankslate_component.html.erb +0 -26
  145. data/app/components/ariadne/blankslate_component.rb +0 -148
  146. data/app/components/ariadne/body_component.rb +0 -30
  147. data/app/components/ariadne/bottom_tab_component.html.erb +0 -4
  148. data/app/components/ariadne/bottom_tab_component.rb +0 -44
  149. data/app/components/ariadne/bottom_tab_nav_component.html.erb +0 -5
  150. data/app/components/ariadne/bottom_tab_nav_component.rb +0 -33
  151. data/app/components/ariadne/breadcrumbs_component.html.erb +0 -13
  152. data/app/components/ariadne/breadcrumbs_component.rb +0 -31
  153. data/app/components/ariadne/button_component/button_component.html.erb +0 -4
  154. data/app/components/ariadne/button_component.rb +0 -165
  155. data/app/components/ariadne/checkbox_component.html.erb +0 -5
  156. data/app/components/ariadne/checkbox_component.rb +0 -43
  157. data/app/components/ariadne/clipboard_copy_component/clipboard-copy-component.d.ts +0 -4
  158. data/app/components/ariadne/clipboard_copy_component/clipboard-copy-component.js +0 -18
  159. data/app/components/ariadne/clipboard_copy_component/clipboard-copy-component.ts +0 -19
  160. data/app/components/ariadne/clipboard_copy_component/clipboard_copy_component.html.erb +0 -9
  161. data/app/components/ariadne/clipboard_copy_component.rb +0 -90
  162. data/app/components/ariadne/close_button_component.html.erb +0 -4
  163. data/app/components/ariadne/close_button_component.rb +0 -33
  164. data/app/components/ariadne/combobox_component.html.erb +0 -14
  165. data/app/components/ariadne/combobox_component.rb +0 -76
  166. data/app/components/ariadne/component.rb +0 -127
  167. data/app/components/ariadne/container_component/container_component.html.erb +0 -3
  168. data/app/components/ariadne/container_component.rb +0 -25
  169. data/app/components/ariadne/content.rb +0 -12
  170. data/app/components/ariadne/counter_component.rb +0 -100
  171. data/app/components/ariadne/details_component/details_component.html.erb +0 -4
  172. data/app/components/ariadne/details_component.rb +0 -81
  173. data/app/components/ariadne/dropdown/menu_component.d.ts +0 -1
  174. data/app/components/ariadne/dropdown/menu_component.html.erb +0 -20
  175. data/app/components/ariadne/dropdown/menu_component.js +0 -1
  176. data/app/components/ariadne/dropdown/menu_component.rb +0 -101
  177. data/app/components/ariadne/dropdown/menu_component.ts +0 -1
  178. data/app/components/ariadne/dropdown_component/dropdown_component.html.erb +0 -8
  179. data/app/components/ariadne/dropdown_component.rb +0 -172
  180. data/app/components/ariadne/events_controller/events_controller.d.ts +0 -4
  181. data/app/components/ariadne/events_controller/events_controller.js +0 -6
  182. data/app/components/ariadne/events_controller/events_controller.ts +0 -7
  183. data/app/components/ariadne/flash_component/flash_component.html.erb +0 -31
  184. data/app/components/ariadne/flash_component.rb +0 -128
  185. data/app/components/ariadne/flex_component/flex_component.html.erb +0 -5
  186. data/app/components/ariadne/flex_component.rb +0 -56
  187. data/app/components/ariadne/footer_component/footer_component.html.erb +0 -7
  188. data/app/components/ariadne/footer_component.rb +0 -23
  189. data/app/components/ariadne/grid_component/grid_component.html.erb +0 -26
  190. data/app/components/ariadne/grid_component.rb +0 -67
  191. data/app/components/ariadne/header_component/header_component.html.erb +0 -29
  192. data/app/components/ariadne/header_component.rb +0 -111
  193. data/app/components/ariadne/heading_component.rb +0 -49
  194. data/app/components/ariadne/heroicon_component/heroicon_component.html.erb +0 -4
  195. data/app/components/ariadne/heroicon_component.rb +0 -166
  196. data/app/components/ariadne/image_component.rb +0 -53
  197. data/app/components/ariadne/inline_flex_component/inline_flex_component.html.erb +0 -6
  198. data/app/components/ariadne/inline_flex_component.rb +0 -72
  199. data/app/components/ariadne/layout_component.html.erb +0 -21
  200. data/app/components/ariadne/layout_component.rb +0 -69
  201. data/app/components/ariadne/link_component.rb +0 -65
  202. data/app/components/ariadne/list_component/list_component.html.erb +0 -3
  203. data/app/components/ariadne/list_component.rb +0 -70
  204. data/app/components/ariadne/modal_component.html.erb +0 -11
  205. data/app/components/ariadne/modal_component.rb +0 -88
  206. data/app/components/ariadne/narrow_container_component/narrow_container_component.html.erb +0 -3
  207. data/app/components/ariadne/narrow_container_component.rb +0 -30
  208. data/app/components/ariadne/options_controller/options_controller.d.ts +0 -39
  209. data/app/components/ariadne/options_controller/options_controller.js +0 -89
  210. data/app/components/ariadne/options_controller/options_controller.ts +0 -122
  211. data/app/components/ariadne/outlet_manager_controller/outlet_manager_controller.d.ts +0 -42
  212. data/app/components/ariadne/outlet_manager_controller/outlet_manager_controller.js +0 -237
  213. data/app/components/ariadne/outlet_manager_controller/outlet_manager_controller.ts +0 -278
  214. data/app/components/ariadne/panel_bar_component/panel_bar_component.html.erb +0 -20
  215. data/app/components/ariadne/panel_bar_component.rb +0 -80
  216. data/app/components/ariadne/pill_component/pill_component.html.erb +0 -3
  217. data/app/components/ariadne/pill_component.rb +0 -44
  218. data/app/components/ariadne/popover_component.html.erb +0 -10
  219. data/app/components/ariadne/popover_component.rb +0 -81
  220. data/app/components/ariadne/progress_bar_component.html.erb +0 -5
  221. data/app/components/ariadne/progress_bar_component.rb +0 -63
  222. data/app/components/ariadne/relative_time_component.html.erb +0 -3
  223. data/app/components/ariadne/relative_time_component.rb +0 -61
  224. data/app/components/ariadne/show_more_button_component.html.erb +0 -11
  225. data/app/components/ariadne/show_more_button_component.rb +0 -47
  226. data/app/components/ariadne/slideover_component/slideover-component.d.ts +0 -9
  227. data/app/components/ariadne/slideover_component/slideover-component.js +0 -11
  228. data/app/components/ariadne/slideover_component/slideover-component.ts +0 -17
  229. data/app/components/ariadne/slideover_component/slideover_component.html.erb +0 -9
  230. data/app/components/ariadne/slideover_component.rb +0 -66
  231. data/app/components/ariadne/spinner_component.html.erb +0 -16
  232. data/app/components/ariadne/spinner_component.rb +0 -45
  233. data/app/components/ariadne/string_match_controller/string_match_controller.d.ts +0 -27
  234. data/app/components/ariadne/string_match_controller/string_match_controller.js +0 -51
  235. data/app/components/ariadne/string_match_controller/string_match_controller.ts +0 -65
  236. data/app/components/ariadne/subheader_component.html.erb +0 -11
  237. data/app/components/ariadne/subheader_component.rb +0 -65
  238. data/app/components/ariadne/synced_boolean_attributes_controller/synced_boolean_attributes_controller.d.ts +0 -48
  239. data/app/components/ariadne/synced_boolean_attributes_controller/synced_boolean_attributes_controller.js +0 -207
  240. data/app/components/ariadne/synced_boolean_attributes_controller/synced_boolean_attributes_controller.ts +0 -256
  241. data/app/components/ariadne/tab_component/tab_component.html.erb +0 -3
  242. data/app/components/ariadne/tab_component.rb +0 -98
  243. data/app/components/ariadne/tab_container_component/tab-container-component.d.ts +0 -1
  244. data/app/components/ariadne/tab_container_component/tab-container-component.js +0 -23
  245. data/app/components/ariadne/tab_container_component/tab-container-component.ts +0 -24
  246. data/app/components/ariadne/tab_container_component.erb +0 -10
  247. data/app/components/ariadne/tab_container_component.rb +0 -68
  248. data/app/components/ariadne/tab_nav_component/tab-nav-component.d.ts +0 -9
  249. data/app/components/ariadne/tab_nav_component/tab-nav-component.js +0 -33
  250. data/app/components/ariadne/tab_nav_component/tab-nav-component.ts +0 -34
  251. data/app/components/ariadne/tab_nav_component/tab_nav_component.html.erb +0 -7
  252. data/app/components/ariadne/tab_nav_component.rb +0 -72
  253. data/app/components/ariadne/table_nav_component/table_nav_component.html.erb +0 -52
  254. data/app/components/ariadne/table_nav_component.rb +0 -338
  255. data/app/components/ariadne/text.rb +0 -25
  256. data/app/components/ariadne/time_ago_component/time-ago-component.d.ts +0 -1
  257. data/app/components/ariadne/time_ago_component/time-ago-component.js +0 -1
  258. data/app/components/ariadne/time_ago_component/time-ago-component.ts +0 -1
  259. data/app/components/ariadne/time_ago_component.rb +0 -56
  260. data/app/components/ariadne/timeline_component/timeline_component.html.erb +0 -19
  261. data/app/components/ariadne/timeline_component.rb +0 -34
  262. data/app/components/ariadne/toggle_component/toggle_component.html.erb +0 -15
  263. data/app/components/ariadne/toggle_component.rb +0 -95
  264. data/app/components/ariadne/toggleable_controller/toggleable_controller.d.ts +0 -34
  265. data/app/components/ariadne/toggleable_controller/toggleable_controller.js +0 -54
  266. data/app/components/ariadne/toggleable_controller/toggleable_controller.ts +0 -77
  267. data/app/components/ariadne/tooltip_component/tooltip-component.d.ts +0 -24
  268. data/app/components/ariadne/tooltip_component/tooltip-component.js +0 -43
  269. data/app/components/ariadne/tooltip_component/tooltip-component.ts +0 -57
  270. data/app/components/ariadne/tooltip_component/tooltip_component.html.erb +0 -4
  271. data/app/components/ariadne/tooltip_component.rb +0 -108
  272. data/app/lib/ariadne/action_view_extensions/form_helper.rb +0 -30
  273. data/app/lib/ariadne/audited/dsl.rb +0 -32
  274. data/app/lib/ariadne/form_builder.rb +0 -80
  275. data/app/lib/ariadne/status/dsl.rb +0 -41
  276. data/config/importmap.rb +0 -3
  277. data/exe/tailwindcss +0 -21
  278. data/lib/rubocop/cop/ariadne/base_cop.rb +0 -26
  279. data/tailwind.config.js +0 -70
@@ -2,8 +2,6 @@
2
2
 
3
3
  require "rails/engine"
4
4
 
5
- require "view_component"
6
-
7
5
  require "tailwind_merge"
8
6
 
9
7
  module Ariadne
@@ -17,7 +15,7 @@ module Ariadne
17
15
  isolate_namespace Ariadne::ViewComponents
18
16
 
19
17
  config.autoload_paths = ["#{root}/lib"]
20
- config.eager_load_paths = ["#{root}/app/components", "#{root}/app/helpers", "#{root}/app/lib"]
18
+ config.eager_load_paths = ["#{root}/app/components", "#{root}/app/forms", "#{root}/app/helpers", "#{root}/app/lib"]
21
19
 
22
20
  config.ariadne_view_components = ActiveSupport::OrderedOptions.new
23
21
 
@@ -31,9 +29,28 @@ module Ariadne
31
29
  app.config.assets.precompile += ["ariadne_view_components"] if app.config.respond_to?(:assets)
32
30
  end
33
31
 
34
- initializer "ariadne_view_components.importmap", before: "importmap" do |app|
35
- if Rails.application.respond_to?(:importmap)
36
- app.config.importmap.paths << Engine.root.join("config/importmap.rb")
32
+ initializer "ariadne_view_components.eager_load_actions" do
33
+ ActiveSupport.on_load(:after_initialize) do
34
+ if Rails.application.config.eager_load
35
+ Ariadne::Forms::Base.compile!
36
+ Ariadne::Forms::Base.descendants.each(&:compile!)
37
+ Ariadne::Forms::BaseComponent.descendants.each(&:compile!)
38
+ Ariadne::Heroicon::Cache.preload!
39
+ end
40
+ end
41
+ end
42
+
43
+ initializer "ariadne.forms.helpers" do
44
+ ActiveSupport.on_load(:action_controller_base) do
45
+ begin
46
+ require "ariadne/form_helper"
47
+ rescue LoadError # rubocop:disable Lint/SuppressedException
48
+ end
49
+
50
+ helper Ariadne::FormHelper
51
+
52
+ # make ariadne_form_with available to view components also
53
+ ViewComponent::Base.prepend(Ariadne::FormHelper)
37
54
  end
38
55
  end
39
56
 
@@ -46,7 +63,7 @@ module Ariadne
46
63
  end
47
64
 
48
65
  config.after_initialize do |_app|
49
- Ariadne::ViewComponents.tailwind_merger = TailwindMerge::Merger.new
66
+ Ariadne::ViewComponents.tailwind_merger = TailwindMerge::Merger.new(config: { prefix: "ariadne-" })
50
67
  end
51
68
  end
52
69
  end
@@ -3,6 +3,6 @@
3
3
  # :nocov:
4
4
  module Ariadne
5
5
  module ViewComponents
6
- VERSION = "0.0.59"
6
+ VERSION = "0.0.65"
7
7
  end
8
8
  end
@@ -47,7 +47,7 @@ module Ariadne
47
47
  require "json"
48
48
 
49
49
  File.open(File.join(DEFAULT_STATIC_PATH, FILE_NAMES[stats]), "w") do |f|
50
- f.write(JSON.pretty_generate(send("generate_#{stats}")))
50
+ f.write(JSON.pretty_generate(send(:"generate_#{stats}")))
51
51
  f.write($INPUT_RECORD_SEPARATOR)
52
52
  end
53
53
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nocov:
4
+ module Ariadne
5
+ module Yard
6
+ # Shared functionality for generating documentation from YARD comments.
7
+ class Backend
8
+ include DocsHelper
9
+
10
+ private
11
+
12
+ def view_context
13
+ @view_context ||= begin
14
+ # Rails controller for rendering arbitrary ERB
15
+ vc = ApplicationController.new.tap { |c| c.request = ActionDispatch::TestRequest.create }.view_context
16
+ vc.singleton_class.include(DocsHelper)
17
+ vc.singleton_class.include(Ariadne::ViewHelper)
18
+ vc
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ # :nocov:
@@ -0,0 +1,148 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nocov:
4
+ module Ariadne
5
+ module Yard
6
+ # The set of documented components (and associated metadata).
7
+ class ComponentManifest
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 },
70
+
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 },
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 },
79
+
80
+ # ActionList is a base component that should not be used by itself, and thus
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 },
86
+
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 }
98
+ }.freeze
99
+
100
+ include Enumerable
101
+
102
+ def initialize(components)
103
+ @components = components
104
+ end
105
+
106
+ def each
107
+ return to_enum(__method__) unless block_given?
108
+
109
+ @components.each do |klass|
110
+ yield self.class.ref_for(klass)
111
+ end
112
+ end
113
+
114
+ def where(**attrs)
115
+ self.class.where(@components, **attrs)
116
+ end
117
+
118
+ class << self
119
+ def where(components = COMPONENTS, **desired_attrs)
120
+ new(
121
+ components.each_with_object([]) do |(klass, component_attrs), memo|
122
+ matches = desired_attrs.all? do |name, desired_value|
123
+ component_attrs.fetch(name, ComponentRef::ATTR_DEFAULTS[name]) == desired_value
124
+ end
125
+
126
+ memo << klass if matches
127
+ end,
128
+ )
129
+ end
130
+
131
+ def all
132
+ new(COMPONENTS.keys)
133
+ end
134
+
135
+ def ref_for(klass)
136
+ ref_cache[klass] ||= ComponentRef.new(klass, COMPONENTS.fetch(klass, {}))
137
+ end
138
+
139
+ private
140
+
141
+ def ref_cache
142
+ @ref_cache ||= {}
143
+ end
144
+ end
145
+ end
146
+ end
147
+ end
148
+ # :nocov:
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nocov:
4
+ module Ariadne
5
+ module Yard
6
+ # :nodoc:
7
+ class ComponentRef
8
+ ATTR_DEFAULTS = {
9
+ js: false,
10
+ examples: true,
11
+ form_component: false,
12
+ }.freeze
13
+
14
+ attr_reader :klass, :attrs
15
+
16
+ def initialize(klass, attrs)
17
+ @klass = klass
18
+ @attrs = attrs
19
+ end
20
+
21
+ def requires_js?
22
+ @attrs.fetch(:js, ATTR_DEFAULTS[:js])
23
+ end
24
+
25
+ def should_have_examples?
26
+ @attrs.fetch(:examples, ATTR_DEFAULTS[:examples])
27
+ end
28
+
29
+ def form_component?
30
+ @attrs.fetch(:form_component, ATTR_DEFAULTS[:form_component])
31
+ end
32
+
33
+ def source_url
34
+ @source_url ||= begin
35
+ path = klass.name.split("::").map(&:underscore).join("/")
36
+ "https://github.com/primer/view_components/tree/main/app/components/#{path}.rb"
37
+ end
38
+ end
39
+
40
+ def lookbook_url
41
+ @lookbook_url ||= begin
42
+ path = klass.name.underscore.gsub("_component", "")
43
+ "https://ariadne.style/view-components/lookbook/inspect/#{path}/default/"
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ # :nocov:
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nocov:
4
+ module Ariadne
5
+ # :nodoc:
6
+ module Yard
7
+ # Helper methods to use for yard documentation
8
+ module DocsHelper
9
+ def one_of(enumerable, lower: false, sort: true)
10
+ # Sort the array if requested
11
+ if sort && !enumerable.nil?
12
+ enumerable = enumerable.sort do |a, b|
13
+ a.instance_of?(b.class) ? a <=> b : a.class.to_s <=> b.class.to_s
14
+ end
15
+ end
16
+
17
+ values =
18
+ case enumerable
19
+ when Hash
20
+ enumerable.map do |key, value|
21
+ "#{pretty_value(key)} (#{pretty_value(value)})"
22
+ end
23
+ else
24
+ enumerable.map do |key|
25
+ pretty_value(key)
26
+ end
27
+ end
28
+
29
+ prefix = "One of"
30
+ prefix = prefix.downcase if lower
31
+
32
+ "#{prefix} #{values.to_sentence(two_words_connector: " or ", last_word_connector: ", or ")}."
33
+ end
34
+
35
+ def link_to_accessibility
36
+ "[Accessibility](#accessibility)"
37
+ end
38
+
39
+ def link_to_system_arguments_docs
40
+ "[System arguments](/system-arguments)"
41
+ end
42
+
43
+ def link_to_typography_docs
44
+ "[Typography](/system-arguments#typography)"
45
+ end
46
+
47
+ def link_to_component(component)
48
+ status_module, short_name, class_name = status_module_and_short_name(component)
49
+ status_path = status_module.nil? ? "" : "#{status_module}/"
50
+
51
+ "[#{class_name}](/components/#{status_path}#{short_name.downcase})"
52
+ end
53
+
54
+ def link_to_octicons
55
+ "[Octicon](https://primer.style/octicons/)"
56
+ end
57
+
58
+ def link_to_heading_practices
59
+ "[Learn more about best heading practices (WAI Headings)](https://www.w3.org/WAI/tutorials/page-structure/headings/)"
60
+ end
61
+
62
+ def status_module_and_short_name(component)
63
+ name_with_status = component.name.gsub(/Ariadne::|Component/, "")
64
+
65
+ m = name_with_status.match(/(?<status>Beta|Alpha|Deprecated)?(?<_colons>::)?(?<name>.*)/)
66
+ [m[:status]&.downcase, m[:name].gsub("::", ""), m[:name]]
67
+ end
68
+
69
+ def pretty_default_value(tag, component)
70
+ params = tag.object.parameters.find { |param| [tag.name.to_s, "#{tag.name}:"].include?(param[0]) }
71
+ default = tag.defaults&.first || params&.second
72
+
73
+ return "N/A" unless default
74
+
75
+ constant_name = "#{component.name}::#{default}"
76
+ constant_value = default.safe_constantize || constant_name.safe_constantize
77
+
78
+ return pretty_value(default) if constant_value.nil?
79
+
80
+ pretty_value(constant_value)
81
+ end
82
+
83
+ def pretty_value(val)
84
+ case val
85
+ when nil
86
+ "`nil`"
87
+ when Symbol
88
+ "`:#{val}`"
89
+ else
90
+ "`#{val}`"
91
+ end
92
+ end
93
+ end
94
+
95
+ DocsHelper.extend(DocsHelper)
96
+ end
97
+ end
98
+ # :nocov:
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nocov:
4
+ module Ariadne
5
+ module Yard
6
+ # Helper methods to use for info arch yard documentation
7
+ module InfoArchDocsHelper
8
+ include DocsHelper
9
+
10
+ def link_to_component(component)
11
+ "{{#link_to_component}}#{component}{{/link_to_component}}"
12
+ end
13
+
14
+ def link_to_system_arguments_docs
15
+ "{{link_to_system_arguments_docs}}"
16
+ end
17
+
18
+ def link_to_typography_docs
19
+ "{{link_to_typography_docs}}"
20
+ end
21
+
22
+ def link_to_accessibility
23
+ "{{link_to_accessibility}}"
24
+ end
25
+
26
+ def link_to_octicons
27
+ "{{link_to_octicons}}"
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nocov:
4
+ module Ariadne
5
+ module Yard
6
+ # Helper methods for documentation generated in Lookbook pages.
7
+ module LookbookDocsHelper
8
+ # Adheres to the same signature as Ariadne::Yard::DocsHelper#link_to_component so link_to_component
9
+ # may be used in a Gatsby or Lookbook context and produce the correct link for each platform.
10
+ #
11
+ # @param component [Class] The component class to link to.
12
+ # @return [String] The link, either in HTML or markdown format.
13
+ def link_to_component(component)
14
+ backend = Ariadne::Yard::LookbookPagesBackend.new(Ariadne::Yard::Registry.make, nil)
15
+ component_ref = Ariadne::Yard::ComponentManifest.ref_for(component)
16
+ page = backend.page_for(component_ref)
17
+
18
+ # If the page_path method is available, we're being rendered into HTML by Lookbook
19
+ # and should emit an HTML <a> tag. No page_path means we're being rendered into
20
+ # markdown by LookbookPagesBackend and should emit a markdown + ERB link that
21
+ # Lookbook will eventually render on page load.
22
+ if respond_to?(:page_path)
23
+ link_to(page.docs.short_name, page_path(page.page_id.to_sym.inspect))
24
+ else
25
+ # rubocop:disable Rails/OutputSafety
26
+ "[#{page.docs.short_name}](<%= page_path(#{page.page_id.to_sym.inspect}) %>)".html_safe
27
+ # rubocop:enable Rails/OutputSafety
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,235 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nocov:
4
+ module Ariadne
5
+ module Yard
6
+ # A single Lookbook page.
7
+ class LookbookPage
8
+ include DocsHelper
9
+
10
+ PREVIEW_MAP = {
11
+ Ariadne::Alpha::TextField => [:single_text_field_form, :multi_text_field_form],
12
+ Ariadne::Alpha::TextArea => [],
13
+ Ariadne::Alpha::Select => [:select_form],
14
+ Ariadne::Alpha::MultiInput => [:multi_input_form],
15
+ Ariadne::Alpha::RadioButton => [:radio_button_with_nested_form],
16
+ Ariadne::Alpha::RadioButtonGroup => [:radio_button_group_form],
17
+ Ariadne::Alpha::CheckBox => [:check_box_with_nested_form],
18
+ Ariadne::Alpha::CheckBoxGroup => [:check_box_group_form],
19
+ Ariadne::Alpha::SubmitButton => [:submit_button_form],
20
+ Ariadne::Alpha::FormButton => [:submit_button_form],
21
+ }.freeze
22
+
23
+ attr_reader :component_ref, :backend, :docs
24
+
25
+ def initialize(component_ref, backend, docs)
26
+ @component_ref = component_ref
27
+ @backend = backend
28
+ @docs = docs
29
+ end
30
+
31
+ def page_id
32
+ @page_id ||= docs.short_name.dasherize.underscore.tap do |page_id|
33
+ page_id << "_input" unless page_id.end_with?("_input")
34
+ end
35
+ end
36
+
37
+ def generate
38
+ path = File.expand_path(
39
+ File.join(
40
+ "..",
41
+ "..",
42
+ "..",
43
+ "previews",
44
+ "pages",
45
+ "forms",
46
+ "inputs",
47
+ "#{docs.short_name.dasherize.underscore}.md.erb",
48
+ ),
49
+ __dir__,
50
+ )
51
+
52
+ docs.non_slot_methods.select do |mtd|
53
+ [component.name, "Ariadne::Forms::Dsl::InputMethods"].include?(mtd.parent.title)
54
+ end
55
+
56
+ preview_methods = PREVIEW_MAP[component]
57
+ preview_methods.map do |preview_method|
58
+ if Ariadne::FormsPreview.instance_methods.exclude?(preview_method)
59
+ raise "Preview '#{preview_method}' does not exist in Ariadne::FormsPreview"
60
+ end
61
+ # rubocop:enable Style/IfUnlessModifier
62
+
63
+ "<%= embed Ariadne::FormsPreview, #{preview_method.inspect} %>"
64
+ end
65
+ # rubocop:disable Security/Eval
66
+ File.open(path, "w") do |f|
67
+ f.write(eval(Erubi::Engine.new(<<~ERB, trim: true).src))
68
+ ---
69
+ title: <%= docs.title.underscore.titleize %>
70
+ id: <%= page_id %>
71
+ ---
72
+
73
+ <%= docs.base_docstring %>
74
+
75
+ ## Usage
76
+
77
+ ```ruby
78
+ <%= docs.tags(:form_usage).first.text %>
79
+ ```
80
+
81
+ <% specific_args = specific_args_from(docs.params) %>
82
+ <% unless specific_args.empty? %>
83
+ ## Arguments
84
+
85
+ <%= generate_args_table(specific_args) %>
86
+ <% end %>
87
+
88
+ ## Common arguments
89
+
90
+ <%= generate_args_table(common_args_from(docs.params)) %>
91
+
92
+ <% unless documented_methods.empty? %>
93
+ ## Methods
94
+
95
+ <% documented_methods.each do |method_docs| %>
96
+ ### `#<%= method_docs.signature.sub(/def /, "") %>`
97
+
98
+ <%= method_docs.base_docstring %>
99
+
100
+ <% param_tags = method_docs.tags(:param) %>
101
+
102
+ <% if param_tags.any? %>
103
+
104
+ <%= generate_args_table(param_tags) %>
105
+ <% end %>
106
+ <% end %>
107
+ <% end %>
108
+
109
+ <% unless preview_methods.empty? %>
110
+ ## Examples
111
+
112
+ <%= preview_erbs.join("\n") %>
113
+ <% end %>
114
+ ERB
115
+ end
116
+ # rubocop:enable Security/Eval
117
+ end
118
+
119
+ private
120
+
121
+ def registry
122
+ backend.registry
123
+ end
124
+
125
+ def generate_args_table(params)
126
+ rows = params.map do |tag|
127
+ description = backend.view_context.render(inline: tag.text.squish)
128
+ parts = [
129
+ "`#{tag.name}`",
130
+ tag.types.join(", "),
131
+ description,
132
+ ]
133
+
134
+ "| #{parts.join(" | ")} |"
135
+ end
136
+
137
+ <<~MARKDOWN
138
+ | Name | Type | Description |
139
+ | :- | :- | :- |
140
+ #{rows.join("\n")}
141
+ MARKDOWN
142
+ end
143
+
144
+ def common_args_from(params)
145
+ params.select { |param| common_form_input_argument_names.include?(param.name) }
146
+ end
147
+
148
+ def specific_args_from(params)
149
+ params.reject { |param| common_form_input_argument_names.include?(param.name) }
150
+ end
151
+
152
+ def common_form_input_argument_names
153
+ @common_form_input_argument_names ||= begin
154
+ macro = registry.yard_registry[".macro.form_input_arguments"]
155
+ parser = ::YARD::Docstring.parser
156
+ parser.parse(macro.macro_data)
157
+ parser
158
+ .tags
159
+ .select { |tag| tag.tag_name == "param" }
160
+ .map(&:name)
161
+ end
162
+ end
163
+
164
+ def component
165
+ component_ref.klass
166
+ end
167
+ end
168
+
169
+ # Backend that generates Lookbook pages.
170
+ class LookbookPagesBackend < Backend
171
+ attr_reader :registry, :manifest
172
+
173
+ def initialize(registry, manifest)
174
+ @registry = registry
175
+ @manifest = manifest
176
+ end
177
+
178
+ def generate
179
+ each_component do |component_ref|
180
+ page_for(component_ref).generate
181
+ end
182
+ generate_system_args_docs
183
+ end
184
+
185
+ def page_for(component_ref)
186
+ docs = registry.find(component_ref.klass)
187
+ LookbookPage.new(component_ref, self, docs)
188
+ end
189
+
190
+ def view_context
191
+ @view_context ||= super.tap do |vc|
192
+ vc.singleton_class.include(LookbookDocsHelper)
193
+ end
194
+ end
195
+
196
+ private
197
+
198
+ def each_component(&block)
199
+ manifest.each(&block)
200
+ end
201
+
202
+ def generate_system_args_docs
203
+ docs = registry.find(Ariadne::BaseComponent)
204
+
205
+ path = File.expand_path(
206
+ File.join(
207
+ "..", "..", "..", "previews", "pages", "system-arguments.md.erb"
208
+ ),
209
+ __dir__,
210
+ )
211
+
212
+ data = {
213
+ "description_md" => docs.base_docstring.to_s,
214
+ "args_md" => view_context.render(inline: docs.constructor.base_docstring),
215
+ }
216
+
217
+ frontmatter = {
218
+ "title" => "System arguments",
219
+ "id" => "system_arguments",
220
+ "data" => data,
221
+ }
222
+
223
+ File.write(
224
+ path, <<~ERB
225
+ #{YAML.dump(frontmatter)}
226
+ ---
227
+ <%= @page.data[:description_md].html_safe %>
228
+ <%= @page.data[:args_md].html_safe %>
229
+ ERB
230
+ )
231
+ end
232
+ end
233
+ end
234
+ end
235
+ # :nocov: