@cyberskill/design 1.0.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 +267 -0
- package/README.md +316 -0
- package/SKILL.md +64 -0
- package/VERSION +1 -0
- package/_ds_bundle.js +5377 -0
- package/_ds_manifest.json +1 -0
- package/_esm/cs.mjs +137 -0
- package/assets/aurora-gold.jpg +0 -0
- package/assets/aurora-hoa.png +0 -0
- package/assets/aurora-kim.png +0 -0
- package/assets/aurora-moc.png +0 -0
- package/assets/aurora-thuy.png +0 -0
- package/assets/favicon.svg +1 -0
- package/assets/logo-mark.png +0 -0
- package/assets/logo-mark.svg +10 -0
- package/assets/lumi-poster.webp +0 -0
- package/assets/og-dashboard.png +0 -0
- package/base/a11y.css +57 -0
- package/base/ai.css +67 -0
- package/base/collections.css +53 -0
- package/base/components.css +212 -0
- package/base/controls.css +329 -0
- package/base/data.css +48 -0
- package/base/feedback.css +60 -0
- package/base/forms.css +32 -0
- package/base/glass.css +119 -0
- package/base/interaction.css +50 -0
- package/base/navigation.css +39 -0
- package/base/reset.css +17 -0
- package/base/responsive.css +128 -0
- package/base/shell.css +55 -0
- package/base/typography.css +14 -0
- package/components/_i18n/i18n.js +56 -0
- package/components/_i18n/strings.js +187 -0
- package/components/_utils/cx.js +4 -0
- package/components/ai/AIDisclosureBadge.d.ts +16 -0
- package/components/ai/AIDisclosureBadge.figma.tsx +12 -0
- package/components/ai/AIDisclosureBadge.jsx +39 -0
- package/components/ai/AIDisclosureBadge.prompt.md +9 -0
- package/components/ai/ChatMessage.d.ts +17 -0
- package/components/ai/ChatMessage.figma.tsx +12 -0
- package/components/ai/ChatMessage.jsx +22 -0
- package/components/ai/ChatMessage.prompt.md +8 -0
- package/components/ai/CitationList.d.ts +13 -0
- package/components/ai/CitationList.figma.tsx +12 -0
- package/components/ai/CitationList.jsx +22 -0
- package/components/ai/CitationList.prompt.md +5 -0
- package/components/ai/ConfidenceMeter.d.ts +17 -0
- package/components/ai/ConfidenceMeter.figma.tsx +12 -0
- package/components/ai/ConfidenceMeter.jsx +43 -0
- package/components/ai/ConfidenceMeter.prompt.md +6 -0
- package/components/ai/HumanReviewGate.d.ts +20 -0
- package/components/ai/HumanReviewGate.figma.tsx +12 -0
- package/components/ai/HumanReviewGate.jsx +37 -0
- package/components/ai/HumanReviewGate.prompt.md +13 -0
- package/components/ai/PromptInput.d.ts +21 -0
- package/components/ai/PromptInput.figma.tsx +12 -0
- package/components/ai/PromptInput.jsx +48 -0
- package/components/ai/PromptInput.prompt.md +5 -0
- package/components/ai/PromptSuggestions.d.ts +12 -0
- package/components/ai/PromptSuggestions.figma.tsx +12 -0
- package/components/ai/PromptSuggestions.jsx +20 -0
- package/components/ai/PromptSuggestions.prompt.md +5 -0
- package/components/ai/TypingIndicator.d.ts +9 -0
- package/components/ai/TypingIndicator.figma.tsx +12 -0
- package/components/ai/TypingIndicator.jsx +14 -0
- package/components/ai/TypingIndicator.prompt.md +5 -0
- package/components/ai/ai-conversation.card.html +49 -0
- package/components/ai/ai-lumi.card.html +39 -0
- package/components/ai/ai.card.html +43 -0
- package/components/brand/LumiAvatar.d.ts +14 -0
- package/components/brand/LumiAvatar.figma.tsx +12 -0
- package/components/brand/LumiAvatar.jsx +11 -0
- package/components/brand/LumiAvatar.prompt.md +5 -0
- package/components/brand/brand.card.html +37 -0
- package/components/button/Button.d.ts +24 -0
- package/components/button/Button.figma.tsx +31 -0
- package/components/button/Button.jsx +42 -0
- package/components/button/Button.prompt.md +12 -0
- package/components/button/ButtonGroup.d.ts +11 -0
- package/components/button/ButtonGroup.figma.tsx +12 -0
- package/components/button/ButtonGroup.jsx +7 -0
- package/components/button/ButtonGroup.prompt.md +8 -0
- package/components/button/FloatingActionButton.d.ts +15 -0
- package/components/button/FloatingActionButton.figma.tsx +12 -0
- package/components/button/FloatingActionButton.jsx +20 -0
- package/components/button/FloatingActionButton.prompt.md +6 -0
- package/components/button/buttons.card.html +52 -0
- package/components/data/Accordion.d.ts +14 -0
- package/components/data/Accordion.figma.tsx +12 -0
- package/components/data/Accordion.jsx +25 -0
- package/components/data/Accordion.prompt.md +5 -0
- package/components/data/Avatar.d.ts +18 -0
- package/components/data/Avatar.figma.tsx +12 -0
- package/components/data/Avatar.jsx +17 -0
- package/components/data/Avatar.prompt.md +6 -0
- package/components/data/Card.d.ts +23 -0
- package/components/data/Card.figma.tsx +12 -0
- package/components/data/Card.jsx +27 -0
- package/components/data/Card.prompt.md +9 -0
- package/components/data/Carousel.d.ts +13 -0
- package/components/data/Carousel.figma.tsx +12 -0
- package/components/data/Carousel.jsx +26 -0
- package/components/data/Carousel.prompt.md +5 -0
- package/components/data/Chart.d.ts +17 -0
- package/components/data/Chart.figma.tsx +12 -0
- package/components/data/Chart.jsx +52 -0
- package/components/data/Chart.prompt.md +5 -0
- package/components/data/CodeBlock.d.ts +12 -0
- package/components/data/CodeBlock.figma.tsx +12 -0
- package/components/data/CodeBlock.jsx +21 -0
- package/components/data/CodeBlock.prompt.md +5 -0
- package/components/data/Comment.d.ts +18 -0
- package/components/data/Comment.figma.tsx +12 -0
- package/components/data/Comment.jsx +24 -0
- package/components/data/Comment.prompt.md +7 -0
- package/components/data/DescriptionList.d.ts +10 -0
- package/components/data/DescriptionList.figma.tsx +12 -0
- package/components/data/DescriptionList.jsx +16 -0
- package/components/data/DescriptionList.prompt.md +5 -0
- package/components/data/Divider.d.ts +13 -0
- package/components/data/Divider.figma.tsx +12 -0
- package/components/data/Divider.jsx +11 -0
- package/components/data/Divider.prompt.md +6 -0
- package/components/data/Image.d.ts +18 -0
- package/components/data/Image.figma.tsx +12 -0
- package/components/data/Image.jsx +37 -0
- package/components/data/Image.prompt.md +5 -0
- package/components/data/Kbd.d.ts +8 -0
- package/components/data/Kbd.figma.tsx +12 -0
- package/components/data/Kbd.jsx +7 -0
- package/components/data/Kbd.prompt.md +5 -0
- package/components/data/List.d.ts +16 -0
- package/components/data/List.figma.tsx +12 -0
- package/components/data/List.jsx +24 -0
- package/components/data/List.prompt.md +7 -0
- package/components/data/Masonry.d.ts +13 -0
- package/components/data/Masonry.figma.tsx +12 -0
- package/components/data/Masonry.jsx +11 -0
- package/components/data/Masonry.prompt.md +5 -0
- package/components/data/QRCode.d.ts +12 -0
- package/components/data/QRCode.figma.tsx +12 -0
- package/components/data/QRCode.jsx +17 -0
- package/components/data/QRCode.prompt.md +5 -0
- package/components/data/Sortable.d.ts +10 -0
- package/components/data/Sortable.figma.tsx +12 -0
- package/components/data/Sortable.jsx +30 -0
- package/components/data/Sortable.prompt.md +5 -0
- package/components/data/Splitter.d.ts +16 -0
- package/components/data/Splitter.figma.tsx +12 -0
- package/components/data/Splitter.jsx +31 -0
- package/components/data/Splitter.prompt.md +5 -0
- package/components/data/Stat.d.ts +15 -0
- package/components/data/Stat.figma.tsx +12 -0
- package/components/data/Stat.jsx +19 -0
- package/components/data/Stat.prompt.md +5 -0
- package/components/data/Terminal.d.ts +13 -0
- package/components/data/Terminal.figma.tsx +12 -0
- package/components/data/Terminal.jsx +32 -0
- package/components/data/Terminal.prompt.md +5 -0
- package/components/data/Timeline.d.ts +17 -0
- package/components/data/Timeline.figma.tsx +12 -0
- package/components/data/Timeline.jsx +20 -0
- package/components/data/Timeline.prompt.md +8 -0
- package/components/data/Tooltip.d.ts +14 -0
- package/components/data/Tooltip.figma.tsx +12 -0
- package/components/data/Tooltip.jsx +12 -0
- package/components/data/Tooltip.prompt.md +5 -0
- package/components/data/Tree.d.ts +13 -0
- package/components/data/Tree.figma.tsx +12 -0
- package/components/data/Tree.jsx +23 -0
- package/components/data/Tree.prompt.md +5 -0
- package/components/data/Watermark.d.ts +15 -0
- package/components/data/Watermark.figma.tsx +12 -0
- package/components/data/Watermark.jsx +15 -0
- package/components/data/Watermark.prompt.md +5 -0
- package/components/data/collections.card.html +52 -0
- package/components/data/data.card.html +50 -0
- package/components/data/qr-encode.js +80 -0
- package/components/datatable/DataGrid.d.ts +42 -0
- package/components/datatable/DataGrid.figma.tsx +12 -0
- package/components/datatable/DataGrid.jsx +149 -0
- package/components/datatable/DataGrid.prompt.md +12 -0
- package/components/datatable/DataTable.d.ts +25 -0
- package/components/datatable/DataTable.figma.tsx +12 -0
- package/components/datatable/DataTable.jsx +42 -0
- package/components/datatable/DataTable.prompt.md +15 -0
- package/components/datatable/TreeTable.d.ts +14 -0
- package/components/datatable/TreeTable.figma.tsx +12 -0
- package/components/datatable/TreeTable.jsx +47 -0
- package/components/datatable/TreeTable.prompt.md +6 -0
- package/components/datatable/datatable.card.html +51 -0
- package/components/dialog/Dialog.d.ts +22 -0
- package/components/dialog/Dialog.figma.tsx +12 -0
- package/components/dialog/Dialog.jsx +99 -0
- package/components/dialog/Dialog.prompt.md +17 -0
- package/components/dialog/dialog.card.html +46 -0
- package/components/feedback/Alert.d.ts +16 -0
- package/components/feedback/Alert.figma.tsx +17 -0
- package/components/feedback/Alert.jsx +29 -0
- package/components/feedback/Alert.prompt.md +6 -0
- package/components/feedback/Badge.d.ts +15 -0
- package/components/feedback/Badge.figma.tsx +12 -0
- package/components/feedback/Badge.jsx +12 -0
- package/components/feedback/Badge.prompt.md +6 -0
- package/components/feedback/EmptyState.d.ts +13 -0
- package/components/feedback/EmptyState.figma.tsx +12 -0
- package/components/feedback/EmptyState.jsx +16 -0
- package/components/feedback/EmptyState.prompt.md +7 -0
- package/components/feedback/ProgressBar.d.ts +15 -0
- package/components/feedback/ProgressBar.figma.tsx +12 -0
- package/components/feedback/ProgressBar.jsx +13 -0
- package/components/feedback/ProgressBar.prompt.md +5 -0
- package/components/feedback/Result.d.ts +15 -0
- package/components/feedback/Result.figma.tsx +12 -0
- package/components/feedback/Result.jsx +24 -0
- package/components/feedback/Result.prompt.md +7 -0
- package/components/feedback/Skeleton.d.ts +18 -0
- package/components/feedback/Skeleton.figma.tsx +12 -0
- package/components/feedback/Skeleton.jsx +22 -0
- package/components/feedback/Skeleton.prompt.md +6 -0
- package/components/feedback/Spinner.d.ts +11 -0
- package/components/feedback/Spinner.figma.tsx +12 -0
- package/components/feedback/Spinner.jsx +10 -0
- package/components/feedback/Spinner.prompt.md +5 -0
- package/components/feedback/StatusIndicator.d.ts +11 -0
- package/components/feedback/StatusIndicator.figma.tsx +12 -0
- package/components/feedback/StatusIndicator.jsx +12 -0
- package/components/feedback/StatusIndicator.prompt.md +5 -0
- package/components/feedback/Tag.d.ts +14 -0
- package/components/feedback/Tag.figma.tsx +12 -0
- package/components/feedback/Tag.jsx +19 -0
- package/components/feedback/Tag.prompt.md +6 -0
- package/components/feedback/Toast.d.ts +19 -0
- package/components/feedback/Toast.figma.tsx +12 -0
- package/components/feedback/Toast.jsx +30 -0
- package/components/feedback/Toast.prompt.md +7 -0
- package/components/feedback/feedback-2.card.html +43 -0
- package/components/feedback/feedback.card.html +50 -0
- package/components/forms/Calendar.d.ts +10 -0
- package/components/forms/Calendar.figma.tsx +12 -0
- package/components/forms/Calendar.jsx +43 -0
- package/components/forms/Calendar.prompt.md +5 -0
- package/components/forms/Cascader.d.ts +17 -0
- package/components/forms/Cascader.figma.tsx +12 -0
- package/components/forms/Cascader.jsx +58 -0
- package/components/forms/Cascader.prompt.md +5 -0
- package/components/forms/Checkbox.d.ts +13 -0
- package/components/forms/Checkbox.figma.tsx +12 -0
- package/components/forms/Checkbox.jsx +16 -0
- package/components/forms/Checkbox.prompt.md +6 -0
- package/components/forms/ColorPicker.d.ts +12 -0
- package/components/forms/ColorPicker.figma.tsx +12 -0
- package/components/forms/ColorPicker.jsx +44 -0
- package/components/forms/ColorPicker.prompt.md +5 -0
- package/components/forms/Combobox.d.ts +17 -0
- package/components/forms/Combobox.figma.tsx +12 -0
- package/components/forms/Combobox.jsx +49 -0
- package/components/forms/Combobox.prompt.md +6 -0
- package/components/forms/DatePicker.d.ts +15 -0
- package/components/forms/DatePicker.figma.tsx +12 -0
- package/components/forms/DatePicker.jsx +35 -0
- package/components/forms/DatePicker.prompt.md +5 -0
- package/components/forms/Editor.d.ts +12 -0
- package/components/forms/Editor.figma.tsx +12 -0
- package/components/forms/Editor.jsx +26 -0
- package/components/forms/Editor.prompt.md +5 -0
- package/components/forms/FileUpload.d.ts +14 -0
- package/components/forms/FileUpload.figma.tsx +12 -0
- package/components/forms/FileUpload.jsx +29 -0
- package/components/forms/FileUpload.prompt.md +5 -0
- package/components/forms/Form.d.ts +87 -0
- package/components/forms/Form.figma.tsx +12 -0
- package/components/forms/Form.jsx +316 -0
- package/components/forms/Form.prompt.md +46 -0
- package/components/forms/InlineEdit.d.ts +13 -0
- package/components/forms/InlineEdit.figma.tsx +12 -0
- package/components/forms/InlineEdit.jsx +27 -0
- package/components/forms/InlineEdit.prompt.md +5 -0
- package/components/forms/InputGroup.d.ts +20 -0
- package/components/forms/InputGroup.figma.tsx +12 -0
- package/components/forms/InputGroup.jsx +25 -0
- package/components/forms/InputGroup.prompt.md +6 -0
- package/components/forms/InputOTP.d.ts +16 -0
- package/components/forms/InputOTP.figma.tsx +12 -0
- package/components/forms/InputOTP.jsx +47 -0
- package/components/forms/InputOTP.prompt.md +5 -0
- package/components/forms/Mentions.d.ts +13 -0
- package/components/forms/Mentions.figma.tsx +12 -0
- package/components/forms/Mentions.jsx +31 -0
- package/components/forms/Mentions.prompt.md +5 -0
- package/components/forms/NumberField.d.ts +14 -0
- package/components/forms/NumberField.figma.tsx +12 -0
- package/components/forms/NumberField.jsx +21 -0
- package/components/forms/NumberField.prompt.md +5 -0
- package/components/forms/RadioGroup.d.ts +24 -0
- package/components/forms/RadioGroup.figma.tsx +12 -0
- package/components/forms/RadioGroup.jsx +32 -0
- package/components/forms/RadioGroup.prompt.md +6 -0
- package/components/forms/Rating.d.ts +16 -0
- package/components/forms/Rating.figma.tsx +12 -0
- package/components/forms/Rating.jsx +22 -0
- package/components/forms/Rating.prompt.md +6 -0
- package/components/forms/SearchField.d.ts +11 -0
- package/components/forms/SearchField.figma.tsx +12 -0
- package/components/forms/SearchField.jsx +25 -0
- package/components/forms/SearchField.prompt.md +5 -0
- package/components/forms/SegmentedControl.d.ts +13 -0
- package/components/forms/SegmentedControl.figma.tsx +12 -0
- package/components/forms/SegmentedControl.jsx +31 -0
- package/components/forms/SegmentedControl.prompt.md +6 -0
- package/components/forms/Select.d.ts +19 -0
- package/components/forms/Select.figma.tsx +12 -0
- package/components/forms/Select.jsx +27 -0
- package/components/forms/Select.prompt.md +6 -0
- package/components/forms/Slider.d.ts +6 -0
- package/components/forms/Slider.figma.tsx +12 -0
- package/components/forms/Slider.jsx +8 -0
- package/components/forms/Slider.prompt.md +5 -0
- package/components/forms/Switch.d.ts +12 -0
- package/components/forms/Switch.figma.tsx +12 -0
- package/components/forms/Switch.jsx +14 -0
- package/components/forms/Switch.prompt.md +5 -0
- package/components/forms/TagInput.d.ts +16 -0
- package/components/forms/TagInput.figma.tsx +12 -0
- package/components/forms/TagInput.jsx +39 -0
- package/components/forms/TagInput.prompt.md +5 -0
- package/components/forms/Textarea.d.ts +14 -0
- package/components/forms/Textarea.figma.tsx +12 -0
- package/components/forms/Textarea.jsx +19 -0
- package/components/forms/Textarea.prompt.md +5 -0
- package/components/forms/TimePicker.d.ts +16 -0
- package/components/forms/TimePicker.figma.tsx +12 -0
- package/components/forms/TimePicker.jsx +22 -0
- package/components/forms/TimePicker.prompt.md +5 -0
- package/components/forms/Toggle.d.ts +16 -0
- package/components/forms/Toggle.figma.tsx +12 -0
- package/components/forms/Toggle.jsx +15 -0
- package/components/forms/Toggle.prompt.md +6 -0
- package/components/forms/Transfer.d.ts +14 -0
- package/components/forms/Transfer.figma.tsx +12 -0
- package/components/forms/Transfer.jsx +41 -0
- package/components/forms/Transfer.prompt.md +5 -0
- package/components/forms/TreeSelect.d.ts +15 -0
- package/components/forms/TreeSelect.figma.tsx +12 -0
- package/components/forms/TreeSelect.jsx +35 -0
- package/components/forms/TreeSelect.prompt.md +5 -0
- package/components/forms/forms-2.card.html +40 -0
- package/components/forms/forms.card.html +40 -0
- package/components/icon/Icon.d.ts +26 -0
- package/components/icon/Icon.figma.tsx +12 -0
- package/components/icon/Icon.jsx +74 -0
- package/components/icon/Icon.prompt.md +8 -0
- package/components/icon/icon.card.html +38 -0
- package/components/logo/Logo.d.ts +18 -0
- package/components/logo/Logo.figma.tsx +12 -0
- package/components/logo/Logo.jsx +25 -0
- package/components/logo/Logo.prompt.md +10 -0
- package/components/logo/logo-data.js +214 -0
- package/components/logo/logo.card.html +44 -0
- package/components/navigation/Anchor.d.ts +11 -0
- package/components/navigation/Anchor.figma.tsx +12 -0
- package/components/navigation/Anchor.jsx +25 -0
- package/components/navigation/Anchor.prompt.md +5 -0
- package/components/navigation/BackTop.d.ts +9 -0
- package/components/navigation/BackTop.figma.tsx +12 -0
- package/components/navigation/BackTop.jsx +23 -0
- package/components/navigation/BackTop.prompt.md +5 -0
- package/components/navigation/Breadcrumb.d.ts +14 -0
- package/components/navigation/Breadcrumb.figma.tsx +12 -0
- package/components/navigation/Breadcrumb.jsx +24 -0
- package/components/navigation/Breadcrumb.prompt.md +5 -0
- package/components/navigation/CommandPalette.d.ts +19 -0
- package/components/navigation/CommandPalette.figma.tsx +12 -0
- package/components/navigation/CommandPalette.jsx +48 -0
- package/components/navigation/CommandPalette.prompt.md +7 -0
- package/components/navigation/Dock.d.ts +6 -0
- package/components/navigation/Dock.figma.tsx +12 -0
- package/components/navigation/Dock.jsx +22 -0
- package/components/navigation/Dock.prompt.md +5 -0
- package/components/navigation/HotKeys.d.ts +13 -0
- package/components/navigation/HotKeys.figma.tsx +12 -0
- package/components/navigation/HotKeys.jsx +44 -0
- package/components/navigation/HotKeys.prompt.md +5 -0
- package/components/navigation/Link.d.ts +12 -0
- package/components/navigation/Link.figma.tsx +12 -0
- package/components/navigation/Link.jsx +13 -0
- package/components/navigation/Link.prompt.md +5 -0
- package/components/navigation/Menu.d.ts +23 -0
- package/components/navigation/Menu.figma.tsx +12 -0
- package/components/navigation/Menu.jsx +36 -0
- package/components/navigation/Menu.prompt.md +9 -0
- package/components/navigation/Menubar.d.ts +7 -0
- package/components/navigation/Menubar.figma.tsx +12 -0
- package/components/navigation/Menubar.jsx +48 -0
- package/components/navigation/Menubar.prompt.md +5 -0
- package/components/navigation/NavigationMenu.d.ts +7 -0
- package/components/navigation/NavigationMenu.figma.tsx +12 -0
- package/components/navigation/NavigationMenu.jsx +38 -0
- package/components/navigation/NavigationMenu.prompt.md +5 -0
- package/components/navigation/Pagination.d.ts +13 -0
- package/components/navigation/Pagination.figma.tsx +12 -0
- package/components/navigation/Pagination.jsx +32 -0
- package/components/navigation/Pagination.prompt.md +5 -0
- package/components/navigation/Sidebar.d.ts +20 -0
- package/components/navigation/Sidebar.figma.tsx +12 -0
- package/components/navigation/Sidebar.jsx +24 -0
- package/components/navigation/Sidebar.prompt.md +8 -0
- package/components/navigation/Steps.d.ts +13 -0
- package/components/navigation/Steps.figma.tsx +12 -0
- package/components/navigation/Steps.jsx +20 -0
- package/components/navigation/Steps.prompt.md +5 -0
- package/components/navigation/Tabs.d.ts +21 -0
- package/components/navigation/Tabs.figma.tsx +12 -0
- package/components/navigation/Tabs.jsx +41 -0
- package/components/navigation/Tabs.prompt.md +6 -0
- package/components/navigation/Toolbar.d.ts +16 -0
- package/components/navigation/Toolbar.figma.tsx +12 -0
- package/components/navigation/Toolbar.jsx +32 -0
- package/components/navigation/Toolbar.prompt.md +5 -0
- package/components/navigation/navigation.card.html +51 -0
- package/components/navigation/shell.card.html +52 -0
- package/components/overlays/ContextMenu.d.ts +10 -0
- package/components/overlays/ContextMenu.figma.tsx +12 -0
- package/components/overlays/ContextMenu.jsx +28 -0
- package/components/overlays/ContextMenu.prompt.md +7 -0
- package/components/overlays/Drawer.d.ts +18 -0
- package/components/overlays/Drawer.figma.tsx +12 -0
- package/components/overlays/Drawer.jsx +44 -0
- package/components/overlays/Drawer.prompt.md +8 -0
- package/components/overlays/HoverCard.d.ts +13 -0
- package/components/overlays/HoverCard.figma.tsx +12 -0
- package/components/overlays/HoverCard.jsx +17 -0
- package/components/overlays/HoverCard.prompt.md +5 -0
- package/components/overlays/Popconfirm.d.ts +18 -0
- package/components/overlays/Popconfirm.figma.tsx +12 -0
- package/components/overlays/Popconfirm.jsx +33 -0
- package/components/overlays/Popconfirm.prompt.md +6 -0
- package/components/overlays/Popover.d.ts +17 -0
- package/components/overlays/Popover.figma.tsx +12 -0
- package/components/overlays/Popover.jsx +24 -0
- package/components/overlays/Popover.prompt.md +7 -0
- package/components/overlays/Tour.d.ts +13 -0
- package/components/overlays/Tour.figma.tsx +12 -0
- package/components/overlays/Tour.jsx +46 -0
- package/components/overlays/Tour.prompt.md +5 -0
- package/components/overlays/overlays.card.html +50 -0
- package/components/textfield/TextField.d.ts +18 -0
- package/components/textfield/TextField.figma.tsx +14 -0
- package/components/textfield/TextField.jsx +44 -0
- package/components/textfield/TextField.prompt.md +11 -0
- package/components/textfield/textfield.card.html +34 -0
- package/docs/ci-cd.md +84 -0
- package/docs/consuming.md +109 -0
- package/docs/contrast-report.md +125 -0
- package/docs/conventions.md +114 -0
- package/docs/decisions.md +94 -0
- package/docs/deploy.md +110 -0
- package/docs/design-styles.md +25 -0
- package/docs/figma.md +119 -0
- package/docs/live-hub.md +58 -0
- package/docs/products.md +26 -0
- package/docs/quality-gates.md +94 -0
- package/docs/release-notes.md +31 -0
- package/docs/storybook.md +56 -0
- package/docs/sync.md +48 -0
- package/docs/template-schema-v2.md +36 -0
- package/docs/vi/ci-cd.md +84 -0
- package/docs/vi/consuming.md +109 -0
- package/docs/vi/contrast-report.md +125 -0
- package/docs/vi/conventions.md +114 -0
- package/docs/vi/decisions.md +94 -0
- package/docs/vi/deploy.md +110 -0
- package/docs/vi/design-styles.md +25 -0
- package/docs/vi/figma.md +119 -0
- package/docs/vi/live-hub.md +58 -0
- package/docs/vi/products.md +26 -0
- package/docs/vi/quality-gates.md +94 -0
- package/docs/vi/release-notes.md +31 -0
- package/docs/vi/storybook.md +56 -0
- package/docs/vi/sync.md +48 -0
- package/docs/vi/template-schema-v2.md +36 -0
- package/docs/viewer.html +230 -0
- package/fonts/bevietnampro-300-latin-ext.woff2 +0 -0
- package/fonts/bevietnampro-300-latin.woff2 +0 -0
- package/fonts/bevietnampro-300-vietnamese.woff2 +0 -0
- package/fonts/bevietnampro-400-latin-ext.woff2 +0 -0
- package/fonts/bevietnampro-400-latin.woff2 +0 -0
- package/fonts/bevietnampro-400-vietnamese.woff2 +0 -0
- package/fonts/bevietnampro-400i-latin-ext.woff2 +0 -0
- package/fonts/bevietnampro-400i-latin.woff2 +0 -0
- package/fonts/bevietnampro-400i-vietnamese.woff2 +0 -0
- package/fonts/bevietnampro-500-latin-ext.woff2 +0 -0
- package/fonts/bevietnampro-500-latin.woff2 +0 -0
- package/fonts/bevietnampro-500-vietnamese.woff2 +0 -0
- package/fonts/bevietnampro-600-latin-ext.woff2 +0 -0
- package/fonts/bevietnampro-600-latin.woff2 +0 -0
- package/fonts/bevietnampro-600-vietnamese.woff2 +0 -0
- package/fonts/bevietnampro-600i-latin-ext.woff2 +0 -0
- package/fonts/bevietnampro-600i-latin.woff2 +0 -0
- package/fonts/bevietnampro-600i-vietnamese.woff2 +0 -0
- package/fonts/bevietnampro-700-latin-ext.woff2 +0 -0
- package/fonts/bevietnampro-700-latin.woff2 +0 -0
- package/fonts/bevietnampro-700-vietnamese.woff2 +0 -0
- package/fonts/bevietnampro-800-latin-ext.woff2 +0 -0
- package/fonts/bevietnampro-800-latin.woff2 +0 -0
- package/fonts/bevietnampro-800-vietnamese.woff2 +0 -0
- package/fonts/jetbrainsmono-400-cyrillic-ext.woff2 +0 -0
- package/fonts/jetbrainsmono-400-cyrillic.woff2 +0 -0
- package/fonts/jetbrainsmono-400-greek.woff2 +0 -0
- package/fonts/jetbrainsmono-400-latin-ext.woff2 +0 -0
- package/fonts/jetbrainsmono-400-latin.woff2 +0 -0
- package/fonts/jetbrainsmono-400-vietnamese.woff2 +0 -0
- package/fonts/jetbrainsmono-500-cyrillic-ext.woff2 +0 -0
- package/fonts/jetbrainsmono-500-cyrillic.woff2 +0 -0
- package/fonts/jetbrainsmono-500-greek.woff2 +0 -0
- package/fonts/jetbrainsmono-500-latin-ext.woff2 +0 -0
- package/fonts/jetbrainsmono-500-latin.woff2 +0 -0
- package/fonts/jetbrainsmono-500-vietnamese.woff2 +0 -0
- package/fonts/jetbrainsmono-700-cyrillic-ext.woff2 +0 -0
- package/fonts/jetbrainsmono-700-cyrillic.woff2 +0 -0
- package/fonts/jetbrainsmono-700-greek.woff2 +0 -0
- package/fonts/jetbrainsmono-700-latin-ext.woff2 +0 -0
- package/fonts/jetbrainsmono-700-latin.woff2 +0 -0
- package/fonts/jetbrainsmono-700-vietnamese.woff2 +0 -0
- package/guidelines/atomic-view.html +497 -0
- package/guidelines/brand-iconography.html +51 -0
- package/guidelines/brand-imagery.html +23 -0
- package/guidelines/brand-interaction.html +24 -0
- package/guidelines/brand-voice.html +24 -0
- package/guidelines/colors-anchors.html +20 -0
- package/guidelines/colors-semantic.html +19 -0
- package/guidelines/colors-surfaces.html +19 -0
- package/guidelines/colors-text.html +20 -0
- package/guidelines/documents.html +43 -0
- package/guidelines/elements-components.html +27 -0
- package/guidelines/elements-concept.html +48 -0
- package/guidelines/elements-variants.html +49 -0
- package/guidelines/motion-interaction.html +29 -0
- package/guidelines/motion.html +53 -0
- package/guidelines/nav-model.cjs +113 -0
- package/guidelines/responsive-bilingual.html +75 -0
- package/guidelines/rtl-preview.html +115 -0
- package/guidelines/spacing-breakpoints.html +20 -0
- package/guidelines/spacing-radius.html +19 -0
- package/guidelines/spacing-scale.html +21 -0
- package/guidelines/surfaces-aurora.html +20 -0
- package/guidelines/surfaces-depth.html +27 -0
- package/guidelines/surfaces-glass.html +21 -0
- package/guidelines/surfaces-shadow.html +20 -0
- package/guidelines/type-families.html +25 -0
- package/guidelines/type-lineheight.html +16 -0
- package/guidelines/type-scale.html +21 -0
- package/guidelines/type-weights.html +20 -0
- package/llms.txt +70 -0
- package/package.json +88 -0
- package/styles.css +39 -0
- package/templates/_vendor/deck-stage.js +2584 -0
- package/templates/ai-cluster-demo.html +46 -0
- package/templates/app-shell/.thumbnail +0 -0
- package/templates/app-shell/AppShell.dc.html +80 -0
- package/templates/app-shell/content-schema.json +114 -0
- package/templates/app-shell/ds-base.js +23 -0
- package/templates/app-shell/support.js +1841 -0
- package/templates/article/.thumbnail +0 -0
- package/templates/article/Article.dc.html +67 -0
- package/templates/article/content-schema.json +80 -0
- package/templates/article/ds-base.js +23 -0
- package/templates/article/support.js +1841 -0
- package/templates/auth/.thumbnail +0 -0
- package/templates/auth/Auth.dc.html +72 -0
- package/templates/auth/content-schema.json +74 -0
- package/templates/auth/ds-base.js +23 -0
- package/templates/auth/support.js +1841 -0
- package/templates/bod-deck/.thumbnail +0 -0
- package/templates/bod-deck/BodDeck.dc.html +106 -0
- package/templates/bod-deck/content-schema.json +171 -0
- package/templates/bod-deck/ds-base.js +23 -0
- package/templates/bod-deck/support.js +1841 -0
- package/templates/bod-investor-update/.thumbnail +0 -0
- package/templates/bod-investor-update/BodInvestorUpdate.dc.html +81 -0
- package/templates/bod-investor-update/content-schema.json +105 -0
- package/templates/bod-investor-update/ds-base.js +23 -0
- package/templates/bod-investor-update/support.js +1841 -0
- package/templates/bod-memo/.thumbnail +0 -0
- package/templates/bod-memo/BodMemo.dc.html +87 -0
- package/templates/bod-memo/ds-base.js +23 -0
- package/templates/bod-memo/support.js +1841 -0
- package/templates/bod-minutes/.thumbnail +0 -0
- package/templates/bod-minutes/BodMinutes.dc.html +84 -0
- package/templates/bod-minutes/ds-base.js +23 -0
- package/templates/bod-minutes/support.js +1841 -0
- package/templates/bod-report/.thumbnail +0 -0
- package/templates/bod-report/BodReport.dc.html +106 -0
- package/templates/bod-report/content-schema.json +29 -0
- package/templates/bod-report/ds-base.js +23 -0
- package/templates/bod-report/support.js +1841 -0
- package/templates/bod-resolution/.thumbnail +0 -0
- package/templates/bod-resolution/BodResolution.dc.html +87 -0
- package/templates/bod-resolution/content-schema.json +123 -0
- package/templates/bod-resolution/ds-base.js +23 -0
- package/templates/bod-resolution/support.js +1841 -0
- package/templates/culture-event-invite/.thumbnail +0 -0
- package/templates/culture-event-invite/CultureEventInvite.dc.html +73 -0
- package/templates/culture-event-invite/ds-base.js +23 -0
- package/templates/culture-event-invite/support.js +1841 -0
- package/templates/dashboard/.thumbnail +0 -0
- package/templates/dashboard/Dashboard.dc.html +120 -0
- package/templates/dashboard/content-schema.json +97 -0
- package/templates/dashboard/ds-base.js +23 -0
- package/templates/dashboard/support.js +1841 -0
- package/templates/delivery-change-note/.thumbnail +0 -0
- package/templates/delivery-change-note/DeliveryChangeNote.dc.html +85 -0
- package/templates/delivery-change-note/content-schema.json +158 -0
- package/templates/delivery-change-note/ds-base.js +23 -0
- package/templates/delivery-change-note/support.js +1841 -0
- package/templates/delivery-kickoff/.thumbnail +0 -0
- package/templates/delivery-kickoff/DeliveryKickoff.dc.html +112 -0
- package/templates/delivery-kickoff/content-schema.json +223 -0
- package/templates/delivery-kickoff/ds-base.js +23 -0
- package/templates/delivery-kickoff/support.js +1841 -0
- package/templates/delivery-qbr-deck/.thumbnail +0 -0
- package/templates/delivery-qbr-deck/DeliveryQbrDeck.dc.html +118 -0
- package/templates/delivery-qbr-deck/content-schema.json +177 -0
- package/templates/delivery-qbr-deck/ds-base.js +23 -0
- package/templates/delivery-qbr-deck/support.js +1841 -0
- package/templates/delivery-runbook/.thumbnail +0 -0
- package/templates/delivery-runbook/DeliveryRunbook.dc.html +91 -0
- package/templates/delivery-runbook/content-schema.json +211 -0
- package/templates/delivery-runbook/ds-base.js +23 -0
- package/templates/delivery-runbook/support.js +1841 -0
- package/templates/delivery-status-email/.thumbnail +0 -0
- package/templates/delivery-status-email/DeliveryStatusEmail.dc.html +78 -0
- package/templates/delivery-status-email/ds-base.js +23 -0
- package/templates/delivery-status-email/support.js +1841 -0
- package/templates/doc-style-guide/.thumbnail +0 -0
- package/templates/doc-style-guide/DocStyleGuide.dc.html +148 -0
- package/templates/doc-style-guide/ds-base.js +23 -0
- package/templates/doc-style-guide/support.js +1841 -0
- package/templates/doc-suite-index/.thumbnail +0 -0
- package/templates/doc-suite-index/DocSuiteIndex.dc.html +201 -0
- package/templates/doc-suite-index/content-schema.json +12 -0
- package/templates/doc-suite-index/ds-base.js +23 -0
- package/templates/doc-suite-index/support.js +1841 -0
- package/templates/doc-templates/.thumbnail +0 -0
- package/templates/doc-templates/DocTemplates.dc.html +118 -0
- package/templates/doc-templates/ds-base.js +23 -0
- package/templates/doc-templates/support.js +1841 -0
- package/templates/email/.thumbnail +0 -0
- package/templates/email/Email-VN-standalone.html +59 -0
- package/templates/email/Email.dc.html +67 -0
- package/templates/email/ds-base.js +23 -0
- package/templates/email/support.js +1841 -0
- package/templates/email-safe/README.md +28 -0
- package/templates/email-safe/email-announcement.html +88 -0
- package/templates/email-safe/email-dunning.html +59 -0
- package/templates/email-safe/email-investor.html +88 -0
- package/templates/email-safe/email-launch.html +88 -0
- package/templates/email-safe/email-newsletter.html +62 -0
- package/templates/email-safe/email-status.html +88 -0
- package/templates/email-safe/email-transactional.html +88 -0
- package/templates/finance-dunning-email/.thumbnail +0 -0
- package/templates/finance-dunning-email/FinanceDunningEmail.dc.html +58 -0
- package/templates/finance-dunning-email/ds-base.js +23 -0
- package/templates/finance-dunning-email/support.js +1841 -0
- package/templates/finance-expense-report/.thumbnail +0 -0
- package/templates/finance-expense-report/FinanceExpenseReport.dc.html +82 -0
- package/templates/finance-expense-report/ds-base.js +23 -0
- package/templates/finance-expense-report/support.js +1841 -0
- package/templates/finance-invoice/.thumbnail +0 -0
- package/templates/finance-invoice/FinanceInvoice.dc.html +92 -0
- package/templates/finance-invoice/ds-base.js +23 -0
- package/templates/finance-invoice/support.js +1841 -0
- package/templates/finance-quote/.thumbnail +0 -0
- package/templates/finance-quote/FinanceQuote.dc.html +86 -0
- package/templates/finance-quote/ds-base.js +23 -0
- package/templates/finance-quote/support.js +1841 -0
- package/templates/hr-announcement/.thumbnail +0 -0
- package/templates/hr-announcement/HrAnnouncement.dc.html +64 -0
- package/templates/hr-announcement/ds-base.js +23 -0
- package/templates/hr-announcement/support.js +1841 -0
- package/templates/hr-interview-kit/.thumbnail +0 -0
- package/templates/hr-interview-kit/HrInterviewKit.dc.html +102 -0
- package/templates/hr-interview-kit/ds-base.js +23 -0
- package/templates/hr-interview-kit/support.js +1841 -0
- package/templates/hr-offboarding/.thumbnail +0 -0
- package/templates/hr-offboarding/HrOffboarding.dc.html +86 -0
- package/templates/hr-offboarding/ds-base.js +23 -0
- package/templates/hr-offboarding/support.js +1841 -0
- package/templates/hr-performance-review/.thumbnail +0 -0
- package/templates/hr-performance-review/HrPerformanceReview.dc.html +95 -0
- package/templates/hr-performance-review/ds-base.js +23 -0
- package/templates/hr-performance-review/support.js +1841 -0
- package/templates/hr-pip/.thumbnail +0 -0
- package/templates/hr-pip/HrPip.dc.html +73 -0
- package/templates/hr-pip/ds-base.js +23 -0
- package/templates/hr-pip/support.js +1841 -0
- package/templates/image-slots-demo.html +57 -0
- package/templates/kitchen-sink.html +127 -0
- package/templates/legal-msa/.thumbnail +0 -0
- package/templates/legal-msa/LegalMsa.dc.html +85 -0
- package/templates/legal-msa/ds-base.js +23 -0
- package/templates/legal-msa/support.js +1841 -0
- package/templates/legal-sow/.thumbnail +0 -0
- package/templates/legal-sow/LegalSow.dc.html +125 -0
- package/templates/legal-sow/ds-base.js +23 -0
- package/templates/legal-sow/support.js +1841 -0
- package/templates/marketing-campaign-brief/.thumbnail +0 -0
- package/templates/marketing-campaign-brief/MarketingCampaignBrief.dc.html +86 -0
- package/templates/marketing-campaign-brief/content-schema.json +139 -0
- package/templates/marketing-campaign-brief/ds-base.js +23 -0
- package/templates/marketing-campaign-brief/support.js +1841 -0
- package/templates/marketing-case-study/.thumbnail +0 -0
- package/templates/marketing-case-study/MarketingCaseStudy.dc.html +82 -0
- package/templates/marketing-case-study/content-schema.json +103 -0
- package/templates/marketing-case-study/ds-base.js +23 -0
- package/templates/marketing-case-study/support.js +1841 -0
- package/templates/marketing-launch/.thumbnail +0 -0
- package/templates/marketing-launch/MarketingLaunch.dc.html +84 -0
- package/templates/marketing-launch/ds-base.js +23 -0
- package/templates/marketing-launch/support.js +1841 -0
- package/templates/marketing-newsletter/.thumbnail +0 -0
- package/templates/marketing-newsletter/MarketingNewsletter.dc.html +109 -0
- package/templates/marketing-newsletter/ds-base.js +23 -0
- package/templates/marketing-newsletter/support.js +1841 -0
- package/templates/marketing-page/.thumbnail +0 -0
- package/templates/marketing-page/MarketingPage.dc.html +132 -0
- package/templates/marketing-page/content-schema.json +33 -0
- package/templates/marketing-page/ds-base.js +23 -0
- package/templates/marketing-page/support.js +1841 -0
- package/templates/marketing-press-release/.thumbnail +0 -0
- package/templates/marketing-press-release/MarketingPressRelease.dc.html +84 -0
- package/templates/marketing-press-release/content-schema.json +116 -0
- package/templates/marketing-press-release/ds-base.js +23 -0
- package/templates/marketing-press-release/support.js +1841 -0
- package/templates/marketing-social-kit/.thumbnail +0 -0
- package/templates/marketing-social-kit/MarketingSocialKit.dc.html +77 -0
- package/templates/marketing-social-kit/content-schema.json +54 -0
- package/templates/marketing-social-kit/ds-base.js +23 -0
- package/templates/marketing-social-kit/support.js +1841 -0
- package/templates/playground.html +79 -0
- package/templates/sales-one-pager/.thumbnail +0 -0
- package/templates/sales-one-pager/SalesOnePager.dc.html +103 -0
- package/templates/sales-one-pager/content-schema.json +73 -0
- package/templates/sales-one-pager/ds-base.js +23 -0
- package/templates/sales-one-pager/support.js +1841 -0
- package/templates/sales-proposal-deck/.thumbnail +0 -0
- package/templates/sales-proposal-deck/SalesProposalDeck.dc.html +159 -0
- package/templates/sales-proposal-deck/content-schema.json +273 -0
- package/templates/sales-proposal-deck/ds-base.js +23 -0
- package/templates/sales-proposal-deck/support.js +1841 -0
- package/templates/schema/content-schema.schema.json +31 -0
- package/templates/settings/.thumbnail +0 -0
- package/templates/settings/Settings.dc.html +86 -0
- package/templates/settings/content-schema.json +131 -0
- package/templates/settings/ds-base.js +23 -0
- package/templates/settings/support.js +1841 -0
- package/templates/slide-deck/.thumbnail +0 -0
- package/templates/slide-deck/SlideDeck.dc.html +86 -0
- package/templates/slide-deck/content-schema.json +23 -0
- package/templates/slide-deck/ds-base.js +23 -0
- package/templates/slide-deck/support.js +1841 -0
- package/templates/team-meeting-agenda/.thumbnail +0 -0
- package/templates/team-meeting-agenda/TeamMeetingAgenda.dc.html +93 -0
- package/templates/team-meeting-agenda/ds-base.js +23 -0
- package/templates/team-meeting-agenda/support.js +1841 -0
- package/templates/tech-incident-report/.thumbnail +0 -0
- package/templates/tech-incident-report/TechIncidentReport.dc.html +111 -0
- package/templates/tech-incident-report/content-schema.json +25 -0
- package/templates/tech-incident-report/ds-base.js +23 -0
- package/templates/tech-incident-report/support.js +1841 -0
- package/templates/tech-release-notes/.thumbnail +0 -0
- package/templates/tech-release-notes/TechReleaseNotes.dc.html +79 -0
- package/templates/tech-release-notes/ds-base.js +23 -0
- package/templates/tech-release-notes/support.js +1841 -0
- package/templates/tech-retro/.thumbnail +0 -0
- package/templates/tech-retro/TechRetro.dc.html +84 -0
- package/templates/tech-retro/ds-base.js +23 -0
- package/templates/tech-retro/support.js +1841 -0
- package/templates/tech-rfc/.thumbnail +0 -0
- package/templates/tech-rfc/TechRfc.dc.html +87 -0
- package/templates/tech-rfc/content-schema.json +115 -0
- package/templates/tech-rfc/ds-base.js +23 -0
- package/templates/tech-rfc/support.js +1841 -0
- package/templates/vn-appointment-transfer/.thumbnail +0 -0
- package/templates/vn-appointment-transfer/VnAppointmentTransfer.dc.html +101 -0
- package/templates/vn-appointment-transfer/ds-base.js +23 -0
- package/templates/vn-appointment-transfer/support.js +1841 -0
- package/templates/vn-certificate-of-employment/.thumbnail +0 -0
- package/templates/vn-certificate-of-employment/VnCertificateOfEmployment.dc.html +84 -0
- package/templates/vn-certificate-of-employment/ds-base.js +23 -0
- package/templates/vn-certificate-of-employment/support.js +1841 -0
- package/templates/vn-code-of-conduct/.thumbnail +0 -0
- package/templates/vn-code-of-conduct/VnCodeOfConduct.dc.html +105 -0
- package/templates/vn-code-of-conduct/ds-base.js +23 -0
- package/templates/vn-code-of-conduct/support.js +1841 -0
- package/templates/vn-compensation-regulation/.thumbnail +0 -0
- package/templates/vn-compensation-regulation/VnCompensationRegulation.dc.html +122 -0
- package/templates/vn-compensation-regulation/ds-base.js +23 -0
- package/templates/vn-compensation-regulation/support.js +1841 -0
- package/templates/vn-contract-amendment/.thumbnail +0 -0
- package/templates/vn-contract-amendment/VnContractAmendment.dc.html +107 -0
- package/templates/vn-contract-amendment/ds-base.js +23 -0
- package/templates/vn-contract-amendment/support.js +1841 -0
- package/templates/vn-contractor-agreement/.thumbnail +0 -0
- package/templates/vn-contractor-agreement/VnContractorAgreement.dc.html +120 -0
- package/templates/vn-contractor-agreement/ds-base.js +23 -0
- package/templates/vn-contractor-agreement/support.js +1841 -0
- package/templates/vn-data-protection-policy/.thumbnail +0 -0
- package/templates/vn-data-protection-policy/VnDataProtectionPolicy.dc.html +116 -0
- package/templates/vn-data-protection-policy/ds-base.js +23 -0
- package/templates/vn-data-protection-policy/support.js +1841 -0
- package/templates/vn-disciplinary-case-file/.thumbnail +0 -0
- package/templates/vn-disciplinary-case-file/VnDisciplinaryCaseFile.dc.html +172 -0
- package/templates/vn-disciplinary-case-file/ds-base.js +23 -0
- package/templates/vn-disciplinary-case-file/support.js +1841 -0
- package/templates/vn-disciplinary-schedule/.thumbnail +0 -0
- package/templates/vn-disciplinary-schedule/VnDisciplinarySchedule.dc.html +91 -0
- package/templates/vn-disciplinary-schedule/ds-base.js +23 -0
- package/templates/vn-disciplinary-schedule/support.js +1841 -0
- package/templates/vn-employee-request/.thumbnail +0 -0
- package/templates/vn-employee-request/VnEmployeeRequest.dc.html +137 -0
- package/templates/vn-employee-request/ds-base.js +23 -0
- package/templates/vn-employee-request/support.js +1841 -0
- package/templates/vn-exit-handover/.thumbnail +0 -0
- package/templates/vn-exit-handover/VnExitHandover.dc.html +228 -0
- package/templates/vn-exit-handover/ds-base.js +23 -0
- package/templates/vn-exit-handover/support.js +1841 -0
- package/templates/vn-foreign-employee-pack/.thumbnail +0 -0
- package/templates/vn-foreign-employee-pack/VnForeignEmployeePack.dc.html +129 -0
- package/templates/vn-foreign-employee-pack/content-schema.json +22 -0
- package/templates/vn-foreign-employee-pack/ds-base.js +23 -0
- package/templates/vn-foreign-employee-pack/support.js +1841 -0
- package/templates/vn-grassroots-democracy/.thumbnail +0 -0
- package/templates/vn-grassroots-democracy/VnGrassrootsDemocracy.dc.html +117 -0
- package/templates/vn-grassroots-democracy/ds-base.js +23 -0
- package/templates/vn-grassroots-democracy/support.js +1841 -0
- package/templates/vn-infosec-policy/.thumbnail +0 -0
- package/templates/vn-infosec-policy/VnInfosecPolicy.dc.html +116 -0
- package/templates/vn-infosec-policy/ds-base.js +23 -0
- package/templates/vn-infosec-policy/support.js +1841 -0
- package/templates/vn-internal-labor-regulations/.thumbnail +0 -0
- package/templates/vn-internal-labor-regulations/VnInternalLaborRegulations.dc.html +155 -0
- package/templates/vn-internal-labor-regulations/ds-base.js +23 -0
- package/templates/vn-internal-labor-regulations/support.js +1841 -0
- package/templates/vn-internship-agreement/.thumbnail +0 -0
- package/templates/vn-internship-agreement/VnInternshipAgreement.dc.html +112 -0
- package/templates/vn-internship-agreement/ds-base.js +23 -0
- package/templates/vn-internship-agreement/support.js +1841 -0
- package/templates/vn-job-description/.thumbnail +0 -0
- package/templates/vn-job-description/VnJobDescription.dc.html +85 -0
- package/templates/vn-job-description/ds-base.js +23 -0
- package/templates/vn-job-description/support.js +1841 -0
- package/templates/vn-labor-contract/.thumbnail +0 -0
- package/templates/vn-labor-contract/VnLaborContract.dc.html +180 -0
- package/templates/vn-labor-contract/ds-base.js +23 -0
- package/templates/vn-labor-contract/support.js +1841 -0
- package/templates/vn-labour-management-book/.thumbnail +0 -0
- package/templates/vn-labour-management-book/VnLabourManagementBook.dc.html +115 -0
- package/templates/vn-labour-management-book/ds-base.js +23 -0
- package/templates/vn-labour-management-book/support.js +1841 -0
- package/templates/vn-mutual-nda/.thumbnail +0 -0
- package/templates/vn-mutual-nda/VnMutualNda.dc.html +114 -0
- package/templates/vn-mutual-nda/ds-base.js +23 -0
- package/templates/vn-mutual-nda/support.js +1841 -0
- package/templates/vn-ndnca-ip/.thumbnail +0 -0
- package/templates/vn-ndnca-ip/VnNdncaIp.dc.html +157 -0
- package/templates/vn-ndnca-ip/ds-base.js +23 -0
- package/templates/vn-ndnca-ip/support.js +1841 -0
- package/templates/vn-offer-letter/.thumbnail +0 -0
- package/templates/vn-offer-letter/VnOfferLetter.dc.html +84 -0
- package/templates/vn-offer-letter/ds-base.js +23 -0
- package/templates/vn-offer-letter/support.js +1841 -0
- package/templates/vn-onboarding-checklist/.thumbnail +0 -0
- package/templates/vn-onboarding-checklist/VnOnboardingChecklist.dc.html +98 -0
- package/templates/vn-onboarding-checklist/content-schema.json +12 -0
- package/templates/vn-onboarding-checklist/ds-base.js +23 -0
- package/templates/vn-onboarding-checklist/support.js +1841 -0
- package/templates/vn-pdpl-consent/.thumbnail +0 -0
- package/templates/vn-pdpl-consent/VnPdplConsent.dc.html +111 -0
- package/templates/vn-pdpl-consent/ds-base.js +23 -0
- package/templates/vn-pdpl-consent/support.js +1841 -0
- package/templates/vn-performance-evaluation-regulation/.thumbnail +0 -0
- package/templates/vn-performance-evaluation-regulation/VnPerformanceEvaluationRegulation.dc.html +135 -0
- package/templates/vn-performance-evaluation-regulation/ds-base.js +23 -0
- package/templates/vn-performance-evaluation-regulation/support.js +1841 -0
- package/templates/vn-performance-review-form/.thumbnail +0 -0
- package/templates/vn-performance-review-form/VnPerformanceReviewForm.dc.html +129 -0
- package/templates/vn-performance-review-form/ds-base.js +23 -0
- package/templates/vn-performance-review-form/support.js +1841 -0
- package/templates/vn-phantom-stock/.thumbnail +0 -0
- package/templates/vn-phantom-stock/VnPhantomStock.dc.html +184 -0
- package/templates/vn-phantom-stock/content-schema.json +17 -0
- package/templates/vn-phantom-stock/ds-base.js +23 -0
- package/templates/vn-phantom-stock/support.js +1841 -0
- package/templates/vn-probation-contract/.thumbnail +0 -0
- package/templates/vn-probation-contract/VnProbationContract.dc.html +126 -0
- package/templates/vn-probation-contract/ds-base.js +23 -0
- package/templates/vn-probation-contract/support.js +1841 -0
- package/templates/vn-receipt-acknowledgement/.thumbnail +0 -0
- package/templates/vn-receipt-acknowledgement/VnReceiptAcknowledgement.dc.html +106 -0
- package/templates/vn-receipt-acknowledgement/ds-base.js +23 -0
- package/templates/vn-receipt-acknowledgement/support.js +1841 -0
- package/templates/vn-remote-work-policy/.thumbnail +0 -0
- package/templates/vn-remote-work-policy/VnRemoteWorkPolicy.dc.html +103 -0
- package/templates/vn-remote-work-policy/ds-base.js +23 -0
- package/templates/vn-remote-work-policy/support.js +1841 -0
- package/templates/vn-resignation-letter/.thumbnail +0 -0
- package/templates/vn-resignation-letter/VnResignationLetter.dc.html +71 -0
- package/templates/vn-resignation-letter/ds-base.js +23 -0
- package/templates/vn-resignation-letter/support.js +1841 -0
- package/templates/vn-salary-scale/.thumbnail +0 -0
- package/templates/vn-salary-scale/VnSalaryScale.dc.html +110 -0
- package/templates/vn-salary-scale/ds-base.js +23 -0
- package/templates/vn-salary-scale/support.js +1841 -0
- package/templates/vn-sow-appendix/.thumbnail +0 -0
- package/templates/vn-sow-appendix/VnSowAppendix.dc.html +70 -0
- package/templates/vn-sow-appendix/ds-base.js +23 -0
- package/templates/vn-sow-appendix/support.js +1841 -0
- package/templates/vn-termination-decision/.thumbnail +0 -0
- package/templates/vn-termination-decision/VnTerminationDecision.dc.html +80 -0
- package/templates/vn-termination-decision/ds-base.js +23 -0
- package/templates/vn-termination-decision/support.js +1841 -0
- package/templates/vn-total-rewards-appendix/.thumbnail +0 -0
- package/templates/vn-total-rewards-appendix/VnTotalRewardsAppendix.dc.html +138 -0
- package/templates/vn-total-rewards-appendix/ds-base.js +23 -0
- package/templates/vn-total-rewards-appendix/support.js +1841 -0
- package/templates/vn-training-commitment/.thumbnail +0 -0
- package/templates/vn-training-commitment/VnTrainingCommitment.dc.html +105 -0
- package/templates/vn-training-commitment/ds-base.js +23 -0
- package/templates/vn-training-commitment/support.js +1841 -0
- package/templates/vn-travel-expense-policy/.thumbnail +0 -0
- package/templates/vn-travel-expense-policy/VnTravelExpensePolicy.dc.html +113 -0
- package/templates/vn-travel-expense-policy/ds-base.js +23 -0
- package/templates/vn-travel-expense-policy/support.js +1841 -0
- package/tokens/colors.css +77 -0
- package/tokens/component-tokens.css +46 -0
- package/tokens/elements.css +300 -0
- package/tokens/elevation.css +46 -0
- package/tokens/fonts.css +51 -0
- package/tokens/motion.css +25 -0
- package/tokens/native/CSTokens.kt +255 -0
- package/tokens/native/CSTokens.swift +257 -0
- package/tokens/native/cs_tokens.dart +253 -0
- package/tokens/provenance.json +52 -0
- package/tokens/spacing.css +34 -0
- package/tokens/tokens.dtcg.json +1222 -0
- package/tokens/tokens.js +436 -0
- package/tokens/tokens.json +434 -0
- package/tokens/typography.css +67 -0
- package/tokens/viewer.html +261 -0
- package/ui_kits/deck/README.md +21 -0
- package/ui_kits/deck/index.html +120 -0
- package/ui_kits/status-hub/README.md +40 -0
- package/ui_kits/status-hub/StatusHub.jsx +270 -0
- package/ui_kits/status-hub/data.js +57 -0
- package/ui_kits/status-hub/identity-lab.html +134 -0
- package/ui_kits/status-hub/index.html +24 -0
- package/ui_kits/status-hub/login.html +65 -0
- package/ui_kits/status-hub/project.html +137 -0
- package/ui_kits/status-hub/settings.html +88 -0
- package/ui_kits/status-hub/status.css +199 -0
- package/ui_kits/website/README.md +36 -0
- package/ui_kits/website/Website.jsx +167 -0
- package/ui_kits/website/careers.html +109 -0
- package/ui_kits/website/chat.html +133 -0
- package/ui_kits/website/copy.js +76 -0
- package/ui_kits/website/index.html +24 -0
- package/ui_kits/website/site.css +121 -0
- package/ui_kits/website/work.html +119 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Conventions — authoring CyberSkill DS
|
|
2
|
+
|
|
3
|
+
Cho người và agent *mở rộng hệ thống này*. (Consumer: đọc `SKILL.md`.) Compiler là nguồn chân lý cho đếm; prose mô tả hình dạng, không bao giờ số.
|
|
4
|
+
|
|
5
|
+
## Quy tắc expansion
|
|
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 Live / Identity Lab → 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). **Không bump `VERSION` và không maintain file changelog** — version giữ 1.0.0. 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 Live và Identity Lab); 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
|
+
|
|
9
|
+
## Ba trục
|
|
10
|
+
|
|
11
|
+
Mọi bề mặt render resolve ba scope trực giao — không bao giờ mã hóa một trục trong trục khác:
|
|
12
|
+
| Trục | Attribute | Sở hữu | Pack sống ở |
|
|
13
|
+
|---|---|---|---|
|
|
14
|
+
| **Theme** | `data-theme="dark\|system"` | đảo light/dark | `tokens/colors.css` |
|
|
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
|
+
| **Language** | `lang` / Language tweak | copy EN · VI | registry component + props template |
|
|
17
|
+
|
|
18
|
+
Xử lý bề mặt là liquid-glass (cố định). 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
|
+
## Ngữ pháp đặt tên
|
|
21
|
+
|
|
22
|
+
- 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
|
+
- Classes: `.cs-<block>[-<part>][--modifier]`. Data attributes: `data-theme`, `data-cs-element`, `data-cs-variant`.
|
|
25
|
+
|
|
26
|
+
- 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
|
+
- Tên hiển thị template: `<Group> · <Artifact>` ("Finance · Invoice").
|
|
29
|
+
|
|
30
|
+
## Checklist
|
|
31
|
+
|
|
32
|
+
**Component mới** — `Name.jsx` + `Name.d.ts` + `Name.prompt.md` trong `components/<group>/`; thêm vào card html của nhóm (resolve namespace bundle **theo prefix** — `const CS = window[Object.keys(window).find(k=>/^CyberSkillDesignSystem_[0-9a-f]{6}$/.test(k))]` — không bao giờ hậu tố `…_<projectId>` hardcode); thêm vào dòng nhóm của readme. Chỉ consume token; không hex literal trừ trong `tokens/`.
|
|
33
|
+
|
|
34
|
+
**Responsive** — reflow là global (`base/responsive.css`, load cuối): media không overflow, print docs nới padding, bảng `.cs-sheet` scroll, `.cs-sidebar` thu gọn, lưới cột cố định inline thu (3+→2 tablet, →1 phone), token dài không gãy (dòng write-on `______`, URL/ID dài) nhận `overflow-wrap: anywhere` trên bề mặt doc để không chống cột phone mở, shell grid app-shell thu một cột với `main{min-width:0}`+`.cs-table-wrap` scroll, và canvas export hình học cố định (`class="cs-canvas-desk"`: decks, social) **luôn** `overflow-x:auto` để slide rộng hơn cửa sổ scroll trong desk thay vì đẩy trang rộng. Đã verify whole-set ở 390 bởi `_audit/responsive-overflow.html` (cả 84 = 0 document overflow). **Hai gotcha cứng:** (1) DC runtime compile `style="…"` inline thành object React, nên attribute render *có khoảng* — mọi selector responsive `[style*=…]` phải khớp `grid-template-columns: repeat(4, 1fr)` (colon-space, comma-space), không bao giờ dạng không-space lúc author; (2) rule CSS global chỉ override property template đặt **inline** qua selector **attribute** (`[style*="grid-template-columns: 248px 1fr"]`) — selector **class** thua inline style. Ưu tiên sửa overflow trong source template (thêm `min-width:0`, `flex-wrap:wrap` inline) hơn đấu inline từ stylesheet.
|
|
35
|
+
|
|
36
|
+
**Template mới** — `templates/<slug>/<Slug>.dc.html` với `<!-- @template name description -->` đầu tiên; `ds-base.js` giữ single-entry (`styles.css` thôi — rebind một dòng đã validate end-to-end Th7 2026 từ path sâu hơn; scaffold test đã gỡ) và publish alias độc lập-id `window.CyberSkillDS` lúc bundle load, nên mount DS component qua `component-from-global-scope="CyberSkillDS.…"` — **không bao giờ** hậu tố `CyberSkillDesignSystem_<projectId>` hardcode (đổi khi re-import; enforce bởi `_audit/namespace-portability.html`); chỉ inline styles; 1–3 tweaks (không plain copy/color — in-place editing phủ những cái đó); printable docs thêm khối print `@page` + `.cs-desk`/`.cs-sheet` và **không** mang dark tweak (print chỉ light).
|
|
37
|
+
|
|
38
|
+
**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
|
+
**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.0.0.
|
|
41
|
+
|
|
42
|
+
## Decision log (owner duyệt)
|
|
43
|
+
|
|
44
|
+
- 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
|
+
- Trục chỉ Theme × Element × Language. Xử lý bề mặt liquid-glass (cố định).
|
|
47
|
+
|
|
48
|
+
- 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
|
+
- 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
|
+
- 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
|
+
|
|
54
|
+
- **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).
|
|
55
|
+
|
|
56
|
+
- Verification dùng harness dev `_audit/` (xem `_audit/README.md`): `responsive-harness.html` (Responsive preview hướng user — **mọi** template ở 390/768/1280), `responsive-overflow.html` (gate horizontal-overflow whole-set ở 390 — **dùng fresh iframe mỗi template; tái dùng một cái race `@import` CSS và cho false positive**), và `vn-overflow.html` (ép VN trên mọi template, đo clip). Force state từ context của chính frame: `__dcSetProps(__dcRootName(), {language:"Tiếng Việt"})`, theme qua `postMessage({type:"__dc_theme",theme:"dark"})`. `_audit/` chỉ-dev — không compile, không card. Không bao giờ truyền value cho `TextField` như **children** (crash React #137 lúc re-render — input là void element); dùng `default-value` (Th7 2026).
|
|
57
|
+
|
|
58
|
+
## Đường export (theo archetype)
|
|
59
|
+
|
|
60
|
+
Mọi template export; đường đúng phụ thuộc archetype. Mọi đường giữ Unicode tiếng Việt (đã verify bằng unzip PPTX slide XML và probe standalone bundle — dấu VN sống như text native, xem `_audit/exports/`).
|
|
61
|
+
| Archetype | Đường | Ghi chú |
|
|
62
|
+
|---|---|---|
|
|
63
|
+
| Deck (`*-deck`, `slide-deck`) | **PPTX (editable)** | `gen_pptx` ở 960×540; ép VN từng slide với `showJs: __dcSetProps(__dcRootName(),{language:'Tiếng Việt'})`. Text export như native runs; chỉ Logo là ảnh. |
|
|
64
|
+
| Document (mọi cái có `@page{size:…}`) | **One-click PDF** | Cả 61 doc template mang `<meta name="omelette-owns-print">` trong raw `<head>`, nên engine print trình duyệt paginate chúng ở A4/Letter với chrome-strip `@media print`. Print CSS được scope `@media screen` nơi khác để screen reflow không rò lên giấy. |
|
|
65
|
+
| 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
|
+
| 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
|
+
|
|
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).
|
|
69
|
+
|
|
70
|
+
## Accessibility (base/a11y.css + component ARIA)
|
|
71
|
+
|
|
72
|
+
- **Focus rings có hệ thống** — vòng ochre global `:where(:focus-visible)` trong `base/reset.css`, cộng vòng ochre 3px theo component (`components/forms/navigation/controls`). Không bao giờ đặt `outline: none` trên state `:focus-visible` mà không thay vòng (regression menu-item, đã sửa Th7 2026). Soft glow 5px trong `interaction.css` chồng lên vòng 3px, không thay thế.
|
|
73
|
+
|
|
74
|
+
- **Touch targets** — `base/a11y.css` đảm bảo 44px trên `@media (pointer: coarse)` (tabs, pagination, menu items, stepper, checkbox/radio; segmented 40px trong track đã pad). Mật độ chuột desktop được giữ. `pointer: coarse` dùng có chủ đích thay breakpoint chiều rộng — touch laptop ở 1280px vẫn cần 44px. Button mang khối coarse riêng trong `components.css`.
|
|
75
|
+
|
|
76
|
+
- **Reduced motion** — `base/a11y.css` tôn trọng `prefers-reduced-motion: reduce` global (duration animation/transition gần-zero); ngoại lệ cấp component (spinner slow-spin, status pulse tắt) đã có.
|
|
77
|
+
|
|
78
|
+
- **Ngôn ngữ screen-reader** — mọi template bilingual mang root `lang`: 37 instrument tiếng Việt (`vn-*`) là `lang="vi"` tĩnh; 44 template bilingual có tweak bind `lang="{{ langAttr }}"` với Language tweak (`langAttr = language === "Tiếng Việt" ? "vi" : "en"`, inject vào `renderVals`). Template dual-block thêm bọc mỗi khối `sc-if isVN` trong `<div lang="vi" style="display:contents">` (trung lập layout) để chữ VN được đánh dấu `vi` kể cả chế độ **Both** nơi root là `en` chính. Kết quả: phát âm đúng mọi chế độ ngôn ngữ.
|
|
79
|
+
|
|
80
|
+
- **Component ARIA đủ** — mọi component tương tác ship role/label đúng (Button `aria-busy`; TextField/Textarea `aria-invalid`+`aria-describedby`+`role=alert`; Switch `role=switch`; SearchField `role=searchbox`; Menu `aria-haspopup`/`aria-expanded`/`role=menu(item)`; Pagination `nav`+`aria-current`+label prev/next; Dialog/Drawer `aria-modal`; Toast `role=status`/`region`; ConfidenceMeter `role=meter`; Accordion `aria-expanded`; Logo `role=img`/`aria-hidden`). Giữ chúng khi compose.
|
|
81
|
+
|
|
82
|
+
- **Quy tắc API void-element** — component render void element (`<input>`/`<hr>`: TextField, Checkbox, Radio, Switch, SearchField, NumberField, Slider, Divider) destructure `children` khỏi `...props` để child lạc không bao giờ spread lên void element (crash React với #137, bug từng hit `settings`). Nội dung luôn từ props tường minh (`label` / `value` / `defaultValue`), không `children`. Theo khi thêm mọi component dựa input (Th7 2026).
|
|
83
|
+
|
|
84
|
+
- **Contrast dark-theme** — mọi cặp text/surface pass WCAG AA body (9–15:1). Màu semantic có dark override (`success #4ADE80`, `danger #F87171`, `warning #FBBF24`, `info #7CB2FB`) vì semantic light-theme fail trên bề mặt tối (~2.5:1); verify mọi cặp semantic mới trên `#221710`/`#2b1e14` (toán contrast `_audit/`). Hairline border dark cố ý tinh tế (separator, không biên 3:1) (Th7 2026). **Component tương tác đặt `color`/`border-color: var(--cs-color-brand-umber)` trên bề mặt themeable** (nav-item active, nút secondary/tertiary/ghost, v.v.) PHẢI ship override `[data-theme="dark"]` — umber gần vô hình trên tối; remap sang ochre (nhấn) hoặc `--cs-color-text-primary` (body). Wordmark brand screen-template dùng `--cs-color-text-primary` (không umber hardcode) để flip ở dark; header print-doc giữ umber theo thiết kế. Cột ID/code bảng (ví dụ `R-26-07`) mang `white-space:nowrap` để mã có gạch ngang không word-break trong cột hẹp (Th7 2026, user-reported). Quy tắc umber-trên-bề-mặt-themeable giờ **enforce deterministic** bởi `_audit/contrast-guard.html` (static source lint + ma trận WCAG token-pair ghi điểm light *và* dark) — gate đáng tin mà theme advisory DOM-walk không thể (v2.21.0). Ghi chú: `accent-strong` (role "accent text on light") được APCA-validate nhưng WCAG-borderline (~3.2–4.3) cho vài pack element (tho, tho/sand, thuy/mist, moc/bamboo) — dành cho accent text semibold/large; guard liệt kê chúng advisory và chỉ gate egregious <3.0 (v2.21.1).
|
|
85
|
+
|
|
86
|
+
## RTL readiness (xác nhận Th7 2026)
|
|
87
|
+
|
|
88
|
+
Hệ thống **sẵn RTL** — `base/*.css` gần như toàn bộ author bằng CSS **logical properties** (`inline-start`/`inline-end`, `margin-inline`, `padding-block`, `border-inline-*`, `inset-inline-*`), nên đặt `dir="rtl"` mirror layout tự động. Đã verify bằng render kitchen-sink ở `dir="rtl"` — nav, nút, label căn phải, và field/error text mirrored đều flip đúng. Physical props còn lại chỉ cố ý bất biến hướng: centering `left:50%`+`translateX(-50%)` của dialog (đối xứng) và `border-right-color` của spinner (chi tiết visual xoay). Giữ CSS mới logical; dành physical `left`/`right` chỉ cho centering thật sự đối xứng. (Tiếng Việt là LTR, nên RTL không ship trong templates — nhưng nền tảng sẵn cho tenant Arabic/Hebrew.)
|
|
89
|
+
|
|
90
|
+
## Ảnh thật (image-slot retrofit)
|
|
91
|
+
|
|
92
|
+
Templates dựa gradient `.cs-aurora-wash` mặc định; để nhận photography **thật**, thả `<image-slot>` vào. Load component một lần mỗi template qua helmet (`<script src="../../image-slot.js"></script>` — path relative tới template) và đặt `<image-slot id="…" shape="rect" style="position:absolute;inset:0;z-index:0">` làm con **đầu** của hero `position:relative`, rồi chồng `.cs-aurora-wash` (z-index:1, `pointer-events:none`) và scrim umber ấm (`linear-gradient(90deg,rgba(42,26,13,.86),rgba(42,26,13,.34))`, z-index:1, `pointer-events:none`) phía trên, content ở z-index:2. Scrim giữ drop-tile trống tinh tế và copy đọc được trên mọi ảnh. Đã verify trong `marketing-case-study`; cùng pattern 4-dòng khớp `marketing-page`, `marketing-social-kit`, `culture-event-invite`, và hero `article` (mỗi cái theo request). Tham chiếu standalone: `templates/image-slots-demo.html`. Slot persist qua sidecar sibling (Th7 2026).
|
|
93
|
+
|
|
94
|
+
## Typography & locale tiếng Việt (đã verify Th7 2026)
|
|
95
|
+
|
|
96
|
+
Tiếng Việt là ngôn ngữ chính; hệ chữ xây cho nó — đã verify, không cần đổi:
|
|
97
|
+
- **Line-heights an toàn VN** — token body 1.5 / heading 1.35 / tight 1.15 chừa chỗ cho dấu chồng (dấu trên + nặng dưới). `:where(h1–h6)` mặc định 1.35 + `text-wrap: balance`; `:where(p)` nhận `text-wrap: pretty` (cả hai `base/reset.css`). Templates có thể hardcode line-height chặt hơn (≈1.0–1.15) **chỉ** trên heading hero display một dòng; heading VN nhiều dòng giữ ≥1.15.
|
|
98
|
+
|
|
99
|
+
- **Định dạng locale** — mỗi ngôn ngữ render convention riêng: **VN** dùng hậu tố `₫`, `DD/MM/YYYY`, hàng nghìn chấm (`1.000.000`); **EN** dùng tiền tố `$`, `DD Mon YYYY`, hàng nghìn phẩy (`1,000,000`). Ngày format Anh chỉ sống trong nhánh Anh — không bao giờ rò vào nhánh VN. Xác nhận bằng scan mọi template.
|
|
100
|
+
|
|
101
|
+
## Whole-set state audits — language · theme · responsive (mỗi cái một pass riêng, Th7 2026)
|
|
102
|
+
|
|
103
|
+
Doctrine owner: language, theme, và responsive mỗi cái có pass whole-set RIÊNG; một state sạch không phải bằng chứng cho state khác. Cả ba giờ race-free, manifest-driven, gate pass/fail **all-84** trên cùng pattern — **fresh single-navigation iframe mỗi template** (tái dùng một iframe qua `src` swap race CSS `@import` và cho kết quả sai), state ép qua `__dcSetProps`, settle, rồi đo:
|
|
104
|
+
- **Language** — `_audit/language-overflow.html` — ép `Tiếng Việt`; 0 VN overflow/clip @390; cũng assert VN thật sự áp dụng trên mọi template.
|
|
105
|
+
|
|
106
|
+
- **Theme** — `_audit/theme-overflow.html` — ép dark; hard gate = dark-applies + 0 dark overflow @390 + 0 fail contrast leaf-text solid-bg mở ngoài `REVIEWED_OK`.
|
|
107
|
+
|
|
108
|
+
## Theme-overflow contrast là hard gate (Th7 2026)
|
|
109
|
+
|
|
110
|
+
`theme-overflow.html` fail `window.__theme.pass` trên fail WCAG AA tái lập được cho leaf text trên nền solid đọc được, trừ template trong allowlist `REVIEWED_OK` của trang (hiện: ba canvas deck có eyebrow accent-bright trên accent-strong ~4.22:1 — pack APCA dark vẫn pass; không retune token cho near-miss WCAG body đó). Walker chuyển nền oklab/`color-mix` qua canvas để bề mặt element-pack không bị nhầm với fallback `body` sáng. Gradient / image / wash brand bị skip (không tính được). **CTA đặc trên màn themeable** dùng `background: var(--cs-accent-strong); color: var(--cs-accent-on)` — pack dark đặt `--cs-accent-on` = cream cho `on/strong` (APCA ≥ 75); cream trên `--cs-accent-bright` fail. Print / VN legal light-only vẫn n/a. Proof kèm: `contrast-guard.html`, `apca-dark-preview.html`, `docs/contrast-report.md`.
|
|
111
|
+
|
|
112
|
+
## Token exports (Th7 2026)
|
|
113
|
+
|
|
114
|
+
Export token máy đọc được sống trong `tokens/`: `tokens.json` (nhóm theo category + map scope-override), `tokens.js` (ESM), và `tokens.dtcg.json` (**W3C DTCG** — `$value`/`$type`, key CSS-var cho round-trip lossless tới `styles.css`, override dark/system + element + expression dưới `$extensions`; cho Tokens Studio for Figma / Style Dictionary). Cả ba generate từ `tokens/*.css` qua `tokens.json` — regen **cả** sau mọi đổi token (Expansion rule).
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Quyết định (maintainer)
|
|
2
|
+
|
|
3
|
+
Các lựa chọn của owner định hình CI, đồng bộ Figma, và phân phối. How-to nằm ở `docs/figma.md` và `docs/ci-cd.md` — file này chỉ là biên bản quyết định. Không phải hướng dẫn consumer.
|
|
4
|
+
|
|
5
|
+
## 1. Whole-set audits trên mọi PR
|
|
6
|
+
|
|
7
|
+
**Lựa chọn owner: B — Bật trên mọi PR** (Th7 2026)
|
|
8
|
+
|
|
9
|
+
`whole-set-audits` chạy trên push, pull_request, schedule (`0 3 * * *`), và `workflow_dispatch`. Dự kiến ~15–20 phút cho job đó.
|
|
10
|
+
|
|
11
|
+
## 2. Pixel-threshold CI auto-fail
|
|
12
|
+
|
|
13
|
+
**Lựa chọn owner: bật — hard gate** (Th7 2026)
|
|
14
|
+
|
|
15
|
+
So sánh `%` pixel Playwright (`_audit/ci/pixel-diff.mjs`) là hard gate. Drift trên ngưỡng làm fail hàng Pixel CI trên board và job CI `pixel-diff` (không `continue-on-error`). Trang review side-by-side visual / component baseline vẫn advisory (drift đánh giá bằng mắt). Sau redesign có chủ đích, làm mới `_audit/baselines/` bằng `--update` và commit các PNG.
|
|
16
|
+
|
|
17
|
+
## 3. Figma / Tokens Studio
|
|
18
|
+
|
|
19
|
+
**Lựa chọn owner: A — non-Enterprise hiện tại** (Th7 2026)
|
|
20
|
+
|
|
21
|
+
Giữ plan Figma hiện tại. Variables REST API chỉ Enterprise — job ghi **soft-skip** (exit 0 + report) khi plan hoặc secret không hoàn tất được write. Soft-skip đó **không** phải sync Variables live — đừng coi CI xanh là chứng minh Figma Variables đã cập nhật. Đồng bộ màu = hand-sync và/hoặc Tokens Studio từ `tokens/tokens.dtcg.json`. Xem `docs/figma.md`.
|
|
22
|
+
|
|
23
|
+
## 4. Live hub = chỉ Storybook
|
|
24
|
+
|
|
25
|
+
**Lựa chọn owner: Storybook là live hub duy nhất** (Th7 2026)
|
|
26
|
+
|
|
27
|
+
- Operator dùng Storybook tại `/` cho Theme × Element × Language và ma trận điều khiển component.
|
|
28
|
+
- Không có trang Live View riêng trong tree.
|
|
29
|
+
- Legacy `/dashboard`, `/dashboard/`, `/dashboard.html`, `/dashboard/:path*`, `/playground`, `/playground/`, `/playground/:path*` redirect về `/`.
|
|
30
|
+
- Atomic View portable và HTML tĩnh khác vẫn phục vụ gate zero-build và consumer; chúng không phải entry sản phẩm của site.
|
|
31
|
+
- Bản đồ bề mặt: `docs/live-hub.md`.
|
|
32
|
+
|
|
33
|
+
## 5. Hai nguồn token JSON
|
|
34
|
+
|
|
35
|
+
**Lựa chọn owner: giữ cả `tokens.json` và `tokens.dtcg.json`** (Th7 2026)
|
|
36
|
+
|
|
37
|
+
| File | Vai trò |
|
|
38
|
+
|---|---|
|
|
39
|
+
| `tokens/tokens.dtcg.json` | Interchange W3C DTCG / regen native |
|
|
40
|
+
| `tokens/tokens.json` | Export nhóm theo hướng CSS |
|
|
41
|
+
| `tokens/*.css` + `styles.css` | UI runtime |
|
|
42
|
+
|
|
43
|
+
## 6. Code Connect — đường đã ship; **hoãn** trên Figma free
|
|
44
|
+
|
|
45
|
+
**Trạng thái: provisional / soft-skip — không phải publish library live** (Th7 2026; hoãn Th7 2026)
|
|
46
|
+
|
|
47
|
+
- Job CI `code-connect` + `figma.config.json` + 99 mapping `*.figma.tsx` đã trong repo (snippet import dùng `@cyberskill/design`).
|
|
48
|
+
- Publish soft-skip khi thiếu secret hoặc API trả 403/404/429. Soft-skip ≠ publish Code Connect thành công.
|
|
49
|
+
- **Owner hoãn:** giữ **Figma free / non-Org** — không theo đuổi Code Connect live đến khi có ghế Org/Enterprise và team library đã publish. Khi đó thay stub `9999:*` trong `code-connect/node-map.json` bằng `nodeId` thật. Xem `docs/figma.md`.
|
|
50
|
+
|
|
51
|
+
## 7. npm publish — đường đã ship; đang mở khóa
|
|
52
|
+
|
|
53
|
+
**Trạng thái: sẵn sàng vận hành; package chưa có trên registry dưới tên `@cyberskill/design`** (Th7 2026)
|
|
54
|
+
|
|
55
|
+
- `package.json` là `private: false`; tên package **`@cyberskill/design`** (convention scoped `@cyberskill/*`; `publishConfig.access: public`); `prepublishOnly` chạy `build:bundle` + `build:design-md --check`.
|
|
56
|
+
- Workflow `.github/workflows/npm-publish.yml` trên `workflow_dispatch` / tag `v*`; thiếu `NPM_TOKEN` thì job **soft-skip** (exit 0 + báo cáo tarball). Soft-skip ≠ release đã publish.
|
|
57
|
+
- **Tiến độ owner:** org npm **`@cyberskill`** đã publish package khác; `NPM_TOKEN` đã đặt trên repo. **Vẫn cần:** chạy **Actions → npm-publish → Run workflow** một lần để `@cyberskill/design@1.0.0` lên registry, rồi cấp **grant consumer tường minh** (văn bản chính sách — không phải secret) cho team được phép cài. License giữ **UNLICENSED**; phiên bản giữ **1.0.0**. Xem `docs/consuming.md`.
|
|
58
|
+
|
|
59
|
+
## 8. Đóng gói store native — scaffold đã ship; submit tắt
|
|
60
|
+
|
|
61
|
+
**Trạng thái: đường Fastlane live; secret signing do operator sở hữu; không submit store** (Th7 2026)
|
|
62
|
+
|
|
63
|
+
- Scaffold dưới `examples/native/{swiftui,compose,flutter}/fastlane/` + placeholder metadata listing.
|
|
64
|
+
- Workflow `.github/workflows/native-store.yml`; dry-run luôn; kiểm signed-release cần `ASC_KEY_ID` / `ASC_ISSUER_ID` / `ASC_KEY_P8` / `PLAY_SERVICE_ACCOUNT_JSON`.
|
|
65
|
+
- Lane `upload_store` từ chối submit — sample vẫn là sample đến khi có nhu cầu sản phẩm. Xem `examples/native/README.md`.
|
|
66
|
+
|
|
67
|
+
## 9. Registry products — đã khóa
|
|
68
|
+
|
|
69
|
+
**Lựa chọn owner: khóa registry product → element** (Th7 2026)
|
|
70
|
+
|
|
71
|
+
`docs/products.md` (+ `docs/vi/products.md`) là nguồn chân lý **đã khóa** cho tám ánh xạ portfolio. Agent và kit phải dùng các hàng đó; không invent ánh xạ product → element mới. Mọi thay đổi cần sửa biên bản quyết định này trong cùng change.
|
|
72
|
+
|
|
73
|
+
## Mặc định roadmap (mở khóa phân phối)
|
|
74
|
+
|
|
75
|
+
Ghi nhận Th7 2026 — mặc định mở khóa (cập nhật khi bước vận hành xong):
|
|
76
|
+
|
|
77
|
+
- **Figma Variables** — giữ Tokens Studio / non-Enterprise (quyết định §3). Soft-skip Variables REST vẫn trung thực.
|
|
78
|
+
- **Code Connect** — **bỏ qua khi còn Figma free**; chỉ xem lại sau Org + library đã publish + `nodeId` thật (quyết định §6). Soft-skip ≠ publish.
|
|
79
|
+
- **npm** — org `@cyberskill` + `NPM_TOKEN` sẵn sàng; lần publish đầu `@cyberskill/design` + grant consumer viết tay vẫn do owner chạy (quyết định §7). Soft-skip ≠ release đã publish của *package này*.
|
|
80
|
+
|
|
81
|
+
## Việc maintainer (đang mở)
|
|
82
|
+
|
|
83
|
+
Theo dõi vận hành — không phải marketing sản phẩm, không phải backlog công khai:
|
|
84
|
+
|
|
85
|
+
1. **Code Connect** — hoãn (Figma free). Khi lên Org: thay stub `9999:*` trong `code-connect/node-map.json` bằng node ID library đã publish.
|
|
86
|
+
2. **npm publish lần đầu + grant** — ~~org / `NPM_TOKEN`~~ **xong**. Còn lại: Actions → **npm-publish** → Run workflow; xác nhận `npm view @cyberskill/design`; viết grant consumer cho team được duyệt (xem `docs/consuming.md`).
|
|
87
|
+
|
|
88
|
+
~~3. Chốt registry products~~ — **xong** (Th7 2026): xem quyết định §9; `docs/products.md` đã khóa.
|
|
89
|
+
|
|
90
|
+
Schema sidecar và Storybook `FullMatrix` tiếp tục lớn **theo cơ hội** khi primary đã đủ điều kiện (hiện chỉ Button có FullMatrix theo contract) — không phải đợt mass-add. Xem `docs/quality-gates.md`.
|
|
91
|
+
|
|
92
|
+
## Cách đổi một quyết định
|
|
93
|
+
|
|
94
|
+
Sửa dòng **Lựa chọn owner** tại đây. Người triển khai nối lại CI và docs liên quan trong cùng một change.
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Deploy site Atomic live (Vercel / VPS / mọi static host)
|
|
2
|
+
|
|
3
|
+
Hai track:
|
|
4
|
+
|
|
5
|
+
1. **Design system portable (consumers)** — vẫn là cây file tĩnh: không cần bundler. Link `styles.css` + tùy chọn `_ds_bundle.js` / ESM. Claude Design, Google Stitch, và product app không cần Node hay Storybook.
|
|
6
|
+
2. **Host site (`design.cyberskill.world`)** — output tĩnh đóng gói cho Vercel. Packaging **có** chạy Node một lần lúc deploy để Storybook ship làm bề mặt sản phẩm tại `/`. Vẫn không có app server chạy dài.
|
|
7
|
+
|
|
8
|
+
Production **`/`** là build tĩnh Storybook. Legacy `/dashboard`, `/dashboard/`, `/dashboard.html`, `/dashboard/:path*`, `/playground`, `/playground/`, và `/playground/:path*` redirect về `/`.
|
|
9
|
+
|
|
10
|
+
## Vercel (khuyến nghị)
|
|
11
|
+
|
|
12
|
+
1. Push repo (xem `docs/sync.md`) lên GitHub.
|
|
13
|
+
2. Vercel → **Add New Project** → import repo.
|
|
14
|
+
3. **Framework preset: "Other"** (không Next.js/CRA). Ưu tiên tin `vercel.json` hơn là gõ lệnh trên dashboard.
|
|
15
|
+
4. Deploy. `/` phục vụ Storybook. URL hub/playground cũ 301 về `/`.
|
|
16
|
+
5. Custom domain: Project → Settings → Domains, thêm domain, trỏ DNS theo hướng dẫn Vercel.
|
|
17
|
+
|
|
18
|
+
**`vercel.json` khóa đường đóng gói host:**
|
|
19
|
+
|
|
20
|
+
| Field | Value | Why |
|
|
21
|
+
|---|---|---|
|
|
22
|
+
| `framework` | `null` | Không auto-detect framework |
|
|
23
|
+
| `installCommand` | `npm install` | Chỉ-host: cài Storybook/dev tooling cho build sản phẩm tĩnh |
|
|
24
|
+
| `buildCommand` | `npm run build:site` | `build:storybook` rồi `scripts/vercel-static-output.mjs` |
|
|
25
|
+
| `outputDirectory` | `.vercel-static` | Webroot đóng gói (cây portable + Storybook overlay ở root) |
|
|
26
|
+
| `redirects` | `/dashboard`, `/dashboard/`, `/dashboard.html`, `/dashboard/:path*`, `/playground`, `/playground/`, `/playground/:path*` → `/` | Nghỉ hub HTML cũ và path Storybook subdirectory |
|
|
27
|
+
|
|
28
|
+
Tương đương local: `npm install && npm run build:site`, rồi serve `.vercel-static/`.
|
|
29
|
+
|
|
30
|
+
Consumer clone repo vẫn mở file trực tiếp — họ **không** chạy `build:site`.
|
|
31
|
+
|
|
32
|
+
## Ảnh social preview (OG)
|
|
33
|
+
|
|
34
|
+
Ship cho production (`design.cyberskill.world`):
|
|
35
|
+
- Head manager Storybook (`.storybook/manager-head.html`) và stub redirect `dashboard.html` gồm:
|
|
36
|
+
- `og:image` → `https://design.cyberskill.world/assets/og-dashboard.png`
|
|
37
|
+
- `twitter:card` = `summary_large_image`
|
|
38
|
+
- `twitter:image` (cùng URL)
|
|
39
|
+
- `og:url` / canonical → `https://design.cyberskill.world/`
|
|
40
|
+
|
|
41
|
+
Nếu host dưới **domain khác**, đổi absolute URL trong các meta tag cho khớp origin, hoặc re-export PNG và giữ path `assets/og-dashboard.png`.
|
|
42
|
+
|
|
43
|
+
**Misconfig thường gặp:** chọn preset JS framework (Next/CRA) — Vercel chạy đồ thị build sai và có thể 404 root docs. Preset phải giữ **"Other"** và `vercel.json` phải sở hữu install/build/output (xem bảng trên). `package.json` có thể publish (`"private": false`) cho đường npm; nó cũng mang script **chỉ-host** (`build:storybook`, `build:site`, verify/test) mà product app không nên phụ thuộc (xem `docs/consuming.md` và `docs/storybook.md`). Packaging copy webroot portable rồi overlay Storybook tại root `.vercel-static/` (path portable như `/styles.css`, `/_audit/`, `/guidelines/` vẫn cạnh asset Storybook). **Phân biệt misconfig hosting với bug docs thật:** mở `/_audit/docs-consistency.html` trên URL *đã deploy* — gate phát hiện body HTML/error nơi lẽ ra là raw `.md`/`.json` và báo "hosting is intercepting this path".
|
|
44
|
+
|
|
45
|
+
## VPS generic / nginx / mọi static host
|
|
46
|
+
|
|
47
|
+
**Không Storybook:** serve root repo làm webroot (chỉ cây portable).
|
|
48
|
+
|
|
49
|
+
**Có Storybook tại `/`:** chạy `npm run build:site` trên host hoặc CI, rồi serve `.vercel-static/` làm webroot. Cấu hình cùng redirect như `vercel.json` (`/dashboard`, `/dashboard/`, `/dashboard.html`, `/dashboard/:path*`, `/playground`, `/playground/`, `/playground/:path*` → `/`) nếu host hỗ trợ.
|
|
50
|
+
|
|
51
|
+
Ví dụ Nginx (`.vercel-static` làm `root`):
|
|
52
|
+
server {
|
|
53
|
+
server_name design.cyberskill.world;
|
|
54
|
+
root /var/www/design-system/.vercel-static;
|
|
55
|
+
index index.html;
|
|
56
|
+
location = /dashboard { return 301 /; }
|
|
57
|
+
location = /dashboard/ { return 301 /; }
|
|
58
|
+
location = /dashboard.html { return 301 /; }
|
|
59
|
+
location ^~ /dashboard/ { return 301 /; }
|
|
60
|
+
location = /playground { return 301 /; }
|
|
61
|
+
location /playground/ { return 301 /; }
|
|
62
|
+
}
|
|
63
|
+
Path portable vẫn là file thật (`guidelines/atomic-view.html`, `_audit/run.html`, `styles.css`, v.v.). Storybook sở hữu `/` và `/index.html`.
|
|
64
|
+
|
|
65
|
+
## Checklist sau deploy
|
|
66
|
+
1. Mở `/` — xác nhận Storybook load (không 404, directory listing, hay shell dashboard cũ).
|
|
67
|
+
2. Mở `/_audit/run.html` — để board chạy xong, xác nhận mọi fast gate pass trên bản *đã deploy* (CDN cache, MIME type, hoặc file thiếu có thể lộ ở đây dù check local sạch).
|
|
68
|
+
3. Nếu có đỏ, đọc hàng gate fail và mở trang gate đó để chi tiết — xem `docs/consuming.md` → "After import — prove health".
|
|
69
|
+
4. Kiểm `/guidelines/atomic-view.html` load trực tiếp (trang nặng nhất — React + compiled bundle qua mạng).
|
|
70
|
+
5. Xác nhận `/dashboard.html` và `/playground/` redirect về `/`, và một story vẫn render (ví dụ Components/Button).
|
|
71
|
+
|
|
72
|
+
## Việc KHÔNG làm
|
|
73
|
+
- Đừng ép **consumer** qua Storybook hoặc app bundler — hợp đồng của họ vẫn là clone-and-link `styles.css` (+ bundle tùy chọn). Host-site packaging (`build:site`) chỉ cho shell Storybook `/` của site live này và layout package tĩnh.
|
|
74
|
+
- Đừng đổi Vercel framework preset khỏi "Other" / `framework: null`.
|
|
75
|
+
- Đừng gitignore bất kỳ thư mục top-level nào ngoài những gì `.gitignore` đã liệt kê (`uploads/`, `scraps/`, `_audit/exports/`, `storybook-static/`, `.vercel-static/`) — mọi thư mục khác, **kể cả tiền tố underscore như `_esm/`**, là source và phải ship trong cây portable. Xem `docs/sync.md`.
|
|
76
|
+
- Đừng đặt Storybook dưới `/playground/` nữa — `base: '/'` trong `.storybook/main.js` kỳ vọng asset tại domain root.
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
## Protocol re-run Health sau deploy (release gate)
|
|
80
|
+
|
|
81
|
+
Sau mỗi deploy production:
|
|
82
|
+
2. Mở `docs/viewer.html#README.md` — body không được kẹt ở Loading…
|
|
83
|
+
3. `curl -sS https://<host>/VERSION` phải trả plain semver text, không HTML.
|
|
84
|
+
4. `curl -sS -I https://<host>/package.json` phải là `application/json` hoặc `text/plain`, không SPA shell.
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
## Ghi chú Content-Security-Policy
|
|
88
|
+
|
|
89
|
+
Static hosting có thể ship CSP chặt. Allowance điển hình cho hệ thống này:
|
|
90
|
+
- `script-src 'self' https://unpkg.com` nếu load React từ CDN cho Atomic View
|
|
91
|
+
- `font-src 'self'`
|
|
92
|
+
|
|
93
|
+
- `img-src 'self' data:`
|
|
94
|
+
Ưu tiên self-host React cạnh `_ds_bundle.js` cho cài air-gapped.
|
|
95
|
+
|
|
96
|
+
## OG đa domain
|
|
97
|
+
|
|
98
|
+
Meta production trỏ `https://design.cyberskill.world/assets/og-dashboard.png`. Trên host khác, chỉ thay absolute origin trong `.storybook/manager-head.html` (và stub `dashboard.html`) `og:image` / `twitter:image` / `og:url` — giữ path `/assets/og-dashboard.png`.
|
|
99
|
+
|
|
100
|
+
## Bề mặt sản phẩm Storybook (chỉ-host)
|
|
101
|
+
|
|
102
|
+
Path production: **`/`** (Storybook static export overlay trên `.vercel-static/`).
|
|
103
|
+
|
|
104
|
+
| Lệnh | Kết quả |
|
|
105
|
+
|---|---|
|
|
106
|
+
| `npm run storybook` | Dev server (chỉ local) |
|
|
107
|
+
| `npm run build:storybook` | Ghi `storybook-static/` với `base: '/'` |
|
|
108
|
+
| `npm run build:site` | Build Storybook + cây portable → `.vercel-static/` (Storybook ở root) |
|
|
109
|
+
|
|
110
|
+
Xem `docs/storybook.md`. Consumer portable không cần đường này — họ dùng `styles.css` + `_ds_bundle.js` / ESM.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Phong cách thiết kế
|
|
2
|
+
|
|
3
|
+
Xử lý bề mặt hiện tại là **liquid-glass** (cố định). Các trục styling sống là **Theme × Element × Language** thôi.
|
|
4
|
+
| Trục | Cách đặt | Thay đổi gì |
|
|
5
|
+
|---|---|---|
|
|
6
|
+
| **Theme** | `data-theme="light\|dark"` | màu semantic sáng/tối |
|
|
7
|
+
| **Element** | `data-cs-element` + tùy chọn `data-cs-variant` | bản sắc sản phẩm Ngũ Hành (15 pack) |
|
|
8
|
+
| **Language** | `lang` / Language tweak | bản sao EN · VI |
|
|
9
|
+
|
|
10
|
+
## Xử lý cố định
|
|
11
|
+
|
|
12
|
+
- Vật liệu liquid-glass (`cs-surface-*`) là ngôn ngữ bề mặt mặc định.
|
|
13
|
+
|
|
14
|
+
- Radius, shadow và token kính đến từ hệ base — không phải trục "style pack" song song.
|
|
15
|
+
|
|
16
|
+
- Từ chối theo doctrine: hue neon/cyberpunk lạnh, memphis vui nhộn, skeuomorphism đầy đủ, emoji trong chrome UI.
|
|
17
|
+
|
|
18
|
+
## Thêm một look mới
|
|
19
|
+
|
|
20
|
+
Ưu tiên:
|
|
21
|
+
1. **Element** hoặc **variant** mới khi dịch chuyển là hue/bản sắc.
|
|
22
|
+
2. Composition cục bộ với token/class sẵn có khi dịch chuyển là layout một lần.
|
|
23
|
+
3. Pattern đã ghi trong `docs/conventions.md` + specimen card khi pattern cần tái sử dụng.
|
|
24
|
+
|
|
25
|
+
Không invent trục sản phẩm thứ tư nếu chưa Expansion Rule qua tokens, Storybook Live, templates, docs và gates.
|
package/docs/vi/figma.md
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# Figma / Tokens Studio — ghi chú
|
|
2
|
+
|
|
3
|
+
## Những gì ship trong repo
|
|
4
|
+
- Design tokens dạng CSS + DTCG (`tokens/tokens.dtcg.json`) kèm mirror native Swift/Kotlin/Flutter.
|
|
5
|
+
- UI kits dưới `ui_kits/` là tái tạo HTML giữ pixel-faithful theo doctrine brand (Identity Lab Thổ-first).
|
|
6
|
+
- Mapping **Code Connect** cho cả **99** public primaries (`components/**/*.figma.tsx` + `figma.config.json` + `code-connect/node-map.json`).
|
|
7
|
+
|
|
8
|
+
## Công thức import Tokens Studio (hand-sync)
|
|
9
|
+
|
|
10
|
+
Interchange màu/type/spacing khuyến nghị đến khi org thiết kế lên Figma Enterprise (Variables REST). Nguồn chân lý vẫn **code → design**.
|
|
11
|
+
|
|
12
|
+
1. Mở file Figma đích (cùng file với `FIGMA_FILE_KEY` khi đã có secrets).
|
|
13
|
+
2. Cài / mở **[Tokens Studio](https://tokens.studio/)** (plugin Figma).
|
|
14
|
+
3. **Import** → chọn **W3C DTCG / JSON** → chọn file repo `tokens/tokens.dtcg.json` (hoặc dán nội dung).
|
|
15
|
+
4. Map token set vào một collection (ví dụ **CyberSkill Tokens**). Ưu tiên giữ key CSS-var / nhóm slash gần với `toFigmaName` của `_audit/ci/push-figma-variables.mjs` (`color/brand/umber`, …) để REST push Enterprise sau này không đổi tên hàng loạt.
|
|
16
|
+
5. Áp token vào local variables / styles trong Figma. Re-import sau token PR — **không** round-trip chỉnh sửa phía design vào DTCG trừ khi cố ý sở hữu thay đổi đó trong code.
|
|
17
|
+
6. Tùy chọn: Style Dictionary / consumer DTCG khác đọc cùng file; mirror native vẫn generate qua `node _audit/ci/generate-native-tokens.mjs`.
|
|
18
|
+
|
|
19
|
+
**Ghi chú phạm vi:** REST auto-push (bên dưới) chỉ phủ leaf **màu**. Tokens Studio có thể mang spacing/type/shadow từ cùng file DTCG bằng tay.
|
|
20
|
+
|
|
21
|
+
## Push biến màu tự động
|
|
22
|
+
|
|
23
|
+
Job CI **`figma-variables-push`** (trong `.github/workflows/design-system-gates.yml`) đọc `tokens/tokens.dtcg.json` và tạo/cập nhật collection biến local Figma **CyberSkill Tokens** với biến màu.
|
|
24
|
+
|
|
25
|
+
| Trigger | Hành vi |
|
|
26
|
+
|---|---|
|
|
27
|
+
| Push lên `main` | Chạy push (cần secrets) |
|
|
28
|
+
| `workflow_dispatch` | Chạy thủ công từ tab Actions |
|
|
29
|
+
| PR | Không push (tránh nhiễu); dry helpers vẫn có local |
|
|
30
|
+
|
|
31
|
+
### Secrets (repo → Settings → Secrets and variables → Actions)
|
|
32
|
+
|
|
33
|
+
| Tên | Giá trị |
|
|
34
|
+
|---|---|
|
|
35
|
+
| `FIGMA_TOKEN` | Figma personal access token với scope **Variables** (và scope Code Connect khi publish mapping) |
|
|
36
|
+
| `FIGMA_FILE_KEY` | File key từ `https://www.figma.com/design/<KEY>/...` |
|
|
37
|
+
|
|
38
|
+
Phải là **repository secrets** dưới tab Actions (tên đúng, phân biệt hoa thường). Không phải Environment secrets (chỉ inject khi job đặt `environment:`), không Variables, và không org secrets loại trừ repo này. Log CI khi thiếu secret hiện `FIGMA_TOKEN:` / `FIGMA_FILE_KEY:` giá trị rỗng.
|
|
39
|
+
|
|
40
|
+
**Scope bắt buộc cho Variables push** (từ [Figma scopes](https://developers.figma.com/docs/rest-api/scopes/) + [Variables API](https://developers.figma.com/docs/rest-api/variables/)):
|
|
41
|
+
|
|
42
|
+
| Scope | Vì sao | Availability |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| `file_variables:read` | `GET /v1/files/:key/variables/local` | **Chỉ Enterprise** |
|
|
45
|
+
| `file_variables:write` | tạo/cập nhật collection + biến màu | **Chỉ Enterprise** |
|
|
46
|
+
| `file_content:read` / `file_metadata:read` | xác nhận truy cập file trước push | mọi plan |
|
|
47
|
+
|
|
48
|
+
Nếu hover PAT chỉ thấy scope kiểu `file_content:read`, `file_comments:*`, `webhooks:*`, `library_*` — đó là bình thường trên ghế **Professional / Organization**. Figma **không liệt kê** `file_variables:*` trừ khi account là **Enterprise**. Tạo lại PAT trên plan non-Enterprise không mở được Variables REST API.
|
|
49
|
+
|
|
50
|
+
**CI làm gì hôm nay:** secrets + mở file chạy trên mọi plan; Variables write soft-skip kèm report khi Figma trả 403 / scope không hợp lệ cho `file_variables` (để gates vẫn xanh). Auto-push đầy đủ cần Enterprise + hai scope đó trên PAT.
|
|
51
|
+
|
|
52
|
+
**Lựa chọn non-Enterprise:** hand-sync colour styles từ `tokens/tokens.dtcg.json`, hoặc dùng [Tokens Studio](https://tokens.studio/) / Plugin API trong desktop app (đường plugin không dùng job REST này) — xem công thức import ở trên.
|
|
53
|
+
|
|
54
|
+
### Local
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
# không secrets — chỉ in plan
|
|
58
|
+
node _audit/ci/push-figma-variables.mjs --dry-run
|
|
59
|
+
|
|
60
|
+
# với secrets trong env (không bao giờ commit)
|
|
61
|
+
export FIGMA_TOKEN=...
|
|
62
|
+
export FIGMA_FILE_KEY=...
|
|
63
|
+
node _audit/ci/push-figma-variables.mjs --check # truy cập file + list collections
|
|
64
|
+
node _audit/ci/push-figma-variables.mjs # tạo/cập nhật màu
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Sau push thành công, mở file trong Figma → **Local variables** → collection **CyberSkill Tokens**.
|
|
68
|
+
|
|
69
|
+
### Lấy Figma token ở đâu
|
|
70
|
+
|
|
71
|
+
1. Đăng nhập [figma.com](https://www.figma.com).
|
|
72
|
+
2. **Settings → Security → Personal access tokens** → generate.
|
|
73
|
+
3. File key: mở file đích; đoạn URL sau `/design/` hoặc `/file/`.
|
|
74
|
+
|
|
75
|
+
## Figma Code Connect (live + soft-skip)
|
|
76
|
+
|
|
77
|
+
**Quyết định 1C:** đường publish đã nối; CI **soft-skip** (exit 0 + `code-connect-report.json`) khi thiếu `FIGMA_TOKEN` / `FIGMA_FILE_KEY` hoặc API trả **403 / 404 / 429** (plan, node chưa publish, rate limit).
|
|
78
|
+
|
|
79
|
+
| Thành phần | Đường |
|
|
80
|
+
|---|---|
|
|
81
|
+
| Config | `figma.config.json` (parser React, `components/**/*.figma.tsx`) |
|
|
82
|
+
| Node registry | `code-connect/node-map.json` (mỗi primary: `nodeId` + cờ `published`) |
|
|
83
|
+
| Mapping | `components/**/<Name>.figma.tsx` — **99** primaries; Button / TextField / Dialog / Card / Alert có prop map; còn lại là stub |
|
|
84
|
+
| Generator | `npm run code-connect:generate` → `_audit/ci/generate-code-connect.mjs` |
|
|
85
|
+
| Job CI | `code-connect` trong `design-system-gates.yml` (PR + `main` + thủ công) |
|
|
86
|
+
| Dry-run local | `npm run code-connect:dry-run` (không secrets; assert config + ≥99 file) |
|
|
87
|
+
|
|
88
|
+
URL tài liệu dùng file key placeholder **`CS_FIGMA_FILE_KEY`**. Publish thay `FIGMA_FILE_KEY` qua `documentUrlSubstitutions`.
|
|
89
|
+
|
|
90
|
+
### Checklist operator (lần publish thật đầu tiên)
|
|
91
|
+
|
|
92
|
+
1. Publish từng Figma component lên **team library** (Code Connect yêu cầu component đã publish; plan Org/Enterprise).
|
|
93
|
+
2. Đặt `nodes.<Name>.nodeId` trong `code-connect/node-map.json` (dạng colon hoặc hyphen) và `published: true`.
|
|
94
|
+
3. `npm run code-connect:generate` để viết lại URL `.figma.tsx`.
|
|
95
|
+
4. Có secrets: `node _audit/ci/code-connect-publish.mjs` (hoặc để job CI chạy trên `main`).
|
|
96
|
+
|
|
97
|
+
Đến khi có node ID thật, stub tổng hợp `9999:*` vẫn còn; publish báo cáo và thoát sạch trên 404. Blocker còn lại: `docs/decisions.md` §6.
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
npm run code-connect:dry-run
|
|
101
|
+
# với secrets
|
|
102
|
+
export FIGMA_TOKEN=...
|
|
103
|
+
export FIGMA_FILE_KEY=...
|
|
104
|
+
node _audit/ci/code-connect-publish.mjs
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Hand-sync / Tokens Studio (quyết định A của owner — non-Enterprise)
|
|
108
|
+
|
|
109
|
+
Đường khuyến nghị đến khi org thiết kế lên Enterprise:
|
|
110
|
+
|
|
111
|
+
1. Coi `tokens/tokens.dtcg.json` là nguồn interchange màu/type/spacing.
|
|
112
|
+
2. **Tokens Studio** (hoặc tương tự): theo công thức import ở trên; chỉ re-export khi cố ý đổi giá trị phía design (ưu tiên hướng code → design).
|
|
113
|
+
3. Bản đồ hand-sync: đường DTCG → tên biến Figma qua cùng naming slash như `_audit/ci/push-figma-variables.mjs` (`toFigmaName`).
|
|
114
|
+
4. Code Connect đã nối live kèm soft-skip (file này) — điền `node-map.json` khi library component tồn tại.
|
|
115
|
+
5. Khi org lên Enterprise, bật lại REST push đầy đủ (bỏ nhu cầu soft-skip) với `file_variables:read` + `file_variables:write` trên PAT.
|
|
116
|
+
|
|
117
|
+
## Giới hạn phạm vi (thành thật)
|
|
118
|
+
|
|
119
|
+
Job Variables chỉ push biến **màu** (hex leaves từ DTCG). Spacing, type, và pack multi-mode light/dark chưa auto-sync — dùng Tokens Studio cho những phần đó đến khi sync sau mở rộng job REST.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Live hub = Storybook
|
|
2
|
+
|
|
3
|
+
## Quyết định
|
|
4
|
+
|
|
5
|
+
**Storybook là live interactive hub duy nhất** cho operator trên `design.cyberskill.world`. Không có trang Live View riêng và không còn shell dashboard HTML làm sản phẩm. Production **`/`** là Storybook.
|
|
6
|
+
|
|
7
|
+
## Sidebar IA
|
|
8
|
+
|
|
9
|
+
| Nhóm | Vai trò |
|
|
10
|
+
|---|---|
|
|
11
|
+
| **Docs** | Hướng dẫn MDX công khai (consuming, deploy, conventions, styles, products, schema, Figma, contrast, voice, axes) |
|
|
12
|
+
| **Foundations** | Colors, typography, spacing, elevation, motion, elements |
|
|
13
|
+
| **Components** | Thư viện CSF đầy đủ |
|
|
14
|
+
| **Release Notes** | Prose sản phẩm curated (**không CHANGELOG.md**) |
|
|
15
|
+
| **Status** | Nhúng full-bleed `_audit/run.html` (auto-run lần đầu; **Re-run** khi cần) |
|
|
16
|
+
| **A11y / I18n** | Specimen a11y + song ngữ |
|
|
17
|
+
| **Maintainer** | Iframe HTML portable cho gates (Atomic View chôn ở đây — không phải entry công khai top-level) |
|
|
18
|
+
|
|
19
|
+
## Bề mặt
|
|
20
|
+
|
|
21
|
+
| Bề mặt | Vai trò |
|
|
22
|
+
|---|---|
|
|
23
|
+
| **Storybook** (`/`) | Bề mặt sản phẩm host: toolbar Theme × Element × Language, Docs/Foundations/Components/Release Notes/Status, và Maintainer/* iframe vào HTML portable |
|
|
24
|
+
| **Atomic View** (`guidelines/atomic-view.html`) | Lưới component zero-build portable cho gates và duyệt clone-and-open — không phải entry sản phẩm công khai |
|
|
25
|
+
| **Guidelines / templates khác** | Specimen portable; mở từ Storybook Maintainer/* khi khám phá Motion, Identity Lab, kitchen-sink, v.v. |
|
|
26
|
+
| **Legacy `/dashboard`, `/dashboard/`, `/dashboard.html`, `/dashboard/:path*`, `/playground`, `/playground/`, `/playground/:path*`** | Redirect về `/` (stub + redirect Vercel) |
|
|
27
|
+
|
|
28
|
+
## Bản đồ bề mặt (story Maintainer/*)
|
|
29
|
+
|
|
30
|
+
| Storybook entry | Portable HTML |
|
|
31
|
+
|---|---|
|
|
32
|
+
| Components/* CSF | Nguồn React dưới `components/` |
|
|
33
|
+
| Maintainer/Surfaces → Motion | `guidelines/motion.html` |
|
|
34
|
+
| Maintainer/Surfaces → Identity Lab | `ui_kits/status-hub/identity-lab.html` |
|
|
35
|
+
| Maintainer/Surfaces → Template Playground | `templates/playground.html` |
|
|
36
|
+
| Maintainer/Surfaces → Kitchen Sink | `templates/kitchen-sink.html` |
|
|
37
|
+
| Maintainer/Surfaces → Image Slots | `templates/image-slots-demo.html` |
|
|
38
|
+
| Maintainer/Surfaces → AI Cluster | `templates/ai-cluster-demo.html` |
|
|
39
|
+
| Maintainer/Surfaces → RTL | `guidelines/rtl-preview.html` |
|
|
40
|
+
| Maintainer/Surfaces → Atomic View (gates) | `guidelines/atomic-view.html` |
|
|
41
|
+
| Status/Gate board | `_audit/run.html` |
|
|
42
|
+
|
|
43
|
+
## Hành vi Status
|
|
44
|
+
|
|
45
|
+
- Mở Status load `_audit/run.html`, **auto-run** bảng gate nhanh một lần.
|
|
46
|
+
- Storybook có thể giữ iframe cache khi điều hướng đi rồi về — **không** tự chạy lại im lặng.
|
|
47
|
+
- Dùng nút **Re-run** trên board để chạy lại (mỗi gate iframe được cache-bust).
|
|
48
|
+
|
|
49
|
+
## Consumer portable (không đổi)
|
|
50
|
+
|
|
51
|
+
Consumer vẫn link `styles.css` / `_ds_bundle.js` / ESM / templates. **Không** yêu cầu Storybook trong product app. Xem `docs/consuming.md`.
|
|
52
|
+
|
|
53
|
+
## Local
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
npm run storybook # Storybook sản phẩm tại http://localhost:6006
|
|
57
|
+
npm run build:site # đóng gói Storybook tại .vercel-static/ (root `/`)
|
|
58
|
+
```
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Product registry — ánh xạ element
|
|
2
|
+
|
|
3
|
+
> **Đã khóa / locked** (Th7 2026). Registry product → element chuẩn cho agent và kit. **Không** invent ánh xạ product → element mới; thêm hoặc đổi hàng chỉ qua quyết định maintainer trong `docs/decisions.md`.
|
|
4
|
+
|
|
5
|
+
**Nguồn chân lý.** Ánh xạ sản phẩm portfolio CyberSkill sang pack element Ngũ Hành. Một element mỗi sản phẩm; accent phụ chỉ trong gradient wash theo Tương sinh.
|
|
6
|
+
|
|
7
|
+
| Sản phẩm | Element | Variant | Phụ (Tương sinh) | Markup |
|
|
8
|
+
|---|---|---|---|---|
|
|
9
|
+
| **Lumi** — trợ lý wish | Hỏa · fire | plasma | tho | `data-cs-element="hoa" data-cs-variant="plasma"` |
|
|
10
|
+
| **Status Hub** — portal portfolio khách | Thủy · water | river (mặc định) | moc | `data-cs-element="thuy"` |
|
|
11
|
+
| **CyberOS Agent Spine** — infra agent, memory, gates | Kim · metal | steel | thuy | `data-cs-element="kim" data-cs-variant="steel"` |
|
|
12
|
+
| **CyberSkill Design System** — thư viện này | Mộc · wood | leaf (mặc định) | hoa | `data-cs-element="moc"` |
|
|
13
|
+
| **cyberskill.world** — site studio | Thổ · earth | studio (mặc định) | — | *(không attribute — studio là Thổ)* |
|
|
14
|
+
| **Client delivery suite** — kickoff · QBR · runbooks | Thổ · earth | clay | kim | `data-cs-element="tho" data-cs-variant="clay"` |
|
|
15
|
+
| **Board / investor collateral** | Kim · metal | champagne (mặc định) | thuy | `data-cs-element="kim"` |
|
|
16
|
+
| **HR / employment instruments** | Mộc · wood | bamboo | hoa | `data-cs-element="moc" data-cs-variant="bamboo"` |
|
|
17
|
+
|
|
18
|
+
**Vì sao:** Lumi là tia hội thoại (plasma). Status Hub là dòng trạng thái bình (Thủy). Agent Spine là hạ tầng chính xác (Kim·steel). Design System nuôi mọi thứ khác (Mộc). Brand studio là Thổ. Delivery là đất vững (clay). Board collateral là kim loại chính xác. HR instruments nuôi người (bamboo).
|
|
19
|
+
|
|
20
|
+
## Phạm vi
|
|
21
|
+
|
|
22
|
+
- **UI kits giữ trung thành Thổ.** `ui_kits/status-hub` và `ui_kits/website` vẫn là tái tạo Thổ; demo theo element nằm ở **Identity Lab** / Storybook Live.
|
|
23
|
+
|
|
24
|
+
- **Dùng một ánh xạ:** scope root sản phẩm bằng Markup của hàng và dùng `--cs-accent-*`.
|
|
25
|
+
|
|
26
|
+
- Cặp Tương khắc (Hỏa×Thủy · Kim×Mộc · Thổ×Thủy · Mộc×Thổ · Hỏa×Kim) không bao giờ kết hợp primary + secondary.
|