@cyberskill/design 1.0.0 → 1.1.0
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/DESIGN.md +10 -9
- package/README.md +31 -28
- package/SKILL.md +13 -9
- package/VERSION +1 -1
- package/_ds_bundle.js +660 -202
- package/_ds_manifest.json +1 -1
- package/_esm/cs.mjs +14 -8
- package/_esm/react.d.ts +216 -0
- package/_esm/react.mjs +114 -0
- package/base/collections.css +31 -0
- package/base/components.css +3 -0
- package/base/data.css +33 -0
- package/base/forms.css +8 -0
- package/base/interaction.css +1 -0
- package/base/typography.css +6 -0
- package/components/_i18n/strings.js +8 -4
- package/components/ai/ai-conversation.card.html +2 -2
- package/components/ai/ai-lumi.card.html +2 -2
- package/components/ai/ai.card.html +2 -2
- package/components/brand/brand.card.html +2 -2
- package/components/button/buttons.card.html +2 -2
- package/components/data/AspectRatio.d.ts +16 -0
- package/components/data/AspectRatio.figma.tsx +12 -0
- package/components/data/AspectRatio.jsx +16 -0
- package/components/data/AspectRatio.prompt.md +7 -0
- package/components/data/Collapsible.d.ts +21 -0
- package/components/data/Collapsible.figma.tsx +12 -0
- package/components/data/Collapsible.jsx +49 -0
- package/components/data/Collapsible.prompt.md +7 -0
- package/components/data/Image.d.ts +4 -0
- package/components/data/Image.prompt.md +2 -2
- package/components/data/Item.d.ts +26 -0
- package/components/data/Item.figma.tsx +12 -0
- package/components/data/Item.jsx +63 -0
- package/components/data/Item.prompt.md +10 -0
- package/components/data/ScrollArea.d.ts +16 -0
- package/components/data/ScrollArea.figma.tsx +12 -0
- package/components/data/ScrollArea.jsx +25 -0
- package/components/data/ScrollArea.prompt.md +7 -0
- package/components/data/collections.card.html +15 -4
- package/components/data/data.card.html +15 -4
- package/components/datatable/datatable.card.html +2 -2
- package/components/dialog/dialog.card.html +2 -2
- package/components/feedback/feedback-2.card.html +2 -2
- package/components/feedback/feedback.card.html +2 -2
- package/components/forms/Cascader.jsx +5 -3
- package/components/forms/Editor.prompt.md +1 -1
- package/components/forms/InputGroup.d.ts +4 -0
- package/components/forms/InputGroup.jsx +38 -8
- package/components/forms/InputGroup.prompt.md +3 -3
- package/components/forms/NativeSelect.d.ts +22 -0
- package/components/forms/NativeSelect.figma.tsx +12 -0
- package/components/forms/NativeSelect.jsx +56 -0
- package/components/forms/NativeSelect.prompt.md +10 -0
- package/components/forms/NumberField.d.ts +5 -0
- package/components/forms/NumberField.jsx +51 -7
- package/components/forms/NumberField.prompt.md +2 -2
- package/components/forms/SegmentedControl.jsx +1 -1
- package/components/forms/TagInput.d.ts +3 -0
- package/components/forms/TagInput.jsx +62 -20
- package/components/forms/TagInput.prompt.md +2 -2
- package/components/forms/forms-2.card.html +2 -2
- package/components/forms/forms.card.html +5 -4
- package/components/icon/Icon.prompt.md +1 -1
- package/components/icon/icon.card.html +2 -2
- package/components/logo/Logo.jsx +2 -1
- package/components/logo/logo.card.html +2 -2
- package/components/navigation/Menu.jsx +14 -1
- package/components/navigation/navigation.card.html +2 -2
- package/components/navigation/shell.card.html +2 -2
- package/components/overlays/AlertDialog.d.ts +29 -0
- package/components/overlays/AlertDialog.figma.tsx +12 -0
- package/components/overlays/AlertDialog.jsx +142 -0
- package/components/overlays/AlertDialog.prompt.md +12 -0
- package/components/overlays/Drawer.jsx +1 -1
- package/components/overlays/Popconfirm.jsx +14 -1
- package/components/overlays/Popover.jsx +14 -1
- package/components/overlays/alertdialog.card.html +42 -0
- package/components/overlays/overlays.card.html +2 -2
- package/components/textfield/textfield.card.html +2 -2
- package/docs/benchmark-rubric.md +46 -0
- package/docs/ci-cd.md +17 -11
- package/docs/consumer-grant.md +37 -0
- package/docs/consuming.md +45 -16
- package/docs/contrast-report.md +91 -103
- package/docs/conventions.md +12 -9
- package/docs/decisions.md +33 -10
- package/docs/deploy.md +1 -1
- package/docs/design-styles.md +26 -8
- package/docs/figma.md +3 -3
- package/docs/live-hub.md +5 -3
- package/docs/products.md +13 -11
- package/docs/quality-gates.md +35 -21
- package/docs/release-notes.md +13 -3
- package/docs/status/assets/favicon.svg +5 -0
- package/docs/status/assets/status-legacy.css +399 -0
- package/docs/status/assets/status-legacy.js +505 -0
- package/docs/status/assets/status.css +644 -0
- package/docs/status/assets/status.js +1308 -0
- package/docs/status/data/status-feed.json +1 -0
- package/docs/status/data/task/TASK-REL-001.js +1 -0
- package/docs/status/index.html +45 -0
- package/docs/status/roadmap.html +4 -0
- package/docs/status/status-legacy.html +121 -0
- package/docs/storybook.md +5 -4
- package/docs/sync.md +3 -2
- package/docs/tasks/BACKLOG.md +25 -0
- package/docs/tasks/release/TASK-REL-001-launch-1-1-0/spec.md +55 -0
- package/docs/template-schema-v2.md +15 -3
- package/docs/vi/benchmark-rubric.md +46 -0
- package/docs/vi/ci-cd.md +17 -11
- package/docs/vi/consumer-grant.md +37 -0
- package/docs/vi/consuming.md +45 -16
- package/docs/vi/contrast-report.md +94 -106
- package/docs/vi/conventions.md +12 -9
- package/docs/vi/decisions.md +33 -10
- package/docs/vi/deploy.md +1 -1
- package/docs/vi/design-styles.md +26 -8
- package/docs/vi/figma.md +3 -3
- package/docs/vi/live-hub.md +5 -3
- package/docs/vi/products.md +13 -11
- package/docs/vi/quality-gates.md +35 -21
- package/docs/vi/release-notes.md +18 -8
- package/docs/vi/storybook.md +5 -4
- package/docs/vi/sync.md +3 -2
- package/docs/vi/template-schema-v2.md +15 -3
- package/docs/viewer.html +2 -2
- package/fonts/spacegrotesk-var-latin-ext.woff2 +0 -0
- package/fonts/spacegrotesk-var-latin.woff2 +0 -0
- package/fonts/spacegrotesk-var-vietnamese.woff2 +0 -0
- package/guidelines/atomic-view.html +40 -27
- package/guidelines/elements-geometry.html +69 -0
- package/guidelines/elements-variants.html +17 -17
- package/guidelines/type-families.html +16 -10
- package/llms.txt +17 -11
- package/package.json +38 -16
- package/styles.css +1 -0
- package/templates/ai-cluster-demo.html +29 -14
- package/templates/app-shell/support.js +4 -4
- package/templates/article/content-schema.json +6 -0
- package/templates/article/support.js +4 -4
- package/templates/auth/support.js +4 -4
- package/templates/bod-deck/support.js +4 -4
- package/templates/bod-investor-update/support.js +4 -4
- package/templates/bod-memo/support.js +4 -4
- package/templates/bod-minutes/content-schema.json +12 -0
- package/templates/bod-minutes/support.js +4 -4
- package/templates/bod-report/support.js +4 -4
- package/templates/bod-resolution/support.js +4 -4
- package/templates/culture-event-invite/support.js +4 -4
- package/templates/dashboard/support.js +4 -4
- package/templates/delivery-change-note/support.js +4 -4
- package/templates/delivery-kickoff/support.js +4 -4
- package/templates/delivery-qbr-deck/support.js +4 -4
- package/templates/delivery-runbook/content-schema.json +6 -0
- package/templates/delivery-runbook/support.js +4 -4
- package/templates/delivery-status-email/support.js +4 -4
- package/templates/doc-style-guide/DocStyleGuide.dc.html +2 -2
- package/templates/doc-style-guide/support.js +4 -4
- package/templates/doc-suite-index/support.js +4 -4
- package/templates/doc-templates/DocTemplates.dc.html +1 -1
- package/templates/doc-templates/support.js +4 -4
- package/templates/email/support.js +4 -4
- package/templates/email-safe/README.md +17 -4
- package/templates/email-safe/email-launch.html +3 -3
- package/templates/email-safe/email-newsletter.html +1 -1
- package/templates/finance-dunning-email/support.js +4 -4
- package/templates/finance-expense-report/support.js +4 -4
- package/templates/finance-invoice/support.js +4 -4
- package/templates/finance-quote/support.js +4 -4
- package/templates/hr-announcement/support.js +4 -4
- package/templates/hr-interview-kit/content-schema.json +12 -0
- package/templates/hr-interview-kit/support.js +4 -4
- package/templates/hr-offboarding/content-schema.json +12 -0
- package/templates/hr-offboarding/support.js +4 -4
- package/templates/hr-performance-review/content-schema.json +12 -0
- package/templates/hr-performance-review/support.js +4 -4
- package/templates/hr-pip/content-schema.json +12 -0
- package/templates/hr-pip/support.js +4 -4
- package/templates/legal-msa/content-schema.json +16 -0
- package/templates/legal-msa/support.js +4 -4
- package/templates/legal-sow/support.js +4 -4
- package/templates/marketing-campaign-brief/support.js +4 -4
- package/templates/marketing-case-study/support.js +4 -4
- package/templates/marketing-launch/support.js +4 -4
- package/templates/marketing-newsletter/support.js +4 -4
- package/templates/marketing-page/content-schema.json +0 -1
- package/templates/marketing-page/support.js +4 -4
- package/templates/marketing-press-release/support.js +4 -4
- package/templates/marketing-social-kit/support.js +4 -4
- package/templates/playground.html +8 -4
- package/templates/sales-one-pager/support.js +4 -4
- package/templates/sales-proposal-deck/support.js +4 -4
- package/templates/settings/Settings.dc.html +26 -14
- package/templates/settings/content-schema.json +36 -0
- package/templates/settings/support.js +4 -4
- package/templates/slide-deck/support.js +4 -4
- package/templates/team-meeting-agenda/content-schema.json +16 -0
- package/templates/team-meeting-agenda/support.js +4 -4
- package/templates/tech-incident-report/support.js +4 -4
- package/templates/tech-release-notes/support.js +4 -4
- package/templates/tech-retro/content-schema.json +12 -0
- package/templates/tech-retro/support.js +4 -4
- package/templates/tech-rfc/content-schema.json +6 -0
- package/templates/tech-rfc/support.js +4 -4
- package/templates/vn-appointment-transfer/support.js +4 -4
- package/templates/vn-certificate-of-employment/support.js +4 -4
- package/templates/vn-code-of-conduct/support.js +4 -4
- package/templates/vn-compensation-regulation/support.js +4 -4
- package/templates/vn-contract-amendment/support.js +4 -4
- package/templates/vn-contractor-agreement/support.js +4 -4
- package/templates/vn-data-protection-policy/support.js +4 -4
- package/templates/vn-disciplinary-case-file/support.js +4 -4
- package/templates/vn-disciplinary-schedule/content-schema.json +15 -0
- package/templates/vn-disciplinary-schedule/support.js +4 -4
- package/templates/vn-employee-request/support.js +4 -4
- package/templates/vn-exit-handover/support.js +4 -4
- package/templates/vn-foreign-employee-pack/support.js +4 -4
- package/templates/vn-grassroots-democracy/support.js +4 -4
- package/templates/vn-infosec-policy/support.js +4 -4
- package/templates/vn-internal-labor-regulations/support.js +4 -4
- package/templates/vn-internship-agreement/support.js +4 -4
- package/templates/vn-job-description/support.js +4 -4
- package/templates/vn-labor-contract/support.js +4 -4
- package/templates/vn-labour-management-book/content-schema.json +15 -0
- package/templates/vn-labour-management-book/support.js +4 -4
- package/templates/vn-mutual-nda/support.js +4 -4
- package/templates/vn-ndnca-ip/support.js +4 -4
- package/templates/vn-offer-letter/support.js +4 -4
- package/templates/vn-onboarding-checklist/support.js +4 -4
- package/templates/vn-pdpl-consent/support.js +4 -4
- package/templates/vn-performance-evaluation-regulation/support.js +4 -4
- package/templates/vn-performance-review-form/support.js +4 -4
- package/templates/vn-phantom-stock/support.js +4 -4
- package/templates/vn-probation-contract/support.js +4 -4
- package/templates/vn-receipt-acknowledgement/content-schema.json +15 -0
- package/templates/vn-receipt-acknowledgement/support.js +4 -4
- package/templates/vn-remote-work-policy/support.js +4 -4
- package/templates/vn-resignation-letter/support.js +4 -4
- package/templates/vn-salary-scale/content-schema.json +15 -0
- package/templates/vn-salary-scale/support.js +4 -4
- package/templates/vn-sow-appendix/support.js +4 -4
- package/templates/vn-termination-decision/support.js +4 -4
- package/templates/vn-total-rewards-appendix/support.js +4 -4
- package/templates/vn-training-commitment/support.js +4 -4
- package/templates/vn-travel-expense-policy/support.js +4 -4
- package/tokens/element-seeds.json +112 -0
- package/tokens/elements.css +274 -187
- package/tokens/fonts.css +12 -3
- package/tokens/native/CSTokens.kt +84 -68
- package/tokens/native/CSTokens.swift +84 -68
- package/tokens/native/cs_tokens.dart +84 -68
- package/tokens/provenance.json +9 -9
- package/tokens/styles.css +15 -0
- package/tokens/tokens.dtcg.json +258 -233
- package/tokens/tokens.js +168 -167
- package/tokens/tokens.json +167 -166
- package/tokens/typography.css +9 -1
- package/ui_kits/status-hub/README.md +1 -2
- package/ui_kits/status-hub/index.html +2 -2
- package/ui_kits/status-hub/settings.html +6 -3
- package/ui_kits/website/chat.html +2 -2
- package/ui_kits/website/index.html +2 -2
- package/ui_kits/status-hub/identity-lab.html +0 -134
package/docs/vi/ci-cd.md
CHANGED
|
@@ -12,15 +12,16 @@
|
|
|
12
12
|
|
|
13
13
|
1. **`fast-gates`** — `npm ci` + Playwright Chromium cache, serve repo, mở `_audit/run.html` headless (`_audit/ci/run-gates.mjs`), fail khi hard-gate fail. Upload import-report khi fail. Hàng mới trên board (hardening Th7 2026 thêm 8: token-format-parity, version-stamp, support-runtime-identity, package-exports-integrity, template-lang-parity, dtcg-typing, design-md-parity, bundle-freshness) được nhận tự động — runner đọc `window.__run`, không phải danh sách gate phía job.
|
|
14
14
|
2. **`token-provenance`** — kiểm Node không trình duyệt: natives + `provenance.json` khớp sha-256 nguồn DTCG.
|
|
15
|
-
3. **`unit-tests`** — `npm run test:unit` (
|
|
15
|
+
3. **`unit-tests`** — `npm run test:unit` (11 contract test Node thuần; nối vào CI bởi hardening Th7 2026 — trước đó chỉ local). Gồm `test-element-packs` (freshness `node scripts/generate-element-packs.mjs --check`).
|
|
16
16
|
4. **`node-prechecks`** — authority Node không trình duyệt: `_audit/ci/check-bundle-freshness.mjs` (nguồn chân lý bundle-freshness — khám phá source đầy đủ gồm file mới/xóa; hàng board chỉ re-hash file ghi trong header) và `scripts/generate-design-md.mjs --check` (`DESIGN.md` gốc byte-equals regeneration).
|
|
17
17
|
5. **`docs-consistency-blocker`** — merge blocker `docs-consistency` + `bilingual-parity`.
|
|
18
18
|
6. **`whole-set-audits`** — quyết định B của owner: mọi push/PR, cộng nightly `0 3 * * *` và `workflow_dispatch` (responsive + language + theme overflow, ~15–20 phút).
|
|
19
|
-
7. **`figma-variables-push`** — trên push `main` + thủ công. Quyết định A (non-Enterprise): Variables REST soft-skip
|
|
20
|
-
8. **`code-connect`** — trên PR + `main` + thủ công. Quyết định 1C: dry-run luôn (config +
|
|
21
|
-
9. **`regenerate-tokens`** — path
|
|
19
|
+
7. **`figma-variables-push`** — trên push `main` + thủ công. **`FIGMA_TOKEN` / `FIGMA_FILE_KEY` trống → soft-skip** (exit 0 + report — cùng trung thực với Code Connect). Quyết định A (non-Enterprise): Variables REST cũng **soft-skip khi API 403** (và lỗi plan/scope liên quan) sau khi secret chứng minh mở file. Soft-skip ≠ sync Variables live. Xem `docs/figma.md`.
|
|
20
|
+
8. **`code-connect`** — trên PR + `main` + thủ công. Quyết định 1C: dry-run luôn (config + 105 mapping); publish soft-skip khi thiếu `FIGMA_TOKEN` / `FIGMA_FILE_KEY` hoặc API 403/404/429. Xem `docs/figma.md`.
|
|
21
|
+
9. **`regenerate-tokens`** (pull request) + **`regenerate-tokens-push`** (push `main` / schedule / thủ công) — path filter phủ element seeds/packs (`element-seeds.json`, `elements.css`, mirror JSON/JS/DTCG, `generate-element-packs.mjs`) cộng natives / `VERSION`. Regenerate chạy `npm run tokens:elements` rồi `node _audit/ci/generate-native-tokens.mjs`. Trên **pull request** job chạy với `contents: read`, không bao giờ push, và **exit 1** khi có drift: chạy cả hai ở local rồi commit. Chỉ job song sinh push/schedule/thủ công giữ `contents: write` và auto-commit với `DS_PUSH_TOKEN` (hoặc `github.token`).
|
|
22
|
+
10. **`npm-hello-smoke`** — chứng minh consumer registry: `cd examples/npm-hello && npm ci && npm run smoke` (**hard fail**; package public). Path-filtered trên push/PR khi `examples/npm-hello/**`, bề mặt publish package, hoặc workflow này đổi; luôn chạy trên schedule / `workflow_dispatch`.
|
|
22
23
|
|
|
23
|
-
Workflow riêng **`npm-publish`** (`.github/workflows/npm-publish.yml`): `workflow_dispatch` + tag `v*`; pack dry-run luôn; publish
|
|
24
|
+
Workflow riêng **`npm-publish`** (`.github/workflows/npm-publish.yml`): `workflow_dispatch` + tag `v*`; pack dry-run luôn; publish qua **npm Trusted Publishing (OIDC)** (`id-token: write`, không `NPM_TOKEN` trên bước publish). Soft-skip khi auth / 403 / 404 / EOTP / conflict phiên bản. Phiên bản là **1.1.0**; license **UNLICENSED**. Trusted Publisher trên npmjs phải khớp filename workflow `npm-publish.yml`. Publishing access package: **Require 2FA and disallow tokens** (OIDC vẫn chạy; token classic bị từ chối).
|
|
24
25
|
|
|
25
26
|
Workflow riêng **`native-store`** (`.github/workflows/native-store.yml`): PR + `main` (path-filtered) + `workflow_dispatch`; dry-run scaffold luôn; kiểm signed-release soft-skip khi thiếu `ASC_KEY_ID` / `ASC_ISSUER_ID` / `ASC_KEY_P8` / `PLAY_SERVICE_ACCOUNT_JSON`. **Không bao giờ submit** lên App Store / Play — sample vẫn là sample. Xem `examples/native/README.md`.
|
|
26
27
|
|
|
@@ -39,7 +40,7 @@ Node **22** trên runner (tránh deprecation action Node 20). Cache key Playwrig
|
|
|
39
40
|
|
|
40
41
|
## Quyền auto-commit token
|
|
41
42
|
|
|
42
|
-
|
|
43
|
+
Chỉ `regenerate-tokens-push` yêu cầu `permissions: contents: write`; job song sinh cho pull request `regenerate-tokens` giữ `contents: read` và checkout không lưu credential, nên PR không bao giờ kích hoạt push của bot. Nếu org khóa default token read-only, đặt repository secret `DS_PUSH_TOKEN` (fine-grained PAT, Contents read/write) hoặc mở write tại org Actions settings. Xem ghi chú trước trong git history / org settings.
|
|
43
44
|
|
|
44
45
|
## Branch protection (khuyến nghị)
|
|
45
46
|
|
|
@@ -61,24 +62,29 @@ node _audit/ci/check-bundle-freshness.mjs
|
|
|
61
62
|
node scripts/generate-design-md.mjs --check
|
|
62
63
|
npm run test:unit
|
|
63
64
|
node _audit/ci/run-single-gate.mjs http://127.0.0.1:8080/_audit/docs-consistency.html __docs
|
|
65
|
+
npm run tokens:elements
|
|
66
|
+
node scripts/generate-element-packs.mjs --check
|
|
64
67
|
node _audit/ci/generate-native-tokens.mjs
|
|
65
68
|
```
|
|
66
69
|
|
|
67
70
|
## Những gì KHÔNG auto-fail (có chủ đích)
|
|
68
71
|
|
|
69
72
|
- **Hàng visual / component baseline side-by-side** — chỉ advisory (drift đánh giá bằng mắt). So sánh `%` pixel Playwright là gate **hard** (job `pixel-diff` + hàng Pixel CI trên board).
|
|
70
|
-
- **Figma Variables write
|
|
73
|
+
- **Figma Variables** — soft-skip khi thiếu secret (cùng trung thực với Code Connect) hoặc write Variables gặp non-Enterprise / API **403**; report artifact ghi lại skip. Soft-skip ≠ sync live.
|
|
71
74
|
- **Code Connect publish** — soft-skip khi thiếu secret hoặc API 403/404/429 (Quyết định 1C).
|
|
72
|
-
- **npm publish** — soft-skip khi
|
|
75
|
+
- **npm publish** — Trusted Publishing (OIDC) trên `npm-publish.yml`; soft-skip khi auth / conflict (Quyết định 1C).
|
|
73
76
|
- **Native store signed release** — soft-skip khi thiếu `ASC_*` / `PLAY_SERVICE_ACCOUNT_JSON` (Quyết định 1C); submit store vẫn tắt.
|
|
77
|
+
- **npm-hello registry smoke** — **hard fail** (`examples/npm-hello` → `npm ci` + `npm run smoke`); chứng minh đường install public `@cyberskill/design` (không soft-skip).
|
|
78
|
+
|
|
79
|
+
Job `figma-variables-push` hay `code-connect` xanh — và do đó badge hay hàng Status xanh — chỉ có nghĩa job exit 0; nó **không** chứng minh sync Figma live, vì soft-skip và publish thật nhìn từ ngoài giống hệt nhau. Mở report artifact của run (`figma-push-report.json` / `code-connect-report.json`) để biết cái nào đã xảy ra.
|
|
74
80
|
|
|
75
81
|
## Soft-skip dry-run (local)
|
|
76
82
|
|
|
77
83
|
```bash
|
|
78
|
-
npm run code-connect:dry-run # config + ≥
|
|
84
|
+
npm run code-connect:dry-run # config + ≥105 mapping; không secret
|
|
79
85
|
node _audit/ci/code-connect-publish.mjs # thiếu secret → SOFT SKIP missing_secrets
|
|
80
|
-
npm run npm:pack-dry-run # inventory tarball; không
|
|
81
|
-
node _audit/ci/npm-publish.mjs #
|
|
86
|
+
npm run npm:pack-dry-run # inventory tarball; không auth
|
|
87
|
+
node _audit/ci/npm-publish.mjs # GHA OIDC; không thì SOFT SKIP (package disallow tokens)
|
|
82
88
|
npm run native:store-dry-run # scaffold Fastlane + metadata; không ASC_*/Play JSON
|
|
83
89
|
node _audit/ci/native-store-dry-run.mjs # thiếu secret → SOFT SKIP missing_secrets
|
|
84
90
|
```
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Grant consumer — `@cyberskill/design`
|
|
2
|
+
|
|
3
|
+
**Trạng thái: có hiệu lực** (Th7 2026). Văn bản chính sách — không phải secret. License trên package vẫn **UNLICENSED**; grant này là lớp duyệt dùng trong các sản phẩm đã nêu.
|
|
4
|
+
|
|
5
|
+
## Grant
|
|
6
|
+
|
|
7
|
+
CyberSkill cấp cho **CyberSkill** (công ty và các team kỹ thuật sản phẩm dưới `cyberskill-official`) quyền **không độc quyền** cài và dùng **`@cyberskill/design`** trong các sản phẩm liệt kê ở registry đã khóa `docs/products.md`:
|
|
8
|
+
|
|
9
|
+
| Sản phẩm |
|
|
10
|
+
|---|
|
|
11
|
+
| Lumi — trợ lý điều ước |
|
|
12
|
+
| Status Hub — cổng portfolio khách hàng |
|
|
13
|
+
| CyberOS Agent Spine — hạ tầng agent, memory, gates |
|
|
14
|
+
| CyberSkill Design System — thư viện này |
|
|
15
|
+
| cyberskill.world — site studio |
|
|
16
|
+
| Client delivery suite — kickoff · QBR · runbooks |
|
|
17
|
+
| Board / investor collateral |
|
|
18
|
+
| HR / employment instruments |
|
|
19
|
+
|
|
20
|
+
Package vẫn **UNLICENSED**. Cài từ npm registry **không** tự cấp quyền redistribution. Redistribution ngoài các sản phẩm trên — gồm publish fork, đổi license, hoặc ship package như dependency của sản phẩm bên thứ ba không liên quan — cần **grant viết thêm** ghi trong file này (hoặc văn bản thay thế).
|
|
21
|
+
|
|
22
|
+
## Ghi chú phạm vi
|
|
23
|
+
|
|
24
|
+
- **Clone / subtree / link tĩnh** repo này cho cùng các sản phẩm trên được cover giống npm install.
|
|
25
|
+
- **Tooling chỉ-host** (Storybook, `_audit/`) không nằm trong tarball npm và không redistribution theo grant này.
|
|
26
|
+
- Thêm sản phẩm CyberSkill mới: cập nhật `docs/products.md` (+ VI) qua quyết định maintainer, rồi thêm hàng sản phẩm tại đây trong cùng change.
|
|
27
|
+
- Duyệt **team/client bên ngoài**: thêm stanza grant có ngày bên dưới (team/org, sản phẩm đã nêu, liên hệ). Không invent ánh xạ product → element tại đây — giữ ở `docs/products.md`.
|
|
28
|
+
|
|
29
|
+
## Grantee bổ sung
|
|
30
|
+
|
|
31
|
+
*(Chưa có. Thêm entry có ngày tại đây.)*
|
|
32
|
+
|
|
33
|
+
## Liên quan
|
|
34
|
+
|
|
35
|
+
- Adopt / cài: `docs/consuming.md`
|
|
36
|
+
- Biên bản quyết định: `docs/decisions.md` §7
|
|
37
|
+
- Registry product → element: `docs/products.md`
|
package/docs/vi/consuming.md
CHANGED
|
@@ -8,18 +8,18 @@ Cách mọi project — do người hoặc agent điều khiển — áp dụng
|
|
|
8
8
|
|
|
9
9
|
| Consumer | Bắt đầu tại | Hoạt động hôm nay | Không làm |
|
|
10
10
|
|---|---|---|---|
|
|
11
|
-
| **Claude Code** | `SKILL.md` → `README.md` → `styles.css` + `_esm/cs.mjs` / `_ds_bundle.js` (resolve theo prefix) | Mạnh — rules, components, prompts; gates qua full clone | Hardcode hậu tố bundle; coi Storybook host là hợp đồng portable |
|
|
11
|
+
| **Claude Code** | `SKILL.md` → `README.md` → `styles.css` + bundler `@cyberskill/design` / legacy `_esm/cs.mjs` / `_ds_bundle.js` (resolve theo prefix) | Mạnh — rules, components, prompts; gates qua full clone | Hardcode hậu tố bundle; coi Storybook host là hợp đồng portable; import `_esm/cs.mjs` hoặc `@cyberskill/design/legacy` vào bundler Next/SSR |
|
|
12
12
|
| **Google Stitch** | `DESIGN.md` → `llms.txt` → `tokens/tokens.dtcg.json` | Mạnh cho doctrine + tokens + HTML tĩnh `.cs-*` | Coi `templates/**/*.dc.html` là SoT — không có tweaks / `__dcSetProps` / DC compiler |
|
|
13
13
|
| **Claude Design** | Full repo + DC compiler | Full fidelity (tweaks, `x-import`, template bilingual) | Bỏ qua vòng sync trong `docs/sync.md` |
|
|
14
|
-
| **npm** | `@cyberskill/design` |
|
|
14
|
+
| **npm** | `@cyberskill/design` | **1.1.0** trên registry; CI Trusted Publishing; grant tại `docs/consumer-grant.md` | Coi cài từ registry như license công khai (vẫn UNLICENSED) |
|
|
15
15
|
|
|
16
16
|
**Quy tắc DC cho Stitch:** Stitch (và mọi tool non-DC) **không** được tiêu thụ `*.dc.html` như nguồn chân lý. Dùng pattern export tĩnh, `templates/kitchen-sink.html`, `examples/static-hello/`, và class `.cs-*` từ `styles.css`.
|
|
17
17
|
|
|
18
|
-
**Tín hiệu release:** VERSION
|
|
18
|
+
**Tín hiệu release:** VERSION là **1.1.0** (không CHANGELOG). Coi **git tip SHA** là chân lý kỹ thuật; đọc điểm nổi bật sản phẩm curated trong `docs/release-notes.md`.
|
|
19
19
|
|
|
20
20
|
## Đường nhanh cho AI agent (Claude Code, hoặc điều khiển một agent)
|
|
21
21
|
|
|
22
|
-
**Bạn nhận:** `styles.css` (400+ token + class `.cs-*` + bề mặt Liquid Glass, `@import` `tokens/` + `base/`) · `_ds_bundle.js` (React component đã compile, không cần build) · `_esm/
|
|
22
|
+
**Bạn nhận:** `styles.css` (400+ token + class `.cs-*` + bề mặt Liquid Glass, `@import` `tokens/` + `base/`) · `_ds_bundle.js` (React component đã compile, không cần build) · `_esm/react.mjs` (entry React bundler-native — React là peerDependency; mặc định `exports["."]`) · `_esm/cs.mjs` (browser / no-build legacy qua `exports["./legacy"]`) · `_ds_manifest.json` (inventory máy đọc được) · mỗi component `Name.d.ts` (API) + `Name.prompt.md` (brief dùng) · `tokens/tokens.dtcg.json` (W3C DTCG) + `tokens.json`/`tokens.js`.
|
|
23
23
|
|
|
24
24
|
**Checkout repo** — clone hoặc copy cả cây; mọi thứ là static đường dẫn tương đối. Điểm vào: Storybook trên host site (`/` / `npm run storybook`) · `guidelines/atomic-view.html` (mọi component live, portable) · `templates/<slug>/` (điểm bắt đầu copy được — DC cho Claude Design; kitchen-sink / `.cs-*` cho Stitch). Đọc `SKILL.md` trước khi author bất kỳ thứ gì on-brand; reader Stitch bắt đầu tại `DESIGN.md`. Bản đồ sâu hơn ở `llms.txt` (inventory) và file này (hướng dẫn adopt + upgrade đầy đủ bên dưới).
|
|
25
25
|
|
|
@@ -38,18 +38,29 @@ Cách mọi project — do người hoặc agent điều khiển — áp dụng
|
|
|
38
38
|
|
|
39
39
|
## Adopt qua npm (tùy chọn)
|
|
40
40
|
|
|
41
|
-
Package có thể publish (`private: false`, phiên bản
|
|
41
|
+
Package có thể publish (`private: false`, phiên bản **1.1.0**). License vẫn **UNLICENSED** — cài từ registry **không** tự cấp quyền redistribution. **`@cyberskill/design@1.1.0` là cut LAUNCH (publish qua tag `v1.1.0`).** CI republish qua **npm Trusted Publishing (OIDC)** trên workflow `npm-publish.yml` (không token publish dài hạn; Publishing access package **disallow tokens**). Dùng đã duyệt ghi tại **`docs/consumer-grant.md`** (sản phẩm portfolio CyberSkill từ `docs/products.md`). Xem `docs/decisions.md` và `docs/ci-cd.md`.
|
|
42
42
|
|
|
43
|
-
**Grant consumer (chính sách owner — không phải secret).**
|
|
43
|
+
**Grant consumer (chính sách owner — không phải secret).** Đã viết và có hiệu lực tại `docs/consumer-grant.md` (+ `docs/vi/consumer-grant.md`). Team bên ngoài cần stanza có ngày thêm vào đó; redistribution ngoài sản phẩm đã grant cần grant viết thêm.
|
|
44
44
|
|
|
45
45
|
```bash
|
|
46
|
-
|
|
47
|
-
npm install @cyberskill/design@1.0.0
|
|
46
|
+
npm install @cyberskill/design@1.1.0
|
|
48
47
|
```
|
|
49
48
|
|
|
50
|
-
Rồi link styles và import
|
|
49
|
+
Rồi link styles và import component. **App Next.js / Vite / SSR** dùng entry mặc định (bundler-native):
|
|
51
50
|
|
|
52
|
-
|
|
51
|
+
```ts
|
|
52
|
+
import { Button, TextField } from "@cyberskill/design";
|
|
53
|
+
// tương đương: import { Button } from "@cyberskill/design/react";
|
|
54
|
+
import "@cyberskill/design/styles.css";
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Thêm `transpilePackages: ["@cyberskill/design"]` trong Next.js (JSX ship dạng source). React và react-dom là **peerDependencies** — app của bạn cung cấp. Types publish dùng `export type *` (**TypeScript 5.0+**). **Không** import `_esm/cs.mjs` (hay `@cyberskill/design/legacy`) vào bundler SSR; đường đó self-ensure React qua CDN và side-load `_ds_bundle.js` chỉ cho browser.
|
|
58
|
+
|
|
59
|
+
**Browser / no-build:** import `@cyberskill/design/legacy` (`_esm/cs.mjs`) hoặc tiếp tục dùng đường cây tĩnh bên dưới. Tarball đã publish là **cả cây portable** (styles, tokens, components, templates, guidelines, docs, UI kits) — không phải subset “chỉ lib” tối thiểu. Tooling chỉ-host (Storybook, `_audit/`) không nằm trong `files[]`.
|
|
60
|
+
|
|
61
|
+
**Cài thật đầu tiên (Lumi).** Consumer **browser** copy-paste: `examples/npm-hello/` — cài `@cyberskill/design@1.1.0` từ registry, link `styles.css`, mount `Button` qua entry **legacy** (`_esm/cs.mjs`), scope **Lumi** với `data-cs-element="hoa" data-cs-variant="plasma"` (hàng đã khóa trong `docs/products.md`). Trong thư mục đó: `npm install && npm run smoke && npm start` → mở `http://127.0.0.1:8766/`. Team Status Hub dùng cùng install và đổi sang `data-cs-element="thuy"` — không invent ánh xạ. Cho app Next/SSR (ví dụ Lumi landing), dùng `import { Button } from "@cyberskill/design"` như trên — không dùng import map của npm-hello.
|
|
62
|
+
|
|
63
|
+
**Đường publish (maintainer):** `prepublishOnly` chạy `build:bundle` + `build:design-md --check`. Workflow `.github/workflows/npm-publish.yml` trên `workflow_dispatch` / tag `v*` dùng **Trusted Publishing** (`permissions.id-token: write`; không đặt `NODE_AUTH_TOKEN` trên bước publish). `node _audit/ci/npm-publish.mjs --dry-run` luôn liệt kê tarball. Xem `docs/ci-cd.md` và `docs/decisions.md`.
|
|
53
64
|
|
|
54
65
|
## Adopt (hai đường, cộng shortcut module)
|
|
55
66
|
|
|
@@ -65,7 +76,9 @@ Rồi link styles và import từ entry package (`_esm/cs.mjs` qua `exports["."]
|
|
|
65
76
|
</script>
|
|
66
77
|
```
|
|
67
78
|
Đây đúng là những gì `_audit/consumer-smoke-test.html` chạy (và assert xanh) — và `ds-base.js` của templates làm tương tự, publish alias ổn định `window.CyberSkillDS`.
|
|
68
|
-
**2b.
|
|
79
|
+
**2b. React bundler-native (Next / Vite / SSR) — entry package mặc định.** `import { Button, TextField } from "@cyberskill/design"` resolve tới `_esm/react.mjs` (cũng export như `@cyberskill/design/react`). Re-export mọi component từ JSX source với **React là peer external** — không CDN, không side-load `_ds_bundle.js`. Bundler của bạn phải transpile package (Next: `transpilePackages: ["@cyberskill/design"]`). Vẫn tự link `styles.css`. Regenerated bằng `npm run build:react-entry`; parity được gate bởi `package-exports-integrity` + `test:react-entry`.
|
|
80
|
+
|
|
81
|
+
**2c. ESM browser legacy — một import, không build.** `import { Button, TextField } from "@cyberskill/design/legacy"` (hoặc `"<path>/_esm/cs.mjs"`) — module tự ensure React qua **umd-react@19.2.8** (CDN pin SRI; React 19 chính thức không còn UMD; bỏ qua khi đã có `window.React`), side-load `_ds_bundle.js` một lần, resolve namespace theo prefix, và re-export mọi component (`_audit/esm-smoke-test.html` giữ danh sách export khóa với manifest). Vẫn tự link `styles.css`. **Không dùng cho Next/SSR.** App bundler vẫn cung cấp peer `react` / `react-dom` (`^18 || ^19`).
|
|
69
82
|
|
|
70
83
|
**Templates.** Mỗi `templates/<slug>/` là Design Component seed từ `ds-base.js` (một dòng `base` để rebind đường dẫn tới nơi hệ thống này nằm tương đối với trang tiêu thụ). Copy thư mục và sửa copy/tweaks.
|
|
71
84
|
|
|
@@ -73,13 +86,17 @@ Rồi link styles và import từ entry package (`_esm/cs.mjs` qua `exports["."]
|
|
|
73
86
|
|
|
74
87
|
**HTML tĩnh / không React / không build tooling.** Link `styles.css` và compose bằng class `.cs-*` — catalog đầy đủ trong `templates/kitchen-sink.html`.
|
|
75
88
|
|
|
76
|
-
|
|
89
|
+
**Font, kể cả mặt chữ display.** Cả ba họ chữ brand đều self-host trong `fonts/` và khai báo ở `tokens/fonts.css` (được `styles.css` `@import`): **Be Vietnam Pro** (`--cs-font-family-ui`), **JetBrains Mono** (`--cs-font-family-mono`), và **Space Grotesk** (`--cs-font-family-display`, variable 300–700, có subset tiếng Việt). Mặt chữ display là **opt-in** — không thứ gì trong DS trỏ vào nó. Sản phẩm muốn mặt chữ tiêu đề thêm `class="cs-display-face"` (hoặc đặt `--cs-heading-family: var(--cs-font-family-display)`) trên scope; các utility heading theo sau, body copy vẫn ở mặt chữ UI.
|
|
90
|
+
|
|
91
|
+
Consumer bỏ qua `styles.css` để tự kiểm soát font loading (`cyberskill.world` / Lumi import riêng các sheet token + base và giữ chiến lược `font-display: optional` của mình) có thể chuyển từ `brand-fonts.css` tự chế sang package: hoặc `@import "@cyberskill/design/tokens/fonts.css"` để lấy face đóng gói, hoặc giữ block `@font-face` cục bộ và trỏ `--cs-heading-family` vào `var(--cs-font-family-display)` để **role** đến từ DS ngay cả khi **byte** vẫn phục vụ cục bộ. Cách nào thì mặt chữ display cũng thôi là ngoại lệ riêng của một sản phẩm. Space Grotesk không có weight 800, nên `--cs-heading-weight-strong` (800) dưới `.cs-display-face` clamp về 700 trong Space Grotesk — CSS không nhảy sang Be Vietnam Pro vì thiếu weight.
|
|
77
92
|
|
|
78
|
-
|
|
93
|
+
## Bốn trục
|
|
94
|
+
|
|
95
|
+
Đặt Theme (`data-theme` — light / dark / system), Element (`data-cs-element` + `data-cs-variant`), Language (`lang` / Language tweak trên template), và Style (`data-cs-style`) trên một container; mọi thứ bên trong re-skin không cần đổi code (xem `templates/playground.html`). Mặc định: `light · tho · en · liquid-glass` (vắng theme / style ≡ các mặc định đó). Bilingual: component resolve chuỗi từ `lang` (`lang="vi"` trên mọi container → tiếng Việt đầy đủ).
|
|
79
96
|
|
|
80
97
|
## Nâng cấp
|
|
81
98
|
|
|
82
|
-
- **Phiên bản cố định.** `VERSION` và `package.json`
|
|
99
|
+
- **Phiên bản cố định.** `VERSION` và `package.json` là **1.1.0**. Không có file changelog design-system — coi **git tip SHA** là chân lý kỹ thuật, và đọc **Release Notes** curated (Storybook + `docs/release-notes.md`) cho điểm nổi bật hướng sản phẩm.
|
|
83
100
|
|
|
84
101
|
- Anchors (Umber/Ochre), tên class `.cs-*`, và tên token `--cs-*` là hợp đồng ổn định — an toàn để phụ thuộc. Đổi tên phá vỡ những hợp đồng đó phải hiếm và được gọi ra trong PR/docs khi xảy ra.
|
|
85
102
|
|
|
@@ -87,10 +104,22 @@ Rồi link styles và import từ entry package (`_esm/cs.mjs` qua `exports["."]
|
|
|
87
104
|
|
|
88
105
|
## Host Storybook (tùy chọn)
|
|
89
106
|
|
|
90
|
-
Site live phục vụ Storybook tại `/` như **bề mặt sản phẩm** cho operator (Theme × Element × Language + ma trận điều khiển). Đó là **tooling chỉ-host** — đừng phụ thuộc Storybook trong product app. Atomic View portable vẫn ở `guidelines/atomic-view.html`. Xem `docs/storybook.md` và `docs/live-hub.md`.
|
|
107
|
+
Site live phục vụ Storybook tại `/` như **bề mặt sản phẩm** cho operator (Theme × Element × Language × Style + ma trận điều khiển). Đó là **tooling chỉ-host** — đừng phụ thuộc Storybook trong product app. Atomic View portable vẫn ở `guidelines/atomic-view.html`. Xem `docs/storybook.md` và `docs/live-hub.md`.
|
|
91
108
|
|
|
92
109
|
## Spike consumer năm phút
|
|
93
110
|
|
|
111
|
+
**Đường registry (ưu tiên cho product app):**
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
cd examples/npm-hello
|
|
115
|
+
npm install
|
|
116
|
+
npm run smoke
|
|
117
|
+
npm start
|
|
118
|
+
# mở http://127.0.0.1:8766/
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**Đường clone / tĩnh (không npm):**
|
|
122
|
+
|
|
94
123
|
```bash
|
|
95
124
|
# từ monorepo root
|
|
96
125
|
python3 -m http.server 8765 --bind 127.0.0.1
|
|
@@ -102,7 +131,7 @@ Sửa `examples/static-hello/index.html`: flip `data-theme="dark"` hoặc `data-
|
|
|
102
131
|
|
|
103
132
|
## Native sample hosts (tùy chọn)
|
|
104
133
|
|
|
105
|
-
Sample đa màn hình (Sign in · Home · Settings) nằm dưới `examples/native/swiftui`, `compose`, và `flutter`. Chúng sync token generate qua `node examples/native/sync-tokens.mjs`.
|
|
134
|
+
Sample đa màn hình (Sign in · Home · Settings) nằm dưới `examples/native/swiftui`, `compose`, và `flutter`. Chúng sync token generate qua `node examples/native/sync-tokens.mjs`. Compose mở bằng **Android Studio** (không commit `gradlew` — CLI cần JDK 17+ + SDK; xem `examples/native/README.md`). Không bắt buộc cho web consumer.
|
|
106
135
|
|
|
107
136
|
## Mở rộng
|
|
108
137
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# Báo cáo contrast — cặp elemental (APCA)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Tạo 2026-07-27 · quét tại pin VERSION 1.1.0.
|
|
4
4
|
|
|
5
|
-
**Doctrine
|
|
5
|
+
**Doctrine của sweep này:** chữ ngồi trên `-bright` hoặc `-tint`, không bao giờ trên mid-tone `-accent`. Accent chỉ cho bar, border, progress, fill không chữ. (Rule trong `tokens/elements.css` và conventions.)
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
|
7
|
+
Pack được generate từ `tokens/element-seeds.json` (thang soft / middle / deep, khóa hue light↔dark). Gate hình học: `_audit/element-geometry.html`.
|
|
8
|
+
| Scope | Pairing | fg / bg | Lc | Verdict |
|
|
9
9
|
|---|---|---|---|---|
|
|
10
10
|
| root (Thổ default) | text-accent on white (bold labels) | #6E3B0E / #FFFFFF | 90.7 | ✓ |
|
|
11
11
|
| root (Thổ default) | text-accent on tint (bold labels) | #6E3B0E / #FBF4E9 | 84.6 | ✓ |
|
|
@@ -16,110 +16,98 @@ Nudge token cho v2.0: bright làm sáng cho clay, hoa, lava, plasma, thủy, oce
|
|
|
16
16
|
| tho | text-accent on tint (bold labels) | #6E3B0E / #FBF4E9 | 84.6 | ✓ |
|
|
17
17
|
| tho | accent-bright on ink (headings) | #F4BA17 / #45210E | 66.3 | ✓ |
|
|
18
18
|
| tho | accent-on on accent-bright (CTA text) | #45210E / #F4BA17 | 66.3 | ✓ |
|
|
19
|
-
| tho | accent-bright on dark panel (dark labels) | #
|
|
20
|
-
| tho
|
|
21
|
-
| tho
|
|
22
|
-
| tho
|
|
23
|
-
| tho
|
|
24
|
-
| tho
|
|
25
|
-
| tho
|
|
26
|
-
| tho
|
|
27
|
-
| tho
|
|
28
|
-
| tho
|
|
29
|
-
| tho
|
|
30
|
-
| hoa | text-accent on white (bold labels) | #
|
|
31
|
-
| hoa | text-accent on tint (bold labels) | #
|
|
32
|
-
| hoa | accent-bright on ink (headings) | #
|
|
33
|
-
| hoa | accent-on on accent-bright (CTA text) | #
|
|
34
|
-
| hoa | accent-bright on dark panel (dark labels) | #
|
|
35
|
-
| hoa
|
|
36
|
-
| hoa
|
|
37
|
-
| hoa
|
|
38
|
-
| hoa
|
|
39
|
-
| hoa
|
|
40
|
-
| hoa
|
|
41
|
-
| hoa
|
|
42
|
-
| hoa
|
|
43
|
-
| hoa
|
|
44
|
-
| hoa
|
|
45
|
-
| thuy | text-accent on white (bold labels) | #
|
|
46
|
-
| thuy | text-accent on tint (bold labels) | #
|
|
47
|
-
| thuy | accent-bright on ink (headings) | #
|
|
48
|
-
| thuy | accent-on on accent-bright (CTA text) | #
|
|
49
|
-
| thuy | accent-bright on dark panel (dark labels) | #
|
|
50
|
-
| thuy
|
|
51
|
-
| thuy
|
|
52
|
-
| thuy
|
|
53
|
-
| thuy
|
|
54
|
-
| thuy
|
|
55
|
-
| thuy
|
|
56
|
-
| thuy
|
|
57
|
-
| thuy
|
|
58
|
-
| thuy
|
|
59
|
-
| thuy
|
|
60
|
-
| moc | text-accent on white (bold labels) | #
|
|
61
|
-
| moc | text-accent on tint (bold labels) | #
|
|
62
|
-
| moc | accent-bright on ink (headings) | #
|
|
63
|
-
| moc | accent-on on accent-bright (CTA text) | #
|
|
64
|
-
| moc | accent-bright on dark panel (dark labels) | #
|
|
65
|
-
| moc
|
|
66
|
-
| moc
|
|
67
|
-
| moc
|
|
68
|
-
| moc
|
|
69
|
-
| moc
|
|
70
|
-
| moc
|
|
71
|
-
| moc
|
|
72
|
-
| moc
|
|
73
|
-
| moc
|
|
74
|
-
| moc
|
|
75
|
-
| kim | text-accent on white (bold labels) | #
|
|
76
|
-
| kim | text-accent on tint (bold labels) | #
|
|
77
|
-
| kim | accent-bright on ink (headings) | #
|
|
78
|
-
| kim | accent-on on accent-bright (CTA text) | #
|
|
79
|
-
| kim | accent-bright on dark panel (dark labels) | #
|
|
80
|
-
| kim
|
|
81
|
-
| kim
|
|
82
|
-
| kim
|
|
83
|
-
| kim
|
|
84
|
-
| kim
|
|
85
|
-
| kim
|
|
86
|
-
| kim
|
|
87
|
-
| kim
|
|
88
|
-
| kim
|
|
89
|
-
| kim
|
|
19
|
+
| tho | accent-bright on dark panel (dark labels) | #FEC42C / #221710 | 75 | ✓ |
|
|
20
|
+
| tho · sand | text-accent on white (bold labels) | #90825E / #FFFFFF | 65.4 | ✓ |
|
|
21
|
+
| tho · sand | text-accent on tint (bold labels) | #90825E / #FBF7EA | 60.6 | ✓ |
|
|
22
|
+
| tho · sand | accent-bright on ink (headings) | #F6EBCC / #292414 | 92.3 | ✓ |
|
|
23
|
+
| tho · sand | accent-on on accent-bright (CTA text) | #292414 / #F6EBCC | 90.8 | ✓ |
|
|
24
|
+
| tho · sand | accent-bright on dark panel (dark labels) | #F6EBCC / #221710 | 93.8 | ✓ |
|
|
25
|
+
| tho · clay | text-accent on white (bold labels) | #201300 / #FFFFFF | 104.8 | ✓ |
|
|
26
|
+
| tho · clay | text-accent on tint (bold labels) | #201300 / #FFF6E7 | 100 | ✓ |
|
|
27
|
+
| tho · clay | accent-bright on ink (headings) | #DEC7A2 / #2D220E | 71.7 | ✓ |
|
|
28
|
+
| tho · clay | accent-on on accent-bright (CTA text) | #2D220E / #DEC7A2 | 71.8 | ✓ |
|
|
29
|
+
| tho · clay | accent-bright on dark panel (dark labels) | #E4CDA8 / #221710 | 76.7 | ✓ |
|
|
30
|
+
| hoa | text-accent on white (bold labels) | #B47054 / #FFFFFF | 66.2 | ✓ |
|
|
31
|
+
| hoa | text-accent on tint (bold labels) | #B47054 / #FFF4F0 | 60.9 | ✓ |
|
|
32
|
+
| hoa | accent-bright on ink (headings) | #FED3C3 / #381B10 | 82.8 | ✓ |
|
|
33
|
+
| hoa | accent-on on accent-bright (CTA text) | #381B10 / #FED3C3 | 82.1 | ✓ |
|
|
34
|
+
| hoa | accent-bright on dark panel (dark labels) | #FED3C3 / #221710 | 84.2 | ✓ |
|
|
35
|
+
| hoa · plasma | text-accent on white (bold labels) | #967C75 / #FFFFFF | 66.1 | ✓ |
|
|
36
|
+
| hoa · plasma | text-accent on tint (bold labels) | #967C75 / #FEF4F2 | 60.7 | ✓ |
|
|
37
|
+
| hoa · plasma | accent-bright on ink (headings) | #FCE6DF / #2C211E | 91.8 | ✓ |
|
|
38
|
+
| hoa · plasma | accent-on on accent-bright (CTA text) | #2C211E / #FCE6DF | 90.4 | ✓ |
|
|
39
|
+
| hoa · plasma | accent-bright on dark panel (dark labels) | #FCE6DF / #221710 | 93.2 | ✓ |
|
|
40
|
+
| hoa · lava | text-accent on white (bold labels) | #280D00 / #FFFFFF | 104.7 | ✓ |
|
|
41
|
+
| hoa · lava | text-accent on tint (bold labels) | #280D00 / #FFF4EF | 99.4 | ✓ |
|
|
42
|
+
| hoa · lava | accent-bright on ink (headings) | #F1BEA4 / #361D0F | 71 | ✓ |
|
|
43
|
+
| hoa · lava | accent-on on accent-bright (CTA text) | #361D0F / #F1BEA4 | 71.2 | ✓ |
|
|
44
|
+
| hoa · lava | accent-bright on dark panel (dark labels) | #F8C4AA / #221710 | 76.2 | ✓ |
|
|
45
|
+
| thuy | text-accent on white (bold labels) | #108EA0 / #FFFFFF | 65.8 | ✓ |
|
|
46
|
+
| thuy | text-accent on tint (bold labels) | #108EA0 / #E7FBFF | 61.2 | ✓ |
|
|
47
|
+
| thuy | accent-bright on ink (headings) | #99EEFF / #012A30 | 85.3 | ✓ |
|
|
48
|
+
| thuy | accent-on on accent-bright (CTA text) | #012A30 / #99EEFF | 84.3 | ✓ |
|
|
49
|
+
| thuy | accent-bright on dark panel (dark labels) | #99EEFF / #221710 | 87.2 | ✓ |
|
|
50
|
+
| thuy · mist | text-accent on white (bold labels) | #5A8A90 / #FFFFFF | 65.8 | ✓ |
|
|
51
|
+
| thuy · mist | text-accent on tint (bold labels) | #5A8A90 / #EBFAFC | 61.1 | ✓ |
|
|
52
|
+
| thuy · mist | accent-bright on ink (headings) | #CDF4F9 / #13282B | 93.1 | ✓ |
|
|
53
|
+
| thuy · mist | accent-on on accent-bright (CTA text) | #13282B / #CDF4F9 | 91.5 | ✓ |
|
|
54
|
+
| thuy · mist | accent-bright on dark panel (dark labels) | #CDF4F9 / #221710 | 94.7 | ✓ |
|
|
55
|
+
| thuy · ocean | text-accent on white (bold labels) | #011A21 / #FFFFFF | 104.5 | ✓ |
|
|
56
|
+
| thuy · ocean | text-accent on tint (bold labels) | #011A21 / #EAFAFF | 99.8 | ✓ |
|
|
57
|
+
| thuy · ocean | accent-bright on ink (headings) | #A8D3E0 / #10282F | 72.7 | ✓ |
|
|
58
|
+
| thuy · ocean | accent-on on accent-bright (CTA text) | #10282F / #A8D3E0 | 72.6 | ✓ |
|
|
59
|
+
| thuy · ocean | accent-bright on dark panel (dark labels) | #ABD6E3 / #221710 | 76.1 | ✓ |
|
|
60
|
+
| moc | text-accent on white (bold labels) | #629122 / #FFFFFF | 64.9 | ✓ |
|
|
61
|
+
| moc | text-accent on tint (bold labels) | #629122 / #EFFCE3 | 60.5 | ✓ |
|
|
62
|
+
| moc | accent-bright on ink (headings) | #C5ED9C / #182A00 | 85.2 | ✓ |
|
|
63
|
+
| moc | accent-on on accent-bright (CTA text) | #182A00 / #C5ED9C | 84.2 | ✓ |
|
|
64
|
+
| moc | accent-bright on dark panel (dark labels) | #C5ED9C / #221710 | 86.9 | ✓ |
|
|
65
|
+
| moc · bamboo | text-accent on white (bold labels) | #7C8965 / #FFFFFF | 64.9 | ✓ |
|
|
66
|
+
| moc · bamboo | text-accent on tint (bold labels) | #7C8965 / #F4F9ED | 60.2 | ✓ |
|
|
67
|
+
| moc · bamboo | accent-bright on ink (headings) | #E5F1D2 / #212617 | 93 | ✓ |
|
|
68
|
+
| moc · bamboo | accent-on on accent-bright (CTA text) | #212617 / #E5F1D2 | 91.4 | ✓ |
|
|
69
|
+
| moc · bamboo | accent-bright on dark panel (dark labels) | #E5F1D2 / #221710 | 94.5 | ✓ |
|
|
70
|
+
| moc · forest | text-accent on white (bold labels) | #051D00 / #FFFFFF | 104.4 | ✓ |
|
|
71
|
+
| moc · forest | text-accent on tint (bold labels) | #051D00 / #ECFDE7 | 100.2 | ✓ |
|
|
72
|
+
| moc · forest | accent-bright on ink (headings) | #B0D8A3 / #162A0E | 73.2 | ✓ |
|
|
73
|
+
| moc · forest | accent-on on accent-bright (CTA text) | #162A0E / #B0D8A3 | 73.2 | ✓ |
|
|
74
|
+
| moc · forest | accent-bright on dark panel (dark labels) | #B0D8A3 / #221710 | 75 | ✓ |
|
|
75
|
+
| kim | text-accent on white (bold labels) | #AC780B / #FFFFFF | 65.8 | ✓ |
|
|
76
|
+
| kim | text-accent on tint (bold labels) | #AC780B / #FFF5E7 | 60.5 | ✓ |
|
|
77
|
+
| kim | accent-bright on ink (headings) | #FDD89F / #312002 | 83.5 | ✓ |
|
|
78
|
+
| kim | accent-on on accent-bright (CTA text) | #312002 / #FDD89F | 82.8 | ✓ |
|
|
79
|
+
| kim | accent-bright on dark panel (dark labels) | #FDD89F / #221710 | 85 | ✓ |
|
|
80
|
+
| kim · titanium | text-accent on white (bold labels) | #947F65 / #FFFFFF | 65.8 | ✓ |
|
|
81
|
+
| kim · titanium | text-accent on tint (bold labels) | #947F65 / #FDF5ED | 60.5 | ✓ |
|
|
82
|
+
| kim · titanium | accent-bright on ink (headings) | #FBE8D2 / #2B2217 | 92 | ✓ |
|
|
83
|
+
| kim · titanium | accent-on on accent-bright (CTA text) | #2B2217 / #FBE8D2 | 90.6 | ✓ |
|
|
84
|
+
| kim · titanium | accent-bright on dark panel (dark labels) | #FBE8D2 / #221710 | 93.4 | ✓ |
|
|
85
|
+
| kim · steel | text-accent on white (bold labels) | #1F1400 / #FFFFFF | 104.8 | ✓ |
|
|
86
|
+
| kim · steel | text-accent on tint (bold labels) | #1F1400 / #FEF6E7 | 99.8 | ✓ |
|
|
87
|
+
| kim · steel | accent-bright on ink (headings) | #DCC8A2 / #2D220E | 71.8 | ✓ |
|
|
88
|
+
| kim · steel | accent-on on accent-bright (CTA text) | #2D220E / #DCC8A2 | 71.9 | ✓ |
|
|
89
|
+
| kim · steel | accent-bright on dark panel (dark labels) | #DFCBA5 / #221710 | 75.1 | ✓ |
|
|
90
90
|
|
|
91
|
-
**
|
|
91
|
+
**Failures: 0.** All text pairings pass Lc ≥ 60.
|
|
92
92
|
|
|
93
|
-
##
|
|
93
|
+
## Dark pack APCA floors (gate twin)
|
|
94
94
|
|
|
95
|
-
|
|
96
|
-
|
|
|
95
|
+
Targets match `_audit/apca-dark-preview.html`: bright ≥ 75 · accent ≥ 60 · on/strong ≥ 75 · ink-on-tint ≥ 75.
|
|
96
|
+
| Pack | bright | accent | on | ink |
|
|
97
97
|
|---|---|---|---|---|
|
|
98
|
-
|
|
|
99
|
-
|
|
|
100
|
-
|
|
|
101
|
-
|
|
|
98
|
+
| tho | 75 | 69.2 | 75.6 | 76.8 |
|
|
99
|
+
| tho · sand | 93.8 | 92.7 | 75.6 | 91.5 |
|
|
100
|
+
| tho · clay | 76.7 | 60.4 | 94.1 | 76.2 |
|
|
101
|
+
| hoa | 84.2 | 68.2 | 75.1 | 81.9 |
|
|
102
|
+
| hoa · plasma | 93.2 | 91.2 | 75 | 90.9 |
|
|
103
|
+
| hoa · lava | 76.2 | 61.1 | 94 | 75.7 |
|
|
104
|
+
| thuy | 87.2 | 72.8 | 76 | 84.4 |
|
|
105
|
+
| thuy · mist | 94.7 | 94 | 75.9 | 92 |
|
|
106
|
+
| thuy · ocean | 76.1 | 60.1 | 93.9 | 75.1 |
|
|
107
|
+
| moc | 86.9 | 71.8 | 75.4 | 84.4 |
|
|
108
|
+
| moc · bamboo | 94.5 | 93.6 | 75.3 | 92 |
|
|
109
|
+
| moc · forest | 75 | 60.8 | 93.7 | 76.3 |
|
|
110
|
+
| kim | 85 | 69.2 | 75.6 | 82.6 |
|
|
111
|
+
| kim · titanium | 93.4 | 92.1 | 75.8 | 91.1 |
|
|
112
|
+
| kim · steel | 75.1 | 60.7 | 94 | 76.4 |
|
|
102
113
|
|
|
103
|
-
Core dark cũng remap nút primary sang Ochre (`#f4ba17` trên `#1a1108`) và làm ấm border field — để không control dark nào low-contrast. Shadow dark nhuốm umber (yếu trên nền tối vốn vậy); hairline border dark tách panel thay thế.
|
|
104
|
-
File này được generate — chạy lại script APCA sweep sau mọi đổi token.
|
|
105
|
-
|
|
106
|
-
## Pack elemental dark — xác minh APCA (v4.0.0, Th7 2026)
|
|
107
|
-
|
|
108
|
-
Sinh với pack dark đã owner duyệt; đo bằng cùng implementation SAPC-4g như `_audit/apca-dark-preview.html` (cũng là regression gate). Mục tiêu: bright ≥ 75 · accent ≥ 60 · button ink ≥ 75 · ink-on-tint ≥ 75 — **15/15 pack pass**.
|
|
109
|
-
| Pack | bright | accent | on/strong | ink/tint |
|
|
110
|
-
|---|---|---|---|---|
|
|
111
|
-
| tho | 75 | 69.2 | 75.1 | 75.3 |
|
|
112
|
-
| tho · clay | 75.7 | 61.5 | 76 | 76.1 |
|
|
113
|
-
| tho · sand | 85.1 | 74.3 | 75.7 | 83.6 |
|
|
114
|
-
| hoa | 75.1 | 61.5 | 75.6 | 75.9 |
|
|
115
|
-
| hoa · lava | 75 | 60.6 | 83.5 | 75.8 |
|
|
116
|
-
| hoa · plasma | 75.9 | 60.8 | 75.4 | 76.7 |
|
|
117
|
-
| thuy | 76.6 | 61.6 | 76.7 | 76.6 |
|
|
118
|
-
| thuy · ocean | 77.2 | 60 | 86.6 | 75.5 |
|
|
119
|
-
| thuy · mist | 80.3 | 66.6 | 76 | 78.7 |
|
|
120
|
-
| moc | 76 | 60.1 | 76 | 76.1 |
|
|
121
|
-
| moc · bamboo | 76 | 62.8 | 75 | 76.2 |
|
|
122
|
-
| moc · forest | 76.4 | 60.9 | 88.6 | 76.6 |
|
|
123
|
-
| kim | 75.1 | 60.1 | 75.2 | 75.4 |
|
|
124
|
-
| kim · steel | 76.3 | 61.1 | 76 | 76.6 |
|
|
125
|
-
| kim · titanium | 76.9 | 60.9 | 79.4 | 75.5 |
|
package/docs/vi/conventions.md
CHANGED
|
@@ -4,24 +4,25 @@ Cho người và agent *mở rộng hệ thống này*. (Consumer: đọc `SKILL
|
|
|
4
4
|
|
|
5
5
|
## Quy tắc expansion
|
|
6
6
|
|
|
7
|
-
**Khi bất kỳ thứ gì lớn lên, mọi thứ cập nhật trong cùng một change.** Element/variant, icon, component, token role, ngôn ngữ, hoặc pattern template mới phải lan tới: tokens/source → specimen cards (guidelines + card nhóm component) **và trang guideline liên quan** → bộ ba hợp đồng component (`.jsx` + `.d.ts` + `.prompt.md`) → **mọi** template (tweak enum và map) → Storybook
|
|
7
|
+
**Khi bất kỳ thứ gì lớn lên, mọi thứ cập nhật trong cùng một change.** Element/variant, icon, component, token role, ngôn ngữ, hoặc pattern template mới phải lan tới: tokens/source → specimen cards (guidelines + card nhóm component) **và trang guideline liên quan** → bộ ba hợp đồng component (`.jsx` + `.d.ts` + `.prompt.md`) → **mọi** template (tweak enum và map) → Storybook toolbar / Atomic View → docs (đếm README, SKILL, **và mọi tài liệu liên quan change chạm** — kit README, registry, contrast report regen sau đổi token). **Chỉ bump `VERSION` khi có chỉ thị owner; không maintain file changelog** — version là 1.1.0 (post-LAUNCH). Continuity là git history cộng **Release Notes** curated (`docs/release-notes.md` / Storybook). Gate mọi expansion bằng compiler check **và grep enum/list cũ** — không ship nửa lan. Ranh giới phạm vi đã ghi (doctrine, không phải lỗ): trang UI-kit giữ tái tạo Thổ pixel-faithful (trục demo ở Storybook toolbar và Atomic View); mọi template bilingual EN·VN và mặc định tiếng Anh (collateral client/media giữ English-primary), và biến thể ngôn ngữ render **tách hoàn toàn** — xem decision log.
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## Bốn trục
|
|
10
10
|
|
|
11
|
-
Mọi bề mặt render resolve
|
|
11
|
+
Mọi bề mặt render resolve bốn scope trực giao — không bao giờ mã hóa một trục trong trục khác:
|
|
12
12
|
| Trục | Attribute | Sở hữu | Pack sống ở |
|
|
13
13
|
|---|---|---|---|
|
|
14
|
-
| **Theme** | `data-theme="dark\|system"` |
|
|
14
|
+
| **Theme** | `data-theme="dark\|system"` | light / dark / system (OS) | `tokens/colors.css` |
|
|
15
15
|
| **Element** (Ngũ Hành) | `data-cs-element` + `data-cs-variant` | bản sắc hue theo sản phẩm | `tokens/elements.css` |
|
|
16
16
|
| **Language** | `lang` / Language tweak | copy EN · VI | registry component + props template |
|
|
17
|
+
| **Style** | `data-cs-style` (tuỳ chọn; vắng ≡ `liquid-glass`) | pack vật liệu bề mặt | `tokens/styles.css` |
|
|
17
18
|
|
|
18
|
-
|
|
19
|
+
Pack Style duy nhất hiện nay là **liquid-glass**. Bất biến dưới mọi trục: anchors Umber/Ochre, voice, họ chữ, màu semantic status, vòng focus Ochre 3px, sàn APCA, target ≥44px.
|
|
19
20
|
|
|
20
21
|
## Ngữ pháp đặt tên
|
|
21
22
|
|
|
22
23
|
- Tokens: `--cs-<layer>-<role>[-<state>]` (`--cs-color-text-muted`). Layer role element: `--cs-accent-*` (hợp đồng 9-token — xem header `tokens/elements.css`).
|
|
23
24
|
|
|
24
|
-
- Classes: `.cs-<block>[-<part>][--modifier]`. Data attributes: `data-theme`, `data-cs-element`, `data-cs-variant`.
|
|
25
|
+
- Classes: `.cs-<block>[-<part>][--modifier]`. Data attributes: `data-theme`, `data-cs-element`, `data-cs-variant`, `data-cs-style`.
|
|
25
26
|
|
|
26
27
|
- Files: `tokens/<concern>.css` · `base/<concern>.css` (tên concern, không tên changelog — "interaction", không "refinements2") · `components/<group>/<Name>.{jsx,d.ts,prompt.md}` · `templates/<dept>-<artifact>/` · `guidelines/<group>-<topic>.html`.
|
|
27
28
|
|
|
@@ -37,18 +38,20 @@ Xử lý bề mặt là liquid-glass (cố định). Bất biến dưới mọi
|
|
|
37
38
|
|
|
38
39
|
**Element variant mới** — ở trong envelope oklch của element; đặt 9 token hợp đồng `--cs-accent-*` cộng `--cs-color-text-accent`/`--cs-color-link` (APCA-check cả hai); aurora wash kế thừa từ element qua `.cs-aurora-wash` (chỉ override class rule nếu variant thật sự cần ảnh riêng); đối tác gradient (`grad-b`) phải theo Tương sinh.
|
|
39
40
|
|
|
40
|
-
**Ship check** — chạy compiler check đến sạch, rồi chạy `_audit/docs-consistency.html` **và** `_audit/namespace-portability.html` (cả hai phải xanh). Version giữ pin 1.
|
|
41
|
+
**Ship check** — chạy compiler check đến sạch, rồi chạy `_audit/docs-consistency.html` **và** `_audit/namespace-portability.html` (cả hai phải xanh). Version giữ pin 1.1.0.
|
|
41
42
|
|
|
42
43
|
## Decision log (owner duyệt)
|
|
43
44
|
|
|
44
45
|
- Element thay thế hoàn toàn Ochre trong scope sản phẩm; cạnh hot-pink của plasma được duyệt (Th7 2026).
|
|
45
46
|
|
|
46
|
-
- Trục
|
|
47
|
+
- Trục: Theme × Element × Language × Style. Pack Style liquid-glass (sole pack; vắng ≡ mặc định).
|
|
47
48
|
|
|
48
49
|
- Product registry **đã khóa** (Th7 2026) — tám ánh xạ portfolio trong `docs/products.md`; không invent ánh xạ product → element mới.
|
|
49
50
|
|
|
50
51
|
- Chữ không bao giờ ngồi trên mid-tone `-accent` — mã hóa sau APCA sweep (xem `docs/contrast-report.md`).
|
|
51
52
|
|
|
53
|
+
- **Mặt chữ display là một token role, không phải mặc định thứ hai (Th7 2026).** `--cs-font-family-display` ship Space Grotesk (variable 300–700, có subset tiếng Việt) self-host cạnh Be Vietnam Pro và JetBrains Mono, để sản phẩm có mặt chữ tiêu đề — `cyberskill.world` / Lumi — tiêu thụ một role của DS thay vì tự nuôi `@font-face` ngoại lệ riêng. **Không thứ gì trong DS trỏ vào nó**: `--cs-heading-family` vẫn resolve về `--cs-font-family-ui`, mọi template và UI kit không đổi, và một scope chọn dùng qua `.cs-display-face` (`base/typography.css`) — chỉ chuyển `--cs-heading-family`, body copy vẫn ở mặt chữ UI. Space Grotesk không có 800, nên heading weight extrabold clamp về 700 trong family đó (CSS không nhảy sang Be Vietnam Pro vì thiếu weight). Thêm một họ chữ nghĩa là thêm face vào `tokens/fonts.css` **và** file vào `fonts/` **và** entry vào `fonts[]`/`brandFonts[]` của `_ds_manifest.json` — `_audit/font-face-integrity.html` fail nếu một trong ba lệch, và fail nếu family nào thiếu subset tiếng Việt. Điều này không đổi mapping sản phẩm → element nào; `docs/products.md` vẫn khóa.
|
|
54
|
+
|
|
52
55
|
- Biến thể ngôn ngữ render **tách hoàn toàn**: đổi Language tweak cho artifact một ngôn ngữ đầy đủ — không dịch dở trong heading, label, helper text, footer, hoặc body. Phần bilingual-by-design duy nhất là lockup tên + slogan CyberSkill (`Hiện Thực Hoá Ý Chí · Turn Your Will Into Real`, dạng chuẩn — không bao giờ một nửa lẻ) và khối identity pháp lý A4 (tên pháp lý công ty + khẩu hiệu nhà nước). Mọi thứ khác đổi theo tweak (Th7 2026).
|
|
53
56
|
|
|
54
57
|
- **Namespace được resolve, không hardcode** — compiler đặt tên bundle global `window.CyberSkillDesignSystem_<projectId>`, và hậu tố 6-hex dẫn từ project id, nên đổi khi hệ thống import vào project khác. Templates đọc alias ổn định `window.CyberSkillDS` mà `ds-base.js` publish lúc bundle load; cards, trang UI-kit, email standalone, và audit harness resolve theo prefix (`window[Object.keys(window).find(k=>/^CyberSkillDesignSystem_[0-9a-f]{6}$/.test(k))]`). `_ds_bundle.js`/`_ds_manifest.json` và snapshot đóng băng `_audit/exports/` hợp pháp mang hậu tố thật (chúng *định nghĩa* nó). Enforce bởi `_audit/namespace-portability.html`, quét mọi source index bởi manifest — giữ re-import **zero-touch** (Th7 2026).
|
|
@@ -65,7 +68,7 @@ Mọi template export; đường đúng phụ thuộc archetype. Mọi đường
|
|
|
65
68
|
| Email / product page / mọi DC | **Standalone offline HTML** | DC load CSS + bundle động qua `ds-base.js`, mà `super_inline_html` không thấy. Để bundle: tạo bản `*-standalone.html` **cùng thư mục** (giữ `./support.js` relative) với `<link rel="stylesheet" href="../../styles.css">` + `<script src="../../_ds_bundle.js">` **static** trong raw `<head>` (cả hai inline được) thay `ds-base.js`, cộng `<template id="__bundler_thumbnail">`. Nướng ngôn ngữ đích vào props default. Rồi `super_inline_html`. |
|
|
66
69
|
| Bất kỳ | **Editor-native + Claude Code handoff** | Cả project sẵn sàng handoff-dev (compiled bundle + `.d.ts` + `prompt.md` mỗi component); generate package theo request qua handoff skill. |
|
|
67
70
|
|
|
68
|
-
**Hành vi font lúc export.** Font brand self-host (`Be Vietnam Pro` UI, mono). PPTX giữ **tên** font brand nhưng không embed file — trên máy không có chúng PowerPoint thay fallback (text Unicode VN được giữ; shape có thể reflow nhẹ). Để hand-off tự chứa đầy đủ, hoặc bảo người nhận cài font, hoặc export với swap web-safe (`fontSwaps:[{from:'Be Vietnam Pro',to:'Arial'}]` — Arial phủ tiếng Việt). Standalone HTML **embed** font (`@font-face` inline từ `styles.css`), nên luôn trung thành offline (Th7 2026).
|
|
71
|
+
**Hành vi font lúc export.** Font brand self-host (`Be Vietnam Pro` UI, `Space Grotesk` display opt-in, mono). PPTX giữ **tên** font brand nhưng không embed file — trên máy không có chúng PowerPoint thay fallback (text Unicode VN được giữ; shape có thể reflow nhẹ). Để hand-off tự chứa đầy đủ, hoặc bảo người nhận cài font, hoặc export với swap web-safe (`fontSwaps:[{from:'Be Vietnam Pro',to:'Arial'}]` — Arial phủ tiếng Việt). Standalone HTML **embed** font (`@font-face` inline từ `styles.css`), nên luôn trung thành offline (Th7 2026).
|
|
69
72
|
|
|
70
73
|
## Accessibility (base/a11y.css + component ARIA)
|
|
71
74
|
|