@misoto22/kioku-ui 0.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/LICENSE +21 -0
- package/README.md +21 -0
- package/dist/Alert/Alert.d.ts +7 -0
- package/dist/Alert/Alert.doc.d.ts +11 -0
- package/dist/Alert/Alert.doc.js +15 -0
- package/dist/Alert/Alert.js +149 -0
- package/dist/Alert/index.d.ts +1 -0
- package/dist/Alert/index.js +2 -0
- package/dist/AsyncState/AsyncState.d.ts +30 -0
- package/dist/AsyncState/AsyncState.doc.d.ts +16 -0
- package/dist/AsyncState/AsyncState.doc.js +16 -0
- package/dist/AsyncState/AsyncState.js +36 -0
- package/dist/AsyncState/index.d.ts +1 -0
- package/dist/AsyncState/index.js +2 -0
- package/dist/Badge/Badge.d.ts +10 -0
- package/dist/Badge/Badge.doc.d.ts +11 -0
- package/dist/Badge/Badge.doc.js +12 -0
- package/dist/Badge/Badge.js +58 -0
- package/dist/Badge/index.d.ts +1 -0
- package/dist/Badge/index.js +2 -0
- package/dist/Button/Button.d.ts +18 -0
- package/dist/Button/Button.doc.d.ts +11 -0
- package/dist/Button/Button.doc.js +18 -0
- package/dist/Button/Button.js +151 -0
- package/dist/Button/index.d.ts +1 -0
- package/dist/Button/index.js +2 -0
- package/dist/Card/Card.d.ts +6 -0
- package/dist/Card/Card.doc.d.ts +11 -0
- package/dist/Card/Card.doc.js +15 -0
- package/dist/Card/Card.js +41 -0
- package/dist/Card/index.d.ts +1 -0
- package/dist/Card/index.js +2 -0
- package/dist/CardFooter/CardFooter.d.ts +3 -0
- package/dist/CardFooter/CardFooter.doc.d.ts +11 -0
- package/dist/CardFooter/CardFooter.doc.js +12 -0
- package/dist/CardFooter/CardFooter.js +16 -0
- package/dist/CardFooter/index.d.ts +1 -0
- package/dist/CardFooter/index.js +2 -0
- package/dist/CardHeader/CardHeader.d.ts +3 -0
- package/dist/CardHeader/CardHeader.doc.d.ts +11 -0
- package/dist/CardHeader/CardHeader.doc.js +12 -0
- package/dist/CardHeader/CardHeader.js +16 -0
- package/dist/CardHeader/index.d.ts +1 -0
- package/dist/CardHeader/index.js +2 -0
- package/dist/Center/Center.d.ts +3 -0
- package/dist/Center/Center.doc.d.ts +11 -0
- package/dist/Center/Center.doc.js +12 -0
- package/dist/Center/Center.js +15 -0
- package/dist/Center/index.d.ts +1 -0
- package/dist/Center/index.js +2 -0
- package/dist/Divider/Divider.d.ts +3 -0
- package/dist/Divider/Divider.doc.d.ts +11 -0
- package/dist/Divider/Divider.doc.js +12 -0
- package/dist/Divider/Divider.js +12 -0
- package/dist/Divider/index.d.ts +1 -0
- package/dist/Divider/index.js +2 -0
- package/dist/EmptyState/EmptyState.d.ts +11 -0
- package/dist/EmptyState/EmptyState.doc.d.ts +16 -0
- package/dist/EmptyState/EmptyState.doc.js +25 -0
- package/dist/EmptyState/EmptyState.js +55 -0
- package/dist/EmptyState/index.d.ts +1 -0
- package/dist/EmptyState/index.js +2 -0
- package/dist/Field/Field.d.ts +21 -0
- package/dist/Field/Field.doc.d.ts +16 -0
- package/dist/Field/Field.doc.js +28 -0
- package/dist/Field/Field.js +117 -0
- package/dist/Field/index.d.ts +1 -0
- package/dist/Field/index.js +2 -0
- package/dist/Grid/Grid.d.ts +7 -0
- package/dist/Grid/Grid.doc.d.ts +11 -0
- package/dist/Grid/Grid.doc.js +15 -0
- package/dist/Grid/Grid.js +76 -0
- package/dist/Grid/index.d.ts +1 -0
- package/dist/Grid/index.js +2 -0
- package/dist/Heading/Heading.d.ts +293 -0
- package/dist/Heading/Heading.doc.d.ts +16 -0
- package/dist/Heading/Heading.doc.js +19 -0
- package/dist/Heading/Heading.js +47 -0
- package/dist/Heading/index.d.ts +1 -0
- package/dist/Heading/index.js +2 -0
- package/dist/IconButton/IconButton.d.ts +9 -0
- package/dist/IconButton/IconButton.doc.d.ts +16 -0
- package/dist/IconButton/IconButton.doc.js +22 -0
- package/dist/IconButton/IconButton.js +11 -0
- package/dist/IconButton/index.d.ts +1 -0
- package/dist/IconButton/index.js +2 -0
- package/dist/MetricGrid/MetricGrid.d.ts +10 -0
- package/dist/MetricGrid/MetricGrid.doc.d.ts +12 -0
- package/dist/MetricGrid/MetricGrid.doc.js +13 -0
- package/dist/MetricGrid/MetricGrid.js +37 -0
- package/dist/MetricGrid/index.d.ts +1 -0
- package/dist/MetricGrid/index.js +2 -0
- package/dist/Section/Section.d.ts +6 -0
- package/dist/Section/Section.doc.d.ts +11 -0
- package/dist/Section/Section.doc.js +12 -0
- package/dist/Section/Section.js +49 -0
- package/dist/Section/index.d.ts +1 -0
- package/dist/Section/index.js +2 -0
- package/dist/SegmentedControl/SegmentedControl.d.ts +31 -0
- package/dist/SegmentedControl/SegmentedControl.doc.d.ts +16 -0
- package/dist/SegmentedControl/SegmentedControl.doc.js +34 -0
- package/dist/SegmentedControl/SegmentedControl.js +108 -0
- package/dist/SegmentedControl/index.d.ts +1 -0
- package/dist/SegmentedControl/index.js +2 -0
- package/dist/Skeleton/Skeleton.d.ts +5 -0
- package/dist/Skeleton/Skeleton.doc.d.ts +11 -0
- package/dist/Skeleton/Skeleton.doc.js +12 -0
- package/dist/Skeleton/Skeleton.js +20 -0
- package/dist/Skeleton/index.d.ts +1 -0
- package/dist/Skeleton/index.js +2 -0
- package/dist/Spinner/Spinner.d.ts +6 -0
- package/dist/Spinner/Spinner.doc.d.ts +12 -0
- package/dist/Spinner/Spinner.doc.js +13 -0
- package/dist/Spinner/Spinner.js +25 -0
- package/dist/Spinner/index.d.ts +1 -0
- package/dist/Spinner/index.js +2 -0
- package/dist/Stack/Stack.d.ts +7 -0
- package/dist/Stack/Stack.doc.d.ts +11 -0
- package/dist/Stack/Stack.doc.js +15 -0
- package/dist/Stack/Stack.js +77 -0
- package/dist/Stack/index.d.ts +1 -0
- package/dist/Stack/index.js +2 -0
- package/dist/StatusDot/StatusDot.d.ts +8 -0
- package/dist/StatusDot/StatusDot.doc.d.ts +16 -0
- package/dist/StatusDot/StatusDot.doc.js +16 -0
- package/dist/StatusDot/StatusDot.js +46 -0
- package/dist/StatusDot/index.d.ts +1 -0
- package/dist/StatusDot/index.js +2 -0
- package/dist/Table/Table.d.ts +20 -0
- package/dist/Table/Table.doc.d.ts +92 -0
- package/dist/Table/Table.doc.js +94 -0
- package/dist/Table/Table.js +205 -0
- package/dist/Table/index.d.ts +1 -0
- package/dist/Table/index.js +2 -0
- package/dist/Text/Text.d.ts +7 -0
- package/dist/Text/Text.doc.d.ts +11 -0
- package/dist/Text/Text.doc.js +15 -0
- package/dist/Text/Text.js +50 -0
- package/dist/Text/index.d.ts +1 -0
- package/dist/Text/index.js +2 -0
- package/dist/TextArea/TextArea.d.ts +16 -0
- package/dist/TextArea/TextArea.doc.d.ts +11 -0
- package/dist/TextArea/TextArea.doc.js +30 -0
- package/dist/TextArea/TextArea.js +47 -0
- package/dist/TextArea/index.d.ts +1 -0
- package/dist/TextArea/index.js +2 -0
- package/dist/TextInput/TextInput.d.ts +16 -0
- package/dist/TextInput/TextInput.doc.d.ts +11 -0
- package/dist/TextInput/TextInput.doc.js +30 -0
- package/dist/TextInput/TextInput.js +49 -0
- package/dist/TextInput/index.d.ts +1 -0
- package/dist/TextInput/index.js +2 -0
- package/dist/Toggle/Toggle.d.ts +16 -0
- package/dist/Toggle/Toggle.doc.d.ts +11 -0
- package/dist/Toggle/Toggle.doc.js +21 -0
- package/dist/Toggle/Toggle.js +64 -0
- package/dist/Toggle/index.d.ts +1 -0
- package/dist/Toggle/index.js +2 -0
- package/dist/VisuallyHidden/VisuallyHidden.d.ts +3 -0
- package/dist/VisuallyHidden/VisuallyHidden.doc.d.ts +11 -0
- package/dist/VisuallyHidden/VisuallyHidden.doc.js +12 -0
- package/dist/VisuallyHidden/VisuallyHidden.js +15 -0
- package/dist/VisuallyHidden/index.d.ts +1 -0
- package/dist/VisuallyHidden/index.js +2 -0
- package/dist/authoring.stylex.d.ts +75 -0
- package/dist/authoring.stylex.js +77 -0
- package/dist/components/Alert.d.ts +7 -0
- package/dist/components/Alert.doc.d.ts +11 -0
- package/dist/components/Alert.doc.js +15 -0
- package/dist/components/Alert.js +149 -0
- package/dist/components/AsyncState.d.ts +30 -0
- package/dist/components/AsyncState.doc.d.ts +16 -0
- package/dist/components/AsyncState.doc.js +16 -0
- package/dist/components/AsyncState.js +36 -0
- package/dist/components/Badge.d.ts +10 -0
- package/dist/components/Badge.doc.d.ts +11 -0
- package/dist/components/Badge.doc.js +12 -0
- package/dist/components/Badge.js +58 -0
- package/dist/components/Button.d.ts +18 -0
- package/dist/components/Button.doc.d.ts +11 -0
- package/dist/components/Button.doc.js +18 -0
- package/dist/components/Button.js +151 -0
- package/dist/components/Card.d.ts +6 -0
- package/dist/components/Card.doc.d.ts +11 -0
- package/dist/components/Card.doc.js +15 -0
- package/dist/components/Card.js +41 -0
- package/dist/components/CardFooter.d.ts +3 -0
- package/dist/components/CardFooter.doc.d.ts +11 -0
- package/dist/components/CardFooter.doc.js +12 -0
- package/dist/components/CardFooter.js +16 -0
- package/dist/components/CardHeader.d.ts +3 -0
- package/dist/components/CardHeader.doc.d.ts +11 -0
- package/dist/components/CardHeader.doc.js +12 -0
- package/dist/components/CardHeader.js +16 -0
- package/dist/components/Center.d.ts +3 -0
- package/dist/components/Center.doc.d.ts +11 -0
- package/dist/components/Center.doc.js +12 -0
- package/dist/components/Center.js +15 -0
- package/dist/components/Divider.d.ts +3 -0
- package/dist/components/Divider.doc.d.ts +11 -0
- package/dist/components/Divider.doc.js +12 -0
- package/dist/components/Divider.js +12 -0
- package/dist/components/EmptyState.d.ts +11 -0
- package/dist/components/EmptyState.doc.d.ts +16 -0
- package/dist/components/EmptyState.doc.js +25 -0
- package/dist/components/EmptyState.js +55 -0
- package/dist/components/Field.d.ts +21 -0
- package/dist/components/Field.doc.d.ts +16 -0
- package/dist/components/Field.doc.js +28 -0
- package/dist/components/Field.js +117 -0
- package/dist/components/Grid.d.ts +7 -0
- package/dist/components/Grid.doc.d.ts +11 -0
- package/dist/components/Grid.doc.js +15 -0
- package/dist/components/Grid.js +76 -0
- package/dist/components/Heading.d.ts +293 -0
- package/dist/components/Heading.doc.d.ts +16 -0
- package/dist/components/Heading.doc.js +19 -0
- package/dist/components/Heading.js +46 -0
- package/dist/components/IconButton.d.ts +9 -0
- package/dist/components/IconButton.doc.d.ts +16 -0
- package/dist/components/IconButton.doc.js +22 -0
- package/dist/components/IconButton.js +11 -0
- package/dist/components/MetricGrid.d.ts +10 -0
- package/dist/components/MetricGrid.doc.d.ts +12 -0
- package/dist/components/MetricGrid.doc.js +13 -0
- package/dist/components/MetricGrid.js +37 -0
- package/dist/components/Section.d.ts +6 -0
- package/dist/components/Section.doc.d.ts +11 -0
- package/dist/components/Section.doc.js +12 -0
- package/dist/components/Section.js +49 -0
- package/dist/components/SegmentedControl.d.ts +31 -0
- package/dist/components/SegmentedControl.doc.d.ts +16 -0
- package/dist/components/SegmentedControl.doc.js +34 -0
- package/dist/components/SegmentedControl.js +108 -0
- package/dist/components/Skeleton.d.ts +5 -0
- package/dist/components/Skeleton.doc.d.ts +11 -0
- package/dist/components/Skeleton.doc.js +12 -0
- package/dist/components/Skeleton.js +20 -0
- package/dist/components/Spinner.d.ts +6 -0
- package/dist/components/Spinner.doc.d.ts +12 -0
- package/dist/components/Spinner.doc.js +13 -0
- package/dist/components/Spinner.js +25 -0
- package/dist/components/Stack.d.ts +7 -0
- package/dist/components/Stack.doc.d.ts +11 -0
- package/dist/components/Stack.doc.js +15 -0
- package/dist/components/Stack.js +77 -0
- package/dist/components/StatusDot.d.ts +8 -0
- package/dist/components/StatusDot.doc.d.ts +16 -0
- package/dist/components/StatusDot.doc.js +16 -0
- package/dist/components/StatusDot.js +46 -0
- package/dist/components/Table.d.ts +20 -0
- package/dist/components/Table.doc.d.ts +92 -0
- package/dist/components/Table.doc.js +94 -0
- package/dist/components/Table.js +205 -0
- package/dist/components/Text.d.ts +7 -0
- package/dist/components/Text.doc.d.ts +11 -0
- package/dist/components/Text.doc.js +15 -0
- package/dist/components/Text.js +50 -0
- package/dist/components/TextArea.d.ts +16 -0
- package/dist/components/TextArea.doc.d.ts +11 -0
- package/dist/components/TextArea.doc.js +30 -0
- package/dist/components/TextArea.js +47 -0
- package/dist/components/TextInput.d.ts +16 -0
- package/dist/components/TextInput.doc.d.ts +11 -0
- package/dist/components/TextInput.doc.js +30 -0
- package/dist/components/TextInput.js +49 -0
- package/dist/components/Toggle.d.ts +16 -0
- package/dist/components/Toggle.doc.d.ts +11 -0
- package/dist/components/Toggle.doc.js +21 -0
- package/dist/components/Toggle.js +64 -0
- package/dist/components/VisuallyHidden.d.ts +3 -0
- package/dist/components/VisuallyHidden.doc.d.ts +11 -0
- package/dist/components/VisuallyHidden.doc.js +12 -0
- package/dist/components/VisuallyHidden.js +15 -0
- package/dist/components/index.d.ts +27 -0
- package/dist/components/index.js +28 -0
- package/dist/docs/index.d.ts +33 -0
- package/dist/docs/index.js +33 -0
- package/dist/docs/types.d.ts +15 -0
- package/dist/docs/types.js +25 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.js +32 -0
- package/dist/navigation/LinkProvider.d.ts +9 -0
- package/dist/navigation/LinkProvider.doc.d.ts +27 -0
- package/dist/navigation/LinkProvider.doc.js +27 -0
- package/dist/navigation/LinkProvider.js +22 -0
- package/dist/navigation/index.d.ts +1 -0
- package/dist/navigation/index.js +2 -0
- package/dist/styles/global.stylex.d.ts +20 -0
- package/dist/styles/global.stylex.js +22 -0
- package/dist/styles/index.css +14 -0
- package/dist/styles/reset.css +35 -0
- package/dist/styles/stylex.css +212 -0
- package/dist/theme/Theme.d.ts +24 -0
- package/dist/theme/Theme.doc.d.ts +16 -0
- package/dist/theme/Theme.doc.js +27 -0
- package/dist/theme/Theme.js +110 -0
- package/dist/theme/index.d.ts +2 -0
- package/dist/theme/index.js +2 -0
- package/dist/tokens/contracts.d.ts +140 -0
- package/dist/tokens/contracts.js +102 -0
- package/package.json +93 -0
- package/src/Alert/Alert.doc.ts +21 -0
- package/src/Alert/Alert.tsx +129 -0
- package/src/Alert/index.ts +1 -0
- package/src/AsyncState/AsyncState.doc.ts +21 -0
- package/src/AsyncState/AsyncState.tsx +75 -0
- package/src/AsyncState/index.ts +5 -0
- package/src/Badge/Badge.doc.ts +15 -0
- package/src/Badge/Badge.tsx +58 -0
- package/src/Badge/index.ts +6 -0
- package/src/Button/Button.doc.ts +17 -0
- package/src/Button/Button.tsx +176 -0
- package/src/Button/index.ts +7 -0
- package/src/Card/Card.doc.ts +22 -0
- package/src/Card/Card.tsx +44 -0
- package/src/Card/index.ts +1 -0
- package/src/CardFooter/CardFooter.doc.ts +12 -0
- package/src/CardFooter/CardFooter.tsx +27 -0
- package/src/CardFooter/index.ts +1 -0
- package/src/CardHeader/CardHeader.doc.ts +12 -0
- package/src/CardHeader/CardHeader.tsx +27 -0
- package/src/CardHeader/index.ts +1 -0
- package/src/Center/Center.doc.ts +12 -0
- package/src/Center/Center.tsx +20 -0
- package/src/Center/index.ts +1 -0
- package/src/Divider/Divider.doc.ts +12 -0
- package/src/Divider/Divider.tsx +20 -0
- package/src/Divider/index.ts +1 -0
- package/src/EmptyState/EmptyState.doc.ts +31 -0
- package/src/EmptyState/EmptyState.tsx +87 -0
- package/src/EmptyState/index.ts +6 -0
- package/src/Field/Field.doc.ts +34 -0
- package/src/Field/Field.tsx +126 -0
- package/src/Field/index.ts +6 -0
- package/src/Grid/Grid.doc.ts +16 -0
- package/src/Grid/Grid.tsx +54 -0
- package/src/Grid/index.ts +1 -0
- package/src/Heading/Heading.doc.ts +26 -0
- package/src/Heading/Heading.tsx +48 -0
- package/src/Heading/index.ts +1 -0
- package/src/IconButton/IconButton.doc.ts +24 -0
- package/src/IconButton/IconButton.tsx +18 -0
- package/src/IconButton/index.ts +1 -0
- package/src/MetricGrid/MetricGrid.doc.ts +19 -0
- package/src/MetricGrid/MetricGrid.tsx +72 -0
- package/src/MetricGrid/index.ts +5 -0
- package/src/Section/Section.doc.ts +12 -0
- package/src/Section/Section.tsx +38 -0
- package/src/Section/index.ts +1 -0
- package/src/SegmentedControl/SegmentedControl.doc.ts +51 -0
- package/src/SegmentedControl/SegmentedControl.tsx +238 -0
- package/src/SegmentedControl/index.ts +5 -0
- package/src/Skeleton/Skeleton.doc.ts +15 -0
- package/src/Skeleton/Skeleton.tsx +45 -0
- package/src/Skeleton/index.ts +1 -0
- package/src/Spinner/Spinner.doc.ts +19 -0
- package/src/Spinner/Spinner.tsx +47 -0
- package/src/Spinner/index.ts +1 -0
- package/src/Stack/Stack.doc.ts +13 -0
- package/src/Stack/Stack.tsx +57 -0
- package/src/Stack/index.ts +1 -0
- package/src/StatusDot/StatusDot.doc.ts +23 -0
- package/src/StatusDot/StatusDot.tsx +35 -0
- package/src/StatusDot/index.ts +1 -0
- package/src/Table/Table.doc.ts +104 -0
- package/src/Table/Table.tsx +222 -0
- package/src/Table/index.ts +18 -0
- package/src/Text/Text.doc.ts +17 -0
- package/src/Text/Text.tsx +43 -0
- package/src/Text/index.ts +1 -0
- package/src/TextArea/TextArea.doc.ts +43 -0
- package/src/TextArea/TextArea.tsx +119 -0
- package/src/TextArea/index.ts +1 -0
- package/src/TextInput/TextInput.doc.ts +43 -0
- package/src/TextInput/TextInput.tsx +122 -0
- package/src/TextInput/index.ts +1 -0
- package/src/Toggle/Toggle.doc.ts +30 -0
- package/src/Toggle/Toggle.tsx +139 -0
- package/src/Toggle/index.ts +1 -0
- package/src/VisuallyHidden/VisuallyHidden.doc.ts +18 -0
- package/src/VisuallyHidden/VisuallyHidden.tsx +28 -0
- package/src/VisuallyHidden/index.ts +1 -0
- package/src/authoring.stylex.ts +76 -0
- package/src/docs/index.ts +122 -0
- package/src/docs/types.ts +51 -0
- package/src/index.ts +102 -0
- package/src/navigation/LinkProvider.doc.ts +32 -0
- package/src/navigation/LinkProvider.tsx +32 -0
- package/src/navigation/index.ts +7 -0
- package/src/styles/global.stylex.ts +23 -0
- package/src/styles/index.css +14 -0
- package/src/styles/reset.css +35 -0
- package/src/theme/Theme.doc.ts +38 -0
- package/src/theme/Theme.tsx +195 -0
- package/src/theme/index.ts +9 -0
- package/src/tokens/contracts.ts +210 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
*,
|
|
2
|
+
*::before,
|
|
3
|
+
*::after {
|
|
4
|
+
box-sizing: border-box;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
html {
|
|
8
|
+
-webkit-text-size-adjust: 100%;
|
|
9
|
+
text-size-adjust: 100%;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
body {
|
|
13
|
+
min-height: 100%;
|
|
14
|
+
margin: 0;
|
|
15
|
+
font-family: inherit;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
button,
|
|
19
|
+
input,
|
|
20
|
+
select,
|
|
21
|
+
textarea {
|
|
22
|
+
color: inherit;
|
|
23
|
+
font: inherit;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
@media (prefers-reduced-motion: reduce) {
|
|
27
|
+
*,
|
|
28
|
+
*::before,
|
|
29
|
+
*::after {
|
|
30
|
+
scroll-behavior: auto !important;
|
|
31
|
+
animation-duration: 0.01ms !important;
|
|
32
|
+
animation-iteration-count: 1 !important;
|
|
33
|
+
transition-duration: 0.01ms !important;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type {ComponentDoc} from '../docs/types.js';
|
|
2
|
+
|
|
3
|
+
export const themeProviderDoc = {
|
|
4
|
+
name: 'ThemeProvider',
|
|
5
|
+
description:
|
|
6
|
+
'Applies one validated theme definition and exposes theme selection to descendants.',
|
|
7
|
+
props: [
|
|
8
|
+
{
|
|
9
|
+
name: 'children',
|
|
10
|
+
description: 'Supplies the themed application subtree.',
|
|
11
|
+
required: true,
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
name: 'defaultDensity',
|
|
15
|
+
description:
|
|
16
|
+
'Selects the initial spatial scale when persistence has no value.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: 'defaultThemeId',
|
|
20
|
+
description: 'Selects the initial theme when persistence has no value.',
|
|
21
|
+
required: true,
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: 'persistence',
|
|
25
|
+
description:
|
|
26
|
+
'Reads and writes the selected theme through a host adapter.',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: 'themes',
|
|
30
|
+
description: 'Supplies the complete set of valid theme definitions.',
|
|
31
|
+
required: true,
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
inheritedProps: ['No inherited DOM attributes'],
|
|
35
|
+
example:
|
|
36
|
+
'<ThemeProvider defaultThemeId={hostDefaultThemeId} themes={hostThemes}>...</ThemeProvider>',
|
|
37
|
+
storyId: 'core-theme-provider--default',
|
|
38
|
+
} satisfies ComponentDoc;
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import * as stylex from '@stylexjs/stylex';
|
|
2
|
+
import {
|
|
3
|
+
createContext,
|
|
4
|
+
useCallback,
|
|
5
|
+
useContext,
|
|
6
|
+
useMemo,
|
|
7
|
+
useState,
|
|
8
|
+
type CSSProperties,
|
|
9
|
+
type ReactNode,
|
|
10
|
+
} from 'react';
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
tokenCustomProperties,
|
|
14
|
+
tokenNames,
|
|
15
|
+
validateThemeDefinition,
|
|
16
|
+
type ThemeDefinition,
|
|
17
|
+
} from '../tokens/contracts.js';
|
|
18
|
+
import {semanticTokens} from '../authoring.stylex.js';
|
|
19
|
+
|
|
20
|
+
/*
|
|
21
|
+
* Grain. Paper is never flat, and a flat fill is the strongest tell that a
|
|
22
|
+
* surface was generated rather than made. Drawn with feTurbulence, so nothing
|
|
23
|
+
* is fetched and nothing is stored, and masked rather than blended so the
|
|
24
|
+
* speckle takes the theme's own ink instead of a grey wash. A theme that wants
|
|
25
|
+
* none makes the colour transparent and pays nothing else.
|
|
26
|
+
*
|
|
27
|
+
* It sits above the content, where a printed texture sits. The stacking step
|
|
28
|
+
* is 1 rather than a nine-thousand, so a host's own layers still out-rank it.
|
|
29
|
+
*/
|
|
30
|
+
const grainMask =
|
|
31
|
+
"url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.82' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23n)'/%3E%3C/svg%3E\")";
|
|
32
|
+
|
|
33
|
+
const styles = stylex.create({
|
|
34
|
+
root: {
|
|
35
|
+
// Inherited, so the theme root sets it once for the tree beneath it. A
|
|
36
|
+
// Japanese face wants proportional spacing that a Latin one does not, and
|
|
37
|
+
// which it is belongs to the theme rather than to any component.
|
|
38
|
+
fontFeatureSettings: semanticTokens.fontFeatureSettings,
|
|
39
|
+
position: 'relative',
|
|
40
|
+
'::after': {
|
|
41
|
+
backgroundColor: semanticTokens.textureGrain,
|
|
42
|
+
content: '',
|
|
43
|
+
inset: 0,
|
|
44
|
+
maskImage: grainMask,
|
|
45
|
+
pointerEvents: 'none',
|
|
46
|
+
position: 'absolute',
|
|
47
|
+
zIndex: 1,
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
interface CompiledStyleXVarGroup {
|
|
53
|
+
readonly __varGroupHash__: string;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// StyleX emits semantic-token bridge variables for this generated scope. The
|
|
57
|
+
// host theme values live on ThemeProvider, so the scope must live there too.
|
|
58
|
+
const semanticTokenScopeClass = (
|
|
59
|
+
semanticTokens as unknown as CompiledStyleXVarGroup
|
|
60
|
+
).__varGroupHash__;
|
|
61
|
+
|
|
62
|
+
export type Density = 'compact' | 'standard';
|
|
63
|
+
|
|
64
|
+
const densities: readonly Density[] = ['compact', 'standard'];
|
|
65
|
+
|
|
66
|
+
// A theme pack fulfills the token contract twice, once per density. Density is
|
|
67
|
+
// therefore a root attribute rather than a token value: the pack's CSS decides
|
|
68
|
+
// what each step measures, and the library only says which one is selected.
|
|
69
|
+
export interface ThemePersistence {
|
|
70
|
+
read(): string | undefined;
|
|
71
|
+
write(themeId: string): void;
|
|
72
|
+
readDensity?(): string | undefined;
|
|
73
|
+
writeDensity?(density: Density): void;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export interface ThemeProviderProps {
|
|
77
|
+
readonly children: ReactNode;
|
|
78
|
+
readonly defaultDensity?: Density;
|
|
79
|
+
readonly defaultThemeId: string;
|
|
80
|
+
readonly persistence?: ThemePersistence;
|
|
81
|
+
readonly themes: readonly ThemeDefinition[];
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export interface ThemeContextValue {
|
|
85
|
+
readonly density: Density;
|
|
86
|
+
readonly setDensity: (density: Density) => void;
|
|
87
|
+
readonly setThemeId: (themeId: string) => void;
|
|
88
|
+
readonly theme: ThemeDefinition;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const ThemeContext = createContext<ThemeContextValue | undefined>(undefined);
|
|
92
|
+
|
|
93
|
+
function validateThemes(themes: readonly ThemeDefinition[]) {
|
|
94
|
+
const themeIds = new Set<string>();
|
|
95
|
+
|
|
96
|
+
for (const theme of themes) {
|
|
97
|
+
if (themeIds.has(theme.id)) {
|
|
98
|
+
throw new Error(`Duplicate theme ID: ${theme.id}`);
|
|
99
|
+
}
|
|
100
|
+
themeIds.add(theme.id);
|
|
101
|
+
|
|
102
|
+
const missingTokens = validateThemeDefinition(theme);
|
|
103
|
+
if (missingTokens.length > 0) {
|
|
104
|
+
throw new Error(
|
|
105
|
+
`Theme "${theme.id}" is missing token roles: ${missingTokens.join(', ')}`,
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function requiredDensity(density: string | undefined, fallback: Density) {
|
|
112
|
+
return densities.includes(density as Density)
|
|
113
|
+
? (density as Density)
|
|
114
|
+
: fallback;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function requiredTheme(themes: readonly ThemeDefinition[], themeId: string) {
|
|
118
|
+
const theme = themes.find(({id}) => id === themeId);
|
|
119
|
+
if (!theme) {
|
|
120
|
+
throw new Error(`Unknown theme ID: ${themeId}`);
|
|
121
|
+
}
|
|
122
|
+
return theme;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function themeStyle(theme: ThemeDefinition): CSSProperties {
|
|
126
|
+
return Object.fromEntries(
|
|
127
|
+
tokenNames.map((tokenName) => [
|
|
128
|
+
tokenCustomProperties[tokenName],
|
|
129
|
+
theme.tokens[tokenName],
|
|
130
|
+
]),
|
|
131
|
+
) as CSSProperties;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export function ThemeProvider({
|
|
135
|
+
children,
|
|
136
|
+
defaultDensity = 'compact',
|
|
137
|
+
defaultThemeId,
|
|
138
|
+
persistence,
|
|
139
|
+
themes,
|
|
140
|
+
}: ThemeProviderProps) {
|
|
141
|
+
validateThemes(themes);
|
|
142
|
+
|
|
143
|
+
const [themeId, setCurrentThemeId] = useState(
|
|
144
|
+
() => persistence?.read() ?? defaultThemeId,
|
|
145
|
+
);
|
|
146
|
+
const theme = requiredTheme(themes, themeId);
|
|
147
|
+
const setThemeId = useCallback(
|
|
148
|
+
(nextThemeId: string) => {
|
|
149
|
+
requiredTheme(themes, nextThemeId);
|
|
150
|
+
persistence?.write(nextThemeId);
|
|
151
|
+
setCurrentThemeId(nextThemeId);
|
|
152
|
+
},
|
|
153
|
+
[persistence, themes],
|
|
154
|
+
);
|
|
155
|
+
const [density, setCurrentDensity] = useState(() =>
|
|
156
|
+
requiredDensity(persistence?.readDensity?.(), defaultDensity),
|
|
157
|
+
);
|
|
158
|
+
const setDensity = useCallback(
|
|
159
|
+
(nextDensity: Density) => {
|
|
160
|
+
const resolved = requiredDensity(nextDensity, defaultDensity);
|
|
161
|
+
persistence?.writeDensity?.(resolved);
|
|
162
|
+
setCurrentDensity(resolved);
|
|
163
|
+
},
|
|
164
|
+
[defaultDensity, persistence],
|
|
165
|
+
);
|
|
166
|
+
const value = useMemo(
|
|
167
|
+
() => ({density, setDensity, setThemeId, theme}),
|
|
168
|
+
[density, setDensity, setThemeId, theme],
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
const {className, style} = stylex.props(styles.root);
|
|
172
|
+
|
|
173
|
+
return (
|
|
174
|
+
<ThemeContext value={value}>
|
|
175
|
+
<div
|
|
176
|
+
className={[semanticTokenScopeClass, className]
|
|
177
|
+
.filter(Boolean)
|
|
178
|
+
.join(' ')}
|
|
179
|
+
data-density={density}
|
|
180
|
+
data-theme={theme.id}
|
|
181
|
+
style={{...style, ...themeStyle(theme)}}
|
|
182
|
+
>
|
|
183
|
+
{children}
|
|
184
|
+
</div>
|
|
185
|
+
</ThemeContext>
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export function useTheme(): ThemeContextValue {
|
|
190
|
+
const theme = useContext(ThemeContext);
|
|
191
|
+
if (!theme) {
|
|
192
|
+
throw new Error('useTheme must be used within a ThemeProvider');
|
|
193
|
+
}
|
|
194
|
+
return theme;
|
|
195
|
+
}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
type Roles<Group extends string, Role extends string> = Readonly<{
|
|
2
|
+
[Name in Role]: `${Group}.${Name}`;
|
|
3
|
+
}>;
|
|
4
|
+
|
|
5
|
+
type ColorRole =
|
|
6
|
+
| 'canvas'
|
|
7
|
+
| 'surface'
|
|
8
|
+
| 'surfaceRaised'
|
|
9
|
+
| 'surfaceMuted'
|
|
10
|
+
| 'text'
|
|
11
|
+
| 'textSecondary'
|
|
12
|
+
| 'textMuted'
|
|
13
|
+
| 'textOnAccent'
|
|
14
|
+
| 'accent'
|
|
15
|
+
| 'accentHover'
|
|
16
|
+
| 'accentActive'
|
|
17
|
+
| 'overlayHover'
|
|
18
|
+
| 'overlayActive'
|
|
19
|
+
| 'disabledSurface'
|
|
20
|
+
| 'disabledText'
|
|
21
|
+
| 'focus';
|
|
22
|
+
type BorderRole =
|
|
23
|
+
'default' | 'strong' | 'interactive' | 'disabled' | 'width' | 'style';
|
|
24
|
+
type StatusRole =
|
|
25
|
+
| 'infoSurface'
|
|
26
|
+
| 'infoText'
|
|
27
|
+
| 'successSurface'
|
|
28
|
+
| 'successText'
|
|
29
|
+
| 'warningSurface'
|
|
30
|
+
| 'warningText'
|
|
31
|
+
| 'dangerSurface'
|
|
32
|
+
| 'dangerText';
|
|
33
|
+
type FocusRole = 'width' | 'offset';
|
|
34
|
+
type TypographyRole =
|
|
35
|
+
| 'fontFamilyBody'
|
|
36
|
+
| 'fontFamilyHeading'
|
|
37
|
+
| 'fontFamilyDisplay'
|
|
38
|
+
| 'fontFamilyMono'
|
|
39
|
+
| 'fontFeatureSettings'
|
|
40
|
+
| 'fontSizeXs'
|
|
41
|
+
| 'fontSizeSm'
|
|
42
|
+
| 'fontSizeMd'
|
|
43
|
+
| 'fontSizeLg'
|
|
44
|
+
| 'fontSizeXl'
|
|
45
|
+
| 'fontSize2xl'
|
|
46
|
+
| 'fontWeightRegular'
|
|
47
|
+
| 'fontWeightMedium'
|
|
48
|
+
| 'fontWeightStrong'
|
|
49
|
+
| 'lineHeightBody'
|
|
50
|
+
| 'lineHeightHeading';
|
|
51
|
+
type SpacingRole = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';
|
|
52
|
+
type RadiusRole = 'inner' | 'element' | 'container' | 'page' | 'full';
|
|
53
|
+
type SizeRole = 'controlSm' | 'controlMd' | 'controlLg' | 'hitTarget';
|
|
54
|
+
type TextureRole = 'grain';
|
|
55
|
+
type ElevationRole = 'low' | 'medium' | 'high';
|
|
56
|
+
type MotionRole =
|
|
57
|
+
| 'durationFast'
|
|
58
|
+
| 'durationModerate'
|
|
59
|
+
| 'durationSlow'
|
|
60
|
+
| 'easingStandard'
|
|
61
|
+
| 'easingEmphasized';
|
|
62
|
+
|
|
63
|
+
export interface TokenContract {
|
|
64
|
+
readonly color: Roles<'color', ColorRole>;
|
|
65
|
+
readonly border: Roles<'border', BorderRole>;
|
|
66
|
+
readonly status: Roles<'status', StatusRole>;
|
|
67
|
+
readonly focus: Roles<'focus', FocusRole>;
|
|
68
|
+
readonly typography: Roles<'typography', TypographyRole>;
|
|
69
|
+
readonly spacing: Roles<'spacing', SpacingRole>;
|
|
70
|
+
readonly radius: Roles<'radius', RadiusRole>;
|
|
71
|
+
readonly size: Roles<'size', SizeRole>;
|
|
72
|
+
readonly elevation: Roles<'elevation', ElevationRole>;
|
|
73
|
+
readonly texture: Roles<'texture', TextureRole>;
|
|
74
|
+
readonly motion: Roles<'motion', MotionRole>;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export const tokenContract = {
|
|
78
|
+
color: {
|
|
79
|
+
canvas: 'color.canvas',
|
|
80
|
+
surface: 'color.surface',
|
|
81
|
+
surfaceRaised: 'color.surfaceRaised',
|
|
82
|
+
surfaceMuted: 'color.surfaceMuted',
|
|
83
|
+
text: 'color.text',
|
|
84
|
+
textSecondary: 'color.textSecondary',
|
|
85
|
+
textMuted: 'color.textMuted',
|
|
86
|
+
textOnAccent: 'color.textOnAccent',
|
|
87
|
+
accent: 'color.accent',
|
|
88
|
+
accentHover: 'color.accentHover',
|
|
89
|
+
accentActive: 'color.accentActive',
|
|
90
|
+
overlayHover: 'color.overlayHover',
|
|
91
|
+
overlayActive: 'color.overlayActive',
|
|
92
|
+
disabledSurface: 'color.disabledSurface',
|
|
93
|
+
disabledText: 'color.disabledText',
|
|
94
|
+
focus: 'color.focus',
|
|
95
|
+
},
|
|
96
|
+
border: {
|
|
97
|
+
default: 'border.default',
|
|
98
|
+
strong: 'border.strong',
|
|
99
|
+
interactive: 'border.interactive',
|
|
100
|
+
disabled: 'border.disabled',
|
|
101
|
+
width: 'border.width',
|
|
102
|
+
style: 'border.style',
|
|
103
|
+
},
|
|
104
|
+
status: {
|
|
105
|
+
infoSurface: 'status.infoSurface',
|
|
106
|
+
infoText: 'status.infoText',
|
|
107
|
+
successSurface: 'status.successSurface',
|
|
108
|
+
successText: 'status.successText',
|
|
109
|
+
warningSurface: 'status.warningSurface',
|
|
110
|
+
warningText: 'status.warningText',
|
|
111
|
+
dangerSurface: 'status.dangerSurface',
|
|
112
|
+
dangerText: 'status.dangerText',
|
|
113
|
+
},
|
|
114
|
+
focus: {
|
|
115
|
+
width: 'focus.width',
|
|
116
|
+
offset: 'focus.offset',
|
|
117
|
+
},
|
|
118
|
+
typography: {
|
|
119
|
+
fontFamilyBody: 'typography.fontFamilyBody',
|
|
120
|
+
fontFamilyHeading: 'typography.fontFamilyHeading',
|
|
121
|
+
fontFamilyDisplay: 'typography.fontFamilyDisplay',
|
|
122
|
+
fontFamilyMono: 'typography.fontFamilyMono',
|
|
123
|
+
fontFeatureSettings: 'typography.fontFeatureSettings',
|
|
124
|
+
fontSizeXs: 'typography.fontSizeXs',
|
|
125
|
+
fontSizeSm: 'typography.fontSizeSm',
|
|
126
|
+
fontSizeMd: 'typography.fontSizeMd',
|
|
127
|
+
fontSizeLg: 'typography.fontSizeLg',
|
|
128
|
+
fontSizeXl: 'typography.fontSizeXl',
|
|
129
|
+
fontSize2xl: 'typography.fontSize2xl',
|
|
130
|
+
fontWeightRegular: 'typography.fontWeightRegular',
|
|
131
|
+
fontWeightMedium: 'typography.fontWeightMedium',
|
|
132
|
+
fontWeightStrong: 'typography.fontWeightStrong',
|
|
133
|
+
lineHeightBody: 'typography.lineHeightBody',
|
|
134
|
+
lineHeightHeading: 'typography.lineHeightHeading',
|
|
135
|
+
},
|
|
136
|
+
spacing: {
|
|
137
|
+
xs: 'spacing.xs',
|
|
138
|
+
sm: 'spacing.sm',
|
|
139
|
+
md: 'spacing.md',
|
|
140
|
+
lg: 'spacing.lg',
|
|
141
|
+
xl: 'spacing.xl',
|
|
142
|
+
'2xl': 'spacing.2xl',
|
|
143
|
+
},
|
|
144
|
+
radius: {
|
|
145
|
+
inner: 'radius.inner',
|
|
146
|
+
element: 'radius.element',
|
|
147
|
+
container: 'radius.container',
|
|
148
|
+
page: 'radius.page',
|
|
149
|
+
full: 'radius.full',
|
|
150
|
+
},
|
|
151
|
+
size: {
|
|
152
|
+
controlSm: 'size.controlSm',
|
|
153
|
+
controlMd: 'size.controlMd',
|
|
154
|
+
controlLg: 'size.controlLg',
|
|
155
|
+
hitTarget: 'size.hitTarget',
|
|
156
|
+
},
|
|
157
|
+
elevation: {
|
|
158
|
+
low: 'elevation.low',
|
|
159
|
+
medium: 'elevation.medium',
|
|
160
|
+
high: 'elevation.high',
|
|
161
|
+
},
|
|
162
|
+
texture: {
|
|
163
|
+
grain: 'texture.grain',
|
|
164
|
+
},
|
|
165
|
+
motion: {
|
|
166
|
+
durationFast: 'motion.durationFast',
|
|
167
|
+
durationModerate: 'motion.durationModerate',
|
|
168
|
+
durationSlow: 'motion.durationSlow',
|
|
169
|
+
easingStandard: 'motion.easingStandard',
|
|
170
|
+
easingEmphasized: 'motion.easingEmphasized',
|
|
171
|
+
},
|
|
172
|
+
} as const satisfies TokenContract;
|
|
173
|
+
|
|
174
|
+
type ContractGroup = (typeof tokenContract)[keyof typeof tokenContract];
|
|
175
|
+
type Values<Value> = Value extends unknown ? Value[keyof Value] : never;
|
|
176
|
+
|
|
177
|
+
export type TokenName = Values<ContractGroup>;
|
|
178
|
+
|
|
179
|
+
export const tokenNames = Object.freeze(
|
|
180
|
+
Object.values(tokenContract).flatMap((group) => Object.values(group)),
|
|
181
|
+
) as readonly TokenName[];
|
|
182
|
+
|
|
183
|
+
export interface ThemeDefinition {
|
|
184
|
+
readonly id: string;
|
|
185
|
+
readonly label: string;
|
|
186
|
+
readonly tokens: Readonly<Record<TokenName, string>>;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export interface ThemeDefinitionCandidate {
|
|
190
|
+
readonly id: string;
|
|
191
|
+
readonly label?: string;
|
|
192
|
+
readonly tokens: Readonly<Partial<Record<TokenName, string>>>;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export function validateThemeDefinition(
|
|
196
|
+
theme: ThemeDefinitionCandidate,
|
|
197
|
+
): TokenName[] {
|
|
198
|
+
return tokenNames.filter((name) => theme.tokens[name] === undefined);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export const tokenCustomProperties = Object.freeze(
|
|
202
|
+
Object.fromEntries(
|
|
203
|
+
tokenNames.map((name) => [
|
|
204
|
+
name,
|
|
205
|
+
`--kioku-ui-${name
|
|
206
|
+
.replaceAll('.', '-')
|
|
207
|
+
.replace(/[A-Z]/g, (character) => `-${character.toLowerCase()}`)}`,
|
|
208
|
+
]),
|
|
209
|
+
),
|
|
210
|
+
) as Readonly<Record<TokenName, `--kioku-ui-${string}`>>;
|