@litfamily/litclaude 1.0.10 → 1.0.13
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/CHANGELOG.md +36 -0
- package/README.md +436 -45
- package/README_ko-KR.md +403 -17
- package/bin/install-ownership.mjs +155 -18
- package/bin/litclaude-ai.js +91 -9
- package/docs/ab/S11-baseline-desktop.webp +0 -0
- package/docs/ab/S11-baseline-phone.webp +0 -0
- package/docs/ab/S11-litclaude-desktop.webp +0 -0
- package/docs/ab/S11-litclaude-phone.webp +0 -0
- package/docs/ab/S3-baseline-desktop.webp +0 -0
- package/docs/ab/S3-baseline-phone.webp +0 -0
- package/docs/ab/S3-litclaude-desktop.webp +0 -0
- package/docs/ab/S3-litclaude-phone.webp +0 -0
- package/docs/ab/S4-baseline-desktop.webp +0 -0
- package/docs/ab/S4-baseline-phone.webp +0 -0
- package/docs/ab/S4-litclaude-desktop.webp +0 -0
- package/docs/ab/S4-litclaude-phone.webp +0 -0
- package/docs/ab/S5-baseline-pages.webp +0 -0
- package/docs/ab/S5-baseline-slides.webp +0 -0
- package/docs/ab/S5-litclaude-pages.webp +0 -0
- package/docs/ab/S5-litclaude-slides.webp +0 -0
- package/docs/ab/S7-litclaude-diagram.webp +0 -0
- package/docs/ab/S8-baseline-slides.webp +0 -0
- package/docs/ab/S8-litclaude-slides.webp +0 -0
- package/docs/ab/S9-litclaude-pages.webp +0 -0
- package/docs/agents.md +10 -7
- package/docs/assets/cover-motion-still.webp +0 -0
- package/docs/assets/cover-motion.webp +0 -0
- package/docs/assets/readme/badge-version.svg +1 -1
- package/docs/assets/skills/autoconference.webp +0 -0
- package/docs/assets/skills/automatic-checks.webp +0 -0
- package/docs/assets/skills/autoresearch.webp +0 -0
- package/docs/assets/skills/browser-drive.webp +0 -0
- package/docs/assets/skills/debugging.webp +0 -0
- package/docs/assets/skills/deep-interview.webp +0 -0
- package/docs/assets/skills/frontend-ui-ux.webp +0 -0
- package/docs/assets/skills/lit-burnoff-file.webp +0 -0
- package/docs/assets/skills/lit-burnoff.webp +0 -0
- package/docs/assets/skills/lit-code.webp +0 -0
- package/docs/assets/skills/lit-commit.webp +0 -0
- package/docs/assets/skills/lit-comprehend.webp +0 -0
- package/docs/assets/skills/lit-crucible.webp +0 -0
- package/docs/assets/skills/lit-diagram-drawer.webp +0 -0
- package/docs/assets/skills/lit-docx.webp +0 -0
- package/docs/assets/skills/lit-handoff.webp +0 -0
- package/docs/assets/skills/lit-humanizer.webp +0 -0
- package/docs/assets/skills/lit-init.webp +0 -0
- package/docs/assets/skills/lit-loop.webp +0 -0
- package/docs/assets/skills/lit-plan.webp +0 -0
- package/docs/assets/skills/lit-pptx.webp +0 -0
- package/docs/assets/skills/lit-recap.webp +0 -0
- package/docs/assets/skills/lit-scientific-visualization.webp +0 -0
- package/docs/assets/skills/lit-team.webp +0 -0
- package/docs/assets/skills/lit-typographic-motion.webp +0 -0
- package/docs/assets/skills/litgoal.webp +0 -0
- package/docs/assets/skills/litresearch.webp +0 -0
- package/docs/assets/skills/litwork.webp +0 -0
- package/docs/assets/skills/lsp-setup.webp +0 -0
- package/docs/assets/skills/readme-studio.webp +0 -0
- package/docs/assets/skills/refactor.webp +0 -0
- package/docs/assets/skills/review-work.webp +0 -0
- package/docs/assets/skills/start-work.webp +0 -0
- package/docs/assets/skills/structural-search.webp +0 -0
- package/docs/assets/skills/visual-qa.webp +0 -0
- package/docs/assets/skills/wikify.webp +0 -0
- package/docs/hooks.md +185 -41
- package/docs/migration.md +6 -3
- package/docs/privacy.md +6 -1
- package/package.json +4 -2
- package/plugins/litclaude/.claude-plugin/plugin.json +1 -1
- package/plugins/litclaude/agents/korean-prose-editor.md +1 -0
- package/plugins/litclaude/agents/korean-style-analyzer.md +1 -0
- package/plugins/litclaude/agents/meaning-preservation-auditor.md +1 -0
- package/plugins/litclaude/agents/native-flow-reviewer.md +1 -0
- package/plugins/litclaude/agents/polish-orchestrator.md +1 -0
- package/plugins/litclaude/bin/litclaude-hook.js +347 -35
- package/plugins/litclaude/bin/litclaude-hud.js +29 -1
- package/plugins/litclaude/bin/litclaude-mcp.js +1 -1
- package/plugins/litclaude/bundled-rules/lit-humanizer.md +14 -0
- package/plugins/litclaude/commands/korean-ai-slop-remover.md +2 -2
- package/plugins/litclaude/commands/lit-comprehend.md +11 -11
- package/plugins/litclaude/commands/lit-humanizer.md +75 -0
- package/plugins/litclaude/commands/lit-korean.md +4 -130
- package/plugins/litclaude/commands/litresearch.md +12 -10
- package/plugins/litclaude/hooks/hooks.json +1 -1
- package/plugins/litclaude/lib/canonical-runtime-commitments.mjs +2 -2
- package/plugins/litclaude/lib/canonical-skill-catalog.mjs +5 -1
- package/plugins/litclaude/lib/canonical-skill-resources.mjs +618 -13
- package/plugins/litclaude/lib/deliverable-hedge-guard.mjs +256 -350
- package/plugins/litclaude/lib/hud-accent-palette.mjs +33 -0
- package/plugins/litclaude/lib/interface-mode.mjs +33 -0
- package/plugins/litclaude/lib/interface-probe-gate.mjs +125 -0
- package/plugins/litclaude/lib/jev-skill-hint.mjs +445 -0
- package/plugins/litclaude/lib/motion-render-gate.mjs +164 -0
- package/plugins/litclaude/lib/mutated-file-paths.mjs +32 -1
- package/plugins/litclaude/lib/office-runtime-lock/package-lock.json +745 -0
- package/plugins/litclaude/lib/office-runtime-lock/package.json +12 -0
- package/plugins/litclaude/lib/office-runtime-lock/requirements.lock +15 -0
- package/plugins/litclaude/lib/office-runtime.mjs +255 -0
- package/plugins/litclaude/lib/office_data.py +493 -0
- package/plugins/litclaude/lib/office_runtime_bootstrap.py +61 -0
- package/plugins/litclaude/lib/ooxml_integrity.py +199 -0
- package/plugins/litclaude/lib/rename-aliases.mjs +3 -1
- package/plugins/litclaude/lib/render_pages.py +105 -0
- package/plugins/litclaude/skills/autoconference/SKILL.md +2 -0
- package/plugins/litclaude/skills/browser-drive/SKILL.md +19 -6
- package/plugins/litclaude/skills/browser-drive/scripts/capability-probe.mjs +44 -8
- package/plugins/litclaude/skills/frontend-ui-ux/ATTRIBUTION.md +26 -0
- package/plugins/litclaude/skills/frontend-ui-ux/SKILL.md +50 -16
- package/plugins/litclaude/skills/frontend-ui-ux/examples/phase-3-readme-ab/README.md +9 -0
- package/plugins/litclaude/skills/frontend-ui-ux/references/complete-contract.md +32 -6
- package/plugins/litclaude/skills/frontend-ui-ux/references/craft-floor.md +257 -0
- package/plugins/litclaude/skills/frontend-ui-ux/references/default-editorial-pixel.json +6 -0
- package/plugins/litclaude/skills/frontend-ui-ux/references/interaction-motion.md +34 -88
- package/plugins/litclaude/skills/frontend-ui-ux/references/motion-guide.md +130 -0
- package/plugins/litclaude/skills/frontend-ui-ux/references/slop-register.md +150 -0
- package/plugins/litclaude/skills/frontend-ui-ux/references/visual-reconstruction.md +39 -85
- package/plugins/litclaude/skills/frontend-ui-ux/scripts/interface-probe-page.mjs +1534 -0
- package/plugins/litclaude/skills/frontend-ui-ux/scripts/interface-probe-rules.mjs +141 -0
- package/plugins/litclaude/skills/frontend-ui-ux/scripts/interface-probe-server.mjs +57 -0
- package/plugins/litclaude/skills/frontend-ui-ux/scripts/interface-probe-static.mjs +129 -0
- package/plugins/litclaude/skills/frontend-ui-ux/scripts/interface-probe.mjs +316 -0
- package/plugins/litclaude/skills/lit-comprehend/SKILL.md +34 -43
- package/plugins/litclaude/skills/lit-comprehend/references/artifact-template.md +5 -44
- package/plugins/litclaude/skills/lit-comprehend/scripts/verify-explainer.mjs +6 -16
- package/plugins/litclaude/skills/lit-diagram-drawer/NOTICE +33 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/SKILL.md +123 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-architecture-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-architecture-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-architecture-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-bar-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-bar-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-bar-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-beeswarm-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-beeswarm-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-beeswarm-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-bubble-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-bubble-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-bubble-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-bump-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-bump-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-bump-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-data-flow-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-data-flow-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-data-flow-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-datalake-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-datalake-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-datalake-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-db-schema-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-db-schema-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-db-schema-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-dependency-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-dependency-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-dependency-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-deployment-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-deployment-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-deployment-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-dp-integration-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-dp-integration-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-dp-integration-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-dp-security-matrix-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-dp-security-matrix-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-dp-security-matrix-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-er-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-er-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-er-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-fishbone-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-fishbone-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-fishbone-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-flowchart-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-flowchart-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-flowchart-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-gantt-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-gantt-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-gantt-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-heatmap-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-heatmap-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-heatmap-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-high-level-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-high-level-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-high-level-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-high-level-vertical-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-high-level-vertical-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-high-level-vertical-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-import-drawio-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-import-drawio-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-import-drawio-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-import-excalidraw-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-import-excalidraw-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-import-excalidraw-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-import-mermaid-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-import-mermaid-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-import-mermaid-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-it-state-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-it-state-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-it-state-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-journey-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-journey-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-journey-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-kanban-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-kanban-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-kanban-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-layers-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-layers-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-layers-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-line-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-line-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-line-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-loop-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-loop-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-loop-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-loop-terminal-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-loop-terminal-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-loop-terminal-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-marimekko-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-marimekko-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-marimekko-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-medallion-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-medallion-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-medallion-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-nested-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-nested-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-nested-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-org-chart-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-org-chart-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-org-chart-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-paved-road-animated-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-paved-road-animated-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-paved-road-animated-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-polar-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-polar-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-polar-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-policy-trace-animated-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-policy-trace-animated-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-policy-trace-animated-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-process-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-process-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-process-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-pyramid-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-pyramid-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-pyramid-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-quadrant-consultant-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-quadrant-consultant-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-quadrant-consultant-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-quadrant-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-quadrant-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-quadrant-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-queue-animated-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-queue-animated-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-queue-animated-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-radar-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-radar-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-radar-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-ridgeline-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-ridgeline-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-ridgeline-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-sankey-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-sankey-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-sankey-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-scatter-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-scatter-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-scatter-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-sequence-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-sequence-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-sequence-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-sequence-oauth-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-sequence-oauth-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-sequence-oauth-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-slopegraph-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-slopegraph-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-slopegraph-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-state-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-state-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-state-lifecycle-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-state-lifecycle-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-state-lifecycle-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-state-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-story-map-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-story-map-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-story-map-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-streamgraph-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-streamgraph-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-streamgraph-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-swimlane-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-swimlane-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-swimlane-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-timeline-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-timeline-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-timeline-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-tree-block-decomposition-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-tree-block-decomposition-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-tree-block-decomposition-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-tree-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-tree-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-tree-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-treemap-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-treemap-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-treemap-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-uml-class-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-uml-class-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-uml-class-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-venn-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-venn-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-venn-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-wardley-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-wardley-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-wardley-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-waterfall-dark.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-waterfall-full.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/examples/type-waterfall-light.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/fonts/OFL.txt +94 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/fonts/PretendardVariable.woff2 +0 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/fonts/provenance.json +22 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/icons.html +231 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/index.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/licenses/devicon-MIT.txt +20 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/licenses/diagram-design-MIT.txt +21 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/licenses/log-z-MIT.txt +21 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/licenses/simple-icons-CC0.md +30 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/assets/licenses/tabler-MIT.txt +21 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/examples/01-service-architecture/after.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/examples/01-service-architecture/brief.md +33 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/examples/02-release-decision/after.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/examples/02-release-decision/brief.md +18 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/examples/03-data-retention/after.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/examples/03-data-retention/brief.md +19 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/examples/04-oauth-sequence/after.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/examples/04-oauth-sequence/brief.md +17 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/examples/05-review-lanes/after.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/examples/05-review-lanes/brief.md +17 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/examples/06-rollout-gates/after.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/examples/06-rollout-gates/brief.md +17 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/examples/07-deployment-boundary/after.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/examples/07-deployment-boundary/brief.md +19 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/examples/08-policy-traces/after.html +1 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/examples/08-policy-traces/brief.md +20 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/accessibility.md +37 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/export.md +29 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/import-drawio.md +21 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/import-excalidraw.md +14 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/import-mermaid.md +18 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/import-schema.md +28 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/korean-typography.md +34 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/motion.md +29 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/office-pptx-docx.md +42 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/output-spec.md +48 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/primitive-annotation.md +12 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/primitive-icons.md +21 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/primitive-sketchy.md +11 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/primitive-terminal.md +11 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/profiles.md +24 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/semantic-patterns.md +27 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/style-guide.md +67 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-architecture.md +51 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-bar.md +51 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-beeswarm.md +49 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-bubble.md +49 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-bump.md +49 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-catalog.json +1433 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-data-flow.md +51 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-datalake.md +49 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-db-schema.md +49 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-dependency.md +49 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-deployment.md +49 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-dp-integration.md +49 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-dp-security-matrix.md +49 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-er.md +49 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-fishbone.md +49 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-flowchart.md +49 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-gantt.md +49 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-heatmap.md +53 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-high-level-vertical.md +53 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-high-level.md +53 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-import-drawio.md +53 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-import-excalidraw.md +53 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-import-mermaid.md +53 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-it-state.md +54 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-journey.md +54 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-kanban.md +54 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-layers.md +54 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-line.md +54 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-loop-terminal.md +53 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-loop.md +54 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-marimekko.md +54 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-medallion.md +54 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-nested.md +59 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-org-chart.md +58 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-paved-road-animated.md +72 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-polar.md +67 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-policy-trace-animated.md +69 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-process.md +58 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-pyramid.md +59 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-quadrant-consultant.md +60 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-quadrant.md +57 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-queue-animated.md +63 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-radar.md +57 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-ridgeline.md +63 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-sankey.md +68 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-scatter.md +60 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-sequence-oauth.md +66 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-sequence.md +63 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-slopegraph.md +65 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-state-lifecycle.md +53 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-state.md +59 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-story-map.md +52 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-streamgraph.md +53 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-swimlane.md +52 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-timeline.md +52 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-tree-block-decomposition.md +57 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-tree.md +54 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-treemap.md +54 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-uml-class.md +52 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-venn.md +51 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-wardley.md +52 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/type-waterfall.md +54 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/references/verifier-guide.md +66 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/scripts/block-registry.mjs +43 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/scripts/brief-contract.mjs +94 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/scripts/check-visible-text.mjs +15 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/scripts/diagram-metrics.mjs +223 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/scripts/doctor.mjs +35 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/scripts/drawio-extract.mjs +635 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/scripts/excalidraw-extract.mjs +319 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/scripts/export.mjs +116 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/scripts/mermaid-extract.mjs +438 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/scripts/office-safety.mjs +54 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/scripts/renderer.mjs +33 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/scripts/verify-all.mjs +58 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/scripts/verify-brief.mjs +22 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/scripts/verify-coverage.mjs +56 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/scripts/verify-diagram.mjs +27 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/scripts/verify-motion.mjs +12 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/scripts/verify-type.mjs +48 -0
- package/plugins/litclaude/skills/lit-diagram-drawer/scripts/visual-quality.mjs +376 -0
- package/plugins/litclaude/skills/lit-docx/NOTICE +33 -0
- package/plugins/litclaude/skills/lit-docx/SKILL.md +170 -0
- package/plugins/litclaude/skills/lit-docx/references/frontmatter_schema.md +42 -0
- package/plugins/litclaude/skills/lit-docx/references/journal_style_spec.md +17 -0
- package/plugins/litclaude/skills/lit-docx/references/markdown_quality_checklist.md +37 -0
- package/plugins/litclaude/skills/lit-docx/references/slop_phrase_list.yaml +58 -0
- package/plugins/litclaude/skills/lit-docx/references/slop_rules.md +35 -0
- package/plugins/litclaude/skills/lit-docx/scripts/clean_markdown.py +95 -0
- package/plugins/litclaude/skills/lit-docx/scripts/convert_md_to_docx.py +1194 -0
- package/plugins/litclaude/skills/lit-docx/scripts/convert_md_to_pdf.py +290 -0
- package/plugins/litclaude/skills/lit-docx/scripts/convert_pdf.py +139 -0
- package/plugins/litclaude/skills/lit-docx/scripts/edit_docx.py +306 -0
- package/plugins/litclaude/skills/lit-docx/scripts/embed_images.py +78 -0
- package/plugins/litclaude/skills/lit-docx/scripts/generate_docx_templates.py +500 -0
- package/plugins/litclaude/skills/lit-docx/scripts/qa_docx.py +177 -0
- package/plugins/litclaude/skills/lit-docx/scripts/slop_lint.py +561 -0
- package/plugins/litclaude/skills/lit-docx/scripts/visual_audit.py +48 -0
- package/plugins/litclaude/skills/lit-docx/templates/docx/acs.docx +0 -0
- package/plugins/litclaude/skills/lit-docx/templates/docx/elsevier.docx +0 -0
- package/plugins/litclaude/skills/lit-docx/templates/docx/ieee.docx +0 -0
- package/plugins/litclaude/skills/lit-docx/templates/docx/korean-generic.docx +0 -0
- package/plugins/litclaude/skills/lit-docx/templates/docx/nature.docx +0 -0
- package/plugins/litclaude/skills/lit-docx/templates/latex/acs/README.md +5 -0
- package/plugins/litclaude/skills/lit-docx/templates/latex/acs/template.tex +37 -0
- package/plugins/litclaude/skills/lit-docx/templates/latex/elsevier/README.md +5 -0
- package/plugins/litclaude/skills/lit-docx/templates/latex/elsevier/template.tex +38 -0
- package/plugins/litclaude/skills/lit-docx/templates/latex/ieee/README.md +5 -0
- package/plugins/litclaude/skills/lit-docx/templates/latex/ieee/template.tex +37 -0
- package/plugins/litclaude/skills/lit-docx/templates/latex/korean-generic/README.md +5 -0
- package/plugins/litclaude/skills/lit-docx/templates/latex/korean-generic/template.tex +37 -0
- package/plugins/litclaude/skills/lit-docx/templates/latex/nature/README.md +5 -0
- package/plugins/litclaude/skills/lit-docx/templates/latex/nature/template.tex +37 -0
- package/plugins/litclaude/skills/lit-docx/templates/registry.yaml +1366 -0
- package/plugins/litclaude/skills/lit-humanizer/NOTICE +160 -0
- package/plugins/litclaude/skills/lit-humanizer/SKILL.md +164 -0
- package/plugins/litclaude/skills/lit-humanizer/assets/always-on-rule.md +9 -0
- package/plugins/litclaude/skills/lit-humanizer/assets/report-skeleton.md +25 -0
- package/plugins/litclaude/skills/lit-humanizer/assets/slide-text-skeleton.md +28 -0
- package/plugins/litclaude/skills/lit-humanizer/bench/prompts.md +73 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/accessibility-note/after.md +7 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/accessibility-note/before.md +7 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/api-reference/after.md +9 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/api-reference/before.md +15 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/changelog/after.md +5 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/changelog/before.md +12 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/code-comments/after.md +10 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/code-comments/before.md +19 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/commit/after.md +5 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/commit/before.md +7 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/data-release/after.md +7 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/data-release/before.md +9 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/english-essay/after.md +5 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/english-essay/before.md +5 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/incident-update/after.md +7 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/incident-update/before.md +7 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/ko-essay/after.md +7 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/ko-essay/before.md +9 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/ko-report/after.md +9 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/ko-report/before.md +13 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/ko-slide/after.md +19 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/ko-slide/before.md +21 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/meeting-brief/after.md +9 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/meeting-brief/before.md +11 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/policy-faq/after.md +9 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/policy-faq/before.md +9 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/pr/after.md +15 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/pr/before.md +17 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/project-update/after.md +7 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/project-update/before.md +9 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/readme/after.md +12 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/readme/before.md +14 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/report/after.md +13 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/report/before.md +11 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/research-abstract/after.md +5 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/research-abstract/before.md +5 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/slides/after.md +19 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/slides/before.md +19 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/troubleshooting/after.md +11 -0
- package/plugins/litclaude/skills/lit-humanizer/examples/troubleshooting/before.md +11 -0
- package/plugins/litclaude/skills/lit-humanizer/motion-guide.md +123 -0
- package/plugins/litclaude/skills/lit-humanizer/references/code-patterns.md +468 -0
- package/plugins/litclaude/skills/lit-humanizer/references/deliverable-channels.md +111 -0
- package/plugins/litclaude/skills/lit-humanizer/references/en-patterns-checklist.md +43 -0
- package/plugins/litclaude/skills/lit-humanizer/references/en-patterns-content.md +243 -0
- package/plugins/litclaude/skills/lit-humanizer/references/en-patterns-structure.md +375 -0
- package/plugins/litclaude/skills/lit-humanizer/references/en-patterns.md +57 -0
- package/plugins/litclaude/skills/lit-humanizer/references/ko-metrics.md +33 -0
- package/plugins/litclaude/skills/lit-humanizer/references/ko-patterns-a-d.md +659 -0
- package/plugins/litclaude/skills/lit-humanizer/references/ko-patterns-e-j.md +387 -0
- package/plugins/litclaude/skills/lit-humanizer/references/ko-patterns.md +31 -0
- package/plugins/litclaude/skills/lit-humanizer/references/rewrite-playbook.md +54 -0
- package/plugins/litclaude/skills/lit-humanizer/references/taxonomy.md +153 -0
- package/plugins/litclaude/skills/lit-humanizer/rules.json +884 -0
- package/plugins/litclaude/skills/lit-humanizer/scripts/artifact-text.mjs +38 -0
- package/plugins/litclaude/skills/lit-humanizer/scripts/core.mjs +207 -0
- package/plugins/litclaude/skills/lit-humanizer/scripts/detect.mjs +64 -0
- package/plugins/litclaude/skills/lit-humanizer/scripts/extract_office_text.py +112 -0
- package/plugins/litclaude/skills/lit-humanizer/scripts/ko-metrics.mjs +124 -0
- package/plugins/litclaude/skills/lit-humanizer/scripts/scan-input.mjs +29 -0
- package/plugins/litclaude/skills/lit-loop/SKILL.md +30 -1
- package/plugins/litclaude/skills/lit-plan/SKILL.md +4 -1
- package/plugins/litclaude/skills/lit-pptx/NOTICE +38 -0
- package/plugins/litclaude/skills/lit-pptx/SKILL.md +207 -0
- package/plugins/litclaude/skills/lit-pptx/assets/azure/circle-lg.png +0 -0
- package/plugins/litclaude/skills/lit-pptx/assets/azure/circle-md.png +0 -0
- package/plugins/litclaude/skills/lit-pptx/assets/azure/circle-sm.png +0 -0
- package/plugins/litclaude/skills/lit-pptx/fonts/a2z/A2Z-Black.otf +0 -0
- package/plugins/litclaude/skills/lit-pptx/fonts/a2z/A2Z-Bold.otf +0 -0
- package/plugins/litclaude/skills/lit-pptx/fonts/a2z/A2Z-Light.otf +0 -0
- package/plugins/litclaude/skills/lit-pptx/fonts/a2z/A2Z-Medium.otf +0 -0
- package/plugins/litclaude/skills/lit-pptx/fonts/a2z/A2Z-Regular.otf +0 -0
- package/plugins/litclaude/skills/lit-pptx/fonts/a2z/OFL.txt +94 -0
- package/plugins/litclaude/skills/lit-pptx/fonts/a2z/SOURCE.md +29 -0
- package/plugins/litclaude/skills/lit-pptx/fonts/pretendard/OFL.txt +94 -0
- package/plugins/litclaude/skills/lit-pptx/fonts/pretendard/Pretendard-Bold.otf +0 -0
- package/plugins/litclaude/skills/lit-pptx/fonts/pretendard/Pretendard-Regular.otf +0 -0
- package/plugins/litclaude/skills/lit-pptx/fonts/provenance.json +78 -0
- package/plugins/litclaude/skills/lit-pptx/references/agents/analyst.md +49 -0
- package/plugins/litclaude/skills/lit-pptx/references/agents/antithesis.md +59 -0
- package/plugins/litclaude/skills/lit-pptx/references/agents/architect.md +44 -0
- package/plugins/litclaude/skills/lit-pptx/references/agents/critic.md +42 -0
- package/plugins/litclaude/skills/lit-pptx/references/agents/synthesizer.md +47 -0
- package/plugins/litclaude/skills/lit-pptx/references/agents/thesis.md +33 -0
- package/plugins/litclaude/skills/lit-pptx/references/anti-slop-checklist.md +81 -0
- package/plugins/litclaude/skills/lit-pptx/references/authoring-guide.md +173 -0
- package/plugins/litclaude/skills/lit-pptx/references/consensus-protocol.md +125 -0
- package/plugins/litclaude/skills/lit-pptx/references/data-display-cookbook.md +45 -0
- package/plugins/litclaude/skills/lit-pptx/references/design-system-azure.md +58 -0
- package/plugins/litclaude/skills/lit-pptx/references/interview-protocol.md +113 -0
- package/plugins/litclaude/skills/lit-pptx/references/stages/autopilot.md +48 -0
- package/plugins/litclaude/skills/lit-pptx/references/stages/interview.md +52 -0
- package/plugins/litclaude/skills/lit-pptx/references/stages/plan.md +42 -0
- package/plugins/litclaude/skills/lit-pptx/scripts/compile-deck.js +414 -0
- package/plugins/litclaude/skills/lit-pptx/scripts/craft_extras.py +373 -0
- package/plugins/litclaude/skills/lit-pptx/scripts/deck_craft.py +321 -0
- package/plugins/litclaude/skills/lit-pptx/scripts/embed_fonts.py +215 -0
- package/plugins/litclaude/skills/lit-pptx/scripts/forbidden-terms.json +55 -0
- package/plugins/litclaude/skills/lit-pptx/scripts/layout_inventory.py +418 -0
- package/plugins/litclaude/skills/lit-pptx/scripts/learn_template.py +446 -0
- package/plugins/litclaude/skills/lit-pptx/scripts/lib/derive-palette.js +176 -0
- package/plugins/litclaude/skills/lit-pptx/scripts/lib/directive-parser.js +244 -0
- package/plugins/litclaude/skills/lit-pptx/scripts/lib/font-map.js +79 -0
- package/plugins/litclaude/skills/lit-pptx/scripts/lib/gen-bg.js +86 -0
- package/plugins/litclaude/skills/lit-pptx/scripts/lib/gen-gradient-assets.js +37 -0
- package/plugins/litclaude/skills/lit-pptx/scripts/lib/layout-resolver.js +768 -0
- package/plugins/litclaude/skills/lit-pptx/scripts/lib/markdown-loader.js +136 -0
- package/plugins/litclaude/skills/lit-pptx/scripts/lib/render-adapter-html.js +356 -0
- package/plugins/litclaude/skills/lit-pptx/scripts/lib/render-adapter-pptx.js +2094 -0
- package/plugins/litclaude/skills/lit-pptx/scripts/lib/runtime-require.js +28 -0
- package/plugins/litclaude/skills/lit-pptx/scripts/lib/slide-ast.js +561 -0
- package/plugins/litclaude/skills/lit-pptx/scripts/lib/spec-validator.js +94 -0
- package/plugins/litclaude/skills/lit-pptx/scripts/lib/template-registry.js +394 -0
- package/plugins/litclaude/skills/lit-pptx/scripts/package.json +4 -0
- package/plugins/litclaude/skills/lit-pptx/scripts/qa_deck.py +766 -0
- package/plugins/litclaude/skills/lit-pptx/scripts/validate_pptx.py +215 -0
- package/plugins/litclaude/skills/lit-pptx/specs/markdown-slide-spec-v1.md +251 -0
- package/plugins/litclaude/skills/lit-pptx/specs/markdown-slide-spec-v2.md +214 -0
- package/plugins/litclaude/skills/lit-pptx/specs/slide-ast-v1.schema.json +229 -0
- package/plugins/litclaude/skills/lit-pptx/specs/slide-ast-v2.schema.json +144 -0
- package/plugins/litclaude/skills/lit-pptx/specs/template-enrollment-contract.md +382 -0
- package/plugins/litclaude/skills/lit-pptx/templates/enrolled/AZURE-A2Z/capabilities.yaml +146 -0
- package/plugins/litclaude/skills/lit-pptx/templates/enrolled/AZURE-A2Z/layout-mapping.yaml +454 -0
- package/plugins/litclaude/skills/lit-pptx/templates/enrolled/AZURE-A2Z/template.yaml +37 -0
- package/plugins/litclaude/skills/lit-pptx/templates/enrolled/AZURE-PRO/capabilities.yaml +154 -0
- package/plugins/litclaude/skills/lit-pptx/templates/enrolled/AZURE-PRO/layout-mapping.yaml +475 -0
- package/plugins/litclaude/skills/lit-pptx/templates/enrolled/AZURE-PRO/template.yaml +37 -0
- package/plugins/litclaude/skills/lit-pptx/templates/enrolled/BOILERPLATE-A2Z/capabilities.yaml +179 -0
- package/plugins/litclaude/skills/lit-pptx/templates/enrolled/BOILERPLATE-A2Z/layout-mapping.yaml +299 -0
- package/plugins/litclaude/skills/lit-pptx/templates/enrolled/BOILERPLATE-A2Z/template.yaml +45 -0
- package/plugins/litclaude/skills/lit-pptx/templates/enrolled/BOILERPLATE-PRETENDARD/capabilities.yaml +181 -0
- package/plugins/litclaude/skills/lit-pptx/templates/enrolled/BOILERPLATE-PRETENDARD/layout-mapping.yaml +299 -0
- package/plugins/litclaude/skills/lit-pptx/templates/enrolled/BOILERPLATE-PRETENDARD/template.yaml +44 -0
- package/plugins/litclaude/skills/lit-scientific-visualization/SKILL.md +1 -0
- package/plugins/litclaude/skills/lit-typographic-motion/SKILL.md +131 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/NOTICE +23 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/THIRD_PARTY_NOTICES +56 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/audio/beat_grid.py +56 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/audio/requirements.lock +1084 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/core/constants.mjs +211 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/core/contrast.mjs +90 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/core/events.mjs +46 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/core/flash.mjs +211 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/core/gate-rules.mjs +550 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/core/presets.mjs +123 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/core/text.mjs +100 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/core/timeline.mjs +142 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/core/util.mjs +167 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/core/voices.mjs +19 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/models/word-timing.json +198 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/node/analysis.mjs +108 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/node/brief.mjs +158 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/node/chrome.mjs +330 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/node/coverage.mjs +83 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/node/done.mjs +104 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/node/encode.mjs +104 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/node/frame-worker.mjs +36 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/node/look.mjs +128 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/node/pipeline.mjs +592 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/node/png.mjs +112 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/node/report.mjs +66 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/node/runtime.mjs +330 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/node/session.mjs +145 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/node/sound-cli.mjs +60 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/node/sound.mjs +641 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/node/stage-capture.mjs +178 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/node/stage-gate.mjs +122 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/node/stage-qa.mjs +295 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/node/stage-serve.mjs +278 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/node/stage.mjs +503 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/node/stills.mjs +100 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/node/treatment.mjs +343 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/node/ws-server.mjs +132 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/package-lock.json +25 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/package.json +10 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/stage/init.js +288 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/stage/qa.js +157 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/stage/stage-kit.js +701 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/web/boot.mjs +123 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/web/engine.mjs +281 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/web/gl.mjs +319 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/web/glsl-common.mjs +78 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/web/index.html +6 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/web/lines.mjs +112 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/web/passes/crt.mjs +98 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/web/passes/dither.mjs +49 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/web/passes/glitch.mjs +77 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/web/passes/swiss-grid.mjs +61 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/web/passes/terminal-ui.mjs +88 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/web/passes/tidal-gradient.mjs +86 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/web/post.mjs +165 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/web/scale.mjs +15 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/web/scene.mjs +82 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/web/scenes/end-card.mjs +30 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/web/scenes/index.mjs +16 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/web/scenes/karaoke-line.mjs +47 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/web/scenes/kinetic-list.mjs +45 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/web/scenes/number-counter.mjs +29 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/web/scenes/signature.mjs +73 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/web/scenes/title-slam.mjs +73 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/web/stroke.mjs +236 -0
- package/plugins/litclaude/skills/lit-typographic-motion/engine/web/type.mjs +180 -0
- package/plugins/litclaude/skills/lit-typographic-motion/fonts/archivo/Archivo-w100-400.ttf +0 -0
- package/plugins/litclaude/skills/lit-typographic-motion/fonts/archivo/Archivo-w100-700.ttf +0 -0
- package/plugins/litclaude/skills/lit-typographic-motion/fonts/archivo/Archivo-w100-900.ttf +0 -0
- package/plugins/litclaude/skills/lit-typographic-motion/fonts/archivo/Archivo-w125-400.ttf +0 -0
- package/plugins/litclaude/skills/lit-typographic-motion/fonts/archivo/Archivo-w125-700.ttf +0 -0
- package/plugins/litclaude/skills/lit-typographic-motion/fonts/archivo/Archivo-w125-900.ttf +0 -0
- package/plugins/litclaude/skills/lit-typographic-motion/fonts/archivo/Archivo-w75-400.ttf +0 -0
- package/plugins/litclaude/skills/lit-typographic-motion/fonts/archivo/Archivo-w75-700.ttf +0 -0
- package/plugins/litclaude/skills/lit-typographic-motion/fonts/archivo/Archivo-w75-900.ttf +0 -0
- package/plugins/litclaude/skills/lit-typographic-motion/fonts/archivo/OFL.txt +93 -0
- package/plugins/litclaude/skills/lit-typographic-motion/fonts/manifest.json +437 -0
- package/plugins/litclaude/skills/lit-typographic-motion/fonts/silkscreen/OFL.txt +93 -0
- package/plugins/litclaude/skills/lit-typographic-motion/fonts/silkscreen/Silkscreen-Bold.ttf +0 -0
- package/plugins/litclaude/skills/lit-typographic-motion/fonts/silkscreen/Silkscreen-Regular.ttf +0 -0
- package/plugins/litclaude/skills/lit-typographic-motion/fonts/stroke/CREDITS +42 -0
- package/plugins/litclaude/skills/lit-typographic-motion/fonts/stroke/EMSAllure.svg +216 -0
- package/plugins/litclaude/skills/lit-typographic-motion/fonts/stroke/EMSFelix.svg +216 -0
- package/plugins/litclaude/skills/lit-typographic-motion/fonts/stroke/EMSOsmotron.svg +216 -0
- package/plugins/litclaude/skills/lit-typographic-motion/fonts/stroke/EMSReadability.svg +216 -0
- package/plugins/litclaude/skills/lit-typographic-motion/fonts/stroke/EMSTech.svg +217 -0
- package/plugins/litclaude/skills/lit-typographic-motion/fonts/stroke/OFL.txt +91 -0
- package/plugins/litclaude/skills/lit-typographic-motion/fonts/vt323/OFL.txt +93 -0
- package/plugins/litclaude/skills/lit-typographic-motion/fonts/vt323/VT323-Regular.ttf +0 -0
- package/plugins/litclaude/skills/lit-typographic-motion/references/brief-schema.md +91 -0
- package/plugins/litclaude/skills/lit-typographic-motion/references/craft-loop.md +69 -0
- package/plugins/litclaude/skills/lit-typographic-motion/references/engine-contract.md +104 -0
- package/plugins/litclaude/skills/lit-typographic-motion/references/look.md +106 -0
- package/plugins/litclaude/skills/lit-typographic-motion/references/runtime.md +65 -0
- package/plugins/litclaude/skills/lit-typographic-motion/references/sound.md +83 -0
- package/plugins/litclaude/skills/lit-typographic-motion/references/stage.md +192 -0
- package/plugins/litclaude/skills/lit-typographic-motion/references/style-bibles.md +117 -0
- package/plugins/litclaude/skills/lit-typographic-motion/references/treatment.md +114 -0
- package/plugins/litclaude/skills/lit-typographic-motion/references/type-craft.md +79 -0
- package/plugins/litclaude/skills/lit-typographic-motion/scripts/motion-doctor.mjs +78 -0
- package/plugins/litclaude/skills/lit-typographic-motion/scripts/motion-runtime.mjs +67 -0
- package/plugins/litclaude/skills/lit-typographic-motion/scripts/motion.mjs +132 -0
- package/plugins/litclaude/skills/litresearch/SKILL.md +54 -18
- package/scripts/doctor.mjs +5 -0
- package/scripts/postinstall.mjs +1 -0
- package/plugins/litclaude/skills/lit-korean/SKILL.md +0 -327
- /package/plugins/litclaude/skills/{lit-korean/references/fidelity-checklist.md → lit-humanizer/references/litclaude-fidelity-checklist.md} +0 -0
- /package/plugins/litclaude/skills/{lit-korean/references/rewrite-rules.md → lit-humanizer/references/litclaude-rewrite-rules.md} +0 -0
- /package/plugins/litclaude/skills/{lit-korean/references/style-patterns.md → lit-humanizer/references/litclaude-style-patterns.md} +0 -0
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
// Raw WebGL2 plumbing: HDR render targets, full-screen shader passes, a compositor and Canvas2D
|
|
2
|
+
// layers uploaded as sRGB textures. Re-expressed without three.js from the mechanism of
|
|
3
|
+
// mexicat/pdoom-video app/src/engine/gl.ts (MIT, see ../NOTICE).
|
|
4
|
+
//
|
|
5
|
+
// Every look-library pass draws through `Pass.draw`, the one uniform-setter wrapper: it records
|
|
6
|
+
// the uniforms and counts draws per pass for the render log (MO-SH-00a), so no pass can draw
|
|
7
|
+
// without leaving a trace the gate can check.
|
|
8
|
+
import { GLSL_COMMON } from "./glsl-common.mjs";
|
|
9
|
+
import { SCALE, W, H, PW, PH } from "./scale.mjs";
|
|
10
|
+
|
|
11
|
+
export { SCALE, W, H, PW, PH };
|
|
12
|
+
|
|
13
|
+
const VERT = `#version 300 es
|
|
14
|
+
precision highp float;
|
|
15
|
+
out vec2 vUv;
|
|
16
|
+
void main() {
|
|
17
|
+
vec2 p = vec2(float((gl_VertexID << 1) & 2), float(gl_VertexID & 2));
|
|
18
|
+
vUv = p;
|
|
19
|
+
gl_Position = vec4(p * 2.0 - 1.0, 0.0, 1.0);
|
|
20
|
+
}`;
|
|
21
|
+
|
|
22
|
+
/** Per-frame render-log recorder shared by every pass. */
|
|
23
|
+
export class Tracker {
|
|
24
|
+
constructor() {
|
|
25
|
+
this.frame = new Map();
|
|
26
|
+
this.recordUniforms = true;
|
|
27
|
+
}
|
|
28
|
+
reset() {
|
|
29
|
+
this.frame = new Map();
|
|
30
|
+
}
|
|
31
|
+
entry(pass) {
|
|
32
|
+
let e = this.frame.get(pass);
|
|
33
|
+
if (!e) {
|
|
34
|
+
e = { draws: 0, uniforms: {} };
|
|
35
|
+
this.frame.set(pass, e);
|
|
36
|
+
}
|
|
37
|
+
return e;
|
|
38
|
+
}
|
|
39
|
+
draw(pass, uniforms) {
|
|
40
|
+
const e = this.entry(pass);
|
|
41
|
+
e.draws += 1;
|
|
42
|
+
if (this.recordUniforms) {
|
|
43
|
+
for (const [name, value] of Object.entries(uniforms)) {
|
|
44
|
+
if (value && typeof value === "object" && value.isTexture) continue;
|
|
45
|
+
e.uniforms[name] = Array.isArray(value) ? value.map((v) => +(+v).toFixed(6)) : typeof value === "number" ? +value.toFixed(6) : value;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
lines() {
|
|
50
|
+
return [...this.frame.entries()].map(([pass, e]) => ({ pass, draws: e.draws, uniforms: e.uniforms }));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export class GL {
|
|
55
|
+
constructor(canvas) {
|
|
56
|
+
const gl = canvas.getContext("webgl2", { antialias: false, alpha: false, depth: false, stencil: false, preserveDrawingBuffer: true, premultipliedAlpha: false, powerPreference: "high-performance" });
|
|
57
|
+
if (!gl) throw new Error("NO_WEBGL2: canvas.getContext('webgl2') returned null");
|
|
58
|
+
if (!gl.getExtension("EXT_color_buffer_float")) throw new Error("NO_WEBGL2: EXT_color_buffer_float is unavailable, so HDR render targets cannot be drawn");
|
|
59
|
+
this.gl = gl;
|
|
60
|
+
this.canvas = canvas;
|
|
61
|
+
this.vao = gl.createVertexArray();
|
|
62
|
+
this.tracker = new Tracker();
|
|
63
|
+
this.programs = new Map();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
renderer() {
|
|
67
|
+
const gl = this.gl;
|
|
68
|
+
const ext = gl.getExtension("WEBGL_debug_renderer_info");
|
|
69
|
+
return ext ? String(gl.getParameter(ext.UNMASKED_RENDERER_WEBGL)) : "unknown (debug-info extension unavailable)";
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** A render target in physical px. `format` is "half" (RGBA16F, linear HDR) or "rgba8". */
|
|
73
|
+
target(width = PW, height = PH, format = "half") {
|
|
74
|
+
const gl = this.gl;
|
|
75
|
+
const tex = gl.createTexture();
|
|
76
|
+
gl.bindTexture(gl.TEXTURE_2D, tex);
|
|
77
|
+
if (format === "half") gl.texStorage2D(gl.TEXTURE_2D, 1, gl.RGBA16F, width, height);
|
|
78
|
+
else gl.texStorage2D(gl.TEXTURE_2D, 1, gl.RGBA8, width, height);
|
|
79
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
80
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
81
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
82
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
83
|
+
const fbo = gl.createFramebuffer();
|
|
84
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
|
|
85
|
+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);
|
|
86
|
+
const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
|
|
87
|
+
if (status !== gl.FRAMEBUFFER_COMPLETE) throw new Error(`framebuffer incomplete (${status}) for ${format} ${width}x${height}`);
|
|
88
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
89
|
+
return { fbo, tex: { isTexture: true, handle: tex }, width, height, format };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
bind(target) {
|
|
93
|
+
const gl = this.gl;
|
|
94
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, target ? target.fbo : null);
|
|
95
|
+
gl.viewport(0, 0, target ? target.width : PW, target ? target.height : PH);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
clear(target, rgb = [0, 0, 0], alpha = 0) {
|
|
99
|
+
const gl = this.gl;
|
|
100
|
+
this.bind(target);
|
|
101
|
+
gl.disable(gl.BLEND);
|
|
102
|
+
gl.clearColor(rgb[0], rgb[1], rgb[2], alpha);
|
|
103
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
program(frag) {
|
|
107
|
+
const cached = this.programs.get(frag);
|
|
108
|
+
if (cached) return cached;
|
|
109
|
+
const gl = this.gl;
|
|
110
|
+
const compile = (type, source) => {
|
|
111
|
+
const shader = gl.createShader(type);
|
|
112
|
+
gl.shaderSource(shader, source);
|
|
113
|
+
gl.compileShader(shader);
|
|
114
|
+
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) throw new Error(`shader compile failed: ${gl.getShaderInfoLog(shader)}`);
|
|
115
|
+
return shader;
|
|
116
|
+
};
|
|
117
|
+
const fragSource = `#version 300 es\nprecision highp float;\nprecision highp int;\nin vec2 vUv;\nout vec4 fragColor;\n${GLSL_COMMON}\n${frag}`;
|
|
118
|
+
const program = gl.createProgram();
|
|
119
|
+
gl.attachShader(program, compile(gl.VERTEX_SHADER, VERT));
|
|
120
|
+
gl.attachShader(program, compile(gl.FRAGMENT_SHADER, fragSource));
|
|
121
|
+
gl.linkProgram(program);
|
|
122
|
+
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) throw new Error(`program link failed: ${gl.getProgramInfoLog(program)}`);
|
|
123
|
+
const uniforms = new Map();
|
|
124
|
+
const count = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);
|
|
125
|
+
for (let i = 0; i < count; i++) {
|
|
126
|
+
const info = gl.getActiveUniform(program, i);
|
|
127
|
+
const name = info.name.replace(/\[0\]$/u, "");
|
|
128
|
+
uniforms.set(name, { location: gl.getUniformLocation(program, info.name), type: info.type, size: info.size });
|
|
129
|
+
}
|
|
130
|
+
const entry = { program, uniforms };
|
|
131
|
+
this.programs.set(frag, entry);
|
|
132
|
+
return entry;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
setUniforms(entry, values) {
|
|
136
|
+
const gl = this.gl;
|
|
137
|
+
let unit = 0;
|
|
138
|
+
for (const [name, value] of Object.entries(values)) {
|
|
139
|
+
const u = entry.uniforms.get(name);
|
|
140
|
+
if (!u) continue;
|
|
141
|
+
const v = typeof value === "boolean" ? (value ? 1 : 0) : value;
|
|
142
|
+
switch (u.type) {
|
|
143
|
+
case gl.FLOAT: gl.uniform1f(u.location, v); break;
|
|
144
|
+
case gl.FLOAT_VEC2: gl.uniform2fv(u.location, v); break;
|
|
145
|
+
case gl.FLOAT_VEC3: gl.uniform3fv(u.location, v); break;
|
|
146
|
+
case gl.FLOAT_VEC4: gl.uniform4fv(u.location, v); break;
|
|
147
|
+
case gl.INT: case gl.BOOL: gl.uniform1i(u.location, v); break;
|
|
148
|
+
case gl.UNSIGNED_INT: gl.uniform1ui(u.location, v >>> 0); break;
|
|
149
|
+
case gl.SAMPLER_2D:
|
|
150
|
+
gl.activeTexture(gl.TEXTURE0 + unit);
|
|
151
|
+
gl.bindTexture(gl.TEXTURE_2D, v ? v.handle : null);
|
|
152
|
+
gl.uniform1i(u.location, unit);
|
|
153
|
+
unit += 1;
|
|
154
|
+
break;
|
|
155
|
+
default: throw new Error(`unsupported uniform type for ${name}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
blend(mode) {
|
|
161
|
+
const gl = this.gl;
|
|
162
|
+
if (mode === "replace") {
|
|
163
|
+
gl.disable(gl.BLEND);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
gl.enable(gl.BLEND);
|
|
167
|
+
if (mode === "normal") {
|
|
168
|
+
// Premultiplied colour over the target; the target's alpha (glyph coverage) is kept.
|
|
169
|
+
gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);
|
|
170
|
+
gl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ZERO, gl.ONE);
|
|
171
|
+
} else if (mode === "glyph") {
|
|
172
|
+
// Glyph ink: colour over, coverage = max(target, glyph) so alpha carries the glyph mask.
|
|
173
|
+
gl.blendEquationSeparate(gl.FUNC_ADD, gl.MAX);
|
|
174
|
+
gl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE);
|
|
175
|
+
} else if (mode === "add") {
|
|
176
|
+
gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);
|
|
177
|
+
gl.blendFuncSeparate(gl.ONE, gl.ONE, gl.ONE, gl.ONE);
|
|
178
|
+
} else throw new Error(`unknown blend mode ${mode}`);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/** Download a target's RGBA8 pixels through a pixel-pack buffer and a fence (no GPU stall). */
|
|
182
|
+
async readPixelsAsync(target, out) {
|
|
183
|
+
const gl = this.gl;
|
|
184
|
+
const bytes = target.width * target.height * 4;
|
|
185
|
+
const buffer = out ?? new Uint8Array(bytes);
|
|
186
|
+
if (!this.pbo || this.pboBytes !== bytes) {
|
|
187
|
+
if (this.pbo) gl.deleteBuffer(this.pbo);
|
|
188
|
+
this.pbo = gl.createBuffer();
|
|
189
|
+
gl.bindBuffer(gl.PIXEL_PACK_BUFFER, this.pbo);
|
|
190
|
+
gl.bufferData(gl.PIXEL_PACK_BUFFER, bytes, gl.STREAM_READ);
|
|
191
|
+
this.pboBytes = bytes;
|
|
192
|
+
}
|
|
193
|
+
this.bind(target);
|
|
194
|
+
gl.bindBuffer(gl.PIXEL_PACK_BUFFER, this.pbo);
|
|
195
|
+
gl.readPixels(0, 0, target.width, target.height, gl.RGBA, gl.UNSIGNED_BYTE, 0);
|
|
196
|
+
const sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0);
|
|
197
|
+
gl.flush();
|
|
198
|
+
for (;;) {
|
|
199
|
+
const state = gl.clientWaitSync(sync, 0, 0);
|
|
200
|
+
if (state === gl.ALREADY_SIGNALED || state === gl.CONDITION_SATISFIED) break;
|
|
201
|
+
if (state === gl.WAIT_FAILED) throw new Error("clientWaitSync failed during pixel readback");
|
|
202
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
203
|
+
}
|
|
204
|
+
gl.deleteSync(sync);
|
|
205
|
+
gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, buffer);
|
|
206
|
+
gl.bindBuffer(gl.PIXEL_PACK_BUFFER, null);
|
|
207
|
+
return buffer;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* A full-screen fragment pass. `frag` declares its uniforms and writes `fragColor`; `vUv` (0..1,
|
|
213
|
+
* y up) and GLSL_COMMON are provided. `pass` names the look-library pass it belongs to (null for
|
|
214
|
+
* engine plumbing); only named passes are logged.
|
|
215
|
+
*/
|
|
216
|
+
export class Pass {
|
|
217
|
+
constructor(glw, frag, { pass = null } = {}) {
|
|
218
|
+
this.glw = glw;
|
|
219
|
+
this.frag = frag;
|
|
220
|
+
this.pass = pass;
|
|
221
|
+
this.entry = glw.program(frag);
|
|
222
|
+
}
|
|
223
|
+
draw(target, uniforms = {}, { blend = "replace" } = {}) {
|
|
224
|
+
const { glw } = this;
|
|
225
|
+
const gl = glw.gl;
|
|
226
|
+
glw.bind(target);
|
|
227
|
+
gl.useProgram(this.entry.program);
|
|
228
|
+
glw.setUniforms(this.entry, uniforms);
|
|
229
|
+
glw.blend(blend);
|
|
230
|
+
gl.bindVertexArray(glw.vao);
|
|
231
|
+
gl.drawArrays(gl.TRIANGLES, 0, 3);
|
|
232
|
+
gl.bindVertexArray(null);
|
|
233
|
+
if (this.pass) glw.tracker.draw(this.pass, uniforms);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
const COMPOSITE_FRAG = /* glsl */ `
|
|
238
|
+
uniform sampler2D src; uniform float opacity; uniform vec3 tint;
|
|
239
|
+
void main() {
|
|
240
|
+
// Canvas2D layers are uploaded unpremultiplied as SRGB8_ALPHA8, so RGB arrives already linear
|
|
241
|
+
// and is premultiplied here.
|
|
242
|
+
vec4 c = texture(src, vUv);
|
|
243
|
+
float a = c.a * opacity;
|
|
244
|
+
fragColor = vec4(c.rgb * tint * a, a);
|
|
245
|
+
}`;
|
|
246
|
+
|
|
247
|
+
/** Draws a texture over a target: `normal` keeps the target's glyph mask, `glyph` adds to it. */
|
|
248
|
+
export class Compositor {
|
|
249
|
+
constructor(glw) {
|
|
250
|
+
this.pass = new Pass(glw, COMPOSITE_FRAG);
|
|
251
|
+
}
|
|
252
|
+
draw(texture, target, { mode = "normal", opacity = 1, tint = [1, 1, 1], logAs = null } = {}) {
|
|
253
|
+
this.pass.pass = logAs;
|
|
254
|
+
this.pass.draw(target, { src: texture, opacity, tint }, { blend: mode });
|
|
255
|
+
this.pass.pass = null;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* A logical 1920x1080 Canvas2D surface uploaded as an sRGB texture. The context is CPU-backed
|
|
261
|
+
* (willReadFrequently) so its rasterization does not depend on GPU raster scheduling, and it is
|
|
262
|
+
* pre-scaled so drawing code works in logical px at every output scale.
|
|
263
|
+
*/
|
|
264
|
+
export class Layer2D {
|
|
265
|
+
constructor(glw, width = W, height = H) {
|
|
266
|
+
this.glw = glw;
|
|
267
|
+
this.width = width;
|
|
268
|
+
this.height = height;
|
|
269
|
+
this.canvas = document.createElement("canvas");
|
|
270
|
+
this.canvas.width = Math.round(width * SCALE);
|
|
271
|
+
this.canvas.height = Math.round(height * SCALE);
|
|
272
|
+
this.ctx = this.canvas.getContext("2d", { willReadFrequently: true, alpha: true });
|
|
273
|
+
const gl = glw.gl;
|
|
274
|
+
this.handle = gl.createTexture();
|
|
275
|
+
gl.bindTexture(gl.TEXTURE_2D, this.handle);
|
|
276
|
+
gl.texStorage2D(gl.TEXTURE_2D, 1, gl.SRGB8_ALPHA8, this.canvas.width, this.canvas.height);
|
|
277
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
278
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
279
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
280
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
281
|
+
this.texture = { isTexture: true, handle: this.handle };
|
|
282
|
+
this.clear();
|
|
283
|
+
}
|
|
284
|
+
clear() {
|
|
285
|
+
const c = this.ctx;
|
|
286
|
+
c.setTransform(SCALE, 0, 0, SCALE, 0, 0);
|
|
287
|
+
c.globalAlpha = 1;
|
|
288
|
+
c.globalCompositeOperation = "source-over";
|
|
289
|
+
c.filter = "none";
|
|
290
|
+
c.shadowBlur = 0;
|
|
291
|
+
c.clearRect(0, 0, this.width, this.height);
|
|
292
|
+
}
|
|
293
|
+
upload() {
|
|
294
|
+
const gl = this.glw.gl;
|
|
295
|
+
gl.bindTexture(gl.TEXTURE_2D, this.handle);
|
|
296
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
|
|
297
|
+
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
|
|
298
|
+
gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE);
|
|
299
|
+
gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.canvas);
|
|
300
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
|
|
301
|
+
return this.texture;
|
|
302
|
+
}
|
|
303
|
+
/** Re-upload only a logical-px rectangle of the canvas (the rest of the texture is kept). */
|
|
304
|
+
uploadRegion(x, y, w, h) {
|
|
305
|
+
const gl = this.glw.gl;
|
|
306
|
+
const px = Math.max(0, Math.floor(x * SCALE));
|
|
307
|
+
const py = Math.max(0, Math.floor(y * SCALE));
|
|
308
|
+
const pw = Math.min(this.canvas.width - px, Math.ceil((x + w) * SCALE) - px);
|
|
309
|
+
const ph = Math.min(this.canvas.height - py, Math.ceil((y + h) * SCALE) - py);
|
|
310
|
+
const region = this.ctx.getImageData(px, py, pw, ph);
|
|
311
|
+
gl.bindTexture(gl.TEXTURE_2D, this.handle);
|
|
312
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
|
|
313
|
+
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
|
|
314
|
+
gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE);
|
|
315
|
+
gl.texSubImage2D(gl.TEXTURE_2D, 0, px, this.canvas.height - py - ph, pw, ph, gl.RGBA, gl.UNSIGNED_BYTE, region);
|
|
316
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
|
|
317
|
+
return this.texture;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// Shared GLSL ES 3.0 header prepended to every full-screen pass. Adapted in structure from
|
|
2
|
+
// mexicat/pdoom-video app/src/engine/glsl/common.ts (MIT, see ../NOTICE): output-scale-aware
|
|
3
|
+
// fragment coordinates, colour transfer helpers and pure noise. The noise here is this engine's
|
|
4
|
+
// own integer-hash value noise, seeded through `uint` uniforms (MO-SH-01), so every pass that needs
|
|
5
|
+
// randomness is a pure function of (pixel, seed, t).
|
|
6
|
+
import { SCALE } from "./scale.mjs";
|
|
7
|
+
|
|
8
|
+
export const GLSL_COMMON = /* glsl */ `
|
|
9
|
+
#define PI 3.14159265359
|
|
10
|
+
#define TAU 6.28318530718
|
|
11
|
+
const float PX_SCALE = ${SCALE.toFixed(1)};
|
|
12
|
+
#define FRAG_PX (gl_FragCoord.xy / PX_SCALE)
|
|
13
|
+
const vec2 LOGICAL = vec2(1920.0, 1080.0);
|
|
14
|
+
|
|
15
|
+
float sat(float x) { return clamp(x, 0.0, 1.0); }
|
|
16
|
+
vec3 sat(vec3 x) { return clamp(x, 0.0, 1.0); }
|
|
17
|
+
float luma(vec3 c) { return dot(c, vec3(0.2126, 0.7152, 0.0722)); }
|
|
18
|
+
mat2 rot2(float a) { float c = cos(a), s = sin(a); return mat2(c, -s, s, c); }
|
|
19
|
+
|
|
20
|
+
vec3 toSRGB(vec3 c) { c = max(c, 0.0); return mix(12.92 * c, 1.055 * pow(c, vec3(1.0 / 2.4)) - 0.055, step(0.0031308, c)); }
|
|
21
|
+
vec3 toLinear(vec3 c) { return mix(c / 12.92, pow((c + 0.055) / 1.055, vec3(2.4)), step(0.04045, c)); }
|
|
22
|
+
|
|
23
|
+
// 32-bit integer hash (xorshift-multiply). Deterministic on every WebGL2 implementation because it
|
|
24
|
+
// only uses uint multiply, xor and shifts.
|
|
25
|
+
uint uhash(uint x) {
|
|
26
|
+
x ^= x >> 16u; x *= 0x7feb352du;
|
|
27
|
+
x ^= x >> 15u; x *= 0x846ca68bu;
|
|
28
|
+
x ^= x >> 16u;
|
|
29
|
+
return x;
|
|
30
|
+
}
|
|
31
|
+
uint uhash2(uvec2 v) { return uhash(v.x ^ uhash(v.y + 0x9e3779b9u)); }
|
|
32
|
+
uint uhash3(uvec3 v) { return uhash(v.x ^ uhash(v.y ^ uhash(v.z + 0x85ebca6bu))); }
|
|
33
|
+
float unit(uint h) { return float(h >> 8u) * (1.0 / 16777216.0); }
|
|
34
|
+
float hashCell(ivec2 c, uint seed) { return unit(uhash3(uvec3(uint(c.x), uint(c.y), seed))); }
|
|
35
|
+
float hashCell3(ivec3 c, uint seed) { return unit(uhash(uhash3(uvec3(c)) ^ seed)); }
|
|
36
|
+
|
|
37
|
+
vec2 quintic(vec2 t) { return t * t * t * (t * (t * 6.0 - 15.0) + 10.0); }
|
|
38
|
+
vec3 quintic(vec3 t) { return t * t * t * (t * (t * 6.0 - 15.0) + 10.0); }
|
|
39
|
+
|
|
40
|
+
// Value noise in [-1, 1].
|
|
41
|
+
float vnoise(vec2 p, uint seed) {
|
|
42
|
+
ivec2 i = ivec2(floor(p)); vec2 f = quintic(fract(p));
|
|
43
|
+
float a = hashCell(i, seed), b = hashCell(i + ivec2(1, 0), seed);
|
|
44
|
+
float c = hashCell(i + ivec2(0, 1), seed), d = hashCell(i + ivec2(1, 1), seed);
|
|
45
|
+
return mix(mix(a, b, f.x), mix(c, d, f.x), f.y) * 2.0 - 1.0;
|
|
46
|
+
}
|
|
47
|
+
float vnoise(vec3 p, uint seed) {
|
|
48
|
+
ivec3 i = ivec3(floor(p)); vec3 f = quintic(fract(p));
|
|
49
|
+
float n000 = hashCell3(i, seed), n100 = hashCell3(i + ivec3(1, 0, 0), seed);
|
|
50
|
+
float n010 = hashCell3(i + ivec3(0, 1, 0), seed), n110 = hashCell3(i + ivec3(1, 1, 0), seed);
|
|
51
|
+
float n001 = hashCell3(i + ivec3(0, 0, 1), seed), n101 = hashCell3(i + ivec3(1, 0, 1), seed);
|
|
52
|
+
float n011 = hashCell3(i + ivec3(0, 1, 1), seed), n111 = hashCell3(i + ivec3(1, 1, 1), seed);
|
|
53
|
+
float x00 = mix(n000, n100, f.x), x10 = mix(n010, n110, f.x), x01 = mix(n001, n101, f.x), x11 = mix(n011, n111, f.x);
|
|
54
|
+
return mix(mix(x00, x10, f.y), mix(x01, x11, f.y), f.z) * 2.0 - 1.0;
|
|
55
|
+
}
|
|
56
|
+
float fbm(vec3 p, int octaves, uint seed) {
|
|
57
|
+
float sum = 0.0, amp = 0.5;
|
|
58
|
+
for (int i = 0; i < 8; i++) {
|
|
59
|
+
if (i >= octaves) break;
|
|
60
|
+
sum += amp * vnoise(p, seed + uint(i) * 101u);
|
|
61
|
+
p = p * 2.02 + vec3(17.1, 9.3, 4.7);
|
|
62
|
+
amp *= 0.5;
|
|
63
|
+
}
|
|
64
|
+
return sum;
|
|
65
|
+
}
|
|
66
|
+
// Divergence-free flow direction from the gradient of a scalar noise field.
|
|
67
|
+
vec2 curl(vec2 p, float z, uint seed) {
|
|
68
|
+
const float e = 0.02;
|
|
69
|
+
float n1 = vnoise(vec3(p + vec2(0.0, e), z), seed), n2 = vnoise(vec3(p - vec2(0.0, e), z), seed);
|
|
70
|
+
float n3 = vnoise(vec3(p + vec2(e, 0.0), z), seed), n4 = vnoise(vec3(p - vec2(e, 0.0), z), seed);
|
|
71
|
+
return vec2(n1 - n2, n4 - n3) / (2.0 * e);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Ordered-dither thresholds in [0, 1).
|
|
75
|
+
float bayer2(ivec2 p) { int x = p.x & 1, y = p.y & 1; return float((x ^ y) * 2 + y) / 4.0; }
|
|
76
|
+
float bayer4(ivec2 p) { return (bayer2(p / 2) + bayer2(p) * 4.0) / 4.0; }
|
|
77
|
+
float bayer8(ivec2 p) { return (bayer4(p / 2) + bayer2(p) * 16.0) / 4.0; }
|
|
78
|
+
`;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head><meta charset="utf-8"><title>lit-typographic-motion</title>
|
|
4
|
+
<style>html,body{margin:0;background:#000}canvas{display:block}</style></head>
|
|
5
|
+
<body><canvas id="gl" width="16" height="16"></canvas><script type="module" src="./boot.mjs"></script></body>
|
|
6
|
+
</html>
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// GPU-instanced anti-aliased capsule segments in logical 2D pixel space (origin top-left, y down),
|
|
2
|
+
// one draw call per batch. Adapted from mexicat/pdoom-video app/src/engine/lines.ts (MIT, see
|
|
3
|
+
// ../NOTICE), reduced to the 2D case the look library needs (hairline rules, meters, strokes).
|
|
4
|
+
import { SCALE, W, H } from "./gl.mjs";
|
|
5
|
+
|
|
6
|
+
const VERT = `#version 300 es
|
|
7
|
+
precision highp float;
|
|
8
|
+
layout(location = 0) in vec2 corner;
|
|
9
|
+
layout(location = 1) in vec4 seg;
|
|
10
|
+
layout(location = 2) in vec4 color;
|
|
11
|
+
layout(location = 3) in float width;
|
|
12
|
+
uniform vec2 res; uniform float pxScale;
|
|
13
|
+
out vec2 vLocal; out float vLen; out float vHalf; out vec4 vColor;
|
|
14
|
+
void main() {
|
|
15
|
+
vec2 a = seg.xy * pxScale, b = seg.zw * pxScale;
|
|
16
|
+
float w = width * pxScale;
|
|
17
|
+
float hw = max(w * 0.5, 0.35) + 1.0;
|
|
18
|
+
vec2 d = b - a; float len = length(d);
|
|
19
|
+
vec2 dir = len > 1e-4 ? d / len : vec2(1.0, 0.0);
|
|
20
|
+
vec2 nrm = vec2(-dir.y, dir.x);
|
|
21
|
+
float along = mix(-hw, len + hw, corner.x);
|
|
22
|
+
vec2 p = a + dir * along + nrm * corner.y * hw;
|
|
23
|
+
vec2 physical = res * pxScale;
|
|
24
|
+
gl_Position = vec4(p.x / physical.x * 2.0 - 1.0, 1.0 - p.y / physical.y * 2.0, 0.0, 1.0);
|
|
25
|
+
vLocal = vec2(along, corner.y * hw);
|
|
26
|
+
vLen = len; vHalf = max(w * 0.5, 0.35);
|
|
27
|
+
vColor = color * vec4(1.0, 1.0, 1.0, min(1.0, w / 0.7));
|
|
28
|
+
}`;
|
|
29
|
+
|
|
30
|
+
const FRAG = `#version 300 es
|
|
31
|
+
precision highp float;
|
|
32
|
+
in vec2 vLocal; in float vLen; in float vHalf; in vec4 vColor;
|
|
33
|
+
out vec4 fragColor;
|
|
34
|
+
void main() {
|
|
35
|
+
float x = clamp(vLocal.x, 0.0, vLen);
|
|
36
|
+
float d = length(vec2(vLocal.x - x, vLocal.y)) - vHalf;
|
|
37
|
+
float a = clamp(0.5 - d, 0.0, 1.0) * vColor.a;
|
|
38
|
+
if (a <= 0.0) discard;
|
|
39
|
+
fragColor = vec4(vColor.rgb * a, a);
|
|
40
|
+
}`;
|
|
41
|
+
|
|
42
|
+
export class LineBatch {
|
|
43
|
+
constructor(glw, capacity = 256) {
|
|
44
|
+
this.glw = glw;
|
|
45
|
+
const gl = glw.gl;
|
|
46
|
+
this.capacity = capacity;
|
|
47
|
+
this.data = new Float32Array(capacity * 9);
|
|
48
|
+
this.count = 0;
|
|
49
|
+
const compile = (type, source) => {
|
|
50
|
+
const s = gl.createShader(type);
|
|
51
|
+
gl.shaderSource(s, source);
|
|
52
|
+
gl.compileShader(s);
|
|
53
|
+
if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) throw new Error(`line shader: ${gl.getShaderInfoLog(s)}`);
|
|
54
|
+
return s;
|
|
55
|
+
};
|
|
56
|
+
this.program = gl.createProgram();
|
|
57
|
+
gl.attachShader(this.program, compile(gl.VERTEX_SHADER, VERT));
|
|
58
|
+
gl.attachShader(this.program, compile(gl.FRAGMENT_SHADER, FRAG));
|
|
59
|
+
gl.linkProgram(this.program);
|
|
60
|
+
if (!gl.getProgramParameter(this.program, gl.LINK_STATUS)) throw new Error(`line program: ${gl.getProgramInfoLog(this.program)}`);
|
|
61
|
+
this.uRes = gl.getUniformLocation(this.program, "res");
|
|
62
|
+
this.uScale = gl.getUniformLocation(this.program, "pxScale");
|
|
63
|
+
this.vao = gl.createVertexArray();
|
|
64
|
+
gl.bindVertexArray(this.vao);
|
|
65
|
+
const quad = gl.createBuffer();
|
|
66
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, quad);
|
|
67
|
+
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0, -1, 1, -1, 1, 1, 0, -1, 1, 1, 0, 1]), gl.STATIC_DRAW);
|
|
68
|
+
gl.enableVertexAttribArray(0);
|
|
69
|
+
gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
|
|
70
|
+
this.instances = gl.createBuffer();
|
|
71
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.instances);
|
|
72
|
+
gl.bufferData(gl.ARRAY_BUFFER, this.data.byteLength, gl.DYNAMIC_DRAW);
|
|
73
|
+
const stride = 9 * 4;
|
|
74
|
+
gl.enableVertexAttribArray(1);
|
|
75
|
+
gl.vertexAttribPointer(1, 4, gl.FLOAT, false, stride, 0);
|
|
76
|
+
gl.vertexAttribDivisor(1, 1);
|
|
77
|
+
gl.enableVertexAttribArray(2);
|
|
78
|
+
gl.vertexAttribPointer(2, 4, gl.FLOAT, false, stride, 16);
|
|
79
|
+
gl.vertexAttribDivisor(2, 1);
|
|
80
|
+
gl.enableVertexAttribArray(3);
|
|
81
|
+
gl.vertexAttribPointer(3, 1, gl.FLOAT, false, stride, 32);
|
|
82
|
+
gl.vertexAttribDivisor(3, 1);
|
|
83
|
+
gl.bindVertexArray(null);
|
|
84
|
+
}
|
|
85
|
+
clear() {
|
|
86
|
+
this.count = 0;
|
|
87
|
+
}
|
|
88
|
+
/** Segment from (x0, y0) to (x1, y1) in logical px; colour is linear RGB plus alpha. */
|
|
89
|
+
segment(x0, y0, x1, y1, width, rgb, alpha = 1) {
|
|
90
|
+
if (this.count >= this.capacity) throw new Error(`LineBatch capacity ${this.capacity} exceeded`);
|
|
91
|
+
this.data.set([x0, y0, x1, y1, rgb[0], rgb[1], rgb[2], alpha, width], this.count * 9);
|
|
92
|
+
this.count += 1;
|
|
93
|
+
}
|
|
94
|
+
/** Draw every queued segment over `target` in one instanced call. Returns the draw count (0|1). */
|
|
95
|
+
draw(target, { pass = null } = {}) {
|
|
96
|
+
if (this.count === 0) return 0;
|
|
97
|
+
const { glw } = this;
|
|
98
|
+
const gl = glw.gl;
|
|
99
|
+
glw.bind(target);
|
|
100
|
+
gl.useProgram(this.program);
|
|
101
|
+
gl.uniform2f(this.uRes, W, H);
|
|
102
|
+
gl.uniform1f(this.uScale, SCALE);
|
|
103
|
+
glw.blend("normal");
|
|
104
|
+
gl.bindVertexArray(this.vao);
|
|
105
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.instances);
|
|
106
|
+
gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.data, 0, this.count * 9);
|
|
107
|
+
gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, this.count);
|
|
108
|
+
gl.bindVertexArray(null);
|
|
109
|
+
if (pass) glw.tracker.draw(pass, { segments: this.count });
|
|
110
|
+
return 1;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// crt (MO-SH-07): barrel curvature, scanlines, a subtle aperture triad, a local glow, vignette and a
|
|
2
|
+
// capped brightness flicker. Scanlines, curvature and vignette are pure functions of position, so
|
|
3
|
+
// they carry no flash risk; the flicker multiplier is computed on the CPU, logged every frame and
|
|
4
|
+
// capped at 0.06 peak-to-peak, below the flash audit's 0.1 trigger by construction. The boot
|
|
5
|
+
// flicker is the same capped multiplier over the shot's first 250 ms and counts as one event.
|
|
6
|
+
//
|
|
7
|
+
// Phosphor persistence is finite-memory: it blends in the previous sub-sample's crt input, never
|
|
8
|
+
// its own output, so a seek that replays the preroll reproduces it exactly. It is only allowed on
|
|
9
|
+
// a stateful shot; the gate fails a manifest that enables it anywhere else.
|
|
10
|
+
import { SHADER } from "../../core/constants.mjs";
|
|
11
|
+
import { Pass } from "../gl.mjs";
|
|
12
|
+
|
|
13
|
+
const FRAG = /* glsl */ `
|
|
14
|
+
uniform sampler2D src; uniform sampler2D u_prev; uniform uint u_seed;
|
|
15
|
+
uniform float u_scanlineFreqPerFrame, u_scanlineDepth, u_phosphorPersistence, u_bloomAmount, u_curvature, u_vignette, u_triadMaskAmount, u_flicker;
|
|
16
|
+
vec2 barrel(vec2 uv) {
|
|
17
|
+
vec2 d = uv - 0.5;
|
|
18
|
+
return uv + d * dot(d, d) * u_curvature * 2.0;
|
|
19
|
+
}
|
|
20
|
+
void main() {
|
|
21
|
+
vec2 uv = barrel(vUv);
|
|
22
|
+
if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) { fragColor = vec4(0.0); return; }
|
|
23
|
+
vec4 c = texture(src, uv);
|
|
24
|
+
vec3 col = c.rgb;
|
|
25
|
+
if (u_phosphorPersistence > 0.0) col += texture(u_prev, uv).rgb * u_phosphorPersistence;
|
|
26
|
+
if (u_bloomAmount > 0.0) {
|
|
27
|
+
vec2 px = 1.5 / LOGICAL;
|
|
28
|
+
vec3 glow = texture(src, uv + vec2(px.x, 0.0)).rgb + texture(src, uv - vec2(px.x, 0.0)).rgb
|
|
29
|
+
+ texture(src, uv + vec2(0.0, px.y)).rgb + texture(src, uv - vec2(0.0, px.y)).rgb;
|
|
30
|
+
col += max(glow * 0.25 - 0.35, 0.0) * u_bloomAmount;
|
|
31
|
+
}
|
|
32
|
+
float y = uv.y * LOGICAL.y;
|
|
33
|
+
float scan = 0.5 + 0.5 * cos(y * TAU * u_scanlineFreqPerFrame / LOGICAL.y);
|
|
34
|
+
col *= 1.0 - u_scanlineDepth * (1.0 - scan);
|
|
35
|
+
int column = int(floor(FRAG_PX.x)) % 3;
|
|
36
|
+
vec3 triad = column == 0 ? vec3(1.0, 0.82, 0.82) : column == 1 ? vec3(0.82, 1.0, 0.82) : vec3(0.82, 0.82, 1.0);
|
|
37
|
+
float grainStatic = (unit(uhash3(uvec3(uvec2(FRAG_PX), u_seed))) - 0.5) * 0.04;
|
|
38
|
+
col *= mix(vec3(1.0), triad * (1.0 + grainStatic), u_triadMaskAmount);
|
|
39
|
+
vec2 d = uv - 0.5;
|
|
40
|
+
col *= mix(1.0, smoothstep(0.75, 0.2, length(d * vec2(1.0, 0.9))), u_vignette);
|
|
41
|
+
col *= u_flicker;
|
|
42
|
+
fragColor = vec4(col, c.a);
|
|
43
|
+
}`;
|
|
44
|
+
|
|
45
|
+
export class Crt {
|
|
46
|
+
constructor(glw, { params, software }) {
|
|
47
|
+
this.id = "crt";
|
|
48
|
+
this.category = "filter";
|
|
49
|
+
this.glw = glw;
|
|
50
|
+
this.params = { ...params, flickerAmp: Math.min(SHADER.crtFlickerCap, params.flickerAmp) };
|
|
51
|
+
this.downgraded = Boolean(software);
|
|
52
|
+
if (software) this.params.phosphorPersistence = 0;
|
|
53
|
+
this.pass = new Pass(glw, FRAG, { pass: this.id });
|
|
54
|
+
this.history = null;
|
|
55
|
+
}
|
|
56
|
+
get persistence() {
|
|
57
|
+
return this.params.phosphorPersistence > 0;
|
|
58
|
+
}
|
|
59
|
+
shotState(seed, events, shot) {
|
|
60
|
+
const boot = events.add(shot.start, "boot-flicker") ? shot.start : null;
|
|
61
|
+
return { seed, boot };
|
|
62
|
+
}
|
|
63
|
+
resetHistory() {
|
|
64
|
+
if (this.history) this.glw.clear(this.history, [0, 0, 0], 0);
|
|
65
|
+
}
|
|
66
|
+
/** Flicker multiplier at t: base amplitude, or the cap during the boot window. */
|
|
67
|
+
flicker(t, state) {
|
|
68
|
+
const p = this.params;
|
|
69
|
+
const booting = state.boot !== null && t >= state.boot && t < state.boot + 0.25;
|
|
70
|
+
const amp = booting ? SHADER.crtFlickerCap : p.flickerAmp;
|
|
71
|
+
return 1 + 0.5 * amp * Math.sin(Math.PI * 2 * p.flickerFreqHz * t);
|
|
72
|
+
}
|
|
73
|
+
apply(src, dst, f, state) {
|
|
74
|
+
const p = this.params;
|
|
75
|
+
if (this.persistence && !this.history) {
|
|
76
|
+
this.history = this.glw.target();
|
|
77
|
+
this.resetHistory();
|
|
78
|
+
}
|
|
79
|
+
this.pass.draw(dst, {
|
|
80
|
+
src, u_prev: this.history ? this.history.tex : src, u_seed: state.seed, u_scanlineFreqPerFrame: p.scanlineFreqPerFrame,
|
|
81
|
+
u_scanlineDepth: p.scanlineDepth, u_phosphorPersistence: p.phosphorPersistence, u_bloomAmount: p.bloomAmount,
|
|
82
|
+
u_curvature: p.curvature, u_vignette: p.vignette, u_triadMaskAmount: p.triadMaskAmount, u_flicker: this.flicker(f.t, state),
|
|
83
|
+
});
|
|
84
|
+
if (this.persistence) this.copyHistory(src);
|
|
85
|
+
}
|
|
86
|
+
copyHistory(src) {
|
|
87
|
+
if (!this.copy) this.copy = new Pass(this.glw, "uniform sampler2D src; void main() { fragColor = texture(src, vUv); }");
|
|
88
|
+
this.copy.draw(this.history, { src });
|
|
89
|
+
}
|
|
90
|
+
manifestParams(state) {
|
|
91
|
+
const p = this.params;
|
|
92
|
+
return {
|
|
93
|
+
scanlineFreq: p.scanlineFreqPerFrame, scanlineDepth: p.scanlineDepth, curvature: p.curvature, vignette: p.vignette,
|
|
94
|
+
flickerAmp: p.flickerAmp, flickerFreqHz: p.flickerFreqHz, persistenceEnabled: this.persistence,
|
|
95
|
+
bootFlickerTimes: state.boot === null ? [] : [+state.boot.toFixed(4)],
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// dither (MO-SH-08): ordered-dither quantization locked to screen space. Bayer modes take no seed;
|
|
2
|
+
// mode 3 offsets an interleaved-gradient-noise tile by the shot seed. The seed is set once per shot
|
|
3
|
+
// and never changes inside it, so the pattern cannot become a per-frame luminance flicker.
|
|
4
|
+
import { Pass } from "../gl.mjs";
|
|
5
|
+
|
|
6
|
+
const FRAG = /* glsl */ `
|
|
7
|
+
uniform sampler2D src; uniform int u_ditherMode; uniform int u_paletteSize; uniform int u_pixelScale;
|
|
8
|
+
uniform float u_ditherStrength; uniform uint u_seed;
|
|
9
|
+
float threshold(ivec2 cell) {
|
|
10
|
+
if (u_ditherMode == 0) return bayer2(cell);
|
|
11
|
+
if (u_ditherMode == 1) return bayer4(cell);
|
|
12
|
+
if (u_ditherMode == 2) return bayer8(cell);
|
|
13
|
+
// Interleaved gradient noise with a per-shot tile offset: a cheap stand-in for a blue-noise tile.
|
|
14
|
+
vec2 p = vec2(cell) + vec2(float(u_seed & 255u), float((u_seed >> 8u) & 255u));
|
|
15
|
+
return fract(52.9829189 * fract(dot(p, vec2(0.06711056, 0.00583715))));
|
|
16
|
+
}
|
|
17
|
+
void main() {
|
|
18
|
+
vec4 c = texture(src, vUv);
|
|
19
|
+
vec3 s = toSRGB(sat(c.rgb));
|
|
20
|
+
ivec2 cell = ivec2(floor(FRAG_PX / float(max(u_pixelScale, 1))));
|
|
21
|
+
float levels = u_paletteSize > 1 ? float(u_paletteSize - 1) : 31.0;
|
|
22
|
+
vec3 q = floor(s * levels + threshold(cell)) / levels;
|
|
23
|
+
s = mix(s, sat(q), u_ditherStrength);
|
|
24
|
+
fragColor = vec4(toLinear(s) + max(c.rgb - 1.0, 0.0), c.a);
|
|
25
|
+
}`;
|
|
26
|
+
|
|
27
|
+
export class Dither {
|
|
28
|
+
constructor(glw, { params }) {
|
|
29
|
+
this.id = "dither";
|
|
30
|
+
this.category = "filter";
|
|
31
|
+
this.params = { ...params };
|
|
32
|
+
this.pass = new Pass(glw, FRAG, { pass: this.id });
|
|
33
|
+
}
|
|
34
|
+
shotState(seed) {
|
|
35
|
+
return { seed };
|
|
36
|
+
}
|
|
37
|
+
apply(src, dst, f, state, { stillOverrides } = {}) {
|
|
38
|
+
const p = this.params;
|
|
39
|
+
// The blue-noise stand-in is a random source; the poster and reduced-motion still turn it off.
|
|
40
|
+
const noiseOff = stillOverrides?.noise === 0 && p.mode === 3;
|
|
41
|
+
this.pass.draw(dst, {
|
|
42
|
+
src, u_ditherMode: p.mode, u_paletteSize: p.paletteSize, u_pixelScale: p.pixelScale,
|
|
43
|
+
u_ditherStrength: noiseOff ? 0 : p.strength, u_seed: state.seed,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
manifestParams() {
|
|
47
|
+
return { mode: this.params.mode, paletteSize: this.params.paletteSize, pixelScale: this.params.pixelScale, strength: this.params.strength };
|
|
48
|
+
}
|
|
49
|
+
}
|