@litfamily/lithermes 1.0.8 → 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 +53 -2
- 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,622 @@
|
|
|
1
|
+
/* LitHermes typographic-motion renderer, browser half.
|
|
2
|
+
* Raw WebGL2 re-expression of mexicat/pdoom-video's gl.ts (fullscreen passes,
|
|
3
|
+
* half-float targets, Canvas2D layers as textures), lines.ts (instanced capsule
|
|
4
|
+
* hairlines), post.ts (bloom pyramid, halation, CA, shoulder, grain, vignette,
|
|
5
|
+
* flash, shake/zoom) and glsl/common.ts (hashes, simplex/fbm, curl, sRGB), MIT,
|
|
6
|
+
* see NOTICE. The six look passes are original GLSL. Every uniform write goes
|
|
7
|
+
* through setPass(), which records the per-pass uniforms and draw count that
|
|
8
|
+
* the render log needs (MO-SH-00a). Nothing here reads a clock for pixels.
|
|
9
|
+
*/
|
|
10
|
+
(() => {
|
|
11
|
+
const COMMON = `
|
|
12
|
+
#define PI 3.14159265359
|
|
13
|
+
float sat(float x) { return clamp(x, 0.0, 1.0); }
|
|
14
|
+
vec3 sat(vec3 x) { return clamp(x, 0.0, 1.0); }
|
|
15
|
+
float luma(vec3 c) { return dot(c, vec3(0.2126, 0.7152, 0.0722)); }
|
|
16
|
+
float hash12(vec2 p) { vec3 p3 = fract(vec3(p.xyx) * .1031); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.x + p3.y) * p3.z); }
|
|
17
|
+
vec2 hash22(vec2 p) { vec3 p3 = fract(vec3(p.xyx) * vec3(.1031, .1030, .0973)); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.xx + p3.yz) * p3.zy); }
|
|
18
|
+
vec2 seedOffset(uint s) { return vec2(float(s & 0xFFFFu), float((s >> 16) & 0xFFFFu)) / 65535.0; }
|
|
19
|
+
vec3 _m289(vec3 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }
|
|
20
|
+
vec4 _m289(vec4 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }
|
|
21
|
+
vec4 _perm(vec4 x) { return _m289(((x * 34.0) + 10.0) * x); }
|
|
22
|
+
float snoise(vec3 v) {
|
|
23
|
+
const vec2 C = vec2(1.0 / 6.0, 1.0 / 3.0); const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);
|
|
24
|
+
vec3 i = floor(v + dot(v, C.yyy)); vec3 x0 = v - i + dot(i, C.xxx);
|
|
25
|
+
vec3 g = step(x0.yzx, x0.xyz); vec3 l = 1.0 - g; vec3 i1 = min(g.xyz, l.zxy); vec3 i2 = max(g.xyz, l.zxy);
|
|
26
|
+
vec3 x1 = x0 - i1 + C.xxx; vec3 x2 = x0 - i2 + C.yyy; vec3 x3 = x0 - D.yyy;
|
|
27
|
+
i = _m289(i);
|
|
28
|
+
vec4 p = _perm(_perm(_perm(i.z + vec4(0.0, i1.z, i2.z, 1.0)) + i.y + vec4(0.0, i1.y, i2.y, 1.0)) + i.x + vec4(0.0, i1.x, i2.x, 1.0));
|
|
29
|
+
float n_ = 0.142857142857; vec3 ns = n_ * D.wyz - D.xzx;
|
|
30
|
+
vec4 j = p - 49.0 * floor(p * ns.z * ns.z); vec4 x_ = floor(j * ns.z); vec4 y_ = floor(j - 7.0 * x_);
|
|
31
|
+
vec4 x = x_ * ns.x + ns.yyyy; vec4 y = y_ * ns.x + ns.yyyy; vec4 h = 1.0 - abs(x) - abs(y);
|
|
32
|
+
vec4 b0 = vec4(x.xy, y.xy); vec4 b1 = vec4(x.zw, y.zw);
|
|
33
|
+
vec4 s0 = floor(b0) * 2.0 + 1.0; vec4 s1 = floor(b1) * 2.0 + 1.0; vec4 sh = -step(h, vec4(0.0));
|
|
34
|
+
vec4 a0 = b0.xzyw + s0.xzyw * sh.xxyy; vec4 a1 = b1.xzyw + s1.xzyw * sh.zzww;
|
|
35
|
+
vec3 p0 = vec3(a0.xy, h.x); vec3 p1 = vec3(a0.zw, h.y); vec3 p2 = vec3(a1.xy, h.z); vec3 p3 = vec3(a1.zw, h.w);
|
|
36
|
+
vec4 norm = 1.79284291400159 - 0.85373472095314 * vec4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3));
|
|
37
|
+
p0 *= norm.x; p1 *= norm.y; p2 *= norm.z; p3 *= norm.w;
|
|
38
|
+
vec4 m = max(0.5 - vec4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0); m = m * m;
|
|
39
|
+
return 105.0 * dot(m * m, vec4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3)));
|
|
40
|
+
}
|
|
41
|
+
vec3 toSRGB(vec3 c) { return mix(12.92 * c, 1.055 * pow(max(c, 0.0), vec3(1.0 / 2.4)) - 0.055, step(0.0031308, c)); }
|
|
42
|
+
vec3 toLinear(vec3 c) { return mix(c / 12.92, pow((c + 0.055) / 1.055, vec3(2.4)), step(0.04045, c)); }
|
|
43
|
+
`;
|
|
44
|
+
|
|
45
|
+
const VERT = `#version 300 es
|
|
46
|
+
in vec2 a_pos; out vec2 vUv;
|
|
47
|
+
void main() { vUv = a_pos * 0.5 + 0.5; gl_Position = vec4(a_pos, 0.0, 1.0); }`;
|
|
48
|
+
|
|
49
|
+
const FRAG = {
|
|
50
|
+
// Background fill in linear light.
|
|
51
|
+
clear: `uniform vec3 u_color; void main() { fragColor = vec4(u_color, 0.0); }`,
|
|
52
|
+
// tidal-gradient (MO-SH-06): domain-warped simplex flow between 2-3 stops,
|
|
53
|
+
// seeded origin per shot, surge envelope computed on the CPU (attack/decay >= 0.1 s).
|
|
54
|
+
tidal: `uniform float u_time; uniform uint u_seed; uniform vec3 u_stopA; uniform vec3 u_stopB; uniform vec3 u_base;
|
|
55
|
+
uniform float u_flowSpeed, u_warpAmount, u_curlStrength, u_surge, u_ditherAmount; uniform int u_octaves; uniform vec2 u_res;
|
|
56
|
+
float fbm3(vec3 p) { float s = 0.0, a = 0.5; for (int i = 0; i < 6; i++) { if (i >= u_octaves) break; s += a * snoise(p); p = p * 2.03 + 11.7; a *= 0.5; } return s; }
|
|
57
|
+
void main() {
|
|
58
|
+
vec2 uv = vUv * vec2(u_res.x / u_res.y, 1.0) * 1.4 + seedOffset(u_seed) * 40.0;
|
|
59
|
+
float tt = u_time * u_flowSpeed;
|
|
60
|
+
vec2 w = vec2(fbm3(vec3(uv, tt)), fbm3(vec3(uv + 5.2, tt + 1.3)));
|
|
61
|
+
vec2 c = vec2(snoise(vec3(uv * 0.7, tt + 9.1)), snoise(vec3(uv * 0.7 + 3.3, tt + 4.7))) * u_curlStrength;
|
|
62
|
+
float n = fbm3(vec3(uv + w * u_warpAmount * 2.0 + c, tt * 0.5));
|
|
63
|
+
float k = smoothstep(-0.55, 0.55, n);
|
|
64
|
+
vec3 col = mix(u_stopA, u_stopB, k);
|
|
65
|
+
col = mix(u_base, col, 0.55 + 0.45 * smoothstep(-0.8, 0.8, w.x));
|
|
66
|
+
col *= 1.0 + u_surge * 0.35;
|
|
67
|
+
col += (hash12(gl_FragCoord.xy + seedOffset(u_seed) * 977.0) - 0.5) * u_ditherAmount * 0.02;
|
|
68
|
+
fragColor = vec4(max(col, 0.0), 0.0);
|
|
69
|
+
}`,
|
|
70
|
+
// Canvas2D layer (straight alpha, sRGB) over the target in linear light.
|
|
71
|
+
layer: `uniform sampler2D u_tex;
|
|
72
|
+
void main() { vec4 c = texture(u_tex, vUv); fragColor = vec4(toLinear(c.rgb) * c.a, c.a); }`,
|
|
73
|
+
// Average N sub-samples; only sample floor(N/2) contributes the glyph mask.
|
|
74
|
+
accumulate: `uniform sampler2D u_tex; uniform float u_weight; uniform float u_maskWeight;
|
|
75
|
+
void main() { vec4 c = texture(u_tex, vUv); fragColor = vec4(c.rgb * u_weight, c.a * u_maskWeight); }`,
|
|
76
|
+
// crt (MO-SH-07): barrel curvature, scanlines, seeded triad grain, capped flicker, vignette,
|
|
77
|
+
// phosphor persistence from the two previous composites of the same shot.
|
|
78
|
+
crt: `uniform sampler2D u_tex; uniform sampler2D u_prev1; uniform sampler2D u_prev2; uniform float u_time; uniform uint u_seed;
|
|
79
|
+
uniform float u_scanlineFreqPerFrame, u_scanlineDepth, u_phosphorPersistence, u_curvature, u_vignette, u_triadMaskAmount, u_flickerAmp, u_flickerFreqHz;
|
|
80
|
+
uniform float u_prevCount; uniform vec2 u_res;
|
|
81
|
+
void main() {
|
|
82
|
+
vec2 dc = vUv - 0.5; float r2 = dot(dc, dc);
|
|
83
|
+
vec2 uv = 0.5 + dc * (1.0 - u_curvature * r2);
|
|
84
|
+
vec4 c = texture(u_tex, uv);
|
|
85
|
+
vec3 col = c.rgb;
|
|
86
|
+
if (u_prevCount > 0.5) col = max(col, texture(u_prev1, uv).rgb * u_phosphorPersistence);
|
|
87
|
+
if (u_prevCount > 1.5) col = max(col, texture(u_prev2, uv).rgb * u_phosphorPersistence * u_phosphorPersistence);
|
|
88
|
+
float yLogical = (1.0 - uv.y) * 1080.0;
|
|
89
|
+
float scan = 1.0 - u_scanlineDepth * (0.5 + 0.5 * cos(yLogical * PI * 2.0 * u_scanlineFreqPerFrame / 1080.0));
|
|
90
|
+
col *= scan;
|
|
91
|
+
float stripe = mod(floor(gl_FragCoord.x + seedOffset(u_seed).x * 3.0), 3.0);
|
|
92
|
+
vec3 triad = vec3(stripe == 0.0 ? 1.0 : 0.82, stripe == 1.0 ? 1.0 : 0.82, stripe == 2.0 ? 1.0 : 0.82);
|
|
93
|
+
col *= mix(vec3(1.0), triad, u_triadMaskAmount);
|
|
94
|
+
col *= 1.0 + 0.5 * u_flickerAmp * sin(2.0 * PI * u_flickerFreqHz * u_time);
|
|
95
|
+
float v = smoothstep(0.85, 0.3, length(dc * vec2(1.0, 0.85)));
|
|
96
|
+
col *= mix(1.0, v, u_vignette);
|
|
97
|
+
if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) col = vec3(0.0);
|
|
98
|
+
fragColor = vec4(col, c.a);
|
|
99
|
+
}`,
|
|
100
|
+
// dither (MO-SH-08): ordered Bayer quantisation in display space, locked to screen
|
|
101
|
+
// pixels; the seed is used only by the blue-noise mode, once per shot.
|
|
102
|
+
dither: `uniform sampler2D u_tex; uniform int u_ditherMode; uniform int u_paletteSize; uniform int u_pixelScale; uniform float u_ditherStrength; uniform uint u_seed; uniform float u_pxScale;
|
|
103
|
+
float bayer(ivec2 p, int n) {
|
|
104
|
+
int b = 0; int size = n;
|
|
105
|
+
for (int bit = 0; bit < 3; bit++) {
|
|
106
|
+
if ((1 << bit) >= size) break;
|
|
107
|
+
int x = (p.x >> bit) & 1, y = (p.y >> bit) & 1;
|
|
108
|
+
b = (b << 2) | ((x ^ y) << 1) | y;
|
|
109
|
+
}
|
|
110
|
+
int bits = size == 2 ? 1 : size == 4 ? 2 : 3;
|
|
111
|
+
int r = 0; for (int i = 0; i < 6; i++) { if (i >= bits * 2) break; r = (r << 1) | ((b >> i) & 1); }
|
|
112
|
+
return (float(r) + 0.5) / float(size * size);
|
|
113
|
+
}
|
|
114
|
+
void main() {
|
|
115
|
+
vec4 c = texture(u_tex, vUv);
|
|
116
|
+
ivec2 cell = ivec2(floor(gl_FragCoord.xy / (float(u_pixelScale) * u_pxScale)));
|
|
117
|
+
float threshold;
|
|
118
|
+
if (u_ditherMode == 3) threshold = hash12(vec2(cell) + seedOffset(u_seed) * 4096.0);
|
|
119
|
+
else threshold = bayer(cell & 7, u_ditherMode == 0 ? 2 : u_ditherMode == 1 ? 4 : 8);
|
|
120
|
+
float levels = float(max(u_paletteSize, 2) - 1);
|
|
121
|
+
vec3 s = pow(max(c.rgb, 0.0), vec3(1.0 / 2.2));
|
|
122
|
+
vec3 q = floor(s * levels + threshold) / levels;
|
|
123
|
+
vec3 outc = mix(s, q, u_ditherStrength);
|
|
124
|
+
fragColor = vec4(pow(max(outc, 0.0), vec3(2.2)), c.a);
|
|
125
|
+
}`,
|
|
126
|
+
// glitch (MO-SH-05): a scheduled hit displaces horizontal slices (offset + RGB split);
|
|
127
|
+
// one hit = one displace, held u_holdFrames, then restore. No luminance inversion.
|
|
128
|
+
glitch: `uniform sampler2D u_tex; uniform int u_active; uniform int u_count; uniform vec3 u_slices[8]; uniform float u_rgbSplitPx; uniform float u_intensity; uniform uint u_seed; uniform vec2 u_res;
|
|
129
|
+
void main() {
|
|
130
|
+
vec2 uv = vUv;
|
|
131
|
+
float y = (1.0 - vUv.y) * 1080.0;
|
|
132
|
+
float dx = 0.0;
|
|
133
|
+
if (u_active == 1) for (int i = 0; i < 8; i++) {
|
|
134
|
+
if (i >= u_count) break;
|
|
135
|
+
vec3 s = u_slices[i];
|
|
136
|
+
if (y >= s.x && y < s.x + s.y) dx = s.z * (0.5 + u_intensity);
|
|
137
|
+
}
|
|
138
|
+
vec2 off = vec2(dx / 1920.0, 0.0);
|
|
139
|
+
vec4 c = texture(u_tex, uv - off);
|
|
140
|
+
if (dx != 0.0) {
|
|
141
|
+
vec2 split = vec2(u_rgbSplitPx / 1920.0, 0.0);
|
|
142
|
+
c.r = texture(u_tex, uv - off - split).r;
|
|
143
|
+
c.b = texture(u_tex, uv - off + split).b;
|
|
144
|
+
}
|
|
145
|
+
fragColor = c;
|
|
146
|
+
}`,
|
|
147
|
+
// Post (MO-A-29, §A7 order): bloom prefilter and pyramid, then one final pass.
|
|
148
|
+
prefilter: `uniform sampler2D u_tex; uniform vec2 u_texel; uniform float u_threshold, u_knee;
|
|
149
|
+
void main() {
|
|
150
|
+
vec3 c = texture(u_tex, vUv + u_texel * vec2(-1, -1)).rgb + texture(u_tex, vUv + u_texel * vec2(1, -1)).rgb
|
|
151
|
+
+ texture(u_tex, vUv + u_texel * vec2(-1, 1)).rgb + texture(u_tex, vUv + u_texel * vec2(1, 1)).rgb;
|
|
152
|
+
c = min(c * 0.25, vec3(40.0));
|
|
153
|
+
float l = max(c.r, max(c.g, c.b));
|
|
154
|
+
float knee = max(u_knee, 1e-4);
|
|
155
|
+
float rq = clamp(l - u_threshold + knee, 0.0, 2.0 * knee); rq = rq * rq / (4.0 * knee + 1e-5);
|
|
156
|
+
fragColor = vec4(c * max(rq, l - u_threshold) / max(l, 1e-5), 1.0);
|
|
157
|
+
}`,
|
|
158
|
+
down: `uniform sampler2D u_tex; uniform vec2 u_texel;
|
|
159
|
+
void main() {
|
|
160
|
+
vec3 a = texture(u_tex, vUv + u_texel * vec2(-2, -2)).rgb, b = texture(u_tex, vUv + u_texel * vec2(0, -2)).rgb, c = texture(u_tex, vUv + u_texel * vec2(2, -2)).rgb;
|
|
161
|
+
vec3 d = texture(u_tex, vUv + u_texel * vec2(-1, -1)).rgb, e = texture(u_tex, vUv + u_texel * vec2(1, -1)).rgb;
|
|
162
|
+
vec3 f = texture(u_tex, vUv + u_texel * vec2(-2, 0)).rgb, g = texture(u_tex, vUv).rgb, h = texture(u_tex, vUv + u_texel * vec2(2, 0)).rgb;
|
|
163
|
+
vec3 i = texture(u_tex, vUv + u_texel * vec2(-1, 1)).rgb, j = texture(u_tex, vUv + u_texel * vec2(1, 1)).rgb;
|
|
164
|
+
vec3 k = texture(u_tex, vUv + u_texel * vec2(-2, 2)).rgb, l = texture(u_tex, vUv + u_texel * vec2(0, 2)).rgb, m = texture(u_tex, vUv + u_texel * vec2(2, 2)).rgb;
|
|
165
|
+
fragColor = vec4((d + e + i + j) * 0.125 + (a + b + g + f) * 0.03125 + (b + c + h + g) * 0.03125 + (f + g + l + k) * 0.03125 + (g + h + m + l) * 0.03125, 1.0);
|
|
166
|
+
}`,
|
|
167
|
+
up: `uniform sampler2D u_tex; uniform sampler2D u_prev; uniform vec2 u_texel; uniform float u_radius;
|
|
168
|
+
void main() {
|
|
169
|
+
vec2 o = u_texel * u_radius;
|
|
170
|
+
vec3 s = texture(u_tex, vUv - o).rgb + 2.0 * texture(u_tex, vUv + vec2(0, -o.y)).rgb + texture(u_tex, vUv + vec2(o.x, -o.y)).rgb
|
|
171
|
+
+ 2.0 * texture(u_tex, vUv + vec2(-o.x, 0)).rgb + 4.0 * texture(u_tex, vUv).rgb + 2.0 * texture(u_tex, vUv + vec2(o.x, 0)).rgb
|
|
172
|
+
+ texture(u_tex, vUv + vec2(-o.x, o.y)).rgb + 2.0 * texture(u_tex, vUv + vec2(0, o.y)).rgb + texture(u_tex, vUv + o).rgb;
|
|
173
|
+
fragColor = vec4(texture(u_prev, vUv).rgb + s / 16.0, 1.0);
|
|
174
|
+
}`,
|
|
175
|
+
final: `uniform sampler2D u_tex; uniform sampler2D u_bloom; uniform sampler2D u_halo;
|
|
176
|
+
uniform float u_exposure, u_bloomAmt, u_halation, u_ca, u_grain, u_vignette, u_fade, u_flash, u_zoom, u_invert, u_grainSeed;
|
|
177
|
+
uniform vec2 u_shake; uniform vec2 u_res; uniform vec3 u_flashColor;
|
|
178
|
+
vec3 shoulder(vec3 x) {
|
|
179
|
+
const float k = 0.72;
|
|
180
|
+
vec3 y = mix(x, k + (1.0 - k) * (1.0 - exp(-(x - k) / (1.0 - k))), step(k, x));
|
|
181
|
+
float over = max(max(x.r, x.g), x.b);
|
|
182
|
+
return mix(y, vec3(1.0), smoothstep(2.0, 12.0, over) * 0.85);
|
|
183
|
+
}
|
|
184
|
+
void main() {
|
|
185
|
+
vec2 img = vec2(vUv.x, 1.0 - vUv.y);
|
|
186
|
+
vec2 uv = (img - 0.5) / u_zoom + 0.5 - u_shake / u_res * vec2(1.0, -1.0);
|
|
187
|
+
vec2 dc = uv - 0.5;
|
|
188
|
+
float r2 = dot(dc * vec2(u_res.x / u_res.y, 1.0), dc * vec2(u_res.x / u_res.y, 1.0));
|
|
189
|
+
vec2 off = dc * r2 * u_ca / u_res.x * 4.0;
|
|
190
|
+
vec4 base = texture(u_tex, uv);
|
|
191
|
+
vec3 col = vec3(texture(u_tex, uv + off).r, base.g, texture(u_tex, uv - off).b);
|
|
192
|
+
col += texture(u_bloom, uv).rgb * u_bloomAmt;
|
|
193
|
+
col += vec3(1.0, 0.18, 0.04) * luma(texture(u_halo, uv).rgb) * u_halation;
|
|
194
|
+
col *= u_exposure;
|
|
195
|
+
col = shoulder(col);
|
|
196
|
+
col += u_flashColor * u_flash;
|
|
197
|
+
float v = smoothstep(0.95, 0.25, length(dc * vec2(1.0, 0.8)));
|
|
198
|
+
col *= mix(1.0, v, u_vignette);
|
|
199
|
+
col *= u_fade;
|
|
200
|
+
if (u_invert > 0.5) col = vec3(0.8515) - col * 0.84;
|
|
201
|
+
vec3 s = toSRGB(sat(col));
|
|
202
|
+
if (u_grain > 0.0) {
|
|
203
|
+
vec2 gp = gl_FragCoord.xy + vec2(u_grainSeed * 37.0, u_grainSeed * 71.0);
|
|
204
|
+
float g1 = hash12(gp) - 0.5, g2 = hash12(floor(gl_FragCoord.xy / 2.0) + vec2(u_grainSeed * 13.0, u_grainSeed * 29.0)) - 0.5;
|
|
205
|
+
float lm = luma(s);
|
|
206
|
+
s += (g1 * 0.6 + g2 * 0.4) * u_grain * (0.55 + 1.2 * lm * (1.0 - lm));
|
|
207
|
+
s += (hash12(gl_FragCoord.xy * 1.37 + u_grainSeed) - 0.5) / 255.0;
|
|
208
|
+
}
|
|
209
|
+
float inside = step(0.0, uv.x) * step(uv.x, 1.0) * step(0.0, uv.y) * step(uv.y, 1.0);
|
|
210
|
+
fragColor = vec4(sat(s), base.a * inside);
|
|
211
|
+
}`,
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
// Instanced anti-aliased capsule segments (swiss-grid hairlines), after lines.ts.
|
|
215
|
+
const LINE_VERT = `#version 300 es
|
|
216
|
+
in vec2 a_pos; in vec2 i_a; in vec2 i_b; in vec4 i_color; in float i_width;
|
|
217
|
+
uniform vec2 u_res; uniform float u_px;
|
|
218
|
+
out vec2 vLocal; out float vLen; out float vHalf; out vec4 vColor;
|
|
219
|
+
void main() {
|
|
220
|
+
vec2 sa = i_a * u_px, sb = i_b * u_px;
|
|
221
|
+
float w = i_width * u_px; float hw = max(w * 0.5, 0.35) + 1.0;
|
|
222
|
+
vec2 d = sb - sa; float len = length(d); vec2 dir = len > 1e-4 ? d / len : vec2(1.0, 0.0); vec2 nrm = vec2(-dir.y, dir.x);
|
|
223
|
+
float along = mix(-hw, len + hw, a_pos.x);
|
|
224
|
+
vec2 p = sa + dir * along + nrm * a_pos.y * hw;
|
|
225
|
+
vec2 res = u_res * u_px;
|
|
226
|
+
gl_Position = vec4(p.x / res.x * 2.0 - 1.0, 1.0 - p.y / res.y * 2.0, 0.0, 1.0);
|
|
227
|
+
vLocal = vec2(along, a_pos.y * hw); vLen = len; vHalf = max(w * 0.5, 0.35);
|
|
228
|
+
vColor = i_color * vec4(1.0, 1.0, 1.0, min(1.0, w / 0.7));
|
|
229
|
+
}`;
|
|
230
|
+
const LINE_FRAG = `#version 300 es
|
|
231
|
+
precision highp float;
|
|
232
|
+
in vec2 vLocal; in float vLen; in float vHalf; in vec4 vColor; out vec4 fragColor;
|
|
233
|
+
void main() {
|
|
234
|
+
float x = clamp(vLocal.x, 0.0, vLen);
|
|
235
|
+
float d = length(vec2(vLocal.x - x, vLocal.y)) - vHalf;
|
|
236
|
+
float a = clamp(0.5 - d, 0.0, 1.0) * vColor.a;
|
|
237
|
+
if (a <= 0.0) discard;
|
|
238
|
+
fragColor = vec4(vColor.rgb * a, a);
|
|
239
|
+
}`;
|
|
240
|
+
|
|
241
|
+
let gl, S, W, H, PW, PH, programs, quad, lineProg, lineVao, lineBuf, rt, textures, canvases, pbo, frameLog;
|
|
242
|
+
const paths = new Map();
|
|
243
|
+
|
|
244
|
+
const srgbToLinear = (v) => { const s = v / 255; return s <= 0.04045 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4; };
|
|
245
|
+
const hexLinear = (hex) => { const n = parseInt(hex.slice(1), 16); return [(n >> 16) & 255, (n >> 8) & 255, n & 255].map(srgbToLinear); };
|
|
246
|
+
|
|
247
|
+
function compile(type, source) {
|
|
248
|
+
const shader = gl.createShader(type);
|
|
249
|
+
gl.shaderSource(shader, source);
|
|
250
|
+
gl.compileShader(shader);
|
|
251
|
+
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) throw new Error(gl.getShaderInfoLog(shader) || 'shader compile failed');
|
|
252
|
+
return shader;
|
|
253
|
+
}
|
|
254
|
+
function program(vs, fs) {
|
|
255
|
+
const p = gl.createProgram();
|
|
256
|
+
gl.attachShader(p, compile(gl.VERTEX_SHADER, vs));
|
|
257
|
+
gl.attachShader(p, compile(gl.FRAGMENT_SHADER, fs));
|
|
258
|
+
gl.linkProgram(p);
|
|
259
|
+
if (!gl.getProgramParameter(p, gl.LINK_STATUS)) throw new Error(gl.getProgramInfoLog(p) || 'link failed');
|
|
260
|
+
const uniforms = new Map();
|
|
261
|
+
const n = gl.getProgramParameter(p, gl.ACTIVE_UNIFORMS);
|
|
262
|
+
for (let i = 0; i < n; i++) {
|
|
263
|
+
const info = gl.getActiveUniform(p, i);
|
|
264
|
+
uniforms.set(info.name.replace(/\[0\]$/, ''), { loc: gl.getUniformLocation(p, info.name), type: info.type, size: info.size });
|
|
265
|
+
}
|
|
266
|
+
return { p, uniforms };
|
|
267
|
+
}
|
|
268
|
+
const fs = (body) => `#version 300 es\nprecision highp float;\nprecision highp int;\nin vec2 vUv;\nout vec4 fragColor;\n${COMMON}\n${body}`;
|
|
269
|
+
|
|
270
|
+
function target(w, h, format = 'rgba16f') {
|
|
271
|
+
const tex = gl.createTexture();
|
|
272
|
+
gl.bindTexture(gl.TEXTURE_2D, tex);
|
|
273
|
+
if (format === 'rgba8') gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, w, h, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
|
|
274
|
+
else gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA16F, w, h, 0, gl.RGBA, gl.HALF_FLOAT, null);
|
|
275
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
276
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
277
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
278
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
279
|
+
const fb = gl.createFramebuffer();
|
|
280
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
|
|
281
|
+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);
|
|
282
|
+
if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) throw new Error(`framebuffer ${format} incomplete`);
|
|
283
|
+
return { tex, fb, w, h };
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// The one uniform-setter wrapper (MO-SH-00a): records what each pass set.
|
|
287
|
+
function setPass(name, prog, uniforms, logAs, record = true) {
|
|
288
|
+
gl.useProgram(prog.p);
|
|
289
|
+
let unit = 0;
|
|
290
|
+
for (const [key, value] of Object.entries(uniforms)) {
|
|
291
|
+
const u = prog.uniforms.get(key);
|
|
292
|
+
if (!u) continue;
|
|
293
|
+
if (value && value.tex) { gl.activeTexture(gl.TEXTURE0 + unit); gl.bindTexture(gl.TEXTURE_2D, value.tex); gl.uniform1i(u.loc, unit); unit++; continue; }
|
|
294
|
+
switch (u.type) {
|
|
295
|
+
case gl.FLOAT: gl.uniform1f(u.loc, value); break;
|
|
296
|
+
case gl.INT: case gl.BOOL: gl.uniform1i(u.loc, Number(value)); break;
|
|
297
|
+
case gl.UNSIGNED_INT: gl.uniform1ui(u.loc, value >>> 0); break;
|
|
298
|
+
case gl.FLOAT_VEC2: gl.uniform2fv(u.loc, value); break;
|
|
299
|
+
case gl.FLOAT_VEC3: gl.uniform3fv(u.loc, u.size > 1 ? new Float32Array(value.flat().concat(Array(Math.max(0, u.size * 3 - value.flat().length)).fill(0))) : value); break;
|
|
300
|
+
default: break;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
if (logAs) {
|
|
304
|
+
const entry = frameLog.passes[logAs] || (frameLog.passes[logAs] = { draws: 0, uniforms: {} });
|
|
305
|
+
if (record) for (const [key, value] of Object.entries(uniforms)) if (!(value && value.tex)) entry.uniforms[key] = value;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
function drawQuad(dest, logAs) {
|
|
309
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, dest ? dest.fb : null);
|
|
310
|
+
gl.viewport(0, 0, dest ? dest.w : PW, dest ? dest.h : PH);
|
|
311
|
+
gl.bindVertexArray(quad);
|
|
312
|
+
gl.drawArrays(gl.TRIANGLES, 0, 3);
|
|
313
|
+
if (logAs) frameLog.passes[logAs].draws++;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
window.motionSetup = async (config) => {
|
|
317
|
+
S = config.scale || 1; W = config.width; H = config.height; PW = W * S; PH = H * S;
|
|
318
|
+
const canvas = document.createElement('canvas');
|
|
319
|
+
canvas.width = PW; canvas.height = PH;
|
|
320
|
+
gl = canvas.getContext('webgl2', { antialias: false, alpha: false, depth: false, stencil: false, preserveDrawingBuffer: false, premultipliedAlpha: false, powerPreference: 'high-performance' });
|
|
321
|
+
if (!gl) return { webgl2: false, error: 'canvas.getContext("webgl2") returned null' };
|
|
322
|
+
const ext = gl.getExtension('WEBGL_debug_renderer_info');
|
|
323
|
+
const renderer = ext ? gl.getParameter(ext.UNMASKED_RENDERER_WEBGL) : 'unknown (debug-info extension unavailable)';
|
|
324
|
+
if (!gl.getExtension('EXT_color_buffer_float') && !gl.getExtension('EXT_color_buffer_half_float')) {
|
|
325
|
+
return { webgl2: true, renderer, error: 'half-float render targets unavailable (EXT_color_buffer_float)' };
|
|
326
|
+
}
|
|
327
|
+
programs = Object.fromEntries(Object.entries(FRAG).map(([k, body]) => [k, program(VERT, fs(body))]));
|
|
328
|
+
quad = gl.createVertexArray();
|
|
329
|
+
gl.bindVertexArray(quad);
|
|
330
|
+
const qb = gl.createBuffer();
|
|
331
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, qb);
|
|
332
|
+
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 3, -1, -1, 3]), gl.STATIC_DRAW);
|
|
333
|
+
for (const prog of Object.values(programs)) {
|
|
334
|
+
const loc = gl.getAttribLocation(prog.p, 'a_pos');
|
|
335
|
+
if (loc >= 0) { gl.enableVertexAttribArray(loc); gl.vertexAttribPointer(loc, 2, gl.FLOAT, false, 0, 0); }
|
|
336
|
+
}
|
|
337
|
+
lineProg = program(LINE_VERT, LINE_FRAG);
|
|
338
|
+
lineVao = gl.createVertexArray();
|
|
339
|
+
gl.bindVertexArray(lineVao);
|
|
340
|
+
const corner = gl.createBuffer();
|
|
341
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, corner);
|
|
342
|
+
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0, -1, 1, -1, 0, 1, 1, -1, 1, 1, 0, 1]), gl.STATIC_DRAW);
|
|
343
|
+
const posLoc = gl.getAttribLocation(lineProg.p, 'a_pos');
|
|
344
|
+
gl.enableVertexAttribArray(posLoc); gl.vertexAttribPointer(posLoc, 2, gl.FLOAT, false, 0, 0);
|
|
345
|
+
lineBuf = gl.createBuffer();
|
|
346
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, lineBuf);
|
|
347
|
+
const stride = 9 * 4;
|
|
348
|
+
for (const [name, size, offset] of [['i_a', 2, 0], ['i_b', 2, 2], ['i_color', 4, 4], ['i_width', 1, 8]]) {
|
|
349
|
+
const loc = gl.getAttribLocation(lineProg.p, name);
|
|
350
|
+
gl.enableVertexAttribArray(loc); gl.vertexAttribPointer(loc, size, gl.FLOAT, false, stride, offset * 4); gl.vertexAttribDivisor(loc, 1);
|
|
351
|
+
}
|
|
352
|
+
gl.bindVertexArray(null);
|
|
353
|
+
rt = { scene: target(PW, PH), acc: target(PW, PH), a: target(PW, PH), b: target(PW, PH), ring: [target(PW, PH), target(PW, PH)], final: target(PW, PH, 'rgba8'), mips: [], ups: [] };
|
|
354
|
+
let w = W >> 1, h = H >> 1;
|
|
355
|
+
for (let i = 0; i < 7; i++) { rt.mips.push(target(Math.max(2, w), Math.max(2, h))); rt.ups.push(target(Math.max(2, w), Math.max(2, h))); w >>= 1; h >>= 1; }
|
|
356
|
+
rt.ringFrames = [];
|
|
357
|
+
canvases = {};
|
|
358
|
+
textures = {};
|
|
359
|
+
for (const name of ['type', 'flat']) {
|
|
360
|
+
const c = document.createElement('canvas');
|
|
361
|
+
c.width = PW; c.height = PH;
|
|
362
|
+
canvases[name] = c.getContext('2d', { alpha: true, willReadFrequently: false });
|
|
363
|
+
textures[name] = gl.createTexture();
|
|
364
|
+
gl.bindTexture(gl.TEXTURE_2D, textures[name]);
|
|
365
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
366
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
367
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
368
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
369
|
+
}
|
|
370
|
+
pbo = gl.createBuffer();
|
|
371
|
+
gl.bindBuffer(gl.PIXEL_PACK_BUFFER, pbo);
|
|
372
|
+
gl.bufferData(gl.PIXEL_PACK_BUFFER, PW * PH * 4, gl.STREAM_READ);
|
|
373
|
+
gl.bindBuffer(gl.PIXEL_PACK_BUFFER, null);
|
|
374
|
+
const probe = gl.getError();
|
|
375
|
+
return { webgl2: true, renderer, glError: probe };
|
|
376
|
+
};
|
|
377
|
+
|
|
378
|
+
window.motionConnect = (port) => new Promise((resolve, reject) => {
|
|
379
|
+
const socket = new WebSocket(`ws://127.0.0.1:${port}`);
|
|
380
|
+
socket.binaryType = 'arraybuffer';
|
|
381
|
+
socket.onopen = () => { window.__motionSocket = socket; resolve(true); };
|
|
382
|
+
socket.onerror = () => reject(new Error('frame WebSocket could not connect'));
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
function upload(name) {
|
|
386
|
+
gl.bindTexture(gl.TEXTURE_2D, textures[name]);
|
|
387
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
|
|
388
|
+
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
|
|
389
|
+
gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE);
|
|
390
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvases[name].canvas);
|
|
391
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
function drawType(sample) {
|
|
395
|
+
const c = canvases.type;
|
|
396
|
+
c.setTransform(1, 0, 0, 1, 0, 0);
|
|
397
|
+
c.clearRect(0, 0, PW, PH);
|
|
398
|
+
for (const [key, x, y, s, fill, alpha] of sample.glyphs) {
|
|
399
|
+
const path = paths.get(key);
|
|
400
|
+
if (!path) throw new Error(`glyph outline ${key} was never defined`);
|
|
401
|
+
c.globalAlpha = alpha;
|
|
402
|
+
c.fillStyle = fill;
|
|
403
|
+
c.setTransform(s * S, 0, 0, s * S, x * S, y * S);
|
|
404
|
+
c.fill(path);
|
|
405
|
+
}
|
|
406
|
+
c.setTransform(S, 0, 0, S, 0, 0);
|
|
407
|
+
c.lineCap = 'round'; c.lineJoin = 'round';
|
|
408
|
+
for (const st of sample.strokes || []) {
|
|
409
|
+
c.globalAlpha = st.alpha; c.strokeStyle = st.fill; c.lineWidth = st.width;
|
|
410
|
+
c.beginPath();
|
|
411
|
+
for (const flat of st.polylines) {
|
|
412
|
+
c.moveTo(flat[0], flat[1]);
|
|
413
|
+
for (let i = 2; i < flat.length; i += 2) c.lineTo(flat[i], flat[i + 1]);
|
|
414
|
+
if (flat.length === 2) c.lineTo(flat[0] + 0.01, flat[1]);
|
|
415
|
+
}
|
|
416
|
+
c.stroke();
|
|
417
|
+
}
|
|
418
|
+
c.globalAlpha = 1;
|
|
419
|
+
return sample.glyphs.length + (sample.strokes || []).length;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
function drawFlat(sample) {
|
|
423
|
+
const c = canvases.flat;
|
|
424
|
+
c.setTransform(1, 0, 0, 1, 0, 0);
|
|
425
|
+
c.clearRect(0, 0, PW, PH);
|
|
426
|
+
c.setTransform(S, 0, 0, S, 0, 0);
|
|
427
|
+
const items = [...(sample.terminal || []), ...(sample.rects || [])];
|
|
428
|
+
for (const r of items) { c.globalAlpha = r.alpha; c.fillStyle = r.fill; c.fillRect(r.x, r.y, r.w, r.h); }
|
|
429
|
+
c.globalAlpha = 1;
|
|
430
|
+
return items.length;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
function drawRules(sample, uniforms) {
|
|
434
|
+
const rules = sample.rules || [];
|
|
435
|
+
if (!rules.length) return 0;
|
|
436
|
+
const data = new Float32Array(rules.length * 9);
|
|
437
|
+
rules.forEach((r, i) => {
|
|
438
|
+
const [lr, lg, lb] = hexLinear(r.fill);
|
|
439
|
+
data.set([r.x0, r.y0, r.x1, r.y1, lr, lg, lb, r.alpha, r.width], i * 9);
|
|
440
|
+
});
|
|
441
|
+
gl.useProgram(lineProg.p);
|
|
442
|
+
gl.uniform2f(lineProg.uniforms.get('u_res').loc, W, H);
|
|
443
|
+
gl.uniform1f(lineProg.uniforms.get('u_px').loc, S);
|
|
444
|
+
gl.bindVertexArray(lineVao);
|
|
445
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, lineBuf);
|
|
446
|
+
gl.bufferData(gl.ARRAY_BUFFER, data, gl.STREAM_DRAW);
|
|
447
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, rt.scene.fb);
|
|
448
|
+
gl.viewport(0, 0, PW, PH);
|
|
449
|
+
gl.enable(gl.BLEND);
|
|
450
|
+
gl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ZERO, gl.ONE);
|
|
451
|
+
gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, rules.length);
|
|
452
|
+
gl.disable(gl.BLEND);
|
|
453
|
+
gl.bindVertexArray(null);
|
|
454
|
+
const entry = frameLog.passes['swiss-grid'] || (frameLog.passes['swiss-grid'] = { draws: 0, uniforms: {} });
|
|
455
|
+
Object.assign(entry.uniforms, uniforms);
|
|
456
|
+
entry.draws++;
|
|
457
|
+
return rules.length;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
function renderSample(spec, sample, index, count) {
|
|
461
|
+
setPass('clear', programs.clear, { u_color: hexLinear(sample.background) });
|
|
462
|
+
drawQuad(rt.scene);
|
|
463
|
+
if (sample.tidal) {
|
|
464
|
+
const tidal = sample.tidal;
|
|
465
|
+
setPass('tidal-gradient', programs.tidal, {
|
|
466
|
+
u_time: tidal.u_time, u_seed: tidal.u_seed, u_stopA: hexLinear(tidal.u_paletteStops[0]), u_stopB: hexLinear(tidal.u_paletteStops[1]),
|
|
467
|
+
u_base: hexLinear(sample.background), u_flowSpeed: tidal.u_flowSpeed, u_warpAmount: tidal.u_warpAmount, u_curlStrength: tidal.u_curlStrength,
|
|
468
|
+
u_surge: tidal.u_surge, u_ditherAmount: tidal.u_ditherAmount, u_octaves: tidal.u_octaves, u_res: [W, H],
|
|
469
|
+
}, 'tidal-gradient', index === spec.mid);
|
|
470
|
+
drawQuad(rt.scene, 'tidal-gradient');
|
|
471
|
+
}
|
|
472
|
+
const flatCount = drawFlat(sample);
|
|
473
|
+
if (flatCount) {
|
|
474
|
+
upload('flat');
|
|
475
|
+
const logAs = spec.passes.terminalUi && sample.terminal ? 'terminal-ui' : null;
|
|
476
|
+
setPass('layer', programs.layer, { u_tex: { tex: textures.flat }, ...(logAs ? spec.passes.terminalUi : {}) }, logAs, index === spec.mid);
|
|
477
|
+
gl.enable(gl.BLEND);
|
|
478
|
+
gl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ZERO, gl.ONE);
|
|
479
|
+
drawQuad(rt.scene, logAs);
|
|
480
|
+
gl.disable(gl.BLEND);
|
|
481
|
+
}
|
|
482
|
+
if (spec.passes.swissGrid) drawRules(sample, spec.passes.swissGrid);
|
|
483
|
+
else if ((sample.rules || []).length) drawRules(sample, {});
|
|
484
|
+
const typeCount = drawType(sample);
|
|
485
|
+
if (typeCount) {
|
|
486
|
+
upload('type');
|
|
487
|
+
setPass('layer', programs.layer, { u_tex: { tex: textures.type } });
|
|
488
|
+
gl.enable(gl.BLEND);
|
|
489
|
+
gl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
|
|
490
|
+
drawQuad(rt.scene);
|
|
491
|
+
gl.disable(gl.BLEND);
|
|
492
|
+
}
|
|
493
|
+
setPass('accumulate', programs.accumulate, { u_tex: { tex: rt.scene.tex }, u_weight: 1 / count, u_maskWeight: index === spec.mid ? 1 : 0 });
|
|
494
|
+
gl.enable(gl.BLEND);
|
|
495
|
+
gl.blendFunc(gl.ONE, gl.ONE);
|
|
496
|
+
drawQuad(rt.acc);
|
|
497
|
+
gl.disable(gl.BLEND);
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
function copy(src, dst) {
|
|
501
|
+
gl.bindFramebuffer(gl.READ_FRAMEBUFFER, src.fb);
|
|
502
|
+
gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, dst.fb);
|
|
503
|
+
gl.blitFramebuffer(0, 0, src.w, src.h, 0, 0, dst.w, dst.h, gl.COLOR_BUFFER_BIT, gl.NEAREST);
|
|
504
|
+
gl.bindFramebuffer(gl.READ_FRAMEBUFFER, null);
|
|
505
|
+
gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
function filters(spec, order) {
|
|
509
|
+
let src = rt.acc;
|
|
510
|
+
const next = () => (src === rt.a ? rt.b : rt.a);
|
|
511
|
+
for (const pass of order) {
|
|
512
|
+
if (pass === 'crt' && spec.passes.crt) {
|
|
513
|
+
const u = spec.passes.crt;
|
|
514
|
+
if (!u.persistenceEnabled || rt.ringShot !== u.shotKey || spec.resetRing) { rt.ringFrames = []; rt.ringShot = u.shotKey; }
|
|
515
|
+
const prev = rt.ringFrames.filter((f) => f.frame < spec.frame && f.frame >= spec.frame - 2).sort((a, b) => b.frame - a.frame);
|
|
516
|
+
const dst = next();
|
|
517
|
+
setPass('crt', programs.crt, {
|
|
518
|
+
u_tex: { tex: src.tex }, u_prev1: { tex: (prev[0] || { rt: rt.ring[0] }).rt.tex }, u_prev2: { tex: (prev[1] || { rt: rt.ring[1] }).rt.tex },
|
|
519
|
+
u_prevCount: u.persistenceEnabled ? prev.length : 0, u_res: [W, H],
|
|
520
|
+
u_time: u.u_time, u_seed: u.u_seed, u_scanlineFreqPerFrame: u.u_scanlineFreqPerFrame, u_scanlineDepth: u.u_scanlineDepth,
|
|
521
|
+
u_phosphorPersistence: u.u_phosphorPersistence, u_curvature: u.u_curvature, u_vignette: u.u_vignette,
|
|
522
|
+
u_triadMaskAmount: u.u_triadMaskAmount, u_flickerAmp: u.u_flickerAmp, u_flickerFreqHz: u.u_flickerFreqHz,
|
|
523
|
+
}, 'crt');
|
|
524
|
+
drawQuad(dst, 'crt');
|
|
525
|
+
if (u.persistenceEnabled) {
|
|
526
|
+
const slot = rt.ringFrames.length < 2 ? rt.ring[rt.ringFrames.length] : rt.ringFrames.sort((a, b) => a.frame - b.frame)[0].rt;
|
|
527
|
+
rt.ringFrames = rt.ringFrames.filter((f) => f.rt !== slot);
|
|
528
|
+
copy(src, slot);
|
|
529
|
+
rt.ringFrames.push({ frame: spec.frame, rt: slot });
|
|
530
|
+
}
|
|
531
|
+
src = dst;
|
|
532
|
+
}
|
|
533
|
+
if (pass === 'dither' && spec.passes.dither) {
|
|
534
|
+
const u = spec.passes.dither;
|
|
535
|
+
const dst = next();
|
|
536
|
+
setPass('dither', programs.dither, { u_tex: { tex: src.tex }, u_ditherMode: u.u_ditherMode, u_paletteSize: u.u_paletteSize, u_pixelScale: u.u_pixelScale, u_ditherStrength: u.u_ditherStrength, u_seed: u.u_seed, u_pxScale: S }, 'dither');
|
|
537
|
+
drawQuad(dst, 'dither');
|
|
538
|
+
src = dst;
|
|
539
|
+
}
|
|
540
|
+
if (pass === 'glitch' && spec.passes.glitch) {
|
|
541
|
+
const u = spec.passes.glitch;
|
|
542
|
+
const dst = next();
|
|
543
|
+
setPass('glitch', programs.glitch, { u_tex: { tex: src.tex }, u_active: u.u_active, u_count: u.u_slices.length, u_slices: u.u_slices, u_rgbSplitPx: u.u_rgbSplitPx, u_intensity: u.u_intensity, u_seed: u.u_seed, u_res: [W, H] }, 'glitch');
|
|
544
|
+
drawQuad(dst, 'glitch');
|
|
545
|
+
src = dst;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
return src;
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
function post(src, p) {
|
|
552
|
+
setPass('prefilter', programs.prefilter, { u_tex: { tex: src.tex }, u_texel: [1 / PW, 1 / PH], u_threshold: p.bloomThreshold, u_knee: p.bloomKnee });
|
|
553
|
+
drawQuad(rt.mips[0]);
|
|
554
|
+
for (let i = 1; i < rt.mips.length; i++) {
|
|
555
|
+
const s = rt.mips[i - 1];
|
|
556
|
+
setPass('down', programs.down, { u_tex: { tex: s.tex }, u_texel: [1 / s.w, 1 / s.h] });
|
|
557
|
+
drawQuad(rt.mips[i]);
|
|
558
|
+
}
|
|
559
|
+
let prevTex = rt.mips[rt.mips.length - 1].tex;
|
|
560
|
+
for (let i = rt.mips.length - 2; i >= 0; i--) {
|
|
561
|
+
const small = i === rt.mips.length - 2 ? rt.mips[rt.mips.length - 1] : rt.ups[i + 1];
|
|
562
|
+
setPass('up', programs.up, { u_tex: { tex: prevTex }, u_prev: { tex: rt.mips[i].tex }, u_texel: [1 / small.w, 1 / small.h], u_radius: 0.5 + p.bloomRadius });
|
|
563
|
+
drawQuad(rt.ups[i]);
|
|
564
|
+
prevTex = rt.ups[i].tex;
|
|
565
|
+
}
|
|
566
|
+
setPass('final', programs.final, {
|
|
567
|
+
u_tex: { tex: src.tex }, u_bloom: { tex: rt.ups[0].tex }, u_halo: { tex: rt.ups[3].tex },
|
|
568
|
+
u_exposure: p.exposure, u_bloomAmt: p.bloom / 3, u_halation: p.halation, u_ca: p.ca, u_grain: p.grain, u_vignette: p.vignette,
|
|
569
|
+
u_fade: p.fade, u_flash: p.flash, u_zoom: p.zoom, u_invert: p.invert ? 1 : 0, u_grainSeed: p.grainSeed % 4096,
|
|
570
|
+
u_shake: p.shake, u_res: [W, H], u_flashColor: [0.82, 0.82, 0.8],
|
|
571
|
+
});
|
|
572
|
+
drawQuad(rt.final);
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
async function readback() {
|
|
576
|
+
const out = new Uint8Array(PW * PH * 4);
|
|
577
|
+
gl.bindFramebuffer(gl.READ_FRAMEBUFFER, rt.final.fb);
|
|
578
|
+
gl.bindBuffer(gl.PIXEL_PACK_BUFFER, pbo);
|
|
579
|
+
gl.readPixels(0, 0, PW, PH, gl.RGBA, gl.UNSIGNED_BYTE, 0);
|
|
580
|
+
const sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0);
|
|
581
|
+
gl.flush();
|
|
582
|
+
for (let i = 0; ; i++) {
|
|
583
|
+
const status = gl.clientWaitSync(sync, 0, 0);
|
|
584
|
+
if (status === gl.ALREADY_SIGNALED || status === gl.CONDITION_SATISFIED) break;
|
|
585
|
+
if (status === gl.WAIT_FAILED) throw new Error('GPU fence wait failed');
|
|
586
|
+
if (i > 200000) throw new Error('GPU fence timed out');
|
|
587
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
588
|
+
}
|
|
589
|
+
gl.deleteSync(sync);
|
|
590
|
+
gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, out);
|
|
591
|
+
gl.bindBuffer(gl.PIXEL_PACK_BUFFER, null);
|
|
592
|
+
gl.bindFramebuffer(gl.READ_FRAMEBUFFER, null);
|
|
593
|
+
return out;
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
// One output frame. `order` is the preset's filter order after the background passes.
|
|
597
|
+
window.motionFrame = async (spec) => {
|
|
598
|
+
const began = performance.now();
|
|
599
|
+
frameLog = { passes: {} };
|
|
600
|
+
for (const [key, def] of Object.entries(spec.defs || {})) paths.set(key, new Path2D(def.path));
|
|
601
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, rt.acc.fb);
|
|
602
|
+
gl.viewport(0, 0, PW, PH);
|
|
603
|
+
gl.clearColor(0, 0, 0, 0);
|
|
604
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
605
|
+
spec.samples.forEach((sample, i) => renderSample(spec, sample, i, spec.samples.length));
|
|
606
|
+
const filtered = filters(spec, spec.order || []);
|
|
607
|
+
post(filtered, spec.post);
|
|
608
|
+
if (spec.prime) return { primed: true };
|
|
609
|
+
const bytes = await readback();
|
|
610
|
+
const renderMs = performance.now() - began;
|
|
611
|
+
const err = gl.getError();
|
|
612
|
+
if (err !== gl.NO_ERROR) throw new Error(`WebGL error 0x${err.toString(16)} on frame ${spec.frame}`);
|
|
613
|
+
const passes = Object.fromEntries(Object.entries(frameLog.passes).map(([k, v]) => [k, { draws: v.draws, uniforms: v.uniforms }]));
|
|
614
|
+
if (spec.egress === 'websocket') {
|
|
615
|
+
window.__motionSocket.send(bytes.buffer);
|
|
616
|
+
return { passes, renderMs };
|
|
617
|
+
}
|
|
618
|
+
let binary = '';
|
|
619
|
+
for (let i = 0; i < bytes.length; i += 0x8000) binary += String.fromCharCode.apply(null, bytes.subarray(i, i + 0x8000));
|
|
620
|
+
return { passes, renderMs, rgbaBase64: btoa(binary) };
|
|
621
|
+
};
|
|
622
|
+
})();
|