@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,12 @@
|
|
|
1
|
+
import figma from '@figma/code-connect'
|
|
2
|
+
import { TagInput } from './TagInput.jsx'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Code Connect stub — TagInput
|
|
6
|
+
* Prop maps stay minimal until the matching Figma library component is published;
|
|
7
|
+
* then set nodeId in code-connect/node-map.json and re-run generate-code-connect.
|
|
8
|
+
*/
|
|
9
|
+
figma.connect(TagInput, 'https://www.figma.com/design/CS_FIGMA_FILE_KEY/CyberSkill?node-id=9999-83', {
|
|
10
|
+
example: () => <TagInput />,
|
|
11
|
+
imports: ["import { TagInput } from '@cyberskill/design'"],
|
|
12
|
+
})
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { makeT, useLang } from "../_i18n/i18n.js";
|
|
3
|
+
import { cx } from "../_utils/cx.js";
|
|
4
|
+
|
|
5
|
+
/** CyberSkill TagInput — multi-value token input. Enter/comma adds, Backspace removes last, blur commits. */
|
|
6
|
+
export function TagInput({ value, defaultValue = [], onChange, placeholder, max, disabled = false, lang, className }) {
|
|
7
|
+
const [inner, setInner] = React.useState(defaultValue);
|
|
8
|
+
const tags = value != null ? value : inner;
|
|
9
|
+
const [q, setQ] = React.useState("");
|
|
10
|
+
const set = (arr) => { if (value == null) setInner(arr); onChange && onChange(arr); };
|
|
11
|
+
const add = (s) => {
|
|
12
|
+
s = s.trim();
|
|
13
|
+
if (!s) return;
|
|
14
|
+
if (tags.includes(s)) { setQ(""); return; }
|
|
15
|
+
if (max != null && tags.length >= max) return;
|
|
16
|
+
set([...tags, s]); setQ("");
|
|
17
|
+
};
|
|
18
|
+
const [ref, L] = useLang(lang);
|
|
19
|
+
const t = makeT("TagInput", L);
|
|
20
|
+
const ph = placeholder != null ? placeholder : t("placeholder");
|
|
21
|
+
return (
|
|
22
|
+
<div ref={ref} className={cx("cs-taginput", className)}>
|
|
23
|
+
{tags.map((tag) => (
|
|
24
|
+
<span key={tag} className="cs-tag">{tag}
|
|
25
|
+
<button type="button" className="cs-tag__close" aria-label={t("remove") + " " + tag} onClick={() => set(tags.filter((x) => x !== tag))} disabled={disabled}>
|
|
26
|
+
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.4" strokeLinecap="round" aria-hidden="true"><path d="M6 6l12 12M18 6L6 18" /></svg>
|
|
27
|
+
</button>
|
|
28
|
+
</span>
|
|
29
|
+
))}
|
|
30
|
+
<input value={q} placeholder={tags.length ? "" : ph} disabled={disabled}
|
|
31
|
+
onChange={(e) => setQ(e.target.value)}
|
|
32
|
+
onKeyDown={(e) => {
|
|
33
|
+
if (e.key === "Enter" || e.key === ",") { e.preventDefault(); add(q); }
|
|
34
|
+
else if (e.key === "Backspace" && !q && tags.length) { set(tags.slice(0, -1)); }
|
|
35
|
+
}}
|
|
36
|
+
onBlur={() => add(q)} />
|
|
37
|
+
</div>
|
|
38
|
+
);
|
|
39
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
import type { ReactNode } from "react";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Multi-line text input in the CyberSkill field frame, with description + error
|
|
6
|
+
* wiring identical to TextField. Vertically resizable; diacritic/IME-safe.
|
|
7
|
+
*/
|
|
8
|
+
export interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {
|
|
9
|
+
label?: ReactNode;
|
|
10
|
+
description?: ReactNode;
|
|
11
|
+
error?: ReactNode;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function Textarea(props: TextareaProps): React.ReactElement;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import figma from '@figma/code-connect'
|
|
2
|
+
import { Textarea } from './Textarea.jsx'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Code Connect stub — Textarea
|
|
6
|
+
* Prop maps stay minimal until the matching Figma library component is published;
|
|
7
|
+
* then set nodeId in code-connect/node-map.json and re-run generate-code-connect.
|
|
8
|
+
*/
|
|
9
|
+
figma.connect(Textarea, 'https://www.figma.com/design/CS_FIGMA_FILE_KEY/CyberSkill?node-id=9999-85', {
|
|
10
|
+
example: () => <Textarea />,
|
|
11
|
+
imports: ["import { Textarea } from '@cyberskill/design'"],
|
|
12
|
+
})
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { cx } from "../_utils/cx.js";
|
|
3
|
+
|
|
4
|
+
/** CyberSkill Textarea — multi-line input in the .cs-field frame; label/description/error. */
|
|
5
|
+
export function Textarea({ id, label, description, error, disabled = false, rows = 4, className, ...props }) {
|
|
6
|
+
const gid = React.useId();
|
|
7
|
+
const tid = id ?? gid;
|
|
8
|
+
const descId = description ? tid + "-desc" : undefined;
|
|
9
|
+
const errId = error ? tid + "-err" : undefined;
|
|
10
|
+
const describedBy = [descId, errId].filter(Boolean).join(" ") || undefined;
|
|
11
|
+
return (
|
|
12
|
+
<label className={cx("cs-field", disabled && "is-disabled", error && "is-invalid", className)} htmlFor={tid}>
|
|
13
|
+
{label ? <span className="cs-field__label">{label}</span> : null}
|
|
14
|
+
{description ? <span id={descId} className="cs-field__description">{description}</span> : null}
|
|
15
|
+
<textarea {...props} id={tid} rows={rows} disabled={disabled} aria-invalid={error ? true : undefined} aria-describedby={describedBy} className="cs-field__control" />
|
|
16
|
+
{error ? <span id={errId} className="cs-field__error" role="alert">{error}</span> : null}
|
|
17
|
+
</label>
|
|
18
|
+
);
|
|
19
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** 24-hour time select in fixed minute steps (default 30). Controlled:
|
|
2
|
+
* value "HH:MM" / onChange("HH:MM"). Bilingual aria label via the registry. */
|
|
3
|
+
export interface TimePickerProps {
|
|
4
|
+
/** "HH:MM" 24h. Default "09:00". */
|
|
5
|
+
value?: string;
|
|
6
|
+
onChange?: (time: string) => void;
|
|
7
|
+
/** Minute step. Default 30. */
|
|
8
|
+
step?: number;
|
|
9
|
+
/** Accessible label. Default from the registry ("Time" / "Giờ"). */
|
|
10
|
+
label?: string;
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
/** "en" | "vi" — else resolved from the nearest [lang] ancestor (vi default). */
|
|
13
|
+
lang?: string;
|
|
14
|
+
className?: string;
|
|
15
|
+
}
|
|
16
|
+
export function TimePicker(props: TimePickerProps): React.ReactElement;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import figma from '@figma/code-connect'
|
|
2
|
+
import { TimePicker } from './TimePicker.jsx'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Code Connect stub — TimePicker
|
|
6
|
+
* Prop maps stay minimal until the matching Figma library component is published;
|
|
7
|
+
* then set nodeId in code-connect/node-map.json and re-run generate-code-connect.
|
|
8
|
+
*/
|
|
9
|
+
figma.connect(TimePicker, 'https://www.figma.com/design/CS_FIGMA_FILE_KEY/CyberSkill?node-id=9999-88', {
|
|
10
|
+
example: () => <TimePicker />,
|
|
11
|
+
imports: ["import { TimePicker } from '@cyberskill/design'"],
|
|
12
|
+
})
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { makeT, useLang } from "../_i18n/i18n.js";
|
|
3
|
+
import { cx } from "../_utils/cx.js";
|
|
4
|
+
const CLOCK = <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="9" /><path d="M12 7v5l3 3" /></svg>;
|
|
5
|
+
|
|
6
|
+
/** CyberSkill TimePicker — 24h time select in fixed steps. Controlled value ("HH:MM")/onChange. */
|
|
7
|
+
export function TimePicker({ value = "09:00", onChange, step = 30, label, disabled = false, lang, className }) {
|
|
8
|
+
const [ref, L] = useLang(lang);
|
|
9
|
+
const t = makeT("TimePicker", L);
|
|
10
|
+
const opts = [];
|
|
11
|
+
for (let m = 0; m < 24 * 60; m += step) {
|
|
12
|
+
opts.push(String(Math.floor(m / 60)).padStart(2, "0") + ":" + String(m % 60).padStart(2, "0"));
|
|
13
|
+
}
|
|
14
|
+
return (
|
|
15
|
+
<span ref={ref} className={cx("cs-timepicker", className)}>
|
|
16
|
+
{CLOCK}
|
|
17
|
+
<select aria-label={label != null ? label : t("label")} disabled={disabled} value={value} onChange={(e) => onChange && onChange(e.target.value)}>
|
|
18
|
+
{opts.map((o) => <option key={o} value={o}>{o}</option>)}
|
|
19
|
+
</select>
|
|
20
|
+
</span>
|
|
21
|
+
);
|
|
22
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
|
|
3
|
+
/** A single pressable on/off button (aria-pressed). Not a form Switch and not a
|
|
4
|
+
* SegmentedControl — use it for standalone style/state toggles (e.g. Bold). */
|
|
5
|
+
export interface ToggleProps {
|
|
6
|
+
/** Controlled pressed state. */
|
|
7
|
+
pressed?: boolean;
|
|
8
|
+
/** Uncontrolled initial state. Default false. */
|
|
9
|
+
defaultPressed?: boolean;
|
|
10
|
+
onChange?: (pressed: boolean) => void;
|
|
11
|
+
icon?: ReactNode;
|
|
12
|
+
children?: ReactNode;
|
|
13
|
+
disabled?: boolean;
|
|
14
|
+
className?: string;
|
|
15
|
+
}
|
|
16
|
+
export function Toggle(props: ToggleProps): React.ReactElement;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import figma from '@figma/code-connect'
|
|
2
|
+
import { Toggle } from './Toggle.jsx'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Code Connect stub — Toggle
|
|
6
|
+
* Prop maps stay minimal until the matching Figma library component is published;
|
|
7
|
+
* then set nodeId in code-connect/node-map.json and re-run generate-code-connect.
|
|
8
|
+
*/
|
|
9
|
+
figma.connect(Toggle, 'https://www.figma.com/design/CS_FIGMA_FILE_KEY/CyberSkill?node-id=9999-90', {
|
|
10
|
+
example: () => <Toggle />,
|
|
11
|
+
imports: ["import { Toggle } from '@cyberskill/design'"],
|
|
12
|
+
})
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { cx } from "../_utils/cx.js";
|
|
3
|
+
|
|
4
|
+
/** CyberSkill Toggle — a single pressable on/off button (≠ Switch: no form semantics; ≠ SegmentedControl: standalone). */
|
|
5
|
+
export function Toggle({ pressed, defaultPressed = false, onChange, icon, children, disabled = false, className, ...props }) {
|
|
6
|
+
const [inner, setInner] = React.useState(defaultPressed);
|
|
7
|
+
const on = pressed != null ? pressed : inner;
|
|
8
|
+
const flip = () => { const v = !on; if (pressed == null) setInner(v); onChange && onChange(v); };
|
|
9
|
+
return (
|
|
10
|
+
<button type="button" className={cx("cs-toggle", className)} aria-pressed={on} disabled={disabled} onClick={flip} {...props}>
|
|
11
|
+
{icon ? <span aria-hidden="true" style={{ display: "inline-flex" }}>{icon}</span> : null}
|
|
12
|
+
{children}
|
|
13
|
+
</button>
|
|
14
|
+
);
|
|
15
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
**Toggle** — single pressable on/off button (`aria-pressed`). Standalone state toggle; not a Switch (form) or SegmentedControl (choice set).
|
|
2
|
+
|
|
3
|
+
```jsx
|
|
4
|
+
<Toggle defaultPressed icon={<Icon name="sparkle" size="sm"/>}>Bold</Toggle>
|
|
5
|
+
<Toggle pressed={on} onChange={setOn}>Aurora wash</Toggle>
|
|
6
|
+
```
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
|
|
3
|
+
/** Two-list mover: check items, ‹/› them across. value = keys in the target list. */
|
|
4
|
+
export interface TransferItem { key: string; label: ReactNode; }
|
|
5
|
+
export interface TransferProps {
|
|
6
|
+
items: TransferItem[];
|
|
7
|
+
value?: string[];
|
|
8
|
+
onChange?: (targetKeys: string[]) => void;
|
|
9
|
+
/** [sourceTitle, targetTitle]; bilingual defaults from the registry. */
|
|
10
|
+
titles?: [ReactNode, ReactNode];
|
|
11
|
+
lang?: string;
|
|
12
|
+
className?: string;
|
|
13
|
+
}
|
|
14
|
+
export function Transfer(props: TransferProps): React.ReactElement;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import figma from '@figma/code-connect'
|
|
2
|
+
import { Transfer } from './Transfer.jsx'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Code Connect stub — Transfer
|
|
6
|
+
* Prop maps stay minimal until the matching Figma library component is published;
|
|
7
|
+
* then set nodeId in code-connect/node-map.json and re-run generate-code-connect.
|
|
8
|
+
*/
|
|
9
|
+
figma.connect(Transfer, 'https://www.figma.com/design/CS_FIGMA_FILE_KEY/CyberSkill?node-id=9999-94', {
|
|
10
|
+
example: () => <Transfer />,
|
|
11
|
+
imports: ["import { Transfer } from '@cyberskill/design'"],
|
|
12
|
+
})
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { makeT, useLang } from "../_i18n/i18n.js";
|
|
3
|
+
import { cx } from "../_utils/cx.js";
|
|
4
|
+
|
|
5
|
+
/** CyberSkill Transfer — move items between two lists (checkbox select + ⇄ buttons). */
|
|
6
|
+
export function Transfer({ items = [], value = [], onChange, titles, lang, className }) {
|
|
7
|
+
const [checked, setChecked] = React.useState([]);
|
|
8
|
+
const [ref, L] = useLang(lang);
|
|
9
|
+
const t = makeT("Transfer", L);
|
|
10
|
+
const tt = titles || [t("source"), t("target")];
|
|
11
|
+
const inTarget = (k) => value.includes(k);
|
|
12
|
+
const toggle = (k) => setChecked((c) => (c.includes(k) ? c.filter((x) => x !== k) : [...c, k]));
|
|
13
|
+
const move = (toTarget) => {
|
|
14
|
+
const mv = checked.filter((k) => inTarget(k) !== toTarget);
|
|
15
|
+
if (!mv.length) return;
|
|
16
|
+
onChange && onChange(toTarget ? [...value, ...mv] : value.filter((k) => !mv.includes(k)));
|
|
17
|
+
setChecked([]);
|
|
18
|
+
};
|
|
19
|
+
const List = ({ target }) => (
|
|
20
|
+
<div className="cs-transfer__list">
|
|
21
|
+
<div className="cs-transfer__title">{target ? tt[1] : tt[0]}</div>
|
|
22
|
+
<ul>
|
|
23
|
+
{items.filter((it) => inTarget(it.key) === target).map((it) => (
|
|
24
|
+
<li key={it.key}>
|
|
25
|
+
<label><input type="checkbox" checked={checked.includes(it.key)} onChange={() => toggle(it.key)} /> {it.label}</label>
|
|
26
|
+
</li>
|
|
27
|
+
))}
|
|
28
|
+
</ul>
|
|
29
|
+
</div>
|
|
30
|
+
);
|
|
31
|
+
return (
|
|
32
|
+
<div ref={ref} className={cx("cs-transfer", className)}>
|
|
33
|
+
<List target={false} />
|
|
34
|
+
<div className="cs-transfer__ops">
|
|
35
|
+
<button type="button" className="cs-button cs-button--secondary cs-button--xs" aria-label={t("toTarget")} onClick={() => move(true)}>›</button>
|
|
36
|
+
<button type="button" className="cs-button cs-button--secondary cs-button--xs" aria-label={t("toSource")} onClick={() => move(false)}>‹</button>
|
|
37
|
+
</div>
|
|
38
|
+
<List target={true} />
|
|
39
|
+
</div>
|
|
40
|
+
);
|
|
41
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { TreeNode } from "../data/Tree";
|
|
2
|
+
|
|
3
|
+
/** Field + popover Tree; selecting a LEAF sets the value (branches toggle). */
|
|
4
|
+
export interface TreeSelectProps {
|
|
5
|
+
nodes: TreeNode[];
|
|
6
|
+
value?: string;
|
|
7
|
+
onChange?: (key: string, node: TreeNode) => void;
|
|
8
|
+
/** Default from the registry ("Select…" / "Chọn…"). */
|
|
9
|
+
placeholder?: string;
|
|
10
|
+
label?: string;
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
lang?: string;
|
|
13
|
+
className?: string;
|
|
14
|
+
}
|
|
15
|
+
export function TreeSelect(props: TreeSelectProps): React.ReactElement;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import figma from '@figma/code-connect'
|
|
2
|
+
import { TreeSelect } from './TreeSelect.jsx'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Code Connect stub — TreeSelect
|
|
6
|
+
* Prop maps stay minimal until the matching Figma library component is published;
|
|
7
|
+
* then set nodeId in code-connect/node-map.json and re-run generate-code-connect.
|
|
8
|
+
*/
|
|
9
|
+
figma.connect(TreeSelect, 'https://www.figma.com/design/CS_FIGMA_FILE_KEY/CyberSkill?node-id=9999-96', {
|
|
10
|
+
example: () => <TreeSelect />,
|
|
11
|
+
imports: ["import { TreeSelect } from '@cyberskill/design'"],
|
|
12
|
+
})
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { makeT, useLang } from "../_i18n/i18n.js";
|
|
3
|
+
import { Tree } from "../data/Tree.jsx";
|
|
4
|
+
import { cx } from "../_utils/cx.js";
|
|
5
|
+
|
|
6
|
+
/** CyberSkill TreeSelect — field opening a Tree; picking a node sets the value. */
|
|
7
|
+
export function TreeSelect({ nodes = [], value, onChange, placeholder, label, disabled = false, lang, className }) {
|
|
8
|
+
const [open, setOpen] = React.useState(false);
|
|
9
|
+
const wrap = React.useRef(null);
|
|
10
|
+
const [ref, L] = useLang(lang);
|
|
11
|
+
const t = makeT("TreeSelect", L);
|
|
12
|
+
const ph = placeholder != null ? placeholder : t("placeholder");
|
|
13
|
+
const find = (ns) => { for (const n of ns) { if (n.key === value) return n; const c = n.children && find(n.children); if (c) return c; } return null; };
|
|
14
|
+
const sel = find(nodes);
|
|
15
|
+
React.useEffect(() => {
|
|
16
|
+
if (!open) return;
|
|
17
|
+
const d = (e) => { if (wrap.current && !wrap.current.contains(e.target)) setOpen(false); };
|
|
18
|
+
const k = (e) => { if (e.key === "Escape") setOpen(false); };
|
|
19
|
+
document.addEventListener("mousedown", d);
|
|
20
|
+
document.addEventListener("keydown", k);
|
|
21
|
+
return () => { document.removeEventListener("mousedown", d); document.removeEventListener("keydown", k); };
|
|
22
|
+
}, [open]);
|
|
23
|
+
return (
|
|
24
|
+
<div ref={(el) => { wrap.current = el; ref.current = el; }} className={cx("cs-treeselect", className)}>
|
|
25
|
+
<button type="button" className="cs-treeselect__field" disabled={disabled} aria-haspopup="tree" aria-expanded={open} aria-label={label} onClick={() => setOpen((o) => !o)}>
|
|
26
|
+
<span className={sel ? undefined : "ph"}>{sel ? sel.label : ph}</span><span aria-hidden="true">▾</span>
|
|
27
|
+
</button>
|
|
28
|
+
{open ? (
|
|
29
|
+
<div className="cs-treeselect__pop">
|
|
30
|
+
<Tree nodes={nodes} selected={value} defaultOpen lang={L} onSelect={(k, n) => { if (!(n.children && n.children.length)) { onChange && onChange(k, n); setOpen(false); } }} />
|
|
31
|
+
</div>
|
|
32
|
+
) : null}
|
|
33
|
+
</div>
|
|
34
|
+
);
|
|
35
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<!-- @dsCard group="Components" viewport="700x360" name="Form controls II" subtitle="Search, NumberField, Slider, FileUpload, SegmentedControl" -->
|
|
2
|
+
<!DOCTYPE html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="utf-8" />
|
|
6
|
+
<link rel="stylesheet" href="../../styles.css" />
|
|
7
|
+
<style>
|
|
8
|
+
body { margin: 0; background: var(--cs-color-surface-page); padding: 22px 24px; }
|
|
9
|
+
.stack { display: grid; gap: 18px; max-width: 620px; }
|
|
10
|
+
.row { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; }
|
|
11
|
+
.lbl { width: 100%; font: 600 11px/1 var(--cs-font-family-ui); text-transform: uppercase; letter-spacing: .09em; color: var(--cs-color-text-muted); }
|
|
12
|
+
</style>
|
|
13
|
+
<script src="https://unpkg.com/react@18.3.1/umd/react.development.js" integrity="sha384-hD6/rw4ppMLGNu3tX5cjIb+uRZ7UkRJ6BPkLpg4hAu/6onKUg4lLsHAs9EBPT82L" crossorigin="anonymous"></script>
|
|
14
|
+
<script src="https://unpkg.com/react-dom@18.3.1/umd/react-dom.development.js" integrity="sha384-u6aeetuaXnQ38mYT8rp6sbXaQe3NL9t+IBXmnYxwkUI2Hw4bsp2Wvmx4yRQF1uAm" crossorigin="anonymous"></script>
|
|
15
|
+
<script src="https://unpkg.com/@babel/standalone@7.29.0/babel.min.js" integrity="sha384-m08KidiNqLdpJqLq95G/LEi8Qvjl/xUYll3QILypMoQ65QorJ9Lvtp2RXYGBFj1y" crossorigin="anonymous"></script>
|
|
16
|
+
<script src="../../_ds_bundle.js"></script>
|
|
17
|
+
</head>
|
|
18
|
+
<body>
|
|
19
|
+
<div id="root"></div>
|
|
20
|
+
<script type="text/babel">
|
|
21
|
+
const { SearchField, NumberField, Slider, FileUpload, SegmentedControl } = (window[Object.keys(window).find(k=>/^CyberSkillDesignSystem_[0-9a-f]{6}$/.test(k))]||{});
|
|
22
|
+
const { useState } = React;
|
|
23
|
+
function Demo() {
|
|
24
|
+
const [q, setQ] = useState("Design System");
|
|
25
|
+
const [n, setN] = useState(3);
|
|
26
|
+
const [v, setV] = useState(60);
|
|
27
|
+
const [seg, setSeg] = useState("board");
|
|
28
|
+
return (
|
|
29
|
+
<div className="stack">
|
|
30
|
+
<div className="row"><span className="lbl">Search</span><div style={{flex:1,minWidth:260}}><SearchField value={q} onChange={setQ} placeholder="Search projects…" /></div></div>
|
|
31
|
+
<div className="row"><span className="lbl">Number & slider</span><NumberField value={n} onChange={setN} min={1} max={20} /><div style={{flex:1,minWidth:180}}><Slider min={0} max={100} value={v} onChange={(e)=>setV(+e.target.value)} /></div></div>
|
|
32
|
+
<div className="row"><span className="lbl">Segmented</span><SegmentedControl value={seg} onChange={setSeg} options={[{value:"board",label:"Board"},{value:"table",label:"Table"},{value:"releases",label:"Releases"}]} /></div>
|
|
33
|
+
<div className="row"><span className="lbl">File upload</span><div style={{flex:1}}><FileUpload /></div></div>
|
|
34
|
+
</div>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
ReactDOM.createRoot(document.getElementById("root")).render(<Demo />);
|
|
38
|
+
</script>
|
|
39
|
+
</body>
|
|
40
|
+
</html>
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<!-- @dsCard group="Components" viewport="700x360" name="Form controls" subtitle="Select, Checkbox, Radio, Switch, Textarea — brand accent" -->
|
|
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
|
+
<link rel="stylesheet" href="../../styles.css" />
|
|
8
|
+
<style>
|
|
9
|
+
body { margin: 0; background: var(--cs-color-surface-page); padding: 22px 24px; }
|
|
10
|
+
.grid { display: grid; grid-template-columns: 1fr 1fr; gap: 22px 28px; max-width: 640px; align-items: start; }
|
|
11
|
+
</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="../../_ds_bundle.js"></script>
|
|
16
|
+
</head>
|
|
17
|
+
<body>
|
|
18
|
+
<div id="root"></div>
|
|
19
|
+
<script type="text/babel">
|
|
20
|
+
const { Select, Checkbox, RadioGroup, Switch, Textarea } = window[Object.keys(window).find(k=>/^CyberSkillDesignSystem_[0-9a-f]{6}$/.test(k))] || {};
|
|
21
|
+
function Demo() {
|
|
22
|
+
const [plan, setPlan] = React.useState("yr");
|
|
23
|
+
const [dark, setDark] = React.useState(true);
|
|
24
|
+
return (
|
|
25
|
+
<div className="grid">
|
|
26
|
+
<Select label="Squad" options={[{value:"plat",label:"Platform"},{value:"ai",label:"AI"},{value:"growth",label:"Growth"}]} defaultValue="ai" />
|
|
27
|
+
<RadioGroup legend="Billing" value={plan} onChange={setPlan} options={[{value:"mo",label:"Monthly"},{value:"yr",label:"Annual",description:"Two months free"}]} />
|
|
28
|
+
<div style={{display:"grid",gap:12}}>
|
|
29
|
+
<Checkbox label="Email me release notes" defaultChecked />
|
|
30
|
+
<Checkbox label="Bilingual export" description="Ship EN + VN together" />
|
|
31
|
+
<Switch label="Dark theme" checked={dark} onChange={(e)=>setDark(e.target.checked)} />
|
|
32
|
+
</div>
|
|
33
|
+
<Textarea label="Tell us your wish" description="A sentence or two is plenty." rows={3} defaultValue="A faster checkout for our shop." />
|
|
34
|
+
</div>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
ReactDOM.createRoot(document.getElementById("root")).render(<Demo />);
|
|
38
|
+
</script>
|
|
39
|
+
</body>
|
|
40
|
+
</html>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
|
|
3
|
+
export type IconName =
|
|
4
|
+
| "close" | "sun" | "moon" | "arrow-right" | "check"
|
|
5
|
+
| "sparkle" | "chat" | "sound-on" | "sound-off"
|
|
6
|
+
| "search" | "sliders" | "upload" | "download" | "calendar"
|
|
7
|
+
| "user" | "plus" | "trash" | "external" | "menu"
|
|
8
|
+
| "chevron-down" | "chevron-up" | "chevron-left" | "chevron-right"
|
|
9
|
+
| "edit" | "copy" | "info" | "alert-triangle";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* CyberSkill line-icon renderer. One component drives the whole in-repo icon set
|
|
13
|
+
* (no external icon library). Icons stroke with currentColor and size from the
|
|
14
|
+
* --cs-icon-* tokens. Decorative by default; pass `label` to name it for AT.
|
|
15
|
+
*/
|
|
16
|
+
export interface IconProps extends React.SVGAttributes<SVGSVGElement> {
|
|
17
|
+
name: IconName;
|
|
18
|
+
/** Maps to --cs-icon-sm|md|lg. Default "md". */
|
|
19
|
+
size?: "sm" | "md" | "lg";
|
|
20
|
+
/** Accessible name; omit for decorative icons. */
|
|
21
|
+
label?: string;
|
|
22
|
+
strokeWidth?: number;
|
|
23
|
+
className?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function Icon(props: IconProps): React.ReactElement;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import figma from '@figma/code-connect'
|
|
2
|
+
import { Icon } from './Icon.jsx'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Code Connect stub — Icon
|
|
6
|
+
* Prop maps stay minimal until the matching Figma library component is published;
|
|
7
|
+
* then set nodeId in code-connect/node-map.json and re-run generate-code-connect.
|
|
8
|
+
*/
|
|
9
|
+
figma.connect(Icon, 'https://www.figma.com/design/CS_FIGMA_FILE_KEY/CyberSkill?node-id=9999-42', {
|
|
10
|
+
example: () => <Icon />,
|
|
11
|
+
imports: ["import { Icon } from '@cyberskill/design'"],
|
|
12
|
+
})
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* CyberSkill line-icon set (in-repo, no external icon library). Each icon is
|
|
5
|
+
* data — a viewBox plus primitive elements — rendered through this one <Icon>.
|
|
6
|
+
* Line icons use currentColor stroke so they follow the surrounding text token.
|
|
7
|
+
* Sizes come from --cs-icon-* tokens (sm/md/lg). Decorative by default; pass
|
|
8
|
+
* `label` to expose a meaningful icon to assistive tech.
|
|
9
|
+
*/
|
|
10
|
+
export const CS_ICONS = {
|
|
11
|
+
close: { viewBox: "0 0 24 24", els: [["path", { d: "M6 6l12 12M18 6L6 18" }]] },
|
|
12
|
+
sun: { viewBox: "0 0 24 24", els: [
|
|
13
|
+
["circle", { cx: 12, cy: 12, r: 4 }],
|
|
14
|
+
["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" }],
|
|
15
|
+
] },
|
|
16
|
+
moon: { viewBox: "0 0 24 24", els: [["path", { d: "M20 13.5A8 8 0 1 1 10.5 4a6.5 6.5 0 0 0 9.5 9.5z" }]] },
|
|
17
|
+
"arrow-right": { viewBox: "0 0 24 24", els: [["path", { d: "M5 12h14M13 6l6 6-6 6" }]] },
|
|
18
|
+
check: { viewBox: "0 0 24 24", els: [["path", { d: "M4 12.5l5 5 11-11" }]] },
|
|
19
|
+
sparkle: { viewBox: "0 0 24 24", els: [["path", { d: "M12 3l1.8 5.4L19 10l-5.2 1.6L12 17l-1.8-5.4L5 10l5.2-1.6z" }]] },
|
|
20
|
+
chat: { viewBox: "0 0 24 24", els: [["path", { d: "M4 5h16v11H8l-4 4z" }]] },
|
|
21
|
+
"sound-on": { viewBox: "0 0 24 24", els: [
|
|
22
|
+
["path", { d: "M5 9v6h3l4 4V5L8 9z" }],
|
|
23
|
+
["path", { d: "M15 9.5a4 4 0 0 1 0 5M17.6 7a8 8 0 0 1 0 10" }],
|
|
24
|
+
] },
|
|
25
|
+
"sound-off": { viewBox: "0 0 24 24", els: [
|
|
26
|
+
["path", { d: "M5 9v6h3l4 4V5L8 9z" }],
|
|
27
|
+
["path", { d: "M16 9.5l4.5 5M20.5 9.5l-4.5 5" }],
|
|
28
|
+
] },
|
|
29
|
+
// v2.0 extension — same grammar: line, currentColor, 1.75, round, 24×24
|
|
30
|
+
search: { viewBox: "0 0 24 24", els: [["circle", { cx: 11, cy: 11, r: 6 }], ["path", { d: "M20 20l-4.2-4.2" }]] },
|
|
31
|
+
sliders: { viewBox: "0 0 24 24", els: [
|
|
32
|
+
["path", { d: "M4 6h16M4 12h16M4 18h16" }],
|
|
33
|
+
["circle", { cx: 9, cy: 6, r: 2 }], ["circle", { cx: 15, cy: 12, r: 2 }], ["circle", { cx: 7, cy: 18, r: 2 }],
|
|
34
|
+
] },
|
|
35
|
+
upload: { viewBox: "0 0 24 24", els: [["path", { d: "M12 15V4M7 8.5L12 4l5 4.5" }], ["path", { d: "M4 19h16" }]] },
|
|
36
|
+
download: { viewBox: "0 0 24 24", els: [["path", { d: "M12 4v11M7 10.5L12 15l5-4.5" }], ["path", { d: "M4 19h16" }]] },
|
|
37
|
+
calendar: { viewBox: "0 0 24 24", els: [["rect", { x: 4, y: 6, width: 16, height: 14, rx: 2 }], ["path", { d: "M4 10.5h16M8 3.5v4M16 3.5v4" }]] },
|
|
38
|
+
user: { viewBox: "0 0 24 24", els: [["circle", { cx: 12, cy: 8.5, r: 3.5 }], ["path", { d: "M5 19.5c1.6-3.4 4-5 7-5s5.4 1.6 7 5" }]] },
|
|
39
|
+
plus: { viewBox: "0 0 24 24", els: [["path", { d: "M12 5v14M5 12h14" }]] },
|
|
40
|
+
trash: { viewBox: "0 0 24 24", els: [["path", { d: "M5 7h14M9.5 7V4.5h5V7" }], ["path", { d: "M7 7l.8 12.5h8.4L17 7M10 11v5M14 11v5" }]] },
|
|
41
|
+
external: { viewBox: "0 0 24 24", els: [["path", { d: "M14 4h6v6M20 4l-8 8" }], ["path", { d: "M18 13v6H5V6h6" }]] },
|
|
42
|
+
menu: { viewBox: "0 0 24 24", els: [["path", { d: "M4 7h16M4 12h16M4 17h16" }]] },
|
|
43
|
+
// v2.13 extension — common chevrons + edit/copy/info/warning (same grammar)
|
|
44
|
+
"chevron-down": { viewBox: "0 0 24 24", els: [["path", { d: "M6 9l6 6 6-6" }]] },
|
|
45
|
+
"chevron-up": { viewBox: "0 0 24 24", els: [["path", { d: "M6 15l6-6 6 6" }]] },
|
|
46
|
+
"chevron-left": { viewBox: "0 0 24 24", els: [["path", { d: "M15 6l-6 6 6 6" }]] },
|
|
47
|
+
"chevron-right": { viewBox: "0 0 24 24", els: [["path", { d: "M9 6l6 6-6 6" }]] },
|
|
48
|
+
edit: { viewBox: "0 0 24 24", els: [["path", { d: "M4 20h4L18.5 9.5a2.12 2.12 0 0 0-3-3L5 17z" }], ["path", { d: "M13.5 6.5l3 3" }]] },
|
|
49
|
+
copy: { viewBox: "0 0 24 24", els: [["rect", { x: 8, y: 8, width: 12, height: 12, rx: 2 }], ["path", { d: "M4 16V6a2 2 0 0 1 2-2h10" }]] },
|
|
50
|
+
info: { viewBox: "0 0 24 24", els: [["circle", { cx: 12, cy: 12, r: 9 }], ["path", { d: "M12 11v5M12 7.75v.01" }]] },
|
|
51
|
+
"alert-triangle": { viewBox: "0 0 24 24", els: [["path", { d: "M12 3.5l9 16H3z" }], ["path", { d: "M12 10v4M12 17.5v.01" }]] },
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export function Icon({ name, size = "md", label, className, strokeWidth = 1.75, ...props }) {
|
|
55
|
+
const def = CS_ICONS[name] || CS_ICONS.sparkle;
|
|
56
|
+
const dim = `var(--cs-icon-${size}, 20px)`;
|
|
57
|
+
const a11y = label ? { role: "img", "aria-label": label } : { "aria-hidden": true, focusable: false };
|
|
58
|
+
return (
|
|
59
|
+
<svg
|
|
60
|
+
{...props}
|
|
61
|
+
className={className}
|
|
62
|
+
viewBox={def.viewBox}
|
|
63
|
+
style={{ width: dim, height: dim, display: "inline-block", flex: "none", ...(props.style || {}) }}
|
|
64
|
+
fill="none"
|
|
65
|
+
stroke="currentColor"
|
|
66
|
+
strokeWidth={strokeWidth}
|
|
67
|
+
strokeLinecap="round"
|
|
68
|
+
strokeLinejoin="round"
|
|
69
|
+
{...a11y}
|
|
70
|
+
>
|
|
71
|
+
{def.els.map(([tag, attrs], i) => React.createElement(tag, { key: i, ...attrs }))}
|
|
72
|
+
</svg>
|
|
73
|
+
);
|
|
74
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
**Icon** — the single renderer for CyberSkill's in-repo line-icon set (no external icon library). Icons stroke with `currentColor` at 1.75 weight, round caps/joins, and size from the `--cs-icon-*` tokens. Decorative by default; pass `label` to expose a meaningful icon to assistive tech.
|
|
2
|
+
|
|
3
|
+
```jsx
|
|
4
|
+
<Icon name="arrow-right" /> {/* decorative */}
|
|
5
|
+
<Icon name="sparkle" size="lg" label="Wish" /> {/* meaningful */}
|
|
6
|
+
```
|
|
7
|
+
|
|
8
|
+
Set: `close · sun · moon · arrow-right · check · sparkle · chat · sound-on · sound-off` + v2.0 extension `search · sliders · upload · download · calendar · user · plus · trash · external · menu` + v2.13 `chevron-down/up/left/right · edit · copy · info · alert-triangle`al · menu` (same grammar). `sparkle` is the brand's "wish" glyph. Colour follows the surrounding text token — set `color` on a parent to recolour.
|