@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,270 @@
|
|
|
1
|
+
const { useState, useMemo } = React;
|
|
2
|
+
|
|
3
|
+
const ICON = {
|
|
4
|
+
search: "M11 4a7 7 0 1 0 4.2 12.6L20 21l1.4-1.4-4.4-4.4A7 7 0 0 0 11 4zm0 2a5 5 0 1 1 0 10 5 5 0 0 1 0-10z",
|
|
5
|
+
close: "M6 6l12 12M18 6L6 18",
|
|
6
|
+
sun: null, moon: null,
|
|
7
|
+
};
|
|
8
|
+
function Glyph({ d, size = 18 }) {
|
|
9
|
+
return <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.9" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true"><path d={d} /></svg>;
|
|
10
|
+
}
|
|
11
|
+
function SearchGlyph() {
|
|
12
|
+
return <svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d={ICON.search} /></svg>;
|
|
13
|
+
}
|
|
14
|
+
function ThemeGlyph({ dark }) {
|
|
15
|
+
return dark
|
|
16
|
+
? <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"><circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M2 12h2M20 12h2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M19.1 4.9l-1.4 1.4M6.3 17.7l-1.4 1.4"/></svg>
|
|
17
|
+
: <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"><path d="M20 13.5A8 8 0 1 1 10.5 4a6.5 6.5 0 0 0 9.5 9.5z"/></svg>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/* Bilingual UI copy — kit fully EN⇄VN (owner decision, Jul 2026).
|
|
21
|
+
* Mock-data VN variants live in data.js (window.SH_VI). */
|
|
22
|
+
const T = {
|
|
23
|
+
en: {
|
|
24
|
+
sub: "CyberSkill · one page, three lenses · Hiện Thực Hoá Ý Chí",
|
|
25
|
+
updated: "Updated", portfolio: "Portfolio",
|
|
26
|
+
projects: "Projects", inprog: "In progress", shipped: "Shipped", blocked: "Blocked", planned: "Planned", avg: "Avg progress",
|
|
27
|
+
velocity: "Velocity · tasks shipped / week", perShipped: " shipped",
|
|
28
|
+
nowTitle: "Now shipping",
|
|
29
|
+
search: "Search projects…", view: "View", lenses: { board: "Board", table: "Table", releases: "Releases" },
|
|
30
|
+
status: "Status", all: "All", of: "of",
|
|
31
|
+
key: "Key", project: "Project", squad: "Squad", owner: "Owner", progress: "Progress",
|
|
32
|
+
thisWeek: "This week", tasks: "Tasks", risk: "Risk", close: "Close",
|
|
33
|
+
langBtn: "VN", theme: "Toggle theme",
|
|
34
|
+
},
|
|
35
|
+
vi: {
|
|
36
|
+
sub: "CyberSkill · một trang, ba lăng kính · Hiện Thực Hoá Ý Chí",
|
|
37
|
+
updated: "Cập nhật", portfolio: "Danh mục",
|
|
38
|
+
projects: "Dự án", inprog: "Đang làm", shipped: "Đã ra mắt", blocked: "Bị chặn", planned: "Dự kiến", avg: "Tiến độ TB",
|
|
39
|
+
velocity: "Tốc độ · task giao / tuần", perShipped: " đã giao",
|
|
40
|
+
nowTitle: "Đang ra mắt",
|
|
41
|
+
search: "Tìm dự án…", view: "Chế độ xem", lenses: { board: "Bảng công việc", table: "Bảng dữ liệu", releases: "Phát hành" },
|
|
42
|
+
status: "Trạng thái", all: "Tất cả", of: "trên",
|
|
43
|
+
key: "Mã", project: "Dự án", squad: "Nhóm", owner: "Phụ trách", progress: "Tiến độ",
|
|
44
|
+
thisWeek: "Tuần này", tasks: "Công việc", risk: "Rủi ro", close: "Đóng",
|
|
45
|
+
langBtn: "EN", theme: "Đổi giao diện",
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
const statusLabels = (t) => ({ done: t.shipped, active: t.inprog, hold: t.blocked, todo: t.planned });
|
|
49
|
+
|
|
50
|
+
function Segments({ seg, className }) {
|
|
51
|
+
return (
|
|
52
|
+
<div className={className}>
|
|
53
|
+
{seg.done > 0 && <i className="seg-done" style={{ width: seg.done + "%" }} />}
|
|
54
|
+
{seg.active > 0 && <i className="seg-active" style={{ width: seg.active + "%" }} />}
|
|
55
|
+
{seg.hold > 0 && <i className="seg-hold" style={{ width: seg.hold + "%" }} />}
|
|
56
|
+
{seg.todo > 0 && <i className="seg-todo" style={{ width: seg.todo + "%" }} />}
|
|
57
|
+
</div>
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function Drawer({ p, onClose, t }) {
|
|
62
|
+
if (!p) return null;
|
|
63
|
+
const SL = statusLabels(t);
|
|
64
|
+
return (
|
|
65
|
+
<>
|
|
66
|
+
<div className="scrim" onClick={onClose} />
|
|
67
|
+
<aside className="drawer" role="dialog" aria-modal="true" aria-label={p.name}>
|
|
68
|
+
<div className="dw-h">
|
|
69
|
+
<div className="row">
|
|
70
|
+
<span className="mono muted" style={{ fontWeight: 700 }}>{p.key}</span>
|
|
71
|
+
<span className={"pill " + p.status}>{SL[p.status]}</span>
|
|
72
|
+
<button className="dw-x" onClick={onClose} aria-label={t.close}><Glyph d={ICON.close} size={20} /></button>
|
|
73
|
+
</div>
|
|
74
|
+
<h2>{p.name}</h2>
|
|
75
|
+
</div>
|
|
76
|
+
<div className="dw-b">
|
|
77
|
+
<p className="muted" style={{ marginTop: 0 }}>{p.blurb}</p>
|
|
78
|
+
<dl className="meta">
|
|
79
|
+
<div><dt>{t.owner}</dt><dd>{p.owner}</dd></div>
|
|
80
|
+
<div><dt>{t.squad}</dt><dd>{p.squad}</dd></div>
|
|
81
|
+
<div><dt>{t.progress}</dt><dd>{p.pct}%</dd></div>
|
|
82
|
+
<div><dt>{t.updated}</dt><dd>{p.updated}</dd></div>
|
|
83
|
+
</dl>
|
|
84
|
+
<Segments seg={p.seg} className="minibar" />
|
|
85
|
+
<div className="sect">
|
|
86
|
+
<h3>{t.tasks}</h3>
|
|
87
|
+
<div className="task-chips">
|
|
88
|
+
{p.tasks.map((tk) => <span key={tk[0]} className={"chip " + tk[2]} title={tk[1]}>{tk[0]}</span>)}
|
|
89
|
+
</div>
|
|
90
|
+
<ul className="tasks">{p.tasks.map((tk) => <li key={tk[0]}>{tk[1]} — <span className="muted">{SL[tk[2]]}</span></li>)}</ul>
|
|
91
|
+
</div>
|
|
92
|
+
{p.risk ? <div className="sect"><h3>{t.risk}</h3><div className="risk">{p.risk}</div></div> : null}
|
|
93
|
+
</div>
|
|
94
|
+
</aside>
|
|
95
|
+
</>
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function StatusHub() {
|
|
100
|
+
const D = window.SH_DATA;
|
|
101
|
+
const [dark, setDark] = useState(false);
|
|
102
|
+
const [lang, setLang] = useState("en");
|
|
103
|
+
const [lens, setLens] = useState("board");
|
|
104
|
+
const [q, setQ] = useState("");
|
|
105
|
+
const [facet, setFacet] = useState("all");
|
|
106
|
+
const [kpi, setKpi] = useState(null);
|
|
107
|
+
const [sel, setSel] = useState(null);
|
|
108
|
+
|
|
109
|
+
const t = T[lang];
|
|
110
|
+
const SL = statusLabels(t);
|
|
111
|
+
const VI = lang === "vi" ? (window.SH_VI || null) : null;
|
|
112
|
+
const loc = (p) => VI ? { ...p,
|
|
113
|
+
blurb: VI.blurbs[p.key] || p.blurb,
|
|
114
|
+
risk: (VI.risks[p.key] != null ? VI.risks[p.key] : p.risk),
|
|
115
|
+
owner: VI.owners[p.owner] || p.owner,
|
|
116
|
+
squad: VI.squads[p.squad] || p.squad,
|
|
117
|
+
updated: VI.updatedRel[p.updated] || p.updated,
|
|
118
|
+
} : p;
|
|
119
|
+
|
|
120
|
+
const counts = useMemo(() => {
|
|
121
|
+
const c = { active: 0, done: 0, hold: 0 };
|
|
122
|
+
D.projects.forEach((p) => { if (c[p.status] != null) c[p.status]++; });
|
|
123
|
+
const avg = Math.round(D.projects.reduce((a, p) => a + p.pct, 0) / D.projects.length);
|
|
124
|
+
return { total: D.projects.length, ...c, avg };
|
|
125
|
+
}, [D]);
|
|
126
|
+
|
|
127
|
+
const shown = useMemo(() => {
|
|
128
|
+
const needle = q.trim().toLowerCase();
|
|
129
|
+
const eff = kpi || (facet === "all" ? null : facet);
|
|
130
|
+
return D.projects.filter((p) => {
|
|
131
|
+
if (eff && p.status !== eff) return false;
|
|
132
|
+
if (!needle) return true;
|
|
133
|
+
return (p.name + " " + p.key + " " + p.blurb).toLowerCase().includes(needle);
|
|
134
|
+
});
|
|
135
|
+
}, [D, q, facet, kpi]);
|
|
136
|
+
|
|
137
|
+
const maxV = Math.max(...D.velocity.map((v) => v.n));
|
|
138
|
+
const toggleKpi = (k) => setKpi((cur) => (cur === k ? null : k));
|
|
139
|
+
|
|
140
|
+
return (
|
|
141
|
+
<div className="sh" lang={lang} data-theme={dark ? "dark" : undefined}>
|
|
142
|
+
<header className="hd">
|
|
143
|
+
<div className="hd-in">
|
|
144
|
+
<div className="hd-id">
|
|
145
|
+
<span className="hd-mark"><img src="../../assets/logo-mark.svg" alt="" /></span>
|
|
146
|
+
<div>
|
|
147
|
+
<h1>Status Hub</h1>
|
|
148
|
+
<p className="hd-sub">{t.sub}</p>
|
|
149
|
+
</div>
|
|
150
|
+
</div>
|
|
151
|
+
<div className="hd-side">
|
|
152
|
+
<p className="hd-meta">{t.updated}<br />{VI ? VI.updated : D.updated}</p>
|
|
153
|
+
<button className="btn ghost" onClick={() => setLang((l) => l === "en" ? "vi" : "en")} aria-label="Toggle language" style={{ fontWeight: 700, fontSize: 13 }}>{t.langBtn}</button>
|
|
154
|
+
<button className="btn ghost" onClick={() => setDark((v) => !v)} aria-label={t.theme}><ThemeGlyph dark={dark} /></button>
|
|
155
|
+
</div>
|
|
156
|
+
</div>
|
|
157
|
+
</header>
|
|
158
|
+
|
|
159
|
+
<div className="wrap">
|
|
160
|
+
<div className="deck">
|
|
161
|
+
<section className="panel">
|
|
162
|
+
<h2>{t.portfolio}</h2>
|
|
163
|
+
<div className="kpis">
|
|
164
|
+
<button className="kpi" data-on={kpi === null ? "1" : "0"} onClick={() => setKpi(null)}><b>{counts.total}</b><span>{t.projects}</span></button>
|
|
165
|
+
<button className="kpi" data-on={kpi === "active" ? "1" : "0"} onClick={() => toggleKpi("active")}><b>{counts.active}</b><span>{t.inprog}</span></button>
|
|
166
|
+
<button className="kpi" data-on={kpi === "done" ? "1" : "0"} onClick={() => toggleKpi("done")}><b>{counts.done}</b><span>{t.shipped}</span></button>
|
|
167
|
+
<button className="kpi" data-on={kpi === "hold" ? "1" : "0"} onClick={() => toggleKpi("hold")}><b>{counts.hold}</b><span>{t.blocked}</span></button>
|
|
168
|
+
<button className="kpi" onClick={() => setKpi(null)}><b>{counts.avg}%</b><span>{t.avg}</span></button>
|
|
169
|
+
</div>
|
|
170
|
+
<Segments seg={{ done: 60, active: 22, hold: 6, todo: 12 }} className="bar-seg" />
|
|
171
|
+
<div className="legend">
|
|
172
|
+
<span><i className="dot" style={{ background: "var(--cs-color-semantic-success)" }} />{t.shipped}</span>
|
|
173
|
+
<span><i className="dot" style={{ background: "var(--cs-color-brand-ochre)" }} />{t.inprog}</span>
|
|
174
|
+
<span><i className="dot" style={{ background: "var(--cs-color-semantic-danger)" }} />{t.blocked}</span>
|
|
175
|
+
<span><i className="dot" style={{ background: "var(--cs-status-todo)" }} />{t.planned}</span>
|
|
176
|
+
</div>
|
|
177
|
+
</section>
|
|
178
|
+
<section className="panel">
|
|
179
|
+
<h2>{t.velocity}</h2>
|
|
180
|
+
<div className="spark">
|
|
181
|
+
{D.velocity.map((v) => (
|
|
182
|
+
<a key={v.wk} title={v.n + t.perShipped}><b>{v.n}</b><i style={{ height: (v.n / maxV) * 72 + "px" }} /><span>{v.wk}</span></a>
|
|
183
|
+
))}
|
|
184
|
+
</div>
|
|
185
|
+
</section>
|
|
186
|
+
</div>
|
|
187
|
+
|
|
188
|
+
<div className="now">
|
|
189
|
+
<h2>{t.nowTitle}</h2>
|
|
190
|
+
{lang === "vi"
|
|
191
|
+
? <p><b>v1.6.0 — Liên kết Glass + gói Ngũ Hành v2.</b> Liên kết component <span className="mono">.cs-surface-*</span> (tùy chọn), trình kiểm 0 cảnh báo trên cả 15 gói, và kiểm tra lại APCA cho chế độ tối. Ra mắt tuần này.</p>
|
|
192
|
+
: <p><b>v1.6.0 — Glass bindings + element-pack v2.</b> Opt-in <span className="mono">.cs-surface-*</span> component bindings, a zero-warning verifier across all 15 packs, and a dark-mode APCA re-check. Ships this week.</p>}
|
|
193
|
+
</div>
|
|
194
|
+
|
|
195
|
+
<div className="bar">
|
|
196
|
+
<div className="bar-top">
|
|
197
|
+
<label className="srch"><SearchGlyph /><input placeholder={t.search} value={q} onChange={(e) => setQ(e.target.value)} /></label>
|
|
198
|
+
<div className="lenses" role="tablist" aria-label={t.view}>
|
|
199
|
+
{["board", "table", "releases"].map((l) => (
|
|
200
|
+
<button key={l} className="ln" role="tab" aria-selected={lens === l} onClick={() => setLens(l)}>{t.lenses[l]}</button>
|
|
201
|
+
))}
|
|
202
|
+
</div>
|
|
203
|
+
<label className="facet">{t.status}
|
|
204
|
+
<select value={kpi || facet} onChange={(e) => { setFacet(e.target.value); setKpi(null); }}>
|
|
205
|
+
<option value="all">{t.all}</option><option value="active">{t.inprog}</option>
|
|
206
|
+
<option value="done">{t.shipped}</option><option value="hold">{t.blocked}</option>
|
|
207
|
+
</select>
|
|
208
|
+
</label>
|
|
209
|
+
<span className="cnt">{shown.length} {t.of} {D.projects.length}</span>
|
|
210
|
+
</div>
|
|
211
|
+
</div>
|
|
212
|
+
|
|
213
|
+
{lens === "board" && (
|
|
214
|
+
<div className="grid">
|
|
215
|
+
{shown.map((p0) => { const p = loc(p0); return (
|
|
216
|
+
<button className={"card" + (p.status === "active" ? " hot" : "")} key={p.key} onClick={() => setSel(p0)}>
|
|
217
|
+
<div className="card-h"><h3><span className="k mono">{p.key}</span> · {p.name}</h3><span className="pct">{p.pct}%</span></div>
|
|
218
|
+
<p>{p.blurb}</p>
|
|
219
|
+
<Segments seg={p.seg} className="minibar" />
|
|
220
|
+
<div className="task-chips">
|
|
221
|
+
<span className={"pill " + p.status}>{SL[p.status]}</span>
|
|
222
|
+
{p.tasks.slice(0, 3).map((tk) => <span key={tk[0]} className={"chip " + tk[2]}>{tk[0]}</span>)}
|
|
223
|
+
</div>
|
|
224
|
+
</button>
|
|
225
|
+
); })}
|
|
226
|
+
</div>
|
|
227
|
+
)}
|
|
228
|
+
|
|
229
|
+
{lens === "table" && (
|
|
230
|
+
<div className="tbl-wrap">
|
|
231
|
+
<table className="tbl">
|
|
232
|
+
<thead><tr><th>{t.key}</th><th>{t.project}</th><th>{t.squad}</th><th>{t.owner}</th><th>{t.progress}</th><th>{t.status}</th></tr></thead>
|
|
233
|
+
<tbody>
|
|
234
|
+
{shown.map((p0) => { const p = loc(p0); return (
|
|
235
|
+
<tr key={p.key} onClick={() => setSel(p0)}>
|
|
236
|
+
<td className="mono" style={{ fontWeight: 700 }}>{p.key}</td>
|
|
237
|
+
<td>{p.name}</td><td>{p.squad}</td><td>{p.owner}</td><td>{p.pct}%</td>
|
|
238
|
+
<td><span className={"pill " + p.status}>{SL[p.status]}</span></td>
|
|
239
|
+
</tr>
|
|
240
|
+
); })}
|
|
241
|
+
</tbody>
|
|
242
|
+
</table>
|
|
243
|
+
</div>
|
|
244
|
+
)}
|
|
245
|
+
|
|
246
|
+
{lens === "releases" && (
|
|
247
|
+
<div className="rels">
|
|
248
|
+
{D.releases.map((r) => (
|
|
249
|
+
<div className={"rel" + (r.now ? " now" : "")} key={r.ver}>
|
|
250
|
+
<div className="tick">{r.done ? "✓" : "→"}</div>
|
|
251
|
+
<div>
|
|
252
|
+
<div className="rel-h"><b>{r.ver}</b><span className={"pill " + (r.now ? "active" : "done")}>{r.now ? t.thisWeek : t.shipped}</span><span className="muted">{VI ? (VI.relWhen[r.ver] || r.when) : r.when}</span></div>
|
|
253
|
+
<div className="rel-sec"><h4>{VI ? (VI.relTitles[r.ver] || r.title) : r.title}</h4><ul>{(VI ? (VI.relItems[r.ver] || r.items) : r.items).map((it, i) => <li key={i}>{it}</li>)}</ul></div>
|
|
254
|
+
</div>
|
|
255
|
+
</div>
|
|
256
|
+
))}
|
|
257
|
+
</div>
|
|
258
|
+
)}
|
|
259
|
+
|
|
260
|
+
<p className="ft">{lang === "vi"
|
|
261
|
+
? <>CyberSkill Status Hub — bản tái hiện UI kit của design system. Dựng trên token <span className="mono">styles.css</span>. Turn Your Will Into Real.</>
|
|
262
|
+
: <>CyberSkill Status Hub — a design-system UI kit recreation. Built on <span className="mono">styles.css</span> tokens. Turn Your Will Into Real.</>}</p>
|
|
263
|
+
</div>
|
|
264
|
+
|
|
265
|
+
<Drawer p={sel && loc(sel)} onClose={() => setSel(null)} t={t} />
|
|
266
|
+
</div>
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
window.StatusHub = StatusHub;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// CyberSkill Status Hub — sample data (fictional, on-brand). window.SH_DATA
|
|
2
|
+
window.SH_DATA = {
|
|
3
|
+
updated: "18 Jul 2026, 13:20 ICT",
|
|
4
|
+
velocity: [
|
|
5
|
+
{ wk: "W23", n: 4 }, { wk: "W24", n: 7 }, { wk: "W25", n: 5 },
|
|
6
|
+
{ wk: "W26", n: 9 }, { wk: "W27", n: 6 }, { wk: "W28", n: 11 }, { wk: "W29", n: 8 },
|
|
7
|
+
],
|
|
8
|
+
projects: [
|
|
9
|
+
{ key: "CDS", name: "Design System v1.6", status: "active", pct: 72, blurb: "Liquid Glass component bindings + 15 element packs.",
|
|
10
|
+
seg: { done: 62, active: 20, hold: 4, todo: 14 }, owner: "Design Lead", updated: "2h ago", squad: "Platform",
|
|
11
|
+
tasks: [["TASK-DS-041","Glass surface bindings","done"],["TASK-DS-047","Element-pack verifier v2","active"],["TASK-DS-052","Dark-mode APCA re-check","active"],["TASK-DS-055","Figma variable sync","todo"]],
|
|
12
|
+
risk: "" },
|
|
13
|
+
{ key: "GENIE", name: "Lumi Genie Chat", status: "active", pct: 58, blurb: "Keyless Claude proxy; scripted wish-capture flow.",
|
|
14
|
+
seg: { done: 48, active: 24, hold: 8, todo: 20 }, owner: "AI Lead", updated: "5h ago", squad: "AI",
|
|
15
|
+
tasks: [["TASK-CHAR-026","In-chat wish flow","done"],["TASK-CHAR-030","One-time mascot hint","active"],["TASK-CHAR-021","Golden-genie GLB","hold"]],
|
|
16
|
+
risk: "GLB art asset is a hard external dependency — commission not yet confirmed (TASK-CHAR-021)." },
|
|
17
|
+
{ key: "SITE", name: "cyberskill.world", status: "active", pct: 84, blurb: "Bilingual storytelling landing; lead capture live.",
|
|
18
|
+
seg: { done: 78, active: 12, hold: 0, todo: 10 }, owner: "Web Lead", updated: "1h ago", squad: "Growth",
|
|
19
|
+
tasks: [["TASK-BIZ-003","Lead pipeline e2e","done"],["TASK-SEO-012","llms.txt route","done"],["TASK-CTA-020","Teardown funnel polish","active"]],
|
|
20
|
+
risk: "" },
|
|
21
|
+
{ key: "OS", name: "CyberOS Agent Spine", status: "hold", pct: 41, blurb: "BRAIN memory store + HITL acceptance gates.",
|
|
22
|
+
seg: { done: 36, active: 8, hold: 30, todo: 26 }, owner: "Eng Lead", updated: "1d ago", squad: "Platform",
|
|
23
|
+
tasks: [["TASK-OS-018","Gate runner","done"],["TASK-OS-022","Memory compaction","hold"],["TASK-OS-025","Provenance ledger","hold"]],
|
|
24
|
+
risk: "Blocked on infra: provenance ledger needs the signing service (target Q1 2027)." },
|
|
25
|
+
{ key: "AUDIT", name: "DS Audit Framework", status: "done", pct: 100, blurb: "125-criteria vendor-neutral audit; L3 tier held.",
|
|
26
|
+
seg: { done: 100, active: 0, hold: 0, todo: 0 }, owner: "DesignOps", updated: "3d ago", squad: "Platform",
|
|
27
|
+
tasks: [["TASK-AUD-009","Deterministic engine","done"],["TASK-AUD-011","No-regression CI gate","done"]],
|
|
28
|
+
risk: "" },
|
|
29
|
+
{ key: "TOKENS", name: "Token Pipeline", status: "active", pct: 66, blurb: "DTCG → CSS/TS/Swift/Kotlin/Flutter/Figma.",
|
|
30
|
+
seg: { done: 58, active: 22, hold: 0, todo: 20 }, owner: "Eng Lead", updated: "6h ago", squad: "Platform",
|
|
31
|
+
tasks: [["TASK-TOK-014","Contrast grid export","done"],["TASK-TOK-019","Flutter target","active"],["TASK-TOK-021","Provenance JSON","todo"]],
|
|
32
|
+
risk: "" },
|
|
33
|
+
],
|
|
34
|
+
releases: [
|
|
35
|
+
{ ver: "v1.6.0", when: "This week", now: true, done: false, title: "Glass bindings + element-pack v2",
|
|
36
|
+
items: ["Opt-in .cs-surface-* component bindings", "Element-pack verifier v2 (0 warnings across 15)", "Dark-mode APCA re-check"] },
|
|
37
|
+
{ ver: "v1.5.1", when: "04 Jul 2026", now: false, done: true, title: "15 element packs ship",
|
|
38
|
+
items: ["All 15 packs promoted to shipped", "Per-pack screenshot regression", "Gallery build script"] },
|
|
39
|
+
{ ver: "v1.4.0", when: "13 Jun 2026", now: false, done: true, title: "Liquid Glass in code",
|
|
40
|
+
items: ["--cs-glass-* + --cs-depth-* scalars", "glass.css material layer", "Reduced-transparency fallbacks"] },
|
|
41
|
+
{ ver: "v1.3.0", when: "14 May 2026", now: false, done: true, title: "Brand assets + Logo",
|
|
42
|
+
items: ["Official master mark ships", "React <Logo> from master artwork", "Light becomes default theme"] },
|
|
43
|
+
],
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
// Vietnamese variants (kit fully EN⇄VN per owner decision, Jul 2026). window.SH_VI
|
|
47
|
+
window.SH_VI = {
|
|
48
|
+
updated: "18/07/2026, 13:20 ICT",
|
|
49
|
+
blurbs: { CDS: "Liên kết component Liquid Glass + 15 gói Ngũ Hành.", GENIE: "Proxy Claude không cần khóa; luồng tiếp nhận điều ước theo kịch bản.", SITE: "Trang giới thiệu song ngữ kể chuyện; thu lead đang chạy.", OS: "Kho nhớ BRAIN + cổng nghiệm thu có con người.", AUDIT: "Bộ kiểm định trung lập 125 tiêu chí; giữ hạng L3.", TOKENS: "DTCG → CSS/TS/Swift/Kotlin/Flutter/Figma." },
|
|
50
|
+
risks: { GENIE: "Tài sản GLB là phụ thuộc ngoài khó — chưa chốt đặt hàng (TASK-CHAR-021).", OS: "Bị chặn bởi hạ tầng: sổ cái nguồn gốc cần dịch vụ ký số (mục tiêu Q1 2027)." },
|
|
51
|
+
owners: { "Design Lead": "Trưởng thiết kế", "AI Lead": "Trưởng AI", "Web Lead": "Trưởng web", "Eng Lead": "Trưởng kỹ thuật", "DesignOps": "DesignOps" },
|
|
52
|
+
squads: { Platform: "Nền tảng", AI: "AI", Growth: "Tăng trưởng" },
|
|
53
|
+
updatedRel: { "2h ago": "2 giờ trước", "5h ago": "5 giờ trước", "1h ago": "1 giờ trước", "1d ago": "1 ngày trước", "3d ago": "3 ngày trước", "6h ago": "6 giờ trước" },
|
|
54
|
+
relWhen: { "v1.6.0": "Tuần này", "v1.5.1": "04/07/2026", "v1.4.0": "13/06/2026", "v1.3.0": "14/05/2026" },
|
|
55
|
+
relTitles: { "v1.6.0": "Liên kết Glass + gói Ngũ Hành v2", "v1.5.1": "15 gói Ngũ Hành ra mắt", "v1.4.0": "Liquid Glass vào mã", "v1.3.0": "Tài sản thương hiệu + Logo" },
|
|
56
|
+
relItems: { "v1.6.0": ["Liên kết component .cs-surface-* (tùy chọn)", "Trình kiểm gói Ngũ Hành v2 (0 cảnh báo trên 15 gói)", "Kiểm tra lại APCA cho chế độ tối"], "v1.5.1": ["Cả 15 gói lên trạng thái đã ra mắt", "Regression ảnh chụp từng gói", "Script dựng gallery"], "v1.4.0": ["Scalar --cs-glass-* + --cs-depth-*", "Lớp chất liệu glass.css", "Fallback khi giảm độ trong suốt"], "v1.3.0": ["Master mark chính thức ra mắt", "<Logo> React từ artwork gốc", "Light thành theme mặc định"] },
|
|
57
|
+
};
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
<!-- @dsCard group="Status Hub" viewport="1280x800" name="Identity Lab" subtitle="Live Theme × Element × Language on a product surface — click any pill" -->
|
|
2
|
+
<!DOCTYPE html>
|
|
3
|
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
|
4
|
+
<title>CyberSkill · Identity Lab</title>
|
|
5
|
+
<link rel="stylesheet" href="../../styles.css">
|
|
6
|
+
<style>
|
|
7
|
+
body{margin:0;background:var(--cs-color-surface-raised);font-family:var(--cs-font-family-ui);color:var(--cs-color-text-primary);min-height:100vh}
|
|
8
|
+
.bar{display:flex;flex-wrap:wrap;gap:8px 18px;align-items:center;padding:14px 28px;background:var(--cs-color-surface-panel);border-bottom:1px solid var(--cs-color-border-default);position:sticky;top:0;z-index:10}
|
|
9
|
+
.lb{font-size:10px;text-transform:uppercase;letter-spacing:0.1em;font-weight:800;color:var(--cs-color-text-muted);margin-right:2px}
|
|
10
|
+
.pills{display:flex;gap:6px;flex-wrap:wrap}
|
|
11
|
+
.pill{border:1px solid var(--cs-color-border-default);background:var(--cs-color-surface-panel);border-radius:999px;padding:6px 13px;font:inherit;font-size:12.5px;font-weight:600;color:var(--cs-color-text-primary);cursor:pointer;min-height:30px}
|
|
12
|
+
.pill:hover{background:var(--cs-color-surface-raised)}
|
|
13
|
+
.pill.on{background:var(--cs-color-brand-umber);border-color:var(--cs-color-brand-umber);color:#fff}
|
|
14
|
+
.pill:focus-visible{outline:3px solid var(--cs-color-accent-ochre);outline-offset:2px}
|
|
15
|
+
a{color:var(--cs-color-link)}a:hover{color:var(--cs-color-link-hover)}
|
|
16
|
+
[data-theme="dark"] .pill.on{background:var(--cs-color-brand-ochre);border-color:var(--cs-color-brand-ochre);color:#1a1108}
|
|
17
|
+
</style></head>
|
|
18
|
+
<body>
|
|
19
|
+
<div class="bar" id="axis-bar">
|
|
20
|
+
<span class="lb">Element</span>
|
|
21
|
+
<span class="pills" id="els">
|
|
22
|
+
<button class="pill on" data-el="" data-va="">Thổ · studio</button>
|
|
23
|
+
<button class="pill" data-el="tho" data-va="clay">Thổ · clay</button>
|
|
24
|
+
<button class="pill" data-el="tho" data-va="sand">Thổ · sand</button>
|
|
25
|
+
<button class="pill" data-el="hoa" data-va="">Hỏa</button>
|
|
26
|
+
<button class="pill" data-el="hoa" data-va="lava">Hỏa · lava</button>
|
|
27
|
+
<button class="pill" data-el="hoa" data-va="plasma">Hỏa · plasma</button>
|
|
28
|
+
<button class="pill" data-el="thuy" data-va="">Thủy</button>
|
|
29
|
+
<button class="pill" data-el="thuy" data-va="ocean">Thủy · ocean</button>
|
|
30
|
+
<button class="pill" data-el="thuy" data-va="mist">Thủy · mist</button>
|
|
31
|
+
<button class="pill" data-el="moc" data-va="">Mộc</button>
|
|
32
|
+
<button class="pill" data-el="moc" data-va="bamboo">Mộc · bamboo</button>
|
|
33
|
+
<button class="pill" data-el="moc" data-va="forest">Mộc · forest</button>
|
|
34
|
+
<button class="pill" data-el="kim" data-va="">Kim</button>
|
|
35
|
+
<button class="pill" data-el="kim" data-va="steel">Kim · steel</button>
|
|
36
|
+
<button class="pill" data-el="kim" data-va="titanium">Kim · titanium</button>
|
|
37
|
+
</span>
|
|
38
|
+
<span class="lb">Theme</span>
|
|
39
|
+
<span class="pills" id="themes">
|
|
40
|
+
<button class="pill on" data-theme="">light</button>
|
|
41
|
+
<button class="pill" data-theme="dark">dark</button>
|
|
42
|
+
</span>
|
|
43
|
+
<span class="lb">Language</span>
|
|
44
|
+
<span class="pills" id="langs">
|
|
45
|
+
<button class="pill on" data-lang="en">English</button>
|
|
46
|
+
<button class="pill" data-lang="vi">Tiếng Việt</button>
|
|
47
|
+
</span>
|
|
48
|
+
</div>
|
|
49
|
+
<div id="stage" style="max-width:1180px;margin:26px auto;padding:0 24px" lang="en">
|
|
50
|
+
<div style="position:relative;overflow:hidden;background:var(--cs-accent-strong);color:#fff;border-radius:var(--cs-radius-lg);box-shadow:var(--cs-shadow-md)">
|
|
51
|
+
<div class="cs-aurora-wash" style="position:absolute;inset:0;opacity:0.5;pointer-events:none"></div>
|
|
52
|
+
<div style="position:relative;display:flex;align-items:center;gap:14px;padding:20px 26px">
|
|
53
|
+
<span style="width:40px;height:40px;border-radius:var(--cs-radius-md);background:var(--cs-accent-bright);display:grid;place-items:center;color:var(--cs-accent-on);font-weight:800">✦</span>
|
|
54
|
+
<div>
|
|
55
|
+
<div style="font-weight:800;font-size:19px;letter-spacing:-0.01em" data-i18n="title">Status Hub</div>
|
|
56
|
+
<div style="font-size:12px;opacity:0.8" data-i18n="subtitle">Identity Lab · Theme × Element × Language</div>
|
|
57
|
+
</div>
|
|
58
|
+
<span style="margin-left:auto;display:inline-flex;align-items:center;background:var(--cs-accent-bright);color:var(--cs-accent-on);font-weight:700;font-size:13.5px;padding:0 18px;border-radius:var(--cs-component-button-radius);min-height:var(--cs-component-button-md-minHeight)" data-i18n="cta">New project</span>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
<div style="display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin:18px 0;padding:18px 20px;background:var(--cs-color-surface-panel);border:1px solid var(--cs-color-border-default);border-radius:var(--cs-radius-lg);box-shadow:var(--cs-shadow-sm)">
|
|
62
|
+
<div><div style="font-size:10.5px;text-transform:uppercase;letter-spacing:0.08em;color:var(--cs-color-text-muted);font-weight:700" data-i18n="k1">Projects</div><div style="font-size:30px;font-weight:800;letter-spacing:-0.02em;margin-top:3px">6</div></div>
|
|
63
|
+
<div><div style="font-size:10.5px;text-transform:uppercase;letter-spacing:0.08em;color:var(--cs-color-text-muted);font-weight:700" data-i18n="k2">In progress</div><div style="font-size:30px;font-weight:800;letter-spacing:-0.02em;margin-top:3px">4</div></div>
|
|
64
|
+
<div><div style="font-size:10.5px;text-transform:uppercase;letter-spacing:0.08em;color:var(--cs-color-text-muted);font-weight:700" data-i18n="k3">Shipped</div><div style="font-size:30px;font-weight:800;letter-spacing:-0.02em;margin-top:3px">1</div></div>
|
|
65
|
+
<div><div style="font-size:10.5px;text-transform:uppercase;letter-spacing:0.08em;color:var(--cs-color-text-muted);font-weight:700" data-i18n="k4">Avg progress</div><div style="font-size:30px;font-weight:800;letter-spacing:-0.02em;margin-top:3px;color:var(--cs-color-text-accent)">70%</div></div>
|
|
66
|
+
</div>
|
|
67
|
+
<div style="display:grid;grid-template-columns:1fr 1fr;gap:16px">
|
|
68
|
+
<div style="background:var(--cs-color-surface-panel);border:1px solid var(--cs-color-border-default);border-radius:var(--cs-radius-lg);box-shadow:var(--cs-shadow-sm);padding:18px 20px">
|
|
69
|
+
<div style="display:flex;justify-content:space-between;align-items:baseline;gap:10px"><b style="font-size:15px" data-i18n="cardTitle">Checkout rebuild</b><span style="font-size:12px;color:var(--cs-color-text-muted)">72%</span></div>
|
|
70
|
+
<p style="margin:6px 0 14px;font-size:13px;color:var(--cs-color-text-muted)" data-i18n="cardBody">Staging cutover on track for the milestone.</p>
|
|
71
|
+
<div style="height:8px;border-radius:999px;background:var(--cs-color-surface-raised);overflow:hidden"><span style="display:block;height:100%;width:72%;background:var(--cs-accent);border-radius:999px"></span></div>
|
|
72
|
+
<span style="display:inline-block;margin-top:14px;background:var(--cs-accent-tint);color:var(--cs-color-text-accent);font-weight:700;font-size:11.5px;padding:4px 10px;border-radius:999px" data-i18n="badge">In progress</span>
|
|
73
|
+
</div>
|
|
74
|
+
<div style="background:var(--cs-color-surface-panel);border:1px solid var(--cs-color-border-default);border-radius:var(--cs-radius-lg);box-shadow:var(--cs-shadow-sm);padding:18px 20px;display:flex;flex-direction:column;gap:10px">
|
|
75
|
+
<b style="font-size:15px" data-i18n="wishTitle">Make a wish</b>
|
|
76
|
+
<span style="border:1px solid var(--cs-component-textfield-border-default);border-radius:var(--cs-radius-md);background:var(--cs-color-surface-panel);padding:var(--cs-component-textfield-paddingY) var(--cs-component-textfield-paddingX);font-size:13.5px;color:var(--cs-color-text-muted);min-height:var(--cs-component-textfield-minHeight);box-sizing:border-box;display:flex;align-items:center" data-i18n="wishPh">A faster checkout, an app, a tool…</span>
|
|
77
|
+
<div style="display:flex;gap:10px;align-items:center">
|
|
78
|
+
<span style="display:inline-flex;align-items:center;background:var(--cs-component-button-primary-bg);color:var(--cs-component-button-primary-fg);font-weight:700;font-size:13.5px;padding:0 var(--cs-component-button-md-paddingX);border-radius:var(--cs-component-button-radius);min-height:var(--cs-component-button-md-minHeight);box-shadow:var(--cs-shadow-xs)" data-i18n="wishCta">Make a wish</span>
|
|
79
|
+
<a href="#" style="font-size:13.5px;font-weight:600" data-i18n="how">How it works</a>
|
|
80
|
+
</div>
|
|
81
|
+
<p style="margin:2px 0 0;font-size:12px;color:var(--cs-color-text-muted)" data-i18n="focus">Focus rings stay Ochre in every identity — try tabbing the pills above.</p>
|
|
82
|
+
</div>
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
<script>
|
|
86
|
+
(function(){
|
|
87
|
+
var stage=document.getElementById('stage');
|
|
88
|
+
var I18N={
|
|
89
|
+
en:{title:'Status Hub',subtitle:'Identity Lab · Theme × Element × Language',cta:'New project',k1:'Projects',k2:'In progress',k3:'Shipped',k4:'Avg progress',cardTitle:'Checkout rebuild',cardBody:'Staging cutover on track for the milestone.',badge:'In progress',wishTitle:'Make a wish',wishPh:'A faster checkout, an app, a tool…',wishCta:'Make a wish',how:'How it works',focus:'Focus rings stay Ochre in every identity — try tabbing the pills above.'},
|
|
90
|
+
vi:{title:'Status Hub',subtitle:'Phòng lab nhận diện · Theme × Element × Language',cta:'Dự án mới',k1:'Dự án',k2:'Đang làm',k3:'Đã giao',k4:'Tiến độ TB',cardTitle:'Tái dựng checkout',cardBody:'Chuyển staging đúng milestone.',badge:'Đang làm',wishTitle:'Ước một điều',wishPh:'Checkout nhanh hơn, một app, một công cụ…',wishCta:'Ước ngay',how:'Cách hoạt động',focus:'Vòng focus luôn Ochre ở mọi nhận diện — thử Tab trên các pill phía trên.'}
|
|
91
|
+
};
|
|
92
|
+
function applyLang(lang){
|
|
93
|
+
var pack=I18N[lang]||I18N.en;
|
|
94
|
+
stage.setAttribute('lang', lang);
|
|
95
|
+
document.documentElement.setAttribute('lang', lang);
|
|
96
|
+
stage.querySelectorAll('[data-i18n]').forEach(function(el){
|
|
97
|
+
var k=el.getAttribute('data-i18n'); if(pack[k]!=null) el.textContent=pack[k];
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
function wire(rowId, apply){
|
|
101
|
+
var row=document.getElementById(rowId);
|
|
102
|
+
row.addEventListener('click',function(e){
|
|
103
|
+
var b=e.target.closest('.pill'); if(!b) return;
|
|
104
|
+
row.querySelectorAll('.pill').forEach(function(p){p.classList.remove('on')});
|
|
105
|
+
b.classList.add('on'); apply(b);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
wire('els',function(b){
|
|
109
|
+
if(b.dataset.el){stage.setAttribute('data-cs-element',b.dataset.el);}else{stage.removeAttribute('data-cs-element');}
|
|
110
|
+
if(b.dataset.va){stage.setAttribute('data-cs-variant',b.dataset.va);}else{stage.removeAttribute('data-cs-variant');}
|
|
111
|
+
});
|
|
112
|
+
wire('themes',function(b){
|
|
113
|
+
if(b.dataset.theme){stage.setAttribute('data-theme',b.dataset.theme);document.documentElement.setAttribute('data-theme',b.dataset.theme);}
|
|
114
|
+
else{stage.removeAttribute('data-theme');document.documentElement.removeAttribute('data-theme');}
|
|
115
|
+
});
|
|
116
|
+
wire('langs',function(b){ applyLang(b.dataset.lang||'en'); });
|
|
117
|
+
// Parent frame (e.g. Storybook Live iframe host) can postMessage axes
|
|
118
|
+
window.addEventListener('message',function(ev){
|
|
119
|
+
var d=ev.data||{}; if(d.type!=='__cs_axes') return;
|
|
120
|
+
if(d.theme!==undefined){
|
|
121
|
+
if(d.theme){stage.setAttribute('data-theme',d.theme);document.documentElement.setAttribute('data-theme',d.theme);}
|
|
122
|
+
else{stage.removeAttribute('data-theme');document.documentElement.removeAttribute('data-theme');}
|
|
123
|
+
document.querySelectorAll('#themes .pill').forEach(function(p){p.classList.toggle('on',(p.dataset.theme||'')===(d.theme||''));});
|
|
124
|
+
}
|
|
125
|
+
if(d.element!==undefined){
|
|
126
|
+
if(d.element) stage.setAttribute('data-cs-element',d.element); else stage.removeAttribute('data-cs-element');
|
|
127
|
+
if(d.variant) stage.setAttribute('data-cs-variant',d.variant); else stage.removeAttribute('data-cs-variant');
|
|
128
|
+
}
|
|
129
|
+
if(d.lang) applyLang(d.lang);
|
|
130
|
+
});
|
|
131
|
+
window.__csApplyAxes=function(ax){ window.postMessage(Object.assign({type:'__cs_axes'},ax||{}), '*'); };
|
|
132
|
+
})();
|
|
133
|
+
</script>
|
|
134
|
+
</body></html>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<!-- @dsCard group="Status Hub" viewport="1320x860" name="Status Hub — portfolio dashboard" subtitle="KPIs, board / table / releases lenses, detail drawer" -->
|
|
2
|
+
<!DOCTYPE html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="utf-8" />
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
7
|
+
<title>CyberSkill · Status Hub</title>
|
|
8
|
+
<link rel="icon" href="../../assets/favicon.svg" />
|
|
9
|
+
<link rel="stylesheet" href="../../styles.css" />
|
|
10
|
+
<link rel="stylesheet" href="status.css" />
|
|
11
|
+
<style>html,body{margin:0;background:var(--cs-color-surface-page);min-height:100vh}</style>
|
|
12
|
+
<script src="https://unpkg.com/react@18.3.1/umd/react.development.js" integrity="sha384-hD6/rw4ppMLGNu3tX5cjIb+uRZ7UkRJ6BPkLpg4hAu/6onKUg4lLsHAs9EBPT82L" crossorigin="anonymous"></script>
|
|
13
|
+
<script src="https://unpkg.com/react-dom@18.3.1/umd/react-dom.development.js" integrity="sha384-u6aeetuaXnQ38mYT8rp6sbXaQe3NL9t+IBXmnYxwkUI2Hw4bsp2Wvmx4yRQF1uAm" crossorigin="anonymous"></script>
|
|
14
|
+
<script src="https://unpkg.com/@babel/standalone@7.29.0/babel.min.js" integrity="sha384-m08KidiNqLdpJqLq95G/LEi8Qvjl/xUYll3QILypMoQ65QorJ9Lvtp2RXYGBFj1y" crossorigin="anonymous"></script>
|
|
15
|
+
<script src="data.js"></script>
|
|
16
|
+
</head>
|
|
17
|
+
<body>
|
|
18
|
+
<div id="root"></div>
|
|
19
|
+
<script type="text/babel" src="StatusHub.jsx"></script>
|
|
20
|
+
<script type="text/babel">
|
|
21
|
+
ReactDOM.createRoot(document.getElementById("root")).render(<StatusHub />);
|
|
22
|
+
</script>
|
|
23
|
+
</body>
|
|
24
|
+
</html>
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
<!-- @dsCard group="Status Hub" viewport="1280x760" name="Status Hub — sign in" subtitle="Umber split login with brand panel + form controls" -->
|
|
2
|
+
<!DOCTYPE html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="utf-8" />
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
7
|
+
<title>CyberSkill · Sign in</title>
|
|
8
|
+
<link rel="icon" href="../../assets/favicon.svg" />
|
|
9
|
+
<link rel="stylesheet" href="../../styles.css" />
|
|
10
|
+
<style>
|
|
11
|
+
html, body { margin: 0; min-height: 100vh; }
|
|
12
|
+
.login { display: grid; grid-template-columns: 1.05fr 1fr; min-height: 100vh; }
|
|
13
|
+
.pane-brand { position: relative; overflow: hidden; background: var(--cs-color-brand-umber); color: #fff; padding: 56px 60px; display: flex; flex-direction: column; }
|
|
14
|
+
.pane-brand::before { content: ""; position: absolute; inset: 0; background-image: url("../../assets/aurora-gold.jpg"); background-size: cover; background-position: center; opacity: .42; }
|
|
15
|
+
.pane-brand::after { content: ""; position: absolute; inset: 0; background: linear-gradient(160deg, rgba(26,17,8,.35), rgba(26,17,8,.8)); }
|
|
16
|
+
.pane-brand > * { position: relative; z-index: 1; }
|
|
17
|
+
.brand-lock { display: flex; align-items: center; gap: 12px; font-weight: 800; font-size: 20px; }
|
|
18
|
+
.brand-lock img { width: 40px; height: 40px; }
|
|
19
|
+
.pane-brand h2 { font-size: 40px; font-weight: 800; letter-spacing: -.02em; line-height: 1.08; color: var(--cs-color-brand-ochre); margin: auto 0 8px; }
|
|
20
|
+
.pane-brand p { font-size: 17px; opacity: .9; margin: 0; max-width: 420px; }
|
|
21
|
+
.pane-form { display: grid; place-items: center; padding: 40px 24px; background: var(--cs-color-surface-page); }
|
|
22
|
+
.box { width: min(400px, 100%); }
|
|
23
|
+
.box h1 { font-size: 30px; font-weight: 800; letter-spacing: -.02em; margin: 0 0 4px; }
|
|
24
|
+
.box .sub { color: var(--cs-color-text-muted); margin: 0 0 28px; }
|
|
25
|
+
form { display: grid; gap: 16px; }
|
|
26
|
+
.rowbetween { display: flex; align-items: center; justify-content: space-between; }
|
|
27
|
+
.fine { text-align: center; font-size: 13px; color: var(--cs-color-text-muted); margin-top: 4px; }
|
|
28
|
+
@media (max-width: 820px) { .login { grid-template-columns: 1fr; } .pane-brand { display: none; } }
|
|
29
|
+
</style>
|
|
30
|
+
</head>
|
|
31
|
+
<body>
|
|
32
|
+
<div class="login">
|
|
33
|
+
<div class="pane-brand">
|
|
34
|
+
<div class="brand-lock"><img src="../../assets/logo-mark.svg" alt="" />CyberSkill</div>
|
|
35
|
+
<h2>Turn Your Will Into Real</h2>
|
|
36
|
+
<p>Sign in to the Status Hub — one page, three lenses across every wish in flight.</p>
|
|
37
|
+
</div>
|
|
38
|
+
<div class="pane-form">
|
|
39
|
+
<div class="box">
|
|
40
|
+
<h1>Sign in</h1>
|
|
41
|
+
<p class="sub">Welcome back. Đăng nhập để tiếp tục.</p>
|
|
42
|
+
<form onsubmit="return false">
|
|
43
|
+
<label class="cs-field"><span class="cs-field__label">Work email</span><input class="cs-field__control" type="email" placeholder="you@cyberskill.world" /></label>
|
|
44
|
+
<label class="cs-field"><span class="cs-field__label">Password</span><input class="cs-field__control" type="password" placeholder="••••••••" value="wishgranted" /></label>
|
|
45
|
+
<div class="rowbetween">
|
|
46
|
+
<label class="cs-switch"><input type="checkbox" role="switch" checked /><span class="cs-switch__track"></span><span class="cs-switch__label">Remember me</span></label>
|
|
47
|
+
<a href="#">Forgot password?</a>
|
|
48
|
+
</div>
|
|
49
|
+
<button type="submit" class="cs-button cs-button--primary cs-button--full">Sign in</button>
|
|
50
|
+
<button type="button" class="cs-button cs-button--ghost cs-button--full">✦ Talk to Lumi instead</button>
|
|
51
|
+
</form>
|
|
52
|
+
<p class="fine">New here? <a href="#">Ask for access</a></p>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
<button id="themeToggle" aria-label="Toggle theme" style="position:fixed;right:20px;bottom:20px;z-index:60;border:1px solid var(--cs-color-border-default);background:var(--cs-color-surface-panel);color:var(--cs-color-text-primary);width:44px;height:44px;border-radius:999px;cursor:pointer;box-shadow:var(--cs-shadow-md)">☾</button>
|
|
57
|
+
<script>
|
|
58
|
+
document.getElementById("themeToggle").addEventListener("click", function () {
|
|
59
|
+
var el = document.documentElement, dark = el.getAttribute("data-theme") === "dark";
|
|
60
|
+
el.setAttribute("data-theme", dark ? "light" : "dark");
|
|
61
|
+
this.textContent = dark ? "☾" : "☀";
|
|
62
|
+
});
|
|
63
|
+
</script>
|
|
64
|
+
</body>
|
|
65
|
+
</html>
|