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
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: eb2ffed2ddaa7cecea2ad5d75cef50a0f8176e024e64dee2690a083ffe5bfb6c
4
+ data.tar.gz: d802773a6dd03abf7a49c64f1e364119c843170f46c7a1a01eba0ddd6e7e86a6
5
+ SHA512:
6
+ metadata.gz: 6cce283e4c5096e63ac1f8534a2be4179caa3fcea00af7f60c47fd126b7224744595551dfb585f238d66746dc296b1c22ea1980aa6ad4791aa810b8060c82ed6
7
+ data.tar.gz: db76c9bfaebd990ea5673a9fd5371292f5a340fd4aee735dc611984b3eb58a42c7bbd32a5637b1c3ad090a3219a698c8e21c499fb75f5812a6943aacf7edee3c
data/README.md ADDED
@@ -0,0 +1,301 @@
1
+ # UikitRails
2
+
3
+ Beautiful, copy-paste UI components for Rails — inspired by [shadcn/ui](https://ui.shadcn.com).
4
+
5
+ You don't install a component library. You **copy components into your project** and own the code. Customize everything — HTML, CSS, Ruby — no abstractions in the way.
6
+
7
+ ## Why UikitRails?
8
+
9
+ | | Traditional gems | UikitRails |
10
+ |---|---|---|
11
+ | **Ownership** | Locked behind gem API | Code lives in your app |
12
+ | **Styling** | Override with hacks | Edit the CSS directly |
13
+ | **Tailwind required?** | Often | No — plain CSS with design tokens |
14
+ | **Customization** | Limited to gem options | Change anything you want |
15
+
16
+ ## Features
17
+
18
+ - **Copy, don't depend** — components are copied into your app via generators. No runtime dependency.
19
+ - **No Tailwind required** — plain CSS powered by CSS custom properties (design tokens). Works with any CSS setup.
20
+ - **ViewComponent-based** — each component is a proper [ViewComponent](https://viewcomponent.org/) with a Ruby class and ERB template.
21
+ - **Dark mode ready** — add `class="dark"` to your `<html>` tag and it just works.
22
+ - **Built-in styleguide** — mount the engine to browse live previews and copy code for every installed component.
23
+ - **Accessible** — semantic HTML, keyboard navigation, focus-visible states, and ARIA attributes.
24
+
25
+ ## Quick Start
26
+
27
+ ### 1. Add the gem
28
+
29
+ ```ruby
30
+ gem "uikit_rails"
31
+ ```
32
+
33
+ ```bash
34
+ bundle install
35
+ ```
36
+
37
+ ### 2. Run the installer
38
+
39
+ ```bash
40
+ rails generate uikit_rails:install
41
+ ```
42
+
43
+ This creates two files:
44
+
45
+ | File | Purpose |
46
+ |---|---|
47
+ | `app/components/ui/base_component.rb` | Base class all UI components inherit from |
48
+ | `app/assets/stylesheets/uikit_rails.css` | Design tokens — colors, radii, fonts, transitions |
49
+
50
+ ### 3. Add components
51
+
52
+ ```bash
53
+ # Add specific components
54
+ rails generate uikit_rails:add button card input
55
+
56
+ # Or install everything at once
57
+ rails generate uikit_rails:add --all
58
+ ```
59
+
60
+ This copies into your app:
61
+
62
+ | File | Purpose |
63
+ |---|---|
64
+ | `app/components/ui/button/component.rb` | ViewComponent Ruby class |
65
+ | `app/assets/stylesheets/ui/button.css` | Component styles (plain CSS) |
66
+ | `app/components/ui/button/preview.yml` | Preview examples for the styleguide |
67
+
68
+ Add multiple components at once:
69
+
70
+ ```bash
71
+ rails generate uikit_rails:add button card badge alert
72
+ ```
73
+
74
+ ### 4. Use in your views
75
+
76
+ ```erb
77
+ <%= render Ui::Button::Component.new do %>
78
+ Click me
79
+ <% end %>
80
+
81
+ <%= render Ui::Button::Component.new(variant: :destructive, size: :lg) do %>
82
+ Delete
83
+ <% end %>
84
+
85
+ <%= render Ui::Button::Component.new(tag: :a, href: "/dashboard", variant: :outline) do %>
86
+ Go to Dashboard
87
+ <% end %>
88
+ ```
89
+
90
+ ### 5. Use with Rails forms
91
+
92
+ Add the **form** component plus the field primitives it renders (same classes as standalone `render Ui::…::Component`):
93
+
94
+ ```bash
95
+ rails generate uikit_rails:add input textarea select checkbox label button form
96
+ ```
97
+
98
+ Then use it in your views:
99
+
100
+ ```erb
101
+ <%= form_with model: @user, builder: Ui::Form::Builder, class: "ui-form" do |f| %>
102
+ <%= f.field :name %>
103
+ <%= f.field :email, as: :email_field, placeholder: "you@example.com" %>
104
+ <%= f.field :bio, as: :text_area, rows: 4 %>
105
+ <%= f.field :role, as: :select, collection: %w[admin editor viewer] %>
106
+ <%= f.field :terms, as: :check_box, label: "I agree to the terms" %>
107
+ <%= f.submit "Save" %>
108
+ <% end %>
109
+ ```
110
+
111
+ `Ui::Form::Builder` lives at `app/components/ui/form/builder.rb` (not `component.rb`) so **Zeitwerk** can autoload the constant. `Ui::Form::Builder` uses **ViewComponent** (`render_in`) for `f.email_field`, `f.text_area`, etc., so markup matches `<%= render Ui::Input::Component.new(...) %>` outside forms.
112
+
113
+ The `field` helper auto-generates a label, the control, and error messages. You can also use individual helpers directly:
114
+
115
+ ```erb
116
+ <%= form_with model: @user, builder: Ui::Form::Builder do |f| %>
117
+ <%= f.label :email %>
118
+ <%= f.email_field :email, placeholder: "you@example.com" %>
119
+ <%= f.submit "Save" %>
120
+ <% end %>
121
+ ```
122
+
123
+ To make it the app-wide default:
124
+
125
+ ```ruby
126
+ class ApplicationController < ActionController::Base
127
+ default_form_builder Ui::Form::Builder
128
+ end
129
+ ```
130
+
131
+ ## Component Styleguide
132
+
133
+ UikitRails ships with a **mountable engine** that gives you a live component browser — like Storybook, but built into your Rails app.
134
+
135
+ Add one line to your routes:
136
+
137
+ ```ruby
138
+ # config/routes.rb
139
+ mount UikitRails::Engine => "/ui"
140
+ ```
141
+
142
+ Then visit `/ui` to see:
143
+ - A sidebar listing every installed component
144
+ - Live rendered previews with all variants and sizes
145
+ - Copyable ERB code snippets for every example
146
+ - The `rails generate` command to install each component
147
+
148
+ The styleguide is self-contained — it has its own layout and styles that won't interfere with your app.
149
+
150
+ ## Available Components
151
+
152
+ **Layout & Display**
153
+
154
+ | Component | Description |
155
+ |---|---|
156
+ | `card` | Container with header, title, description, body, and footer slots |
157
+ | `separator` | Horizontal or vertical divider between content |
158
+ | `skeleton` | Animated placeholder for loading states |
159
+ | `avatar` | Circular avatar with image or fallback initials |
160
+ | `badge` | Small status indicator (default, secondary, destructive, outline) |
161
+ | `alert` | Informational banner with title and description (default, destructive) |
162
+ | `progress` | Progress bar with accessible ARIA attributes |
163
+ | `label` | Styled form label |
164
+ | `table` | Data table with header, body, footer, and caption slots |
165
+
166
+ **Form Controls**
167
+
168
+ | Component | Description |
169
+ |---|---|
170
+ | `button` | Button with 6 variants and 4 sizes, renders as `<button>` or `<a>` |
171
+ | `form` | Form builder that renders the same ViewComponents as standalone usage (`Ui::Input`, etc.) |
172
+ | `input` | Styled text input field |
173
+ | `textarea` | Multi-line text input |
174
+ | `select` | Native select dropdown with custom styling |
175
+ | `checkbox` | Styled checkbox with optional label |
176
+ | `switch` | Toggle switch for boolean settings (pure CSS) |
177
+ | `toggle` | Pressable toggle button with pressed state |
178
+
179
+ **Interactive (Stimulus)**
180
+
181
+ | Component | Description |
182
+ |---|---|
183
+ | `dialog` | Modal dialog using native `<dialog>` element |
184
+ | `alert_dialog` | Confirmation dialog that requires user action |
185
+ | `sheet` | Slide-over panel from any side (top, right, bottom, left) |
186
+ | `dropdown` | Dropdown menu with items, separators, and labels |
187
+ | `popover` | Floating content panel triggered by click |
188
+ | `tabs` | Tabbed content panels with keyboard navigation |
189
+ | `tooltip` | Hover/focus tooltip (top, bottom, left, right) |
190
+ | `accordion` | Collapsible sections with single or multiple open |
191
+ | `collapsible` | Simple expand/collapse toggle |
192
+
193
+ **Navigation**
194
+
195
+ | Component | Description |
196
+ |---|---|
197
+ | `breadcrumb` | Navigation breadcrumb trail with links |
198
+ | `pagination` | Page navigation with prev, next, pages, and ellipsis |
199
+
200
+ ## Customization
201
+
202
+ ### Design Tokens
203
+
204
+ All components reference CSS custom properties defined in `app/assets/stylesheets/uikit_rails.css`. Change them once, every component updates:
205
+
206
+ ```css
207
+ :root {
208
+ --ui-primary: #2563eb;
209
+ --ui-primary-foreground: #ffffff;
210
+ --ui-radius: 0.5rem;
211
+ --ui-font-family: "Inter", sans-serif;
212
+ --ui-transition-speed: 150ms;
213
+ }
214
+ ```
215
+
216
+ Dark mode tokens are defined under `.dark` — add the class to `<html>` or `<body>` to switch.
217
+
218
+ ### Component Code
219
+
220
+ Since you own the code, you can change anything:
221
+
222
+ - **Ruby class** — add new variants, change defaults, add validations
223
+ - **CSS file** — restyle completely, add animations, adjust spacing
224
+ - **Preview** — edit `preview.yml` to add your own examples to the styleguide
225
+
226
+ ### Example: Adding a Custom Variant
227
+
228
+ ```ruby
229
+ # app/components/ui/button/component.rb
230
+ VARIANTS = %i[default destructive outline secondary ghost link brand].freeze
231
+ ```
232
+
233
+ ```css
234
+ /* app/assets/stylesheets/ui/button.css */
235
+ .ui-btn--brand {
236
+ background-color: #7c3aed;
237
+ color: #ffffff;
238
+ }
239
+
240
+ .ui-btn--brand:hover {
241
+ background-color: #6d28d9;
242
+ }
243
+ ```
244
+
245
+ ```erb
246
+ <%= render Ui::Button::Component.new(variant: :brand) do %>
247
+ Brand Button
248
+ <% end %>
249
+ ```
250
+
251
+ ## How It Works
252
+
253
+ ```
254
+ rails generate uikit_rails:install
255
+ └─ copies base_component.rb + uikit_rails.css (design tokens)
256
+
257
+ rails generate uikit_rails:add button
258
+ └─ copies component.rb → app/components/ui/button/
259
+ └─ copies button.css → app/assets/stylesheets/ui/
260
+ └─ copies preview.yml → app/components/ui/button/
261
+
262
+ mount UikitRails::Engine => "/ui"
263
+ └─ serves a styleguide at /ui with live previews
264
+ ```
265
+
266
+ The gem is only used for **generators and the styleguide engine**. Your components have zero runtime dependency on the gem — you could remove it from your Gemfile after adding all the components you need (though you'd lose the styleguide).
267
+
268
+ ## Requirements
269
+
270
+ - Ruby >= 3.2
271
+ - Rails >= 7.0
272
+ - [view_component](https://github.com/ViewComponent/view_component) >= 3.0
273
+
274
+ ## Development
275
+
276
+ ```bash
277
+ git clone https://github.com/kha-wogi/uikit_rails.git
278
+ cd uikit_rails
279
+ bin/setup
280
+ bundle exec rspec # run tests
281
+ bundle exec rubocop # run linter
282
+ ```
283
+
284
+ A test Rails app is included at `test_app/` for manual testing:
285
+
286
+ ```bash
287
+ cd test_app
288
+ bundle install
289
+ bin/rails generate uikit_rails:install
290
+ bin/rails generate uikit_rails:add button
291
+ bin/rails server
292
+ # Visit http://localhost:3000/ui
293
+ ```
294
+
295
+ ## Contributing
296
+
297
+ Bug reports and pull requests are welcome on [GitHub](https://github.com/kha-wogi/uikit_rails).
298
+
299
+ ## License
300
+
301
+ MIT
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ require "rubocop/rake_task"
9
+
10
+ RuboCop::RakeTask.new
11
+
12
+ task default: %i[spec rubocop]
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "yaml"
4
+
5
+ module UikitRails
6
+ # Serves the component styleguide: index of installed components and live previews.
7
+ class StyleguideController < ActionController::Base
8
+ layout "uikit_rails/application"
9
+
10
+ def index
11
+ @components = installed_components
12
+ end
13
+
14
+ def show
15
+ @component = params[:component]
16
+ @components = installed_components
17
+
18
+ unless @components.include?(@component)
19
+ redirect_to uikit_rails.root_path, alert: "Component '#{@component}' is not installed."
20
+ return
21
+ end
22
+
23
+ load_preview
24
+ end
25
+
26
+ private
27
+
28
+ def installed_components
29
+ components_dir = Rails.root.join("app/components/ui")
30
+ return [] unless Dir.exist?(components_dir)
31
+
32
+ Dir.children(components_dir)
33
+ .select { |entry| File.directory?(components_dir.join(entry)) }
34
+ .sort
35
+ end
36
+
37
+ def load_preview
38
+ preview_path = Rails.root.join("app/components/ui", @component, "preview.yml")
39
+ unless File.exist?(preview_path)
40
+ @sections = []
41
+ @description = nil
42
+ return
43
+ end
44
+
45
+ data = YAML.safe_load_file(preview_path, permitted_classes: [Symbol])
46
+ @description = data["description"]
47
+ @sections = parse_sections(data["sections"])
48
+ end
49
+
50
+ def parse_sections(sections)
51
+ (sections || []).map do |section|
52
+ {
53
+ title: section["title"],
54
+ examples: parse_examples(section["examples"])
55
+ }
56
+ end
57
+ end
58
+
59
+ def parse_examples(examples)
60
+ (examples || []).map do |example|
61
+ code = example["code"].to_s.strip
62
+ { title: example["title"], code: code, rendered: render_example(code) }
63
+ end
64
+ end
65
+
66
+ def render_example(code)
67
+ render_to_string(inline: code, layout: false)
68
+ rescue StandardError => e
69
+ %(<span style="color:red">Render error: #{ERB::Util.html_escape(e.message)}</span>)
70
+ end
71
+ end
72
+ end