plutonium 0.16.4 → 0.18.0

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 (717) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/plutonium.css +9 -1
  3. data/app/assets/plutonium.js +23273 -9599
  4. data/app/assets/plutonium.js.map +4 -4
  5. data/app/assets/plutonium.min.js +159 -49
  6. data/app/assets/plutonium.min.js.map +4 -4
  7. data/app/views/plutonium/_resource_header.html.erb +33 -24
  8. data/app/views/plutonium/_resource_sidebar.html.erb +10 -8
  9. data/app/views/rodauth/otp_unlock.html.erb +22 -0
  10. data/app/views/rodauth/otp_unlock_not_available.html.erb +14 -0
  11. data/app/views/rodauth/webauthn_remove.html.erb +1 -0
  12. data/docs/guide/getting-started/resources.md +2 -2
  13. data/docs/guide/tutorial.md +4 -4
  14. data/gemfiles/rails_7.gemfile.lock +406 -0
  15. data/lib/generators/pu/core/assets/assets_generator.rb +1 -1
  16. data/lib/generators/pu/res/conn/conn_generator.rb +24 -10
  17. data/lib/generators/pu/rodauth/concerns/configuration.rb +11 -0
  18. data/lib/generators/pu/rodauth/concerns/feature_selector.rb +4 -0
  19. data/lib/generators/pu/rodauth/install_generator.rb +3 -1
  20. data/lib/generators/pu/rodauth/migration/active_record/otp_unlock.erb +7 -0
  21. data/lib/generators/pu/rodauth/templates/INSTRUCTIONS +2 -46
  22. data/lib/generators/pu/rodauth/templates/app/controllers/plugin_controller.rb.tt +3 -3
  23. data/lib/generators/pu/rodauth/templates/app/mailers/rodauth_mailer.rb.tt +50 -1
  24. data/lib/generators/pu/rodauth/templates/app/rodauth/account_rodauth_plugin.rb.tt +37 -3
  25. data/lib/generators/pu/rodauth/templates/app/rodauth/rodauth_plugin.rb.tt +33 -8
  26. data/lib/generators/pu/rodauth/templates/app/views/rodauth_mailer/otp_disabled.text.erb +2 -0
  27. data/lib/generators/pu/rodauth/templates/app/views/rodauth_mailer/otp_locked_out.text.erb +9 -0
  28. data/lib/generators/pu/rodauth/templates/app/views/rodauth_mailer/otp_setup.text.erb +2 -0
  29. data/lib/generators/pu/rodauth/templates/app/views/rodauth_mailer/otp_unlock_failed.text.erb +8 -0
  30. data/lib/generators/pu/rodauth/templates/app/views/rodauth_mailer/otp_unlocked.text.erb +2 -0
  31. data/lib/generators/pu/rodauth/templates/app/views/rodauth_mailer/webauthn_authenticator_added.text.erb +3 -0
  32. data/lib/generators/pu/rodauth/templates/app/views/rodauth_mailer/webauthn_authenticator_removed.text.erb +3 -0
  33. data/lib/generators/pu/rodauth/views_generator.rb +1 -12
  34. data/lib/plutonium/core/controllers/authorizable.rb +3 -1
  35. data/lib/plutonium/helpers/application_helper.rb +0 -8
  36. data/lib/plutonium/helpers.rb +0 -3
  37. data/lib/plutonium/railtie.rb +0 -14
  38. data/lib/plutonium/reloader.rb +2 -12
  39. data/lib/plutonium/rodauth/controller_methods.rb +1 -3
  40. data/lib/plutonium/ui/component/behaviour.rb +1 -1
  41. data/lib/plutonium/ui/component/kit.rb +59 -15
  42. data/lib/plutonium/ui/display/base.rb +6 -2
  43. data/lib/plutonium/ui/display/{component → components}/association.rb +1 -1
  44. data/lib/plutonium/ui/display/components/attachment.rb +93 -0
  45. data/lib/plutonium/ui/display/{component → components}/markdown.rb +2 -1
  46. data/lib/plutonium/ui/display/resource.rb +21 -6
  47. data/lib/plutonium/ui/display/theme.rb +2 -1
  48. data/lib/plutonium/ui/form/base.rb +7 -0
  49. data/lib/plutonium/ui/form/components/belongs_to.rb +45 -1
  50. data/lib/plutonium/ui/form/components/has_many.rb +45 -1
  51. data/lib/plutonium/ui/form/components/uppy.rb +173 -0
  52. data/lib/plutonium/ui/form/query.rb +5 -5
  53. data/lib/plutonium/ui/form/resource.rb +6 -6
  54. data/lib/plutonium/ui/form/theme.rb +6 -2
  55. data/lib/plutonium/ui/frame_navigator_panel.rb +25 -4
  56. data/lib/plutonium/ui/layout/base.rb +1 -1
  57. data/lib/plutonium/ui/layout/header.rb +1 -1
  58. data/lib/plutonium/ui/layout/sidebar.rb +0 -1
  59. data/lib/plutonium/ui/nav_grid_menu.rb +93 -0
  60. data/lib/plutonium/ui/nav_user.rb +121 -0
  61. data/lib/plutonium/ui/panel.rb +2 -2
  62. data/lib/plutonium/ui/sidebar_menu.rb +19 -39
  63. data/lib/plutonium/ui/tab_list.rb +73 -0
  64. data/lib/plutonium/ui/table/base.rb +7 -1
  65. data/lib/plutonium/ui/table/components/attachment.rb +71 -0
  66. data/lib/plutonium/ui/table/components/pagy_info.rb +12 -4
  67. data/lib/plutonium/ui/table/components/pagy_pagination.rb +5 -5
  68. data/lib/plutonium/ui/table/display_theme.rb +2 -1
  69. data/lib/plutonium/ui/table/resource.rb +11 -12
  70. data/lib/plutonium/version.rb +1 -1
  71. data/package-lock.json +356 -18
  72. data/package.json +6 -2
  73. data/src/css/plutonium.css +3 -0
  74. data/src/js/controllers/attachment_input_controller.js +241 -0
  75. data/src/js/controllers/attachment_preview_container_controller.js +15 -0
  76. data/src/js/controllers/attachment_preview_controller.js +63 -0
  77. data/src/js/controllers/color_mode_controller.js +0 -1
  78. data/src/js/controllers/easymde_controller.js +0 -1
  79. data/src/js/controllers/flatpickr_controller.js +0 -1
  80. data/src/js/controllers/form_controller.js +0 -1
  81. data/src/js/controllers/frame_navigator_controller.js +16 -12
  82. data/src/js/controllers/intl_tel_input_controller.js +0 -1
  83. data/src/js/controllers/register_controllers.js +12 -30
  84. data/src/js/controllers/resource_collapse_controller.js +0 -1
  85. data/src/js/controllers/resource_dismiss_controller.js +0 -1
  86. data/src/js/controllers/resource_drop_down_controller.js +161 -9
  87. data/src/js/controllers/{header_controller.js → resource_header_controller.js} +1 -0
  88. data/src/js/controllers/resource_tab_list_controller.js +64 -0
  89. data/src/js/controllers/select_navigator.js +16 -0
  90. data/src/js/controllers/slim_select_controller.js +0 -1
  91. data/src/js/support/dom_element.js +78 -0
  92. data/src/js/support/mime_icon.js +127 -0
  93. data/tailwind.options.js +0 -5
  94. metadata +29 -642
  95. data/README copy.md +0 -83
  96. data/app/assets/application.js.bk +0 -31419
  97. data/app/assets/icons/flags/ghana.svg +0 -49
  98. data/app/assets/icons/outline/address-book.svg +0 -3
  99. data/app/assets/icons/outline/adjustments-horizontal.svg +0 -3
  100. data/app/assets/icons/outline/adjustments-vertical.svg +0 -3
  101. data/app/assets/icons/outline/align-center.svg +0 -3
  102. data/app/assets/icons/outline/angle-down.svg +0 -3
  103. data/app/assets/icons/outline/angle-left.svg +0 -3
  104. data/app/assets/icons/outline/angle-right.svg +0 -3
  105. data/app/assets/icons/outline/angle-up.svg +0 -3
  106. data/app/assets/icons/outline/annotation.svg +0 -3
  107. data/app/assets/icons/outline/archive-arrow-down.svg +0 -3
  108. data/app/assets/icons/outline/archive.svg +0 -3
  109. data/app/assets/icons/outline/arrow-down-to-bracket.svg +0 -3
  110. data/app/assets/icons/outline/arrow-down.svg +0 -3
  111. data/app/assets/icons/outline/arrow-left-to-bracket.svg +0 -3
  112. data/app/assets/icons/outline/arrow-left.svg +0 -3
  113. data/app/assets/icons/outline/arrow-right-alt.svg +0 -3
  114. data/app/assets/icons/outline/arrow-right-to-bracket.svg +0 -3
  115. data/app/assets/icons/outline/arrow-right.svg +0 -3
  116. data/app/assets/icons/outline/arrow-sort-letters.svg +0 -3
  117. data/app/assets/icons/outline/arrow-up-down.svg +0 -3
  118. data/app/assets/icons/outline/arrow-up-from-bracket.svg +0 -3
  119. data/app/assets/icons/outline/arrow-up-right-down-left.svg +0 -3
  120. data/app/assets/icons/outline/arrow-up-right-from-square.svg +0 -3
  121. data/app/assets/icons/outline/arrow-up.svg +0 -3
  122. data/app/assets/icons/outline/arrows-repeat-count.svg +0 -3
  123. data/app/assets/icons/outline/arrows-repeat.svg +0 -3
  124. data/app/assets/icons/outline/atom.svg +0 -3
  125. data/app/assets/icons/outline/backward-step.svg +0 -3
  126. data/app/assets/icons/outline/badge-check.svg +0 -3
  127. data/app/assets/icons/outline/bars-from-left.svg +0 -3
  128. data/app/assets/icons/outline/bars.svg +0 -3
  129. data/app/assets/icons/outline/bell-active-alt.svg +0 -3
  130. data/app/assets/icons/outline/bell-active.svg +0 -3
  131. data/app/assets/icons/outline/bell-ring.svg +0 -3
  132. data/app/assets/icons/outline/bell.svg +0 -3
  133. data/app/assets/icons/outline/blender-phone.svg +0 -3
  134. data/app/assets/icons/outline/book-open.svg +0 -3
  135. data/app/assets/icons/outline/book.svg +0 -3
  136. data/app/assets/icons/outline/bookmark.svg +0 -3
  137. data/app/assets/icons/outline/brain.svg +0 -3
  138. data/app/assets/icons/outline/briefcase.svg +0 -3
  139. data/app/assets/icons/outline/bug.svg +0 -3
  140. data/app/assets/icons/outline/building.svg +0 -3
  141. data/app/assets/icons/outline/bullhorn.svg +0 -3
  142. data/app/assets/icons/outline/calendar-edit.svg +0 -3
  143. data/app/assets/icons/outline/calendar-month.svg +0 -3
  144. data/app/assets/icons/outline/calendar-plus.svg +0 -3
  145. data/app/assets/icons/outline/calendar-week.svg +0 -3
  146. data/app/assets/icons/outline/camera-photo.svg +0 -4
  147. data/app/assets/icons/outline/caption.svg +0 -3
  148. data/app/assets/icons/outline/caret-down.svg +0 -3
  149. data/app/assets/icons/outline/caret-left.svg +0 -3
  150. data/app/assets/icons/outline/caret-right.svg +0 -3
  151. data/app/assets/icons/outline/caret-sort.svg +0 -3
  152. data/app/assets/icons/outline/caret-up.svg +0 -3
  153. data/app/assets/icons/outline/cart-plus-alt.svg +0 -3
  154. data/app/assets/icons/outline/cart-plus.svg +0 -3
  155. data/app/assets/icons/outline/cart.svg +0 -3
  156. data/app/assets/icons/outline/cash.svg +0 -3
  157. data/app/assets/icons/outline/chart-line-down.svg +0 -3
  158. data/app/assets/icons/outline/chart-line-up.svg +0 -3
  159. data/app/assets/icons/outline/chart-mixed-dollar.svg +0 -3
  160. data/app/assets/icons/outline/chart-mixed.svg +0 -3
  161. data/app/assets/icons/outline/chart-pie.svg +0 -4
  162. data/app/assets/icons/outline/chart.svg +0 -3
  163. data/app/assets/icons/outline/check-circle.svg +0 -3
  164. data/app/assets/icons/outline/check-plus-circle.svg +0 -3
  165. data/app/assets/icons/outline/check.svg +0 -3
  166. data/app/assets/icons/outline/chevron-double-down.svg +0 -3
  167. data/app/assets/icons/outline/chevron-double-left.svg +0 -3
  168. data/app/assets/icons/outline/chevron-double-right.svg +0 -3
  169. data/app/assets/icons/outline/chevron-double-up.svg +0 -3
  170. data/app/assets/icons/outline/chevron-down.svg +0 -3
  171. data/app/assets/icons/outline/chevron-left.svg +0 -3
  172. data/app/assets/icons/outline/chevron-right.svg +0 -3
  173. data/app/assets/icons/outline/chevron-sort.svg +0 -3
  174. data/app/assets/icons/outline/chevron-up.svg +0 -3
  175. data/app/assets/icons/outline/circle-pause.svg +0 -3
  176. data/app/assets/icons/outline/circle-plus.svg +0 -3
  177. data/app/assets/icons/outline/clapperboard-play.svg +0 -3
  178. data/app/assets/icons/outline/clipboard-check.svg +0 -3
  179. data/app/assets/icons/outline/clipboard-list.svg +0 -3
  180. data/app/assets/icons/outline/clipboard.svg +0 -3
  181. data/app/assets/icons/outline/clock.svg +0 -3
  182. data/app/assets/icons/outline/close-circle.svg +0 -3
  183. data/app/assets/icons/outline/close.svg +0 -3
  184. data/app/assets/icons/outline/cloud-arrow-up.svg +0 -3
  185. data/app/assets/icons/outline/code-branch.svg +0 -3
  186. data/app/assets/icons/outline/code-fork.svg +0 -3
  187. data/app/assets/icons/outline/code-merge.svg +0 -3
  188. data/app/assets/icons/outline/code-pull-request.svg +0 -3
  189. data/app/assets/icons/outline/code.svg +0 -3
  190. data/app/assets/icons/outline/cog.svg +0 -4
  191. data/app/assets/icons/outline/column.svg +0 -3
  192. data/app/assets/icons/outline/command.svg +0 -3
  193. data/app/assets/icons/outline/compress.svg +0 -3
  194. data/app/assets/icons/outline/computer-speaker.svg +0 -3
  195. data/app/assets/icons/outline/credit-card.svg +0 -3
  196. data/app/assets/icons/outline/database.svg +0 -3
  197. data/app/assets/icons/outline/desktop-pc.svg +0 -3
  198. data/app/assets/icons/outline/dna.svg +0 -3
  199. data/app/assets/icons/outline/dollar.svg +0 -3
  200. data/app/assets/icons/outline/dots-horizontal.svg +0 -3
  201. data/app/assets/icons/outline/dots-vertical.svg +0 -3
  202. data/app/assets/icons/outline/download.svg +0 -3
  203. data/app/assets/icons/outline/draw-square.svg +0 -3
  204. data/app/assets/icons/outline/edit.svg +0 -3
  205. data/app/assets/icons/outline/envelope-open.svg +0 -3
  206. data/app/assets/icons/outline/envelope.svg +0 -3
  207. data/app/assets/icons/outline/euro.svg +0 -3
  208. data/app/assets/icons/outline/exclamation-circle.svg +0 -3
  209. data/app/assets/icons/outline/expand.svg +0 -3
  210. data/app/assets/icons/outline/eye-slash.svg +0 -3
  211. data/app/assets/icons/outline/eye.svg +0 -4
  212. data/app/assets/icons/outline/face-explode.svg +0 -4
  213. data/app/assets/icons/outline/face-grin-stars.svg +0 -6
  214. data/app/assets/icons/outline/face-grin.svg +0 -3
  215. data/app/assets/icons/outline/face-laugh.svg +0 -3
  216. data/app/assets/icons/outline/file-chart-bar.svg +0 -3
  217. data/app/assets/icons/outline/file-check.svg +0 -3
  218. data/app/assets/icons/outline/file-circle-plus.svg +0 -3
  219. data/app/assets/icons/outline/file-clone.svg +0 -3
  220. data/app/assets/icons/outline/file-code.svg +0 -3
  221. data/app/assets/icons/outline/file-copy-alt.svg +0 -3
  222. data/app/assets/icons/outline/file-copy.svg +0 -3
  223. data/app/assets/icons/outline/file-csv.svg +0 -3
  224. data/app/assets/icons/outline/file-export.svg +0 -3
  225. data/app/assets/icons/outline/file-image.svg +0 -4
  226. data/app/assets/icons/outline/file-import.svg +0 -3
  227. data/app/assets/icons/outline/file-invoice.svg +0 -3
  228. data/app/assets/icons/outline/file-lines.svg +0 -3
  229. data/app/assets/icons/outline/file-music.svg +0 -3
  230. data/app/assets/icons/outline/file-paste.svg +0 -3
  231. data/app/assets/icons/outline/file-pdf.svg +0 -3
  232. data/app/assets/icons/outline/file-pen.svg +0 -3
  233. data/app/assets/icons/outline/file-ppt.svg +0 -3
  234. data/app/assets/icons/outline/file-search.svg +0 -3
  235. data/app/assets/icons/outline/file-shield.svg +0 -3
  236. data/app/assets/icons/outline/file-video.svg +0 -3
  237. data/app/assets/icons/outline/file-word.svg +0 -3
  238. data/app/assets/icons/outline/file-zip.svg +0 -3
  239. data/app/assets/icons/outline/file.svg +0 -3
  240. data/app/assets/icons/outline/filter.svg +0 -3
  241. data/app/assets/icons/outline/fingerprint.svg +0 -3
  242. data/app/assets/icons/outline/fire.svg +0 -3
  243. data/app/assets/icons/outline/flag.svg +0 -3
  244. data/app/assets/icons/outline/folder-arrow-right.svg +0 -3
  245. data/app/assets/icons/outline/folder-duplicate.svg +0 -3
  246. data/app/assets/icons/outline/folder-open.svg +0 -3
  247. data/app/assets/icons/outline/folder-plus.svg +0 -3
  248. data/app/assets/icons/outline/folder.svg +0 -3
  249. data/app/assets/icons/outline/forward-step.svg +0 -3
  250. data/app/assets/icons/outline/forward.svg +0 -3
  251. data/app/assets/icons/outline/gift-box.svg +0 -3
  252. data/app/assets/icons/outline/globe.svg +0 -3
  253. data/app/assets/icons/outline/grid-plus.svg +0 -3
  254. data/app/assets/icons/outline/grid.svg +0 -3
  255. data/app/assets/icons/outline/headphones.svg +0 -3
  256. data/app/assets/icons/outline/heart.svg +0 -3
  257. data/app/assets/icons/outline/home.svg +0 -3
  258. data/app/assets/icons/outline/hourglass.svg +0 -3
  259. data/app/assets/icons/outline/image.svg +0 -3
  260. data/app/assets/icons/outline/inbox-full.svg +0 -3
  261. data/app/assets/icons/outline/inbox.svg +0 -3
  262. data/app/assets/icons/outline/indent.svg +0 -3
  263. data/app/assets/icons/outline/info-circle.svg +0 -3
  264. data/app/assets/icons/outline/keyboard.svg +0 -5
  265. data/app/assets/icons/outline/label.svg +0 -3
  266. data/app/assets/icons/outline/landmark.svg +0 -3
  267. data/app/assets/icons/outline/layers.svg +0 -3
  268. data/app/assets/icons/outline/letter-bold.svg +0 -3
  269. data/app/assets/icons/outline/letter-italic.svg +0 -3
  270. data/app/assets/icons/outline/letter-underline.svg +0 -3
  271. data/app/assets/icons/outline/life-saver.svg +0 -3
  272. data/app/assets/icons/outline/lightbulb.svg +0 -3
  273. data/app/assets/icons/outline/link.svg +0 -3
  274. data/app/assets/icons/outline/list-music.svg +0 -3
  275. data/app/assets/icons/outline/list.svg +0 -3
  276. data/app/assets/icons/outline/lock-open.svg +0 -3
  277. data/app/assets/icons/outline/lock-time.svg +0 -3
  278. data/app/assets/icons/outline/lock.svg +0 -3
  279. data/app/assets/icons/outline/mail-box.svg +0 -3
  280. data/app/assets/icons/outline/map-pin-alt.svg +0 -4
  281. data/app/assets/icons/outline/map-pin.svg +0 -3
  282. data/app/assets/icons/outline/message-caption.svg +0 -3
  283. data/app/assets/icons/outline/message-dots.svg +0 -3
  284. data/app/assets/icons/outline/messages.svg +0 -3
  285. data/app/assets/icons/outline/microphone.svg +0 -3
  286. data/app/assets/icons/outline/minimize.svg +0 -3
  287. data/app/assets/icons/outline/minus.svg +0 -3
  288. data/app/assets/icons/outline/mobile-phone.svg +0 -3
  289. data/app/assets/icons/outline/moon.svg +0 -3
  290. data/app/assets/icons/outline/newspaper.svg +0 -3
  291. data/app/assets/icons/outline/ordered-list.svg +0 -3
  292. data/app/assets/icons/outline/outdent.svg +0 -3
  293. data/app/assets/icons/outline/palette.svg +0 -3
  294. data/app/assets/icons/outline/paper-clip.svg +0 -3
  295. data/app/assets/icons/outline/paper-plane.svg +0 -3
  296. data/app/assets/icons/outline/paragraph.svg +0 -3
  297. data/app/assets/icons/outline/pause.svg +0 -3
  298. data/app/assets/icons/outline/pen-nib.svg +0 -3
  299. data/app/assets/icons/outline/pen.svg +0 -3
  300. data/app/assets/icons/outline/phone.svg +0 -3
  301. data/app/assets/icons/outline/play.svg +0 -3
  302. data/app/assets/icons/outline/plus.svg +0 -3
  303. data/app/assets/icons/outline/printer.svg +0 -3
  304. data/app/assets/icons/outline/profile-card.svg +0 -3
  305. data/app/assets/icons/outline/question-circle.svg +0 -3
  306. data/app/assets/icons/outline/quote.svg +0 -3
  307. data/app/assets/icons/outline/receipt.svg +0 -3
  308. data/app/assets/icons/outline/rectangle-list.svg +0 -3
  309. data/app/assets/icons/outline/redo.svg +0 -3
  310. data/app/assets/icons/outline/refresh.svg +0 -3
  311. data/app/assets/icons/outline/reply-all.svg +0 -3
  312. data/app/assets/icons/outline/reply.svg +0 -3
  313. data/app/assets/icons/outline/restore-window.svg +0 -3
  314. data/app/assets/icons/outline/rocket.svg +0 -3
  315. data/app/assets/icons/outline/ruler-combined.svg +0 -3
  316. data/app/assets/icons/outline/sale-percent.svg +0 -3
  317. data/app/assets/icons/outline/scale-balanced.svg +0 -3
  318. data/app/assets/icons/outline/search.svg +0 -3
  319. data/app/assets/icons/outline/share-all.svg +0 -3
  320. data/app/assets/icons/outline/share-nodes.svg +0 -3
  321. data/app/assets/icons/outline/shield-check.svg +0 -3
  322. data/app/assets/icons/outline/shield.svg +0 -3
  323. data/app/assets/icons/outline/shopping-bag.svg +0 -3
  324. data/app/assets/icons/outline/shuffle.svg +0 -3
  325. data/app/assets/icons/outline/sort-horizontal.svg +0 -3
  326. data/app/assets/icons/outline/sort.svg +0 -3
  327. data/app/assets/icons/outline/star-half-stroke.svg +0 -3
  328. data/app/assets/icons/outline/star-half.svg +0 -3
  329. data/app/assets/icons/outline/star.svg +0 -3
  330. data/app/assets/icons/outline/store.svg +0 -3
  331. data/app/assets/icons/outline/sun.svg +0 -3
  332. data/app/assets/icons/outline/swatchbook.svg +0 -3
  333. data/app/assets/icons/outline/table-column.svg +0 -3
  334. data/app/assets/icons/outline/table-row.svg +0 -3
  335. data/app/assets/icons/outline/tablet.svg +0 -3
  336. data/app/assets/icons/outline/tag.svg +0 -3
  337. data/app/assets/icons/outline/terminal.svg +0 -3
  338. data/app/assets/icons/outline/text-size.svg +0 -3
  339. data/app/assets/icons/outline/text-slash.svg +0 -3
  340. data/app/assets/icons/outline/thumbs-down.svg +0 -3
  341. data/app/assets/icons/outline/thumbs-up.svg +0 -3
  342. data/app/assets/icons/outline/ticket.svg +0 -3
  343. data/app/assets/icons/outline/trash-bin.svg +0 -3
  344. data/app/assets/icons/outline/truck.svg +0 -3
  345. data/app/assets/icons/outline/undo.svg +0 -3
  346. data/app/assets/icons/outline/upload.svg +0 -3
  347. data/app/assets/icons/outline/user-add.svg +0 -3
  348. data/app/assets/icons/outline/user-circle.svg +0 -3
  349. data/app/assets/icons/outline/user-edit.svg +0 -3
  350. data/app/assets/icons/outline/user-headset.svg +0 -3
  351. data/app/assets/icons/outline/user-remove.svg +0 -3
  352. data/app/assets/icons/outline/user-settings.svg +0 -3
  353. data/app/assets/icons/outline/user.svg +0 -3
  354. data/app/assets/icons/outline/users-group.svg +0 -3
  355. data/app/assets/icons/outline/users.svg +0 -3
  356. data/app/assets/icons/outline/video-camera.svg +0 -3
  357. data/app/assets/icons/outline/volume-down.svg +0 -3
  358. data/app/assets/icons/outline/volume-up.svg +0 -3
  359. data/app/assets/icons/outline/wallet.svg +0 -3
  360. data/app/assets/icons/outline/wand-magic-sparkles.svg +0 -3
  361. data/app/assets/icons/outline/window.svg +0 -3
  362. data/app/assets/icons/outline/zoom-in.svg +0 -3
  363. data/app/assets/icons/outline/zoom-out.svg +0 -3
  364. data/app/assets/icons/solid/X.svg +0 -3
  365. data/app/assets/icons/solid/address-book.svg +0 -3
  366. data/app/assets/icons/solid/adjustments-horizontal.svg +0 -3
  367. data/app/assets/icons/solid/adjustments-vertical.svg +0 -3
  368. data/app/assets/icons/solid/annotation.svg +0 -3
  369. data/app/assets/icons/solid/apple.svg +0 -3
  370. data/app/assets/icons/solid/archive-arrow-down.svg +0 -3
  371. data/app/assets/icons/solid/archive.svg +0 -4
  372. data/app/assets/icons/solid/arrow-right-alt.svg +0 -3
  373. data/app/assets/icons/solid/arrow-up-right-from-square.svg +0 -4
  374. data/app/assets/icons/solid/backward-step.svg +0 -3
  375. data/app/assets/icons/solid/badge-check.svg +0 -3
  376. data/app/assets/icons/solid/bell-active-alt.svg +0 -3
  377. data/app/assets/icons/solid/bell-active.svg +0 -5
  378. data/app/assets/icons/solid/bell-ring.svg +0 -3
  379. data/app/assets/icons/solid/bell.svg +0 -3
  380. data/app/assets/icons/solid/blender-phone.svg +0 -3
  381. data/app/assets/icons/solid/book-open.svg +0 -3
  382. data/app/assets/icons/solid/book.svg +0 -3
  383. data/app/assets/icons/solid/bookmark.svg +0 -3
  384. data/app/assets/icons/solid/brain.svg +0 -3
  385. data/app/assets/icons/solid/briefcase.svg +0 -3
  386. data/app/assets/icons/solid/bug.svg +0 -3
  387. data/app/assets/icons/solid/building.svg +0 -3
  388. data/app/assets/icons/solid/bullhorn.svg +0 -3
  389. data/app/assets/icons/solid/calendar-edit.svg +0 -4
  390. data/app/assets/icons/solid/calendar-month.svg +0 -3
  391. data/app/assets/icons/solid/calendar-plus.svg +0 -3
  392. data/app/assets/icons/solid/calendar-week.svg +0 -3
  393. data/app/assets/icons/solid/camera-photo.svg +0 -3
  394. data/app/assets/icons/solid/caption.svg +0 -3
  395. data/app/assets/icons/solid/caret-down.svg +0 -3
  396. data/app/assets/icons/solid/caret-left.svg +0 -3
  397. data/app/assets/icons/solid/caret-right.svg +0 -3
  398. data/app/assets/icons/solid/caret-sort.svg +0 -3
  399. data/app/assets/icons/solid/caret-up.svg +0 -3
  400. data/app/assets/icons/solid/cart-plus-alt.svg +0 -4
  401. data/app/assets/icons/solid/cart-plus.svg +0 -4
  402. data/app/assets/icons/solid/cart.svg +0 -3
  403. data/app/assets/icons/solid/cash.svg +0 -5
  404. data/app/assets/icons/solid/chart-mixed-dollar.svg +0 -3
  405. data/app/assets/icons/solid/chart-pie.svg +0 -4
  406. data/app/assets/icons/solid/check-circle.svg +0 -3
  407. data/app/assets/icons/solid/check-plus-circle.svg +0 -4
  408. data/app/assets/icons/solid/circle-pause.svg +0 -3
  409. data/app/assets/icons/solid/circle-plus.svg +0 -3
  410. data/app/assets/icons/solid/clapperboard-play.svg +0 -3
  411. data/app/assets/icons/solid/clipboard-check.svg +0 -3
  412. data/app/assets/icons/solid/clipboard-list.svg +0 -3
  413. data/app/assets/icons/solid/clipboard.svg +0 -3
  414. data/app/assets/icons/solid/clock.svg +0 -3
  415. data/app/assets/icons/solid/close-circle.svg +0 -3
  416. data/app/assets/icons/solid/cloud-arrow-up.svg +0 -4
  417. data/app/assets/icons/solid/code-branch.svg +0 -3
  418. data/app/assets/icons/solid/code-fork.svg +0 -3
  419. data/app/assets/icons/solid/code-merge.svg +0 -3
  420. data/app/assets/icons/solid/code-pull-request.svg +0 -3
  421. data/app/assets/icons/solid/cog.svg +0 -3
  422. data/app/assets/icons/solid/column.svg +0 -3
  423. data/app/assets/icons/solid/computer-speaker.svg +0 -4
  424. data/app/assets/icons/solid/credit-card.svg +0 -4
  425. data/app/assets/icons/solid/css.svg +0 -3
  426. data/app/assets/icons/solid/database.svg +0 -3
  427. data/app/assets/icons/solid/desktop-pc.svg +0 -3
  428. data/app/assets/icons/solid/discord.svg +0 -3
  429. data/app/assets/icons/solid/download.svg +0 -4
  430. data/app/assets/icons/solid/draw-square.svg +0 -4
  431. data/app/assets/icons/solid/dribbble.svg +0 -3
  432. data/app/assets/icons/solid/dropbox.svg +0 -4
  433. data/app/assets/icons/solid/edit.svg +0 -4
  434. data/app/assets/icons/solid/envelope-open.svg +0 -4
  435. data/app/assets/icons/solid/envelope.svg +0 -4
  436. data/app/assets/icons/solid/exclamation-circle.svg +0 -3
  437. data/app/assets/icons/solid/eye-slash.svg +0 -5
  438. data/app/assets/icons/solid/eye.svg +0 -3
  439. data/app/assets/icons/solid/face-explode.svg +0 -3
  440. data/app/assets/icons/solid/face-grin-stars.svg +0 -3
  441. data/app/assets/icons/solid/face-grin.svg +0 -3
  442. data/app/assets/icons/solid/face-laugh.svg +0 -3
  443. data/app/assets/icons/solid/facebook.svg +0 -3
  444. data/app/assets/icons/solid/file-chart-bar.svg +0 -3
  445. data/app/assets/icons/solid/file-check.svg +0 -4
  446. data/app/assets/icons/solid/file-circle-plus.svg +0 -4
  447. data/app/assets/icons/solid/file-clone.svg +0 -4
  448. data/app/assets/icons/solid/file-code.svg +0 -3
  449. data/app/assets/icons/solid/file-copy-alt.svg +0 -4
  450. data/app/assets/icons/solid/file-copy.svg +0 -4
  451. data/app/assets/icons/solid/file-csv.svg +0 -3
  452. data/app/assets/icons/solid/file-export.svg +0 -3
  453. data/app/assets/icons/solid/file-image.svg +0 -3
  454. data/app/assets/icons/solid/file-import.svg +0 -3
  455. data/app/assets/icons/solid/file-invoice.svg +0 -3
  456. data/app/assets/icons/solid/file-lines.svg +0 -3
  457. data/app/assets/icons/solid/file-music.svg +0 -3
  458. data/app/assets/icons/solid/file-paste.svg +0 -4
  459. data/app/assets/icons/solid/file-pdf.svg +0 -3
  460. data/app/assets/icons/solid/file-pen.svg +0 -4
  461. data/app/assets/icons/solid/file-ppt.svg +0 -3
  462. data/app/assets/icons/solid/file-search.svg +0 -3
  463. data/app/assets/icons/solid/file-shield.svg +0 -4
  464. data/app/assets/icons/solid/file-video.svg +0 -3
  465. data/app/assets/icons/solid/file-word.svg +0 -3
  466. data/app/assets/icons/solid/file-zip.svg +0 -3
  467. data/app/assets/icons/solid/file.svg +0 -3
  468. data/app/assets/icons/solid/filter.svg +0 -3
  469. data/app/assets/icons/solid/fire.svg +0 -3
  470. data/app/assets/icons/solid/flag.svg +0 -3
  471. data/app/assets/icons/solid/flowbite.svg +0 -6
  472. data/app/assets/icons/solid/folder-arrow-right.svg +0 -3
  473. data/app/assets/icons/solid/folder-duplicate.svg +0 -4
  474. data/app/assets/icons/solid/folder-open.svg +0 -3
  475. data/app/assets/icons/solid/folder-plus.svg +0 -3
  476. data/app/assets/icons/solid/folder.svg +0 -3
  477. data/app/assets/icons/solid/forward-step.svg +0 -3
  478. data/app/assets/icons/solid/forward.svg +0 -3
  479. data/app/assets/icons/solid/gift-box.svg +0 -3
  480. data/app/assets/icons/solid/github.svg +0 -3
  481. data/app/assets/icons/solid/globe.svg +0 -3
  482. data/app/assets/icons/solid/google.svg +0 -3
  483. data/app/assets/icons/solid/grid-plus.svg +0 -3
  484. data/app/assets/icons/solid/grid.svg +0 -3
  485. data/app/assets/icons/solid/headphones.svg +0 -3
  486. data/app/assets/icons/solid/heart.svg +0 -3
  487. data/app/assets/icons/solid/home.svg +0 -3
  488. data/app/assets/icons/solid/hourglass.svg +0 -3
  489. data/app/assets/icons/solid/html.svg +0 -3
  490. data/app/assets/icons/solid/image.svg +0 -4
  491. data/app/assets/icons/solid/inbox-full.svg +0 -3
  492. data/app/assets/icons/solid/inbox.svg +0 -3
  493. data/app/assets/icons/solid/indent.svg +0 -3
  494. data/app/assets/icons/solid/info-circle.svg +0 -3
  495. data/app/assets/icons/solid/keyboard.svg +0 -3
  496. data/app/assets/icons/solid/label.svg +0 -3
  497. data/app/assets/icons/solid/landmark.svg +0 -4
  498. data/app/assets/icons/solid/layers.svg +0 -4
  499. data/app/assets/icons/solid/life-saver.svg +0 -3
  500. data/app/assets/icons/solid/lightbulb.svg +0 -3
  501. data/app/assets/icons/solid/linkedin.svg +0 -4
  502. data/app/assets/icons/solid/list-music.svg +0 -3
  503. data/app/assets/icons/solid/lock-open.svg +0 -3
  504. data/app/assets/icons/solid/lock-time.svg +0 -4
  505. data/app/assets/icons/solid/lock.svg +0 -3
  506. data/app/assets/icons/solid/mail-box.svg +0 -3
  507. data/app/assets/icons/solid/map-pin-alt.svg +0 -3
  508. data/app/assets/icons/solid/map-pin.svg +0 -3
  509. data/app/assets/icons/solid/message-caption.svg +0 -3
  510. data/app/assets/icons/solid/message-dots.svg +0 -3
  511. data/app/assets/icons/solid/messages.svg +0 -4
  512. data/app/assets/icons/solid/microphone.svg +0 -4
  513. data/app/assets/icons/solid/mobile-phone.svg +0 -3
  514. data/app/assets/icons/solid/moon.svg +0 -3
  515. data/app/assets/icons/solid/newspaper.svg +0 -3
  516. data/app/assets/icons/solid/npm.svg +0 -3
  517. data/app/assets/icons/solid/outdent.svg +0 -3
  518. data/app/assets/icons/solid/palette.svg +0 -3
  519. data/app/assets/icons/solid/paper-plane.svg +0 -3
  520. data/app/assets/icons/solid/paragraph.svg +0 -3
  521. data/app/assets/icons/solid/pause.svg +0 -3
  522. data/app/assets/icons/solid/pen-nib.svg +0 -3
  523. data/app/assets/icons/solid/pen.svg +0 -3
  524. data/app/assets/icons/solid/phone.svg +0 -3
  525. data/app/assets/icons/solid/play.svg +0 -3
  526. data/app/assets/icons/solid/printer.svg +0 -3
  527. data/app/assets/icons/solid/profile-card.svg +0 -3
  528. data/app/assets/icons/solid/question-circle.svg +0 -3
  529. data/app/assets/icons/solid/quote.svg +0 -3
  530. data/app/assets/icons/solid/react.svg +0 -4
  531. data/app/assets/icons/solid/receipt.svg +0 -3
  532. data/app/assets/icons/solid/rectangle-list.svg +0 -3
  533. data/app/assets/icons/solid/reply-all.svg +0 -3
  534. data/app/assets/icons/solid/reply.svg +0 -3
  535. data/app/assets/icons/solid/rocket.svg +0 -3
  536. data/app/assets/icons/solid/sale-percent.svg +0 -3
  537. data/app/assets/icons/solid/scale-balanced.svg +0 -3
  538. data/app/assets/icons/solid/search.svg +0 -4
  539. data/app/assets/icons/solid/share-all.svg +0 -3
  540. data/app/assets/icons/solid/share-nodes.svg +0 -3
  541. data/app/assets/icons/solid/shield-check.svg +0 -3
  542. data/app/assets/icons/solid/shield.svg +0 -3
  543. data/app/assets/icons/solid/shopping-bag.svg +0 -3
  544. data/app/assets/icons/solid/stackoverflow.svg +0 -4
  545. data/app/assets/icons/solid/star-half-stroke.svg +0 -3
  546. data/app/assets/icons/solid/star-half.svg +0 -3
  547. data/app/assets/icons/solid/star.svg +0 -3
  548. data/app/assets/icons/solid/store.svg +0 -3
  549. data/app/assets/icons/solid/sun.svg +0 -3
  550. data/app/assets/icons/solid/swatchbook.svg +0 -3
  551. data/app/assets/icons/solid/table-column.svg +0 -3
  552. data/app/assets/icons/solid/table-row.svg +0 -3
  553. data/app/assets/icons/solid/tablet.svg +0 -3
  554. data/app/assets/icons/solid/tag.svg +0 -3
  555. data/app/assets/icons/solid/tailwind.svg +0 -3
  556. data/app/assets/icons/solid/terminal.svg +0 -3
  557. data/app/assets/icons/solid/thumbs-down.svg +0 -3
  558. data/app/assets/icons/solid/thumbs-up.svg +0 -3
  559. data/app/assets/icons/solid/ticket.svg +0 -3
  560. data/app/assets/icons/solid/trash-bin.svg +0 -3
  561. data/app/assets/icons/solid/truck.svg +0 -3
  562. data/app/assets/icons/solid/twitter.svg +0 -3
  563. data/app/assets/icons/solid/upload.svg +0 -3
  564. data/app/assets/icons/solid/user-add.svg +0 -3
  565. data/app/assets/icons/solid/user-circle.svg +0 -3
  566. data/app/assets/icons/solid/user-edit.svg +0 -3
  567. data/app/assets/icons/solid/user-headset.svg +0 -3
  568. data/app/assets/icons/solid/user-remove.svg +0 -3
  569. data/app/assets/icons/solid/user-settings.svg +0 -3
  570. data/app/assets/icons/solid/user.svg +0 -3
  571. data/app/assets/icons/solid/users-group.svg +0 -3
  572. data/app/assets/icons/solid/users.svg +0 -3
  573. data/app/assets/icons/solid/video-camera.svg +0 -3
  574. data/app/assets/icons/solid/volume-down.svg +0 -4
  575. data/app/assets/icons/solid/volume-up.svg +0 -5
  576. data/app/assets/icons/solid/vue.svg +0 -3
  577. data/app/assets/icons/solid/wallet.svg +0 -4
  578. data/app/assets/icons/solid/wand-magic-sparkles.svg +0 -4
  579. data/app/assets/icons/solid/window-restore.svg +0 -4
  580. data/app/assets/icons/solid/window.svg +0 -3
  581. data/app/assets/icons/solid/youtube.svg +0 -3
  582. data/app/assets/icons/solid/zoom-in.svg +0 -3
  583. data/app/assets/icons/solid/zoom-out.svg +0 -3
  584. data/app/views/components/action_button/action_button_component.html.erb +0 -7
  585. data/app/views/components/action_button/action_button_component.rb +0 -15
  586. data/app/views/components/attributes.rb +0 -184
  587. data/app/views/components/base.rb +0 -29
  588. data/app/views/components/block/block_component.html.erb +0 -3
  589. data/app/views/components/block/block_component.rb +0 -44
  590. data/app/views/components/breadcrumbs/breadcrumbs_component.html.erb +0 -96
  591. data/app/views/components/breadcrumbs/breadcrumbs_component.rb +0 -9
  592. data/app/views/components/button/button_component.html.erb +0 -11
  593. data/app/views/components/button/button_component.rb +0 -128
  594. data/app/views/components/dyna_frame_content/dyna_frame_content_component.html.erb +0 -8
  595. data/app/views/components/dyna_frame_content/dyna_frame_content_component.rb +0 -6
  596. data/app/views/components/dyna_frame_host/dyna_frame_host_component.html.erb +0 -3
  597. data/app/views/components/dyna_frame_host/dyna_frame_host_component.rb +0 -18
  598. data/app/views/components/empty_card/empty_card_component.html.erb +0 -6
  599. data/app/views/components/empty_card/empty_card_component.rb +0 -7
  600. data/app/views/components/form/form_builder.rb +0 -75
  601. data/app/views/components/form/form_component.html.erb +0 -73
  602. data/app/views/components/form/form_component.rb +0 -23
  603. data/app/views/components/has_many_panel/has_many_panel_component.html.erb +0 -25
  604. data/app/views/components/has_many_panel/has_many_panel_component.rb +0 -16
  605. data/app/views/components/header/header_component.html.erb +0 -1
  606. data/app/views/components/header/header_component.rb +0 -7
  607. data/app/views/components/interactive_action_form/interactive_action_form_component.html.erb +0 -39
  608. data/app/views/components/interactive_action_form/interactive_action_form_component.rb +0 -8
  609. data/app/views/components/nav_grid_menu/nav_grid_menu_component.html.erb +0 -24
  610. data/app/views/components/nav_grid_menu/nav_grid_menu_component.rb +0 -23
  611. data/app/views/components/nav_grid_menu_item/nav_grid_menu_item_component.html.erb +0 -4
  612. data/app/views/components/nav_grid_menu_item/nav_grid_menu_item_component.rb +0 -20
  613. data/app/views/components/nav_user/nav_user_component.html.erb +0 -50
  614. data/app/views/components/nav_user/nav_user_component.rb +0 -32
  615. data/app/views/components/nav_user_link/nav_user_link_component.html.erb +0 -7
  616. data/app/views/components/nav_user_link/nav_user_link_component.rb +0 -23
  617. data/app/views/components/nav_user_section/nav_user_section_component.html.erb +0 -7
  618. data/app/views/components/nav_user_section/nav_user_section_component.rb +0 -18
  619. data/app/views/components/nested_resource_form_fields/nested_resource_form_fields_component.html.erb +0 -64
  620. data/app/views/components/nested_resource_form_fields/nested_resource_form_fields_component.rb +0 -29
  621. data/app/views/components/pagination/pagination_component.html.erb +0 -6
  622. data/app/views/components/pagination/pagination_component.rb +0 -94
  623. data/app/views/components/panel/panel_component.html.erb +0 -17
  624. data/app/views/components/panel/panel_component.rb +0 -17
  625. data/app/views/components/resource_header/resource_header_component.html.erb +0 -83
  626. data/app/views/components/resource_header/resource_header_component.rb +0 -30
  627. data/app/views/components/resource_layout/resource_layout_component.html.erb +0 -53
  628. data/app/views/components/resource_layout/resource_layout_component.rb +0 -41
  629. data/app/views/components/sidebar/sidebar_component.html.erb +0 -69
  630. data/app/views/components/sidebar/sidebar_component.rb +0 -23
  631. data/app/views/components/sidebar_menu/sidebar_menu_component.html.erb +0 -5
  632. data/app/views/components/sidebar_menu/sidebar_menu_component.rb +0 -17
  633. data/app/views/components/sidebar_menu_item/sidebar_menu_item_component.html.erb +0 -64
  634. data/app/views/components/sidebar_menu_item/sidebar_menu_item_component.rb +0 -52
  635. data/app/views/components/skeleton/table/table_component.html.erb +0 -18
  636. data/app/views/components/skeleton/table/table_component.rb +0 -6
  637. data/app/views/components/table/table_component.html.erb +0 -43
  638. data/app/views/components/table/table_component.rb +0 -159
  639. data/app/views/components/table_search_input/table_search_input_component.html.erb +0 -48
  640. data/app/views/components/table_search_input/table_search_input_component.rb +0 -15
  641. data/app/views/components/table_toolbar/table_toolbar_component.html.erb +0 -7
  642. data/app/views/components/table_toolbar/table_toolbar_component.rb +0 -17
  643. data/app/views/components/toolbar/toolbar_component.html.erb +0 -67
  644. data/app/views/components/toolbar/toolbar_component.rb +0 -26
  645. data/app/views/layouts/resource.html copy.erb +0 -49
  646. data/app/views/plutonium/_resource_header.html copy.erb +0 -287
  647. data/lib/generators/pu/gen/component/component_generator.rb +0 -99
  648. data/lib/generators/pu/gen/component/templates/component.html.erb.tt +0 -3
  649. data/lib/generators/pu/gen/component/templates/component.rb.tt +0 -15
  650. data/lib/generators/pu/gen/component/templates/controller.js.tt +0 -8
  651. data/lib/plutonium/builders/menus/sidebar_menu.rb.bk +0 -26
  652. data/lib/plutonium/builders/menus/sidebar_menu_item.rb.bk +0 -28
  653. data/lib/plutonium/component_registry.rb +0 -19
  654. data/lib/plutonium/core/action.rb +0 -49
  655. data/lib/plutonium/core/actions/basic_action.rb +0 -16
  656. data/lib/plutonium/core/actions/collection.rb +0 -37
  657. data/lib/plutonium/core/actions/destroy_action.rb +0 -23
  658. data/lib/plutonium/core/actions/edit_action.rb +0 -21
  659. data/lib/plutonium/core/actions/interactive_action.rb +0 -64
  660. data/lib/plutonium/core/actions/new_action.rb +0 -20
  661. data/lib/plutonium/core/actions/show_action.rb +0 -19
  662. data/lib/plutonium/core/associations/renderers/base.rb +0 -77
  663. data/lib/plutonium/core/associations/renderers/factory.rb +0 -36
  664. data/lib/plutonium/core/associations/renderers/has_many_renderer.rb +0 -18
  665. data/lib/plutonium/core/autodiscovery/association_renderer_discoverer.rb +0 -31
  666. data/lib/plutonium/core/autodiscovery/discoverer.rb +0 -15
  667. data/lib/plutonium/core/autodiscovery/input_discoverer.rb +0 -31
  668. data/lib/plutonium/core/autodiscovery/renderer_discoverer.rb +0 -31
  669. data/lib/plutonium/core/definers/action_definer.rb +0 -25
  670. data/lib/plutonium/core/definers/association_renderer_definer.rb +0 -33
  671. data/lib/plutonium/core/definers/field_definer.rb +0 -19
  672. data/lib/plutonium/core/definers/field_input_definer.rb +0 -77
  673. data/lib/plutonium/core/definers/field_renderer_definer.rb +0 -37
  674. data/lib/plutonium/core/fields/inputs/attachment_input.rb +0 -24
  675. data/lib/plutonium/core/fields/inputs/base.rb +0 -110
  676. data/lib/plutonium/core/fields/inputs/belongs_to_association_input.rb +0 -15
  677. data/lib/plutonium/core/fields/inputs/checkbox_input.rb +0 -15
  678. data/lib/plutonium/core/fields/inputs/date_time_input.rb +0 -15
  679. data/lib/plutonium/core/fields/inputs/factory.rb +0 -50
  680. data/lib/plutonium/core/fields/inputs/has_many_association_input.rb +0 -15
  681. data/lib/plutonium/core/fields/inputs/nested_input.rb +0 -72
  682. data/lib/plutonium/core/fields/inputs/noop_input.rb +0 -16
  683. data/lib/plutonium/core/fields/inputs/phone_input.rb +0 -22
  684. data/lib/plutonium/core/fields/inputs/polymorphic_belongs_to_association_input.rb +0 -48
  685. data/lib/plutonium/core/fields/inputs/simple_form_association_input.rb +0 -26
  686. data/lib/plutonium/core/fields/inputs/simple_form_input.rb +0 -13
  687. data/lib/plutonium/core/fields/renderers/association_renderer.rb +0 -28
  688. data/lib/plutonium/core/fields/renderers/attachment_renderer.rb +0 -21
  689. data/lib/plutonium/core/fields/renderers/base.rb +0 -83
  690. data/lib/plutonium/core/fields/renderers/basic_renderer.rb +0 -13
  691. data/lib/plutonium/core/fields/renderers/factory.rb +0 -37
  692. data/lib/plutonium/core/renderable.rb +0 -20
  693. data/lib/plutonium/core/ui/collection.rb +0 -18
  694. data/lib/plutonium/core/ui/detail.rb +0 -15
  695. data/lib/plutonium/core/ui/form.rb +0 -12
  696. data/lib/plutonium/helpers/action_buttons_helper.rb +0 -32
  697. data/lib/plutonium/helpers/component_helper.rb +0 -14
  698. data/lib/plutonium/helpers/form_helper.rb +0 -50
  699. data/lib/plutonium/icons.rb +0 -32
  700. data/lib/plutonium/preserved__/field.rb.bk +0 -65
  701. data/lib/plutonium/preserved__/input.rb.bk +0 -93
  702. data/lib/plutonium/ui/table/components/pagy_page_info.rb +0 -70
  703. data/src/js/controllers/has_many_panel_controller.js +0 -8
  704. data/src/js/controllers/interactive_action_form_controller.js +0 -13
  705. data/src/js/controllers/nav_grid_menu_controller.js +0 -8
  706. data/src/js/controllers/nav_grid_menu_item_controller.js +0 -8
  707. data/src/js/controllers/nav_user_controller.js +0 -8
  708. data/src/js/controllers/nav_user_link_controller.js +0 -8
  709. data/src/js/controllers/nav_user_section_controller.js +0 -8
  710. data/src/js/controllers/resource_layout_controller.js +0 -8
  711. data/src/js/controllers/sidebar_controller.js +0 -8
  712. data/src/js/controllers/sidebar_menu_controller.js +0 -8
  713. data/src/js/controllers/sidebar_menu_item_controller.js +0 -8
  714. data/src/js/controllers/table_controller.js +0 -8
  715. data/src/js/controllers/table_search_input_controller.js +0 -8
  716. data/src/js/controllers/table_toolbar_controller.js +0 -8
  717. data/src/js/controllers/toolbar_controller.js +0 -8
@@ -21,7 +21,9 @@ module Pu
21
21
 
22
22
  def add_rodauth
23
23
  Bundler.with_unbundled_env do
24
- run "bundle add bcrypt rodauth-rails"
24
+ %w[bcrypt sequel-activerecord_connection tilt rodauth-rails].each do |gem|
25
+ run "bundle add #{gem}"
26
+ end
25
27
  end
26
28
  end
27
29
 
@@ -0,0 +1,7 @@
1
+ # Used by the otp_unlock feature
2
+ create_table :<%= table_prefix %>_otp_unlocks, id: false do |t|
3
+ t.<%= primary_key_type(nil) %> :id, primary_key: true
4
+ t.foreign_key :<%= table_prefix.pluralize %>, column: :id
5
+ t.integer :num_successes, null: false, default: 1
6
+ t.datetime :next_auth_attempt_after, null: false, default: -> { "<%= current_timestamp %>" }
7
+ end
@@ -1,52 +1,8 @@
1
1
  ===============================================================================
2
2
 
3
- Depending on your application's configuration some manual setup may be required:
3
+ * You can copy Rodauth views into your app by running:
4
4
 
5
- 1. Ensure you have defined default url options in your environments files. Here
6
- is an example of default_url_options appropriate for a development environment
7
- in config/environments/development.rb:
5
+ rails g pu:rodauth:views account_name --features=change_login reset_password
8
6
 
9
- config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
10
-
11
- In production, :host should be set to the actual host of your application.
12
-
13
- * Required for all applications. *
14
-
15
- 2. Ensure you have defined root_url to *something* in your config/routes.rb.
16
- For example:
17
-
18
- root to: "home#index"
19
-
20
- * Not required for API-only Applications *
21
-
22
- 3. Ensure you have flash messages in app/views/layouts/application.html.erb.
23
- For example:
24
-
25
- <% if notice %>
26
- <div class="alert alert-success"><%= notice %></div>
27
- <% end %>
28
- <% if alert %>
29
- <div class="alert alert-danger"><%= alert %></div>
30
- <% end %>
31
-
32
- * Not required for API-only Applications *
33
-
34
- 4. Titles for Rodauth pages are available via @page_title instance variable
35
- by default, you can use it in your layout file:
36
-
37
- <head>
38
- <title><%= @page_title || "Default title" %></title>
39
- ...
40
- </head>
41
-
42
- * Not required *
43
-
44
- 5. You can copy Rodauth views (for customization) to your app by running:
45
-
46
- rails g rodauth:views # default bootstrap views
47
-
48
- rails g rodauth:views --css=tailwind # tailwind views (requires @tailwindcss/forms plugin)
49
-
50
- * Not required *
51
7
 
52
8
  ===============================================================================
@@ -5,12 +5,12 @@ module Rodauth
5
5
 
6
6
  private
7
7
 
8
- def current_account(name = <%= ":#{table_prefix}" %>)
9
- super(name)
8
+ def current_account
9
+ rodauth.rails_account
10
10
  end
11
11
 
12
12
  def rodauth(name = <%= ":#{table_prefix}" %>)
13
- super(name)
13
+ super
14
14
  end
15
15
  end
16
16
  end
@@ -51,12 +51,61 @@ class RodauthMailer < ApplicationMailer
51
51
  mail subject: @rodauth.email_subject_prefix + @rodauth.unlock_account_email_subject
52
52
  end
53
53
 
54
+ def otp_locked_out(name, account_id)
55
+ @rodauth = rodauth(name, account_id)
56
+ @account = @rodauth.rails_account
57
+
58
+ mail subject: @rodauth.email_subject_prefix + @rodauth.otp_locked_out_email_subject
59
+ end
60
+
61
+ def otp_unlocked(name, account_id)
62
+ @rodauth = rodauth(name, account_id)
63
+ @account = @rodauth.rails_account
64
+
65
+ mail subject: @rodauth.email_subject_prefix + @rodauth.otp_unlocked_email_subject
66
+ end
67
+
68
+ def otp_unlock_failed(name, account_id)
69
+ @rodauth = rodauth(name, account_id)
70
+ @account = @rodauth.rails_account
71
+
72
+ mail subject: @rodauth.email_subject_prefix + @rodauth.otp_unlock_failed_email_subject
73
+ end
74
+
75
+ def otp_setup(name, account_id)
76
+ @rodauth = rodauth(name, account_id)
77
+ @account = @rodauth.rails_account
78
+
79
+ mail subject: @rodauth.email_subject_prefix + @rodauth.otp_setup_email_subject
80
+ end
81
+
82
+ def otp_disabled(name, account_id)
83
+ @rodauth = rodauth(name, account_id)
84
+ @account = @rodauth.rails_account
85
+
86
+ mail subject: @rodauth.email_subject_prefix + @rodauth.otp_disabled_email_subject
87
+ end
88
+
89
+ def webauthn_authenticator_added(name, account_id)
90
+ @rodauth = rodauth(name, account_id)
91
+ @account = @rodauth.rails_account
92
+
93
+ mail subject: @rodauth.email_subject_prefix + @rodauth.webauthn_authenticator_added_email_subject
94
+ end
95
+
96
+ def webauthn_authenticator_removed(name, account_id)
97
+ @rodauth = rodauth(name, account_id)
98
+ @account = @rodauth.rails_account
99
+
100
+ mail subject: @rodauth.email_subject_prefix + @rodauth.webauthn_authenticator_removed_email_subject
101
+ end
102
+
54
103
  private
55
104
 
56
105
  def rodauth(name, account_id, &block)
57
106
  instance = RodauthApp.rodauth(name).allocate
58
107
  instance.url_options = default_url_options
59
- instance.instance_eval { @account = account_ds(account_id).first! }
108
+ instance.account_from_id(account_id)
60
109
  instance.instance_eval(&block) if block
61
110
  instance
62
111
  end
@@ -16,6 +16,9 @@ class <%= account_path.classify %>RodauthPlugin < RodauthPlugin
16
16
 
17
17
  # ==> General
18
18
 
19
+ # Prevent rodauth from introspecting the database if we are not using UUIDs
20
+ convert_token_id_to_integer? { <%= account_path.classify %>.columns_hash["id"].type == :integer }
21
+
19
22
  # Change prefix of table and foreign key column names from default "account"
20
23
  # accounts_table: 'players'
21
24
 
@@ -129,6 +132,40 @@ class <%= account_path.classify %>RodauthPlugin < RodauthPlugin
129
132
  Rodauth::<%= account_path.classify %>Mailer.unlock_account(self.class.configuration_name, account_id, unlock_account_key_value)
130
133
  end
131
134
  <% end -%>
135
+ <% if otp_lockout_email? -%>
136
+
137
+ create_otp_locked_out_email do
138
+ Rodauth::<%= account_path.classify %>Mailer.otp_locked_out(self.class.configuration_name, account_id)
139
+ end
140
+
141
+ create_otp_unlocked_email do
142
+ Rodauth::<%= account_path.classify %>Mailer.otp_unlocked(self.class.configuration_name, account_id)
143
+ end
144
+
145
+ create_otp_unlock_failed_email do
146
+ Rodauth::<%= account_path.classify %>Mailer.otp_unlock_failed(self.class.configuration_name, account_id)
147
+ end
148
+ <% end -%>
149
+ <% if otp_modify_email? -%>
150
+
151
+ create_otp_setup_email do
152
+ Rodauth::<%= account_path.classify %>Mailer.otp_setup(self.class.configuration_name, account_id)
153
+ end
154
+
155
+ create_otp_disabled_email do
156
+ Rodauth::<%= account_path.classify %>Mailer.otp_disabled(self.class.configuration_name, account_id)
157
+ end
158
+ <% end -%>
159
+ <% if webauthn_modify_email? -%>
160
+
161
+ create_webauthn_authenticator_added_email do
162
+ Rodauth::<%= account_path.classify %>Mailer.webauthn_authenticator_added(self.class.configuration_name, account_id)
163
+ end
164
+
165
+ create_webauthn_authenticator_removed_email do
166
+ Rodauth::<%= account_path.classify %>Mailer.webauthn_authenticator_removed(self.class.configuration_name, account_id)
167
+ end
168
+ <% end -%>
132
169
 
133
170
  send_email do |email|
134
171
  # queue email delivery on the mailer after the transaction commits
@@ -253,9 +290,6 @@ class <%= account_path.classify %>RodauthPlugin < RodauthPlugin
253
290
  # Redirect to login page after password reset.
254
291
  reset_password_redirect { login_path }
255
292
  <% end -%>
256
-
257
- # Ensure requiring login follows login route changes.
258
- require_login_redirect { login_path }
259
293
  <% end -%>
260
294
 
261
295
  # ==> Deadlines
@@ -23,10 +23,6 @@ class RodauthPlugin < Rodauth::Rails::Auth
23
23
  db Sequel.<%= sequel_adapter %>(extensions: :activerecord_connection, keep_reference: false)
24
24
  <% end -%>
25
25
 
26
- # Prevent rodauth from introspecting the database if we are not using UUIDs
27
- # https://github.com/janko/rodauth-rails/issues/244
28
- convert_token_id_to_integer? true
29
-
30
26
  # Change prefix of table and foreign key column names from default "account"
31
27
  # accounts_table :users
32
28
  # verify_account_table :user_verification_keys
@@ -66,7 +62,11 @@ class RodauthPlugin < Rodauth::Rails::Auth
66
62
  # delete_account_on_close? true
67
63
 
68
64
  # Redirect to the app from login and registration pages if already logged in.
69
- already_logged_in { redirect login_redirect }
65
+ already_logged_in do
66
+ uri = URI(login_redirect)
67
+ uri.query = URI.encode_www_form(rails_request.query_parameters)
68
+ redirect uri.to_s
69
+ end
70
70
 
71
71
  # ==> JWT
72
72
 
@@ -115,6 +115,34 @@ class RodauthPlugin < Rodauth::Rails::Auth
115
115
  # RodauthMailer.unlock_account(self.class.configuration_name, account_id, unlock_account_key_value)
116
116
  # end
117
117
 
118
+ # create_otp_locked_out_email do
119
+ # RodauthMailer.otp_locked_out(self.class.configuration_name, account_id)
120
+ # end
121
+
122
+ # create_otp_unlocked_email do
123
+ # RodauthMailer.otp_unlocked(self.class.configuration_name, account_id)
124
+ # end
125
+
126
+ # create_otp_unlock_failed_email do
127
+ # RodauthMailer.otp_unlock_failed(self.class.configuration_name, account_id)
128
+ # end
129
+
130
+ # create_otp_setup_email do
131
+ # RodauthMailer.otp_setup(self.class.configuration_name, account_id)
132
+ # end
133
+
134
+ # create_otp_disabled_email do
135
+ # RodauthMailer.otp_disabled(self.class.configuration_name, account_id)
136
+ # end
137
+
138
+ # create_webauthn_authenticator_added_email do
139
+ # RodauthMailer.webauthn_authenticator_added(self.class.configuration_name, account_id)
140
+ # end
141
+
142
+ # create_webauthn_authenticator_removed_email do
143
+ # RodauthMailer.webauthn_authenticator_removed(self.class.configuration_name, account_id)
144
+ # end
145
+
118
146
  # send_email do |email|
119
147
  # # queue email delivery on the mailer after the transaction commits
120
148
  # db.after_commit { email.deliver_later }
@@ -216,9 +244,6 @@ class RodauthPlugin < Rodauth::Rails::Auth
216
244
  # Redirect to login page after password reset.
217
245
  # reset_password_redirect { login_path }
218
246
 
219
- # Ensure requiring login follows login route changes.
220
- # require_login_redirect { login_path }
221
-
222
247
  # ==> Deadlines
223
248
  # Change default deadlines for some actions.
224
249
  # verify_account_grace_period 3.days.to_i
@@ -0,0 +1,2 @@
1
+ Someone (hopefully you) has disabled TOTP authentication for the account
2
+ associated to this email address.
@@ -0,0 +1,9 @@
1
+ TOTP authentication has been locked out on your account due to too many
2
+ consecutive authentication failures. You can attempt to unlock TOTP
3
+ authentication for your account by consecutively authenticating via
4
+ TOTP multiple times.
5
+
6
+ If you did not initiate the TOTP authentication failures that
7
+ caused TOTP authentication to be locked out, that means someone already
8
+ has partial access to your account, but is unable to use TOTP
9
+ authentication to fully authenticate themselves.
@@ -0,0 +1,2 @@
1
+ Someone (hopefully you) has setup TOTP authentication for the account
2
+ associated to this email address
@@ -0,0 +1,8 @@
1
+ Someone (hopefully you) attempted to unlock TOTP authentication for the
2
+ account associated to this email address, but failed as the
3
+ authentication code submitted was not correct.
4
+
5
+ If you did not initiate the TOTP authentication failure that generated
6
+ this email, that means someone already has partial access to your
7
+ account, but is unable to use TOTP authentication to fully authenticate
8
+ themselves.
@@ -0,0 +1,2 @@
1
+ Someone (hopefully you) has unlocked TOTP authentication for the account
2
+ associated to this email address.
@@ -0,0 +1,3 @@
1
+ Someone (hopefully you) has added a WebAuthn authenticator to the
2
+ account associated to this email address. There are now <%= @account.webauthn_keys.count %> WebAuthn
3
+ authenticator(s) with access to the account.
@@ -0,0 +1,3 @@
1
+ Someone (hopefully you) has removed a WebAuthn authenticator from the
2
+ account associated to this email address. There are now <%= @account.webauthn_keys.count %> WebAuthn
3
+ authenticator(s) with access to the account.
@@ -42,7 +42,6 @@ module Pu
42
42
  copy_file view_location(view), "app/views/#{directory}/#{view}.html.erb" do |content|
43
43
  content = content.gsub("rodauth.", "rodauth(:#{configuration_name}).") if configuration_name
44
44
  content = content.gsub("rodauth/", "#{directory}/")
45
- content = form_helpers_compatibility(content) if ActionView.version < Gem::Version.new("5.1")
46
45
  content
47
46
  end
48
47
  end
@@ -94,18 +93,8 @@ module Pu
94
93
  plugin_name
95
94
  end
96
95
 
97
- # We need to use the *_tag helpers on versions lower than Rails 5.1.
98
- def form_helpers_compatibility(content)
99
- content
100
- .gsub(/form_with url: (.+) do \|form\|/, 'form_tag \1 do')
101
- .gsub(/form\.(label|submit)/, '\1_tag')
102
- .gsub(/form\.(email|password|text|telephone|hidden)_field (\S+), value:/, '\1_field_tag \2,')
103
- .gsub(/form\.radio_button (\S+), (\S+),/, 'radio_button_tag \1, \2, false,')
104
- .gsub(/form\.check_box (\S+), (.+) /, 'check_box_tag \1, "t", false, \2 ')
105
- end
106
-
107
96
  def view_location(view)
108
- "app/views/rodauth/#{view}.html.erb"
97
+ File.join Plutonium.root, "app/views/rodauth/#{view}.html.erb"
109
98
  end
110
99
  end
111
100
  end
@@ -19,7 +19,9 @@ module Plutonium
19
19
  # Use this when getting a scope for a resource that is not the current
20
20
  # Use this instead of authorized_scope directly
21
21
  def authorized_resource_scope(resource, relation: nil, **options)
22
- raise ArgumentError("Expected resource to be a class inheriting ActiveRecord::Base") unless resource.instance_of?(Class) && resource < ActiveRecord::Base
22
+ unless resource.instance_of?(Class) && resource < ActiveRecord::Base
23
+ raise ArgumentError("Expected resource to be a class inheriting ActiveRecord::Base")
24
+ end
23
25
 
24
26
  options[:with] ||= ActionPolicy.lookup(resource, namespace: authorization_namespace)
25
27
  relation ||= resource.all
@@ -4,14 +4,6 @@ module Plutonium
4
4
  def application_name
5
5
  Plutonium.application_name
6
6
  end
7
-
8
- # Renders an icon using the Plutonium Icons library.
9
- #
10
- # @param icon [Symbol, String] The name or identifier of the icon to render.
11
- # @return [String] The HTML-safe string for the rendered icon.
12
- def render_icon(icon, **)
13
- Plutonium::Icons.render(icon, **)
14
- end
15
7
  end
16
8
  end
17
9
  end
@@ -2,13 +2,10 @@ module Plutonium
2
2
  module Helpers
3
3
  def self.included(base)
4
4
  base.class_eval do
5
- include Plutonium::Helpers::ActionButtonsHelper
6
5
  include Plutonium::Helpers::ApplicationHelper
7
6
  include Plutonium::Helpers::AttachmentHelper
8
- include Plutonium::Helpers::ComponentHelper
9
7
  include Plutonium::Helpers::ContentHelper
10
8
  include Plutonium::Helpers::DisplayHelper
11
- include Plutonium::Helpers::FormHelper
12
9
  include Plutonium::Helpers::TableHelper
13
10
  include Plutonium::Helpers::TurboHelper
14
11
  include Plutonium::Helpers::TurboStreamActionsHelper
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "view_component"
4
-
5
3
  module Plutonium
6
4
  # Plutonium::Railtie integrates Plutonium with Rails applications.
7
5
  #
@@ -33,10 +31,6 @@ module Plutonium
33
31
  setup_asset_pipeline if Rails.application.config.respond_to?(:assets)
34
32
  end
35
33
 
36
- initializer "plutonium.load_components" do
37
- load_base_component
38
- end
39
-
40
34
  initializer "plutonium.initializers" do
41
35
  load_plutonium_initializers
42
36
  end
@@ -45,10 +39,6 @@ module Plutonium
45
39
  setup_development_asset_server if Plutonium.configuration.development?
46
40
  end
47
41
 
48
- initializer "plutonium.view_components_capture_compat" do
49
- config.view_component.capture_compatibility_patch_enabled = true
50
- end
51
-
52
42
  initializer "plutonium.action_dispatch_extensions" do
53
43
  extend_action_dispatch
54
44
  end
@@ -74,10 +64,6 @@ module Plutonium
74
64
  Rails.application.config.assets.paths << Plutonium.root.join("app/assets").to_s
75
65
  end
76
66
 
77
- def load_base_component
78
- load Plutonium.root.join("app", "views", "components", "base.rb")
79
- end
80
-
81
67
  def load_plutonium_initializers
82
68
  Dir.glob(Plutonium.root.join("config", "initializers", "**", "*.rb")) { |file| load file }
83
69
  end
@@ -5,8 +5,7 @@ require "active_support/notifications"
5
5
  module Plutonium
6
6
  # Reloader class for Plutonium
7
7
  #
8
- # This class is responsible for managing the reloading of Plutonium components
9
- # and related files during development.
8
+ # This class is responsible for reloading during development.
10
9
  class Reloader
11
10
  class << self
12
11
  # Start the reloader
@@ -46,11 +45,11 @@ module Plutonium
46
45
  if Plutonium.configuration.development?
47
46
  reload_paths.concat([
48
47
  Plutonium.lib_root.to_s,
49
- Plutonium.root.join("app", "views", "components").to_s,
50
48
  Plutonium.root.join("config", "initializers").to_s
51
49
  ])
52
50
  end
53
51
 
52
+ # Add the application's packages dir
54
53
  packages_dir = Rails.root.join("packages").to_s
55
54
  reload_paths << packages_dir if File.directory?(packages_dir)
56
55
 
@@ -120,15 +119,6 @@ module Plutonium
120
119
  Plutonium.logger.debug { "[plutonium] reloading: app+framework" }
121
120
  Rails.application.reloader.reload!
122
121
  Plutonium::Loader.reload
123
- reload_components
124
- end
125
-
126
- # Reload components
127
- #
128
- # @return [void]
129
- def reload_components
130
- Object.send(:remove_const, "PlutoniumUi")
131
- load Plutonium.root.join("app", "views", "components", "base.rb")
132
122
  end
133
123
 
134
124
  # Reload a single file
@@ -5,9 +5,7 @@ module Plutonium
5
5
 
6
6
  included do
7
7
  helper Plutonium::Helpers::ApplicationHelper
8
- helper Plutonium::Helpers::ComponentHelper
9
8
  helper Plutonium::Helpers::AssetsHelper
10
- helper Plutonium::Helpers::FormHelper
11
9
 
12
10
  layout "rodauth"
13
11
  append_view_path File.expand_path("app/views", Plutonium.root)
@@ -17,7 +15,7 @@ module Plutonium
17
15
  private
18
16
 
19
17
  def root_path
20
- "/"
18
+ rodauth.login_redirect
21
19
  end
22
20
  end
23
21
  end
@@ -29,7 +29,7 @@ module Plutonium
29
29
  elsif arg.respond_to?(:to_proc)
30
30
  instance_exec(&arg)
31
31
  else
32
- yield
32
+ yield arg
33
33
  end
34
34
  end
35
35
  end
@@ -5,38 +5,82 @@ require "phlex"
5
5
  module Plutonium
6
6
  module UI
7
7
  module Component
8
+ # Component Kit automatically handles component instantiation and rendering
9
+ # through a convention-based approach using Build* methods.
10
+ #
11
+ # @example Basic component usage
12
+ # class MyView
13
+ # include Plutonium::UI::Component::Kit
14
+ #
15
+ # def template
16
+ # PageHeader(title: "Dashboard")
17
+ # TabList(items: tabs)
18
+ # Panel(class: "mt-4") do
19
+ # content
20
+ # end
21
+ # end
22
+ # end
23
+ #
24
+ # @example Adding a new component
25
+ # def BuildCustomComponent(title:, **options)
26
+ # Plutonium::UI::CustomComponent.new(
27
+ # title: title,
28
+ # **options
29
+ # )
30
+ # end
31
+ #
32
+ # @note All components are automatically rendered when called without the 'Build' prefix.
33
+ # For example, calling `TabList(...)` will internally call `BuildTabList(...)` and
34
+ # render the result.
8
35
  module Kit
9
36
  extend ActiveSupport::Concern
10
37
 
11
- def Breadcrumbs(...) = render Plutonium::UI::Breadcrumbs.new(...)
38
+ def method_missing(method_name, *args, **kwargs, &block)
39
+ build_method = "Build#{method_name}"
12
40
 
13
- def SkeletonTable(...) = render Plutonium::UI::SkeletonTable.new(...)
41
+ if self.class.method_defined?(build_method)
42
+ render send(build_method, *args, **kwargs, &block)
43
+ else
44
+ super
45
+ end
46
+ end
14
47
 
15
- def Block(...) = render Plutonium::UI::Block.new(...)
48
+ def respond_to_missing?(method_name, include_private = false)
49
+ build_method = "Build#{method_name}"
50
+ self.class.method_defined?(build_method) || super
51
+ end
16
52
 
17
- def Panel(...) = render Plutonium::UI::Panel.new(...)
53
+ def BuildBreadcrumbs(...) = Plutonium::UI::Breadcrumbs.new(...)
18
54
 
19
- def FrameNavigatorPanel(...) = render Plutonium::UI::FrameNavigatorPanel.new(...)
55
+ def BuildSkeletonTable(...) = Plutonium::UI::SkeletonTable.new(...)
20
56
 
21
- def DynaFrameHost(...) = render Plutonium::UI::DynaFrame::Host.new(...)
57
+ def BuildBlock(...) = Plutonium::UI::Block.new(...)
22
58
 
23
- def DynaFrameContent(...) = render Plutonium::UI::DynaFrame::Content.new(...)
59
+ def BuildPanel(...) = Plutonium::UI::Panel.new(...)
24
60
 
25
- def PageHeader(...) = render Plutonium::UI::PageHeader.new(...)
61
+ def BuildFrameNavigatorPanel(...) = Plutonium::UI::FrameNavigatorPanel.new(...)
26
62
 
27
- def ActionButton(...) = render Plutonium::UI::ActionButton.new(...)
63
+ def BuildTabList(...) = Plutonium::UI::TabList.new(...)
28
64
 
29
- def EmptyCard(...) = render Plutonium::UI::EmptyCard.new(...)
65
+ def BuildDynaFrameHost(...) = Plutonium::UI::DynaFrame::Host.new(...)
30
66
 
31
- def TableSearchBar(...) = render Plutonium::UI::Table::Components::SearchBar.new(...)
67
+ def BuildDynaFrameContent(...) = Plutonium::UI::DynaFrame::Content.new(...)
32
68
 
33
- def TableScopesBar(...) = render Plutonium::UI::Table::Components::ScopesBar.new(...)
69
+ def BuildPageHeader(...) = Plutonium::UI::PageHeader.new(...)
34
70
 
35
- def TableInfo(...) = render Plutonium::UI::Table::Components::PagyInfo.new(...)
71
+ def BuildActionButton(...) = Plutonium::UI::ActionButton.new(...)
36
72
 
37
- def TablePagination(...) = render Plutonium::UI::Table::Components::PagyPagination.new(...)
73
+ def BuildEmptyCard(...) = Plutonium::UI::EmptyCard.new(...)
38
74
 
39
- def ColorModeSelector(...) = render Plutonium::UI::ColorModeSelector.new(...)
75
+ def BuildTableSearchBar(...) = Plutonium::UI::Table::Components::SearchBar.new(...)
76
+
77
+ def BuildTableScopesBar(...) = Plutonium::UI::Table::Components::ScopesBar.new(...)
78
+
79
+ def BuildTableInfo(...) = Plutonium::UI::Table::Components::PagyInfo.new(...)
80
+
81
+ def BuildTablePagination(...) = Plutonium::UI::Table::Components::PagyPagination.new(...)
82
+
83
+ def BuildColorModeSelector(...) = Plutonium::UI::ColorModeSelector.new(...)
40
84
  end
41
85
  end
42
86
  end
@@ -8,11 +8,15 @@ module Plutonium
8
8
 
9
9
  class Builder < Builder
10
10
  def association_tag(**, &)
11
- create_component(Plutonium::UI::Display::Component::Association, :association, **, &)
11
+ create_component(Plutonium::UI::Display::Components::Association, :association, **, &)
12
12
  end
13
13
 
14
14
  def markdown_tag(**, &)
15
- create_component(Plutonium::UI::Display::Component::Markdown, :markdown, **, &)
15
+ create_component(Plutonium::UI::Display::Components::Markdown, :markdown, **, &)
16
+ end
17
+
18
+ def attachment_tag(**, &)
19
+ create_component(Plutonium::UI::Display::Components::Attachment, :attachment, **, &)
16
20
  end
17
21
  end
18
22
 
@@ -3,7 +3,7 @@
3
3
  module Plutonium
4
4
  module UI
5
5
  module Display
6
- module Component
6
+ module Components
7
7
  class Association < Phlexi::Display::Components::Association
8
8
  include Plutonium::UI::Component::Methods
9
9