oh-my-agent-commandcode 0.0.0-stage → 20.38.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -2
- package/filter-test-output.sh +52 -0
- package/mods/oma.ts +347 -0
- package/package.json +30 -4
- package/skills/_shared/conditional/experiment-ledger.md +28 -0
- package/skills/_shared/conditional/exploration-loop.md +22 -0
- package/skills/_shared/conditional/quality-score.md +33 -0
- package/skills/_shared/core/anti-ai-prose.md +191 -0
- package/skills/_shared/core/api-contracts/README.md +28 -0
- package/skills/_shared/core/api-contracts/template.md +90 -0
- package/skills/_shared/core/clarification-protocol.md +23 -0
- package/skills/_shared/core/code-intelligence.md +46 -0
- package/skills/_shared/core/collaboration-policy.md +28 -0
- package/skills/_shared/core/common-checklist.md +28 -0
- package/skills/_shared/core/context-budget.md +22 -0
- package/skills/_shared/core/context-loading.md +34 -0
- package/skills/_shared/core/difficulty-guide.md +26 -0
- package/skills/_shared/core/execution-policy.md +31 -0
- package/skills/_shared/core/lessons-learned.md +33 -0
- package/skills/_shared/core/prompt-structure.md +18 -0
- package/skills/_shared/core/quality-principles.md +11 -0
- package/skills/_shared/core/session-metrics.md +35 -0
- package/skills/_shared/core/skill-routing.md +39 -0
- package/skills/_shared/core/test-approach.md +54 -0
- package/skills/_shared/core/vendor-detection.md +52 -0
- package/skills/_shared/runtime/memory-protocol.md +118 -0
- package/skills/_shared/runtime/result-contract.md +64 -0
- package/skills/_shared/ui-interaction-quality.md +133 -0
- package/skills/oma-academic-writing/SKILL.md +181 -0
- package/skills/oma-academic-writing/resources/abstract-guide.md +51 -0
- package/skills/oma-academic-writing/resources/academic-verb-tiers.md +42 -0
- package/skills/oma-academic-writing/resources/anti-ai-checklist.md +52 -0
- package/skills/oma-academic-writing/resources/hedging-guide.md +132 -0
- package/skills/oma-academic-writing/resources/sentence-structure-reference.md +151 -0
- package/skills/oma-architecture/SKILL.md +203 -0
- package/skills/oma-architecture/resources/api-evolution.md +41 -0
- package/skills/oma-architecture/resources/checklist.md +42 -0
- package/skills/oma-architecture/resources/execution-protocol.md +115 -0
- package/skills/oma-architecture/resources/methodology-selection.md +92 -0
- package/skills/oma-architecture/resources/migration-patterns.md +28 -0
- package/skills/oma-architecture/resources/output-templates.md +111 -0
- package/skills/oma-architecture/resources/stakeholder-synthesis.md +80 -0
- package/skills/oma-backend/SKILL.md +202 -0
- package/skills/oma-backend/resources/checklist.md +45 -0
- package/skills/oma-backend/resources/error-playbook.md +97 -0
- package/skills/oma-backend/resources/execution-protocol.md +39 -0
- package/skills/oma-backend/resources/orm-reference.md +61 -0
- package/skills/oma-backend/variants/node/api-template.ts +315 -0
- package/skills/oma-backend/variants/node/snippets.md +475 -0
- package/skills/oma-backend/variants/node/stack.yaml +21 -0
- package/skills/oma-backend/variants/node/tech-stack.md +33 -0
- package/skills/oma-backend/variants/python/api-template.py +378 -0
- package/skills/oma-backend/variants/python/snippets.md +199 -0
- package/skills/oma-backend/variants/python/stack.yaml +18 -0
- package/skills/oma-backend/variants/python/tech-stack.md +45 -0
- package/skills/oma-backend/variants/rust/api-template.rs +635 -0
- package/skills/oma-backend/variants/rust/snippets.md +471 -0
- package/skills/oma-backend/variants/rust/stack.yaml +20 -0
- package/skills/oma-backend/variants/rust/tech-stack.md +36 -0
- package/skills/oma-backend/variants/stack.schema.json +73 -0
- package/skills/oma-brainstorm/SKILL.md +166 -0
- package/skills/oma-brainstorm/resources/triz-lite.md +117 -0
- package/skills/oma-coordination/SKILL.md +171 -0
- package/skills/oma-db/SKILL.md +201 -0
- package/skills/oma-db/resources/anti-patterns.md +177 -0
- package/skills/oma-db/resources/checklist.md +67 -0
- package/skills/oma-db/resources/document-templates.md +107 -0
- package/skills/oma-db/resources/error-playbook.md +50 -0
- package/skills/oma-db/resources/examples.md +170 -0
- package/skills/oma-db/resources/execution-protocol.md +127 -0
- package/skills/oma-db/resources/iso-controls.md +98 -0
- package/skills/oma-db/resources/migration-playbook.md +93 -0
- package/skills/oma-db/resources/query-tuning.md +57 -0
- package/skills/oma-db/resources/vector-db.md +159 -0
- package/skills/oma-debug/SKILL.md +146 -0
- package/skills/oma-debug/resources/bug-report-template.md +327 -0
- package/skills/oma-debug/resources/checklist.md +31 -0
- package/skills/oma-debug/resources/common-patterns.md +734 -0
- package/skills/oma-debug/resources/debugging-checklist.md +364 -0
- package/skills/oma-debug/resources/error-playbook.md +94 -0
- package/skills/oma-debug/resources/execution-protocol.md +40 -0
- package/skills/oma-design/SKILL.md +135 -0
- package/skills/oma-design/resources/asset-strategy.md +34 -0
- package/skills/oma-design/resources/checklist.md +63 -0
- package/skills/oma-design/resources/data-grid.md +48 -0
- package/skills/oma-design/resources/design-md-spec.md +107 -0
- package/skills/oma-design/resources/design-tokens.md +53 -0
- package/skills/oma-design/resources/error-playbook.md +18 -0
- package/skills/oma-design/resources/execution-protocol.md +95 -0
- package/skills/oma-design/resources/external-design-skills.md +130 -0
- package/skills/oma-design/resources/getdesign-fetcher.md +104 -0
- package/skills/oma-design/resources/product-interface-review.md +59 -0
- package/skills/oma-design/resources/redesign-protocol.md +52 -0
- package/skills/oma-design/resources/stitch-integration.md +244 -0
- package/skills/oma-dev-workflow/SKILL.md +375 -0
- package/skills/oma-dev-workflow/resources/affected-checks.py +58 -0
- package/skills/oma-dev-workflow/resources/api-workflows.md +58 -0
- package/skills/oma-dev-workflow/resources/database-patterns.md +107 -0
- package/skills/oma-dev-workflow/resources/i18n-patterns.md +63 -0
- package/skills/oma-dev-workflow/resources/release-coordination.md +240 -0
- package/skills/oma-dev-workflow/resources/tooling-profiles.md +217 -0
- package/skills/oma-dev-workflow/resources/troubleshooting.md +78 -0
- package/skills/oma-dev-workflow/resources/validation-pipeline.md +246 -0
- package/skills/oma-docs/SKILL.md +77 -0
- package/skills/oma-docs/resources/commands.md +76 -0
- package/skills/oma-explanation/SKILL.md +212 -0
- package/skills/oma-explanation/resources/document-structure.md +115 -0
- package/skills/oma-explanation/resources/draft-format.md +199 -0
- package/skills/oma-explanation/resources/html-contract.md +102 -0
- package/skills/oma-frontend/SKILL.md +227 -0
- package/skills/oma-frontend/resources/angular-rules.md +110 -0
- package/skills/oma-frontend/resources/checklist.md +76 -0
- package/skills/oma-frontend/resources/error-playbook.md +125 -0
- package/skills/oma-frontend/resources/execution-protocol.md +46 -0
- package/skills/oma-frontend/resources/snippets.md +354 -0
- package/skills/oma-frontend/resources/specialized-visual-implementation.md +193 -0
- package/skills/oma-frontend/resources/tailwind-rules.md +83 -0
- package/skills/oma-frontend/resources/tech-stack.md +156 -0
- package/skills/oma-hwp/SKILL.md +166 -0
- package/skills/oma-hwp/config/hwp-config.yaml +35 -0
- package/skills/oma-hwp/resources/balanced-tables.ts +39 -0
- package/skills/oma-hwp/resources/execution-protocol.md +145 -0
- package/skills/oma-hwp/resources/flatten-tables.ts +101 -0
- package/skills/oma-hwp/resources/package.json +13 -0
- package/skills/oma-hwp/resources/troubleshooting.md +70 -0
- package/skills/oma-hwp/resources/tsconfig.json +10 -0
- package/skills/oma-hwp/resources/turndown-plugin-gfm.d.ts +9 -0
- package/skills/oma-image/SKILL.md +142 -0
- package/skills/oma-image/config/image-config.yaml +70 -0
- package/skills/oma-image/resources/checklist.md +18 -0
- package/skills/oma-image/resources/execution-protocol.md +117 -0
- package/skills/oma-image/resources/invocation.md +105 -0
- package/skills/oma-image/resources/prompt-tips.md +71 -0
- package/skills/oma-image/resources/vendor-matrix.md +90 -0
- package/skills/oma-market/SKILL.md +142 -0
- package/skills/oma-market/resources/checklist.md +12 -0
- package/skills/oma-market/resources/error-playbook.md +12 -0
- package/skills/oma-market/resources/execution-protocol.md +60 -0
- package/skills/oma-market/resources/frameworks/pestel.md +101 -0
- package/skills/oma-market/resources/frameworks/porters-5f.md +90 -0
- package/skills/oma-market/resources/frameworks/swot.md +61 -0
- package/skills/oma-market/resources/intent-rules.md +35 -0
- package/skills/oma-market/resources/output-laws.md +53 -0
- package/skills/oma-mobile/SKILL.md +168 -0
- package/skills/oma-mobile/resources/checklist.md +77 -0
- package/skills/oma-mobile/resources/error-playbook.md +198 -0
- package/skills/oma-mobile/resources/execution-protocol.md +47 -0
- package/skills/oma-mobile/resources/screen-template.dart +331 -0
- package/skills/oma-mobile/resources/screen-template.swift +239 -0
- package/skills/oma-mobile/resources/screen-template.tsx +179 -0
- package/skills/oma-mobile/resources/tech-stack.md +69 -0
- package/skills/oma-mobile/variants/README.md +45 -0
- package/skills/oma-mobile/variants/flutter/api-template.dart +461 -0
- package/skills/oma-mobile/variants/flutter/snippets.md +1353 -0
- package/skills/oma-mobile/variants/flutter/stack.yaml +21 -0
- package/skills/oma-mobile/variants/flutter/tech-stack.md +201 -0
- package/skills/oma-mobile/variants/kotlin-android/api-template.kt +182 -0
- package/skills/oma-mobile/variants/kotlin-android/snippets.md +871 -0
- package/skills/oma-mobile/variants/kotlin-android/stack.yaml +32 -0
- package/skills/oma-mobile/variants/kotlin-android/tech-stack.md +159 -0
- package/skills/oma-mobile/variants/react-native/api-template.ts +531 -0
- package/skills/oma-mobile/variants/react-native/snippets.md +1014 -0
- package/skills/oma-mobile/variants/react-native/stack.yaml +22 -0
- package/skills/oma-mobile/variants/react-native/tech-stack.md +192 -0
- package/skills/oma-mobile/variants/stack.schema.json +68 -0
- package/skills/oma-mobile/variants/swift-ios/api-template.swift +165 -0
- package/skills/oma-mobile/variants/swift-ios/snippets.md +1028 -0
- package/skills/oma-mobile/variants/swift-ios/stack.yaml +25 -0
- package/skills/oma-mobile/variants/swift-ios/tech-stack.md +174 -0
- package/skills/oma-observability/SKILL.md +225 -0
- package/skills/oma-observability/resources/anti-patterns.md +555 -0
- package/skills/oma-observability/resources/boundaries/cross-application.md +348 -0
- package/skills/oma-observability/resources/boundaries/multi-tenant.md +290 -0
- package/skills/oma-observability/resources/boundaries/release.md +372 -0
- package/skills/oma-observability/resources/boundaries/slo.md +225 -0
- package/skills/oma-observability/resources/checklist.md +123 -0
- package/skills/oma-observability/resources/examples.md +448 -0
- package/skills/oma-observability/resources/execution-protocol.md +166 -0
- package/skills/oma-observability/resources/incident-forensics.md +348 -0
- package/skills/oma-observability/resources/intent-rules.md +307 -0
- package/skills/oma-observability/resources/layers/L3-network.md +281 -0
- package/skills/oma-observability/resources/layers/L4-transport.md +299 -0
- package/skills/oma-observability/resources/layers/L7-application/crash-analytics.md +359 -0
- package/skills/oma-observability/resources/layers/L7-application/mobile-rum.md +278 -0
- package/skills/oma-observability/resources/layers/L7-application/waf.md +246 -0
- package/skills/oma-observability/resources/layers/L7-application/web-rum.md +350 -0
- package/skills/oma-observability/resources/layers/mesh.md +368 -0
- package/skills/oma-observability/resources/matrix.md +177 -0
- package/skills/oma-observability/resources/meta-observability.md +605 -0
- package/skills/oma-observability/resources/observability-as-code.md +666 -0
- package/skills/oma-observability/resources/signals/audit.md +310 -0
- package/skills/oma-observability/resources/signals/cost.md +303 -0
- package/skills/oma-observability/resources/signals/logs.md +263 -0
- package/skills/oma-observability/resources/signals/metrics.md +478 -0
- package/skills/oma-observability/resources/signals/privacy.md +351 -0
- package/skills/oma-observability/resources/signals/profiles.md +245 -0
- package/skills/oma-observability/resources/signals/traces.md +360 -0
- package/skills/oma-observability/resources/standards.md +214 -0
- package/skills/oma-observability/resources/transport/collector-topology.md +308 -0
- package/skills/oma-observability/resources/transport/otlp-grpc-vs-http.md +256 -0
- package/skills/oma-observability/resources/transport/sampling-recipes.md +297 -0
- package/skills/oma-observability/resources/transport/udp-statsd-mtu.md +167 -0
- package/skills/oma-observability/resources/vendor-categories.md +352 -0
- package/skills/oma-orchestration/SKILL.md +302 -0
- package/skills/oma-orchestration/config/cli-config.yaml +92 -0
- package/skills/oma-orchestration/resources/memory-schema.md +232 -0
- package/skills/oma-orchestration/resources/subagent-prompt-template.md +30 -0
- package/skills/oma-orchestration/scripts/parallel-run.sh +6 -0
- package/skills/oma-orchestration/scripts/spawn-agent.sh +5 -0
- package/skills/oma-orchestration/scripts/verify.sh +20 -0
- package/skills/oma-orchestration/templates/backend-task.md +19 -0
- package/skills/oma-orchestration/templates/debug-task.md +16 -0
- package/skills/oma-orchestration/templates/frontend-task.md +18 -0
- package/skills/oma-orchestration/templates/mobile-task.md +18 -0
- package/skills/oma-orchestration/templates/qa-task.md +16 -0
- package/skills/oma-orchestration/templates/tasks-example.yaml +15 -0
- package/skills/oma-pdf/SKILL.md +162 -0
- package/skills/oma-pdf/config/pdf-config.yaml +27 -0
- package/skills/oma-pdf/resources/execution-protocol.md +127 -0
- package/skills/oma-pm/SKILL.md +157 -0
- package/skills/oma-pm/resources/error-playbook.md +75 -0
- package/skills/oma-pm/resources/examples.md +439 -0
- package/skills/oma-pm/resources/execution-protocol.md +62 -0
- package/skills/oma-pm/resources/iso-planning.md +110 -0
- package/skills/oma-pm/resources/plan-phase-protocol.md +66 -0
- package/skills/oma-pm/resources/task-template.json +86 -0
- package/skills/oma-qa/SKILL.md +141 -0
- package/skills/oma-qa/resources/checklist.md +339 -0
- package/skills/oma-qa/resources/error-playbook.md +98 -0
- package/skills/oma-qa/resources/execution-protocol.md +169 -0
- package/skills/oma-qa/resources/iso-quality.md +82 -0
- package/skills/oma-qa/resources/verify-ship-protocol.md +116 -0
- package/skills/oma-recap/SKILL.md +245 -0
- package/skills/oma-recap/resources/output-formats.md +83 -0
- package/skills/oma-refactor/SKILL.md +184 -0
- package/skills/oma-refactor/resources/definition.md +108 -0
- package/skills/oma-refactor/resources/governance.md +33 -0
- package/skills/oma-refactor/resources/hotspots.py +44 -0
- package/skills/oma-refactor/resources/measurement.md +93 -0
- package/skills/oma-scholar/SKILL.md +276 -0
- package/skills/oma-scholar/config/scholar-config.yaml +79 -0
- package/skills/oma-scholar/resources/api-endpoints.md +174 -0
- package/skills/oma-scholar/resources/checklist.md +92 -0
- package/skills/oma-scholar/resources/execution-protocol.md +224 -0
- package/skills/oma-scholar/resources/fallback-providers.md +143 -0
- package/skills/oma-scholar/resources/setup-openalex.md +85 -0
- package/skills/oma-scholar/resources/sidecar-spec.md +341 -0
- package/skills/oma-scholar/resources/upstream-spec-cache.md +972 -0
- package/skills/oma-scm/SKILL.md +103 -0
- package/skills/oma-scm/resources/cm-operations.md +56 -0
- package/skills/oma-scm/resources/codeowners-playbook.md +45 -0
- package/skills/oma-scm/resources/conventional-commits.md +108 -0
- package/skills/oma-scm/resources/merge-risk.md +76 -0
- package/skills/oma-scm/resources/onboarding-risk-signals.md +71 -0
- package/skills/oma-search/SKILL.md +125 -0
- package/skills/oma-search/resources/checklist.md +36 -0
- package/skills/oma-search/resources/error-playbook.md +66 -0
- package/skills/oma-search/resources/examples.md +80 -0
- package/skills/oma-search/resources/execution-protocol.md +86 -0
- package/skills/oma-search/resources/intent-rules.md +47 -0
- package/skills/oma-search/resources/trust-registry.md +53 -0
- package/skills/oma-security/SKILL.md +172 -0
- package/skills/oma-security/resources/artex.md +108 -0
- package/skills/oma-security/resources/ci.md +134 -0
- package/skills/oma-security/resources/cisco-source.md +108 -0
- package/skills/oma-security/resources/deepsec-config.md +45 -0
- package/skills/oma-security/resources/deepsec-matchers.md +35 -0
- package/skills/oma-security/resources/deepsec-scanning.md +45 -0
- package/skills/oma-security/resources/deepsec-setup.md +41 -0
- package/skills/oma-security/resources/findings-contract.md +408 -0
- package/skills/oma-security/resources/mcp-scanning.md +122 -0
- package/skills/oma-security/resources/skill-scanning.md +106 -0
- package/skills/oma-security/resources/validation.md +71 -0
- package/skills/oma-skill-creation/SKILL.md +84 -0
- package/skills/oma-skill-creation/resources/prompt-evaluation.md +36 -0
- package/skills/oma-skill-creation/resources/ssl-lite-template.md +108 -0
- package/skills/oma-skill-creation/resources/validation-checklist.md +101 -0
- package/skills/oma-slide/SKILL.md +277 -0
- package/skills/oma-slide/resources/animation-patterns.md +245 -0
- package/skills/oma-slide/resources/assets/deck-stage.js +514 -0
- package/skills/oma-slide/resources/assets/viewport-base.css +257 -0
- package/skills/oma-slide/resources/canva-integration.md +203 -0
- package/skills/oma-slide/resources/checklist.md +46 -0
- package/skills/oma-slide/resources/design-doctrine.md +260 -0
- package/skills/oma-slide/resources/fixed-stage.md +232 -0
- package/skills/oma-slide/resources/generation-protocol.md +393 -0
- package/skills/oma-slide/resources/native-pptx.md +84 -0
- package/skills/oma-slide/resources/selection-index.json +461 -0
- package/skills/oma-slide/resources/style-presets.LICENSE +10 -0
- package/skills/oma-slide/resources/style-presets.md +520 -0
- package/skills/oma-tf-infra/SKILL.md +201 -0
- package/skills/oma-tf-infra/resources/checklist.md +53 -0
- package/skills/oma-tf-infra/resources/cost-optimization.md +574 -0
- package/skills/oma-tf-infra/resources/error-playbook.md +68 -0
- package/skills/oma-tf-infra/resources/examples.md +38 -0
- package/skills/oma-tf-infra/resources/execution-protocol.md +129 -0
- package/skills/oma-tf-infra/resources/iso-42001-infra.md +229 -0
- package/skills/oma-tf-infra/resources/multi-cloud-examples.md +241 -0
- package/skills/oma-tf-infra/resources/policy-testing-examples.md +332 -0
- package/skills/oma-translation/SKILL.md +229 -0
- package/skills/oma-translation/resources/anti-ai-patterns.md +104 -0
- package/skills/oma-translation/resources/lang/_template.md +73 -0
- package/skills/oma-translation/resources/lang/en.md +123 -0
- package/skills/oma-translation/resources/lang/ja.md +274 -0
- package/skills/oma-translation/resources/lang/ko.md +228 -0
- package/skills/oma-translation/resources/lang/zh.md +285 -0
- package/skills/oma-translation/resources/style-skills.md +104 -0
- package/skills/oma-translation/resources/translation-rubric.md +126 -0
- package/skills/oma-video/SKILL.md +229 -0
- package/skills/oma-video/config/video-config.yaml +60 -0
- package/skills/oma-video/resources/checklist.md +26 -0
- package/skills/oma-video/resources/execution-protocol.md +122 -0
- package/skills/oma-video/resources/existing-media.md +185 -0
- package/skills/oma-video/resources/hyperframes-authoring/README.md +44 -0
- package/skills/oma-video/resources/hyperframes-authoring/demo.md +31 -0
- package/skills/oma-video/resources/hyperframes-authoring/explainer.md +10 -0
- package/skills/oma-video/resources/hyperframes-authoring/shorts.md +10 -0
- package/skills/oma-video/resources/motion-principles.md +81 -0
- package/skills/oma-video/resources/mpt/driver.py +301 -0
- package/skills/oma-video/resources/prompt-tips.md +75 -0
- package/skills/oma-video/resources/script-schema.md +81 -0
- package/skills/oma-video/resources/sound-design.md +127 -0
- package/skills/oma-video/resources/strudel/package.json +11 -0
- package/skills/oma-video/resources/strudel/page.html +87 -0
- package/skills/oma-video/resources/strudel/render.mjs +295 -0
- package/skills/oma-video/resources/vendor-matrix.md +124 -0
- package/skills/oma-voice/SKILL.md +249 -0
- package/skills/oma-voice/config/voice-config.yaml +30 -0
- package/skills/oma-voice/resources/audio-processing.md +119 -0
- package/skills/oma-voice/resources/checklist.md +47 -0
- package/skills/oma-voice/resources/execution-protocol.md +215 -0
- package/skills/oma-voice/resources/prompt-tips.md +43 -0
- package/skills/oma-voice/resources/voice-matrix.md +51 -0
- package/skills/oma-voice/resources/voicestudio.md +87 -0
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
# Design Doctrine — oma-slide
|
|
2
|
+
|
|
3
|
+
> Anti-"AI slop" aesthetics, font rules, content-density modes, and accessibility requirements.
|
|
4
|
+
> Read this document before writing any slide HTML. It defines the aesthetic contract for all
|
|
5
|
+
> oma-slide generated decks.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. The Anti-"AI Slop" Commitment
|
|
10
|
+
|
|
11
|
+
Most AI-generated presentations are immediately recognizable: Inter or Roboto at arbitrary sizes,
|
|
12
|
+
purple-to-blue linear gradients, white cards dropped on a gradient background, icon rows that
|
|
13
|
+
feel copied from a template screenshot. These choices read as unowned — the visual equivalent of
|
|
14
|
+
filler text.
|
|
15
|
+
|
|
16
|
+
Every oma-slide deck must make a **committed aesthetic choice** and follow it through. That means:
|
|
17
|
+
|
|
18
|
+
- A **distinctive typographic voice** — not the path of least resistance.
|
|
19
|
+
- A **committed palette** — 2–4 colors with semantic roles, not "looks fine on screen."
|
|
20
|
+
- An **atmospheric intention** — the deck should feel like something, not just contain information.
|
|
21
|
+
|
|
22
|
+
The test: could this slide have come from a specific studio, designer, or publication? If yes,
|
|
23
|
+
it is doing its job.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 2. Typography Rules
|
|
28
|
+
|
|
29
|
+
### 2a. Forbidden Defaults
|
|
30
|
+
|
|
31
|
+
Do **not** use the following as the primary or display typeface:
|
|
32
|
+
|
|
33
|
+
| Typeface | Why forbidden |
|
|
34
|
+
|---|---|
|
|
35
|
+
| Inter | Ubiquitous SaaS default; zero personality at display sizes |
|
|
36
|
+
| Roboto | Google Material default; reads as a framework artifact |
|
|
37
|
+
| Arial / Helvetica (unmodified) | Corporate filler; visually neutral to the point of invisibility |
|
|
38
|
+
| Open Sans | Overused in educational/government templates |
|
|
39
|
+
| Lato | Same problem as Open Sans |
|
|
40
|
+
|
|
41
|
+
Using any of the above as a **body/fallback** in a font stack is acceptable. Using them as
|
|
42
|
+
the **display/headline typeface** produces AI-slop output.
|
|
43
|
+
|
|
44
|
+
### 2b. Distinctive Latin Display Fonts (encouraged)
|
|
45
|
+
|
|
46
|
+
Choose from distinctive, well-crafted typefaces. Examples (all free via Google Fonts or equivalent CDN):
|
|
47
|
+
|
|
48
|
+
| Typeface | Character | Good for |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| Playfair Display | Classical serif elegance | Editorial, advisory, literary |
|
|
51
|
+
| Cormorant Garamond | Literary high-contrast serif | Scholarly, quiet luxury |
|
|
52
|
+
| Fraunces | Optical-size serif with personality | Warm editorial, brand work |
|
|
53
|
+
| Bricolage Grotesque | Variable grotesk with rhythm | Contemporary, design-led |
|
|
54
|
+
| Bebas Neue | Condensed caps impact | Bold poster, headlines-only |
|
|
55
|
+
| Shrikhand | Bold decorative display | Loud editorial, manifesto |
|
|
56
|
+
| Space Grotesk | Technical yet warm | Tech, SaaS with voice |
|
|
57
|
+
| Syne | Geometric with irregular flow | Indie, experimental |
|
|
58
|
+
| Alfa Slab One | Slab-serif punch | Activist, campaign energy |
|
|
59
|
+
| DM Serif Display | Transitional, refined | Professional with warmth |
|
|
60
|
+
|
|
61
|
+
This is not an exhaustive list — use judgment. A face should be chosen because it serves the
|
|
62
|
+
deck's mood, not because it is available.
|
|
63
|
+
|
|
64
|
+
### 2c. CJK Decks — Pretendard Required
|
|
65
|
+
|
|
66
|
+
Any deck whose content includes **Korean (한국어), Japanese (日本語), or Chinese (中文)** characters
|
|
67
|
+
**must** include Pretendard Variable as the primary font. This is non-negotiable.
|
|
68
|
+
|
|
69
|
+
```html
|
|
70
|
+
<!-- In <head> -->
|
|
71
|
+
<link rel="preconnect" href="https://cdn.jsdelivr.net" />
|
|
72
|
+
<link
|
|
73
|
+
rel="stylesheet"
|
|
74
|
+
href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/variable/pretendardvariable-dynamic-subset.min.css"
|
|
75
|
+
/>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
```css
|
|
79
|
+
:root {
|
|
80
|
+
--font-body: "Pretendard Variable", Pretendard, -apple-system, BlinkMacSystemFont,
|
|
81
|
+
"Apple SD Gothic Neo", "Noto Sans KR", "Noto Sans JP", "Noto Sans SC", sans-serif;
|
|
82
|
+
--font-display: "Pretendard Variable", Pretendard, sans-serif;
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Rationale: the system CJK font stack varies wildly across OS versions and produces
|
|
87
|
+
inconsistent rendering at large display sizes. Pretendard is modern, variable, and has
|
|
88
|
+
a dynamic subset CDN making it practical for web delivery.
|
|
89
|
+
|
|
90
|
+
For bilingual EN/CJK decks: pair Pretendard with a compatible latin display face (e.g.,
|
|
91
|
+
Bricolage Grotesque or a Grotesk that harmonizes with Pretendard's proportions).
|
|
92
|
+
|
|
93
|
+
### 2d. Font Loading
|
|
94
|
+
|
|
95
|
+
Load display fonts via `<link rel="preconnect">` + `<link rel="stylesheet">` in the `<head>`.
|
|
96
|
+
The validator awaits `document.fonts.ready` before measuring geometry — so font choices directly
|
|
97
|
+
affect overflow detection. Choose fonts early in the generation phase, not as an afterthought.
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 3. Color Palette Rules
|
|
102
|
+
|
|
103
|
+
### 3a. Anti-Patterns to Avoid
|
|
104
|
+
|
|
105
|
+
| Pattern | Why it fails |
|
|
106
|
+
|---|---|
|
|
107
|
+
| Purple-to-blue linear gradient background | The single most common AI-generated visual cliché |
|
|
108
|
+
| Gradient orbs/blobs floating on white | Overused in SaaS landing-page design, reads as template |
|
|
109
|
+
| Full-rainbow accent colors | Signals no palette decision was made |
|
|
110
|
+
| Pure `#ffffff` background with no atmospheric treatment | Clinically neutral; no sense of material or surface |
|
|
111
|
+
| Bright neon on black + one more neon (no restraint) | Every cyberpunk AI deck; needs commitment to be distinctive |
|
|
112
|
+
|
|
113
|
+
### 3b. Committed Palette Structure
|
|
114
|
+
|
|
115
|
+
A good palette has **semantic roles**, not just colors:
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
background — the canvas; sets material and atmosphere
|
|
119
|
+
text-primary — main readable content; must pass WCAG AA on background
|
|
120
|
+
text-muted — supporting text, captions; must pass WCAG AA
|
|
121
|
+
accent — maximum one primary accent; the deck's signature color
|
|
122
|
+
accent-alt — optional secondary accent; only if the design concept requires it
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Name colors descriptively: `"Ink Navy (#1a2332)"` not `"dark blue"`. The name carries
|
|
126
|
+
the palette intent.
|
|
127
|
+
|
|
128
|
+
### 3c. WCAG AA Minimum
|
|
129
|
+
|
|
130
|
+
All text must meet **WCAG 2.1 AA** contrast ratios:
|
|
131
|
+
- Normal text (< 18 pt / < 14 pt bold): 4.5:1 contrast ratio
|
|
132
|
+
- Large text (≥ 18 pt / ≥ 14 pt bold): 3:1 contrast ratio
|
|
133
|
+
|
|
134
|
+
At 1920×1080, "normal" text corresponds to roughly ≤ 24 px; "large" text to ≥ 24 px.
|
|
135
|
+
|
|
136
|
+
Use a contrast checker before finalizing a palette. If a design direction cannot meet AA, revise
|
|
137
|
+
the palette — do not compromise accessibility for aesthetics.
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## 4. Atmospheric Intention
|
|
142
|
+
|
|
143
|
+
Atmosphere is the quality that makes a deck feel like it was designed rather than assembled.
|
|
144
|
+
It comes from:
|
|
145
|
+
|
|
146
|
+
- **Background treatment**: solid color, gradient with direction and purpose, subtle texture,
|
|
147
|
+
or photographic.
|
|
148
|
+
- **Whitespace**: deliberate emptiness communicates confidence. Cramped slides communicate anxiety.
|
|
149
|
+
- **Typographic hierarchy**: 2–3 sizes maximum per slide, each with a clear role.
|
|
150
|
+
- **Layer logic** (from `fixed-stage.md`):
|
|
151
|
+
- z-index 0 — background
|
|
152
|
+
- z-index 10 — atmosphere (texture, overlay)
|
|
153
|
+
- z-index 100 — content
|
|
154
|
+
- z-index 200 — highlights/callouts
|
|
155
|
+
|
|
156
|
+
The wildcard preview in Phase 2 is the appropriate place to introduce an unexpected atmospheric
|
|
157
|
+
direction. The safe preset and bold template choices should stay within recognizable territory.
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## 5. Content-Density Modes
|
|
162
|
+
|
|
163
|
+
The `density` field in `meta.json` governs how slides are laid out and how much content they carry.
|
|
164
|
+
Its values are the CLI enum `sparse | balanced | dense`: a speaker-led deck maps to `sparse`, a
|
|
165
|
+
reading-first deck maps to `dense`, and `balanced` (the default) sits in between.
|
|
166
|
+
|
|
167
|
+
### 5a. Speaker-Led (`sparse`)
|
|
168
|
+
|
|
169
|
+
The presenter is the primary content delivery vehicle. Slides are visual anchors.
|
|
170
|
+
|
|
171
|
+
| Element | Guidance |
|
|
172
|
+
|---|---|
|
|
173
|
+
| Headline | 1 short statement per slide; 64–120 px; ≤ 10 words |
|
|
174
|
+
| Body text | 0–3 lines maximum; 32–48 px; no prose paragraphs |
|
|
175
|
+
| Bullets | Avoid. Use one concept per slide instead. |
|
|
176
|
+
| Visuals | Large, occupying ≥ 40% of the canvas |
|
|
177
|
+
| Slide count | Allow 1 slide per 1–2 minutes of talk time |
|
|
178
|
+
| Speaker notes | Extensive notes in `meta.json.speakerNotes[]` for the presenter |
|
|
179
|
+
|
|
180
|
+
### 5b. Reading-First (`dense`)
|
|
181
|
+
|
|
182
|
+
The deck is a self-contained document. Readers consume it without a presenter.
|
|
183
|
+
|
|
184
|
+
| Element | Guidance |
|
|
185
|
+
|---|---|
|
|
186
|
+
| Headline | Clear, self-explanatory; 48–72 px |
|
|
187
|
+
| Body text | Full sentences allowed; 28–36 px; max 8 lines per slide |
|
|
188
|
+
| Bullets | Acceptable; ≤ 6 items; each bullet ≤ 20 words |
|
|
189
|
+
| Visuals | Supporting; labeled with captions |
|
|
190
|
+
| Slide count | Allow as many slides as the content requires |
|
|
191
|
+
| Speaker notes | Optional; deck must stand alone without them |
|
|
192
|
+
|
|
193
|
+
### 5c. Mixed Density
|
|
194
|
+
|
|
195
|
+
Some decks mix modes (e.g., opener slides are sparse, data slides are dense). Apply the relevant
|
|
196
|
+
mode rules per slide and record the overall dominant mode in `meta.json.density`
|
|
197
|
+
(`sparse`, `balanced`, or `dense`).
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## 6. Slide Count Guidance
|
|
202
|
+
|
|
203
|
+
| Purpose | Sparse (speaker-led) | Dense (reading-first) |
|
|
204
|
+
|---|---|---|
|
|
205
|
+
| Pitch / investor (5 min) | 6–10 slides | 8–14 slides |
|
|
206
|
+
| Internal report (15 min) | 12–18 slides | 18–30 slides |
|
|
207
|
+
| Conference talk (30 min) | 20–35 slides | 30–50 slides |
|
|
208
|
+
| Executive briefing (10 min) | 8–12 slides | 12–20 slides |
|
|
209
|
+
| Product launch (standalone) | 10–16 slides | 16–28 slides |
|
|
210
|
+
|
|
211
|
+
These are guidelines, not hard limits. Content scope governs slide count; do not pad or compress
|
|
212
|
+
slides to hit a number.
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## 7. What a Good Slide Looks Like
|
|
217
|
+
|
|
218
|
+
A well-crafted slide satisfies all of these:
|
|
219
|
+
|
|
220
|
+
1. **One idea** — a viewer can state the slide's point in one sentence.
|
|
221
|
+
2. **Scannable hierarchy** — the largest element is the most important.
|
|
222
|
+
3. **Comfortable empty space** — the canvas breathes; content does not fill edge to edge.
|
|
223
|
+
4. **Consistent with the deck** — the color, font, and grid choices are the same as every other slide.
|
|
224
|
+
5. **Readable at scale** — body text ≥ 28 px (doctrine floor; the validator's hard gate rejects only text below 18 px); the smallest legible text at 1920×1080 passes WCAG AA.
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## 8. What Makes a Deck Feel Distinctive (not just acceptable)
|
|
229
|
+
|
|
230
|
+
The difference between "it looks fine" and "this is well designed" is usually one of:
|
|
231
|
+
|
|
232
|
+
- **Typographic commitment**: the display typeface is unmistakably itself at every size.
|
|
233
|
+
- **Palette ownership**: the colors have a name and a reason; they could not have been chosen randomly.
|
|
234
|
+
- **Compositional tension**: not every element is centered and balanced — some slides use asymmetry, large negative space, or a single dominant element to create visual interest.
|
|
235
|
+
- **Atmospheric consistency**: the first slide and the last slide feel like they come from the same world.
|
|
236
|
+
- **Motion that earns its place**: if there are animations, they reinforce the content rhythm — a fade-up for an incoming point, not a spin because CSS supports it.
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## 9. Accessibility Requirements (WCAG AA)
|
|
241
|
+
|
|
242
|
+
### 9a. Animation Performance
|
|
243
|
+
|
|
244
|
+
Use `transform` + `opacity` only for animations. Avoid `width`, `height`, `margin`, `padding`
|
|
245
|
+
transitions (these cause layout reflows and are expensive at 1920×1080).
|
|
246
|
+
|
|
247
|
+
### 9b. Focus States
|
|
248
|
+
|
|
249
|
+
Navigation controls (`.deck-nav button`) must have visible `:focus-visible` styles. The viewer
|
|
250
|
+
is keyboard-navigable; sighted keyboard users must see which element has focus.
|
|
251
|
+
|
|
252
|
+
### 9c. Fixed Stage Tradeoff
|
|
253
|
+
|
|
254
|
+
The fixed 1920×1080 letterbox model is an accepted, conscious limitation:
|
|
255
|
+
- On small mobile screens the stage scales down (text shrinks proportionally).
|
|
256
|
+
- Screen readers receive the raw HTML structure, not the scaled layout.
|
|
257
|
+
- Zoom interactions in browsers may distort the scaled stage.
|
|
258
|
+
|
|
259
|
+
These are known tradeoffs of the stage model — do not attempt to work around them in generated
|
|
260
|
+
HTML. Document this limitation when relevant to the user.
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# Fixed-Stage Rules — oma-slide
|
|
2
|
+
|
|
3
|
+
> The canonical reference for the 1920×1080 stage model, embedding instructions, px-authoring
|
|
4
|
+
> conventions, and the CJK → Pretendard rule.
|
|
5
|
+
|
|
6
|
+
## 1. The 1920×1080 Invariant
|
|
7
|
+
|
|
8
|
+
All slides are authored at exactly **1920 × 1080 px**. This is non-negotiable:
|
|
9
|
+
|
|
10
|
+
- The validator (`oma slide validate`) renders at 1920×1080 and checks geometry at that size;
|
|
11
|
+
it reports px→pt at 0.75 (1920×1080 px → 1440×810 pt at 96 dpi / 72 pt-per-inch).
|
|
12
|
+
- The exporter (`oma slide export pdf|png`) captures at 1920×1080 before any post-processing.
|
|
13
|
+
- PPTX export places each rasterized slide full-bleed on a LAYOUT_WIDE canvas
|
|
14
|
+
(13.333 in × 7.5 in = 960×540 pt) — pixel authoring only, no pt in HTML.
|
|
15
|
+
- Do **not** author in percentages, `vw/vh`, or responsive units that reflow the layout.
|
|
16
|
+
Fixed `px` values only inside `.slide`.
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
Canvas size: 1920 px wide × 1080 px tall
|
|
20
|
+
Aspect ratio: 16:9
|
|
21
|
+
Validator pt: 1440 pt wide × 810 pt tall (px × 0.75)
|
|
22
|
+
PPTX layout: 13.333 in × 7.5 in (960×540 pt) — raster placed full-bleed
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 2. Stage Scaling — How It Works
|
|
26
|
+
|
|
27
|
+
`deck-stage.js` computes:
|
|
28
|
+
|
|
29
|
+
```js
|
|
30
|
+
const scale = Math.min(viewportWidth / 1920, viewportHeight / 1080);
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Then positions the `.deck-stage` element so it is centred (letterbox / pillarbox):
|
|
34
|
+
|
|
35
|
+
```js
|
|
36
|
+
offsetLeft = (viewportWidth - 1920 * scale) / 2
|
|
37
|
+
offsetTop = (viewportHeight - 1080 * scale) / 2
|
|
38
|
+
|
|
39
|
+
stageEl.style.transform = `scale(${scale})`;
|
|
40
|
+
stageEl.style.left = `${offsetLeft}px`;
|
|
41
|
+
stageEl.style.top = `${offsetTop}px`;
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
`transform-origin` is `top left` (set in `viewport-base.css`). This keeps the maths
|
|
45
|
+
simple and avoids a secondary translate.
|
|
46
|
+
|
|
47
|
+
The viewport background (`#000` default) fills the letterbox/pillarbox bars. You can change
|
|
48
|
+
the background color of `.deck-viewport` in a theme without breaking the scale maths.
|
|
49
|
+
|
|
50
|
+
## 3. Embedding into a Deck
|
|
51
|
+
|
|
52
|
+
Paste or link the two shared assets into every deck's `<head>`. The `oma slide create` command
|
|
53
|
+
copies them into the workdir automatically; `oma slide bundle` inlines them into the single-file
|
|
54
|
+
output.
|
|
55
|
+
|
|
56
|
+
### Option A — External files (development / per-slide workdir)
|
|
57
|
+
|
|
58
|
+
```html
|
|
59
|
+
<head>
|
|
60
|
+
<link rel="stylesheet" href="./viewport-base.css" />
|
|
61
|
+
</head>
|
|
62
|
+
<body>
|
|
63
|
+
<deck-stage>
|
|
64
|
+
<div class="deck-viewport">
|
|
65
|
+
<div class="deck-stage">
|
|
66
|
+
<section class="slide" id="slide-01">
|
|
67
|
+
<!-- 1920×1080 content here -->
|
|
68
|
+
</section>
|
|
69
|
+
<section class="slide" id="slide-02">
|
|
70
|
+
<!-- ... -->
|
|
71
|
+
</section>
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
</deck-stage>
|
|
75
|
+
|
|
76
|
+
<!-- Optional: speaker notes (JSON keyed by 0-based slide index) -->
|
|
77
|
+
<script type="application/json" id="speaker-notes">
|
|
78
|
+
{ "0": "Opening remarks...", "1": "Second slide notes..." }
|
|
79
|
+
</script>
|
|
80
|
+
|
|
81
|
+
<script src="./deck-stage.js"></script>
|
|
82
|
+
</body>
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
<!-- oma-docs:ignore-start -->
|
|
86
|
+
### Option B — Inlined (single-file bundle — `out/deck.html`)
|
|
87
|
+
<!-- oma-docs:ignore-end -->
|
|
88
|
+
|
|
89
|
+
`oma slide bundle` inlines both files; the structure is the same but the
|
|
90
|
+
`<link>` is replaced by `<style>...</style>` and `<script src>` becomes `<script>...</script>`.
|
|
91
|
+
|
|
92
|
+
### Optional: nav controls + slide counter
|
|
93
|
+
|
|
94
|
+
`deck-stage.js` looks for existing `.deck-nav` and `.deck-counter` elements.
|
|
95
|
+
If none are present the viewer still works (keyboard/touch/wheel only).
|
|
96
|
+
For `viewer.html`, the CLI injects:
|
|
97
|
+
|
|
98
|
+
```html
|
|
99
|
+
<nav class="deck-nav" aria-label="Slide navigation">
|
|
100
|
+
<button id="btn-prev" aria-label="Previous slide">←</button>
|
|
101
|
+
<button id="btn-next" aria-label="Next slide">→</button>
|
|
102
|
+
</nav>
|
|
103
|
+
<div class="deck-counter" role="status" aria-live="polite"></div>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## 4. px-Authoring Conventions
|
|
107
|
+
|
|
108
|
+
| Element | Convention |
|
|
109
|
+
|---|---|
|
|
110
|
+
| Slide root | `position: absolute; inset: 0; width: 1920px; height: 1080px;` |
|
|
111
|
+
| Safe zones | Left/right margin ≥ 80px; top/bottom margin ≥ 60px |
|
|
112
|
+
| Body text | 28–36 px doctrine floor; heading 64–120 px. (The validator hard-fails only below 18 px — 18–27 px passes the gate but is reserved for captions/labels.) |
|
|
113
|
+
| Icon / decorative image | explicit `width`/`height` in px |
|
|
114
|
+
| Background gradients | allowed (CSS); rasterized to PNG at PPTX export |
|
|
115
|
+
| Clipping / overflow | `overflow: hidden` on `.slide` prevents bleed-out |
|
|
116
|
+
| Animations | `transform` + `opacity` only |
|
|
117
|
+
|
|
118
|
+
### 8-px Grid
|
|
119
|
+
|
|
120
|
+
Align all spacing, padding, and element positions to multiples of 8 px. This keeps designs
|
|
121
|
+
crisp at all scale factors and maps cleanly to pt at PPTX export.
|
|
122
|
+
|
|
123
|
+
### Z-index layers
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
0 background layer (solid color, image, gradient)
|
|
127
|
+
10 atmosphere layer (subtle overlay, texture)
|
|
128
|
+
100 content layer (text, charts, icons)
|
|
129
|
+
200 highlight layer (callouts, badges)
|
|
130
|
+
1000 overlay layer (modal-style content, reserved)
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## 5. Slide Visibility — Always Use .active / .visible
|
|
134
|
+
|
|
135
|
+
**Never** toggle slides with `display:none` or `display:block`. Some layout classes from design
|
|
136
|
+
themes may override that and reveal all slides at once.
|
|
137
|
+
|
|
138
|
+
Use the CSS class protocol defined in `viewport-base.css`:
|
|
139
|
+
|
|
140
|
+
| Class | Meaning |
|
|
141
|
+
|---|---|
|
|
142
|
+
| _(no class)_ | Hidden: `visibility:hidden; opacity:0; pointer-events:none` |
|
|
143
|
+
| `.active` | Fully visible: `visibility:visible; opacity:1; pointer-events:auto` |
|
|
144
|
+
| `.visible` | Fading out: `visibility:visible; opacity:0; pointer-events:none` |
|
|
145
|
+
|
|
146
|
+
`deck-stage.js` manages these classes automatically. Slide authors do not need to set them.
|
|
147
|
+
|
|
148
|
+
## 6. Validator Contract — data-om-validate
|
|
149
|
+
|
|
150
|
+
`deck-stage.js` automatically annotates each `.slide` with:
|
|
151
|
+
|
|
152
|
+
```html
|
|
153
|
+
data-screen-label="Slide N / M"
|
|
154
|
+
data-om-validate="no_overflowing_text,no_overlapping_text,slide_sized_text"
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
`oma slide validate` (puppeteer-core) reads these attributes to:
|
|
158
|
+
|
|
159
|
+
1. Locate each slide in the rendered DOM.
|
|
160
|
+
2. Know which checks to run (overflow / overlap / size checks).
|
|
161
|
+
3. Report findings as `{ code, message, slide, selector?, rect? }`.
|
|
162
|
+
|
|
163
|
+
**Do not remove or override `data-om-validate`** in authored slide HTML. If a slide intentionally
|
|
164
|
+
clips text (e.g., a decorative element), annotate the clipping element with `data-om-no-check`
|
|
165
|
+
to suppress false-positive overflow findings.
|
|
166
|
+
|
|
167
|
+
## 7. CJK Content → Pretendard Required
|
|
168
|
+
|
|
169
|
+
Any deck whose content contains Korean (한국어), Japanese (日本語), or Chinese (中文) characters
|
|
170
|
+
**must** include Pretendard Variable as the primary font.
|
|
171
|
+
|
|
172
|
+
```html
|
|
173
|
+
<!-- In <head> — Pretendard via CDN (fallback to system CJK stack) -->
|
|
174
|
+
<link rel="preconnect" href="https://cdn.jsdelivr.net" />
|
|
175
|
+
<link
|
|
176
|
+
rel="stylesheet"
|
|
177
|
+
href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/variable/pretendardvariable-dynamic-subset.min.css"
|
|
178
|
+
/>
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
CSS font-family for CJK decks:
|
|
182
|
+
|
|
183
|
+
```css
|
|
184
|
+
:root {
|
|
185
|
+
--font-body: "Pretendard Variable", Pretendard, -apple-system, BlinkMacSystemFont,
|
|
186
|
+
"Apple SD Gothic Neo", "Noto Sans KR", "Noto Sans JP", "Noto Sans SC", sans-serif;
|
|
187
|
+
--font-display: "Pretendard Variable", Pretendard, sans-serif;
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
For latin-only decks, distinctive display fonts are encouraged (anti-"AI slop"):
|
|
192
|
+
system-font-stack restriction applies only to the **body** font fallback, not to
|
|
193
|
+
the chosen heading/display typeface.
|
|
194
|
+
|
|
195
|
+
## 8. Print / Save-as-PDF
|
|
196
|
+
|
|
197
|
+
Trigger with `Ctrl+P` / `Cmd+P` in the browser, or use `oma slide export pdf --mode print`.
|
|
198
|
+
|
|
199
|
+
`deck-stage.js` removes the CSS transform before the print layout renders, so the browser
|
|
200
|
+
sees the true 1920×1080 px layout. `viewport-base.css` `@media print` rules:
|
|
201
|
+
|
|
202
|
+
- Remove `.deck-viewport` overflow/fixed positioning.
|
|
203
|
+
- Remove transform from `.deck-stage`.
|
|
204
|
+
- Make all `.slide` elements visible with `break-after: page`.
|
|
205
|
+
- Hide `.deck-nav` and `.deck-counter`.
|
|
206
|
+
|
|
207
|
+
Result: one clean 1920×1080 slide per printed page.
|
|
208
|
+
|
|
209
|
+
## 9. Presenter View (embedded notes panel + postMessage API)
|
|
210
|
+
|
|
211
|
+
The presenter view is an **embedded on-screen notes panel** — there is no separate
|
|
212
|
+
presenter window. `deck-stage.js` reads speaker notes from
|
|
213
|
+
`<script type="application/json" id="speaker-notes">` (a JSON object keyed by
|
|
214
|
+
**0-based slide index** as a string: `"0"`, `"1"`, …). Press **`n`** to toggle a
|
|
215
|
+
fixed, semi-transparent panel at the bottom of the viewport showing the current
|
|
216
|
+
slide's note; it updates automatically on slide change, is hidden by default
|
|
217
|
+
(never intercepts clicks when hidden), and is suppressed during print.
|
|
218
|
+
|
|
219
|
+
For embedding integrations, `deck-stage.js` also posts on every slide change:
|
|
220
|
+
|
|
221
|
+
```js
|
|
222
|
+
window.parent.postMessage(
|
|
223
|
+
{ type: "slideIndexChanged", index: N, total: M, note: "speaker note text" },
|
|
224
|
+
"*"
|
|
225
|
+
);
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
The parent frame can navigate the iframe by posting:
|
|
229
|
+
|
|
230
|
+
```js
|
|
231
|
+
iframeEl.contentWindow.postMessage({ type: "navigateTo", index: N }, "*");
|
|
232
|
+
```
|