@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,47 @@
|
|
|
1
|
+
// karaoke-line: one line revealed eojeol by eojeol at the timeline's reveal steps. Every word keeps
|
|
2
|
+
// the position it has in the finished line, so nothing reflows while it reveals; the word being
|
|
3
|
+
// read is set in the signal colour when the size makes that colour legible (MO-B-01).
|
|
4
|
+
import { clamp, ease } from "../../core/util.mjs";
|
|
5
|
+
import { GATE } from "../../core/constants.mjs";
|
|
6
|
+
import { Scene, landing } from "../scene.mjs";
|
|
7
|
+
|
|
8
|
+
export default class KaraokeLine extends Scene {
|
|
9
|
+
init() {
|
|
10
|
+
this.words = this.ctx.shot.text.trim().split(/\s+/u);
|
|
11
|
+
}
|
|
12
|
+
render(f, stage) {
|
|
13
|
+
const { palette, presetId, shot } = this.ctx;
|
|
14
|
+
const box = this.box();
|
|
15
|
+
const maxSize = presetId === "terminalcore" ? 81 : 120;
|
|
16
|
+
const { size, lines } = this.fitBlock(stage, shot.text, "display", box.w, maxSize, 3);
|
|
17
|
+
const step = size * 1.6;
|
|
18
|
+
const blockH = (lines.length - 1) * step;
|
|
19
|
+
const centerY = presetId === "terminalcore" ? box.y + box.h / 2 : 540;
|
|
20
|
+
const y0 = centerY - blockH / 2 + size * 0.35;
|
|
21
|
+
const revealed = shot.reveals.filter((r) => f.t >= r.start).length;
|
|
22
|
+
const current = revealed - 1;
|
|
23
|
+
const large = size >= GATE.largeFontPx;
|
|
24
|
+
let wordIndex = 0;
|
|
25
|
+
lines.forEach((line, li) => {
|
|
26
|
+
const words = line.text.split(" ");
|
|
27
|
+
const lineLeft = presetId === "swiss-signal" || presetId === "terminalcore" ? box.x : 960 - line.width / 2;
|
|
28
|
+
let offset = 0;
|
|
29
|
+
for (const word of words) {
|
|
30
|
+
const k = wordIndex;
|
|
31
|
+
wordIndex += 1;
|
|
32
|
+
const prefix = offset === 0 ? 0 : stage.type.layout(line.text.slice(0, offset), { voice: "display", size }).width;
|
|
33
|
+
offset += word.length + 1;
|
|
34
|
+
if (k >= revealed) continue;
|
|
35
|
+
const since = f.t - shot.reveals[k].start;
|
|
36
|
+
const rise = presetId === "tidal" ? (1 - ease.drift(clamp(since / 0.5))) * 10 : (1 - ease.slam(clamp(since / 0.18))) * 14;
|
|
37
|
+
const fill = k === current && large && palette.signal && presetId === "swiss-signal" ? palette.signal : palette.type;
|
|
38
|
+
const laid = stage.type.layout(word, { voice: "display", size });
|
|
39
|
+
stage.type.drawLine(stage.glyphs, laid, lineLeft + prefix, y0 + li * step + rise, {
|
|
40
|
+
fill, alpha: landing(since), elementId: `line/w${k}`,
|
|
41
|
+
extra: { blockId: "line", lineCount: lines.length, lineHeight: 1.6, cjk: /[가-힣]/u.test(shot.text) },
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
return {};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// kinetic-list: a heading and a list whose items arrive one per reveal step, sliding in on the
|
|
2
|
+
// shortest path and staying put. The list is a multi-line block, so it carries the line-height
|
|
3
|
+
// floors (MO-C-26): 1.6 for Hangul, 1.5 for Latin.
|
|
4
|
+
import { clamp, ease } from "../../core/util.mjs";
|
|
5
|
+
import { Scene, landing } from "../scene.mjs";
|
|
6
|
+
|
|
7
|
+
export default class KineticList extends Scene {
|
|
8
|
+
render(f, stage) {
|
|
9
|
+
const { palette, presetId, shot } = this.ctx;
|
|
10
|
+
const box = this.box();
|
|
11
|
+
const items = shot.items ?? [];
|
|
12
|
+
const cjk = items.some((i) => /[가-힣]/u.test(i));
|
|
13
|
+
const lineHeight = cjk ? 1.6 : 1.5;
|
|
14
|
+
const itemSize = this.snapSize(Math.min(presetId === "terminalcore" ? 54 : 72, Math.floor((box.h - 180) / Math.max(1, items.length) / lineHeight)), "body");
|
|
15
|
+
let y = box.y + 20;
|
|
16
|
+
if (shot.heading) {
|
|
17
|
+
const hs = this.fit(stage, shot.heading, "display", box.w, presetId === "terminalcore" ? 72 : 96);
|
|
18
|
+
const h = stage.type.layout(shot.heading, { voice: "display", size: hs });
|
|
19
|
+
y += hs;
|
|
20
|
+
stage.type.drawLine(stage.glyphs, h, box.x, y, { fill: presetId === "swiss-signal" ? palette.signal : palette.type, alpha: landing(f.lt, 0.15), elementId: "list/heading" });
|
|
21
|
+
y += hs * 0.9;
|
|
22
|
+
}
|
|
23
|
+
const laid = items.map((item) => stage.type.layout(item, { voice: "body", size: itemSize }));
|
|
24
|
+
const alphas = [];
|
|
25
|
+
const offsets = [];
|
|
26
|
+
shot.reveals.forEach((r) => {
|
|
27
|
+
const since = f.t - r.start;
|
|
28
|
+
alphas.push(landing(since, 0.15));
|
|
29
|
+
offsets.push(since < 0 ? 0 : (1 - ease.outCubic(clamp(since / 0.3))) * -32);
|
|
30
|
+
});
|
|
31
|
+
const c = stage.glyphs.ctx;
|
|
32
|
+
laid.forEach((line, i) => {
|
|
33
|
+
if (alphas[i] <= 0) return;
|
|
34
|
+
c.save();
|
|
35
|
+
c.translate(offsets[i], 0);
|
|
36
|
+
stage.type.drawLine(stage.glyphs, line, box.x + 64, y + itemSize + i * itemSize * lineHeight, {
|
|
37
|
+
fill: palette.type, alpha: alphas[i], elementId: `list/l${i}`,
|
|
38
|
+
extra: { blockId: "list", lineCount: items.length, lineHeight, cjk },
|
|
39
|
+
});
|
|
40
|
+
c.restore();
|
|
41
|
+
stage.mark({ x: box.x + 16 + offsets[i], y: y + itemSize * 0.55 + i * itemSize * lineHeight, w: 18, h: 4 }, palette.dim ?? palette.type, `list/tick${i}`, "tick");
|
|
42
|
+
});
|
|
43
|
+
return {};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// number-counter: a figure that counts to its value over the first 70% of the shot and then holds,
|
|
2
|
+
// set in the machine voice (monospaced digits, never negative tracking) with a label under it.
|
|
3
|
+
import { clamp, ease } from "../../core/util.mjs";
|
|
4
|
+
import { Scene, landing } from "../scene.mjs";
|
|
5
|
+
|
|
6
|
+
export default class NumberCounter extends Scene {
|
|
7
|
+
render(f, stage) {
|
|
8
|
+
const { palette, shot } = this.ctx;
|
|
9
|
+
const box = this.box();
|
|
10
|
+
const from = Number(shot.from ?? 0);
|
|
11
|
+
const to = Number(shot.to ?? 0);
|
|
12
|
+
const hold = shot.end - shot.start;
|
|
13
|
+
const k = ease.outCubic(clamp(f.lt / (0.7 * hold)));
|
|
14
|
+
const value = Math.round(from + (to - from) * k);
|
|
15
|
+
const digits = `${shot.prefix ?? ""}${value.toLocaleString("en-US")}${shot.suffix ?? ""}`;
|
|
16
|
+
const size = this.fit(stage, shot.display, "machine", box.w, 260);
|
|
17
|
+
const figure = stage.type.layout(digits, { voice: "machine", size });
|
|
18
|
+
const y = 520 + size * 0.2;
|
|
19
|
+
stage.type.drawLine(stage.glyphs, figure, box.x, y, { fill: palette.type, elementId: "counter/figure" });
|
|
20
|
+
// Below the figure's descenders (a comma drops under the baseline): bar, then label.
|
|
21
|
+
const barY = y + size * 0.3;
|
|
22
|
+
stage.mark({ x: box.x, y: barY, w: Math.max(6, (box.w * 0.4) * k), h: 6 }, palette.mark, "counter/bar", "bar");
|
|
23
|
+
if (shot.label) {
|
|
24
|
+
const ls = this.fit(stage, shot.label, "body", box.w, 56);
|
|
25
|
+
stage.type.drawLine(stage.glyphs, stage.type.layout(shot.label, { voice: "body", size: ls }), box.x, barY + 28 + ls, { fill: palette.type, alpha: landing(f.lt - 0.2, 0.3), elementId: "counter/label" });
|
|
26
|
+
}
|
|
27
|
+
return {};
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// signature: a Latin line written by a pen in one of the EMS single-stroke fonts, synced to the
|
|
2
|
+
// reading time (writtenLength), with a short fading trail behind the pen head. The trail is this
|
|
3
|
+
// engine's stateful example: advance() keeps the last few head positions (finite memory, well
|
|
4
|
+
// inside prerollMax), so a seeked still replays it exactly.
|
|
5
|
+
import { clamp } from "../../core/util.mjs";
|
|
6
|
+
import { hexToLinear } from "../../core/util.mjs";
|
|
7
|
+
import { strokeText, writtenLength, drawStrokeText } from "../stroke.mjs";
|
|
8
|
+
import { Scene } from "../scene.mjs";
|
|
9
|
+
|
|
10
|
+
const TRAIL = 6;
|
|
11
|
+
|
|
12
|
+
export default class Signature extends Scene {
|
|
13
|
+
init() {
|
|
14
|
+
this.stateful = true;
|
|
15
|
+
this.prerollMax = 0.2;
|
|
16
|
+
const key = this.ctx.shot.font ?? "ems-readability";
|
|
17
|
+
this.font = this.ctx.strokeFonts.get(key);
|
|
18
|
+
if (!this.font) throw new Error(`stroke font not loaded: ${key}`);
|
|
19
|
+
this.fontKey = key;
|
|
20
|
+
this.reset();
|
|
21
|
+
}
|
|
22
|
+
reset() {
|
|
23
|
+
this.trail = [];
|
|
24
|
+
}
|
|
25
|
+
layout() {
|
|
26
|
+
if (!this.st) {
|
|
27
|
+
const box = this.box();
|
|
28
|
+
const probe = strokeText(this.font, this.ctx.shot.text, 100);
|
|
29
|
+
this.size = Math.min(180, (100 * box.w) / Math.max(1, probe.width));
|
|
30
|
+
this.st = strokeText(this.font, this.ctx.shot.text, this.size);
|
|
31
|
+
}
|
|
32
|
+
return this.st;
|
|
33
|
+
}
|
|
34
|
+
headAt(t) {
|
|
35
|
+
const st = this.layout();
|
|
36
|
+
const shot = this.ctx.shot;
|
|
37
|
+
const span = 0.7 * (shot.end - shot.start);
|
|
38
|
+
const n = st.charRange.length;
|
|
39
|
+
const times = st.charRange.map((_, i) => [shot.start + (span * i) / n, shot.start + (span * (i + 1)) / n]);
|
|
40
|
+
return writtenLength(st, times, t);
|
|
41
|
+
}
|
|
42
|
+
advance(f) {
|
|
43
|
+
this.trail.push({ t: f.t, len: this.headAt(f.t) });
|
|
44
|
+
if (this.trail.length > TRAIL) this.trail.shift();
|
|
45
|
+
}
|
|
46
|
+
render(f, stage) {
|
|
47
|
+
const { palette } = this.ctx;
|
|
48
|
+
const st = this.layout();
|
|
49
|
+
const box = this.box();
|
|
50
|
+
const x = box.x + (box.w - st.width) / 2;
|
|
51
|
+
const baseline = 540 + st.capHeight / 2;
|
|
52
|
+
const len = this.headAt(f.t);
|
|
53
|
+
const lineWidth = Math.max(4, this.size * 0.035);
|
|
54
|
+
const { bbox, head } = drawStrokeText(stage.glyphs, st, len, x, baseline, { color: palette.type, lineWidth });
|
|
55
|
+
if (bbox && stage.record) {
|
|
56
|
+
stage.type.boxes.push({
|
|
57
|
+
elementId: "signature", text: this.ctx.shot.text, voice: "signature", fontFile: this.fontKey, fontSizePx: +this.size.toFixed(2),
|
|
58
|
+
capHeightPx: +st.capHeight.toFixed(2), weight: 400, fill: palette.type, bbox: bbox.map((v) => +v.toFixed(2)), script: "latin", trackingEm: 0, widthPct: 100, alpha: 1,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
if (head && len < st.total) {
|
|
62
|
+
const signal = hexToLinear(palette.mark);
|
|
63
|
+
stage.lines.segment(x + head.x, baseline + head.y, x + head.x, baseline + head.y, 12, signal, 1);
|
|
64
|
+
for (const p of this.trail) {
|
|
65
|
+
const age = f.t - p.t;
|
|
66
|
+
if (age <= 0 || age > 0.1) continue;
|
|
67
|
+
stage.lines.segment(x + head.x - (len - p.len) * 0.2, baseline + head.y, x + head.x, baseline + head.y, 3, signal, clamp(1 - age / 0.1) * 0.5);
|
|
68
|
+
}
|
|
69
|
+
if (stage.record) stage.record.elements.push({ elementId: "signature/pen", kind: "pen", bbox: [x + head.x - 6, baseline + head.y - 6, x + head.x + 6, baseline + head.y + 6] });
|
|
70
|
+
}
|
|
71
|
+
return {};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// title-slam: the opening hit. Display type lands on the shot's downbeat with the `slam` token
|
|
2
|
+
// (180 ms, entrance scale floored at 0.95), then holds. swiss-signal steps the Latin width from 125
|
|
3
|
+
// to 100 on landing; terminalcore types it in at the terminal's rate; tidal drifts it into place.
|
|
4
|
+
import { clamp, ease } from "../../core/util.mjs";
|
|
5
|
+
import { Scene, landing } from "../scene.mjs";
|
|
6
|
+
|
|
7
|
+
export default class TitleSlam extends Scene {
|
|
8
|
+
render(f, stage) {
|
|
9
|
+
const { palette, presetId } = this.ctx;
|
|
10
|
+
const { text, sub } = this.ctx.shot;
|
|
11
|
+
const box = this.box();
|
|
12
|
+
const c = stage.glyphs.ctx;
|
|
13
|
+
const lt = f.lt;
|
|
14
|
+
if (presetId === "terminalcore") {
|
|
15
|
+
const { size, lines } = this.fitBlock(stage, text, "display", box.w, 108, 3);
|
|
16
|
+
const rate = this.ctx.tokens.typeInCharsPerSec ?? 22;
|
|
17
|
+
let budget = Math.floor(lt * rate) + 1;
|
|
18
|
+
const step = size * 1.6;
|
|
19
|
+
lines.forEach((line, i) => {
|
|
20
|
+
const chars = Array.from(line.text);
|
|
21
|
+
const shown = chars.slice(0, Math.max(0, Math.min(chars.length, budget))).join("");
|
|
22
|
+
budget -= chars.length;
|
|
23
|
+
if (!shown) return;
|
|
24
|
+
stage.type.drawLine(stage.glyphs, stage.type.layout(shown, { voice: "display", size }), box.x, box.y + size + i * step, { fill: palette.type, elementId: `title/l${i}`, extra: { blockId: "title", lineCount: lines.length, lineHeight: 1.6, cjk: /[가-힣]/u.test(text) } });
|
|
25
|
+
});
|
|
26
|
+
if (sub && budget > 4) {
|
|
27
|
+
const s = stage.type.layout(sub, { voice: "machine", size: 32 });
|
|
28
|
+
stage.type.drawLine(stage.glyphs, s, box.x, box.y + size + lines.length * step + 24, { fill: palette.dim, elementId: "title/sub" });
|
|
29
|
+
}
|
|
30
|
+
return {};
|
|
31
|
+
}
|
|
32
|
+
if (presetId === "tidal") {
|
|
33
|
+
const settle = ease.drift(clamp(lt / 2.4));
|
|
34
|
+
const { size, lines } = this.fitBlock(stage, text, "display", box.w * 0.9, 150, 3);
|
|
35
|
+
const alpha = landing(lt, 0.6);
|
|
36
|
+
const y0 = 540 - ((lines.length - 1) * size * 1.6) / 2 + size * 0.35 + (1 - settle) * 28;
|
|
37
|
+
stage.type.drawBlock(stage.glyphs, lines, 960, y0, { lineHeight: 1.6, fill: palette.type, alpha, align: "center", elementId: "title" });
|
|
38
|
+
if (sub) {
|
|
39
|
+
const s = stage.type.layout(sub, { voice: "machine", size: 30 });
|
|
40
|
+
stage.type.drawLine(stage.glyphs, s, 960, y0 + (lines.length - 1) * size * 1.6 + size * 0.9, { fill: palette.type, alpha: landing(lt - 0.5, 0.6), align: "center", elementId: "title/sub" });
|
|
41
|
+
}
|
|
42
|
+
return {};
|
|
43
|
+
}
|
|
44
|
+
// swiss-signal: the block sits on the grid's left edge with its last line in the lower third;
|
|
45
|
+
// the size shrinks until block, signal bar and annotation fit inside the title-safe box.
|
|
46
|
+
const landed = lt >= 0.18;
|
|
47
|
+
const slam = ease.slam(clamp(lt / 0.18));
|
|
48
|
+
const scale = 0.95 + 0.05 * slam;
|
|
49
|
+
const subSize = 28;
|
|
50
|
+
let fitted = this.fitBlock(stage, text, "display", box.w, 200, 3, { widthPct: 125, trackingEm: -0.02 });
|
|
51
|
+
const lineHeight = fitted.lines.some((l) => l.runs.some((r) => r.script === "hangul")) ? 1.6 : 1.5;
|
|
52
|
+
const height = (fb) => (fb.lines.length - 1) * fb.size * lineHeight + fb.size * 0.8 + (sub ? 72 + subSize : 40);
|
|
53
|
+
while (height(fitted) > box.h - 40 && fitted.size > 48) fitted = this.fitBlock(stage, text, "display", box.w, fitted.size * 0.9, 3, { widthPct: 125, trackingEm: -0.02 });
|
|
54
|
+
const { size, lines } = fitted;
|
|
55
|
+
const laid = landed ? lines.map((l) => stage.type.layout(l.text, { voice: "display", size, widthPct: 100, trackingEm: -0.02 })) : lines;
|
|
56
|
+
const step = size * lineHeight;
|
|
57
|
+
const blockH = (laid.length - 1) * step;
|
|
58
|
+
const bottom = box.y + box.h - (sub ? 72 + subSize : 40);
|
|
59
|
+
const baseY = Math.min(box.y + size * 0.8 + (box.h - height(fitted)) * 0.55, bottom - blockH);
|
|
60
|
+
c.save();
|
|
61
|
+
c.translate(box.x, baseY);
|
|
62
|
+
c.scale(scale, scale);
|
|
63
|
+
c.translate(-box.x, -baseY);
|
|
64
|
+
stage.type.drawBlock(stage.glyphs, laid, box.x, baseY, { lineHeight, fill: palette.type, alpha: 1, elementId: "title" });
|
|
65
|
+
c.restore();
|
|
66
|
+
stage.mark({ x: box.x, y: baseY + blockH + size * 0.22, w: Math.max(6, 96 * slam), h: 6 }, palette.mark, "title/signal-bar", "bar");
|
|
67
|
+
if (sub) {
|
|
68
|
+
const s = stage.type.layout(sub, { voice: "machine", size: subSize });
|
|
69
|
+
stage.type.drawLine(stage.glyphs, s, box.x, baseY + blockH + size * 0.22 + 24 + subSize, { fill: palette.type, alpha: landing(lt - 0.3, 0.2), elementId: "title/sub" });
|
|
70
|
+
}
|
|
71
|
+
return {};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
// Single-stroke plotter fonts (the five OFL EMS SVG fonts, MO-FT-08) laid out as polylines so a
|
|
2
|
+
// line of Latin text can be written progressively by a moving pen. Adapted from mexicat/pdoom-video
|
|
3
|
+
// app/src/engine/stroke.ts (MIT, see ../NOTICE). The Hershey fonts are excluded and never loaded.
|
|
4
|
+
//
|
|
5
|
+
// The files carry no kerning, so pairs that leave a hole (an overhang or a diagonal) are pulled in
|
|
6
|
+
// optically: the closest horizontal approach of the two glyphs' ink is brought toward the font's
|
|
7
|
+
// own n-n spacing. Connected scripts (EMS Allure) are never kerned, since that would break joins.
|
|
8
|
+
import { SCALE } from "./scale.mjs";
|
|
9
|
+
|
|
10
|
+
export const STROKE_FONTS = Object.freeze({
|
|
11
|
+
"ems-allure": { file: "EMSAllure.svg", connected: true },
|
|
12
|
+
"ems-felix": { file: "EMSFelix.svg", connected: false },
|
|
13
|
+
"ems-osmotron": { file: "EMSOsmotron.svg", connected: false },
|
|
14
|
+
"ems-readability": { file: "EMSReadability.svg", connected: false },
|
|
15
|
+
"ems-tech": { file: "EMSTech.svg", connected: false },
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
const BANDS = 48;
|
|
19
|
+
|
|
20
|
+
function parsePath(d) {
|
|
21
|
+
const out = [];
|
|
22
|
+
const tokens = d.match(/[MLml]|-?\d*\.?\d+(?:e-?\d+)?/gu) ?? [];
|
|
23
|
+
let current = null;
|
|
24
|
+
let cmd = "M";
|
|
25
|
+
for (let i = 0; i < tokens.length;) {
|
|
26
|
+
const t = tokens[i];
|
|
27
|
+
if (/[MLml]/u.test(t)) {
|
|
28
|
+
cmd = t.toUpperCase();
|
|
29
|
+
i += 1;
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
const x = Number.parseFloat(tokens[i]);
|
|
33
|
+
const y = Number.parseFloat(tokens[i + 1]);
|
|
34
|
+
i += 2;
|
|
35
|
+
if (cmd === "M") {
|
|
36
|
+
current = [{ x, y }];
|
|
37
|
+
out.push(current);
|
|
38
|
+
cmd = "L";
|
|
39
|
+
} else current?.push({ x, y });
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function inkBox(strokes) {
|
|
45
|
+
let x0 = Infinity;
|
|
46
|
+
let x1 = -Infinity;
|
|
47
|
+
let y0 = Infinity;
|
|
48
|
+
let y1 = -Infinity;
|
|
49
|
+
for (const s of strokes) for (const p of s) {
|
|
50
|
+
x0 = Math.min(x0, p.x); x1 = Math.max(x1, p.x); y0 = Math.min(y0, p.y); y1 = Math.max(y1, p.y);
|
|
51
|
+
}
|
|
52
|
+
return { x0, x1, y0, y1 };
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function parseStrokeFont(svgText, { connected }) {
|
|
56
|
+
const doc = new DOMParser().parseFromString(svgText, "image/svg+xml");
|
|
57
|
+
const face = doc.querySelector("font-face");
|
|
58
|
+
const fontEl = doc.querySelector("font");
|
|
59
|
+
const defaultAdvance = Number.parseFloat(fontEl?.getAttribute("horiz-adv-x") ?? "500");
|
|
60
|
+
const glyphs = new Map();
|
|
61
|
+
for (const g of doc.querySelectorAll("glyph")) {
|
|
62
|
+
const u = g.getAttribute("unicode");
|
|
63
|
+
if (u == null) continue;
|
|
64
|
+
glyphs.set(u, { adv: Number.parseFloat(g.getAttribute("horiz-adv-x") ?? String(defaultAdvance)), strokes: parsePath(g.getAttribute("d") ?? "") });
|
|
65
|
+
}
|
|
66
|
+
let yLo = Infinity;
|
|
67
|
+
let yHi = -Infinity;
|
|
68
|
+
for (const g of glyphs.values()) for (const s of g.strokes) for (const p of s) { yLo = Math.min(yLo, p.y); yHi = Math.max(yHi, p.y); }
|
|
69
|
+
const cap = glyphs.get("H") ? inkBox(glyphs.get("H").strokes).y1 : 700;
|
|
70
|
+
return { upm: Number.parseFloat(face?.getAttribute("units-per-em") ?? "1000"), glyphs, defaultAdvance, connected, cap, yLo, dy: (yHi - yLo + 1) / BANDS, profiles: new Map(), kerns: new Map(), target: null };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Leftmost and rightmost ink per horizontal band (NaN where a band has no ink).
|
|
74
|
+
function profile(font, ch) {
|
|
75
|
+
if (font.profiles.has(ch)) return font.profiles.get(ch);
|
|
76
|
+
const g = font.glyphs.get(ch);
|
|
77
|
+
let p = null;
|
|
78
|
+
if (g && g.strokes.length) {
|
|
79
|
+
const left = new Float32Array(BANDS).fill(Number.NaN);
|
|
80
|
+
const right = new Float32Array(BANDS).fill(Number.NaN);
|
|
81
|
+
const put = (x, y) => {
|
|
82
|
+
const i = Math.floor((y - font.yLo) / font.dy);
|
|
83
|
+
if (i < 0 || i >= BANDS) return;
|
|
84
|
+
if (!(left[i] <= x)) left[i] = x;
|
|
85
|
+
if (!(right[i] >= x)) right[i] = x;
|
|
86
|
+
};
|
|
87
|
+
for (const s of g.strokes) {
|
|
88
|
+
if (s.length === 1) put(s[0].x, s[0].y);
|
|
89
|
+
for (let k = 1; k < s.length; k++) {
|
|
90
|
+
const a = s[k - 1];
|
|
91
|
+
const b = s[k];
|
|
92
|
+
const n = Math.max(1, Math.ceil(Math.hypot(b.x - a.x, b.y - a.y) / (font.dy * 0.5)));
|
|
93
|
+
for (let j = 0; j <= n; j++) put(a.x + ((b.x - a.x) * j) / n, a.y + ((b.y - a.y) * j) / n);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
p = { left, right };
|
|
97
|
+
}
|
|
98
|
+
font.profiles.set(ch, p);
|
|
99
|
+
return p;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function approach(font, a, b) {
|
|
103
|
+
const pa = profile(font, a);
|
|
104
|
+
const pb = profile(font, b);
|
|
105
|
+
if (!pa || !pb) return null;
|
|
106
|
+
const adv = font.glyphs.get(a).adv;
|
|
107
|
+
let m = Infinity;
|
|
108
|
+
for (let i = 0; i < BANDS; i++) if (!Number.isNaN(pa.right[i]) && !Number.isNaN(pb.left[i])) m = Math.min(m, adv + pb.left[i] - pa.right[i]);
|
|
109
|
+
return m === Infinity ? null : m;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function pairKern(font, a, b) {
|
|
113
|
+
if (font.connected || a === " " || b === " ") return 0;
|
|
114
|
+
const key = a + b;
|
|
115
|
+
if (font.kerns.has(key)) return font.kerns.get(key);
|
|
116
|
+
if (font.target === null) {
|
|
117
|
+
const refs = ["nn", "oo", "HH"].map((p) => approach(font, p[0], p[1])).filter((v) => v !== null);
|
|
118
|
+
font.target = refs.length ? refs.reduce((s, v) => s + v, 0) / refs.length : 0;
|
|
119
|
+
}
|
|
120
|
+
const m = approach(font, a, b);
|
|
121
|
+
const k = m === null ? 0 : Math.max(-0.12 * font.upm, Math.min(0, 0.6 * (font.target - m)));
|
|
122
|
+
font.kerns.set(key, k);
|
|
123
|
+
return k;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** Lay out `text` at `size` px: strokes in px with the origin at the left baseline, y down. */
|
|
127
|
+
export function strokeText(font, text, size) {
|
|
128
|
+
const s = size / font.upm;
|
|
129
|
+
const strokes = [];
|
|
130
|
+
const charOf = [];
|
|
131
|
+
const chars = Array.from(text);
|
|
132
|
+
let x = 0;
|
|
133
|
+
chars.forEach((ch, ci) => {
|
|
134
|
+
const g = font.glyphs.get(ch);
|
|
135
|
+
for (const st of g?.strokes ?? []) {
|
|
136
|
+
strokes.push(st.map((p) => ({ x: x + p.x * s, y: -p.y * s })));
|
|
137
|
+
charOf.push(ci);
|
|
138
|
+
}
|
|
139
|
+
x += (g?.adv ?? font.defaultAdvance) * s;
|
|
140
|
+
if (ci + 1 < chars.length) x += pairKern(font, ch, chars[ci + 1]) * s;
|
|
141
|
+
});
|
|
142
|
+
const lens = strokes.map((pts) => {
|
|
143
|
+
const L = new Float32Array(pts.length);
|
|
144
|
+
for (let i = 1; i < pts.length; i++) L[i] = L[i - 1] + Math.hypot(pts[i].x - pts[i - 1].x, pts[i].y - pts[i - 1].y);
|
|
145
|
+
return L;
|
|
146
|
+
});
|
|
147
|
+
const startLen = [];
|
|
148
|
+
let total = 0;
|
|
149
|
+
for (const L of lens) {
|
|
150
|
+
startLen.push(total);
|
|
151
|
+
total += L[L.length - 1] ?? 0;
|
|
152
|
+
}
|
|
153
|
+
const charRange = chars.map(() => [Infinity, -Infinity]);
|
|
154
|
+
strokes.forEach((_, i) => {
|
|
155
|
+
const r = charRange[charOf[i]];
|
|
156
|
+
r[0] = Math.min(r[0], startLen[i]);
|
|
157
|
+
r[1] = Math.max(r[1], startLen[i] + (lens[i][lens[i].length - 1] ?? 0));
|
|
158
|
+
});
|
|
159
|
+
let last = 0;
|
|
160
|
+
for (const r of charRange) {
|
|
161
|
+
if (r[0] === Infinity) { r[0] = last; r[1] = last; }
|
|
162
|
+
last = r[1];
|
|
163
|
+
}
|
|
164
|
+
return { text, strokes, startLen, lens, total, width: x, charRange, size, capHeight: font.cap * s };
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** Pen length (px) written by time t when char i is written during charTimes[i]. */
|
|
168
|
+
export function writtenLength(st, charTimes, t) {
|
|
169
|
+
let len = 0;
|
|
170
|
+
for (let i = 0; i < st.charRange.length; i++) {
|
|
171
|
+
const [a, b] = st.charRange[i];
|
|
172
|
+
const [t0, t1] = charTimes[i] ?? [Infinity, Infinity];
|
|
173
|
+
if (t >= t1) len = b;
|
|
174
|
+
else if (t > t0) {
|
|
175
|
+
len = a + (b - a) * ((t - t0) / Math.max(1e-3, t1 - t0));
|
|
176
|
+
break;
|
|
177
|
+
} else break;
|
|
178
|
+
}
|
|
179
|
+
return len;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Stroke the first `length` px of a laid-out stroke text at (x, baseline) on the glyph layer.
|
|
184
|
+
* Returns the ink bbox in logical px (null when nothing is drawn) and the pen head.
|
|
185
|
+
*/
|
|
186
|
+
export function drawStrokeText(layer, st, length, x, baseline, { color, lineWidth }) {
|
|
187
|
+
const c = layer.ctx;
|
|
188
|
+
c.save();
|
|
189
|
+
c.translate(x, baseline);
|
|
190
|
+
c.strokeStyle = color;
|
|
191
|
+
c.lineWidth = lineWidth;
|
|
192
|
+
c.lineCap = "round";
|
|
193
|
+
c.lineJoin = "round";
|
|
194
|
+
c.beginPath();
|
|
195
|
+
let head = null;
|
|
196
|
+
let x0 = Infinity;
|
|
197
|
+
let y0 = Infinity;
|
|
198
|
+
let x1 = -Infinity;
|
|
199
|
+
let y1 = -Infinity;
|
|
200
|
+
const grow = (p) => { x0 = Math.min(x0, p.x); y0 = Math.min(y0, p.y); x1 = Math.max(x1, p.x); y1 = Math.max(y1, p.y); };
|
|
201
|
+
for (let i = 0; i < st.strokes.length; i++) {
|
|
202
|
+
const s0 = st.startLen[i];
|
|
203
|
+
if (s0 >= length) break;
|
|
204
|
+
const pts = st.strokes[i];
|
|
205
|
+
const L = st.lens[i];
|
|
206
|
+
const remain = length - s0;
|
|
207
|
+
const shown = [pts[0]];
|
|
208
|
+
let j = 1;
|
|
209
|
+
for (; j < pts.length && L[j] <= remain; j++) shown.push(pts[j]);
|
|
210
|
+
if (j < pts.length) {
|
|
211
|
+
const a = pts[j - 1];
|
|
212
|
+
const b = pts[j];
|
|
213
|
+
const u = (remain - L[j - 1]) / Math.max(1e-6, L[j] - L[j - 1]);
|
|
214
|
+
head = { x: a.x + (b.x - a.x) * u, y: a.y + (b.y - a.y) * u };
|
|
215
|
+
shown.push(head);
|
|
216
|
+
} else head = pts[pts.length - 1];
|
|
217
|
+
for (const p of shown) grow(p);
|
|
218
|
+
// The EMS glyphs are polylines; at display sizes their facets show. Curving through segment
|
|
219
|
+
// midpoints keeps the pen on the same path (within half a segment) without the corners.
|
|
220
|
+
c.moveTo(shown[0].x, shown[0].y);
|
|
221
|
+
for (let k = 1; k < shown.length - 1; k++) {
|
|
222
|
+
c.quadraticCurveTo(shown[k].x, shown[k].y, (shown[k].x + shown[k + 1].x) / 2, (shown[k].y + shown[k + 1].y) / 2);
|
|
223
|
+
}
|
|
224
|
+
if (shown.length > 1) c.lineTo(shown[shown.length - 1].x, shown[shown.length - 1].y);
|
|
225
|
+
}
|
|
226
|
+
c.stroke();
|
|
227
|
+
const m = c.getTransform();
|
|
228
|
+
c.restore();
|
|
229
|
+
if (x0 === Infinity) return { bbox: null, head: null };
|
|
230
|
+
const pad = lineWidth / 2;
|
|
231
|
+
const corners = [[x0 - pad, y0 - pad], [x1 + pad, y0 - pad], [x0 - pad, y1 + pad], [x1 + pad, y1 + pad]]
|
|
232
|
+
.map(([px, py]) => [(m.a * px + m.c * py + m.e) / SCALE, (m.b * px + m.d * py + m.f) / SCALE]);
|
|
233
|
+
const xs = corners.map((p) => p[0]);
|
|
234
|
+
const ys = corners.map((p) => p[1]);
|
|
235
|
+
return { bbox: [Math.min(...xs), Math.min(...ys), Math.max(...xs), Math.max(...ys)], head };
|
|
236
|
+
}
|