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.
- checksums.yaml +4 -4
- data/.claude/skills/plutonium/SKILL.md +44 -0
- data/.claude/skills/plutonium-app/SKILL.md +3 -3
- data/.claude/skills/plutonium-async-interactions/SKILL.md +191 -0
- data/.claude/skills/plutonium-auth/SKILL.md +36 -0
- data/.claude/skills/plutonium-behavior/SKILL.md +121 -24
- data/.claude/skills/plutonium-kanban/SKILL.md +17 -3
- data/.claude/skills/plutonium-resource/SKILL.md +259 -12
- data/.claude/skills/plutonium-tenancy/SKILL.md +32 -3
- data/.claude/skills/plutonium-ui/SKILL.md +115 -14
- data/.claude/skills/plutonium-wizard/SKILL.md +73 -4
- data/.standard.yml +1 -1
- data/CHANGELOG.md +73 -0
- data/CLAUDE.md +87 -0
- data/Rakefile +34 -0
- data/SECURITY.md +1 -1
- data/app/assets/plutonium.css +1 -1
- data/app/assets/plutonium.js +685 -102
- data/app/assets/plutonium.js.map +4 -4
- data/app/assets/plutonium.min.js +53 -53
- data/app/assets/plutonium.min.js.map +4 -4
- data/app/views/rodauth/_login_form.html.erb +13 -0
- data/db/migrate/async_interactions/20260817000001_create_plutonium_async_runs.rb +170 -0
- data/docs/.vitepress/config.ts +81 -3
- data/docs/.vitepress/theme/blog.data.ts +44 -0
- data/docs/.vitepress/theme/components/BlogIndex.vue +87 -0
- data/docs/.vitepress/theme/components/BlogMeta.vue +47 -0
- data/docs/.vitepress/theme/components/HomeFeatureTour.vue +293 -0
- data/docs/.vitepress/theme/components/HomeHero.vue +3 -3
- data/docs/.vitepress/theme/components/HomeInTheBox.vue +8 -0
- data/docs/.vitepress/theme/components/HomeStopWriting.vue +1 -0
- data/docs/.vitepress/theme/components/HomeWhyPlutonium.vue +84 -0
- data/docs/.vitepress/theme/index.ts +8 -4
- data/docs/blog/association-inputs-post-signed-ids.md +70 -0
- data/docs/blog/fix-the-model-not-the-policy.md +122 -0
- data/docs/blog/fractional-ordering-runs-out-of-room.md +67 -0
- data/docs/blog/half-finished-forms-are-pii.md +76 -0
- data/docs/blog/index.md +13 -0
- data/docs/blog/interactions-are-presentation-objects.md +152 -0
- data/docs/blog/introducing-plutonium.md +253 -0
- data/docs/blog/jobs-are-not-permission-snapshots.md +100 -0
- data/docs/blog/plutonium-and-ai-agents.md +48 -0
- data/docs/blog/realtime-is-one-line-and-four-dependencies.md +70 -0
- data/docs/blog/two-forms-one-dom-id.md +69 -0
- data/docs/blog/whats-new-async-kanban-wizards.md +130 -0
- data/docs/getting-started/tutorial/04-authorization.md +12 -3
- data/docs/getting-started/tutorial/06-nested-resources.md +3 -1
- data/docs/getting-started/tutorial/07-author-portal.md +2 -2
- data/docs/guides/authentication.md +73 -0
- data/docs/guides/authorization.md +2 -0
- data/docs/guides/creating-packages.md +5 -3
- data/docs/guides/custom-actions.md +74 -12
- data/docs/guides/customizing-ui.md +9 -2
- data/docs/guides/index.md +1 -0
- data/docs/guides/kanban.md +7 -5
- data/docs/guides/nested-resources.md +11 -1
- data/docs/guides/performance.md +104 -0
- data/docs/guides/user-invites.md +1 -1
- data/docs/guides/wizards.md +9 -1
- data/docs/index.md +3 -3
- data/docs/public/images/home/tour-actions.png +0 -0
- data/docs/public/images/home/tour-async.png +0 -0
- data/docs/public/images/home/tour-kanban.png +0 -0
- data/docs/public/images/home/tour-tenancy.png +0 -0
- data/docs/public/images/home/tour-wizard.png +0 -0
- data/docs/public/images/reference/async-progress-page.png +0 -0
- data/docs/public/images/reference/async-running-banner.png +0 -0
- data/docs/public/templates/experimental.rb +34 -0
- data/docs/public/templates/pluton8.rb +14 -0
- data/docs/reference/app/portals.md +15 -3
- data/docs/reference/auth/accounts.md +19 -0
- data/docs/reference/behavior/async-interactions.md +295 -0
- data/docs/reference/behavior/controllers.md +17 -4
- data/docs/reference/behavior/index.md +7 -1
- data/docs/reference/behavior/interactions.md +152 -22
- data/docs/reference/configuration.md +5 -0
- data/docs/reference/index.md +1 -0
- data/docs/reference/kanban/dsl.md +7 -4
- data/docs/reference/kanban/index.md +1 -1
- data/docs/reference/kanban/positioning.md +26 -4
- data/docs/reference/positioning.md +568 -0
- data/docs/reference/resource/actions.md +97 -4
- data/docs/reference/resource/definition.md +181 -9
- data/docs/reference/tenancy/invites.md +1 -1
- data/docs/reference/tenancy/nested-resources.md +60 -2
- data/docs/reference/ui/assets.md +4 -0
- data/docs/reference/ui/components.md +57 -4
- data/docs/reference/ui/displays.md +20 -10
- data/docs/reference/ui/index.md +1 -1
- data/docs/reference/wizard/dsl.md +33 -0
- data/docs/reference/wizard/storage-config.md +1 -0
- data/docs/superpowers/plans/2026-07-16-homepage-depth-upgrade.md +624 -0
- data/docs/superpowers/plans/2026-07-16-homepage-depth-upgrade.md.tasks.json +32 -0
- data/docs/superpowers/plans/2026-07-31-positioned-drag-and-drop.md +1787 -0
- data/docs/superpowers/plans/2026-07-31-positioned-drag-and-drop.md.tasks.json +91 -0
- data/docs/superpowers/plans/2026-08-17-async-interactions.md +1414 -0
- data/docs/superpowers/plans/2026-08-17-async-interactions.md.tasks.json +66 -0
- data/docs/superpowers/specs/2026-07-16-homepage-depth-upgrade-design.md +111 -0
- data/docs/superpowers/specs/2026-07-17-action-html-attributes-design.md +124 -0
- data/docs/superpowers/specs/2026-07-31-positioned-drag-and-drop-design.md +506 -0
- data/docs/superpowers/specs/2026-08-17-async-interactions-design.md +185 -0
- data/gemfiles/postgres.gemfile.lock +85 -85
- data/gemfiles/rails_7.gemfile.lock +323 -141
- data/gemfiles/rails_8.0.gemfile.lock +126 -116
- data/gemfiles/rails_8.1.gemfile.lock +127 -117
- data/lib/generators/pu/async_interactions/install_generator.rb +111 -0
- data/lib/generators/pu/async_interactions/templates/app/controllers/async_runs_controller.rb.tt +15 -0
- data/lib/generators/pu/core/typespec/typespec_generator.rb +7 -4
- data/lib/generators/pu/invites/install_generator.rb +3 -3
- data/lib/generators/pu/invites/templates/packages/invites/app/views/layouts/invites/invitation.html.erb.tt +2 -2
- data/lib/generators/pu/lib/plutonium_generators/concerns/mounts_engines.rb +47 -2
- data/lib/generators/pu/lib/plutonium_generators/concerns/resource_registration.rb +41 -0
- data/lib/generators/pu/lite/litestream/litestream_generator.rb +1 -1
- data/lib/generators/pu/lite/solid_queue/solid_queue_generator.rb +1 -1
- data/lib/generators/pu/res/conn/conn_generator.rb +19 -39
- data/lib/generators/pu/res/conn/templates/app/controllers/resource_controller.rb.tt +4 -0
- data/lib/generators/pu/rodauth/templates/app/rodauth/account_rodauth_plugin.rb.tt +15 -6
- data/lib/generators/pu/rodauth/templates/app/rodauth/rodauth_plugin.rb.tt +7 -0
- data/lib/generators/pu/saas/welcome/templates/app/views/layouts/welcome.html.erb.tt +2 -2
- data/lib/generators/pu/wizards/install_generator.rb +78 -0
- data/lib/plutonium/action/base.rb +71 -9
- data/lib/plutonium/action/interactive.rb +9 -0
- data/lib/plutonium/attachments.rb +254 -0
- data/lib/plutonium/configuration.rb +82 -1
- data/lib/plutonium/core/controller.rb +50 -7
- data/lib/plutonium/core/controllers/authorizable.rb +16 -0
- data/lib/plutonium/core/controllers/entity_scoping.rb +12 -2
- data/lib/plutonium/definition/base.rb +51 -0
- data/lib/plutonium/definition/display_layout.rb +112 -0
- data/lib/plutonium/definition/index_views.rb +8 -7
- data/lib/plutonium/definition/input_aliases.rb +38 -0
- data/lib/plutonium/definition/page_widths.rb +65 -0
- data/lib/plutonium/definition/positioning.rb +126 -0
- data/lib/plutonium/definition/sorting.rb +17 -2
- data/lib/plutonium/helpers/turbo_helper.rb +7 -0
- data/lib/plutonium/interaction/README.md +61 -24
- data/lib/plutonium/interaction/async/configuration.rb +38 -0
- data/lib/plutonium/interaction/async/context.rb +419 -0
- data/lib/plutonium/interaction/async/executor.rb +422 -0
- data/lib/plutonium/interaction/async/job.rb +80 -0
- data/lib/plutonium/interaction/async/reap_job.rb +81 -0
- data/lib/plutonium/interaction/async/run.rb +394 -0
- data/lib/plutonium/interaction/async/run_definition.rb +155 -0
- data/lib/plutonium/interaction/async/run_policy.rb +86 -0
- data/lib/plutonium/interaction/base.rb +34 -7
- data/lib/plutonium/interaction/concerns/dispatchable.rb +518 -0
- data/lib/plutonium/interaction/concerns/scoping.rb +70 -9
- data/lib/plutonium/interaction/response/redirect.rb +11 -3
- data/lib/plutonium/kanban/board.rb +14 -0
- data/lib/plutonium/kanban/column.rb +4 -2
- data/lib/plutonium/kanban/dsl.rb +4 -1
- data/lib/plutonium/kanban/grouping.rb +9 -22
- data/lib/plutonium/kanban/positioning.rb +5 -65
- data/lib/plutonium/positioning/config.rb +94 -0
- data/lib/plutonium/positioning/model.rb +128 -0
- data/lib/plutonium/positioning.rb +25 -86
- data/lib/plutonium/railtie.rb +1 -0
- data/lib/plutonium/resource/controller.rb +118 -38
- data/lib/plutonium/resource/controllers/crud_actions/index_action.rb +32 -2
- data/lib/plutonium/resource/controllers/crud_actions.rb +30 -2
- data/lib/plutonium/resource/controllers/eager_loading.rb +87 -0
- data/lib/plutonium/resource/controllers/export_csv.rb +10 -1
- data/lib/plutonium/resource/controllers/kanban_actions.rb +53 -14
- data/lib/plutonium/resource/controllers/position_actions.rb +390 -0
- data/lib/plutonium/resource/controllers/presentable.rb +19 -13
- data/lib/plutonium/resource/controllers/queryable.rb +5 -1
- data/lib/plutonium/resource/controllers/wizard_actions.rb +21 -0
- data/lib/plutonium/resource/policy.rb +33 -0
- data/lib/plutonium/resource/query_object.rb +36 -0
- data/lib/plutonium/routing/mapper_extensions.rb +100 -8
- data/lib/plutonium/routing/route_set_extensions.rb +15 -1
- data/lib/plutonium/routing/wizard_registration.rb +4 -0
- data/lib/plutonium/testing/resource_policy.rb +6 -2
- data/lib/plutonium/ui/action_button.rb +12 -7
- data/lib/plutonium/ui/actions_dropdown.rb +1 -1
- data/lib/plutonium/ui/block.rb +21 -1
- data/lib/plutonium/ui/breadcrumbs.rb +187 -55
- data/lib/plutonium/ui/component/methods.rb +5 -0
- data/lib/plutonium/ui/component/positionable.rb +112 -0
- data/lib/plutonium/ui/component/resolves_tags.rb +57 -0
- data/lib/plutonium/ui/component/section.rb +185 -0
- data/lib/plutonium/ui/display/base.rb +13 -1
- data/lib/plutonium/ui/display/components/formatted_value.rb +26 -0
- data/lib/plutonium/ui/display/components/section.rb +18 -0
- data/lib/plutonium/ui/display/resource.rb +141 -22
- data/lib/plutonium/ui/display/theme.rb +20 -1
- data/lib/plutonium/ui/export_button.rb +1 -1
- data/lib/plutonium/ui/form/base.rb +8 -7
- data/lib/plutonium/ui/form/components/intl_tel_input.rb +1 -1
- data/lib/plutonium/ui/form/components/section.rb +7 -62
- data/lib/plutonium/ui/form/components/uppy.rb +12 -1
- data/lib/plutonium/ui/form/concerns/renders_nested_resource_fields.rb +16 -3
- data/lib/plutonium/ui/form/concerns/renders_structured_inputs.rb +5 -1
- data/lib/plutonium/ui/form/query.rb +2 -4
- data/lib/plutonium/ui/form/resource.rb +92 -15
- data/lib/plutonium/ui/form/theme.rb +17 -0
- data/lib/plutonium/ui/form/wizard.rb +25 -1
- data/lib/plutonium/ui/grid/card.rb +79 -11
- data/lib/plutonium/ui/grid/resource.rb +47 -5
- data/lib/plutonium/ui/interaction/async/run_progress.rb +227 -0
- data/lib/plutonium/ui/interaction/async/running_banner.rb +65 -0
- data/lib/plutonium/ui/kanban/card.rb +2 -1
- data/lib/plutonium/ui/kanban/column.rb +12 -6
- data/lib/plutonium/ui/kanban/resource.rb +6 -7
- data/lib/plutonium/ui/layout/base.rb +10 -3
- data/lib/plutonium/ui/nav_grid_menu.rb +1 -0
- data/lib/plutonium/ui/page/base.rb +19 -0
- data/lib/plutonium/ui/page/edit.rb +4 -1
- data/lib/plutonium/ui/page/index.rb +69 -18
- data/lib/plutonium/ui/page/interactive_action.rb +5 -1
- data/lib/plutonium/ui/page/new.rb +4 -1
- data/lib/plutonium/ui/page/show.rb +27 -10
- data/lib/plutonium/ui/page/wizard.rb +10 -1
- data/lib/plutonium/ui/page/wizard_chooser.rb +36 -11
- data/lib/plutonium/ui/page_width.rb +58 -0
- data/lib/plutonium/ui/table/base.rb +34 -1
- data/lib/plutonium/ui/table/components/attachment.rb +1 -1
- data/lib/plutonium/ui/table/components/bulk_actions_toolbar.rb +32 -8
- data/lib/plutonium/ui/table/components/drag_handle.rb +120 -0
- data/lib/plutonium/ui/table/components/filter_form.rb +1 -4
- data/lib/plutonium/ui/table/components/filter_pills.rb +1 -1
- data/lib/plutonium/ui/table/components/row_actions_dropdown.rb +1 -1
- data/lib/plutonium/ui/table/resource.rb +50 -5
- data/lib/plutonium/ui/table/theme.rb +59 -2
- data/lib/plutonium/ui/wizard/review.rb +4 -2
- data/lib/plutonium/ui/wizard/summary_display.rb +42 -14
- data/lib/plutonium/version.rb +1 -1
- data/lib/plutonium/wizard/attachments.rb +32 -197
- data/lib/plutonium/wizard/base.rb +6 -1
- data/lib/plutonium/wizard/configuration.rb +12 -0
- data/lib/plutonium/wizard/controller.rb +14 -0
- data/lib/plutonium/wizard/driving.rb +99 -15
- data/lib/plutonium/wizard/dsl.rb +23 -0
- data/lib/plutonium/wizard/resume.rb +127 -49
- data/lib/plutonium/wizard/runner.rb +46 -2
- data/lib/plutonium/wizard/step_adapter.rb +1 -1
- data/lib/plutonium/wizard/sweep_job.rb +16 -0
- data/lib/plutonium.rb +21 -0
- data/lib/rodauth/features/session_isolation.rb +92 -0
- data/lib/rodauth/plugins.rb +1 -0
- data/package.json +2 -1
- data/plutonium.gemspec +20 -20
- data/src/css/components.css +89 -1
- data/src/css/slim_select.css +20 -0
- data/src/js/controllers/breadcrumbs_controller.js +112 -0
- data/src/js/controllers/bulk_actions_controller.js +10 -2
- data/src/js/controllers/kanban_controller.js +30 -21
- data/src/js/controllers/positioned_controller.js +452 -0
- data/src/js/controllers/register_controllers.js +6 -0
- data/src/js/controllers/resource_drop_down_controller.js +5 -0
- data/src/js/controllers/run_progress_controller.js +73 -0
- data/src/js/drag/sortable.js +186 -0
- data/yarn.lock +108 -63
- metadata +101 -22
- data/docs/.vitepress/theme/components/HomeAudienceSplit.vue +0 -53
- 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.
|
|
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-
|
|
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:
|
|
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:
|
|
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/
|
|
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.
|
|
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 & 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>
|