stream_weaver 0.3.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 +7 -0
- data/.beads/.gitignore +77 -0
- data/.beads/README.md +81 -0
- data/.beads/config.yaml +54 -0
- data/.beads/metadata.json +7 -0
- data/.rspec +3 -0
- data/AGENTS.md +91 -0
- data/CHANGELOG.md +294 -0
- data/CLAUDE.md +67 -0
- data/LICENSE.txt +21 -0
- data/README.md +565 -0
- data/Rakefile +13 -0
- data/assets/streamweaver-hero.jpg +0 -0
- data/bench/baselines/ledger.rb +58 -0
- data/bench/baselines/warroom.rb +51 -0
- data/bench/fixtures/ledger.rb +76 -0
- data/bench/fixtures/warroom.rb +60 -0
- data/bench/results/6daf8b8.md +102 -0
- data/bench/results/c8d749b.md +102 -0
- data/bench/results/eb06ab9.md +102 -0
- data/bench/run.rb +151 -0
- data/bench/support.rb +84 -0
- data/copy_this/dto_run_sample_run_7631.html +220 -0
- data/docs/SERVICE_MODE.md +302 -0
- data/docs/architecture/how_streamweaver_works.md +772 -0
- data/docs/blog/2026-01-16-streamweaver-introduction.md +515 -0
- data/docs/bug-2026-08-31-canvas-bridge-socket-collision.md +83 -0
- data/docs/canvas-ipc-session-summary.md +127 -0
- data/docs/canvas-panel-workflow.md +172 -0
- data/docs/canvas-read.md +147 -0
- data/docs/canvas-roadmap.md +275 -0
- data/docs/case-studies/2026-09-03-didx-canvas-read-shelf.md +147 -0
- data/docs/claude-code-companion-skill-spec.md +567 -0
- data/docs/components_reference.md +1223 -0
- data/docs/crud-patterns.md +265 -0
- data/docs/endpoints.md +122 -0
- data/docs/for_llms.md +1 -0
- data/docs/form-patterns.md +165 -0
- data/docs/frontend-only.md +169 -0
- data/docs/html-artifact-audit.md +238 -0
- data/docs/ideas/2025-01-01-as-a-service.md +203 -0
- data/docs/ideas/2026-01-16-charm-tui-exploration.md +542 -0
- data/docs/ideas/2026-08-27-static-doc-shelf-export.md +153 -0
- data/docs/ideas/dhh-review-future-refactors.md +142 -0
- data/docs/opal-jamstack.md +47 -0
- data/docs/opal-npm-direction.md +184 -0
- data/docs/opal-spike-findings.md +194 -0
- data/docs/plans/2025-12-16-form-blocks-design.md +124 -0
- data/docs/plans/2025-12-30-examples-browser-design.md +152 -0
- data/docs/plans/2026-01-02-charts-design.md +288 -0
- data/docs/plans/2026-01-10-canvas-ipc-design.md +247 -0
- data/docs/plans/2026-01-19-cabinet-control-components.md +176 -0
- data/docs/plans/2026-01-26-gem-release-and-panel.md +140 -0
- data/docs/plans/canvas-claude-project-design.md +238 -0
- data/docs/plans/canvas-doc-location-and-discovery.md +32 -0
- data/docs/plans/org-doc-preview-surfaces.md +293 -0
- data/docs/plans/shadcn-polish-plan.md +417 -0
- data/docs/porting-artifacts.md +252 -0
- data/docs/reference/agent-skills-comparison.md +369 -0
- data/docs/reference/travel-state-prd.artifact.html +780 -0
- data/docs/research/2026-08-17-hotwire-alike-landscape.md +268 -0
- data/docs/research/2026-08-17-hotwire-concept-map.md +404 -0
- data/docs/research/2026-08-22-lazy-fragments-trigger-decision.md +246 -0
- data/docs/research/2026-08-22-learnhotwire-syllabus-coverage.md +239 -0
- data/docs/research/frontend-only-matrix.md +278 -0
- data/docs/research/streamweaver-way-spike-findings.md +529 -0
- data/docs/resource-dsl.md +342 -0
- data/docs/routing.md +302 -0
- data/docs/ruby-ui-comparison.md +319 -0
- data/docs/shared-dsl-fragments.md +356 -0
- data/docs/streamweaver-for-ai-agents.md +401 -0
- data/docs/streamweaver-frontend-vision.md +123 -0
- data/docs/streamweaver_canvas/glimmer_initial_final_layer.rb +77 -0
- data/docs/streamweaver_canvas/save_example.rb +9 -0
- data/docs/templates.md +213 -0
- data/docs/testing.md +155 -0
- data/docs/theming-hooks.md +281 -0
- data/docs/tutorials/the-streamweaver-way.md +882 -0
- data/docs/university/capability-inventory.md +137 -0
- data/docs/university/dependency-survey.md +114 -0
- data/docs/university/design-spec.md +217 -0
- data/docs/university/mockups/code-block-doc-theme-dark.png +0 -0
- data/docs/university/mockups/code-block-doc-theme-light.png +0 -0
- data/docs/university/mockups/course-list-dark.png +0 -0
- data/docs/university/mockups/course-list-light.png +0 -0
- data/docs/university/mockups/course_canvas_mockup.rb +741 -0
- data/docs/university/mockups/step-screen-dark.png +0 -0
- data/docs/university/mockups/step-screen-light.png +0 -0
- data/docs/university/roadmap.md +72 -0
- data/docs/university/send-to-coworker.md +77 -0
- data/docs/university/worker-session-mining.md +109 -0
- data/docs/visual/browser-rendering-spike.md +173 -0
- data/docs/visual/builder-visual-plan-analysis.md +378 -0
- data/docs/visual/sw-plan-format-exploration.md +511 -0
- data/docs/visual/sw-plan-rendering-deep-dive.md +453 -0
- data/docs/visual-skills/PROGRESS.md +60 -0
- data/docs/visual-skills/SESSION-CONTEXT.md +207 -0
- data/docs/visual-skills/analysis/components.md +317 -0
- data/docs/visual-skills/analysis/overlap.md +360 -0
- data/docs/visual-skills/analysis/pi-design-deck.md +1102 -0
- data/docs/visual-skills/analysis/streamweaver-inventory.md +93 -0
- data/docs/visual-skills/analysis/unified-specs.feature +1003 -0
- data/docs/visual-skills/analysis/visual-explainer.md +964 -0
- data/docs/visual-skills/blog/blog-series-outline.md +39 -0
- data/docs/visual-skills/blog/token-efficiency.md +73 -0
- data/docs/visual-skills/design/architecture.md +1725 -0
- data/docs/visual-skills/design/codex-review.md +340 -0
- data/docs/visual-skills/design/dhh-review.md +209 -0
- data/docs/visual-skills/design/evolution.md +100 -0
- data/docs/visual-skills/design/gemini-review.md +55 -0
- data/docs/visual-skills/design/review-synthesis.md +149 -0
- data/docs/visual-skills/implementation/STATE.md +22 -0
- data/docs/visual-skills/implementation/plan.md +347 -0
- data/docs/visual-skills/implementation/spike-findings.md +237 -0
- data/docs/visual-skills/implementation/tasks.md +702 -0
- data/docs/visual-skills/lessons-learned/process.md +145 -0
- data/examples/README.md +96 -0
- data/examples/advanced/all_components.rb +177 -0
- data/examples/advanced/examples_browser.rb +394 -0
- data/examples/advanced/teachables_browser.rb +261 -0
- data/examples/advanced/theme_tweaker.rb +366 -0
- data/examples/advanced/tutorial.rb +1528 -0
- data/examples/agentic/agentic_form.rb +30 -0
- data/examples/agentic/agentic_form_autoclose.rb +30 -0
- data/examples/agentic/cultivation_tracker.rb +69 -0
- data/examples/basic/hello_world.rb +22 -0
- data/examples/basic/opal_tabs_table.rb +44 -0
- data/examples/basic/todo_list.rb +39 -0
- data/examples/button_loading_test.rb +36 -0
- data/examples/canvas/mermaid_canvas_demo.sh +151 -0
- data/examples/charts/bar_chart_demo.rb +57 -0
- data/examples/charts/line_chart_demo.rb +73 -0
- data/examples/charts/pie_area_demo.rb +87 -0
- data/examples/charts/stacked_bar_chart_demo.rb +69 -0
- data/examples/claude_code/README.md +85 -0
- data/examples/claude_code/codebreaker/.claude/commands/infiltrate.md +632 -0
- data/examples/claude_code/codebreaker/.claude/settings.json +11 -0
- data/examples/claude_code/codebreaker/.claude/settings.local.json +17 -0
- data/examples/claude_code/codebreaker/.claude/skills/infiltrate.md +0 -0
- data/examples/claude_code/codebreaker/README.md +213 -0
- data/examples/claude_code/tutorial/.claude/commands/learn.md +453 -0
- data/examples/claude_code/tutorial/README.md +102 -0
- data/examples/claude_code/verification_flow/.claude/commands/verify.md +171 -0
- data/examples/claude_code/verification_flow/README.md +126 -0
- data/examples/components/annotated_code_demo.rb +54 -0
- data/examples/components/callout_demo.rb +33 -0
- data/examples/components/checkbox_group_demo.rb +46 -0
- data/examples/components/design_review.css +468 -0
- data/examples/components/design_review_demo.rb +44 -0
- data/examples/components/design_review_dsl.rb +300 -0
- data/examples/components/diff_block_demo.rb +112 -0
- data/examples/components/events_demo.rb +184 -0
- data/examples/components/form_demo.rb +62 -0
- data/examples/components/lesson_demo.rb +53 -0
- data/examples/components/markdown_demo.rb +110 -0
- data/examples/components/mermaid_demo.rb +166 -0
- data/examples/components/pareto_set.rb +64 -0
- data/examples/components/prd_demo.rb +21 -0
- data/examples/components/prd_dsl.rb +385 -0
- data/examples/components/quiz_demo.rb +47 -0
- data/examples/components/run_viewer_demo.rb +100 -0
- data/examples/components/score_and_collapsible_demo.rb +82 -0
- data/examples/components/select_stale_value_smoke_test.rb +39 -0
- data/examples/components/table_demo.rb +247 -0
- data/examples/components/timer_with_state_demo.rb +58 -0
- data/examples/components/todo_due_dates.rb +63 -0
- data/examples/components/uat_gaps_demo.rb +112 -0
- data/examples/dashboard/feed_simulator.rb +60 -0
- data/examples/dashboard/live_dashboard.rb +80 -0
- data/examples/dashboard_components.rb +108 -0
- data/examples/deferred_fragments_demo.rb +62 -0
- data/examples/generate_more_spike/README.md +63 -0
- data/examples/generate_more_spike/app.rb +441 -0
- data/examples/git_health.sh +401 -0
- data/examples/layout/layout_components_demo.rb +174 -0
- data/examples/layout/modal_demo.rb +215 -0
- data/examples/layout/navigation_demo.rb +227 -0
- data/examples/layout/route_tabs_demo.rb +52 -0
- data/examples/layout/routing_demo.rb +52 -0
- data/examples/layout/scroll_box_demo.rb +154 -0
- data/examples/lazy_fragments_demo.rb +151 -0
- data/examples/my_todos/README.md +29 -0
- data/examples/my_todos/my_todos.rb +312 -0
- data/examples/my_todos/store.rb +86 -0
- data/examples/opal/reactive_demo.rb +62 -0
- data/examples/opal/scenarios/s1_counter.rb +15 -0
- data/examples/opal/scenarios/s2_search_filter.rb +17 -0
- data/examples/opal/scenarios/s3_sibling_tabs.rb +25 -0
- data/examples/opal/scenarios/s4_shopping_cart.rb +34 -0
- data/examples/opal/scenarios/s5_watch.rb +39 -0
- data/examples/opal/scenarios/s6_on_start.rb +20 -0
- data/examples/opal/scenarios/s7_wizard.rb +33 -0
- data/examples/opal/scenarios/s8_loan_calculator.rb +21 -0
- data/examples/opal/scenarios/s9_dashboard.rb +27 -0
- data/examples/operations_dashboard_demo.rb +167 -0
- data/examples/panel_demo.sh +447 -0
- data/examples/parity/assets/tyrion_slice.css +86 -0
- data/examples/parity/rivet_people_slice.rb +182 -0
- data/examples/parity/tyrion_components.css +777 -0
- data/examples/parity/tyrion_warroom_components.rb +414 -0
- data/examples/parity/tyrion_warroom_slice.rb +549 -0
- data/examples/puma_dev/README.md +124 -0
- data/examples/puma_dev/config.ru +34 -0
- data/examples/puma_dev/standalone_app.rb +34 -0
- data/examples/scaffolding/blog.rb +49 -0
- data/examples/scaffolding/utf_lite.rb +105 -0
- data/examples/styling/feedback_demo.rb +229 -0
- data/examples/styling/style_showcase.rb +172 -0
- data/examples/styling/theme_demo.rb +508 -0
- data/examples/timer_health_checker.rb +111 -0
- data/examples/timer_showcase.rb +131 -0
- data/examples/tutorials/render_markdown.rb +112 -0
- data/examples/tutorials/streamweaver_way_tutorial.rb +44 -0
- data/examples/tutorials/tutorial_content.rb +1082 -0
- data/examples/visual_skills/design_deck_demo.rb +314 -0
- data/examples/visual_skills/explainer_demo.rb +499 -0
- data/exe/streamweaver +9 -0
- data/gsd/ROADMAP-1.0.md +167 -0
- data/gsd/STATE.md +13 -0
- data/gsd/research/market-positioning-research.md +139 -0
- data/gsd/research/production-patterns-research.md +270 -0
- data/gsd/research/repo-audit-1.0.md +274 -0
- data/lib/stream_weaver/action_token.rb +58 -0
- data/lib/stream_weaver/adapter/alpinejs.rb +8249 -0
- data/lib/stream_weaver/adapter/base.rb +591 -0
- data/lib/stream_weaver/adapter/opal.rb +334 -0
- data/lib/stream_weaver/adapter/static.rb +1118 -0
- data/lib/stream_weaver/admin.rb +176 -0
- data/lib/stream_weaver/app.rb +1821 -0
- data/lib/stream_weaver/assets/js/sw-copy.js +50 -0
- data/lib/stream_weaver/assets/js/sw-heredoc-rewrite.js +68 -0
- data/lib/stream_weaver/assets/js/sw-keyboard.js +165 -0
- data/lib/stream_weaver/assets/js/sw-mermaid-zoom.js +621 -0
- data/lib/stream_weaver/assets/js/sw-route-tabs.js +53 -0
- data/lib/stream_weaver/assets/js/sw-sidebar-toc.js +116 -0
- data/lib/stream_weaver/assets/js/sw-slide-nav.js +103 -0
- data/lib/stream_weaver/canvas/bridge.rb +239 -0
- data/lib/stream_weaver/canvas/bridge_server.rb +646 -0
- data/lib/stream_weaver/canvas/client.rb +298 -0
- data/lib/stream_weaver/canvas/doc_roots.rb +233 -0
- data/lib/stream_weaver/canvas/doc_store.rb +252 -0
- data/lib/stream_weaver/canvas/gist_publisher.rb +264 -0
- data/lib/stream_weaver/canvas/gist_save_handler.rb +89 -0
- data/lib/stream_weaver/canvas/gist_store.rb +135 -0
- data/lib/stream_weaver/canvas/helpers.rb +109 -0
- data/lib/stream_weaver/canvas/history.rb +90 -0
- data/lib/stream_weaver/canvas/protocol.rb +86 -0
- data/lib/stream_weaver/canvas/reader.rb +853 -0
- data/lib/stream_weaver/canvas/save_doc_widget.rb +457 -0
- data/lib/stream_weaver/canvas/scroll_top_hint.rb +21 -0
- data/lib/stream_weaver/canvas/session.rb +132 -0
- data/lib/stream_weaver/cli.rb +3235 -0
- data/lib/stream_weaver/component_assets.rb +70 -0
- data/lib/stream_weaver/component_registry.rb +67 -0
- data/lib/stream_weaver/component_renderer.rb +48 -0
- data/lib/stream_weaver/components/annotated_code.rb +53 -0
- data/lib/stream_weaver/components/api_endpoint.rb +42 -0
- data/lib/stream_weaver/components/callout.rb +59 -0
- data/lib/stream_weaver/components/chart.rb +84 -0
- data/lib/stream_weaver/components/code_block.rb +77 -0
- data/lib/stream_weaver/components/comparison.rb +39 -0
- data/lib/stream_weaver/components/decision.rb +38 -0
- data/lib/stream_weaver/components/deck/close_overlay.rb +84 -0
- data/lib/stream_weaver/components/deck/confirmation_bar.rb +60 -0
- data/lib/stream_weaver/components/deck/deck_option.rb +61 -0
- data/lib/stream_weaver/components/deck/deck_slide.rb +77 -0
- data/lib/stream_weaver/components/deck/deck_state.rb +469 -0
- data/lib/stream_weaver/components/deck/deck_summary.rb +73 -0
- data/lib/stream_weaver/components/deck/design_deck.rb +60 -0
- data/lib/stream_weaver/components/deck/generate_more_controls.rb +84 -0
- data/lib/stream_weaver/components/deck/model_selector.rb +84 -0
- data/lib/stream_weaver/components/deck/skeleton_placeholder.rb +36 -0
- data/lib/stream_weaver/components/diff_block.rb +125 -0
- data/lib/stream_weaver/components/doc_header.rb +57 -0
- data/lib/stream_weaver/components/image_block.rb +70 -0
- data/lib/stream_weaver/components/implementation_map.rb +33 -0
- data/lib/stream_weaver/components/keyboard_shortcuts.rb +94 -0
- data/lib/stream_weaver/components/kpi_dashboard.rb +78 -0
- data/lib/stream_weaver/components/mermaid.rb +79 -0
- data/lib/stream_weaver/components/pipeline.rb +63 -0
- data/lib/stream_weaver/components/sidebar_toc.rb +46 -0
- data/lib/stream_weaver/components/slide_container.rb +141 -0
- data/lib/stream_weaver/components/timeline_event.rb +58 -0
- data/lib/stream_weaver/components/wireframe.rb +29 -0
- data/lib/stream_weaver/components/wireframe_block.rb +34 -0
- data/lib/stream_weaver/components.rb +2711 -0
- data/lib/stream_weaver/css.rb +230 -0
- data/lib/stream_weaver/dev_fallback_overlay.rb +61 -0
- data/lib/stream_weaver/display_dsl.rb +1004 -0
- data/lib/stream_weaver/export/html_exporter.rb +478 -0
- data/lib/stream_weaver/feed.rb +34 -0
- data/lib/stream_weaver/feed_builder.rb +31 -0
- data/lib/stream_weaver/fonts.rb +33 -0
- data/lib/stream_weaver/interaction_runner.rb +487 -0
- data/lib/stream_weaver/iterm.rb +460 -0
- data/lib/stream_weaver/layout_registry.rb +92 -0
- data/lib/stream_weaver/opal/bridge.rb +52 -0
- data/lib/stream_weaver/opal/builder.rb +193 -0
- data/lib/stream_weaver/opal/env.rb +29 -0
- data/lib/stream_weaver/opal/reactive_state.rb +75 -0
- data/lib/stream_weaver/opal/regexp_anchor_patch.rb +62 -0
- data/lib/stream_weaver/opal/renderer.rb +77 -0
- data/lib/stream_weaver/opal/runtime.rb +250 -0
- data/lib/stream_weaver/opal/shell.rb +145 -0
- data/lib/stream_weaver/opal/string_bridge.rb +50 -0
- data/lib/stream_weaver/opal/stubs/diff.min.js +1 -0
- data/lib/stream_weaver/opal/stubs/digest.rb +15 -0
- data/lib/stream_weaver/opal/stubs/marked.umd.js +79 -0
- data/lib/stream_weaver/opal/stubs/md5.rb +3 -0
- data/lib/stream_weaver/opal/stubs/morphdom.min.js +775 -0
- data/lib/stream_weaver/opal/stubs/prism-tomorrow.min.css +1 -0
- data/lib/stream_weaver/opal/stubs/prism.min.js +1967 -0
- data/lib/stream_weaver/opal_entry.rb +136 -0
- data/lib/stream_weaver/org/inline.rb +95 -0
- data/lib/stream_weaver/org/reader.rb +561 -0
- data/lib/stream_weaver/org/recording_context.rb +86 -0
- data/lib/stream_weaver/org/source_splitter.rb +63 -0
- data/lib/stream_weaver/org/writer.rb +300 -0
- data/lib/stream_weaver/page_shell.rb +530 -0
- data/lib/stream_weaver/portfile.rb +79 -0
- data/lib/stream_weaver/pushable.rb +42 -0
- data/lib/stream_weaver/resource/default_views.rb +111 -0
- data/lib/stream_weaver/resource/field_input.rb +25 -0
- data/lib/stream_weaver/resource/state_keys.rb +16 -0
- data/lib/stream_weaver/resource/store.rb +18 -0
- data/lib/stream_weaver/resource.rb +104 -0
- data/lib/stream_weaver/server.rb +1471 -0
- data/lib/stream_weaver/service.rb +1240 -0
- data/lib/stream_weaver/service_client.rb +104 -0
- data/lib/stream_weaver/session_store.rb +186 -0
- data/lib/stream_weaver/skills/streamweaver-canvas-safe/SKILL.md +66 -0
- data/lib/stream_weaver/skills/streamweaver-canvas-safe/examples/canvas-safe-showcase.rb +98 -0
- data/lib/stream_weaver/skills/streamweaver-canvas-safe/references/actions-and-buttons.md +47 -0
- data/lib/stream_weaver/skills/streamweaver-canvas-safe/references/charts-and-diagrams.md +38 -0
- data/lib/stream_weaver/skills/streamweaver-canvas-safe/references/deck.md +32 -0
- data/lib/stream_weaver/skills/streamweaver-canvas-safe/references/inputs-and-forms.md +65 -0
- data/lib/stream_weaver/skills/streamweaver-canvas-safe/references/tabs-and-navigation.md +53 -0
- data/lib/stream_weaver/skills/streamweaver-doc-builder/SKILL.md +298 -0
- data/lib/stream_weaver/skills/streamweaver-visual-companion/SKILL.md +130 -0
- data/lib/stream_weaver/skills/streamweaver-visual-companion/examples/design-review-example.css +468 -0
- data/lib/stream_weaver/skills/streamweaver-visual-companion/examples/design-review-example.rb +39 -0
- data/lib/stream_weaver/skills/streamweaver-visual-companion/examples/design-review-example_dsl.rb +300 -0
- data/lib/stream_weaver/skills/streamweaver-visual-companion/examples/doc-parity-example.rb +24 -0
- data/lib/stream_weaver/skills/streamweaver-visual-companion/examples/doc-parity-example_dsl.rb +385 -0
- data/lib/stream_weaver/skills/streamweaver-visual-companion/references/checkpoints-and-forms.md +28 -0
- data/lib/stream_weaver/skills/streamweaver-visual-companion/references/cleanup-and-panel.md +44 -0
- data/lib/stream_weaver/skills/streamweaver-visual-companion/references/example-gallery.md +8 -0
- data/lib/stream_weaver/skills/streamweaver-visual-companion/references/persistence.md +58 -0
- data/lib/stream_weaver/skills/streamweaver-way/SKILL.md +396 -0
- data/lib/stream_weaver/skills/visual-plan/SKILL.md +201 -0
- data/lib/stream_weaver/skills/visual-recap/SKILL.md +244 -0
- data/lib/stream_weaver/streamer.rb +63 -0
- data/lib/stream_weaver/templates/choices.rb +149 -0
- data/lib/stream_weaver/templates/code.rb +157 -0
- data/lib/stream_weaver/templates/confirm.rb +110 -0
- data/lib/stream_weaver/templates/diff.rb +195 -0
- data/lib/stream_weaver/templates/info.rb +142 -0
- data/lib/stream_weaver/templates/table.rb +169 -0
- data/lib/stream_weaver/templates/wizard.rb +271 -0
- data/lib/stream_weaver/theme/auto_mode.rb +116 -0
- data/lib/stream_weaver/theme/presets.rb +555 -0
- data/lib/stream_weaver/theme.rb +639 -0
- data/lib/stream_weaver/university/canvas.rb +924 -0
- data/lib/stream_weaver/university/course.rb +699 -0
- data/lib/stream_weaver/university/demos/counter.rb +33 -0
- data/lib/stream_weaver/university/demos/dashboard.rb +147 -0
- data/lib/stream_weaver/university/demos/decision_form.rb +143 -0
- data/lib/stream_weaver/university/demos.rb +50 -0
- data/lib/stream_weaver/university/listener.rb +467 -0
- data/lib/stream_weaver/university/progress.rb +201 -0
- data/lib/stream_weaver/university/runner.rb +138 -0
- data/lib/stream_weaver/university/scripts/growing_doc.rb +609 -0
- data/lib/stream_weaver/university/scripts/growing_doc_state.rb +91 -0
- data/lib/stream_weaver/utils.rb +31 -0
- data/lib/stream_weaver/version.rb +5 -0
- data/lib/stream_weaver/views/canvas/reader_layout.erb +800 -0
- data/lib/stream_weaver/views.rb +3940 -0
- data/lib/stream_weaver.rb +122 -0
- data/llms.txt +1269 -0
- data/sig/stream_weaver.rbs +4 -0
- metadata +598 -0
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Demo: Multi-step workflow showing StreamWeaver's "wow factor"
|
|
3
|
+
#
|
|
4
|
+
# This demonstrates a 4-step code analysis workflow:
|
|
5
|
+
# 1. Issue Selection - Cards, checkboxes, radio groups
|
|
6
|
+
# 2. Diff Preview - Side-by-side code with syntax highlighting
|
|
7
|
+
# 3. Progress - Animated progress bars, pulsing status dots
|
|
8
|
+
# 4. Results Summary - Charts, stats, sortable tables
|
|
9
|
+
#
|
|
10
|
+
# TUI Comparison:
|
|
11
|
+
# - TUI can't do: syntax highlighting, side-by-side columns, animated progress,
|
|
12
|
+
# pulsing indicators, charts, clickable links, expandable cards
|
|
13
|
+
# - StreamWeaver makes all of this trivial
|
|
14
|
+
|
|
15
|
+
set -e
|
|
16
|
+
|
|
17
|
+
SESSION="panel-demo-$$"
|
|
18
|
+
|
|
19
|
+
echo "=== StreamWeaver Panel Demo: Multi-Step Workflow ==="
|
|
20
|
+
echo ""
|
|
21
|
+
echo "This demo showcases visual capabilities impossible in TUI:"
|
|
22
|
+
echo " - Syntax-highlighted code diffs"
|
|
23
|
+
echo " - Animated progress indicators"
|
|
24
|
+
echo " - Interactive charts and tables"
|
|
25
|
+
echo " - Collapsible sections and status dots"
|
|
26
|
+
echo ""
|
|
27
|
+
|
|
28
|
+
# Start the panel
|
|
29
|
+
echo "Starting panel..."
|
|
30
|
+
streamweaver panel "$SESSION" 2>/dev/null
|
|
31
|
+
|
|
32
|
+
sleep 1
|
|
33
|
+
|
|
34
|
+
# ============================================================================
|
|
35
|
+
# STEP 1: Issue Selection
|
|
36
|
+
# ============================================================================
|
|
37
|
+
step1_selection() {
|
|
38
|
+
echo ""
|
|
39
|
+
echo "Step 1: Issue Selection"
|
|
40
|
+
echo " Features: cards, badges, checkboxes, radio_group, columns, hstack"
|
|
41
|
+
echo ""
|
|
42
|
+
streamweaver canvas-push "$SESSION" <<'RUBY'
|
|
43
|
+
header1 "Code Quality Analysis"
|
|
44
|
+
md "Found **7 issues** across 4 files. Select which issues to address:"
|
|
45
|
+
|
|
46
|
+
# Critical issues - grouped in a card
|
|
47
|
+
card do
|
|
48
|
+
hstack spacing: :sm, align: :center do
|
|
49
|
+
badge "2", variant: :danger
|
|
50
|
+
header3 "Critical Issues"
|
|
51
|
+
end
|
|
52
|
+
checkbox :issue_n1, "**N+1 Query** in `app/models/user.rb:47` - 23 extra DB calls per request"
|
|
53
|
+
checkbox :issue_sql, "**SQL Injection Risk** in `app/controllers/search_controller.rb:23`"
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
card do
|
|
57
|
+
hstack spacing: :sm, align: :center do
|
|
58
|
+
badge "3", variant: :warning
|
|
59
|
+
header3 "Warnings"
|
|
60
|
+
end
|
|
61
|
+
checkbox :issue_unused, "**Unused Variable** `temp_data` in `lib/processor.rb:156`"
|
|
62
|
+
checkbox :issue_long, "**Long Method** `calculate_totals` (87 lines) in `app/services/billing.rb:34`"
|
|
63
|
+
checkbox :issue_index, "**Missing Index** on `orders.user_id` - queries may be slow"
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
card do
|
|
67
|
+
hstack spacing: :sm, align: :center do
|
|
68
|
+
badge "2", variant: :info
|
|
69
|
+
header3 "Suggestions"
|
|
70
|
+
end
|
|
71
|
+
checkbox :issue_deprecated, "**Deprecated Method** - use ActiveRecord query interface"
|
|
72
|
+
checkbox :issue_magic, "**Magic Number** `86400` should be `1.day.to_i`"
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
md "---"
|
|
76
|
+
|
|
77
|
+
# Fix options in two columns
|
|
78
|
+
header3 "Fix Options"
|
|
79
|
+
columns widths: ['50%', '50%'] do
|
|
80
|
+
column do
|
|
81
|
+
radio_group :approach, ["Fix in place", "Create separate PR per issue", "Generate TODO comments only"]
|
|
82
|
+
end
|
|
83
|
+
column do
|
|
84
|
+
checkbox :run_tests, "Run tests after each fix"
|
|
85
|
+
checkbox :auto_commit, "Auto-commit each fix"
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
md "---"
|
|
90
|
+
|
|
91
|
+
hstack spacing: :md do
|
|
92
|
+
button "Cancel", id: "btn_cancel", style: :secondary
|
|
93
|
+
button "Preview Changes", id: "btn_preview", variant: "primary"
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
canvas_continue message: "Loading preview..."
|
|
97
|
+
RUBY
|
|
98
|
+
|
|
99
|
+
result=$(streamweaver canvas-wait "$SESSION" 2>/dev/null)
|
|
100
|
+
echo "Selection result: $result"
|
|
101
|
+
|
|
102
|
+
# Check which button was clicked
|
|
103
|
+
button_id=$(echo "$result" | python3 -c "import sys, json; d=json.load(sys.stdin); print(d.get('button', d.get('_button', '')))" 2>/dev/null || echo "")
|
|
104
|
+
|
|
105
|
+
if [[ "$button_id" == *"cancel"* ]]; then
|
|
106
|
+
echo "User cancelled."
|
|
107
|
+
streamweaver canvas-close "$SESSION" 2>/dev/null
|
|
108
|
+
exit 0
|
|
109
|
+
fi
|
|
110
|
+
|
|
111
|
+
# Store selection for later steps
|
|
112
|
+
SELECTION="$result"
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
# ============================================================================
|
|
116
|
+
# STEP 2: Diff Preview
|
|
117
|
+
# ============================================================================
|
|
118
|
+
step2_diff_preview() {
|
|
119
|
+
echo ""
|
|
120
|
+
echo "Step 2: Diff Preview"
|
|
121
|
+
echo " Features: cards, columns, syntax-highlighted code blocks, badges"
|
|
122
|
+
echo ""
|
|
123
|
+
streamweaver canvas-push "$SESSION" <<'RUBY'
|
|
124
|
+
header1 "Review Changes"
|
|
125
|
+
md "Preview the fixes before applying:"
|
|
126
|
+
|
|
127
|
+
# N+1 Query Fix - with syntax highlighted code
|
|
128
|
+
card do
|
|
129
|
+
hstack spacing: :sm, align: :center do
|
|
130
|
+
badge "Performance", variant: :info
|
|
131
|
+
header3 "user.rb - N+1 Query Fix"
|
|
132
|
+
end
|
|
133
|
+
columns widths: ['50%', '50%'] do
|
|
134
|
+
column do
|
|
135
|
+
md "**Before** (N+1 problem)"
|
|
136
|
+
md <<~CODE
|
|
137
|
+
```ruby
|
|
138
|
+
# Each iteration triggers a DB query!
|
|
139
|
+
users.each do |user|
|
|
140
|
+
puts user.posts.count
|
|
141
|
+
puts user.comments.count
|
|
142
|
+
end
|
|
143
|
+
```
|
|
144
|
+
CODE
|
|
145
|
+
end
|
|
146
|
+
column do
|
|
147
|
+
md "**After** (Eager loaded)"
|
|
148
|
+
md <<~CODE
|
|
149
|
+
```ruby
|
|
150
|
+
# Single query loads all data
|
|
151
|
+
users.includes(:posts, :comments).each do |user|
|
|
152
|
+
puts user.posts.count
|
|
153
|
+
puts user.comments.count
|
|
154
|
+
end
|
|
155
|
+
```
|
|
156
|
+
CODE
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
md "**Impact:** Reduces queries from **24** to **2**"
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# SQL Injection Fix - with syntax highlighted code
|
|
163
|
+
card do
|
|
164
|
+
hstack spacing: :sm, align: :center do
|
|
165
|
+
badge "Security", variant: :danger
|
|
166
|
+
header3 "search_controller.rb - SQL Injection Fix"
|
|
167
|
+
end
|
|
168
|
+
columns widths: ['50%', '50%'] do
|
|
169
|
+
column do
|
|
170
|
+
md "**Before** (Vulnerable)"
|
|
171
|
+
md <<~CODE
|
|
172
|
+
```ruby
|
|
173
|
+
# User input directly in SQL!
|
|
174
|
+
def search
|
|
175
|
+
query = params[:q]
|
|
176
|
+
User.where("name LIKE '%' + query + '%'")
|
|
177
|
+
end
|
|
178
|
+
```
|
|
179
|
+
CODE
|
|
180
|
+
end
|
|
181
|
+
column do
|
|
182
|
+
md "**After** (Parameterized)"
|
|
183
|
+
md <<~CODE
|
|
184
|
+
```ruby
|
|
185
|
+
# Safe parameterized query
|
|
186
|
+
def search
|
|
187
|
+
query = params[:q]
|
|
188
|
+
User.where("name LIKE ?", "%" + query + "%")
|
|
189
|
+
end
|
|
190
|
+
```
|
|
191
|
+
CODE
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
md "**Impact:** Prevents SQL injection attacks"
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
md "---"
|
|
198
|
+
|
|
199
|
+
hstack spacing: :md do
|
|
200
|
+
button "Go Back", id: "btn_back", style: :secondary
|
|
201
|
+
button "Apply Fixes", id: "btn_apply", variant: "primary"
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
canvas_continue message: "Applying fixes..."
|
|
205
|
+
RUBY
|
|
206
|
+
|
|
207
|
+
result=$(streamweaver canvas-wait "$SESSION" 2>/dev/null)
|
|
208
|
+
echo "Preview result: $result"
|
|
209
|
+
|
|
210
|
+
button_id=$(echo "$result" | python3 -c "import sys, json; d=json.load(sys.stdin); print(d.get('button', d.get('_button', '')))" 2>/dev/null || echo "")
|
|
211
|
+
|
|
212
|
+
if [[ "$button_id" == *"back"* ]]; then
|
|
213
|
+
# Go back to step 1
|
|
214
|
+
step1_selection
|
|
215
|
+
step2_diff_preview
|
|
216
|
+
return
|
|
217
|
+
fi
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
# ============================================================================
|
|
221
|
+
# STEP 3: Progress Animation
|
|
222
|
+
# ============================================================================
|
|
223
|
+
step3_progress() {
|
|
224
|
+
echo ""
|
|
225
|
+
echo "Step 3: Progress Animation"
|
|
226
|
+
echo " Features: spinner, progress_bar (animated), status_dot (with pulse), activity_item"
|
|
227
|
+
echo ""
|
|
228
|
+
|
|
229
|
+
# Show progress for each "fix" being applied
|
|
230
|
+
local fixes=("user.rb" "search_controller.rb" "billing.rb" "processor.rb" "constants.rb")
|
|
231
|
+
local fix_names=("N+1 Query" "SQL Injection" "Long Method" "Unused Variable" "Magic Numbers")
|
|
232
|
+
local total=${#fixes[@]}
|
|
233
|
+
|
|
234
|
+
for i in "${!fixes[@]}"; do
|
|
235
|
+
local completed=$((i))
|
|
236
|
+
local current=$((i + 1))
|
|
237
|
+
local current_file="${fixes[$i]}"
|
|
238
|
+
local current_name="${fix_names[$i]}"
|
|
239
|
+
local progress=$((current * 100 / total))
|
|
240
|
+
|
|
241
|
+
# Generate status based on index
|
|
242
|
+
local s0_status="gray" s0_pulse=""
|
|
243
|
+
local s1_status="gray" s1_pulse=""
|
|
244
|
+
local s2_status="gray" s2_pulse=""
|
|
245
|
+
local s3_status="gray" s3_pulse=""
|
|
246
|
+
local s4_status="gray" s4_pulse=""
|
|
247
|
+
|
|
248
|
+
# Set completed items to green, current to pulsing green
|
|
249
|
+
[[ $i -ge 1 ]] && s0_status="green"
|
|
250
|
+
[[ $i -ge 2 ]] && s1_status="green"
|
|
251
|
+
[[ $i -ge 3 ]] && s2_status="green"
|
|
252
|
+
[[ $i -ge 4 ]] && s3_status="green"
|
|
253
|
+
[[ $i -ge 5 ]] && s4_status="green"
|
|
254
|
+
|
|
255
|
+
# Set current item to pulse
|
|
256
|
+
case $i in
|
|
257
|
+
0) s0_status="green"; s0_pulse=", pulse: true" ;;
|
|
258
|
+
1) s1_status="green"; s1_pulse=", pulse: true" ;;
|
|
259
|
+
2) s2_status="green"; s2_pulse=", pulse: true" ;;
|
|
260
|
+
3) s3_status="green"; s3_pulse=", pulse: true" ;;
|
|
261
|
+
4) s4_status="green"; s4_pulse=", pulse: true" ;;
|
|
262
|
+
esac
|
|
263
|
+
|
|
264
|
+
streamweaver canvas-push "$SESSION" <<RUBY
|
|
265
|
+
header1 "Applying Fixes"
|
|
266
|
+
|
|
267
|
+
# Show spinner with current task
|
|
268
|
+
hstack spacing: :md, align: :center do
|
|
269
|
+
spinner size: :md
|
|
270
|
+
md "**Processing:** ${current_file} - ${current_name}"
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
progress_bar value: ${progress}, show_label: true, animated: true, variant: :success
|
|
274
|
+
|
|
275
|
+
md "---"
|
|
276
|
+
|
|
277
|
+
header3 "File Status"
|
|
278
|
+
hstack spacing: :lg, align: :center do
|
|
279
|
+
status_dot status: :${s0_status}${s0_pulse}, label: "user.rb"
|
|
280
|
+
status_dot status: :${s1_status}${s1_pulse}, label: "search.rb"
|
|
281
|
+
status_dot status: :${s2_status}${s2_pulse}, label: "billing.rb"
|
|
282
|
+
status_dot status: :${s3_status}${s3_pulse}, label: "processor.rb"
|
|
283
|
+
status_dot status: :${s4_status}${s4_pulse}, label: "constants.rb"
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
md "---"
|
|
287
|
+
|
|
288
|
+
card do
|
|
289
|
+
header3 "Activity Log"
|
|
290
|
+
vstack spacing: :none do
|
|
291
|
+
$(
|
|
292
|
+
# Generate activity items dynamically
|
|
293
|
+
for j in $(seq 0 $i); do
|
|
294
|
+
if [[ $j -lt $i ]]; then
|
|
295
|
+
echo " activity_item time: \"0:0$((j*2+2))\", title: \"Fixed ${fixes[$j]} - ${fix_names[$j]}\", type: :task"
|
|
296
|
+
else
|
|
297
|
+
echo " activity_item time: \"now\", title: \"Processing ${fixes[$j]} - ${fix_names[$j]}...\", type: :research"
|
|
298
|
+
fi
|
|
299
|
+
done
|
|
300
|
+
)
|
|
301
|
+
end
|
|
302
|
+
end
|
|
303
|
+
RUBY
|
|
304
|
+
|
|
305
|
+
sleep 0.3 # Quick visual update
|
|
306
|
+
done
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
# ============================================================================
|
|
310
|
+
# STEP 4: Results Summary
|
|
311
|
+
# ============================================================================
|
|
312
|
+
step4_results() {
|
|
313
|
+
echo ""
|
|
314
|
+
echo "Step 4: Results Summary"
|
|
315
|
+
echo " Features: cards, badges, charts, sortable table, collapsible with code"
|
|
316
|
+
echo ""
|
|
317
|
+
streamweaver canvas-push "$SESSION" <<'RUBY'
|
|
318
|
+
header1 "Fixes Applied Successfully"
|
|
319
|
+
|
|
320
|
+
# Summary cards with badges
|
|
321
|
+
hstack spacing: :lg do
|
|
322
|
+
card do
|
|
323
|
+
hstack spacing: :sm, align: :center do
|
|
324
|
+
badge "5", variant: :success
|
|
325
|
+
md "**Issues Fixed**"
|
|
326
|
+
end
|
|
327
|
+
end
|
|
328
|
+
card do
|
|
329
|
+
hstack spacing: :sm, align: :center do
|
|
330
|
+
badge "2", variant: :warning
|
|
331
|
+
md "**Issues Skipped**"
|
|
332
|
+
end
|
|
333
|
+
end
|
|
334
|
+
card do
|
|
335
|
+
hstack spacing: :sm, align: :center do
|
|
336
|
+
badge "40", variant: :success
|
|
337
|
+
md "**Tests Passing**"
|
|
338
|
+
end
|
|
339
|
+
end
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
md "---"
|
|
343
|
+
|
|
344
|
+
# Charts showing impact
|
|
345
|
+
columns widths: ['50%', '50%'] do
|
|
346
|
+
column do
|
|
347
|
+
bar_chart data: {
|
|
348
|
+
"N+1 Query" => 22,
|
|
349
|
+
"SQL Injection" => 18,
|
|
350
|
+
"Long Method" => 15,
|
|
351
|
+
"Unused Var" => 3,
|
|
352
|
+
"Magic Numbers" => 2
|
|
353
|
+
}, title: "DB Queries Saved Per Fix", height: "180px"
|
|
354
|
+
end
|
|
355
|
+
column do
|
|
356
|
+
bar_chart data: {
|
|
357
|
+
"Before" => 2400,
|
|
358
|
+
"After" => 180
|
|
359
|
+
}, title: "Response Time (ms)", height: "180px"
|
|
360
|
+
end
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
md "---"
|
|
364
|
+
|
|
365
|
+
# Detailed results table
|
|
366
|
+
header3 "Fix Details"
|
|
367
|
+
table [
|
|
368
|
+
{ file: "user.rb", issue: "N+1 Query", status: "Fixed", tests: "12 passed", impact: "High" },
|
|
369
|
+
{ file: "search_controller.rb", issue: "SQL Injection", status: "Fixed", tests: "8 passed", impact: "Critical" },
|
|
370
|
+
{ file: "billing.rb", issue: "Long Method", status: "Fixed", tests: "15 passed", impact: "Medium" },
|
|
371
|
+
{ file: "processor.rb", issue: "Unused Variable", status: "Fixed", tests: "3 passed", impact: "Low" },
|
|
372
|
+
{ file: "constants.rb", issue: "Magic Numbers", status: "Fixed", tests: "2 passed", impact: "Low" },
|
|
373
|
+
{ file: "api_client.rb", issue: "Deprecated Method", status: "Skipped", tests: "-", impact: "Low" },
|
|
374
|
+
{ file: "config.rb", issue: "Missing Index", status: "Skipped", tests: "-", impact: "Medium" }
|
|
375
|
+
], striped: true, sortable: true
|
|
376
|
+
|
|
377
|
+
md "---"
|
|
378
|
+
|
|
379
|
+
# Expandable details with syntax-highlighted code
|
|
380
|
+
header3 "Change Details"
|
|
381
|
+
collapsible "user.rb - N+1 Query Fix" do
|
|
382
|
+
md <<~CODE
|
|
383
|
+
```ruby
|
|
384
|
+
# Before: N+1 queries
|
|
385
|
+
users.each { |u| puts u.posts.count }
|
|
386
|
+
|
|
387
|
+
# After: Single query with eager loading
|
|
388
|
+
users.includes(:posts).each { |u| puts u.posts.count }
|
|
389
|
+
```
|
|
390
|
+
CODE
|
|
391
|
+
md "**Impact:** Reduces database queries from 24 to 2"
|
|
392
|
+
end
|
|
393
|
+
|
|
394
|
+
collapsible "search_controller.rb - SQL Injection Fix" do
|
|
395
|
+
md <<~CODE
|
|
396
|
+
```ruby
|
|
397
|
+
# Before: Vulnerable to injection
|
|
398
|
+
User.where("name LIKE '%" + query + "%'")
|
|
399
|
+
|
|
400
|
+
# After: Safe parameterized query
|
|
401
|
+
User.where("name LIKE ?", "%" + query + "%")
|
|
402
|
+
```
|
|
403
|
+
CODE
|
|
404
|
+
md "**Impact:** Prevents SQL injection attacks"
|
|
405
|
+
end
|
|
406
|
+
|
|
407
|
+
md "---"
|
|
408
|
+
|
|
409
|
+
button "Done", id: "btn_done", variant: "primary"
|
|
410
|
+
RUBY
|
|
411
|
+
|
|
412
|
+
result=$(streamweaver canvas-wait "$SESSION" 2>/dev/null)
|
|
413
|
+
echo "Final result: $result"
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
# ============================================================================
|
|
417
|
+
# Main Execution
|
|
418
|
+
# ============================================================================
|
|
419
|
+
|
|
420
|
+
step1_selection
|
|
421
|
+
step2_diff_preview
|
|
422
|
+
step3_progress
|
|
423
|
+
step4_results
|
|
424
|
+
|
|
425
|
+
# Cleanup
|
|
426
|
+
streamweaver canvas-close "$SESSION" 2>/dev/null
|
|
427
|
+
|
|
428
|
+
echo ""
|
|
429
|
+
echo "=============================================="
|
|
430
|
+
echo "Demo complete!"
|
|
431
|
+
echo ""
|
|
432
|
+
echo "This demo showcased StreamWeaver features that"
|
|
433
|
+
echo "are impossible or painful in traditional TUI:"
|
|
434
|
+
echo ""
|
|
435
|
+
echo " Component TUI Equivalent Browser Advantage"
|
|
436
|
+
echo " ------------------ -------------------- ------------------"
|
|
437
|
+
echo " Syntax highlighting Plain text Color-coded keywords"
|
|
438
|
+
echo " Bar charts None practical Visual data comparison"
|
|
439
|
+
echo " Side-by-side columns ASCII pipes Precise alignment"
|
|
440
|
+
echo " Collapsible sections None Smooth expand/collapse"
|
|
441
|
+
echo " Progress bar [====> ] Smooth animation"
|
|
442
|
+
echo " Pulsing status dots * spinner Color + animation"
|
|
443
|
+
echo " Activity feed Timestamped lines Rich formatting"
|
|
444
|
+
echo " Badges & alerts Plain text Color-coded visual cues"
|
|
445
|
+
echo " Sortable tables ASCII table Click to sort"
|
|
446
|
+
echo " Cards with layout Box drawing chars Clean visual hierarchy"
|
|
447
|
+
echo ""
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/* Tyrion War Room -- design-parity slice CSS (stream_weaver-8mj rebuild)
|
|
2
|
+
*
|
|
3
|
+
* This slice now emits tyrion's OWN class names (wr-board, wr-card,
|
|
4
|
+
* topbar, sidebar, story-row, as-parchment, ...) directly, and consumes
|
|
5
|
+
* the real public/shared.css at runtime via SW_PARITY_CSS (never copied
|
|
6
|
+
* into this repo -- see the script header for the env var contract).
|
|
7
|
+
* That means almost none of the CSS that used to live in this file is
|
|
8
|
+
* needed any more: the real stylesheet governs every element with a real
|
|
9
|
+
* class. What's left here is strictly the seam between StreamWeaver's own
|
|
10
|
+
* chrome and tyrion's -- documented per rule, see
|
|
11
|
+
* gsd/analysis/08-design-parity-fights.md for the full writeup.
|
|
12
|
+
*
|
|
13
|
+
* Loaded via `stylesheets:` *after* the real shared.css (when
|
|
14
|
+
* SW_PARITY_CSS is set), so these rules only need to beat StreamWeaver's
|
|
15
|
+
* own base chrome -- never the real CSS.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/* Real tyrion's `html, body { height: 100%; overflow: hidden; }` --
|
|
19
|
+
* .shell being a `height: 100vh` grid depends on it; without it the page
|
|
20
|
+
* scrolls as a whole instead of just its internal panes. */
|
|
21
|
+
html, body {
|
|
22
|
+
height: 100%;
|
|
23
|
+
overflow: hidden;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/* chrome: false gives every StreamWeaver body.sw-chromeless page a
|
|
27
|
+
* var(--sw-spacing-lg) padding baseline -- a reasonable default in
|
|
28
|
+
* general, wrong here since .shell is meant to fill the viewport
|
|
29
|
+
* edge-to-edge. Formerly needed an `html` specificity-bump prefix because
|
|
30
|
+
* this equal-specificity rule still lost to master_theme_css's own
|
|
31
|
+
* body.sw-chromeless on document order (views.rb's <style> block renders
|
|
32
|
+
* after `stylesheets:`); now unnecessary -- master_theme_css lives in
|
|
33
|
+
* @layer stream-weaver (stream_weaver-oeo), so this unlayered rule always
|
|
34
|
+
* wins regardless of specificity or order. */
|
|
35
|
+
body.sw-chromeless {
|
|
36
|
+
padding: 0;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/* `.shell` is `display:grid; height:100vh` in the real CSS -- correct on
|
|
40
|
+
* its own, but StreamWeaver's #app-container (always present, even under
|
|
41
|
+
* chrome:false -- see main_content_region in views.rb) is a plain block
|
|
42
|
+
* box around it. Constrain it to the viewport height too so .shell's own
|
|
43
|
+
* 100vh doesn't overflow its parent. */
|
|
44
|
+
#app-container {
|
|
45
|
+
height: 100vh;
|
|
46
|
+
overflow: hidden;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/* Real background photos (topbar strategy map, war-table map) are baked
|
|
50
|
+
* into shared.css as *relative* url("assets/...") references. StreamWeaver
|
|
51
|
+
* only serves individually-registered files at content-hashed
|
|
52
|
+
* /sw-asset/<key>/<name> paths, not a whole directory tree, so those
|
|
53
|
+
* relative urls 404 silently and the browser just keeps the gradient
|
|
54
|
+
* layer underneath -- no override needed for that (graceful) case. When
|
|
55
|
+
* SW_PARITY_ASSETS *is* set, the slice script injects a small
|
|
56
|
+
* data:-URI stylesheet (see PARITY_BG_CSS in the script) with the real
|
|
57
|
+
* resolved asset URL, appended after this file so it wins ties here too.
|
|
58
|
+
*/
|
|
59
|
+
|
|
60
|
+
/* master_theme_css is one big always-injected bundle, unscoped and
|
|
61
|
+
* un-namespaced, that happens to declare `.sidebar-section` ("Monica-style
|
|
62
|
+
* sidebar sections", demoed in examples/advanced/all_components.rb -- a
|
|
63
|
+
* real, documented utility class, not dead code) and `.status-badge`
|
|
64
|
+
* ("Status Badge"), both of which collide with tyrion's own real class
|
|
65
|
+
* names by pure coincidence (stream_weaver-lyb). This rewrite deliberately
|
|
66
|
+
* calls none of Board/Lane/Sidebar, so the collision comes purely from
|
|
67
|
+
* these generic framework selectors, not from using a StreamWeaver
|
|
68
|
+
* component. Formerly needed a `body .shell` specificity-bump prefix
|
|
69
|
+
* (values copied from shared.css) to win the tie; now unnecessary --
|
|
70
|
+
* master_theme_css lives in @layer stream-weaver (stream_weaver-oeo), so
|
|
71
|
+
* these unlayered plain-class rules always win regardless of specificity.
|
|
72
|
+
*/
|
|
73
|
+
.sidebar-section {
|
|
74
|
+
background: transparent;
|
|
75
|
+
border: none;
|
|
76
|
+
border-radius: 0;
|
|
77
|
+
padding: 12px 14px 4px;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.status-badge {
|
|
81
|
+
gap: 6px;
|
|
82
|
+
padding: 3px 10px;
|
|
83
|
+
border-radius: 3px;
|
|
84
|
+
font-size: 11px;
|
|
85
|
+
margin: 0;
|
|
86
|
+
}
|