plutonium 0.62.2 → 0.64.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 (256) 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/.standard.yml +1 -1
  13. data/CHANGELOG.md +73 -0
  14. data/CLAUDE.md +87 -0
  15. data/Rakefile +34 -0
  16. data/SECURITY.md +1 -1
  17. data/app/assets/plutonium.css +1 -1
  18. data/app/assets/plutonium.js +685 -102
  19. data/app/assets/plutonium.js.map +4 -4
  20. data/app/assets/plutonium.min.js +53 -53
  21. data/app/assets/plutonium.min.js.map +4 -4
  22. data/app/views/rodauth/_login_form.html.erb +13 -0
  23. data/db/migrate/async_interactions/20260817000001_create_plutonium_async_runs.rb +170 -0
  24. data/docs/.vitepress/config.ts +81 -3
  25. data/docs/.vitepress/theme/blog.data.ts +44 -0
  26. data/docs/.vitepress/theme/components/BlogIndex.vue +87 -0
  27. data/docs/.vitepress/theme/components/BlogMeta.vue +47 -0
  28. data/docs/.vitepress/theme/components/HomeFeatureTour.vue +293 -0
  29. data/docs/.vitepress/theme/components/HomeHero.vue +3 -3
  30. data/docs/.vitepress/theme/components/HomeInTheBox.vue +8 -0
  31. data/docs/.vitepress/theme/components/HomeStopWriting.vue +1 -0
  32. data/docs/.vitepress/theme/components/HomeWhyPlutonium.vue +84 -0
  33. data/docs/.vitepress/theme/index.ts +8 -4
  34. data/docs/blog/association-inputs-post-signed-ids.md +70 -0
  35. data/docs/blog/fix-the-model-not-the-policy.md +122 -0
  36. data/docs/blog/fractional-ordering-runs-out-of-room.md +67 -0
  37. data/docs/blog/half-finished-forms-are-pii.md +76 -0
  38. data/docs/blog/index.md +13 -0
  39. data/docs/blog/interactions-are-presentation-objects.md +152 -0
  40. data/docs/blog/introducing-plutonium.md +253 -0
  41. data/docs/blog/jobs-are-not-permission-snapshots.md +100 -0
  42. data/docs/blog/plutonium-and-ai-agents.md +48 -0
  43. data/docs/blog/realtime-is-one-line-and-four-dependencies.md +70 -0
  44. data/docs/blog/two-forms-one-dom-id.md +69 -0
  45. data/docs/blog/whats-new-async-kanban-wizards.md +130 -0
  46. data/docs/getting-started/tutorial/04-authorization.md +12 -3
  47. data/docs/getting-started/tutorial/06-nested-resources.md +3 -1
  48. data/docs/getting-started/tutorial/07-author-portal.md +2 -2
  49. data/docs/guides/authentication.md +73 -0
  50. data/docs/guides/authorization.md +2 -0
  51. data/docs/guides/creating-packages.md +5 -3
  52. data/docs/guides/custom-actions.md +74 -12
  53. data/docs/guides/customizing-ui.md +9 -2
  54. data/docs/guides/index.md +1 -0
  55. data/docs/guides/kanban.md +7 -5
  56. data/docs/guides/nested-resources.md +11 -1
  57. data/docs/guides/performance.md +104 -0
  58. data/docs/guides/user-invites.md +1 -1
  59. data/docs/guides/wizards.md +9 -1
  60. data/docs/index.md +3 -3
  61. data/docs/public/images/home/tour-actions.png +0 -0
  62. data/docs/public/images/home/tour-async.png +0 -0
  63. data/docs/public/images/home/tour-kanban.png +0 -0
  64. data/docs/public/images/home/tour-tenancy.png +0 -0
  65. data/docs/public/images/home/tour-wizard.png +0 -0
  66. data/docs/public/images/reference/async-progress-page.png +0 -0
  67. data/docs/public/images/reference/async-running-banner.png +0 -0
  68. data/docs/public/templates/experimental.rb +34 -0
  69. data/docs/public/templates/pluton8.rb +14 -0
  70. data/docs/reference/app/portals.md +15 -3
  71. data/docs/reference/auth/accounts.md +19 -0
  72. data/docs/reference/behavior/async-interactions.md +295 -0
  73. data/docs/reference/behavior/controllers.md +17 -4
  74. data/docs/reference/behavior/index.md +7 -1
  75. data/docs/reference/behavior/interactions.md +152 -22
  76. data/docs/reference/configuration.md +5 -0
  77. data/docs/reference/index.md +1 -0
  78. data/docs/reference/kanban/dsl.md +7 -4
  79. data/docs/reference/kanban/index.md +1 -1
  80. data/docs/reference/kanban/positioning.md +26 -4
  81. data/docs/reference/positioning.md +568 -0
  82. data/docs/reference/resource/actions.md +97 -4
  83. data/docs/reference/resource/definition.md +181 -9
  84. data/docs/reference/tenancy/invites.md +1 -1
  85. data/docs/reference/tenancy/nested-resources.md +60 -2
  86. data/docs/reference/ui/assets.md +4 -0
  87. data/docs/reference/ui/components.md +57 -4
  88. data/docs/reference/ui/displays.md +20 -10
  89. data/docs/reference/ui/index.md +1 -1
  90. data/docs/reference/wizard/dsl.md +33 -0
  91. data/docs/reference/wizard/storage-config.md +1 -0
  92. data/docs/superpowers/plans/2026-07-16-homepage-depth-upgrade.md +624 -0
  93. data/docs/superpowers/plans/2026-07-16-homepage-depth-upgrade.md.tasks.json +32 -0
  94. data/docs/superpowers/plans/2026-07-31-positioned-drag-and-drop.md +1787 -0
  95. data/docs/superpowers/plans/2026-07-31-positioned-drag-and-drop.md.tasks.json +91 -0
  96. data/docs/superpowers/plans/2026-08-17-async-interactions.md +1414 -0
  97. data/docs/superpowers/plans/2026-08-17-async-interactions.md.tasks.json +66 -0
  98. data/docs/superpowers/specs/2026-07-16-homepage-depth-upgrade-design.md +111 -0
  99. data/docs/superpowers/specs/2026-07-17-action-html-attributes-design.md +124 -0
  100. data/docs/superpowers/specs/2026-07-31-positioned-drag-and-drop-design.md +506 -0
  101. data/docs/superpowers/specs/2026-08-17-async-interactions-design.md +185 -0
  102. data/gemfiles/postgres.gemfile.lock +85 -85
  103. data/gemfiles/rails_7.gemfile.lock +323 -141
  104. data/gemfiles/rails_8.0.gemfile.lock +126 -116
  105. data/gemfiles/rails_8.1.gemfile.lock +127 -117
  106. data/lib/generators/pu/async_interactions/install_generator.rb +111 -0
  107. data/lib/generators/pu/async_interactions/templates/app/controllers/async_runs_controller.rb.tt +15 -0
  108. data/lib/generators/pu/core/typespec/typespec_generator.rb +7 -4
  109. data/lib/generators/pu/invites/install_generator.rb +3 -3
  110. data/lib/generators/pu/invites/templates/packages/invites/app/views/layouts/invites/invitation.html.erb.tt +2 -2
  111. data/lib/generators/pu/lib/plutonium_generators/concerns/mounts_engines.rb +47 -2
  112. data/lib/generators/pu/lib/plutonium_generators/concerns/resource_registration.rb +41 -0
  113. data/lib/generators/pu/lite/litestream/litestream_generator.rb +1 -1
  114. data/lib/generators/pu/lite/solid_queue/solid_queue_generator.rb +1 -1
  115. data/lib/generators/pu/res/conn/conn_generator.rb +19 -39
  116. data/lib/generators/pu/res/conn/templates/app/controllers/resource_controller.rb.tt +4 -0
  117. data/lib/generators/pu/rodauth/templates/app/rodauth/account_rodauth_plugin.rb.tt +15 -6
  118. data/lib/generators/pu/rodauth/templates/app/rodauth/rodauth_plugin.rb.tt +7 -0
  119. data/lib/generators/pu/saas/welcome/templates/app/views/layouts/welcome.html.erb.tt +2 -2
  120. data/lib/generators/pu/wizards/install_generator.rb +78 -0
  121. data/lib/plutonium/action/base.rb +71 -9
  122. data/lib/plutonium/action/interactive.rb +9 -0
  123. data/lib/plutonium/attachments.rb +254 -0
  124. data/lib/plutonium/configuration.rb +82 -1
  125. data/lib/plutonium/core/controller.rb +50 -7
  126. data/lib/plutonium/core/controllers/authorizable.rb +16 -0
  127. data/lib/plutonium/core/controllers/entity_scoping.rb +12 -2
  128. data/lib/plutonium/definition/base.rb +51 -0
  129. data/lib/plutonium/definition/display_layout.rb +112 -0
  130. data/lib/plutonium/definition/index_views.rb +8 -7
  131. data/lib/plutonium/definition/input_aliases.rb +38 -0
  132. data/lib/plutonium/definition/page_widths.rb +65 -0
  133. data/lib/plutonium/definition/positioning.rb +126 -0
  134. data/lib/plutonium/definition/sorting.rb +17 -2
  135. data/lib/plutonium/helpers/turbo_helper.rb +7 -0
  136. data/lib/plutonium/interaction/README.md +61 -24
  137. data/lib/plutonium/interaction/async/configuration.rb +38 -0
  138. data/lib/plutonium/interaction/async/context.rb +419 -0
  139. data/lib/plutonium/interaction/async/executor.rb +422 -0
  140. data/lib/plutonium/interaction/async/job.rb +80 -0
  141. data/lib/plutonium/interaction/async/reap_job.rb +81 -0
  142. data/lib/plutonium/interaction/async/run.rb +394 -0
  143. data/lib/plutonium/interaction/async/run_definition.rb +155 -0
  144. data/lib/plutonium/interaction/async/run_policy.rb +86 -0
  145. data/lib/plutonium/interaction/base.rb +34 -7
  146. data/lib/plutonium/interaction/concerns/dispatchable.rb +518 -0
  147. data/lib/plutonium/interaction/concerns/scoping.rb +70 -9
  148. data/lib/plutonium/interaction/response/redirect.rb +11 -3
  149. data/lib/plutonium/kanban/board.rb +14 -0
  150. data/lib/plutonium/kanban/column.rb +4 -2
  151. data/lib/plutonium/kanban/dsl.rb +4 -1
  152. data/lib/plutonium/kanban/grouping.rb +9 -22
  153. data/lib/plutonium/kanban/positioning.rb +5 -65
  154. data/lib/plutonium/positioning/config.rb +94 -0
  155. data/lib/plutonium/positioning/model.rb +128 -0
  156. data/lib/plutonium/positioning.rb +25 -86
  157. data/lib/plutonium/railtie.rb +1 -0
  158. data/lib/plutonium/resource/controller.rb +118 -38
  159. data/lib/plutonium/resource/controllers/crud_actions/index_action.rb +32 -2
  160. data/lib/plutonium/resource/controllers/crud_actions.rb +30 -2
  161. data/lib/plutonium/resource/controllers/eager_loading.rb +87 -0
  162. data/lib/plutonium/resource/controllers/export_csv.rb +10 -1
  163. data/lib/plutonium/resource/controllers/kanban_actions.rb +53 -14
  164. data/lib/plutonium/resource/controllers/position_actions.rb +390 -0
  165. data/lib/plutonium/resource/controllers/presentable.rb +19 -13
  166. data/lib/plutonium/resource/controllers/queryable.rb +5 -1
  167. data/lib/plutonium/resource/controllers/wizard_actions.rb +21 -0
  168. data/lib/plutonium/resource/policy.rb +33 -0
  169. data/lib/plutonium/resource/query_object.rb +36 -0
  170. data/lib/plutonium/routing/mapper_extensions.rb +100 -8
  171. data/lib/plutonium/routing/route_set_extensions.rb +15 -1
  172. data/lib/plutonium/routing/wizard_registration.rb +4 -0
  173. data/lib/plutonium/testing/resource_policy.rb +6 -2
  174. data/lib/plutonium/ui/action_button.rb +12 -7
  175. data/lib/plutonium/ui/actions_dropdown.rb +1 -1
  176. data/lib/plutonium/ui/block.rb +21 -1
  177. data/lib/plutonium/ui/breadcrumbs.rb +187 -55
  178. data/lib/plutonium/ui/component/methods.rb +5 -0
  179. data/lib/plutonium/ui/component/positionable.rb +112 -0
  180. data/lib/plutonium/ui/component/resolves_tags.rb +57 -0
  181. data/lib/plutonium/ui/component/section.rb +185 -0
  182. data/lib/plutonium/ui/display/base.rb +13 -1
  183. data/lib/plutonium/ui/display/components/formatted_value.rb +26 -0
  184. data/lib/plutonium/ui/display/components/section.rb +18 -0
  185. data/lib/plutonium/ui/display/resource.rb +141 -22
  186. data/lib/plutonium/ui/display/theme.rb +20 -1
  187. data/lib/plutonium/ui/export_button.rb +1 -1
  188. data/lib/plutonium/ui/form/base.rb +8 -7
  189. data/lib/plutonium/ui/form/components/intl_tel_input.rb +1 -1
  190. data/lib/plutonium/ui/form/components/section.rb +7 -62
  191. data/lib/plutonium/ui/form/components/uppy.rb +12 -1
  192. data/lib/plutonium/ui/form/concerns/renders_nested_resource_fields.rb +16 -3
  193. data/lib/plutonium/ui/form/concerns/renders_structured_inputs.rb +5 -1
  194. data/lib/plutonium/ui/form/query.rb +2 -4
  195. data/lib/plutonium/ui/form/resource.rb +92 -15
  196. data/lib/plutonium/ui/form/theme.rb +17 -0
  197. data/lib/plutonium/ui/form/wizard.rb +25 -1
  198. data/lib/plutonium/ui/grid/card.rb +79 -11
  199. data/lib/plutonium/ui/grid/resource.rb +47 -5
  200. data/lib/plutonium/ui/interaction/async/run_progress.rb +227 -0
  201. data/lib/plutonium/ui/interaction/async/running_banner.rb +65 -0
  202. data/lib/plutonium/ui/kanban/card.rb +2 -1
  203. data/lib/plutonium/ui/kanban/column.rb +12 -6
  204. data/lib/plutonium/ui/kanban/resource.rb +6 -7
  205. data/lib/plutonium/ui/layout/base.rb +10 -3
  206. data/lib/plutonium/ui/nav_grid_menu.rb +1 -0
  207. data/lib/plutonium/ui/page/base.rb +19 -0
  208. data/lib/plutonium/ui/page/edit.rb +4 -1
  209. data/lib/plutonium/ui/page/index.rb +69 -18
  210. data/lib/plutonium/ui/page/interactive_action.rb +5 -1
  211. data/lib/plutonium/ui/page/new.rb +4 -1
  212. data/lib/plutonium/ui/page/show.rb +27 -10
  213. data/lib/plutonium/ui/page/wizard.rb +10 -1
  214. data/lib/plutonium/ui/page/wizard_chooser.rb +36 -11
  215. data/lib/plutonium/ui/page_width.rb +58 -0
  216. data/lib/plutonium/ui/table/base.rb +34 -1
  217. data/lib/plutonium/ui/table/components/attachment.rb +1 -1
  218. data/lib/plutonium/ui/table/components/bulk_actions_toolbar.rb +32 -8
  219. data/lib/plutonium/ui/table/components/drag_handle.rb +120 -0
  220. data/lib/plutonium/ui/table/components/filter_form.rb +1 -4
  221. data/lib/plutonium/ui/table/components/filter_pills.rb +1 -1
  222. data/lib/plutonium/ui/table/components/row_actions_dropdown.rb +1 -1
  223. data/lib/plutonium/ui/table/resource.rb +50 -5
  224. data/lib/plutonium/ui/table/theme.rb +59 -2
  225. data/lib/plutonium/ui/wizard/review.rb +4 -2
  226. data/lib/plutonium/ui/wizard/summary_display.rb +42 -14
  227. data/lib/plutonium/version.rb +1 -1
  228. data/lib/plutonium/wizard/attachments.rb +32 -197
  229. data/lib/plutonium/wizard/base.rb +6 -1
  230. data/lib/plutonium/wizard/configuration.rb +12 -0
  231. data/lib/plutonium/wizard/controller.rb +14 -0
  232. data/lib/plutonium/wizard/driving.rb +99 -15
  233. data/lib/plutonium/wizard/dsl.rb +23 -0
  234. data/lib/plutonium/wizard/resume.rb +127 -49
  235. data/lib/plutonium/wizard/runner.rb +46 -2
  236. data/lib/plutonium/wizard/step_adapter.rb +1 -1
  237. data/lib/plutonium/wizard/sweep_job.rb +16 -0
  238. data/lib/plutonium.rb +21 -0
  239. data/lib/rodauth/features/session_isolation.rb +92 -0
  240. data/lib/rodauth/plugins.rb +1 -0
  241. data/package.json +2 -1
  242. data/plutonium.gemspec +20 -20
  243. data/src/css/components.css +89 -1
  244. data/src/css/slim_select.css +20 -0
  245. data/src/js/controllers/breadcrumbs_controller.js +112 -0
  246. data/src/js/controllers/bulk_actions_controller.js +10 -2
  247. data/src/js/controllers/kanban_controller.js +30 -21
  248. data/src/js/controllers/positioned_controller.js +452 -0
  249. data/src/js/controllers/register_controllers.js +6 -0
  250. data/src/js/controllers/resource_drop_down_controller.js +5 -0
  251. data/src/js/controllers/run_progress_controller.js +73 -0
  252. data/src/js/drag/sortable.js +186 -0
  253. data/yarn.lock +108 -63
  254. metadata +101 -22
  255. data/docs/.vitepress/theme/components/HomeAudienceSplit.vue +0 -53
  256. 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.64.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
@@ -72,6 +72,9 @@ dependencies:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
74
  version: '43.0'
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: 43.5.6
75
78
  type: :runtime
76
79
  prerelease: false
77
80
  version_requirements: !ruby/object:Gem::Requirement
@@ -79,6 +82,9 @@ dependencies:
79
82
  - - "~>"
80
83
  - !ruby/object:Gem::Version
81
84
  version: '43.0'
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: 43.5.6
82
88
  - !ruby/object:Gem::Dependency
83
89
  name: rabl
84
90
  requirement: !ruby/object:Gem::Requirement
@@ -429,6 +435,20 @@ dependencies:
429
435
  - - ">="
430
436
  - !ruby/object:Gem::Version
431
437
  version: '0'
438
+ - !ruby/object:Gem::Dependency
439
+ name: acts_as_list
440
+ requirement: !ruby/object:Gem::Requirement
441
+ requirements:
442
+ - - ">="
443
+ - !ruby/object:Gem::Version
444
+ version: '0'
445
+ type: :development
446
+ prerelease: false
447
+ version_requirements: !ruby/object:Gem::Requirement
448
+ requirements:
449
+ - - ">="
450
+ - !ruby/object:Gem::Version
451
+ version: '0'
432
452
  description: Plutonium is a Rapid Application Development toolkit for Rails. Convention-driven
433
453
  and fully customizable, it adds application-level concepts like resources, policies,
434
454
  definitions, and portals that make building complex apps faster. Built for the AI
@@ -442,6 +462,7 @@ extra_rdoc_files: []
442
462
  files:
443
463
  - "# Plutonium: The pre-alpha demo.md"
444
464
  - ".claude/skills/plutonium-app/SKILL.md"
465
+ - ".claude/skills/plutonium-async-interactions/SKILL.md"
445
466
  - ".claude/skills/plutonium-auth/SKILL.md"
446
467
  - ".claude/skills/plutonium-behavior/SKILL.md"
447
468
  - ".claude/skills/plutonium-kanban/SKILL.md"
@@ -553,20 +574,36 @@ files:
553
574
  - config/initializers/pagy.rb
554
575
  - config/initializers/rabl.rb
555
576
  - config/initializers/sqlite_alias.rb
577
+ - db/migrate/async_interactions/20260817000001_create_plutonium_async_runs.rb
556
578
  - db/migrate/wizard/20260615000001_create_plutonium_wizard_sessions.rb
557
579
  - docs/.vitepress/config.ts
558
580
  - docs/.vitepress/sync-skills.mjs
559
- - docs/.vitepress/theme/components/HomeAudienceSplit.vue
581
+ - docs/.vitepress/theme/blog.data.ts
582
+ - docs/.vitepress/theme/components/BlogIndex.vue
583
+ - docs/.vitepress/theme/components/BlogMeta.vue
560
584
  - docs/.vitepress/theme/components/HomeCta.vue
585
+ - docs/.vitepress/theme/components/HomeFeatureTour.vue
561
586
  - docs/.vitepress/theme/components/HomeHero.vue
562
587
  - docs/.vitepress/theme/components/HomeInTheBox.vue
563
- - docs/.vitepress/theme/components/HomePillars.vue
564
588
  - docs/.vitepress/theme/components/HomeStopWriting.vue
565
589
  - docs/.vitepress/theme/components/HomeWalkthrough.vue
590
+ - docs/.vitepress/theme/components/HomeWhyPlutonium.vue
566
591
  - docs/.vitepress/theme/components/SectionLanding.vue
567
592
  - docs/.vitepress/theme/custom.css
568
593
  - docs/.vitepress/theme/index.ts
569
594
  - docs/ai.md
595
+ - docs/blog/association-inputs-post-signed-ids.md
596
+ - docs/blog/fix-the-model-not-the-policy.md
597
+ - docs/blog/fractional-ordering-runs-out-of-room.md
598
+ - docs/blog/half-finished-forms-are-pii.md
599
+ - docs/blog/index.md
600
+ - docs/blog/interactions-are-presentation-objects.md
601
+ - docs/blog/introducing-plutonium.md
602
+ - docs/blog/jobs-are-not-permission-snapshots.md
603
+ - docs/blog/plutonium-and-ai-agents.md
604
+ - docs/blog/realtime-is-one-line-and-four-dependencies.md
605
+ - docs/blog/two-forms-one-dom-id.md
606
+ - docs/blog/whats-new-async-kanban-wizards.md
570
607
  - docs/getting-started/index.md
571
608
  - docs/getting-started/installation.md
572
609
  - docs/getting-started/tutorial/01-setup.md
@@ -588,6 +625,7 @@ files:
588
625
  - docs/guides/kanban.md
589
626
  - docs/guides/multi-tenancy.md
590
627
  - docs/guides/nested-resources.md
628
+ - docs/guides/performance.md
591
629
  - docs/guides/search-filtering.md
592
630
  - docs/guides/testing.md
593
631
  - docs/guides/theming.md
@@ -631,6 +669,13 @@ files:
631
669
  - docs/public/images/home-index.png
632
670
  - docs/public/images/home-new.png
633
671
  - docs/public/images/home-show.png
672
+ - docs/public/images/home/tour-actions.png
673
+ - docs/public/images/home/tour-async.png
674
+ - docs/public/images/home/tour-kanban.png
675
+ - docs/public/images/home/tour-tenancy.png
676
+ - docs/public/images/home/tour-wizard.png
677
+ - docs/public/images/reference/async-progress-page.png
678
+ - docs/public/images/reference/async-running-banner.png
634
679
  - docs/public/images/reference/structured-inputs-removed.png
635
680
  - docs/public/images/reference/structured-inputs.png
636
681
  - docs/public/images/tutorial/02-empty-index.png
@@ -651,6 +696,7 @@ files:
651
696
  - docs/public/plutonium.png
652
697
  - docs/public/site.webmanifest
653
698
  - docs/public/templates/base.rb
699
+ - docs/public/templates/experimental.rb
654
700
  - docs/public/templates/lite.rb
655
701
  - docs/public/templates/pluton8.rb
656
702
  - docs/public/templates/plutonium.rb
@@ -670,6 +716,7 @@ files:
670
716
  - docs/reference/auth/accounts.md
671
717
  - docs/reference/auth/index.md
672
718
  - docs/reference/auth/profile.md
719
+ - docs/reference/behavior/async-interactions.md
673
720
  - docs/reference/behavior/controllers.md
674
721
  - docs/reference/behavior/index.md
675
722
  - docs/reference/behavior/interactions.md
@@ -681,6 +728,7 @@ files:
681
728
  - docs/reference/kanban/dsl.md
682
729
  - docs/reference/kanban/index.md
683
730
  - docs/reference/kanban/positioning.md
731
+ - docs/reference/positioning.md
684
732
  - docs/reference/resource/actions.md
685
733
  - docs/reference/resource/definition.md
686
734
  - docs/reference/resource/export.md
@@ -729,6 +777,12 @@ files:
729
777
  - docs/superpowers/plans/2026-06-26-kanban-dsl.md.tasks.json
730
778
  - docs/superpowers/plans/2026-07-02-kanban-drop-interactions.md
731
779
  - docs/superpowers/plans/2026-07-02-kanban-drop-interactions.md.tasks.json
780
+ - docs/superpowers/plans/2026-07-16-homepage-depth-upgrade.md
781
+ - docs/superpowers/plans/2026-07-16-homepage-depth-upgrade.md.tasks.json
782
+ - docs/superpowers/plans/2026-07-31-positioned-drag-and-drop.md
783
+ - docs/superpowers/plans/2026-07-31-positioned-drag-and-drop.md.tasks.json
784
+ - docs/superpowers/plans/2026-08-17-async-interactions.md
785
+ - docs/superpowers/plans/2026-08-17-async-interactions.md.tasks.json
732
786
  - docs/superpowers/specs/2026-04-08-plutonium-skills-overhaul-design.md
733
787
  - docs/superpowers/specs/2026-04-14-plutonium-testing-design.md
734
788
  - docs/superpowers/specs/2026-05-07-ui-layout-overhaul-design.md
@@ -749,6 +803,10 @@ files:
749
803
  - docs/superpowers/specs/2026-06-18-wizard-hosting-design.md
750
804
  - docs/superpowers/specs/2026-06-26-kanban-dsl-design.md
751
805
  - docs/superpowers/specs/2026-07-03-kanban-auth-simplification.md
806
+ - docs/superpowers/specs/2026-07-16-homepage-depth-upgrade-design.md
807
+ - docs/superpowers/specs/2026-07-17-action-html-attributes-design.md
808
+ - docs/superpowers/specs/2026-07-31-positioned-drag-and-drop-design.md
809
+ - docs/superpowers/specs/2026-08-17-async-interactions-design.md
752
810
  - esbuild.config.js
753
811
  - exe/pug
754
812
  - gemfiles/postgres.gemfile
@@ -762,6 +820,8 @@ files:
762
820
  - lib/active_model/validations/array_validator.rb
763
821
  - lib/active_model/validations/attached_validator.rb
764
822
  - lib/active_model/validations/url_validator.rb
823
+ - lib/generators/pu/async_interactions/install_generator.rb
824
+ - lib/generators/pu/async_interactions/templates/app/controllers/async_runs_controller.rb.tt
765
825
  - lib/generators/pu/core/assets/assets_generator.rb
766
826
  - lib/generators/pu/core/assets/templates/.keep
767
827
  - lib/generators/pu/core/assets/templates/postcss.config.js
@@ -858,6 +918,7 @@ files:
858
918
  - lib/generators/pu/lib/plutonium_generators/concerns/logger.rb
859
919
  - lib/generators/pu/lib/plutonium_generators/concerns/mounts_engines.rb
860
920
  - lib/generators/pu/lib/plutonium_generators/concerns/package_selector.rb
921
+ - lib/generators/pu/lib/plutonium_generators/concerns/resource_registration.rb
861
922
  - lib/generators/pu/lib/plutonium_generators/concerns/resource_selector.rb
862
923
  - lib/generators/pu/lib/plutonium_generators/concerns/rodauth_redirects.rb
863
924
  - lib/generators/pu/lib/plutonium_generators/concerns/serializer.rb
@@ -1025,6 +1086,7 @@ files:
1025
1086
  - lib/generators/pu/test/install/templates/plutonium_testing.rb.tt
1026
1087
  - lib/generators/pu/test/scaffold/scaffold_generator.rb
1027
1088
  - lib/generators/pu/test/scaffold/templates/integration_test.rb.tt
1089
+ - lib/generators/pu/wizards/install_generator.rb
1028
1090
  - lib/plutonium.rb
1029
1091
  - lib/plutonium/action/README.md
1030
1092
  - lib/plutonium/action/base.rb
@@ -1036,6 +1098,7 @@ files:
1036
1098
  - lib/plutonium/api_client.rb
1037
1099
  - lib/plutonium/api_client/concerns/create_api_client.rb
1038
1100
  - lib/plutonium/api_client/concerns/disable_api_client.rb
1101
+ - lib/plutonium/attachments.rb
1039
1102
  - lib/plutonium/auth.rb
1040
1103
  - lib/plutonium/auth/public.rb
1041
1104
  - lib/plutonium/auth/rodauth.rb
@@ -1051,11 +1114,15 @@ files:
1051
1114
  - lib/plutonium/definition/base.rb
1052
1115
  - lib/plutonium/definition/config_attr.rb
1053
1116
  - lib/plutonium/definition/defineable_props.rb
1117
+ - lib/plutonium/definition/display_layout.rb
1054
1118
  - lib/plutonium/definition/form_layout.rb
1055
1119
  - lib/plutonium/definition/index_views.rb
1056
1120
  - lib/plutonium/definition/inheritable_config_attr.rb
1121
+ - lib/plutonium/definition/input_aliases.rb
1057
1122
  - lib/plutonium/definition/metadata.rb
1058
1123
  - lib/plutonium/definition/nested_inputs.rb
1124
+ - lib/plutonium/definition/page_widths.rb
1125
+ - lib/plutonium/definition/positioning.rb
1059
1126
  - lib/plutonium/definition/presentable.rb
1060
1127
  - lib/plutonium/definition/scoping.rb
1061
1128
  - lib/plutonium/definition/search.rb
@@ -1072,7 +1139,16 @@ files:
1072
1139
  - lib/plutonium/helpers/turbo_helper.rb
1073
1140
  - lib/plutonium/helpers/turbo_stream_actions_helper.rb
1074
1141
  - lib/plutonium/interaction/README.md
1142
+ - lib/plutonium/interaction/async/configuration.rb
1143
+ - lib/plutonium/interaction/async/context.rb
1144
+ - lib/plutonium/interaction/async/executor.rb
1145
+ - lib/plutonium/interaction/async/job.rb
1146
+ - lib/plutonium/interaction/async/reap_job.rb
1147
+ - lib/plutonium/interaction/async/run.rb
1148
+ - lib/plutonium/interaction/async/run_definition.rb
1149
+ - lib/plutonium/interaction/async/run_policy.rb
1075
1150
  - lib/plutonium/interaction/base.rb
1151
+ - lib/plutonium/interaction/concerns/dispatchable.rb
1076
1152
  - lib/plutonium/interaction/concerns/scoping.rb
1077
1153
  - lib/plutonium/interaction/concerns/workflow_dsl.rb
1078
1154
  - lib/plutonium/interaction/outcome.rb
@@ -1111,6 +1187,8 @@ files:
1111
1187
  - lib/plutonium/portal/dynamic_controllers.rb
1112
1188
  - lib/plutonium/portal/engine.rb
1113
1189
  - lib/plutonium/positioning.rb
1190
+ - lib/plutonium/positioning/config.rb
1191
+ - lib/plutonium/positioning/model.rb
1114
1192
  - lib/plutonium/profile/security_section.rb
1115
1193
  - lib/plutonium/query/adhoc_block.rb
1116
1194
  - lib/plutonium/query/base.rb
@@ -1130,9 +1208,11 @@ files:
1130
1208
  - lib/plutonium/resource/controllers/crud_actions.rb
1131
1209
  - lib/plutonium/resource/controllers/crud_actions/index_action.rb
1132
1210
  - lib/plutonium/resource/controllers/defineable.rb
1211
+ - lib/plutonium/resource/controllers/eager_loading.rb
1133
1212
  - lib/plutonium/resource/controllers/export_csv.rb
1134
1213
  - lib/plutonium/resource/controllers/interactive_actions.rb
1135
1214
  - lib/plutonium/resource/controllers/kanban_actions.rb
1215
+ - lib/plutonium/resource/controllers/position_actions.rb
1136
1216
  - lib/plutonium/resource/controllers/presentable.rb
1137
1217
  - lib/plutonium/resource/controllers/queryable.rb
1138
1218
  - lib/plutonium/resource/controllers/typeahead.rb
@@ -1177,6 +1257,9 @@ files:
1177
1257
  - lib/plutonium/ui/component/behaviour.rb
1178
1258
  - lib/plutonium/ui/component/kit.rb
1179
1259
  - lib/plutonium/ui/component/methods.rb
1260
+ - lib/plutonium/ui/component/positionable.rb
1261
+ - lib/plutonium/ui/component/resolves_tags.rb
1262
+ - lib/plutonium/ui/component/section.rb
1180
1263
  - lib/plutonium/ui/component/tokens.rb
1181
1264
  - lib/plutonium/ui/component_classes.rb
1182
1265
  - lib/plutonium/ui/display/base.rb
@@ -1186,8 +1269,10 @@ files:
1186
1269
  - lib/plutonium/ui/display/components/boolean.rb
1187
1270
  - lib/plutonium/ui/display/components/color.rb
1188
1271
  - lib/plutonium/ui/display/components/currency.rb
1272
+ - lib/plutonium/ui/display/components/formatted_value.rb
1189
1273
  - lib/plutonium/ui/display/components/markdown.rb
1190
1274
  - lib/plutonium/ui/display/components/phlexi_render.rb
1275
+ - lib/plutonium/ui/display/components/section.rb
1191
1276
  - lib/plutonium/ui/display/options/inferred_types.rb
1192
1277
  - lib/plutonium/ui/display/resource.rb
1193
1278
  - lib/plutonium/ui/display/theme.rb
@@ -1226,6 +1311,8 @@ files:
1226
1311
  - lib/plutonium/ui/frame_navigator_panel.rb
1227
1312
  - lib/plutonium/ui/grid/card.rb
1228
1313
  - lib/plutonium/ui/grid/resource.rb
1314
+ - lib/plutonium/ui/interaction/async/run_progress.rb
1315
+ - lib/plutonium/ui/interaction/async/running_banner.rb
1229
1316
  - lib/plutonium/ui/kanban/card.rb
1230
1317
  - lib/plutonium/ui/kanban/color_dot.rb
1231
1318
  - lib/plutonium/ui/kanban/column.rb
@@ -1255,6 +1342,7 @@ files:
1255
1342
  - lib/plutonium/ui/page/wizard_chooser.rb
1256
1343
  - lib/plutonium/ui/page/wizard_completed.rb
1257
1344
  - lib/plutonium/ui/page_header.rb
1345
+ - lib/plutonium/ui/page_width.rb
1258
1346
  - lib/plutonium/ui/panel.rb
1259
1347
  - lib/plutonium/ui/sidebar_menu.rb
1260
1348
  - lib/plutonium/ui/skeleton_table.rb
@@ -1262,6 +1350,7 @@ files:
1262
1350
  - lib/plutonium/ui/table/base.rb
1263
1351
  - lib/plutonium/ui/table/components/attachment.rb
1264
1352
  - lib/plutonium/ui/table/components/bulk_actions_toolbar.rb
1353
+ - lib/plutonium/ui/table/components/drag_handle.rb
1265
1354
  - lib/plutonium/ui/table/components/filter_form.rb
1266
1355
  - lib/plutonium/ui/table/components/filter_pills.rb
1267
1356
  - lib/plutonium/ui/table/components/pagy_info.rb
@@ -1311,6 +1400,7 @@ files:
1311
1400
  - lib/plutonium/wizard/sweep_job.rb
1312
1401
  - lib/plutonium/wizard/unknown_wizard_error.rb
1313
1402
  - lib/rodauth/features/case_insensitive_login.rb
1403
+ - lib/rodauth/features/session_isolation.rb
1314
1404
  - lib/rodauth/plugins.rb
1315
1405
  - lib/tasks/.keep
1316
1406
  - lib/tasks/release.rake
@@ -1337,6 +1427,7 @@ files:
1337
1427
  - src/js/controllers/attachment_preview_container_controller.js
1338
1428
  - src/js/controllers/attachment_preview_controller.js
1339
1429
  - src/js/controllers/autosubmit_controller.js
1430
+ - src/js/controllers/breadcrumbs_controller.js
1340
1431
  - src/js/controllers/bulk_actions_controller.js
1341
1432
  - src/js/controllers/capture_url_controller.js
1342
1433
  - src/js/controllers/clipboard_controller.js
@@ -1356,6 +1447,7 @@ files:
1356
1447
  - src/js/controllers/nested_resource_form_fields_controller.js
1357
1448
  - src/js/controllers/password_sentinel_controller.js
1358
1449
  - src/js/controllers/password_visibility_controller.js
1450
+ - src/js/controllers/positioned_controller.js
1359
1451
  - src/js/controllers/register_controllers.js
1360
1452
  - src/js/controllers/remote_modal_controller.js
1361
1453
  - src/js/controllers/resource_collapse_controller.js
@@ -1364,6 +1456,7 @@ files:
1364
1456
  - src/js/controllers/resource_header_controller.js
1365
1457
  - src/js/controllers/resource_tab_list_controller.js
1366
1458
  - src/js/controllers/row_click_controller.js
1459
+ - src/js/controllers/run_progress_controller.js
1367
1460
  - src/js/controllers/select_navigator.js
1368
1461
  - src/js/controllers/sidebar_controller.js
1369
1462
  - src/js/controllers/slim_select_controller.js
@@ -1374,6 +1467,7 @@ files:
1374
1467
  - src/js/controllers/view_switcher_controller.js
1375
1468
  - src/js/controllers/wizard_controller.js
1376
1469
  - src/js/core.js
1470
+ - src/js/drag/sortable.js
1377
1471
  - src/js/plutonium.js
1378
1472
  - src/js/support/dom_element.js
1379
1473
  - src/js/support/mime_icon.js
@@ -1393,21 +1487,6 @@ metadata:
1393
1487
  rubygems_mfa_required: 'true'
1394
1488
  homepage_uri: https://radioactive-labs.github.io/plutonium-core/
1395
1489
  source_code_uri: https://github.com/radioactive-labs/plutonium-core
1396
- post_install_message: |
1397
- ℹ️ Plutonium — breaking change introduced in 0.49.0
1398
-
1399
- Entity-scoped URL helpers and path params were renamed in 0.49.0 from
1400
- `<entity>_scope_*` to `<entity>_scoped_*`.
1401
-
1402
- Examples:
1403
- organization_scope_widgets_path → organization_scoped_widgets_path
1404
- params[:organization_scope] → params[:organization_scoped]
1405
-
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.
1409
-
1410
- Apps that only use `resource_url_for` are unaffected.
1411
1490
  rdoc_options: []
1412
1491
  require_paths:
1413
1492
  - lib
@@ -1415,7 +1494,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
1415
1494
  requirements:
1416
1495
  - - ">="
1417
1496
  - !ruby/object:Gem::Version
1418
- version: 3.2.2
1497
+ version: '3.3'
1419
1498
  required_rubygems_version: !ruby/object:Gem::Requirement
1420
1499
  requirements:
1421
1500
  - - ">="
@@ -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>