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
@@ -0,0 +1,69 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ module Ariadne
5
+ module UI
6
+ module Image
7
+ # @example Default
8
+ #
9
+ # <%= render(Ariadne::ImageComponent.new(src: "https://github.com/github.png", alt: "GitHub")) %>
10
+ #
11
+ # @example Helper
12
+ #
13
+ # <%= ariadne_image(src: "https://github.com/github.png", alt: "GitHub") %>
14
+ #
15
+ # @example Lazy loading
16
+ #
17
+ # <%= render(Ariadne::ImageComponent.new(src: "https://github.com/github.png", alt: "GitHub", lazy: true)) %>
18
+ #
19
+ # @example Custom size
20
+ #
21
+ # <%= render(Ariadne::ImageComponent.new(src: "https://github.com/github.png", alt: "GitHub", attributes: { height: 100, width: 100 })) %>
22
+ #
23
+ # @param tag [Symbol, String] The rendered tag name
24
+ # @param src [String] The source url of the image.
25
+ # @param alt [String] Specifies an alternate text for the image.
26
+ # @param lazy [Boolean] Whether or not to lazily load the image.
27
+ # @param classes [String] <%= link_to_classes_docs %>
28
+ # @param attributes [Hash] <%= link_to_attributes_docs %>
29
+ class Component < Ariadne::BaseComponent
30
+ option :src
31
+ option :alt
32
+ option :size, default: -> { :original }
33
+ option :lazy, default: -> { false }
34
+
35
+ accepts_html_attributes do |html_attrs|
36
+ html_attrs[:class] = Ariadne::ViewComponents.tailwind_merger.merge([style(size: @size), html_attrs[:class]].join(" "))
37
+
38
+ html_attrs[:src] = @src
39
+ html_attrs[:alt] = @alt
40
+
41
+ next unless @lazy
42
+
43
+ html_attrs[:loading] = :lazy
44
+ html_attrs[:decoding] = :async
45
+ end
46
+
47
+ style do
48
+ base do
49
+ ["ariadne-object-cover", "ariadne-object-center"]
50
+ end
51
+
52
+ variants do
53
+ size do
54
+ xs { "ariadne-w-4" }
55
+ sm { "ariadne-w-6" }
56
+ md { "ariadne-w-8" }
57
+ lg { "ariadne-w-12" }
58
+ xl { "ariadne-w-16" }
59
+ end
60
+ end
61
+ end
62
+
63
+ erb_template <<~ERB
64
+ <img class="<%= html_attrs[:class] %>" <%= html_attributes %> />
65
+ ERB
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,3 @@
1
+ <a href="<%= href %>" class="<%= style(theme:, size:) %>" <%= html_attributes %>>
2
+ <%= content %>
3
+ </a>
@@ -0,0 +1,56 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ module Ariadne
5
+ module UI
6
+ module Link
7
+ class Component < Ariadne::BaseComponent
8
+ option :href
9
+
10
+ option :theme, default: proc { :base }
11
+ option :size, default: proc { :base }
12
+
13
+ include Ariadne::Behaviors::Tooltipable
14
+
15
+ style do
16
+ base do
17
+ [
18
+ "ariadne-inline-flex",
19
+ "ariadne-items-center",
20
+ "ariadne-border-b",
21
+ "ariadne-border-transparent",
22
+ ]
23
+ end
24
+
25
+ variants do
26
+ theme do
27
+ base do
28
+ [
29
+ "[&>svg]:ariadne-text-zinc-400",
30
+ "[&>svg]:dark:ariadne-text-zinc-600",
31
+ "hover:ariadne-text-indigo-600",
32
+ "dark:hover:ariadne-text-indigo-400",
33
+ "hover:ariadne-border-indigo-600",
34
+ "dark:hover:ariadne-border-indigo-400",
35
+ "focus:ariadne-text-indigo-600",
36
+ "dark:focus:ariadne-text-indigo-400",
37
+ "focus:!ariadne-border-transparent",
38
+ "active:ariadne-bg-indigo-700/10",
39
+ "active:dark:ariadne-bg-indigo-300/10",
40
+ ]
41
+ end
42
+ nude { "" }
43
+ thick { "ariadne-font-semibold" }
44
+ end
45
+ size do
46
+ xs { "ariadne-text-xs ariadne-gap-0.5 [&>svg]:ariadne-size-3" }
47
+ sm { "ariadne-text-sm ariadne-gap-0.5 [&>svg]:ariadne-size-4" }
48
+ md { "ariadne-text-base ariadne-gap-1 [&>svg]:ariadne-size-4" }
49
+ lg { "ariadne-text-lg ariadne-gap-1 [&>svg]:ariadne-size-5" }
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,3 @@
1
+ <%= content_tag(tag_name, html_attrs) do %>
2
+ <%= content %>
3
+ <% end %>
@@ -0,0 +1,41 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ module Ariadne
5
+ module UI
6
+ module Typography
7
+ class Component < Ariadne::BaseComponent
8
+ option :type
9
+
10
+ accepts_html_attributes do |html_attrs|
11
+ html_attrs[:class] = Ariadne::ViewComponents.tailwind_merger.merge([style(type: @type), html_attrs[:class]].join(" "))
12
+ end
13
+
14
+ def tag_name
15
+ case type
16
+ when :heading
17
+ :h1
18
+ else
19
+ :span
20
+ end
21
+ end
22
+
23
+ style do
24
+ variants do
25
+ type do
26
+ heading do
27
+ [
28
+ "ariadne-scroll-m-20",
29
+ "ariadne-text-4xl",
30
+ "ariadne-font-extrabold",
31
+ "ariadne-tracking-tight",
32
+ "lg:ariadne-text-5xl",
33
+ ]
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,14 @@
1
+ import '@github/auto-check-element'
2
+ import '@github/auto-complete-element'
3
+ import '@github/details-menu-element'
4
+ import '@github/image-crop-element'
5
+ import '@github/include-fragment-element'
6
+ import '@github/markdown-toolbar-element'
7
+ import '@github/relative-time-element'
8
+
9
+ import '~/stylesheets/ariadne_view_components.css'
10
+ import '~/stylesheets/typography.css'
11
+
12
+ import './theme'
13
+
14
+ export * from './stimulus_app'
@@ -0,0 +1,53 @@
1
+ import {Application, type ControllerConstructor} from '@hotwired/stimulus'
2
+
3
+ const application = Application.start()
4
+
5
+ application.debug = import.meta.env.DEV
6
+
7
+ declare global {
8
+ interface Window {
9
+ Stimulus: Application
10
+ }
11
+ }
12
+
13
+ window.Stimulus = application
14
+
15
+ // Force Vite to process component JS
16
+ const componentModules = import.meta.glob(['../../components/**/component.ts'], {eager: true})
17
+ import.meta.glob(['../../components/**/component.css'], {eager: true})
18
+
19
+ for (const [path, module] of Object.entries(componentModules)) {
20
+ const dirs = path.split('/')
21
+
22
+ // Dropping ../../components and component.ts parts to end up
23
+ // with something like "ariadne-ui-component-name"
24
+ const name = dirs
25
+ .slice(3, dirs.length - 1)
26
+ .join('-')
27
+ .replaceAll('_', '-')
28
+ .toLocaleLowerCase()
29
+
30
+ application.register(
31
+ // @tag stimulus-id
32
+ name,
33
+ (module as {default: ControllerConstructor}).default,
34
+ )
35
+ }
36
+
37
+ const controllerModules = import.meta.glob(['~/controllers/*.ts'], {eager: true})
38
+
39
+ for (const [path, module] of Object.entries(controllerModules)) {
40
+ const dirs = path.split('/')
41
+
42
+ // Dropping ../controllers to end up
43
+ // with something like "ariadne-component-name"
44
+ const name = dirs.slice(2, dirs.length).join('-').replace('.ts', '').replaceAll('_', '-').toLocaleLowerCase()
45
+
46
+ application.register(
47
+ // @tag stimulus-id
48
+ `ariadne-${name}`,
49
+ (module as {default: ControllerConstructor}).default,
50
+ )
51
+ }
52
+
53
+ export {application}
@@ -0,0 +1,8 @@
1
+ const userTheme = localStorage.getItem('theme') || ''
2
+ const systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches
3
+
4
+ const themeCheck = () => {
5
+ if (userTheme === 'dark' || (!userTheme && systemTheme)) {
6
+ document.documentElement.classList.add('dark')
7
+ }
8
+ }
@@ -0,0 +1,75 @@
1
+ import {controllerFactory} from '@utils/createController'
2
+ import {computePosition, arrow, offset, flip, shift} from '@floating-ui/dom'
3
+
4
+ import '~/stylesheets/tippy.js/themes/tomato.css'
5
+
6
+ export default class TooltipController extends controllerFactory<HTMLElement>()({
7
+ targets: {
8
+ activator: HTMLElement,
9
+ wrapper: HTMLDivElement,
10
+ tooltip: HTMLDivElement,
11
+ arrow: HTMLDivElement,
12
+ },
13
+ }) {
14
+ async update() {
15
+ computePosition(this.activatorTarget, this.tooltipTarget, {
16
+ placement: 'top',
17
+ middleware: [offset(10), flip(), shift({padding: 5}), arrow({element: this.arrowTarget})],
18
+ // eslint-disable-next-line github/no-then
19
+ }).then(({x, y, placement, middlewareData}) => {
20
+ Object.assign(this.tooltipTarget.style, {
21
+ left: `${x}px`,
22
+ top: `${y}px`,
23
+ })
24
+
25
+ // Reset any previously set styles on the arrow
26
+ Object.assign(this.arrowTarget.style, {
27
+ left: '',
28
+ top: '',
29
+ right: '',
30
+ bottom: '',
31
+ })
32
+
33
+ const {x: arrowX, y: arrowY} = middlewareData.arrow || {}
34
+ const primaryPlacement = placement.split('-')[0]
35
+
36
+ switch (primaryPlacement) {
37
+ case 'top':
38
+ Object.assign(this.arrowTarget.style, {
39
+ left: arrowX ? `${arrowX}px` : '',
40
+ bottom: '-4px', // Aligns arrow to the bottom edge of the tooltip
41
+ })
42
+ break
43
+ case 'bottom':
44
+ Object.assign(this.arrowTarget.style, {
45
+ left: arrowX ? `${arrowX}px` : '',
46
+ top: '-4px', // Aligns arrow to the top edge of the tooltip
47
+ })
48
+ break
49
+ case 'left':
50
+ Object.assign(this.arrowTarget.style, {
51
+ top: arrowY ? `${arrowY}px` : '',
52
+ right: '-4px', // Aligns arrow to the right edge of the tooltip
53
+ })
54
+ break
55
+ case 'right':
56
+ Object.assign(this.arrowTarget.style, {
57
+ top: arrowY ? `${arrowY}px` : '',
58
+ left: '-4px', // Aligns arrow to the left edge of the tooltip
59
+ })
60
+ break
61
+ }
62
+ })
63
+ }
64
+
65
+ showTooltip(_event: Event) {
66
+ this.wrapperTarget.classList.add('block')
67
+ this.wrapperTarget.classList.remove('hidden')
68
+ this.update()
69
+ }
70
+
71
+ hideTooltip(_event: Event) {
72
+ this.wrapperTarget.classList.add('hidden')
73
+ this.wrapperTarget.classList.remove('block')
74
+ }
75
+ }
@@ -0,0 +1 @@
1
+ import '~/ariadne'
@@ -0,0 +1,18 @@
1
+ @import 'scrollbar.css';
2
+
3
+ @tailwind base;
4
+ @tailwind components;
5
+ @tailwind utilities;
6
+
7
+ /* Fix summary element usage in Safari only */
8
+ summary::-webkit-details-marker {
9
+ display: none;
10
+ }
11
+
12
+ @media (prefers-reduced-motion) {
13
+ /* Disabling animations everywhere at once */
14
+ * {
15
+ animation-duration: 0.01s;
16
+ transition-duration: 0.01s;
17
+ }
18
+ }
@@ -0,0 +1,28 @@
1
+ .scroll {
2
+ scrollbar-color: theme('colors.gray.500/20') transparent;
3
+
4
+ *::-webkit-scrollbar {
5
+ @apply ariadne-h-4 ariadne-w-2;
6
+ }
7
+
8
+ *::-webkit-scrollbar:horizontal {
9
+ @apply ariadne-h-2 ariadne-w-4;
10
+ }
11
+
12
+ *::-webkit-scrollbar-track {
13
+ @apply ariadne-bg-transparent;
14
+ }
15
+
16
+ *::-webkit-scrollbar-thumb {
17
+ @apply ariadne-bg-gray-500/20 hover:ariadne-bg-gray-500/40;
18
+ @apply ariadne-transition-opacity;
19
+ }
20
+ }
21
+
22
+ .scrollbar-trigger *::-webkit-scrollbar-thumb {
23
+ @apply md:ariadne-invisible;
24
+ }
25
+
26
+ .scrollbar-trigger:hover *::-webkit-scrollbar-thumb {
27
+ @apply md:ariadne-visible;
28
+ }
@@ -0,0 +1,4 @@
1
+ .tippy-box.tomato-theme {
2
+ background-color: tomato;
3
+ color: yellow;
4
+ }
@@ -0,0 +1,117 @@
1
+ .typography p,
2
+ .typography ol,
3
+ .typography ul {
4
+ max-width: 600px;
5
+ }
6
+
7
+ .typography a {
8
+ @apply ariadne-font-medium ariadne-underline;
9
+ }
10
+
11
+ .typography strong {
12
+ @apply ariadne-font-bold;
13
+ }
14
+
15
+ .typography ol {
16
+ @apply ariadne-pl-6 ariadne-relative ariadne-list-none;
17
+
18
+ counter-reset: list-number;
19
+ }
20
+
21
+ .typography ol > li::before {
22
+ @apply ariadne-absolute ariadne-left-0 ariadne-overflow-hidden ariadne-w-5 ariadne-text-right;
23
+
24
+ counter-increment: list-number;
25
+ content: counter(list-number) '.';
26
+ }
27
+
28
+ .typography ul {
29
+ @apply ariadne-pl-6 ariadne-relative ariadne-list-none;
30
+ }
31
+
32
+ .typography ul > li::before {
33
+ @apply ariadne-absolute ariadne-left-0 ariadne-overflow-hidden ariadne-w-5 ariadne-text-center;
34
+
35
+ content: '\25AA';
36
+ }
37
+
38
+ .typography dt {
39
+ @apply ariadne-font-semibold;
40
+ }
41
+
42
+ .typography hr {
43
+ @apply ariadne-border-t;
44
+ }
45
+
46
+ .typography blockquote {
47
+ @apply ariadne-font-medium ariadne-italic ariadne-border-l-4 ariadne-pl-2;
48
+ }
49
+
50
+ .typography blockquote p:first-of-type::before {
51
+ content: open-quote;
52
+ }
53
+
54
+ .typography blockquote p:last-of-type::after {
55
+ content: close-quote;
56
+ }
57
+
58
+ .typography kbd {
59
+ @apply ariadne-font-medium ariadne-text-inherit;
60
+
61
+ font-family: inherit;
62
+ }
63
+
64
+ .typography code {
65
+ @apply ariadne-font-mono ariadne-font-semibold;
66
+ }
67
+
68
+ .typography pre {
69
+ @apply ariadne-px-3 ariadne-py-2 ariadne-rounded-lg ariadne-bg-zinc-300 dark:ariadne-bg-zinc-700 ariadne-bg-opacity-10 dark:ariadne-bg-opacity-10 ariadne-font-mono ariadne-overflow-x-auto;
70
+ }
71
+
72
+ .typography pre code {
73
+ @apply ariadne-text-inherit;
74
+
75
+ font: inherit;
76
+ }
77
+
78
+ .typography :not(pre) > code {
79
+ @apply ariadne-p-1 ariadne-bg-zinc-300 dark:ariadne-bg-zinc-700 ariadne-bg-opacity-10 dark:ariadne-bg-opacity-10 ariadne-rounded-lg;
80
+ }
81
+
82
+ .typography pre code::before,
83
+ .typography pre code::after {
84
+ @apply ariadne-content-none;
85
+ }
86
+
87
+ .typography table {
88
+ @apply ariadne-w-full ariadne-table-auto ariadne-text-left;
89
+ }
90
+
91
+ .typography thead {
92
+ @apply ariadne-border-b ariadne-border-b-slate-50/10;
93
+ }
94
+
95
+ .typography thead th {
96
+ @apply ariadne-font-semibold ariadne-align-bottom ariadne-py-1;
97
+ }
98
+
99
+ .typography tbody tr {
100
+ @apply ariadne-border-b ariadne-border-b-slate-50/10;
101
+ }
102
+
103
+ .typography tbody tr:last-child {
104
+ @apply ariadne-border-b-0;
105
+ }
106
+
107
+ .typography tbody td {
108
+ @apply ariadne-align-baseline ariadne-py-1;
109
+ }
110
+
111
+ .typography tfoot {
112
+ @apply ariadne-border-t;
113
+ }
114
+
115
+ .typography tfoot td {
116
+ @apply ariadne-align-top;
117
+ }
@@ -0,0 +1,95 @@
1
+ import type * as H from 'hotscript'
2
+
3
+ import {Controller} from '@hotwired/stimulus'
4
+ import {type Fn} from 'hotscript'
5
+
6
+ type ObjIterator<T, Y extends Fn> = H.Pipe<
7
+ T,
8
+ [H.Objects.Entries, H.Unions.ToTuple, H.Tuples.FlatMap<Y>, H.Tuples.ToUnion, H.Objects.FromEntries]
9
+ >
10
+
11
+ /*
12
+ * Covering `has<Name>` and `<name>Value` for Stimulus values.
13
+ */
14
+ interface ValuesFn extends Fn {
15
+ return: [
16
+ [`${this['arg0'][0]}Value`, ReturnType<this['arg0'][1]>],
17
+ [`has${Capitalize<this['arg0'][0]>}Value`, boolean],
18
+ ]
19
+ }
20
+ /*
21
+ * Covering `has<Name>`, `<name>Target` and `<name>Targets` for Stimulus targets.
22
+ */
23
+ interface TargetsFn extends Fn {
24
+ return: [
25
+ [`has${Capitalize<this['arg0'][0]>}Target`, boolean],
26
+ [`${this['arg0'][0]}Target`, this['arg0'][1] extends null ? HTMLElement : InstanceType<this['arg0'][1]>],
27
+ [`${this['arg0'][0]}Targets`, this['arg0'][1] extends null ? HTMLElement[] : InstanceType<this['arg0'][1]>[]],
28
+ ]
29
+ }
30
+
31
+ type TargetsConfig = Record<string, (new () => HTMLElement) | null>
32
+ type ValuesConfig = Record<string, unknown>
33
+
34
+ type ControllerWithTargets<E extends HTMLElement, T extends TargetsConfig, Y extends ValuesConfig> = Controller<E> &
35
+ ObjIterator<T, TargetsFn> &
36
+ ObjIterator<Y, ValuesFn>
37
+
38
+ /**
39
+ * Creates a new Stimulus controller class with automatically defined target properties.
40
+ * The function takes an array of target identifiers, which can be either strings or tuples.
41
+ * For each target, it creates three properties on the controller class:
42
+ * - `<name>Target` for single target elements,
43
+ * - `<name>Targets` for all target elements,
44
+ * - `has<Name>Target` as a boolean indicating the presence of the target.
45
+ *
46
+ * The single target elements are typed according to the provided class in the tuple,
47
+ * or as HTMLElement by default if a string is provided.
48
+ *
49
+ * @returns {Function} A new controller class extending the base Stimulus controller with the defined target properties.
50
+ *
51
+ * @example
52
+ * export default class extends controllerFactory<HTMLDivElement>()({
53
+ * targets: {
54
+ * one: null,
55
+ * two: HTMLInputElement,
56
+ * three: HTMLButtonElement
57
+ * },
58
+ * values: {
59
+ * key: String,
60
+ * }
61
+ *}) {
62
+ * example() {
63
+ * this.oneTarget // <- HTMLElement
64
+ * this.twoTarget // <- HTMLInputElement
65
+ * this.threeTarget // <- HTMLButtonElement
66
+ *
67
+ * this.hasOneTarget // <- boolean
68
+ * this.oneTargets // <- HTMLElement[]
69
+ *
70
+ * this.hasKeyValue // <- boolean
71
+ * this.keyValue // <- string
72
+ *
73
+ * this.element // <- HTMLDivElement
74
+ * }
75
+ *}
76
+ */
77
+ export function controllerFactory<E extends HTMLElement>() {
78
+ return function createControllerClass<
79
+ const T extends TargetsConfig = TargetsConfig,
80
+ const Y extends ValuesConfig = ValuesConfig,
81
+ >({
82
+ targets,
83
+ values,
84
+ }: {
85
+ targets?: T
86
+ values?: Y
87
+ } = {}): new () => ControllerWithTargets<E, T, Y> {
88
+ class ExtendedController extends Controller<E> {
89
+ static targets = Object.keys(targets ?? {})
90
+ static values = values ?? {}
91
+ }
92
+
93
+ return ExtendedController as unknown as new () => ControllerWithTargets<E, T, Y>
94
+ }
95
+ }
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ariadne
4
+ # :nocov:
5
+ # :nodoc:
6
+ module FormHelper
7
+ def ariadne_form_with(**kwargs, &block)
8
+ form_with(**kwargs, skip_default_ids: false, builder: Ariadne::Forms::Builder, &block)
9
+ end
10
+
11
+ def ariadne_fields_for(record_name, record_object = nil, options = {}, &block)
12
+ fields_for(
13
+ record_name,
14
+ record_object,
15
+ options.merge(
16
+ skip_default_ids: false,
17
+ builder: Ariadne::Forms::Builder,
18
+ ),
19
+ &block
20
+ )
21
+ end
22
+
23
+ def inline_form(*args, &block)
24
+ Ariadne::Form.inline_form(*args, &block)
25
+ end
26
+
27
+ def render_inline_form(*args, &block)
28
+ render(inline_form(*args, &block))
29
+ end
30
+ end
31
+ end