uikit_rails 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +301 -0
  3. data/Rakefile +12 -0
  4. data/app/controllers/uikit_rails/styleguide_controller.rb +72 -0
  5. data/app/views/layouts/uikit_rails/application.html.erb +412 -0
  6. data/app/views/uikit_rails/styleguide/index.html.erb +27 -0
  7. data/app/views/uikit_rails/styleguide/show.html.erb +56 -0
  8. data/config/routes.rb +6 -0
  9. data/lib/uikit_rails/engine.rb +13 -0
  10. data/lib/uikit_rails/generators/add_generator.rb +110 -0
  11. data/lib/uikit_rails/generators/install_generator.rb +62 -0
  12. data/lib/uikit_rails/generators/templates/base_component.rb.tt +32 -0
  13. data/lib/uikit_rails/generators/templates/uikit_rails.css.tt +69 -0
  14. data/lib/uikit_rails/templates/components/accordion/USAGE +30 -0
  15. data/lib/uikit_rails/templates/components/accordion/accordion.css +74 -0
  16. data/lib/uikit_rails/templates/components/accordion/component.html.erb +13 -0
  17. data/lib/uikit_rails/templates/components/accordion/component.rb +35 -0
  18. data/lib/uikit_rails/templates/components/accordion/preview.yml +81 -0
  19. data/lib/uikit_rails/templates/components/alert/USAGE +25 -0
  20. data/lib/uikit_rails/templates/components/alert/alert.css +60 -0
  21. data/lib/uikit_rails/templates/components/alert/component.html.erb +9 -0
  22. data/lib/uikit_rails/templates/components/alert/component.rb +27 -0
  23. data/lib/uikit_rails/templates/components/alert/preview.yml +53 -0
  24. data/lib/uikit_rails/templates/components/alert_dialog/USAGE +38 -0
  25. data/lib/uikit_rails/templates/components/alert_dialog/alert_dialog.css +108 -0
  26. data/lib/uikit_rails/templates/components/alert_dialog/component.html.erb +27 -0
  27. data/lib/uikit_rails/templates/components/alert_dialog/component.rb +23 -0
  28. data/lib/uikit_rails/templates/components/alert_dialog/preview.yml +94 -0
  29. data/lib/uikit_rails/templates/components/avatar/USAGE +20 -0
  30. data/lib/uikit_rails/templates/components/avatar/avatar.css +53 -0
  31. data/lib/uikit_rails/templates/components/avatar/component.html.erb +7 -0
  32. data/lib/uikit_rails/templates/components/avatar/component.rb +31 -0
  33. data/lib/uikit_rails/templates/components/avatar/preview.yml +42 -0
  34. data/lib/uikit_rails/templates/components/badge/USAGE +13 -0
  35. data/lib/uikit_rails/templates/components/badge/badge.css +61 -0
  36. data/lib/uikit_rails/templates/components/badge/component.rb +28 -0
  37. data/lib/uikit_rails/templates/components/badge/preview.yml +38 -0
  38. data/lib/uikit_rails/templates/components/breadcrumb/USAGE +23 -0
  39. data/lib/uikit_rails/templates/components/breadcrumb/breadcrumb.css +55 -0
  40. data/lib/uikit_rails/templates/components/breadcrumb/component.html.erb +14 -0
  41. data/lib/uikit_rails/templates/components/breadcrumb/component.rb +40 -0
  42. data/lib/uikit_rails/templates/components/breadcrumb/preview.yml +42 -0
  43. data/lib/uikit_rails/templates/components/button/USAGE +21 -0
  44. data/lib/uikit_rails/templates/components/button/button.css +125 -0
  45. data/lib/uikit_rails/templates/components/button/component.rb +44 -0
  46. data/lib/uikit_rails/templates/components/button/preview.yml +106 -0
  47. data/lib/uikit_rails/templates/components/card/USAGE +33 -0
  48. data/lib/uikit_rails/templates/components/card/card.css +63 -0
  49. data/lib/uikit_rails/templates/components/card/component.html.erb +16 -0
  50. data/lib/uikit_rails/templates/components/card/component.rb +26 -0
  51. data/lib/uikit_rails/templates/components/card/preview.yml +57 -0
  52. data/lib/uikit_rails/templates/components/checkbox/USAGE +19 -0
  53. data/lib/uikit_rails/templates/components/checkbox/checkbox.css +67 -0
  54. data/lib/uikit_rails/templates/components/checkbox/component.html.erb +6 -0
  55. data/lib/uikit_rails/templates/components/checkbox/component.rb +26 -0
  56. data/lib/uikit_rails/templates/components/checkbox/preview.yml +43 -0
  57. data/lib/uikit_rails/templates/components/collapsible/USAGE +31 -0
  58. data/lib/uikit_rails/templates/components/collapsible/collapsible.css +55 -0
  59. data/lib/uikit_rails/templates/components/collapsible/component.html.erb +8 -0
  60. data/lib/uikit_rails/templates/components/collapsible/component.rb +18 -0
  61. data/lib/uikit_rails/templates/components/collapsible/preview.yml +65 -0
  62. data/lib/uikit_rails/templates/components/dialog/USAGE +41 -0
  63. data/lib/uikit_rails/templates/components/dialog/component.html.erb +23 -0
  64. data/lib/uikit_rails/templates/components/dialog/component.rb +20 -0
  65. data/lib/uikit_rails/templates/components/dialog/dialog.css +133 -0
  66. data/lib/uikit_rails/templates/components/dialog/preview.yml +77 -0
  67. data/lib/uikit_rails/templates/components/dropdown/USAGE +40 -0
  68. data/lib/uikit_rails/templates/components/dropdown/component.html.erb +14 -0
  69. data/lib/uikit_rails/templates/components/dropdown/component.rb +62 -0
  70. data/lib/uikit_rails/templates/components/dropdown/dropdown.css +104 -0
  71. data/lib/uikit_rails/templates/components/dropdown/preview.yml +75 -0
  72. data/lib/uikit_rails/templates/components/form/USAGE +51 -0
  73. data/lib/uikit_rails/templates/components/form/builder.rb +233 -0
  74. data/lib/uikit_rails/templates/components/form/form.css +48 -0
  75. data/lib/uikit_rails/templates/components/form/preview.yml +95 -0
  76. data/lib/uikit_rails/templates/components/input/USAGE +21 -0
  77. data/lib/uikit_rails/templates/components/input/component.rb +25 -0
  78. data/lib/uikit_rails/templates/components/input/input.css +43 -0
  79. data/lib/uikit_rails/templates/components/input/preview.yml +58 -0
  80. data/lib/uikit_rails/templates/components/label/USAGE +16 -0
  81. data/lib/uikit_rails/templates/components/label/component.rb +25 -0
  82. data/lib/uikit_rails/templates/components/label/label.css +25 -0
  83. data/lib/uikit_rails/templates/components/label/preview.yml +34 -0
  84. data/lib/uikit_rails/templates/components/pagination/USAGE +45 -0
  85. data/lib/uikit_rails/templates/components/pagination/component.html.erb +7 -0
  86. data/lib/uikit_rails/templates/components/pagination/component.rb +90 -0
  87. data/lib/uikit_rails/templates/components/pagination/pagination.css +89 -0
  88. data/lib/uikit_rails/templates/components/pagination/preview.yml +61 -0
  89. data/lib/uikit_rails/templates/components/popover/USAGE +44 -0
  90. data/lib/uikit_rails/templates/components/popover/component.html.erb +8 -0
  91. data/lib/uikit_rails/templates/components/popover/component.rb +19 -0
  92. data/lib/uikit_rails/templates/components/popover/popover.css +94 -0
  93. data/lib/uikit_rails/templates/components/popover/preview.yml +102 -0
  94. data/lib/uikit_rails/templates/components/progress/USAGE +15 -0
  95. data/lib/uikit_rails/templates/components/progress/component.html.erb +3 -0
  96. data/lib/uikit_rails/templates/components/progress/component.rb +38 -0
  97. data/lib/uikit_rails/templates/components/progress/preview.yml +44 -0
  98. data/lib/uikit_rails/templates/components/progress/progress.css +20 -0
  99. data/lib/uikit_rails/templates/components/select/USAGE +19 -0
  100. data/lib/uikit_rails/templates/components/select/component.rb +38 -0
  101. data/lib/uikit_rails/templates/components/select/preview.yml +61 -0
  102. data/lib/uikit_rails/templates/components/select/select.css +46 -0
  103. data/lib/uikit_rails/templates/components/separator/USAGE +15 -0
  104. data/lib/uikit_rails/templates/components/separator/component.rb +34 -0
  105. data/lib/uikit_rails/templates/components/separator/preview.yml +32 -0
  106. data/lib/uikit_rails/templates/components/separator/separator.css +21 -0
  107. data/lib/uikit_rails/templates/components/sheet/USAGE +44 -0
  108. data/lib/uikit_rails/templates/components/sheet/component.html.erb +23 -0
  109. data/lib/uikit_rails/templates/components/sheet/component.rb +23 -0
  110. data/lib/uikit_rails/templates/components/sheet/preview.yml +105 -0
  111. data/lib/uikit_rails/templates/components/sheet/sheet.css +193 -0
  112. data/lib/uikit_rails/templates/components/skeleton/USAGE +19 -0
  113. data/lib/uikit_rails/templates/components/skeleton/component.rb +38 -0
  114. data/lib/uikit_rails/templates/components/skeleton/preview.yml +44 -0
  115. data/lib/uikit_rails/templates/components/skeleton/skeleton.css +25 -0
  116. data/lib/uikit_rails/templates/components/switch/USAGE +19 -0
  117. data/lib/uikit_rails/templates/components/switch/component.html.erb +19 -0
  118. data/lib/uikit_rails/templates/components/switch/component.rb +23 -0
  119. data/lib/uikit_rails/templates/components/switch/preview.yml +43 -0
  120. data/lib/uikit_rails/templates/components/switch/switch.css +81 -0
  121. data/lib/uikit_rails/templates/components/table/USAGE +40 -0
  122. data/lib/uikit_rails/templates/components/table/component.html.erb +14 -0
  123. data/lib/uikit_rails/templates/components/table/component.rb +25 -0
  124. data/lib/uikit_rails/templates/components/table/preview.yml +109 -0
  125. data/lib/uikit_rails/templates/components/table/table.css +86 -0
  126. data/lib/uikit_rails/templates/components/tabs/USAGE +24 -0
  127. data/lib/uikit_rails/templates/components/tabs/component.html.erb +10 -0
  128. data/lib/uikit_rails/templates/components/tabs/component.rb +35 -0
  129. data/lib/uikit_rails/templates/components/tabs/preview.yml +60 -0
  130. data/lib/uikit_rails/templates/components/tabs/tabs.css +72 -0
  131. data/lib/uikit_rails/templates/components/textarea/USAGE +19 -0
  132. data/lib/uikit_rails/templates/components/textarea/component.rb +25 -0
  133. data/lib/uikit_rails/templates/components/textarea/preview.yml +47 -0
  134. data/lib/uikit_rails/templates/components/textarea/textarea.css +39 -0
  135. data/lib/uikit_rails/templates/components/toggle/USAGE +25 -0
  136. data/lib/uikit_rails/templates/components/toggle/component.rb +39 -0
  137. data/lib/uikit_rails/templates/components/toggle/preview.yml +81 -0
  138. data/lib/uikit_rails/templates/components/toggle/toggle.css +89 -0
  139. data/lib/uikit_rails/templates/components/tooltip/USAGE +23 -0
  140. data/lib/uikit_rails/templates/components/tooltip/component.html.erb +8 -0
  141. data/lib/uikit_rails/templates/components/tooltip/component.rb +19 -0
  142. data/lib/uikit_rails/templates/components/tooltip/preview.yml +52 -0
  143. data/lib/uikit_rails/templates/components/tooltip/tooltip.css +78 -0
  144. data/lib/uikit_rails/templates/stimulus/accordion_controller.js +19 -0
  145. data/lib/uikit_rails/templates/stimulus/alert_dialog_controller.js +25 -0
  146. data/lib/uikit_rails/templates/stimulus/collapsible_controller.js +9 -0
  147. data/lib/uikit_rails/templates/stimulus/dialog_controller.js +19 -0
  148. data/lib/uikit_rails/templates/stimulus/dropdown_controller.js +47 -0
  149. data/lib/uikit_rails/templates/stimulus/popover_controller.js +47 -0
  150. data/lib/uikit_rails/templates/stimulus/sheet_controller.js +19 -0
  151. data/lib/uikit_rails/templates/stimulus/tabs_controller.js +24 -0
  152. data/lib/uikit_rails/templates/stimulus/tooltip_controller.js +13 -0
  153. data/lib/uikit_rails/version.rb +5 -0
  154. data/lib/uikit_rails.rb +59 -0
  155. data/sig/uikit_rails.rbs +4 -0
  156. data/test_app/.dockerignore +51 -0
  157. data/test_app/.gitattributes +9 -0
  158. data/test_app/.github/dependabot.yml +12 -0
  159. data/test_app/.github/workflows/ci.yml +124 -0
  160. data/test_app/.gitignore +35 -0
  161. data/test_app/.kamal/hooks/docker-setup.sample +3 -0
  162. data/test_app/.kamal/hooks/post-app-boot.sample +3 -0
  163. data/test_app/.kamal/hooks/post-deploy.sample +14 -0
  164. data/test_app/.kamal/hooks/post-proxy-reboot.sample +3 -0
  165. data/test_app/.kamal/hooks/pre-app-boot.sample +3 -0
  166. data/test_app/.kamal/hooks/pre-build.sample +51 -0
  167. data/test_app/.kamal/hooks/pre-connect.sample +47 -0
  168. data/test_app/.kamal/hooks/pre-deploy.sample +122 -0
  169. data/test_app/.kamal/hooks/pre-proxy-reboot.sample +3 -0
  170. data/test_app/.kamal/secrets +20 -0
  171. data/test_app/.rubocop.yml +8 -0
  172. data/test_app/.ruby-version +1 -0
  173. data/test_app/Dockerfile +77 -0
  174. data/test_app/Gemfile +68 -0
  175. data/test_app/Gemfile.lock +587 -0
  176. data/test_app/README.md +24 -0
  177. data/test_app/Rakefile +6 -0
  178. data/test_app/app/assets/images/.keep +0 -0
  179. data/test_app/app/assets/stylesheets/application.css +10 -0
  180. data/test_app/app/assets/stylesheets/ui/accordion.css +74 -0
  181. data/test_app/app/assets/stylesheets/ui/alert.css +60 -0
  182. data/test_app/app/assets/stylesheets/ui/alert_dialog.css +108 -0
  183. data/test_app/app/assets/stylesheets/ui/avatar.css +53 -0
  184. data/test_app/app/assets/stylesheets/ui/badge.css +61 -0
  185. data/test_app/app/assets/stylesheets/ui/breadcrumb.css +55 -0
  186. data/test_app/app/assets/stylesheets/ui/button.css +125 -0
  187. data/test_app/app/assets/stylesheets/ui/card.css +63 -0
  188. data/test_app/app/assets/stylesheets/ui/checkbox.css +67 -0
  189. data/test_app/app/assets/stylesheets/ui/collapsible.css +55 -0
  190. data/test_app/app/assets/stylesheets/ui/dialog.css +133 -0
  191. data/test_app/app/assets/stylesheets/ui/dropdown.css +104 -0
  192. data/test_app/app/assets/stylesheets/ui/form.css +48 -0
  193. data/test_app/app/assets/stylesheets/ui/input.css +43 -0
  194. data/test_app/app/assets/stylesheets/ui/label.css +25 -0
  195. data/test_app/app/assets/stylesheets/ui/pagination.css +89 -0
  196. data/test_app/app/assets/stylesheets/ui/popover.css +94 -0
  197. data/test_app/app/assets/stylesheets/ui/progress.css +20 -0
  198. data/test_app/app/assets/stylesheets/ui/select.css +46 -0
  199. data/test_app/app/assets/stylesheets/ui/separator.css +21 -0
  200. data/test_app/app/assets/stylesheets/ui/sheet.css +193 -0
  201. data/test_app/app/assets/stylesheets/ui/skeleton.css +25 -0
  202. data/test_app/app/assets/stylesheets/ui/switch.css +81 -0
  203. data/test_app/app/assets/stylesheets/ui/table.css +86 -0
  204. data/test_app/app/assets/stylesheets/ui/tabs.css +72 -0
  205. data/test_app/app/assets/stylesheets/ui/textarea.css +39 -0
  206. data/test_app/app/assets/stylesheets/ui/toggle.css +89 -0
  207. data/test_app/app/assets/stylesheets/ui/tooltip.css +78 -0
  208. data/test_app/app/assets/stylesheets/uikit_rails.css +69 -0
  209. data/test_app/app/components/ui/accordion/component.html.erb +13 -0
  210. data/test_app/app/components/ui/accordion/component.rb +35 -0
  211. data/test_app/app/components/ui/accordion/preview.yml +81 -0
  212. data/test_app/app/components/ui/alert/component.html.erb +9 -0
  213. data/test_app/app/components/ui/alert/component.rb +27 -0
  214. data/test_app/app/components/ui/alert/preview.yml +53 -0
  215. data/test_app/app/components/ui/alert_dialog/component.html.erb +27 -0
  216. data/test_app/app/components/ui/alert_dialog/component.rb +23 -0
  217. data/test_app/app/components/ui/alert_dialog/preview.yml +94 -0
  218. data/test_app/app/components/ui/avatar/component.html.erb +7 -0
  219. data/test_app/app/components/ui/avatar/component.rb +31 -0
  220. data/test_app/app/components/ui/avatar/preview.yml +42 -0
  221. data/test_app/app/components/ui/badge/component.rb +28 -0
  222. data/test_app/app/components/ui/badge/preview.yml +38 -0
  223. data/test_app/app/components/ui/base_component.rb +32 -0
  224. data/test_app/app/components/ui/breadcrumb/component.html.erb +14 -0
  225. data/test_app/app/components/ui/breadcrumb/component.rb +40 -0
  226. data/test_app/app/components/ui/breadcrumb/preview.yml +42 -0
  227. data/test_app/app/components/ui/button/component.rb +44 -0
  228. data/test_app/app/components/ui/button/preview.yml +106 -0
  229. data/test_app/app/components/ui/card/component.html.erb +16 -0
  230. data/test_app/app/components/ui/card/component.rb +26 -0
  231. data/test_app/app/components/ui/card/preview.yml +57 -0
  232. data/test_app/app/components/ui/checkbox/component.html.erb +6 -0
  233. data/test_app/app/components/ui/checkbox/component.rb +26 -0
  234. data/test_app/app/components/ui/checkbox/preview.yml +43 -0
  235. data/test_app/app/components/ui/collapsible/component.html.erb +8 -0
  236. data/test_app/app/components/ui/collapsible/component.rb +18 -0
  237. data/test_app/app/components/ui/collapsible/preview.yml +65 -0
  238. data/test_app/app/components/ui/dialog/component.html.erb +23 -0
  239. data/test_app/app/components/ui/dialog/component.rb +20 -0
  240. data/test_app/app/components/ui/dialog/preview.yml +77 -0
  241. data/test_app/app/components/ui/dropdown/component.html.erb +14 -0
  242. data/test_app/app/components/ui/dropdown/component.rb +62 -0
  243. data/test_app/app/components/ui/dropdown/preview.yml +75 -0
  244. data/test_app/app/components/ui/form/USAGE +51 -0
  245. data/test_app/app/components/ui/form/builder.rb +233 -0
  246. data/test_app/app/components/ui/form/component.rb +258 -0
  247. data/test_app/app/components/ui/form/form.css +48 -0
  248. data/test_app/app/components/ui/form/preview.yml +95 -0
  249. data/test_app/app/components/ui/input/component.rb +25 -0
  250. data/test_app/app/components/ui/input/preview.yml +58 -0
  251. data/test_app/app/components/ui/label/component.rb +25 -0
  252. data/test_app/app/components/ui/label/preview.yml +34 -0
  253. data/test_app/app/components/ui/pagination/component.html.erb +7 -0
  254. data/test_app/app/components/ui/pagination/component.rb +90 -0
  255. data/test_app/app/components/ui/pagination/preview.yml +61 -0
  256. data/test_app/app/components/ui/popover/component.html.erb +8 -0
  257. data/test_app/app/components/ui/popover/component.rb +19 -0
  258. data/test_app/app/components/ui/popover/preview.yml +102 -0
  259. data/test_app/app/components/ui/progress/component.html.erb +3 -0
  260. data/test_app/app/components/ui/progress/component.rb +38 -0
  261. data/test_app/app/components/ui/progress/preview.yml +44 -0
  262. data/test_app/app/components/ui/select/component.rb +38 -0
  263. data/test_app/app/components/ui/select/preview.yml +61 -0
  264. data/test_app/app/components/ui/separator/component.rb +34 -0
  265. data/test_app/app/components/ui/separator/preview.yml +32 -0
  266. data/test_app/app/components/ui/sheet/component.html.erb +23 -0
  267. data/test_app/app/components/ui/sheet/component.rb +23 -0
  268. data/test_app/app/components/ui/sheet/preview.yml +105 -0
  269. data/test_app/app/components/ui/skeleton/component.rb +38 -0
  270. data/test_app/app/components/ui/skeleton/preview.yml +44 -0
  271. data/test_app/app/components/ui/switch/component.html.erb +19 -0
  272. data/test_app/app/components/ui/switch/component.rb +23 -0
  273. data/test_app/app/components/ui/switch/preview.yml +43 -0
  274. data/test_app/app/components/ui/table/component.html.erb +14 -0
  275. data/test_app/app/components/ui/table/component.rb +25 -0
  276. data/test_app/app/components/ui/table/preview.yml +109 -0
  277. data/test_app/app/components/ui/tabs/component.html.erb +10 -0
  278. data/test_app/app/components/ui/tabs/component.rb +35 -0
  279. data/test_app/app/components/ui/tabs/preview.yml +60 -0
  280. data/test_app/app/components/ui/textarea/component.rb +25 -0
  281. data/test_app/app/components/ui/textarea/preview.yml +47 -0
  282. data/test_app/app/components/ui/toggle/component.rb +39 -0
  283. data/test_app/app/components/ui/toggle/preview.yml +81 -0
  284. data/test_app/app/components/ui/tooltip/component.html.erb +8 -0
  285. data/test_app/app/components/ui/tooltip/component.rb +19 -0
  286. data/test_app/app/components/ui/tooltip/preview.yml +52 -0
  287. data/test_app/app/controllers/application_controller.rb +7 -0
  288. data/test_app/app/controllers/concerns/.keep +0 -0
  289. data/test_app/app/helpers/application_helper.rb +2 -0
  290. data/test_app/app/javascript/application.js +3 -0
  291. data/test_app/app/javascript/controllers/application.js +9 -0
  292. data/test_app/app/javascript/controllers/hello_controller.js +7 -0
  293. data/test_app/app/javascript/controllers/index.js +4 -0
  294. data/test_app/app/javascript/controllers/ui/accordion_controller.js +19 -0
  295. data/test_app/app/javascript/controllers/ui/alert_dialog_controller.js +25 -0
  296. data/test_app/app/javascript/controllers/ui/collapsible_controller.js +9 -0
  297. data/test_app/app/javascript/controllers/ui/dialog_controller.js +19 -0
  298. data/test_app/app/javascript/controllers/ui/dropdown_controller.js +47 -0
  299. data/test_app/app/javascript/controllers/ui/popover_controller.js +47 -0
  300. data/test_app/app/javascript/controllers/ui/sheet_controller.js +19 -0
  301. data/test_app/app/javascript/controllers/ui/tabs_controller.js +24 -0
  302. data/test_app/app/javascript/controllers/ui/tooltip_controller.js +13 -0
  303. data/test_app/app/jobs/application_job.rb +7 -0
  304. data/test_app/app/mailers/application_mailer.rb +4 -0
  305. data/test_app/app/models/application_record.rb +3 -0
  306. data/test_app/app/models/concerns/.keep +0 -0
  307. data/test_app/app/views/layouts/application.html.erb +29 -0
  308. data/test_app/app/views/layouts/mailer.html.erb +13 -0
  309. data/test_app/app/views/layouts/mailer.text.erb +1 -0
  310. data/test_app/app/views/pwa/manifest.json.erb +22 -0
  311. data/test_app/app/views/pwa/service-worker.js +26 -0
  312. data/test_app/bin/brakeman +7 -0
  313. data/test_app/bin/bundler-audit +6 -0
  314. data/test_app/bin/ci +6 -0
  315. data/test_app/bin/dev +2 -0
  316. data/test_app/bin/docker-entrypoint +8 -0
  317. data/test_app/bin/importmap +4 -0
  318. data/test_app/bin/jobs +6 -0
  319. data/test_app/bin/kamal +16 -0
  320. data/test_app/bin/rails +4 -0
  321. data/test_app/bin/rake +4 -0
  322. data/test_app/bin/rubocop +8 -0
  323. data/test_app/bin/setup +35 -0
  324. data/test_app/bin/thrust +5 -0
  325. data/test_app/config/application.rb +27 -0
  326. data/test_app/config/boot.rb +4 -0
  327. data/test_app/config/bundler-audit.yml +5 -0
  328. data/test_app/config/cable.yml +17 -0
  329. data/test_app/config/cache.yml +16 -0
  330. data/test_app/config/ci.rb +24 -0
  331. data/test_app/config/credentials.yml.enc +1 -0
  332. data/test_app/config/database.yml +40 -0
  333. data/test_app/config/deploy.yml +119 -0
  334. data/test_app/config/environment.rb +5 -0
  335. data/test_app/config/environments/development.rb +78 -0
  336. data/test_app/config/environments/production.rb +90 -0
  337. data/test_app/config/environments/test.rb +53 -0
  338. data/test_app/config/importmap.rb +7 -0
  339. data/test_app/config/initializers/assets.rb +7 -0
  340. data/test_app/config/initializers/content_security_policy.rb +29 -0
  341. data/test_app/config/initializers/filter_parameter_logging.rb +8 -0
  342. data/test_app/config/initializers/inflections.rb +16 -0
  343. data/test_app/config/locales/en.yml +31 -0
  344. data/test_app/config/puma.rb +42 -0
  345. data/test_app/config/queue.yml +18 -0
  346. data/test_app/config/recurring.yml +15 -0
  347. data/test_app/config/routes.rb +13 -0
  348. data/test_app/config/storage.yml +27 -0
  349. data/test_app/config.ru +6 -0
  350. data/test_app/db/cable_schema.rb +11 -0
  351. data/test_app/db/cache_schema.rb +12 -0
  352. data/test_app/db/queue_schema.rb +129 -0
  353. data/test_app/db/seeds.rb +9 -0
  354. data/test_app/lib/tasks/.keep +0 -0
  355. data/test_app/log/.keep +0 -0
  356. data/test_app/public/400.html +135 -0
  357. data/test_app/public/404.html +135 -0
  358. data/test_app/public/406-unsupported-browser.html +135 -0
  359. data/test_app/public/422.html +135 -0
  360. data/test_app/public/500.html +135 -0
  361. data/test_app/public/icon.png +0 -0
  362. data/test_app/public/icon.svg +3 -0
  363. data/test_app/public/robots.txt +1 -0
  364. data/test_app/script/.keep +0 -0
  365. data/test_app/storage/.keep +0 -0
  366. data/test_app/test/controllers/.keep +0 -0
  367. data/test_app/test/fixtures/files/.keep +0 -0
  368. data/test_app/test/helpers/.keep +0 -0
  369. data/test_app/test/integration/.keep +0 -0
  370. data/test_app/test/mailers/.keep +0 -0
  371. data/test_app/test/models/.keep +0 -0
  372. data/test_app/test/test_helper.rb +15 -0
  373. data/test_app/tmp/.keep +0 -0
  374. data/test_app/tmp/pids/.keep +0 -0
  375. data/test_app/tmp/storage/.keep +0 -0
  376. data/test_app/vendor/.keep +0 -0
  377. data/test_app/vendor/javascript/.keep +0 -0
  378. metadata +448 -0
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ui
4
+ module Tabs
5
+ # Tabbed content panels.
6
+ class Component < Ui::BaseComponent
7
+ renders_many :tabs, lambda { |id:, label:, **html_attrs|
8
+ Tab.new(id: id, label: label, **html_attrs)
9
+ }
10
+
11
+ attr_reader :default_tab, :html_attrs
12
+
13
+ def initialize(default_tab: nil, **html_attrs)
14
+ @default_tab = default_tab
15
+ @html_attrs = html_attrs
16
+ super()
17
+ end
18
+
19
+ class Tab < Ui::BaseComponent
20
+ attr_reader :id, :label, :html_attrs
21
+
22
+ def initialize(id:, label:, **html_attrs)
23
+ @id = id
24
+ @label = label
25
+ @html_attrs = html_attrs
26
+ super()
27
+ end
28
+
29
+ def call
30
+ content
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,60 @@
1
+ description: Tabbed content panels for organizing related content into switchable views. Supports keyboard navigation and ARIA roles.
2
+
3
+ sections:
4
+ - title: Basic Tabs
5
+ examples:
6
+ - title: Default tabs
7
+ code: |
8
+ <%= render Ui::Tabs::Component.new do |tabs| %>
9
+ <% tabs.with_tab(id: "account", label: "Account") do %>
10
+ <p>Manage your account settings and preferences.</p>
11
+ <% end %>
12
+ <% tabs.with_tab(id: "password", label: "Password") do %>
13
+ <p>Change your password and security settings.</p>
14
+ <% end %>
15
+ <% tabs.with_tab(id: "notifications", label: "Notifications") do %>
16
+ <p>Configure how you receive notifications.</p>
17
+ <% end %>
18
+ <% end %>
19
+
20
+ - title: Default Active Tab
21
+ examples:
22
+ - title: Second tab active by default
23
+ code: |
24
+ <%= render Ui::Tabs::Component.new(default_tab: "password") do |tabs| %>
25
+ <% tabs.with_tab(id: "account", label: "Account") do %>
26
+ <p>Account details go here.</p>
27
+ <% end %>
28
+ <% tabs.with_tab(id: "password", label: "Password") do %>
29
+ <p>Password settings are shown first.</p>
30
+ <% end %>
31
+ <% end %>
32
+
33
+ - title: Rich Content
34
+ examples:
35
+ - title: Tabs with forms and actions
36
+ code: |
37
+ <%= render Ui::Tabs::Component.new do |tabs| %>
38
+ <% tabs.with_tab(id: "profile", label: "Profile") do %>
39
+ <div style="max-width: 24rem;">
40
+ <p style="margin-bottom: 1rem;">Update your profile information.</p>
41
+ <%= render Ui::Button::Component.new(size: :sm) do %>Save Changes<% end %>
42
+ </div>
43
+ <% end %>
44
+ <% tabs.with_tab(id: "billing", label: "Billing") do %>
45
+ <p>View and manage your billing information and invoices.</p>
46
+ <% end %>
47
+ <% end %>
48
+
49
+ - title: Custom Attributes
50
+ examples:
51
+ - title: With custom class
52
+ code: |
53
+ <%= render Ui::Tabs::Component.new(class: "my-custom-tabs", data: { turbo: false }) do |tabs| %>
54
+ <% tabs.with_tab(id: "tab1", label: "First") do %>
55
+ <p>First tab content.</p>
56
+ <% end %>
57
+ <% tabs.with_tab(id: "tab2", label: "Second") do %>
58
+ <p>Second tab content.</p>
59
+ <% end %>
60
+ <% end %>
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ui
4
+ module Textarea
5
+ # Multi-line text input field.
6
+ class Component < Ui::BaseComponent
7
+ attr_reader :html_attrs
8
+
9
+ def initialize(**html_attrs)
10
+ @html_attrs = html_attrs
11
+ super()
12
+ end
13
+
14
+ def call
15
+ content_tag(:textarea, content, **computed_attrs)
16
+ end
17
+
18
+ private
19
+
20
+ def computed_attrs
21
+ merge_attrs({ class: "ui-textarea" }, html_attrs)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,47 @@
1
+ description: A styled multi-line text input. Supports all standard HTML textarea attributes including placeholder, rows, disabled, and name.
2
+
3
+ sections:
4
+ - title: Basic Usage
5
+ examples:
6
+ - title: Default textarea
7
+ code: |
8
+ <%= render Ui::Textarea::Component.new(placeholder: "Type your message here...") %>
9
+
10
+ - title: With rows
11
+ code: |
12
+ <%= render Ui::Textarea::Component.new(placeholder: "Write something...", rows: 6) %>
13
+
14
+ - title: With Content
15
+ examples:
16
+ - title: Pre-filled content
17
+ code: |
18
+ <%= render Ui::Textarea::Component.new(name: "bio") do %>This is pre-filled content.<% end %>
19
+
20
+ - title: With name and placeholder
21
+ code: |
22
+ <%= render Ui::Textarea::Component.new(name: "description", placeholder: "Describe your project...") %>
23
+
24
+ - title: States
25
+ examples:
26
+ - title: Disabled
27
+ code: |
28
+ <%= render Ui::Textarea::Component.new(placeholder: "Disabled textarea", disabled: true) %>
29
+
30
+ - title: Required
31
+ code: |
32
+ <%= render Ui::Textarea::Component.new(placeholder: "Required field", required: true) %>
33
+
34
+ - title: Readonly
35
+ code: |
36
+ <%= render Ui::Textarea::Component.new(readonly: true) do %>This content is read-only.<% end %>
37
+
38
+ - title: With Custom Attributes
39
+ examples:
40
+ - title: Custom class and data attributes
41
+ code: |
42
+ <%= render Ui::Textarea::Component.new(
43
+ placeholder: "Custom",
44
+ class: "my-custom-class",
45
+ data: { controller: "auto-resize" },
46
+ maxlength: 500
47
+ ) %>
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ui
4
+ module Toggle
5
+ # Pressable toggle button.
6
+ class Component < Ui::BaseComponent
7
+ VARIANTS = %i[default outline].freeze
8
+ SIZES = %i[sm md lg].freeze
9
+
10
+ attr_reader :variant, :size, :pressed, :html_attrs
11
+
12
+ def initialize(variant: :default, size: :md, pressed: false, **html_attrs)
13
+ @variant = variant.to_sym
14
+ @size = size.to_sym
15
+ @pressed = pressed
16
+ @html_attrs = html_attrs
17
+ super()
18
+ end
19
+
20
+ def call
21
+ content_tag(:button, content, **computed_attrs)
22
+ end
23
+
24
+ private
25
+
26
+ def computed_attrs
27
+ merge_attrs(
28
+ {
29
+ class: class_names("ui-toggle", "ui-toggle--#{variant}", "ui-toggle--#{size}",
30
+ "ui-toggle--pressed": pressed),
31
+ type: "button",
32
+ "aria-pressed": pressed.to_s
33
+ },
34
+ html_attrs
35
+ )
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,81 @@
1
+ description: A pressable toggle button with variants and sizes. Uses aria-pressed for accessibility. Ideal for toolbar actions or binary state controls.
2
+
3
+ sections:
4
+ - title: Basic Usage
5
+ examples:
6
+ - title: Default (unpressed)
7
+ code: |
8
+ <%= render Ui::Toggle::Component.new do %>
9
+ B
10
+ <% end %>
11
+
12
+ - title: Pressed
13
+ code: |
14
+ <%= render Ui::Toggle::Component.new(pressed: true) do %>
15
+ B
16
+ <% end %>
17
+
18
+ - title: Variants
19
+ examples:
20
+ - title: Default variant
21
+ code: |
22
+ <%= render Ui::Toggle::Component.new do %>
23
+ Italic
24
+ <% end %>
25
+
26
+ - title: Outline variant
27
+ code: |
28
+ <%= render Ui::Toggle::Component.new(variant: :outline) do %>
29
+ Italic
30
+ <% end %>
31
+
32
+ - title: Outline pressed
33
+ code: |
34
+ <%= render Ui::Toggle::Component.new(variant: :outline, pressed: true) do %>
35
+ Italic
36
+ <% end %>
37
+
38
+ - title: Sizes
39
+ examples:
40
+ - title: Small
41
+ code: |
42
+ <%= render Ui::Toggle::Component.new(size: :sm) do %>
43
+ S
44
+ <% end %>
45
+
46
+ - title: Medium (default)
47
+ code: |
48
+ <%= render Ui::Toggle::Component.new(size: :md) do %>
49
+ M
50
+ <% end %>
51
+
52
+ - title: Large
53
+ code: |
54
+ <%= render Ui::Toggle::Component.new(size: :lg) do %>
55
+ L
56
+ <% end %>
57
+
58
+ - title: Disabled State
59
+ examples:
60
+ - title: Disabled
61
+ code: |
62
+ <%= render Ui::Toggle::Component.new(disabled: true) do %>
63
+ Disabled
64
+ <% end %>
65
+
66
+ - title: Disabled pressed
67
+ code: |
68
+ <%= render Ui::Toggle::Component.new(pressed: true, disabled: true) do %>
69
+ Locked
70
+ <% end %>
71
+
72
+ - title: With Custom Attributes
73
+ examples:
74
+ - title: Custom data attributes
75
+ code: |
76
+ <%= render Ui::Toggle::Component.new(
77
+ variant: :outline,
78
+ data: { controller: "toolbar", action: "click->toolbar#toggleBold" }
79
+ ) do %>
80
+ B
81
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <div class="ui-tooltip" data-controller="ui--tooltip" <%= tag.attributes(html_attrs) %>>
2
+ <div class="ui-tooltip__trigger" data-action="mouseenter->ui--tooltip#show mouseleave->ui--tooltip#hide focusin->ui--tooltip#show focusout->ui--tooltip#hide">
3
+ <%= content %>
4
+ </div>
5
+ <div class="ui-tooltip__content ui-tooltip__content--<%= position %>" role="tooltip" data-ui--tooltip-target="content" hidden>
6
+ <%= text %>
7
+ </div>
8
+ </div>
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ui
4
+ module Tooltip
5
+ # Hover/focus tooltip popup.
6
+ class Component < Ui::BaseComponent
7
+ POSITIONS = %i[top bottom left right].freeze
8
+
9
+ attr_reader :text, :position, :html_attrs
10
+
11
+ def initialize(text:, position: :top, **html_attrs)
12
+ @text = text
13
+ @position = position.to_sym
14
+ @html_attrs = html_attrs
15
+ super()
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,52 @@
1
+ description: A hover/focus tooltip that displays additional information. Supports four positions (top, bottom, left, right) and works with any trigger content.
2
+
3
+ sections:
4
+ - title: Positions
5
+ examples:
6
+ - title: Top (default)
7
+ code: |
8
+ <%= render Ui::Tooltip::Component.new(text: "This is a tooltip") do %>
9
+ <%= render Ui::Button::Component.new(variant: :outline) do %>Hover me<% end %>
10
+ <% end %>
11
+
12
+ - title: Bottom
13
+ code: |
14
+ <%= render Ui::Tooltip::Component.new(text: "Bottom tooltip", position: :bottom) do %>
15
+ <%= render Ui::Button::Component.new(variant: :outline) do %>Bottom<% end %>
16
+ <% end %>
17
+
18
+ - title: Left
19
+ code: |
20
+ <div style="padding-left: 10rem;">
21
+ <%= render Ui::Tooltip::Component.new(text: "Left tooltip", position: :left) do %>
22
+ <%= render Ui::Button::Component.new(variant: :outline) do %>Left<% end %>
23
+ <% end %>
24
+ </div>
25
+
26
+ - title: Right
27
+ code: |
28
+ <%= render Ui::Tooltip::Component.new(text: "Right tooltip", position: :right) do %>
29
+ <%= render Ui::Button::Component.new(variant: :outline) do %>Right<% end %>
30
+ <% end %>
31
+
32
+ - title: With Different Triggers
33
+ examples:
34
+ - title: Text trigger
35
+ code: |
36
+ <%= render Ui::Tooltip::Component.new(text: "More information about this item") do %>
37
+ <span style="border-bottom: 1px dashed; cursor: help;">What is this?</span>
38
+ <% end %>
39
+
40
+ - title: Icon trigger
41
+ code: |
42
+ <%= render Ui::Tooltip::Component.new(text: "Settings") do %>
43
+ <%= render Ui::Button::Component.new(variant: :ghost, size: :icon) do %>&#9881;<% end %>
44
+ <% end %>
45
+
46
+ - title: Custom Attributes
47
+ examples:
48
+ - title: With custom class
49
+ code: |
50
+ <%= render Ui::Tooltip::Component.new(text: "Custom tooltip", class: "my-tooltip") do %>
51
+ <%= render Ui::Button::Component.new do %>Custom<% end %>
52
+ <% end %>
@@ -0,0 +1,7 @@
1
+ class ApplicationController < ActionController::Base
2
+ # Only allow modern browsers supporting webp images, web push, badges, import maps, CSS nesting, and CSS :has.
3
+ allow_browser versions: :modern
4
+
5
+ # Changes to the importmap will invalidate the etag for HTML responses
6
+ stale_when_importmap_changes
7
+ end
File without changes
@@ -0,0 +1,2 @@
1
+ module ApplicationHelper
2
+ end
@@ -0,0 +1,3 @@
1
+ // Configure your import map in config/importmap.rb. Read more: https://github.com/rails/importmap-rails
2
+ import "@hotwired/turbo-rails"
3
+ import "controllers"
@@ -0,0 +1,9 @@
1
+ import { Application } from "@hotwired/stimulus"
2
+
3
+ const application = Application.start()
4
+
5
+ // Configure Stimulus development experience
6
+ application.debug = false
7
+ window.Stimulus = application
8
+
9
+ export { application }
@@ -0,0 +1,7 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+
3
+ export default class extends Controller {
4
+ connect() {
5
+ this.element.textContent = "Hello World!"
6
+ }
7
+ }
@@ -0,0 +1,4 @@
1
+ // Import and register all your controllers from the importmap via controllers/**/*_controller
2
+ import { application } from "controllers/application"
3
+ import { eagerLoadControllersFrom } from "@hotwired/stimulus-loading"
4
+ eagerLoadControllersFrom("controllers", application)
@@ -0,0 +1,19 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+
3
+ export default class extends Controller {
4
+ static targets = ["item"]
5
+ static values = { multiple: { type: Boolean, default: false } }
6
+
7
+ toggle(event) {
8
+ if (this.multipleValue) return
9
+
10
+ const toggled = event.currentTarget
11
+ if (!toggled.open) return
12
+
13
+ this.itemTargets.forEach(item => {
14
+ if (item !== toggled && item.open) {
15
+ item.open = false
16
+ }
17
+ })
18
+ }
19
+ }
@@ -0,0 +1,25 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+
3
+ export default class extends Controller {
4
+ static targets = ["dialog"]
5
+
6
+ open() {
7
+ this.dialogTarget.showModal()
8
+ document.body.style.overflow = "hidden"
9
+ this.dialogTarget.addEventListener("cancel", this.preventCancel)
10
+ }
11
+
12
+ close() {
13
+ this.dialogTarget.removeEventListener("cancel", this.preventCancel)
14
+ this.dialogTarget.close()
15
+ document.body.style.overflow = ""
16
+ }
17
+
18
+ preventCancel(event) {
19
+ event.preventDefault()
20
+ }
21
+
22
+ disconnect() {
23
+ document.body.style.overflow = ""
24
+ }
25
+ }
@@ -0,0 +1,9 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+
3
+ export default class extends Controller {
4
+ static targets = ["content"]
5
+
6
+ toggle() {
7
+ this.contentTarget.classList.toggle("ui-collapsible__content--open")
8
+ }
9
+ }
@@ -0,0 +1,19 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+
3
+ export default class extends Controller {
4
+ static targets = ["dialog"]
5
+
6
+ open() {
7
+ this.dialogTarget.showModal()
8
+ document.body.style.overflow = "hidden"
9
+ }
10
+
11
+ close() {
12
+ this.dialogTarget.close()
13
+ document.body.style.overflow = ""
14
+ }
15
+
16
+ disconnect() {
17
+ document.body.style.overflow = ""
18
+ }
19
+ }
@@ -0,0 +1,47 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+
3
+ export default class extends Controller {
4
+ static targets = ["menu"]
5
+
6
+ connect() {
7
+ this.boundClose = this.closeOnOutsideClick.bind(this)
8
+ this.boundEscape = this.closeOnEscape.bind(this)
9
+ }
10
+
11
+ toggle() {
12
+ if (this.menuTarget.hidden) {
13
+ this.open()
14
+ } else {
15
+ this.close()
16
+ }
17
+ }
18
+
19
+ open() {
20
+ this.menuTarget.hidden = false
21
+ document.addEventListener("click", this.boundClose)
22
+ document.addEventListener("keydown", this.boundEscape)
23
+ }
24
+
25
+ close() {
26
+ this.menuTarget.hidden = true
27
+ document.removeEventListener("click", this.boundClose)
28
+ document.removeEventListener("keydown", this.boundEscape)
29
+ }
30
+
31
+ closeOnOutsideClick(event) {
32
+ if (!this.element.contains(event.target)) {
33
+ this.close()
34
+ }
35
+ }
36
+
37
+ closeOnEscape(event) {
38
+ if (event.key === "Escape") {
39
+ this.close()
40
+ }
41
+ }
42
+
43
+ disconnect() {
44
+ document.removeEventListener("click", this.boundClose)
45
+ document.removeEventListener("keydown", this.boundEscape)
46
+ }
47
+ }
@@ -0,0 +1,47 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+
3
+ export default class extends Controller {
4
+ static targets = ["content"]
5
+
6
+ connect() {
7
+ this._onOutsideClick = this._onOutsideClick.bind(this)
8
+ this._onKeydown = this._onKeydown.bind(this)
9
+ }
10
+
11
+ toggle() {
12
+ if (this.contentTarget.classList.contains("ui-popover__content--open")) {
13
+ this.close()
14
+ } else {
15
+ this.open()
16
+ }
17
+ }
18
+
19
+ open() {
20
+ this.contentTarget.classList.add("ui-popover__content--open")
21
+ document.addEventListener("click", this._onOutsideClick)
22
+ document.addEventListener("keydown", this._onKeydown)
23
+ }
24
+
25
+ close() {
26
+ this.contentTarget.classList.remove("ui-popover__content--open")
27
+ document.removeEventListener("click", this._onOutsideClick)
28
+ document.removeEventListener("keydown", this._onKeydown)
29
+ }
30
+
31
+ _onOutsideClick(event) {
32
+ if (!this.element.contains(event.target)) {
33
+ this.close()
34
+ }
35
+ }
36
+
37
+ _onKeydown(event) {
38
+ if (event.key === "Escape") {
39
+ this.close()
40
+ }
41
+ }
42
+
43
+ disconnect() {
44
+ document.removeEventListener("click", this._onOutsideClick)
45
+ document.removeEventListener("keydown", this._onKeydown)
46
+ }
47
+ }
@@ -0,0 +1,19 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+
3
+ export default class extends Controller {
4
+ static targets = ["dialog"]
5
+
6
+ open() {
7
+ this.dialogTarget.showModal()
8
+ document.body.style.overflow = "hidden"
9
+ }
10
+
11
+ close() {
12
+ this.dialogTarget.close()
13
+ document.body.style.overflow = ""
14
+ }
15
+
16
+ disconnect() {
17
+ document.body.style.overflow = ""
18
+ }
19
+ }
@@ -0,0 +1,24 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+
3
+ export default class extends Controller {
4
+ static targets = ["trigger", "panel"]
5
+ static values = { default: String }
6
+
7
+ connect() {
8
+ this.select({ params: { id: this.defaultValue } })
9
+ }
10
+
11
+ select({ params: { id } }) {
12
+ this.triggerTargets.forEach(trigger => {
13
+ const isActive = trigger.dataset.uiTabsIdParam === id
14
+ trigger.classList.toggle("ui-tabs__trigger--active", isActive)
15
+ trigger.setAttribute("aria-selected", isActive)
16
+ })
17
+
18
+ this.panelTargets.forEach(panel => {
19
+ const isActive = panel.dataset.tabId === id
20
+ panel.classList.toggle("ui-tabs__panel--active", isActive)
21
+ panel.hidden = !isActive
22
+ })
23
+ }
24
+ }
@@ -0,0 +1,13 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+
3
+ export default class extends Controller {
4
+ static targets = ["content"]
5
+
6
+ show() {
7
+ this.contentTarget.hidden = false
8
+ }
9
+
10
+ hide() {
11
+ this.contentTarget.hidden = true
12
+ }
13
+ }
@@ -0,0 +1,7 @@
1
+ class ApplicationJob < ActiveJob::Base
2
+ # Automatically retry jobs that encountered a deadlock
3
+ # retry_on ActiveRecord::Deadlocked
4
+
5
+ # Most jobs are safe to ignore if the underlying records are no longer available
6
+ # discard_on ActiveJob::DeserializationError
7
+ end
@@ -0,0 +1,4 @@
1
+ class ApplicationMailer < ActionMailer::Base
2
+ default from: "from@example.com"
3
+ layout "mailer"
4
+ end
@@ -0,0 +1,3 @@
1
+ class ApplicationRecord < ActiveRecord::Base
2
+ primary_abstract_class
3
+ end
File without changes