plutonium 0.62.2 → 0.63.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 (255) hide show
  1. checksums.yaml +4 -4
  2. data/.claude/skills/plutonium/SKILL.md +44 -0
  3. data/.claude/skills/plutonium-app/SKILL.md +3 -3
  4. data/.claude/skills/plutonium-async-interactions/SKILL.md +191 -0
  5. data/.claude/skills/plutonium-auth/SKILL.md +36 -0
  6. data/.claude/skills/plutonium-behavior/SKILL.md +121 -24
  7. data/.claude/skills/plutonium-kanban/SKILL.md +17 -3
  8. data/.claude/skills/plutonium-resource/SKILL.md +259 -12
  9. data/.claude/skills/plutonium-tenancy/SKILL.md +32 -3
  10. data/.claude/skills/plutonium-ui/SKILL.md +115 -14
  11. data/.claude/skills/plutonium-wizard/SKILL.md +73 -4
  12. data/CHANGELOG.md +67 -0
  13. data/CLAUDE.md +87 -0
  14. data/Rakefile +34 -0
  15. data/SECURITY.md +1 -1
  16. data/app/assets/plutonium.css +1 -1
  17. data/app/assets/plutonium.js +685 -102
  18. data/app/assets/plutonium.js.map +4 -4
  19. data/app/assets/plutonium.min.js +53 -53
  20. data/app/assets/plutonium.min.js.map +4 -4
  21. data/app/views/rodauth/_login_form.html.erb +13 -0
  22. data/db/migrate/async_interactions/20260817000001_create_plutonium_async_runs.rb +170 -0
  23. data/docs/.vitepress/config.ts +81 -3
  24. data/docs/.vitepress/theme/blog.data.ts +44 -0
  25. data/docs/.vitepress/theme/components/BlogIndex.vue +87 -0
  26. data/docs/.vitepress/theme/components/BlogMeta.vue +47 -0
  27. data/docs/.vitepress/theme/components/HomeFeatureTour.vue +293 -0
  28. data/docs/.vitepress/theme/components/HomeHero.vue +3 -3
  29. data/docs/.vitepress/theme/components/HomeInTheBox.vue +8 -0
  30. data/docs/.vitepress/theme/components/HomeStopWriting.vue +1 -0
  31. data/docs/.vitepress/theme/components/HomeWhyPlutonium.vue +84 -0
  32. data/docs/.vitepress/theme/index.ts +8 -4
  33. data/docs/blog/association-inputs-post-signed-ids.md +70 -0
  34. data/docs/blog/fix-the-model-not-the-policy.md +122 -0
  35. data/docs/blog/fractional-ordering-runs-out-of-room.md +67 -0
  36. data/docs/blog/half-finished-forms-are-pii.md +76 -0
  37. data/docs/blog/index.md +13 -0
  38. data/docs/blog/interactions-are-presentation-objects.md +152 -0
  39. data/docs/blog/introducing-plutonium.md +253 -0
  40. data/docs/blog/jobs-are-not-permission-snapshots.md +100 -0
  41. data/docs/blog/plutonium-and-ai-agents.md +48 -0
  42. data/docs/blog/realtime-is-one-line-and-four-dependencies.md +70 -0
  43. data/docs/blog/two-forms-one-dom-id.md +69 -0
  44. data/docs/blog/whats-new-async-kanban-wizards.md +130 -0
  45. data/docs/getting-started/tutorial/04-authorization.md +12 -3
  46. data/docs/getting-started/tutorial/06-nested-resources.md +3 -1
  47. data/docs/getting-started/tutorial/07-author-portal.md +2 -2
  48. data/docs/guides/authentication.md +73 -0
  49. data/docs/guides/authorization.md +2 -0
  50. data/docs/guides/creating-packages.md +5 -3
  51. data/docs/guides/custom-actions.md +74 -12
  52. data/docs/guides/customizing-ui.md +9 -2
  53. data/docs/guides/index.md +1 -0
  54. data/docs/guides/kanban.md +7 -5
  55. data/docs/guides/nested-resources.md +11 -1
  56. data/docs/guides/performance.md +104 -0
  57. data/docs/guides/user-invites.md +1 -1
  58. data/docs/guides/wizards.md +9 -1
  59. data/docs/index.md +3 -3
  60. data/docs/public/images/home/tour-actions.png +0 -0
  61. data/docs/public/images/home/tour-async.png +0 -0
  62. data/docs/public/images/home/tour-kanban.png +0 -0
  63. data/docs/public/images/home/tour-tenancy.png +0 -0
  64. data/docs/public/images/home/tour-wizard.png +0 -0
  65. data/docs/public/images/reference/async-progress-page.png +0 -0
  66. data/docs/public/images/reference/async-running-banner.png +0 -0
  67. data/docs/public/templates/experimental.rb +34 -0
  68. data/docs/public/templates/pluton8.rb +14 -0
  69. data/docs/reference/app/portals.md +15 -3
  70. data/docs/reference/auth/accounts.md +19 -0
  71. data/docs/reference/behavior/async-interactions.md +295 -0
  72. data/docs/reference/behavior/controllers.md +17 -4
  73. data/docs/reference/behavior/index.md +7 -1
  74. data/docs/reference/behavior/interactions.md +152 -22
  75. data/docs/reference/configuration.md +5 -0
  76. data/docs/reference/index.md +1 -0
  77. data/docs/reference/kanban/dsl.md +7 -4
  78. data/docs/reference/kanban/index.md +1 -1
  79. data/docs/reference/kanban/positioning.md +26 -4
  80. data/docs/reference/positioning.md +568 -0
  81. data/docs/reference/resource/actions.md +97 -4
  82. data/docs/reference/resource/definition.md +181 -9
  83. data/docs/reference/tenancy/invites.md +1 -1
  84. data/docs/reference/tenancy/nested-resources.md +60 -2
  85. data/docs/reference/ui/assets.md +4 -0
  86. data/docs/reference/ui/components.md +57 -4
  87. data/docs/reference/ui/displays.md +20 -10
  88. data/docs/reference/ui/index.md +1 -1
  89. data/docs/reference/wizard/dsl.md +33 -0
  90. data/docs/reference/wizard/storage-config.md +1 -0
  91. data/docs/superpowers/plans/2026-07-16-homepage-depth-upgrade.md +624 -0
  92. data/docs/superpowers/plans/2026-07-16-homepage-depth-upgrade.md.tasks.json +32 -0
  93. data/docs/superpowers/plans/2026-07-31-positioned-drag-and-drop.md +1787 -0
  94. data/docs/superpowers/plans/2026-07-31-positioned-drag-and-drop.md.tasks.json +91 -0
  95. data/docs/superpowers/plans/2026-08-17-async-interactions.md +1414 -0
  96. data/docs/superpowers/plans/2026-08-17-async-interactions.md.tasks.json +66 -0
  97. data/docs/superpowers/specs/2026-07-16-homepage-depth-upgrade-design.md +111 -0
  98. data/docs/superpowers/specs/2026-07-17-action-html-attributes-design.md +124 -0
  99. data/docs/superpowers/specs/2026-07-31-positioned-drag-and-drop-design.md +506 -0
  100. data/docs/superpowers/specs/2026-08-17-async-interactions-design.md +185 -0
  101. data/gemfiles/postgres.gemfile.lock +85 -85
  102. data/gemfiles/rails_7.gemfile.lock +322 -140
  103. data/gemfiles/rails_8.0.gemfile.lock +125 -115
  104. data/gemfiles/rails_8.1.gemfile.lock +126 -116
  105. data/lib/generators/pu/async_interactions/install_generator.rb +111 -0
  106. data/lib/generators/pu/async_interactions/templates/app/controllers/async_runs_controller.rb.tt +15 -0
  107. data/lib/generators/pu/core/typespec/typespec_generator.rb +7 -4
  108. data/lib/generators/pu/invites/install_generator.rb +3 -3
  109. data/lib/generators/pu/invites/templates/packages/invites/app/views/layouts/invites/invitation.html.erb.tt +2 -2
  110. data/lib/generators/pu/lib/plutonium_generators/concerns/mounts_engines.rb +47 -2
  111. data/lib/generators/pu/lib/plutonium_generators/concerns/resource_registration.rb +41 -0
  112. data/lib/generators/pu/lite/litestream/litestream_generator.rb +1 -1
  113. data/lib/generators/pu/lite/solid_queue/solid_queue_generator.rb +1 -1
  114. data/lib/generators/pu/res/conn/conn_generator.rb +19 -39
  115. data/lib/generators/pu/res/conn/templates/app/controllers/resource_controller.rb.tt +4 -0
  116. data/lib/generators/pu/rodauth/templates/app/rodauth/account_rodauth_plugin.rb.tt +15 -6
  117. data/lib/generators/pu/rodauth/templates/app/rodauth/rodauth_plugin.rb.tt +7 -0
  118. data/lib/generators/pu/saas/welcome/templates/app/views/layouts/welcome.html.erb.tt +2 -2
  119. data/lib/generators/pu/wizards/install_generator.rb +78 -0
  120. data/lib/plutonium/action/base.rb +71 -9
  121. data/lib/plutonium/action/interactive.rb +9 -0
  122. data/lib/plutonium/attachments.rb +254 -0
  123. data/lib/plutonium/configuration.rb +82 -1
  124. data/lib/plutonium/core/controller.rb +50 -7
  125. data/lib/plutonium/core/controllers/authorizable.rb +16 -0
  126. data/lib/plutonium/core/controllers/entity_scoping.rb +12 -2
  127. data/lib/plutonium/definition/base.rb +51 -0
  128. data/lib/plutonium/definition/display_layout.rb +112 -0
  129. data/lib/plutonium/definition/index_views.rb +8 -7
  130. data/lib/plutonium/definition/input_aliases.rb +38 -0
  131. data/lib/plutonium/definition/page_widths.rb +65 -0
  132. data/lib/plutonium/definition/positioning.rb +126 -0
  133. data/lib/plutonium/definition/sorting.rb +17 -2
  134. data/lib/plutonium/helpers/turbo_helper.rb +7 -0
  135. data/lib/plutonium/interaction/README.md +61 -24
  136. data/lib/plutonium/interaction/async/configuration.rb +38 -0
  137. data/lib/plutonium/interaction/async/context.rb +419 -0
  138. data/lib/plutonium/interaction/async/executor.rb +422 -0
  139. data/lib/plutonium/interaction/async/job.rb +80 -0
  140. data/lib/plutonium/interaction/async/reap_job.rb +81 -0
  141. data/lib/plutonium/interaction/async/run.rb +394 -0
  142. data/lib/plutonium/interaction/async/run_definition.rb +155 -0
  143. data/lib/plutonium/interaction/async/run_policy.rb +86 -0
  144. data/lib/plutonium/interaction/base.rb +34 -7
  145. data/lib/plutonium/interaction/concerns/dispatchable.rb +518 -0
  146. data/lib/plutonium/interaction/concerns/scoping.rb +70 -9
  147. data/lib/plutonium/interaction/response/redirect.rb +11 -3
  148. data/lib/plutonium/kanban/board.rb +14 -0
  149. data/lib/plutonium/kanban/column.rb +4 -2
  150. data/lib/plutonium/kanban/dsl.rb +4 -1
  151. data/lib/plutonium/kanban/grouping.rb +9 -22
  152. data/lib/plutonium/kanban/positioning.rb +5 -65
  153. data/lib/plutonium/positioning/config.rb +94 -0
  154. data/lib/plutonium/positioning/model.rb +128 -0
  155. data/lib/plutonium/positioning.rb +25 -86
  156. data/lib/plutonium/railtie.rb +1 -0
  157. data/lib/plutonium/resource/controller.rb +118 -38
  158. data/lib/plutonium/resource/controllers/crud_actions/index_action.rb +32 -2
  159. data/lib/plutonium/resource/controllers/crud_actions.rb +30 -2
  160. data/lib/plutonium/resource/controllers/eager_loading.rb +87 -0
  161. data/lib/plutonium/resource/controllers/export_csv.rb +10 -1
  162. data/lib/plutonium/resource/controllers/kanban_actions.rb +53 -14
  163. data/lib/plutonium/resource/controllers/position_actions.rb +390 -0
  164. data/lib/plutonium/resource/controllers/presentable.rb +19 -13
  165. data/lib/plutonium/resource/controllers/queryable.rb +5 -1
  166. data/lib/plutonium/resource/controllers/wizard_actions.rb +21 -0
  167. data/lib/plutonium/resource/policy.rb +33 -0
  168. data/lib/plutonium/resource/query_object.rb +36 -0
  169. data/lib/plutonium/routing/mapper_extensions.rb +100 -8
  170. data/lib/plutonium/routing/route_set_extensions.rb +15 -1
  171. data/lib/plutonium/routing/wizard_registration.rb +4 -0
  172. data/lib/plutonium/testing/resource_policy.rb +6 -2
  173. data/lib/plutonium/ui/action_button.rb +12 -7
  174. data/lib/plutonium/ui/actions_dropdown.rb +1 -1
  175. data/lib/plutonium/ui/block.rb +21 -1
  176. data/lib/plutonium/ui/breadcrumbs.rb +187 -55
  177. data/lib/plutonium/ui/component/methods.rb +5 -0
  178. data/lib/plutonium/ui/component/positionable.rb +112 -0
  179. data/lib/plutonium/ui/component/resolves_tags.rb +57 -0
  180. data/lib/plutonium/ui/component/section.rb +185 -0
  181. data/lib/plutonium/ui/display/base.rb +13 -1
  182. data/lib/plutonium/ui/display/components/formatted_value.rb +26 -0
  183. data/lib/plutonium/ui/display/components/section.rb +18 -0
  184. data/lib/plutonium/ui/display/resource.rb +141 -22
  185. data/lib/plutonium/ui/display/theme.rb +20 -1
  186. data/lib/plutonium/ui/export_button.rb +1 -1
  187. data/lib/plutonium/ui/form/base.rb +8 -7
  188. data/lib/plutonium/ui/form/components/intl_tel_input.rb +1 -1
  189. data/lib/plutonium/ui/form/components/section.rb +7 -62
  190. data/lib/plutonium/ui/form/components/uppy.rb +12 -1
  191. data/lib/plutonium/ui/form/concerns/renders_nested_resource_fields.rb +16 -3
  192. data/lib/plutonium/ui/form/concerns/renders_structured_inputs.rb +5 -1
  193. data/lib/plutonium/ui/form/query.rb +2 -4
  194. data/lib/plutonium/ui/form/resource.rb +92 -15
  195. data/lib/plutonium/ui/form/theme.rb +17 -0
  196. data/lib/plutonium/ui/form/wizard.rb +25 -1
  197. data/lib/plutonium/ui/grid/card.rb +79 -11
  198. data/lib/plutonium/ui/grid/resource.rb +47 -5
  199. data/lib/plutonium/ui/interaction/async/run_progress.rb +227 -0
  200. data/lib/plutonium/ui/interaction/async/running_banner.rb +65 -0
  201. data/lib/plutonium/ui/kanban/card.rb +2 -1
  202. data/lib/plutonium/ui/kanban/column.rb +12 -6
  203. data/lib/plutonium/ui/kanban/resource.rb +6 -7
  204. data/lib/plutonium/ui/layout/base.rb +10 -3
  205. data/lib/plutonium/ui/nav_grid_menu.rb +1 -0
  206. data/lib/plutonium/ui/page/base.rb +19 -0
  207. data/lib/plutonium/ui/page/edit.rb +4 -1
  208. data/lib/plutonium/ui/page/index.rb +69 -18
  209. data/lib/plutonium/ui/page/interactive_action.rb +5 -1
  210. data/lib/plutonium/ui/page/new.rb +4 -1
  211. data/lib/plutonium/ui/page/show.rb +27 -10
  212. data/lib/plutonium/ui/page/wizard.rb +10 -1
  213. data/lib/plutonium/ui/page/wizard_chooser.rb +36 -11
  214. data/lib/plutonium/ui/page_width.rb +58 -0
  215. data/lib/plutonium/ui/table/base.rb +34 -1
  216. data/lib/plutonium/ui/table/components/attachment.rb +1 -1
  217. data/lib/plutonium/ui/table/components/bulk_actions_toolbar.rb +32 -8
  218. data/lib/plutonium/ui/table/components/drag_handle.rb +120 -0
  219. data/lib/plutonium/ui/table/components/filter_form.rb +1 -4
  220. data/lib/plutonium/ui/table/components/filter_pills.rb +1 -1
  221. data/lib/plutonium/ui/table/components/row_actions_dropdown.rb +1 -1
  222. data/lib/plutonium/ui/table/resource.rb +50 -5
  223. data/lib/plutonium/ui/table/theme.rb +59 -2
  224. data/lib/plutonium/ui/wizard/review.rb +4 -2
  225. data/lib/plutonium/ui/wizard/summary_display.rb +42 -14
  226. data/lib/plutonium/version.rb +1 -1
  227. data/lib/plutonium/wizard/attachments.rb +32 -197
  228. data/lib/plutonium/wizard/base.rb +6 -1
  229. data/lib/plutonium/wizard/configuration.rb +12 -0
  230. data/lib/plutonium/wizard/controller.rb +14 -0
  231. data/lib/plutonium/wizard/driving.rb +99 -15
  232. data/lib/plutonium/wizard/dsl.rb +23 -0
  233. data/lib/plutonium/wizard/resume.rb +127 -49
  234. data/lib/plutonium/wizard/runner.rb +46 -2
  235. data/lib/plutonium/wizard/step_adapter.rb +1 -1
  236. data/lib/plutonium/wizard/sweep_job.rb +16 -0
  237. data/lib/plutonium.rb +21 -0
  238. data/lib/rodauth/features/session_isolation.rb +92 -0
  239. data/lib/rodauth/plugins.rb +1 -0
  240. data/package.json +2 -1
  241. data/plutonium.gemspec +29 -11
  242. data/src/css/components.css +89 -1
  243. data/src/css/slim_select.css +20 -0
  244. data/src/js/controllers/breadcrumbs_controller.js +112 -0
  245. data/src/js/controllers/bulk_actions_controller.js +10 -2
  246. data/src/js/controllers/kanban_controller.js +30 -21
  247. data/src/js/controllers/positioned_controller.js +452 -0
  248. data/src/js/controllers/register_controllers.js +6 -0
  249. data/src/js/controllers/resource_drop_down_controller.js +5 -0
  250. data/src/js/controllers/run_progress_controller.js +73 -0
  251. data/src/js/drag/sortable.js +186 -0
  252. data/yarn.lock +108 -63
  253. metadata +103 -16
  254. data/docs/.vitepress/theme/components/HomeAudienceSplit.vue +0 -53
  255. data/docs/.vitepress/theme/components/HomePillars.vue +0 -42
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: plutonium
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.62.2
4
+ version: 0.63.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefan Froelich
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2026-07-09 00:00:00.000000000 Z
10
+ date: 2026-08-22 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: zeitwerk
@@ -29,14 +29,14 @@ dependencies:
29
29
  requirements:
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: '7.2'
32
+ version: 7.2.3.1
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
- version: '7.2'
39
+ version: 7.2.3.1
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: csv
42
42
  requirement: !ruby/object:Gem::Requirement
@@ -429,6 +429,20 @@ dependencies:
429
429
  - - ">="
430
430
  - !ruby/object:Gem::Version
431
431
  version: '0'
432
+ - !ruby/object:Gem::Dependency
433
+ name: acts_as_list
434
+ requirement: !ruby/object:Gem::Requirement
435
+ requirements:
436
+ - - ">="
437
+ - !ruby/object:Gem::Version
438
+ version: '0'
439
+ type: :development
440
+ prerelease: false
441
+ version_requirements: !ruby/object:Gem::Requirement
442
+ requirements:
443
+ - - ">="
444
+ - !ruby/object:Gem::Version
445
+ version: '0'
432
446
  description: Plutonium is a Rapid Application Development toolkit for Rails. Convention-driven
433
447
  and fully customizable, it adds application-level concepts like resources, policies,
434
448
  definitions, and portals that make building complex apps faster. Built for the AI
@@ -442,6 +456,7 @@ extra_rdoc_files: []
442
456
  files:
443
457
  - "# Plutonium: The pre-alpha demo.md"
444
458
  - ".claude/skills/plutonium-app/SKILL.md"
459
+ - ".claude/skills/plutonium-async-interactions/SKILL.md"
445
460
  - ".claude/skills/plutonium-auth/SKILL.md"
446
461
  - ".claude/skills/plutonium-behavior/SKILL.md"
447
462
  - ".claude/skills/plutonium-kanban/SKILL.md"
@@ -553,20 +568,36 @@ files:
553
568
  - config/initializers/pagy.rb
554
569
  - config/initializers/rabl.rb
555
570
  - config/initializers/sqlite_alias.rb
571
+ - db/migrate/async_interactions/20260817000001_create_plutonium_async_runs.rb
556
572
  - db/migrate/wizard/20260615000001_create_plutonium_wizard_sessions.rb
557
573
  - docs/.vitepress/config.ts
558
574
  - docs/.vitepress/sync-skills.mjs
559
- - docs/.vitepress/theme/components/HomeAudienceSplit.vue
575
+ - docs/.vitepress/theme/blog.data.ts
576
+ - docs/.vitepress/theme/components/BlogIndex.vue
577
+ - docs/.vitepress/theme/components/BlogMeta.vue
560
578
  - docs/.vitepress/theme/components/HomeCta.vue
579
+ - docs/.vitepress/theme/components/HomeFeatureTour.vue
561
580
  - docs/.vitepress/theme/components/HomeHero.vue
562
581
  - docs/.vitepress/theme/components/HomeInTheBox.vue
563
- - docs/.vitepress/theme/components/HomePillars.vue
564
582
  - docs/.vitepress/theme/components/HomeStopWriting.vue
565
583
  - docs/.vitepress/theme/components/HomeWalkthrough.vue
584
+ - docs/.vitepress/theme/components/HomeWhyPlutonium.vue
566
585
  - docs/.vitepress/theme/components/SectionLanding.vue
567
586
  - docs/.vitepress/theme/custom.css
568
587
  - docs/.vitepress/theme/index.ts
569
588
  - docs/ai.md
589
+ - docs/blog/association-inputs-post-signed-ids.md
590
+ - docs/blog/fix-the-model-not-the-policy.md
591
+ - docs/blog/fractional-ordering-runs-out-of-room.md
592
+ - docs/blog/half-finished-forms-are-pii.md
593
+ - docs/blog/index.md
594
+ - docs/blog/interactions-are-presentation-objects.md
595
+ - docs/blog/introducing-plutonium.md
596
+ - docs/blog/jobs-are-not-permission-snapshots.md
597
+ - docs/blog/plutonium-and-ai-agents.md
598
+ - docs/blog/realtime-is-one-line-and-four-dependencies.md
599
+ - docs/blog/two-forms-one-dom-id.md
600
+ - docs/blog/whats-new-async-kanban-wizards.md
570
601
  - docs/getting-started/index.md
571
602
  - docs/getting-started/installation.md
572
603
  - docs/getting-started/tutorial/01-setup.md
@@ -588,6 +619,7 @@ files:
588
619
  - docs/guides/kanban.md
589
620
  - docs/guides/multi-tenancy.md
590
621
  - docs/guides/nested-resources.md
622
+ - docs/guides/performance.md
591
623
  - docs/guides/search-filtering.md
592
624
  - docs/guides/testing.md
593
625
  - docs/guides/theming.md
@@ -631,6 +663,13 @@ files:
631
663
  - docs/public/images/home-index.png
632
664
  - docs/public/images/home-new.png
633
665
  - docs/public/images/home-show.png
666
+ - docs/public/images/home/tour-actions.png
667
+ - docs/public/images/home/tour-async.png
668
+ - docs/public/images/home/tour-kanban.png
669
+ - docs/public/images/home/tour-tenancy.png
670
+ - docs/public/images/home/tour-wizard.png
671
+ - docs/public/images/reference/async-progress-page.png
672
+ - docs/public/images/reference/async-running-banner.png
634
673
  - docs/public/images/reference/structured-inputs-removed.png
635
674
  - docs/public/images/reference/structured-inputs.png
636
675
  - docs/public/images/tutorial/02-empty-index.png
@@ -651,6 +690,7 @@ files:
651
690
  - docs/public/plutonium.png
652
691
  - docs/public/site.webmanifest
653
692
  - docs/public/templates/base.rb
693
+ - docs/public/templates/experimental.rb
654
694
  - docs/public/templates/lite.rb
655
695
  - docs/public/templates/pluton8.rb
656
696
  - docs/public/templates/plutonium.rb
@@ -670,6 +710,7 @@ files:
670
710
  - docs/reference/auth/accounts.md
671
711
  - docs/reference/auth/index.md
672
712
  - docs/reference/auth/profile.md
713
+ - docs/reference/behavior/async-interactions.md
673
714
  - docs/reference/behavior/controllers.md
674
715
  - docs/reference/behavior/index.md
675
716
  - docs/reference/behavior/interactions.md
@@ -681,6 +722,7 @@ files:
681
722
  - docs/reference/kanban/dsl.md
682
723
  - docs/reference/kanban/index.md
683
724
  - docs/reference/kanban/positioning.md
725
+ - docs/reference/positioning.md
684
726
  - docs/reference/resource/actions.md
685
727
  - docs/reference/resource/definition.md
686
728
  - docs/reference/resource/export.md
@@ -729,6 +771,12 @@ files:
729
771
  - docs/superpowers/plans/2026-06-26-kanban-dsl.md.tasks.json
730
772
  - docs/superpowers/plans/2026-07-02-kanban-drop-interactions.md
731
773
  - docs/superpowers/plans/2026-07-02-kanban-drop-interactions.md.tasks.json
774
+ - docs/superpowers/plans/2026-07-16-homepage-depth-upgrade.md
775
+ - docs/superpowers/plans/2026-07-16-homepage-depth-upgrade.md.tasks.json
776
+ - docs/superpowers/plans/2026-07-31-positioned-drag-and-drop.md
777
+ - docs/superpowers/plans/2026-07-31-positioned-drag-and-drop.md.tasks.json
778
+ - docs/superpowers/plans/2026-08-17-async-interactions.md
779
+ - docs/superpowers/plans/2026-08-17-async-interactions.md.tasks.json
732
780
  - docs/superpowers/specs/2026-04-08-plutonium-skills-overhaul-design.md
733
781
  - docs/superpowers/specs/2026-04-14-plutonium-testing-design.md
734
782
  - docs/superpowers/specs/2026-05-07-ui-layout-overhaul-design.md
@@ -749,6 +797,10 @@ files:
749
797
  - docs/superpowers/specs/2026-06-18-wizard-hosting-design.md
750
798
  - docs/superpowers/specs/2026-06-26-kanban-dsl-design.md
751
799
  - docs/superpowers/specs/2026-07-03-kanban-auth-simplification.md
800
+ - docs/superpowers/specs/2026-07-16-homepage-depth-upgrade-design.md
801
+ - docs/superpowers/specs/2026-07-17-action-html-attributes-design.md
802
+ - docs/superpowers/specs/2026-07-31-positioned-drag-and-drop-design.md
803
+ - docs/superpowers/specs/2026-08-17-async-interactions-design.md
752
804
  - esbuild.config.js
753
805
  - exe/pug
754
806
  - gemfiles/postgres.gemfile
@@ -762,6 +814,8 @@ files:
762
814
  - lib/active_model/validations/array_validator.rb
763
815
  - lib/active_model/validations/attached_validator.rb
764
816
  - lib/active_model/validations/url_validator.rb
817
+ - lib/generators/pu/async_interactions/install_generator.rb
818
+ - lib/generators/pu/async_interactions/templates/app/controllers/async_runs_controller.rb.tt
765
819
  - lib/generators/pu/core/assets/assets_generator.rb
766
820
  - lib/generators/pu/core/assets/templates/.keep
767
821
  - lib/generators/pu/core/assets/templates/postcss.config.js
@@ -858,6 +912,7 @@ files:
858
912
  - lib/generators/pu/lib/plutonium_generators/concerns/logger.rb
859
913
  - lib/generators/pu/lib/plutonium_generators/concerns/mounts_engines.rb
860
914
  - lib/generators/pu/lib/plutonium_generators/concerns/package_selector.rb
915
+ - lib/generators/pu/lib/plutonium_generators/concerns/resource_registration.rb
861
916
  - lib/generators/pu/lib/plutonium_generators/concerns/resource_selector.rb
862
917
  - lib/generators/pu/lib/plutonium_generators/concerns/rodauth_redirects.rb
863
918
  - lib/generators/pu/lib/plutonium_generators/concerns/serializer.rb
@@ -1025,6 +1080,7 @@ files:
1025
1080
  - lib/generators/pu/test/install/templates/plutonium_testing.rb.tt
1026
1081
  - lib/generators/pu/test/scaffold/scaffold_generator.rb
1027
1082
  - lib/generators/pu/test/scaffold/templates/integration_test.rb.tt
1083
+ - lib/generators/pu/wizards/install_generator.rb
1028
1084
  - lib/plutonium.rb
1029
1085
  - lib/plutonium/action/README.md
1030
1086
  - lib/plutonium/action/base.rb
@@ -1036,6 +1092,7 @@ files:
1036
1092
  - lib/plutonium/api_client.rb
1037
1093
  - lib/plutonium/api_client/concerns/create_api_client.rb
1038
1094
  - lib/plutonium/api_client/concerns/disable_api_client.rb
1095
+ - lib/plutonium/attachments.rb
1039
1096
  - lib/plutonium/auth.rb
1040
1097
  - lib/plutonium/auth/public.rb
1041
1098
  - lib/plutonium/auth/rodauth.rb
@@ -1051,11 +1108,15 @@ files:
1051
1108
  - lib/plutonium/definition/base.rb
1052
1109
  - lib/plutonium/definition/config_attr.rb
1053
1110
  - lib/plutonium/definition/defineable_props.rb
1111
+ - lib/plutonium/definition/display_layout.rb
1054
1112
  - lib/plutonium/definition/form_layout.rb
1055
1113
  - lib/plutonium/definition/index_views.rb
1056
1114
  - lib/plutonium/definition/inheritable_config_attr.rb
1115
+ - lib/plutonium/definition/input_aliases.rb
1057
1116
  - lib/plutonium/definition/metadata.rb
1058
1117
  - lib/plutonium/definition/nested_inputs.rb
1118
+ - lib/plutonium/definition/page_widths.rb
1119
+ - lib/plutonium/definition/positioning.rb
1059
1120
  - lib/plutonium/definition/presentable.rb
1060
1121
  - lib/plutonium/definition/scoping.rb
1061
1122
  - lib/plutonium/definition/search.rb
@@ -1072,7 +1133,16 @@ files:
1072
1133
  - lib/plutonium/helpers/turbo_helper.rb
1073
1134
  - lib/plutonium/helpers/turbo_stream_actions_helper.rb
1074
1135
  - lib/plutonium/interaction/README.md
1136
+ - lib/plutonium/interaction/async/configuration.rb
1137
+ - lib/plutonium/interaction/async/context.rb
1138
+ - lib/plutonium/interaction/async/executor.rb
1139
+ - lib/plutonium/interaction/async/job.rb
1140
+ - lib/plutonium/interaction/async/reap_job.rb
1141
+ - lib/plutonium/interaction/async/run.rb
1142
+ - lib/plutonium/interaction/async/run_definition.rb
1143
+ - lib/plutonium/interaction/async/run_policy.rb
1075
1144
  - lib/plutonium/interaction/base.rb
1145
+ - lib/plutonium/interaction/concerns/dispatchable.rb
1076
1146
  - lib/plutonium/interaction/concerns/scoping.rb
1077
1147
  - lib/plutonium/interaction/concerns/workflow_dsl.rb
1078
1148
  - lib/plutonium/interaction/outcome.rb
@@ -1111,6 +1181,8 @@ files:
1111
1181
  - lib/plutonium/portal/dynamic_controllers.rb
1112
1182
  - lib/plutonium/portal/engine.rb
1113
1183
  - lib/plutonium/positioning.rb
1184
+ - lib/plutonium/positioning/config.rb
1185
+ - lib/plutonium/positioning/model.rb
1114
1186
  - lib/plutonium/profile/security_section.rb
1115
1187
  - lib/plutonium/query/adhoc_block.rb
1116
1188
  - lib/plutonium/query/base.rb
@@ -1130,9 +1202,11 @@ files:
1130
1202
  - lib/plutonium/resource/controllers/crud_actions.rb
1131
1203
  - lib/plutonium/resource/controllers/crud_actions/index_action.rb
1132
1204
  - lib/plutonium/resource/controllers/defineable.rb
1205
+ - lib/plutonium/resource/controllers/eager_loading.rb
1133
1206
  - lib/plutonium/resource/controllers/export_csv.rb
1134
1207
  - lib/plutonium/resource/controllers/interactive_actions.rb
1135
1208
  - lib/plutonium/resource/controllers/kanban_actions.rb
1209
+ - lib/plutonium/resource/controllers/position_actions.rb
1136
1210
  - lib/plutonium/resource/controllers/presentable.rb
1137
1211
  - lib/plutonium/resource/controllers/queryable.rb
1138
1212
  - lib/plutonium/resource/controllers/typeahead.rb
@@ -1177,6 +1251,9 @@ files:
1177
1251
  - lib/plutonium/ui/component/behaviour.rb
1178
1252
  - lib/plutonium/ui/component/kit.rb
1179
1253
  - lib/plutonium/ui/component/methods.rb
1254
+ - lib/plutonium/ui/component/positionable.rb
1255
+ - lib/plutonium/ui/component/resolves_tags.rb
1256
+ - lib/plutonium/ui/component/section.rb
1180
1257
  - lib/plutonium/ui/component/tokens.rb
1181
1258
  - lib/plutonium/ui/component_classes.rb
1182
1259
  - lib/plutonium/ui/display/base.rb
@@ -1186,8 +1263,10 @@ files:
1186
1263
  - lib/plutonium/ui/display/components/boolean.rb
1187
1264
  - lib/plutonium/ui/display/components/color.rb
1188
1265
  - lib/plutonium/ui/display/components/currency.rb
1266
+ - lib/plutonium/ui/display/components/formatted_value.rb
1189
1267
  - lib/plutonium/ui/display/components/markdown.rb
1190
1268
  - lib/plutonium/ui/display/components/phlexi_render.rb
1269
+ - lib/plutonium/ui/display/components/section.rb
1191
1270
  - lib/plutonium/ui/display/options/inferred_types.rb
1192
1271
  - lib/plutonium/ui/display/resource.rb
1193
1272
  - lib/plutonium/ui/display/theme.rb
@@ -1226,6 +1305,8 @@ files:
1226
1305
  - lib/plutonium/ui/frame_navigator_panel.rb
1227
1306
  - lib/plutonium/ui/grid/card.rb
1228
1307
  - lib/plutonium/ui/grid/resource.rb
1308
+ - lib/plutonium/ui/interaction/async/run_progress.rb
1309
+ - lib/plutonium/ui/interaction/async/running_banner.rb
1229
1310
  - lib/plutonium/ui/kanban/card.rb
1230
1311
  - lib/plutonium/ui/kanban/color_dot.rb
1231
1312
  - lib/plutonium/ui/kanban/column.rb
@@ -1255,6 +1336,7 @@ files:
1255
1336
  - lib/plutonium/ui/page/wizard_chooser.rb
1256
1337
  - lib/plutonium/ui/page/wizard_completed.rb
1257
1338
  - lib/plutonium/ui/page_header.rb
1339
+ - lib/plutonium/ui/page_width.rb
1258
1340
  - lib/plutonium/ui/panel.rb
1259
1341
  - lib/plutonium/ui/sidebar_menu.rb
1260
1342
  - lib/plutonium/ui/skeleton_table.rb
@@ -1262,6 +1344,7 @@ files:
1262
1344
  - lib/plutonium/ui/table/base.rb
1263
1345
  - lib/plutonium/ui/table/components/attachment.rb
1264
1346
  - lib/plutonium/ui/table/components/bulk_actions_toolbar.rb
1347
+ - lib/plutonium/ui/table/components/drag_handle.rb
1265
1348
  - lib/plutonium/ui/table/components/filter_form.rb
1266
1349
  - lib/plutonium/ui/table/components/filter_pills.rb
1267
1350
  - lib/plutonium/ui/table/components/pagy_info.rb
@@ -1311,6 +1394,7 @@ files:
1311
1394
  - lib/plutonium/wizard/sweep_job.rb
1312
1395
  - lib/plutonium/wizard/unknown_wizard_error.rb
1313
1396
  - lib/rodauth/features/case_insensitive_login.rb
1397
+ - lib/rodauth/features/session_isolation.rb
1314
1398
  - lib/rodauth/plugins.rb
1315
1399
  - lib/tasks/.keep
1316
1400
  - lib/tasks/release.rake
@@ -1337,6 +1421,7 @@ files:
1337
1421
  - src/js/controllers/attachment_preview_container_controller.js
1338
1422
  - src/js/controllers/attachment_preview_controller.js
1339
1423
  - src/js/controllers/autosubmit_controller.js
1424
+ - src/js/controllers/breadcrumbs_controller.js
1340
1425
  - src/js/controllers/bulk_actions_controller.js
1341
1426
  - src/js/controllers/capture_url_controller.js
1342
1427
  - src/js/controllers/clipboard_controller.js
@@ -1356,6 +1441,7 @@ files:
1356
1441
  - src/js/controllers/nested_resource_form_fields_controller.js
1357
1442
  - src/js/controllers/password_sentinel_controller.js
1358
1443
  - src/js/controllers/password_visibility_controller.js
1444
+ - src/js/controllers/positioned_controller.js
1359
1445
  - src/js/controllers/register_controllers.js
1360
1446
  - src/js/controllers/remote_modal_controller.js
1361
1447
  - src/js/controllers/resource_collapse_controller.js
@@ -1364,6 +1450,7 @@ files:
1364
1450
  - src/js/controllers/resource_header_controller.js
1365
1451
  - src/js/controllers/resource_tab_list_controller.js
1366
1452
  - src/js/controllers/row_click_controller.js
1453
+ - src/js/controllers/run_progress_controller.js
1367
1454
  - src/js/controllers/select_navigator.js
1368
1455
  - src/js/controllers/sidebar_controller.js
1369
1456
  - src/js/controllers/slim_select_controller.js
@@ -1374,6 +1461,7 @@ files:
1374
1461
  - src/js/controllers/view_switcher_controller.js
1375
1462
  - src/js/controllers/wizard_controller.js
1376
1463
  - src/js/core.js
1464
+ - src/js/drag/sortable.js
1377
1465
  - src/js/plutonium.js
1378
1466
  - src/js/support/dom_element.js
1379
1467
  - src/js/support/mime_icon.js
@@ -1394,20 +1482,19 @@ metadata:
1394
1482
  homepage_uri: https://radioactive-labs.github.io/plutonium-core/
1395
1483
  source_code_uri: https://github.com/radioactive-labs/plutonium-core
1396
1484
  post_install_message: |
1397
- ℹ️ Plutonium breaking change introduced in 0.49.0
1485
+ ⚠️ Ruby 3.2 support ends in the NEXT release
1398
1486
 
1399
- Entity-scoped URL helpers and path params were renamed in 0.49.0 from
1400
- `<entity>_scope_*` to `<entity>_scoped_*`.
1487
+ This is the last Plutonium release that installs on Ruby 3.2.
1401
1488
 
1402
- Examples:
1403
- organization_scope_widgets_path → organization_scoped_widgets_path
1404
- params[:organization_scope] → params[:organization_scoped]
1489
+ Why: pagy patches CVE-2026-54659 (a path-traversal in
1490
+ `Pagy::I18n.locale=`) only in >= 43.5.6, and pagy dropped Ruby 3.2 in
1491
+ 43.5.0. No pagy version is both patched and installable on 3.2, so
1492
+ continuing to support it means shipping a known-vulnerable dependency.
1405
1493
 
1406
- If you are upgrading from 0.48.0 or earlier and reference these helpers or
1407
- params directly (e.g. in tests, custom redirects, or hand-written links),
1408
- update them to the new names.
1494
+ Ruby 3.2 reached end-of-life in March 2026.
1409
1495
 
1410
- Apps that only use `resource_url_for` are unaffected.
1496
+ Action: upgrade to Ruby 3.3 or newer before your next Plutonium bump.
1497
+ If you stay on 3.2, `bundle update plutonium` will hold you here.
1411
1498
  rdoc_options: []
1412
1499
  require_paths:
1413
1500
  - lib
@@ -1,53 +0,0 @@
1
- <template>
2
- <section class="pu-section pu-section--band">
3
- <div class="pu-section-inner">
4
- <h2 class="pu-section-title">Plutonium fits two kinds of teams.</h2>
5
- <div class="ha-grid">
6
- <div class="ha-col">
7
- <div class="ha-head">For Rails developers</div>
8
- <p class="ha-lede">The missing layer between Rails and the apps you keep building.</p>
9
- <ul class="ha-list">
10
- <li><IconArrowRight class="ha-arr" :size="16" :stroke-width="2.25" /><span>Convention extended to CRUD, policies, and portals</span></li>
11
- <li><IconArrowRight class="ha-arr" :size="16" :stroke-width="2.25" /><span>Generated code lives in your repo — edit anything</span></li>
12
- <li><IconArrowRight class="ha-arr" :size="16" :stroke-width="2.25" /><span>Mountable Rails engines for packages and portals</span></li>
13
- <li><IconArrowRight class="ha-arr" :size="16" :stroke-width="2.25" /><span>ActionPolicy authorization, baked in</span></li>
14
- </ul>
15
- </div>
16
- <div class="ha-col ha-col--right">
17
- <div class="ha-head">For founders &amp; teams</div>
18
- <p class="ha-lede">Skip the SaaS template debate. Plutonium turns Rails into a SaaS toolkit.</p>
19
- <ul class="ha-list">
20
- <li><IconArrowRight class="ha-arr" :size="16" :stroke-width="2.25" /><span>Admin panel, signup, and invites on day one</span></li>
21
- <li><IconArrowRight class="ha-arr" :size="16" :stroke-width="2.25" /><span>Multi-tenant scoping when you need it</span></li>
22
- <li><IconArrowRight class="ha-arr" :size="16" :stroke-width="2.25" /><span>No template lock-in — it's just your Rails app</span></li>
23
- <li><IconArrowRight class="ha-arr" :size="16" :stroke-width="2.25" /><span>Ship faster with AI tools that understand your code</span></li>
24
- </ul>
25
- </div>
26
- </div>
27
- </div>
28
- </section>
29
- </template>
30
-
31
- <script setup>
32
- import { IconArrowRight } from "@tabler/icons-vue"
33
- </script>
34
-
35
- <style scoped>
36
- .ha-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 32px; }
37
- .ha-col--right { border-left: 1px solid var(--pu-border); padding-left: 32px; }
38
- .ha-head {
39
- font-size: 11px; text-transform: uppercase; letter-spacing: 0.1em;
40
- color: var(--pu-accent); font-weight: 600; margin-bottom: 8px;
41
- }
42
- .ha-lede {
43
- font-size: 17px; line-height: 1.35; font-weight: 500; color: var(--pu-text);
44
- margin: 0 0 14px; letter-spacing: -0.01em;
45
- }
46
- .ha-list { list-style: none; padding: 0; margin: 0; font-size: 14px; line-height: 1.6; color: var(--pu-text-muted); }
47
- .ha-list li { display: flex; gap: 10px; align-items: flex-start; padding: 5px 0; }
48
- .ha-arr { color: var(--pu-accent); flex-shrink: 0; margin-top: 3px; }
49
- @media (max-width: 768px) {
50
- .ha-grid { grid-template-columns: 1fr; }
51
- .ha-col--right { border-left: none; padding-left: 0; border-top: 1px solid var(--pu-border); padding-top: 24px; }
52
- }
53
- </style>
@@ -1,42 +0,0 @@
1
- <template>
2
- <section class="pu-section pu-section--band">
3
- <div class="pu-section-inner">
4
- <h2 class="pu-section-title">Built on Rails. Wired for shipping.</h2>
5
- <div class="hp-grid">
6
- <div class="hp-card" v-for="p in pillars" :key="p.name">
7
- <component :is="p.icon" class="hp-icon" :size="22" :stroke-width="1.75" />
8
- <div class="hp-name">{{ p.name }}</div>
9
- <div class="hp-desc">{{ p.desc }}</div>
10
- </div>
11
- </div>
12
- </div>
13
- </section>
14
- </template>
15
-
16
- <script setup>
17
- import { IconRoute, IconCode, IconBuildingSkyscraper, IconRobot } from "@tabler/icons-vue"
18
-
19
- const pillars = [
20
- { icon: IconRoute, name: "Convention over configuration",
21
- desc: "Extended to resources, policies, portals, and tenancy — not just routes and views." },
22
- { icon: IconCode, name: "It's just Rails",
23
- desc: 'Generated code lives in your repo. Edit it, override it, delete it. The “magic” is regular Ruby mixins you can read.' },
24
- { icon: IconBuildingSkyscraper, name: "Multi-tenant ready",
25
- desc: "Path or domain tenancy. Scoped relations. Invites and memberships out of the box." },
26
- { icon: IconRobot, name: "AI-readable",
27
- desc: "Predictable file layout and naming. Built-in skills teach AI assistants the patterns." },
28
- ]
29
- </script>
30
-
31
- <style scoped>
32
- .hp-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; }
33
- .hp-card {
34
- padding: 18px; border: 1px solid var(--pu-border-soft); border-radius: 8px;
35
- background: var(--pu-bg-light);
36
- }
37
- .hp-icon { color: var(--pu-accent); margin-bottom: 10px; display: block; }
38
- .hp-name { font-weight: 600; font-size: 15px; color: var(--pu-text); margin-bottom: 6px; line-height: 1.25; }
39
- .hp-desc { font-size: 13px; color: var(--pu-text-muted); line-height: 1.5; }
40
- @media (max-width: 900px) { .hp-grid { grid-template-columns: repeat(2, 1fr); } }
41
- @media (max-width: 480px) { .hp-grid { grid-template-columns: 1fr; } }
42
- </style>