plutonium 0.59.0 → 0.60.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/.claude/skills/plutonium-auth/SKILL.md +8 -2
  3. data/.claude/skills/plutonium-ui/SKILL.md +12 -0
  4. data/CHANGELOG.md +15 -0
  5. data/app/assets/plutonium.css +1 -1
  6. data/docs/reference/auth/accounts.md +7 -0
  7. data/docs/reference/configuration.md +1 -1
  8. data/docs/reference/resource/definition.md +129 -0
  9. data/docs/reference/ui/forms.md +51 -21
  10. data/docs/reference/ui/layouts.md +37 -1
  11. data/docs/superpowers/plans/2026-06-14-form-sectioning.md +926 -0
  12. data/docs/superpowers/plans/2026-06-14-form-sectioning.md.tasks.json +40 -0
  13. data/docs/superpowers/plans/2026-06-14-railless-portal.md +761 -0
  14. data/docs/superpowers/plans/2026-06-14-railless-portal.md.tasks.json +51 -0
  15. data/docs/superpowers/specs/2026-06-14-form-sectioning-design.md +247 -0
  16. data/docs/superpowers/specs/2026-06-14-railless-portal-design.md +275 -0
  17. data/gemfiles/rails_7.gemfile.lock +1 -1
  18. data/gemfiles/rails_8.0.gemfile.lock +1 -1
  19. data/gemfiles/rails_8.1.gemfile.lock +1 -1
  20. data/lib/generators/pu/core/install/templates/config/initializers/plutonium.rb +1 -0
  21. data/lib/generators/pu/rodauth/admin_generator.rb +5 -2
  22. data/lib/generators/pu/rodauth/migration_generator.rb +1 -1
  23. data/lib/generators/pu/rodauth/templates/app/interactions/resend_admin_interaction.rb.tt +18 -0
  24. data/lib/generators/pu/rodauth/views_generator.rb +1 -1
  25. data/lib/plutonium/auth/rodauth.rb +2 -1
  26. data/lib/plutonium/configuration.rb +2 -1
  27. data/lib/plutonium/core/controller.rb +19 -0
  28. data/lib/plutonium/definition/base.rb +1 -0
  29. data/lib/plutonium/definition/form_layout.rb +143 -0
  30. data/lib/plutonium/interaction/base.rb +1 -0
  31. data/lib/plutonium/package/engine.rb +17 -7
  32. data/lib/plutonium/ui/form/components/section.rb +58 -0
  33. data/lib/plutonium/ui/form/components/sticky_footer.rb +1 -1
  34. data/lib/plutonium/ui/form/resource.rb +85 -7
  35. data/lib/plutonium/ui/layout/base.rb +5 -0
  36. data/lib/plutonium/ui/layout/resource_layout.rb +22 -6
  37. data/lib/plutonium/ui/layout/topbar.rb +1 -1
  38. data/lib/plutonium/version.rb +1 -1
  39. data/package.json +1 -1
  40. data/src/css/components.css +9 -0
  41. data/src/css/slim_select.css +11 -2
  42. metadata +11 -2
@@ -0,0 +1,40 @@
1
+ {
2
+ "planPath": "docs/superpowers/plans/2026-06-14-form-sectioning.md",
3
+ "tasks": [
4
+ {
5
+ "id": 1,
6
+ "subject": "Task 1: FormLayout DSL module + registry",
7
+ "status": "completed",
8
+ "description": "Add form_layout/section/ungrouped DSL + ordered inheritable registry + validations; include in Definition::Base and Interaction::Base.\n\n```json:metadata\n{\"files\": [\"lib/plutonium/definition/form_layout.rb\", \"lib/plutonium/definition/base.rb\", \"lib/plutonium/interaction/base.rb\", \"test/plutonium/definition/form_layout_test.rb\", \"test/plutonium/interaction/form_layout_test.rb\"], \"verifyCommand\": \"bin/rails test test/plutonium/definition/form_layout_test.rb test/plutonium/interaction/form_layout_test.rb\", \"acceptanceCriteria\": [\"form_layout records sections in order\", \"section :ungrouped and duplicate ungrouped raise\", \"default label humanizes key\", \"subclasses inherit; redeclare replaces\", \"instance + interaction expose registry\"], \"requiresUserVerification\": false}\n```"
9
+ },
10
+ {
11
+ "id": 2,
12
+ "subject": "Task 2: Resolve field list into ordered sections",
13
+ "status": "completed",
14
+ "blockedBy": [1],
15
+ "description": "Add resolve_form_sections(resource_fields): assign fields (first-section-wins, order preserved), leftovers to ungrouped (default first / declared position), raise on unknown keys, keep empty sections.\n\n```json:metadata\n{\"files\": [\"lib/plutonium/definition/form_layout.rb\", \"test/plutonium/definition/form_layout_resolution_test.rb\"], \"verifyCommand\": \"bin/rails test test/plutonium/definition/form_layout_resolution_test.rb\", \"acceptanceCriteria\": [\"nil without layout\", \"fields assigned in order; leftovers to ungrouped\", \"ungrouped default-first / explicit-position\", \"unknown field raises\", \"empty sections kept (first-section-wins)\"], \"requiresUserVerification\": false}\n```"
16
+ },
17
+ {
18
+ "id": 3,
19
+ "subject": "Task 3: Section chrome component + columns helper",
20
+ "status": "completed",
21
+ "blockedBy": [1],
22
+ "description": "Add Components::Section (heading/description, native <details> collapsible, grid by columns), yields field rendering to the form.\n\n```json:metadata\n{\"files\": [\"lib/plutonium/ui/form/components/section.rb\", \"test/plutonium/ui/form/components/section_test.rb\"], \"verifyCommand\": \"bin/rails test test/plutonium/ui/form/components/section_test.rb\", \"acceptanceCriteria\": [\"heading + description render\", \"collapsible emits <details> with open/collapsed\", \"non-collapsible has no <details>\", \"grid_class applied and block content rendered\"], \"requiresUserVerification\": false}\n```"
23
+ },
24
+ {
25
+ "id": 4,
26
+ "subject": "Task 4: Render sections in resource forms + integration",
27
+ "status": "completed",
28
+ "blockedBy": [2, 3],
29
+ "description": "Form::Resource#render_fields groups via resolver + Section component, evaluates condition in form context, falls back to single grid. Register KitchenSink in admin + add form_layout to KitchenSinkDefinition; integration test.\n\n```json:metadata\n{\"files\": [\"lib/plutonium/ui/form/resource.rb\", \"test/dummy/app/definitions/kitchen_sink_definition.rb\", \"test/dummy/packages/admin_portal/config/routes.rb\", \"test/integration/admin_portal/form_layout_rendering_test.rb\"], \"verifyCommand\": \"bin/rails test test/integration/admin_portal/form_layout_rendering_test.rb test/integration/admin_portal\", \"acceptanceCriteria\": [\"sections + headings render and group fields\", \"collapsible emits <details>\", \"no layout -> single grid unchanged\", \"falsey condition hides section\"], \"requiresUserVerification\": false}\n```"
30
+ },
31
+ {
32
+ "id": 5,
33
+ "subject": "Task 5: Interaction forms render sections",
34
+ "status": "completed",
35
+ "blockedBy": [4],
36
+ "description": "Confirm interaction forms render form_layout sections (shared render_fields path). Add form_layout to a dummy interaction exercised by an org_portal test; assert grouped render.\n\n```json:metadata\n{\"files\": [\"test/integration/org_portal/form_layout_interaction_test.rb\"], \"verifyCommand\": \"bin/rails test test/integration/org_portal/form_layout_interaction_test.rb\", \"acceptanceCriteria\": [\"interaction form renders section headings\", \"interaction attribute input names unchanged\"], \"requiresUserVerification\": false}\n```"
37
+ }
38
+ ],
39
+ "lastUpdated": "2026-06-14T12:55:00Z"
40
+ }