@litfamily/lithermes 1.0.7 → 1.0.9
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.
- package/README.md +299 -13
- package/README_Ko-KR.md +300 -14
- package/assets/lithermes-plugin/README.md +17 -6
- package/assets/lithermes-plugin/__init__.py +96 -21
- package/assets/lithermes-plugin/core.py +15 -6
- package/assets/lithermes-plugin/core_commands.py +140 -28
- package/assets/lithermes-plugin/core_contexts.py +88 -15
- package/assets/lithermes-plugin/core_contract.py +118 -9
- package/assets/lithermes-plugin/core_routing.py +197 -8
- package/assets/lithermes-plugin/deliverable_hedge_guard.py +378 -357
- package/assets/lithermes-plugin/diagnostics.py +76 -8
- package/assets/lithermes-plugin/humanizer_detector.py +348 -0
- package/assets/lithermes-plugin/humanizer_ko_metrics.py +108 -0
- package/assets/lithermes-plugin/humanizer_office.py +18 -0
- package/assets/lithermes-plugin/lit_mark.py +1 -1
- package/assets/lithermes-plugin/motion_receipts.py +80 -0
- package/assets/lithermes-plugin/payload-version.json +2240 -64
- package/assets/lithermes-plugin/plugin.yaml +1 -1
- package/assets/lithermes-plugin/rules/bundled-rules/lit-humanizer.md +14 -0
- package/assets/lithermes-plugin/skills/autoconference/assets/report_template.md +2 -1
- package/assets/lithermes-plugin/skills/autoconference/modes/ship/SKILL.md +11 -8
- package/assets/lithermes-plugin/skills/autoresearch/modes/ship/type-checklists.md +2 -2
- package/assets/lithermes-plugin/skills/browser-drive/ORIGIN.json +17 -0
- package/assets/lithermes-plugin/skills/browser-drive/SKILL.md +41 -16
- package/assets/lithermes-plugin/skills/browser-drive/scripts/capability_probe.py +122 -10
- package/assets/lithermes-plugin/skills/frontend-ui-ux/SKILL.md +45 -13
- package/assets/lithermes-plugin/skills/frontend-ui-ux/examples/phase-3-readme-ab/README.md +51 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/README.md +44 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/adaptive-layout.md +34 -62
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/brand-and-imagery.md +22 -70
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/complete-contract.md +18 -4
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/composition.md +27 -78
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/craft-floor.md +74 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/creative-directions.md +25 -69
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/evidence-review.md +18 -97
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/implementation-platforms.md +23 -83
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/inclusive-interface.md +22 -70
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/interaction-motion.md +34 -68
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/motion-guide.md +62 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/operating-lanes.md +14 -78
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/performance-delivery.md +22 -71
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/product-direction.md +17 -70
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/production.md +19 -7
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/redesign-playbook.md +23 -76
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/slop-register.md +69 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/system-foundations.md +22 -67
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/visual-language.md +16 -72
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/visual-reconstruction.md +16 -81
- package/assets/lithermes-plugin/skills/frontend-ui-ux/resources/THIRD-PARTY-NOTICE.txt +15 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/probe-page.js +311 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/probe-rules.json +46 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/probe.mjs +231 -0
- package/assets/lithermes-plugin/skills/lit-comprehend/SKILL.md +36 -25
- package/assets/lithermes-plugin/skills/lit-comprehend/references/artifact-template.md +45 -87
- package/assets/lithermes-plugin/skills/lit-comprehend/scripts/verify-explainer.py +3 -27
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/NOTICE +33 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/SKILL.md +308 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-architecture-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-architecture-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-architecture-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bar-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bar-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bar-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-beeswarm-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-beeswarm-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-beeswarm-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bubble-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bubble-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bubble-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bump-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bump-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bump-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-data-flow-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-data-flow-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-data-flow-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-datalake-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-datalake-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-datalake-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-db-schema-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-db-schema-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-db-schema-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dependency-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dependency-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dependency-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-deployment-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-deployment-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-deployment-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dp-integration-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dp-integration-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dp-integration-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dp-security-matrix-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dp-security-matrix-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dp-security-matrix-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-er-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-er-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-er-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-fishbone-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-fishbone-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-fishbone-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-flowchart-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-flowchart-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-flowchart-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-gantt-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-gantt-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-gantt-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-heatmap-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-heatmap-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-heatmap-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-high-level-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-high-level-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-high-level-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-high-level-vertical-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-high-level-vertical-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-high-level-vertical-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-drawio-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-drawio-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-drawio-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-excalidraw-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-excalidraw-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-excalidraw-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-mermaid-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-mermaid-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-mermaid-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-it-state-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-it-state-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-it-state-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-journey-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-journey-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-journey-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-kanban-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-kanban-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-kanban-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-layers-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-layers-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-layers-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-line-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-line-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-line-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-loop-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-loop-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-loop-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-loop-terminal-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-loop-terminal-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-loop-terminal-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-marimekko-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-marimekko-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-marimekko-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-medallion-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-medallion-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-medallion-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-nested-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-nested-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-nested-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-org-chart-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-org-chart-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-org-chart-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-paved-road-animated-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-paved-road-animated-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-paved-road-animated-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-polar-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-polar-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-polar-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-policy-trace-animated-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-policy-trace-animated-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-policy-trace-animated-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-process-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-process-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-process-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-pyramid-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-pyramid-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-pyramid-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-quadrant-consultant-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-quadrant-consultant-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-quadrant-consultant-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-quadrant-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-quadrant-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-quadrant-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-queue-animated-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-queue-animated-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-queue-animated-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-radar-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-radar-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-radar-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-ridgeline-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-ridgeline-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-ridgeline-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sankey-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sankey-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sankey-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-scatter-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-scatter-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-scatter-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sequence-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sequence-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sequence-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sequence-oauth-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sequence-oauth-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sequence-oauth-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-slopegraph-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-slopegraph-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-slopegraph-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-state-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-state-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-state-lifecycle-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-state-lifecycle-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-state-lifecycle-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-state-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-story-map-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-story-map-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-story-map-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-streamgraph-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-streamgraph-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-streamgraph-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-swimlane-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-swimlane-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-swimlane-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-timeline-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-timeline-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-timeline-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-tree-block-decomposition-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-tree-block-decomposition-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-tree-block-decomposition-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-tree-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-tree-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-tree-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-treemap-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-treemap-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-treemap-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-uml-class-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-uml-class-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-uml-class-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-venn-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-venn-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-venn-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-wardley-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-wardley-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-wardley-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-waterfall-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-waterfall-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-waterfall-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/fonts/OFL.txt +94 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/fonts/PretendardVariable.woff2 +0 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/fonts/provenance.json +22 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/icons.html +231 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/index.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/licenses/devicon-MIT.txt +20 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/licenses/diagram-design-MIT.txt +21 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/licenses/log-z-MIT.txt +21 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/licenses/simple-icons-CC0.md +30 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/licenses/tabler-MIT.txt +21 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/01-service-architecture/after.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/01-service-architecture/brief.md +33 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/02-release-decision/after.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/02-release-decision/brief.md +18 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/03-data-retention/after.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/03-data-retention/brief.md +19 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/04-oauth-sequence/after.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/04-oauth-sequence/brief.md +17 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/05-review-lanes/after.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/05-review-lanes/brief.md +17 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/06-rollout-gates/after.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/06-rollout-gates/brief.md +17 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/07-deployment-boundary/after.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/07-deployment-boundary/brief.md +19 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/08-policy-traces/after.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/08-policy-traces/brief.md +20 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/accessibility.md +37 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/export.md +29 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/import-drawio.md +21 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/import-excalidraw.md +14 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/import-mermaid.md +18 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/import-schema.md +28 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/korean-typography.md +34 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/motion.md +29 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/office-pptx-docx.md +40 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/output-spec.md +48 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/primitive-annotation.md +12 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/primitive-icons.md +21 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/primitive-sketchy.md +11 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/primitive-terminal.md +11 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/profiles.md +24 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/semantic-patterns.md +27 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/style-guide.md +67 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-architecture.md +51 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-bar.md +51 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-beeswarm.md +49 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-bubble.md +49 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-bump.md +49 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-catalog.json +1433 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-data-flow.md +51 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-datalake.md +49 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-db-schema.md +49 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-dependency.md +49 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-deployment.md +49 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-dp-integration.md +49 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-dp-security-matrix.md +49 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-er.md +49 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-fishbone.md +49 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-flowchart.md +49 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-gantt.md +49 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-heatmap.md +53 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-high-level-vertical.md +53 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-high-level.md +53 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-import-drawio.md +53 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-import-excalidraw.md +53 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-import-mermaid.md +53 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-it-state.md +54 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-journey.md +54 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-kanban.md +54 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-layers.md +54 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-line.md +54 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-loop-terminal.md +53 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-loop.md +54 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-marimekko.md +54 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-medallion.md +54 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-nested.md +59 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-org-chart.md +58 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-paved-road-animated.md +72 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-polar.md +67 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-policy-trace-animated.md +69 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-process.md +58 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-pyramid.md +59 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-quadrant-consultant.md +60 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-quadrant.md +57 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-queue-animated.md +63 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-radar.md +57 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-ridgeline.md +63 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-sankey.md +68 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-scatter.md +60 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-sequence-oauth.md +66 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-sequence.md +63 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-slopegraph.md +65 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-state-lifecycle.md +53 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-state.md +59 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-story-map.md +52 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-streamgraph.md +53 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-swimlane.md +52 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-timeline.md +52 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-tree-block-decomposition.md +57 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-tree.md +54 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-treemap.md +54 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-uml-class.md +52 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-venn.md +51 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-wardley.md +52 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-waterfall.md +54 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/verifier-guide.md +31 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/block-registry.mjs +43 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/browser-version.mjs +12 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/check-visible-text.py +12 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_brief.py +192 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_catalog.py +135 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_checks.py +123 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_cli.py +94 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_geometry.py +130 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_metrics.py +166 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_quality.py +293 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_quality_geometry.py +200 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_records.py +205 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_sequence.py +55 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/doctor.mjs +24 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/drawio_extract.py +209 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/drawio_source.py +188 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/excalidraw_extract.py +233 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/excalidraw_support.py +64 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/export.mjs +125 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/mermaid_extract.py +240 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/mermaid_source.py +39 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/office-safety.mjs +54 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/verify-all.py +12 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/verify-brief.py +12 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/verify-diagram.py +12 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/verify-motion.py +12 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/verify-type.py +12 -0
- package/assets/lithermes-plugin/skills/lit-docx/NOTICE +1 -0
- package/assets/lithermes-plugin/skills/lit-docx/SKILL.md +97 -0
- package/assets/lithermes-plugin/skills/lit-docx/references/frontmatter_schema.md +42 -0
- package/assets/lithermes-plugin/skills/lit-docx/references/journal_style_spec.md +17 -0
- package/assets/lithermes-plugin/skills/lit-docx/references/markdown_quality_checklist.md +37 -0
- package/assets/lithermes-plugin/skills/lit-docx/references/slop_phrase_list.yaml +58 -0
- package/assets/lithermes-plugin/skills/lit-docx/references/slop_rules.md +35 -0
- package/assets/lithermes-plugin/skills/lit-docx/scripts/clean_markdown.py +95 -0
- package/assets/lithermes-plugin/skills/lit-docx/scripts/convert_md_to_docx.py +1041 -0
- package/assets/lithermes-plugin/skills/lit-docx/scripts/convert_md_to_pdf.py +281 -0
- package/assets/lithermes-plugin/skills/lit-docx/scripts/convert_pdf.py +130 -0
- package/assets/lithermes-plugin/skills/lit-docx/scripts/edit_docx.py +297 -0
- package/assets/lithermes-plugin/skills/lit-docx/scripts/embed_images.py +78 -0
- package/assets/lithermes-plugin/skills/lit-docx/scripts/generate_docx_templates.py +491 -0
- package/assets/lithermes-plugin/skills/lit-docx/scripts/slop_lint.py +536 -0
- package/assets/lithermes-plugin/skills/lit-docx/scripts/visual_audit.py +41 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/docx/acs.docx +0 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/docx/elsevier.docx +0 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/docx/ieee.docx +0 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/docx/korean-generic.docx +0 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/docx/nature.docx +0 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/latex/acs/README.md +5 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/latex/acs/template.tex +37 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/latex/elsevier/README.md +5 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/latex/elsevier/template.tex +38 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/latex/ieee/README.md +5 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/latex/ieee/template.tex +37 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/latex/korean-generic/README.md +5 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/latex/korean-generic/template.tex +37 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/latex/nature/README.md +5 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/latex/nature/template.tex +37 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/registry.yaml +1366 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/NOTICE +170 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/SKILL.md +125 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/assets/report-skeleton.md +26 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/assets/slide-text-skeleton.md +30 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/accessibility-note/after.md +7 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/accessibility-note/before.md +7 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/api-reference/after.md +9 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/api-reference/before.md +15 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/changelog/after.md +5 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/changelog/before.md +12 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/code-comments/after.md +10 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/code-comments/before.md +19 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/commit/after.md +5 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/commit/before.md +7 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/data-release/after.md +7 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/data-release/before.md +9 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/detector-validation/ko-metrics-golden.json +49 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/detector-validation/pos-real.txt +26 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/detector-validation/rule-cases.json +306 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/english-essay/after.md +5 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/english-essay/before.md +5 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/incident-update/after.md +7 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/incident-update/before.md +7 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/ko-essay/after.md +7 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/ko-essay/before.md +9 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/ko-report/after.md +9 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/ko-report/before.md +13 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/ko-slide/after.md +19 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/ko-slide/before.md +21 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/meeting-brief/after.md +9 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/meeting-brief/before.md +11 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/policy-faq/after.md +9 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/policy-faq/before.md +9 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/pr/after.md +15 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/pr/before.md +17 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/project-update/after.md +7 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/project-update/before.md +9 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/readme/after.md +12 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/readme/before.md +14 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/report/after.md +13 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/report/before.md +11 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/research-abstract/after.md +5 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/research-abstract/before.md +5 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/slides/after.md +19 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/slides/before.md +19 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/troubleshooting/after.md +11 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/troubleshooting/before.md +11 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/README.md +16 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/always-on-rule.md +9 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/code-patterns.md +468 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/deliverable-channels.md +111 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/en-patterns-checklist.md +43 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/en-patterns-content.md +243 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/en-patterns-structure.md +375 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/en-patterns.md +57 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/ko-metrics.md +33 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/ko-patterns-a-d.md +659 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/ko-patterns-e-j.md +387 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/ko-patterns.md +31 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/rewrite-playbook.md +54 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/taxonomy.md +153 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/rules.json +884 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/scripts/detect.py +17 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/scripts/extract_office_text.py +114 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/scripts/ko_metrics.py +35 -0
- package/assets/lithermes-plugin/skills/lit-pptx/NOTICE +1 -0
- package/assets/lithermes-plugin/skills/lit-pptx/SKILL.md +109 -0
- package/assets/lithermes-plugin/skills/lit-pptx/agents/analyst.md +49 -0
- package/assets/lithermes-plugin/skills/lit-pptx/agents/antithesis.md +65 -0
- package/assets/lithermes-plugin/skills/lit-pptx/agents/architect.md +44 -0
- package/assets/lithermes-plugin/skills/lit-pptx/agents/critic.md +42 -0
- package/assets/lithermes-plugin/skills/lit-pptx/agents/synthesizer.md +47 -0
- package/assets/lithermes-plugin/skills/lit-pptx/agents/thesis.md +33 -0
- package/assets/lithermes-plugin/skills/lit-pptx/assets/azure/circle-lg.png +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/assets/azure/circle-md.png +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/assets/azure/circle-sm.png +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/bin/office.mjs +77 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/PRETENDARD-OFL.txt +94 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-Black.otf +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-Bold.otf +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-ExtraBold.otf +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-ExtraLight.otf +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-Light.otf +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-Medium.otf +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-Regular.otf +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-SemiBold.otf +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-Thin.otf +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/OFL.txt +94 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/SOURCE.md +29 -0
- package/assets/lithermes-plugin/skills/lit-pptx/pretendard-font/public/static/PretendardGOV-Bold.otf +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/pretendard-font/public/static/PretendardGOV-Regular.otf +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/references/anti-slop-checklist.md +71 -0
- package/assets/lithermes-plugin/skills/lit-pptx/references/authoring-guide.md +139 -0
- package/assets/lithermes-plugin/skills/lit-pptx/references/consensus-protocol.md +125 -0
- package/assets/lithermes-plugin/skills/lit-pptx/references/data-display-cookbook.md +45 -0
- package/assets/lithermes-plugin/skills/lit-pptx/references/design-system-azure.md +58 -0
- package/assets/lithermes-plugin/skills/lit-pptx/runtime/package-lock.json +750 -0
- package/assets/lithermes-plugin/skills/lit-pptx/runtime/package.json +15 -0
- package/assets/lithermes-plugin/skills/lit-pptx/runtime/requirements.in +7 -0
- package/assets/lithermes-plugin/skills/lit-pptx/runtime/requirements.lock +391 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/compile-deck.js +447 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/craft_extras.py +215 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/embed_fonts.py +199 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/integrity.py +60 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/inventory.py +64 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/learn_template.py +433 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/derive-palette.js +176 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/directive-parser.js +244 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/font-map.js +79 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/gen-bg.js +85 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/gen-gradient-assets.js +36 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/layout-resolver.js +736 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/markdown-loader.js +136 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/render-adapter-html.js +357 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/render-adapter-pptx.js +1864 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/slide-ast.js +539 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/spec-validator.js +94 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/template-registry.js +355 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/qa_deck.py +791 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/validate_pptx.py +206 -0
- package/assets/lithermes-plugin/skills/lit-pptx/slide-formats/markdown-slide-spec-v1.md +251 -0
- package/assets/lithermes-plugin/skills/lit-pptx/slide-formats/markdown-slide-spec-v2.md +221 -0
- package/assets/lithermes-plugin/skills/lit-pptx/slide-formats/slide-ast-v1.schema.json +229 -0
- package/assets/lithermes-plugin/skills/lit-pptx/slide-formats/slide-ast-v2.schema.json +144 -0
- package/assets/lithermes-plugin/skills/lit-pptx/slide-formats/template-enrollment-contract.md +228 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/AZURE-A2Z/capabilities.yaml +146 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/AZURE-A2Z/layout-mapping.yaml +384 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/AZURE-A2Z/template.yaml +37 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/AZURE-PRO/capabilities.yaml +154 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/AZURE-PRO/layout-mapping.yaml +405 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/AZURE-PRO/template.yaml +37 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/BOILERPLATE-A2Z/capabilities.yaml +179 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/BOILERPLATE-A2Z/layout-mapping.yaml +299 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/BOILERPLATE-A2Z/template.yaml +45 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/BOILERPLATE-PRETENDARD/capabilities.yaml +181 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/BOILERPLATE-PRETENDARD/layout-mapping.yaml +299 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/BOILERPLATE-PRETENDARD/template.yaml +44 -0
- package/assets/lithermes-plugin/skills/lit-scientific-visualization/SKILL.md +2 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/SKILL.md +71 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/bin/audio.py +45 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/bin/motion.mjs +690 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/bin/runtime.mjs +299 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/NOTICE +23 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/THIRD_PARTY_NOTICES +55 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/browser.mjs +169 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/completion.mjs +52 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/constants.mjs +162 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/director.mjs +33 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/encode.mjs +191 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/flash.mjs +163 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/frame.mjs +428 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/gate.mjs +483 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/look.mjs +223 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/page.js +622 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/presets.mjs +170 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/scenes.mjs +242 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/sound.mjs +382 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stage-gate.mjs +97 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stage-init.js +186 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stage-kit.js +389 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stage-qa.mjs +358 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stage-worker.mjs +33 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stage.mjs +691 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stills.mjs +71 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stroke.mjs +231 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/timeline.mjs +177 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/treatment.mjs +244 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/type.mjs +183 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/util.mjs +152 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/references/craft-loop.md +175 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/references/engine-contract.md +166 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/references/runtime.md +122 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/references/stage.md +261 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/references/style-bibles.md +122 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/references/treatment.md +164 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/references/type-craft.md +92 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/runtime/fonts.json +154 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/runtime/licenses/CREDITS +20 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/runtime/licenses/EMS-OFL.txt +91 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/runtime/package-lock.json +88 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/runtime/package.json +12 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/runtime/requirements.in +1 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/runtime/requirements.lock +727 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/runtime/word-timing.json +9 -0
- package/assets/lithermes-plugin/skills/litresearch/SKILL.md +19 -18
- package/assets/lithermes-plugin/skills/litwork/SKILL.md +28 -0
- package/assets/lithermes-plugin/skills/visual-qa/references/complete-contract.md +3 -3
- package/package.json +1 -1
- package/readme-assets/ab-simple/s11-ui-baseline-desktop.webp +0 -0
- package/readme-assets/ab-simple/s11-ui-lithermes-desktop.webp +0 -0
- package/readme-assets/ab-simple/s3-ui-baseline-desktop.webp +0 -0
- package/readme-assets/ab-simple/s3-ui-lithermes-desktop.webp +0 -0
- package/readme-assets/ab-simple/s4-ui-baseline-desktop.webp +0 -0
- package/readme-assets/ab-simple/s4-ui-lithermes-desktop.webp +0 -0
- package/readme-assets/ab-simple/s5-office-baseline-slides.webp +0 -0
- package/readme-assets/ab-simple/s5-office-lithermes-slides.webp +0 -0
- package/readme-assets/ab-simple/s7-lithermes-diagram.webp +0 -0
- package/readme-assets/ab-simple/s8-office-baseline-slides.webp +0 -0
- package/readme-assets/ab-simple/s8-office-lithermes-slides.webp +0 -0
- package/readme-assets/ab-simple/s9-office-lithermes-pages.webp +0 -0
- package/readme-assets/badge-version.svg +1 -1
- package/readme-assets/cover-motion-still.webp +0 -0
- package/readme-assets/cover-motion.webp +0 -0
- package/readme-assets/skills/autoconference.webp +0 -0
- package/readme-assets/skills/autoresearch.webp +0 -0
- package/readme-assets/skills/browser-drive.webp +0 -0
- package/readme-assets/skills/comment-checker.webp +0 -0
- package/readme-assets/skills/debugging.webp +0 -0
- package/readme-assets/skills/deep-interview.webp +0 -0
- package/readme-assets/skills/frontend-ui-ux.webp +0 -0
- package/readme-assets/skills/lit-burnoff-file.webp +0 -0
- package/readme-assets/skills/lit-burnoff.webp +0 -0
- package/readme-assets/skills/lit-code.webp +0 -0
- package/readme-assets/skills/lit-commit.webp +0 -0
- package/readme-assets/skills/lit-comprehend.webp +0 -0
- package/readme-assets/skills/lit-crucible.webp +0 -0
- package/readme-assets/skills/lit-diagram-drawer.webp +0 -0
- package/readme-assets/skills/lit-docx.webp +0 -0
- package/readme-assets/skills/lit-handoff.webp +0 -0
- package/readme-assets/skills/lit-humanizer.webp +0 -0
- package/readme-assets/skills/lit-init.webp +0 -0
- package/readme-assets/skills/lit-plan.webp +0 -0
- package/readme-assets/skills/lit-pptx.webp +0 -0
- package/readme-assets/skills/lit-recap.webp +0 -0
- package/readme-assets/skills/lit-scientific-visualization.webp +0 -0
- package/readme-assets/skills/lit-typographic-motion.webp +0 -0
- package/readme-assets/skills/litgoal.webp +0 -0
- package/readme-assets/skills/litresearch.webp +0 -0
- package/readme-assets/skills/litwork.webp +0 -0
- package/readme-assets/skills/lsp-setup.webp +0 -0
- package/readme-assets/skills/lsp.webp +0 -0
- package/readme-assets/skills/readme-studio.webp +0 -0
- package/readme-assets/skills/refactor.webp +0 -0
- package/readme-assets/skills/review-work.webp +0 -0
- package/readme-assets/skills/rules.webp +0 -0
- package/readme-assets/skills/start-work.webp +0 -0
- package/readme-assets/skills/structural-search.webp +0 -0
- package/readme-assets/skills/visual-qa.webp +0 -0
- package/readme-assets/skills/wikify.webp +0 -0
- package/src/cli.js +40 -1
- package/src/lib/check.js +21 -0
- package/src/lib/install.js +262 -7
- package/src/lib/skillPayload.js +3 -3
- package/assets/lithermes-plugin/skills/lit-korean/SKILL.md +0 -237
- package/assets/lithermes-plugin/skills/lit-korean/references/quick-rules.md +0 -24
- package/assets/lithermes-plugin/skills/lit-korean/references/safety-checklist.md +0 -23
- package/readme-assets/cover.webp +0 -0
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
// Frame composer: turns a scene display list into (a) the draw spec the page
|
|
2
|
+
// rasterizes and (b) the frame-line metadata the gate reads (textBoxes from
|
|
3
|
+
// outline geometry, graphics boxes, fills, overrides). The per-frame sampling,
|
|
4
|
+
// preroll and override rules follow pdoom's engine.ts render()/composite()
|
|
5
|
+
// method (MIT, see NOTICE), re-expressed around a Node-side display list.
|
|
6
|
+
import { FRAME, OVERRIDES } from './constants.mjs';
|
|
7
|
+
import { PRESETS } from './presets.mjs';
|
|
8
|
+
import { SCENE_MODULES, counterTarget } from './scenes.mjs';
|
|
9
|
+
import { layoutLine, inkBounds, wrapWords, eojeols } from './type.mjs';
|
|
10
|
+
import { strokeText, writtenLength, writtenStrokes } from './stroke.mjs';
|
|
11
|
+
import { shotsOf, revealsOf } from './timeline.mjs';
|
|
12
|
+
import { clamp } from './util.mjs';
|
|
13
|
+
|
|
14
|
+
// Font ids -> files. Archivo comes as pdoom's pre-built width x weight instances
|
|
15
|
+
// (weights 500/700/900; 500 stands in for 400, MO-A-59); Hangul reuses this
|
|
16
|
+
// product's own lit-pptx PretendardGOV pair (400 <-> 700 only, MO-A-33).
|
|
17
|
+
export const FONT_FILES = Object.freeze({
|
|
18
|
+
...Object.fromEntries([75, 100, 125].flatMap((w) => [500, 700, 900].map((wt) => [`archivo-w${w}-${wt}`, `fonts/Archivo-w${w * 10}-${wt}.ttf`]))),
|
|
19
|
+
'pretendard-400': 'lit-pptx:PretendardGOV-Regular.otf',
|
|
20
|
+
'pretendard-700': 'lit-pptx:PretendardGOV-Bold.otf',
|
|
21
|
+
galmuri9: 'fonts/Galmuri9.ttf',
|
|
22
|
+
vt323: 'fonts/VT323-Regular.ttf',
|
|
23
|
+
meslo: 'fonts/MesloLGS-NF-Regular.ttf',
|
|
24
|
+
'silkscreen-400': 'fonts/Silkscreen-Regular.ttf',
|
|
25
|
+
'silkscreen-700': 'fonts/Silkscreen-Bold.ttf',
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
export const PRESET_FONTS = Object.freeze({
|
|
29
|
+
'swiss-signal': ['archivo-w75-900', 'archivo-w100-500', 'archivo-w100-700', 'archivo-w100-900', 'archivo-w125-900', 'pretendard-400', 'pretendard-700', 'meslo'],
|
|
30
|
+
tidal: ['archivo-w100-500', 'archivo-w100-700', 'archivo-w100-900', 'pretendard-400', 'pretendard-700', 'meslo'],
|
|
31
|
+
terminalcore: ['galmuri9', 'vt323', 'meslo', 'silkscreen-400', 'silkscreen-700', 'pretendard-400'],
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const archivoWeight = (weight) => (weight >= 800 ? 900 : weight >= 600 ? 700 : 500);
|
|
35
|
+
|
|
36
|
+
export function resolveFontId(presetId, voice, script, weight = 700, widthStep = 100) {
|
|
37
|
+
const terminal = presetId === 'terminalcore';
|
|
38
|
+
if (script === 'hangul') {
|
|
39
|
+
if (terminal) return voice === 'machine' || voice === 'label' || voice === 'display' || voice === 'body' ? 'galmuri9' : 'pretendard-400';
|
|
40
|
+
return weight >= 600 && voice !== 'machine' ? 'pretendard-700' : 'pretendard-400';
|
|
41
|
+
}
|
|
42
|
+
if (voice === 'machine') return 'meslo';
|
|
43
|
+
if (voice === 'label') return terminal ? (weight >= 600 ? 'silkscreen-700' : 'silkscreen-400') : 'meslo';
|
|
44
|
+
if (terminal) return 'vt323';
|
|
45
|
+
const step = voice === 'display' && [75, 100, 125].includes(widthStep) ? widthStep : 100;
|
|
46
|
+
const id = `archivo-w${step}-${archivoWeight(weight)}`;
|
|
47
|
+
return FONT_FILES[id] ? id : `archivo-w100-${archivoWeight(weight)}`;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function colorFor(ctx, role) {
|
|
51
|
+
const preset = PRESETS[ctx.presetId];
|
|
52
|
+
if (role === 'accent') return preset.palette.accent || ctx.signal;
|
|
53
|
+
if (role === 'emphasis') return ctx.signal;
|
|
54
|
+
const key = preset.roles[role] || preset.roles.text;
|
|
55
|
+
if (key === 'signal') return ctx.signal;
|
|
56
|
+
return preset.palette[key] || preset.palette.ink;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function measureFor(ctx, el, size) {
|
|
60
|
+
return (text) => layoutLine(text, size, (run) => ctx.fonts.get(resolveFontId(ctx.presetId, el.voice, run.script, el.weight, el.widthStep)), () => el.trackingEm || 0).width;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function fitSize(ctx, el) {
|
|
64
|
+
if (el.size) return { size: el.size, lines: [normalize(el.text)] };
|
|
65
|
+
const fit = el.fit;
|
|
66
|
+
const text = normalize(el.text);
|
|
67
|
+
const sample = fit.sample ? normalize(fit.sample) : text;
|
|
68
|
+
const grid = (s) => (fit.pixelGrid ? Math.max(fit.pixelGrid, Math.floor(s / fit.pixelGrid) * fit.pixelGrid) : Math.floor(s));
|
|
69
|
+
for (let size = grid(fit.max); size >= fit.min; size = grid(size - Math.max(1, fit.pixelGrid || 2))) {
|
|
70
|
+
if (measureFor(ctx, el, size)(sample) <= fit.maxWidth) return { size, lines: [text] };
|
|
71
|
+
if (size <= fit.min) break;
|
|
72
|
+
}
|
|
73
|
+
const maxLines = fit.maxLines || 3;
|
|
74
|
+
for (let size = grid(fit.max); size >= fit.min; size = grid(size - Math.max(1, fit.pixelGrid || 2))) {
|
|
75
|
+
const lines = wrapWords(text, fit.maxWidth, measureFor(ctx, el, size));
|
|
76
|
+
if (lines.length <= maxLines && lines.every((line) => measureFor(ctx, el, size)(line) <= fit.maxWidth)) return { size, lines };
|
|
77
|
+
if (size <= fit.min) break;
|
|
78
|
+
}
|
|
79
|
+
const size = grid(fit.min);
|
|
80
|
+
return { size, lines: wrapWords(text, fit.maxWidth, measureFor(ctx, el, size)) };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const normalize = (text) => String(text).replace(/\s+/gu, ' ').trim();
|
|
84
|
+
|
|
85
|
+
export function compileText(ctx, el, post = { zoom: 1, shake: [0, 0] }) {
|
|
86
|
+
const { size, lines } = fitSize(ctx, el);
|
|
87
|
+
const cjk = /[가-힣]/u.test(el.text);
|
|
88
|
+
const lineHeight = el.lineHeight || (lines.length >= 3 ? 1.6 : cjk ? 1.6 : 1.5);
|
|
89
|
+
const scale = el.scale ?? 1;
|
|
90
|
+
const baseY = el.y - ((lines.length - 1) * size * lineHeight) / 2;
|
|
91
|
+
const words = el.words || null;
|
|
92
|
+
const wordOfChar = [];
|
|
93
|
+
if (words) eojeols(el.text).forEach((word, wi) => { for (let i = 0; i < Array.from(word).length; i++) wordOfChar.push(wi); wordOfChar.push(wi); });
|
|
94
|
+
const draws = [], placedVisible = [];
|
|
95
|
+
let charBase = 0, allSettled = (el.alpha ?? 1) >= 0.999 && scale === 1;
|
|
96
|
+
const runs = [];
|
|
97
|
+
lines.forEach((line, li) => {
|
|
98
|
+
const layout = layoutLine(line, size, (run) => ctx.fonts.get(resolveFontId(ctx.presetId, el.voice, run.script, el.weight, el.widthStep)), () => el.trackingEm || 0);
|
|
99
|
+
for (const run of layout.runs) runs.push({ script: run.script, fontFile: run.font.file, trackingEm: run.trackingEm, widthStep: run.script === 'latin' && el.voice === 'display' ? (el.widthStep || 100) : null });
|
|
100
|
+
const ox = el.x - (el.align === 'center' ? layout.width / 2 : 0);
|
|
101
|
+
const oy = baseY + li * size * lineHeight;
|
|
102
|
+
for (const g of layout.glyphs) {
|
|
103
|
+
const global = charBase + g.index;
|
|
104
|
+
if (el.visibleChars != null && global >= el.visibleChars) continue;
|
|
105
|
+
const w = words ? words[wordOfChar[global]] || { alpha: 1, dy: 0, role: el.role } : { alpha: 1, dy: 0, role: el.role };
|
|
106
|
+
const alpha = clamp((el.alpha ?? 1) * w.alpha);
|
|
107
|
+
if (alpha < 0.002 || !g.glyph.bbox) continue;
|
|
108
|
+
if (alpha < 0.999 || w.dy) allSettled = false;
|
|
109
|
+
const gx = ox + g.x, gy = oy + (w.dy || 0);
|
|
110
|
+
const px = el.x + (gx - el.x) * scale, py = el.y + (gy - el.y) * scale;
|
|
111
|
+
const fill = colorFor(ctx, w.role || el.role);
|
|
112
|
+
draws.push({ key: `${g.font.id}#${g.glyph.index}`, font: g.font, glyph: g.glyph, x: px, y: py, s: g.scale * scale, fill, alpha });
|
|
113
|
+
placedVisible.push({ glyph: g.glyph, scale: g.scale, uniform: scale, px, py, fill });
|
|
114
|
+
}
|
|
115
|
+
charBase += Array.from(line).length + 1;
|
|
116
|
+
});
|
|
117
|
+
const raw = inkBounds(placedVisible);
|
|
118
|
+
const bbox = raw && postTransformBox(raw, post);
|
|
119
|
+
const fills = [...new Set(placedVisible.map((p) => p.fill))];
|
|
120
|
+
const primary = runs[0]?.fontFile || '';
|
|
121
|
+
const scripts = [...new Set(runs.map((r) => r.script))];
|
|
122
|
+
const box = bbox && {
|
|
123
|
+
elementId: el.id, text: normalize(el.text), voice: el.voice, fontFile: primary,
|
|
124
|
+
fontSizePx: round(size * scale), capHeightPx: round(ctx.fonts.get(resolveFontId(ctx.presetId, el.voice, scripts[0] || 'latin', el.weight, el.widthStep)).capHeight * size / ctx.fonts.get(resolveFontId(ctx.presetId, el.voice, scripts[0] || 'latin', el.weight, el.widthStep)).upm * scale),
|
|
125
|
+
weight: el.weight ?? 400, fill: fills.length === 1 ? fills[0] : fills.length ? 'mixed' : colorFor(ctx, el.role),
|
|
126
|
+
fills, bbox: bbox.map(round), lines, lineHeight, trackingEm: el.trackingEm || 0,
|
|
127
|
+
script: scripts.length > 1 ? 'mixed' : scripts[0] || 'latin', runs: dedupeRuns(runs),
|
|
128
|
+
scaleX: scale, scaleY: scale, settled: allSettled, role: el.role, blockId: el.blockId || null,
|
|
129
|
+
outline: false, halo: false,
|
|
130
|
+
};
|
|
131
|
+
return { draws, box, size };
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const dedupeRuns = (runs) => {
|
|
135
|
+
const seen = new Map();
|
|
136
|
+
for (const r of runs) seen.set(`${r.script}|${r.fontFile}|${r.trackingEm}|${r.widthStep}`, r);
|
|
137
|
+
return [...seen.values()];
|
|
138
|
+
};
|
|
139
|
+
const round = (x) => Math.round(x * 100) / 100;
|
|
140
|
+
|
|
141
|
+
export function postTransformBox([x0, y0, x1, y1], post) {
|
|
142
|
+
const z = post.zoom ?? 1, [sx, sy] = post.shake ?? [0, 0];
|
|
143
|
+
const cx = FRAME.width / 2, cy = FRAME.height / 2;
|
|
144
|
+
return [(x0 - cx) * z + cx + sx, (y0 - cy) * z + cy + sy, (x1 - cx) * z + cx + sx, (y1 - cy) * z + cy + sy];
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export function compileStroke(ctx, st, post) {
|
|
148
|
+
const font = ctx.strokeFonts.get(st.font);
|
|
149
|
+
const layout = ctx.strokeLayouts.get(`${st.font}|${st.text}|${st.size}`) || strokeText(font, st.text, st.size);
|
|
150
|
+
ctx.strokeLayouts.set(`${st.font}|${st.text}|${st.size}`, layout);
|
|
151
|
+
const len = st.t === Infinity ? layout.total : writtenLength(layout, st.charTimes, st.t);
|
|
152
|
+
const polylines = writtenStrokes(layout, len).map((flat) => flat.map((v, i) => (i % 2 === 0 ? v + st.x : v + st.y)));
|
|
153
|
+
let x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;
|
|
154
|
+
for (const flat of polylines) for (let i = 0; i < flat.length; i += 2) {
|
|
155
|
+
x0 = Math.min(x0, flat[i]); x1 = Math.max(x1, flat[i]); y0 = Math.min(y0, flat[i + 1]); y1 = Math.max(y1, flat[i + 1]);
|
|
156
|
+
}
|
|
157
|
+
const fill = colorFor(ctx, st.role);
|
|
158
|
+
const half = st.width / 2;
|
|
159
|
+
const box = Number.isFinite(x0) ? {
|
|
160
|
+
elementId: st.id, text: st.text, voice: 'stroke', fontFile: font.file, fontSizePx: st.size, capHeightPx: round(st.size * 0.7),
|
|
161
|
+
weight: 400, fill, fills: [fill], bbox: postTransformBox([x0 - half, y0 - half, x1 + half, y1 + half], post).map(round),
|
|
162
|
+
lines: [st.text], lineHeight: 1, trackingEm: 0, script: 'latin', runs: [{ script: 'latin', fontFile: font.file, trackingEm: 0, widthStep: null }],
|
|
163
|
+
scaleX: 1, scaleY: 1, settled: len >= layout.total - 1e-6 && (st.alpha ?? 1) >= 0.999, role: st.role, blockId: null, outline: false, halo: false,
|
|
164
|
+
} : null;
|
|
165
|
+
return { stroke: { polylines, width: st.width, fill, alpha: st.alpha ?? 1 }, box, total: layout.total };
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Terminal chrome drawn as flat Canvas2D graphics plus two small type elements. Both
|
|
169
|
+
// use the signal hue: the dim grey drops under 4.5:1 once scanlines and dither thin it.
|
|
170
|
+
function terminalElements(ctx, term, typedBox) {
|
|
171
|
+
const preset = PRESETS.terminalcore;
|
|
172
|
+
const [x, y, w, h] = term.window;
|
|
173
|
+
const line = preset.palette.secondary, panel = preset.palette.panel;
|
|
174
|
+
const rects = [
|
|
175
|
+
{ id: 'term:panel', x, y, w, h, fill: panel, alpha: 1, role: 'panel' },
|
|
176
|
+
{ id: 'term:title', x, y, w, h: term.titleBar, fill: '#111820', alpha: 1, role: 'panel' },
|
|
177
|
+
{ id: 'term:top', x, y, w, h: 1.5, fill: line, alpha: 1, role: 'chrome' },
|
|
178
|
+
{ id: 'term:bottom', x, y: y + h - 1.5, w, h: 1.5, fill: line, alpha: 1, role: 'chrome' },
|
|
179
|
+
{ id: 'term:left', x, y, w: 1.5, h, fill: line, alpha: 1, role: 'chrome' },
|
|
180
|
+
{ id: 'term:right', x: x + w - 1.5, y, w: 1.5, h, fill: line, alpha: 1, role: 'chrome' },
|
|
181
|
+
{ id: 'term:sep', x, y: y + term.titleBar, w, h: 1.5, fill: line, alpha: 1, role: 'chrome' },
|
|
182
|
+
];
|
|
183
|
+
term.meters.forEach((value, i) => {
|
|
184
|
+
rects.push({ id: `term:meter${i}`, x: x + w - 380, y: y + h - 58 + i * 20, w: 300, h: 8, fill: '#16202A', alpha: 1, role: 'panel' });
|
|
185
|
+
rects.push({ id: `term:meterfill${i}`, x: x + w - 380, y: y + h - 58 + i * 20, w: Math.max(2, 300 * clamp(value)), h: 8, fill: ctx.signal, alpha: 1, role: 'emphasis' });
|
|
186
|
+
});
|
|
187
|
+
if (term.caret && typedBox) {
|
|
188
|
+
const on = !term.caret.visibleAfterType || Math.floor(term.caret.t * term.caret.blinkHz * 2) % 2 === 0;
|
|
189
|
+
if (on) {
|
|
190
|
+
const [, by0, bx1, by1] = typedBox.bbox;
|
|
191
|
+
rects.push({ id: 'term:caret', x: bx1 + 14, y: by0, w: Math.max(12, (by1 - by0) * 0.5), h: by1 - by0, fill: ctx.signal, alpha: 1, role: 'emphasis' });
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
const texts = [
|
|
195
|
+
{ id: 'term:label', text: term.title.toUpperCase(), voice: 'label', role: 'emphasis', size: 32, weight: 400, x: x + 32, y: y + 30, alpha: 1, trackingEm: 0.04 },
|
|
196
|
+
{ id: 'term:status', text: term.status, voice: 'machine', role: 'emphasis', size: 28, weight: 400, x: x + 32, y: y + h - 30, alpha: 1, trackingEm: 0 },
|
|
197
|
+
].filter((el) => el.text);
|
|
198
|
+
return { rects, texts };
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export class FrameComposer {
|
|
202
|
+
constructor({ fonts, strokeFonts, presetId, signal, timeline, plan, fps = FRAME.fps, durationSec, runSeed, software, brief, accent }) {
|
|
203
|
+
this.ctx = { fonts, strokeFonts, presetId, signal, strokeLayouts: new Map() };
|
|
204
|
+
this.preset = PRESETS[presetId];
|
|
205
|
+
this.timeline = timeline;
|
|
206
|
+
this.shots = shotsOf(timeline);
|
|
207
|
+
this.plan = plan;
|
|
208
|
+
this.fps = fps;
|
|
209
|
+
this.durationSec = durationSec;
|
|
210
|
+
this.runSeed = runSeed;
|
|
211
|
+
this.software = software;
|
|
212
|
+
this.brief = brief;
|
|
213
|
+
this.accent = accent;
|
|
214
|
+
this.states = new Map();
|
|
215
|
+
this.sent = new Set();
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Timeline times are rounded to 6 decimals, so a start can sit up to 5e-7 s
|
|
219
|
+
// after its frame time; a 1e-6 tolerance keeps the cut on its own frame.
|
|
220
|
+
shotIndexAt(t) {
|
|
221
|
+
const i = this.shots.findIndex((s) => t >= s.start - 1e-6 && t < s.end - 1e-6);
|
|
222
|
+
return i < 0 ? this.shots.length - 1 : i;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Stateful scenes integrate on a fixed 1/fps grid from the shot start; a
|
|
226
|
+
// backward jump resets and re-integrates (the engine-side preroll).
|
|
227
|
+
stateFor(module, shot, t) {
|
|
228
|
+
if (!module.stateful) return null;
|
|
229
|
+
const key = `${shot.sceneId}#${shot.shotIndex}`;
|
|
230
|
+
const target = Math.max(0, Math.floor((t - shot.start) * this.fps + 1e-6));
|
|
231
|
+
let state = this.states.get(key);
|
|
232
|
+
if (!state || state.steps > target) state = module.reset();
|
|
233
|
+
const { target: value, decimals } = counterTarget(shot.text);
|
|
234
|
+
while (state.steps < target) state = module.step(state, value, this.fps, decimals);
|
|
235
|
+
this.states.set(key, state);
|
|
236
|
+
return state;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
sceneAt(t, { still = false, reduced = false, shotIndex = null } = {}) {
|
|
240
|
+
const index = shotIndex ?? this.shotIndexAt(t);
|
|
241
|
+
const shot = this.shots[index];
|
|
242
|
+
const module = SCENE_MODULES[shot.sceneId];
|
|
243
|
+
const hold = shot.end - shot.start;
|
|
244
|
+
const lt = still ? hold : Math.max(0, t - shot.start);
|
|
245
|
+
const f = {
|
|
246
|
+
t, lt, p: clamp(lt / hold), hold, beat: 60 / (this.brief.bpm || 100), fps: this.fps,
|
|
247
|
+
shot, reveals: revealsOf(this.timeline, shot), preset: this.preset, tokens: this.preset.motion,
|
|
248
|
+
still, reduced, duration: this.durationSec, shotNumber: index + 1, shotCount: this.shots.length,
|
|
249
|
+
showIndex: this.brief.index === true, windowTitle: typeof this.brief.windowTitle === 'string' ? this.brief.windowTitle : '', firstLine: this.shots[0].text,
|
|
250
|
+
accent: this.accent && this.accent.shotId === shot.id ? this.accent : null,
|
|
251
|
+
state: still ? null : this.stateFor(module, shot, t),
|
|
252
|
+
};
|
|
253
|
+
return { shot, index, display: module.render(f), stateful: Boolean(module.stateful) };
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
overridesFor(display, { still } = {}) {
|
|
257
|
+
const post = { ...this.preset.post, exposure: 1, fade: 1, flash: 0, shake: [0, 0], zoom: 1, invert: false, ...(display.overrides || {}) };
|
|
258
|
+
if (still) post.grain = 0;
|
|
259
|
+
for (const [key, [min, max]] of Object.entries(OVERRIDES)) {
|
|
260
|
+
if (typeof post[key] !== 'number') continue;
|
|
261
|
+
post[key] = Math.max(min, max == null ? post[key] : Math.min(max, post[key]));
|
|
262
|
+
}
|
|
263
|
+
return post;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
compileSample(t, opts) {
|
|
267
|
+
const { shot, display } = this.sceneAt(t, opts);
|
|
268
|
+
const post = this.overridesFor(display, opts);
|
|
269
|
+
const glyphs = [], strokes = [], rects = [], rules = [], boxes = [], graphics = [];
|
|
270
|
+
const compiled = display.texts.map((el) => ({ el, out: compileText(this.ctx, el, post) }));
|
|
271
|
+
let typedBox = null;
|
|
272
|
+
for (const { el, out } of compiled) {
|
|
273
|
+
glyphs.push(...out.draws);
|
|
274
|
+
if (out.box) boxes.push(out.box);
|
|
275
|
+
if (display.terminal?.caret?.after === el.id) typedBox = out.box;
|
|
276
|
+
}
|
|
277
|
+
for (const st of display.strokes || []) {
|
|
278
|
+
const out = compileStroke(this.ctx, st, post);
|
|
279
|
+
strokes.push(out.stroke);
|
|
280
|
+
if (out.box) boxes.push(out.box);
|
|
281
|
+
}
|
|
282
|
+
let terminal = null;
|
|
283
|
+
if (display.terminal) {
|
|
284
|
+
const chrome = terminalElements(this.ctx, display.terminal, typedBox);
|
|
285
|
+
for (const el of chrome.texts) {
|
|
286
|
+
const out = compileText(this.ctx, el, post);
|
|
287
|
+
glyphs.push(...out.draws);
|
|
288
|
+
if (out.box) boxes.push(out.box);
|
|
289
|
+
}
|
|
290
|
+
terminal = chrome.rects;
|
|
291
|
+
for (const r of chrome.rects) graphics.push({ id: r.id, bbox: postTransformBox([r.x, r.y, r.x + r.w, r.y + r.h], post).map(round), fill: r.fill, role: r.role, area: [r.w, r.h] });
|
|
292
|
+
}
|
|
293
|
+
for (const r of display.rects || []) {
|
|
294
|
+
const fill = colorFor(this.ctx, r.role);
|
|
295
|
+
rects.push({ ...r, fill });
|
|
296
|
+
graphics.push({ id: r.id, bbox: postTransformBox([r.x, r.y, r.x + r.w, r.y + r.h], post).map(round), fill, role: r.role, area: [r.w, r.h] });
|
|
297
|
+
}
|
|
298
|
+
for (const r of display.rules || []) {
|
|
299
|
+
const fill = colorFor(this.ctx, r.role);
|
|
300
|
+
if (Math.hypot(r.x1 - r.x0, r.y1 - r.y0) < 0.5) continue;
|
|
301
|
+
rules.push({ ...r, fill });
|
|
302
|
+
const h = r.width / 2;
|
|
303
|
+
graphics.push({ id: r.id, bbox: postTransformBox([Math.min(r.x0, r.x1) - h, Math.min(r.y0, r.y1) - h, Math.max(r.x0, r.x1) + h, Math.max(r.y0, r.y1) + h], post).map(round), fill, role: r.role, area: [Math.abs(r.x1 - r.x0) + r.width, Math.abs(r.y1 - r.y0) + r.width] });
|
|
304
|
+
}
|
|
305
|
+
return { t, shot, post, glyphs, strokes, rects, rules, terminal, boxes, graphics, block: display.block || null };
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// Page payload for one output frame: N sub-samples (MO-A-28), the post of
|
|
309
|
+
// sample floor(N/2), and new glyph outlines the page has not cached yet.
|
|
310
|
+
// `settled` renders a shot's resolved end state with grain and random noise
|
|
311
|
+
// at 0 (poster, reduced-motion still; MO-A-39/40); every other mode renders
|
|
312
|
+
// the real moment at the frame's own time. Every sub-sample draws the frame's
|
|
313
|
+
// own shot: on a cut frame the pinned early samples fall before the cut, and
|
|
314
|
+
// drawing the old shot there would turn a hard cut into a half dissolve.
|
|
315
|
+
frameSpec(frameIndex, { samples = 1, shutter = 0.5, settled = null } = {}) {
|
|
316
|
+
const tn = frameIndex / this.fps;
|
|
317
|
+
const times = settled ? [tn] : sampleTimes(frameIndex, this.fps, samples, shutter);
|
|
318
|
+
const mid = Math.floor(times.length / 2);
|
|
319
|
+
const frameShot = this.shotIndexAt(tn);
|
|
320
|
+
const compiled = times.map((t) => this.compileSample(t, settled ? { still: true, reduced: Boolean(settled.reduced), shotIndex: settled.shotIndex } : { shotIndex: frameShot }));
|
|
321
|
+
const defs = {};
|
|
322
|
+
for (const s of compiled) for (const d of s.glyphs) {
|
|
323
|
+
if (!this.sent.has(d.key)) { this.sent.add(d.key); defs[d.key] = { upm: d.font.upm, path: d.glyph.pathData() }; }
|
|
324
|
+
}
|
|
325
|
+
const main = compiled[mid];
|
|
326
|
+
const outShot = settled ? main.shot : this.shots[frameShot];
|
|
327
|
+
const passes = this.passUniforms(frameIndex, settled ? main.shot.end : tn, outShot, { settled: Boolean(settled) });
|
|
328
|
+
const spec = {
|
|
329
|
+
frame: frameIndex, mid, settled: Boolean(settled), defs,
|
|
330
|
+
samples: compiled.map((s) => ({
|
|
331
|
+
t: s.t,
|
|
332
|
+
background: this.preset.palette.background,
|
|
333
|
+
tidal: passes.tidal ? this.tidalFor(settled ? s.shot.end : s.t, s.shot, { settled: Boolean(settled) }) : null,
|
|
334
|
+
glyphs: s.glyphs.map((d) => [d.key, round(d.x), round(d.y), d.s, d.fill, round(d.alpha)]),
|
|
335
|
+
strokes: s.strokes, rects: s.rects, rules: s.rules, terminal: s.terminal,
|
|
336
|
+
})),
|
|
337
|
+
passes: { crt: passes.crt, dither: passes.dither, glitch: passes.glitch, swissGrid: passes.swissGrid, terminalUi: passes.terminalUi },
|
|
338
|
+
post: { ...main.post, grainSeed: frameIndex, invert: Boolean(main.post.invert) },
|
|
339
|
+
frameTime: tn,
|
|
340
|
+
};
|
|
341
|
+
const meta = {
|
|
342
|
+
sceneId: outShot.sceneId, shotIndex: outShot.shotIndex, shotId: outShot.id, sampleTimes: times.map(round6),
|
|
343
|
+
textBoxes: main.boxes, graphics: main.graphics, block: main.block,
|
|
344
|
+
fills: this.fillsFor(main, passes),
|
|
345
|
+
overrides: { flash: main.post.flash, invert: Boolean(main.post.invert), zoom: main.post.zoom, shake: main.post.shake, fade: main.post.fade, grain: main.post.grain },
|
|
346
|
+
accent: main.rects.some((r) => r.role === 'accent') || main.boxes.some((b) => b.role === 'accent'),
|
|
347
|
+
};
|
|
348
|
+
return { spec, meta };
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
fillsFor(sample, passes) {
|
|
352
|
+
const out = [{ hex: this.preset.palette.background, w: FRAME.width, h: FRAME.height, role: 'background' }];
|
|
353
|
+
if (passes.tidal) for (const hex of this.preset.passes.includes('tidal-gradient') ? [this.preset.palette.stopA, this.preset.palette.stopB] : []) out.push({ hex, w: FRAME.width, h: FRAME.height, role: 'gradient' });
|
|
354
|
+
for (const b of sample.boxes) for (const hex of b.fills || [b.fill]) {
|
|
355
|
+
if (!/^#/.test(hex)) continue;
|
|
356
|
+
out.push({ hex, w: b.bbox[2] - b.bbox[0], h: b.bbox[3] - b.bbox[1], role: b.role === 'emphasis' ? 'emphasis' : 'text' });
|
|
357
|
+
}
|
|
358
|
+
for (const r of sample.rects) out.push({ hex: r.fill, w: r.w, h: r.h, role: r.role });
|
|
359
|
+
for (const r of sample.terminal || []) out.push({ hex: r.fill, w: r.w, h: r.h, role: r.role });
|
|
360
|
+
return out;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
rangeFor(pass, frameIndex) {
|
|
364
|
+
return this.plan.passRanges.find((r) => r.pass === pass && frameIndex >= r.frameStart && frameIndex <= r.frameEnd)
|
|
365
|
+
|| this.plan.passRanges.filter((r) => r.pass === pass).at(-1) || null;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
tidalFor(t, shot, { settled }) {
|
|
369
|
+
const range = this.plan.passRanges.find((r) => r.pass === 'tidal-gradient' && r.sceneId === shot.sceneId && r.shotIndex === shot.shotIndex);
|
|
370
|
+
if (!range) return null;
|
|
371
|
+
const p = range.params;
|
|
372
|
+
let surge = 0;
|
|
373
|
+
if (!settled) for (const s of p.surges) {
|
|
374
|
+
const dt = t - s.t;
|
|
375
|
+
if (dt < 0) continue;
|
|
376
|
+
const up = clamp(dt / s.attack), down = clamp((dt - s.attack) / s.decay);
|
|
377
|
+
surge = Math.max(surge, dt < s.attack ? up * up * (3 - 2 * up) : 1 - down * down * (3 - 2 * down));
|
|
378
|
+
}
|
|
379
|
+
return {
|
|
380
|
+
u_time: t, u_seed: range.seed, u_paletteStops: p.paletteStopsHex, u_flowSpeed: p.flowSpeed, u_warpAmount: p.warpAmount,
|
|
381
|
+
u_curlStrength: p.curlStrength, u_octaves: p.octaves, u_surge: surge * p.surgeOnHit, u_ditherAmount: settled ? 0 : p.ditherAmount,
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
passUniforms(frameIndex, t, shot, { settled }) {
|
|
386
|
+
const out = {};
|
|
387
|
+
const has = (pass) => this.preset.passes.includes(pass);
|
|
388
|
+
if (has('tidal-gradient')) out.tidal = true;
|
|
389
|
+
if (has('swiss-grid')) {
|
|
390
|
+
const r = this.rangeFor('swiss-grid', frameIndex);
|
|
391
|
+
out.swissGrid = { u_columns: r.params.columns, u_gutterPx: r.params.gutterPx, u_marginPx: r.params.marginPx, u_baselinePx: r.params.baselinePx, u_moduleSnap: true, u_showGuides: r.params.showGuides, u_hairlineWidthPx: 1 };
|
|
392
|
+
}
|
|
393
|
+
if (has('terminal-ui')) {
|
|
394
|
+
const r = this.rangeFor('terminal-ui', frameIndex);
|
|
395
|
+
out.terminalUi = { u_charGridPx: [14, 24], u_windowChromeWidthPx: 1.5, u_meterCount: r.params.meterCount, u_logLineRateCharsPerSec: r.params.logLineRateCharsPerSec, u_caretBlinkHz: r.params.caretBlinkHz, u_seed: r.seed };
|
|
396
|
+
}
|
|
397
|
+
if (has('crt')) {
|
|
398
|
+
const r = this.rangeFor('crt', frameIndex);
|
|
399
|
+
const p = r.params;
|
|
400
|
+
const boot = this.plan.events.find((e) => e.kind === 'boot-flicker' && t >= e.t && t < e.t + e.duration);
|
|
401
|
+
out.crt = {
|
|
402
|
+
u_time: t, u_seed: r.seed, u_scanlineFreqPerFrame: p.scanlineFreq, u_scanlineDepth: p.scanlineDepth,
|
|
403
|
+
u_phosphorPersistence: settled ? 0 : p.phosphorPersistence, u_bloomAmount: 0.2, u_curvature: p.curvature, u_vignette: p.vignette,
|
|
404
|
+
u_triadMaskAmount: p.triadMaskAmount, u_flickerAmp: settled ? 0 : (boot ? p.bootFlickerAmp : p.flickerAmp), u_flickerFreqHz: p.flickerFreqHz,
|
|
405
|
+
persistenceEnabled: Boolean(p.persistenceEnabled) && !settled, shotKey: `${r.sceneId}#${r.shotIndex}`, shotStartFrame: r.frameStart,
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
if (has('dither')) {
|
|
409
|
+
const r = this.rangeFor('dither', frameIndex);
|
|
410
|
+
out.dither = { u_ditherMode: r.params.mode, u_paletteSize: r.params.paletteSize, u_pixelScale: r.params.pixelScale, u_ditherStrength: r.params.ditherStrength, u_seed: r.seed };
|
|
411
|
+
}
|
|
412
|
+
if (has('glitch')) {
|
|
413
|
+
const r = this.rangeFor('glitch', frameIndex);
|
|
414
|
+
const hitIndex = settled ? -1 : r.params.hits.findIndex((h) => frameIndex >= h.frame && frameIndex < h.frame + h.holdFrames);
|
|
415
|
+
const hit = hitIndex >= 0 ? r.params.hits[hitIndex] : null;
|
|
416
|
+
out.glitch = { u_time: t, u_seed: r.seed, u_intensity: r.params.intensity, u_active: hit ? 1 : 0, u_slices: hit ? hit.slices : [], u_rgbSplitPx: r.params.rgbSplitPx, u_hitIndex: hitIndex };
|
|
417
|
+
}
|
|
418
|
+
return out;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
const round6 = (x) => Math.round(x * 1e6) / 1e6;
|
|
423
|
+
|
|
424
|
+
// MO-A-28: t = max(0, t_n + (shutter / fps) * ((i + 0.5) / N - 0.5)).
|
|
425
|
+
export function sampleTimes(frameIndex, fps, samples, shutter) {
|
|
426
|
+
const tn = frameIndex / fps;
|
|
427
|
+
return Array.from({ length: samples }, (_, i) => Math.max(0, tn + (shutter / fps) * ((i + 0.5) / samples - 0.5)));
|
|
428
|
+
}
|