@mitcsutt/kiln-ui 0.2.1 → 0.3.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/README.md +6 -6
- package/dist/assets/fonts/archivo-latin-ext-wdth-italic.woff2 +0 -0
- package/dist/assets/fonts/archivo-latin-ext-wdth-normal.woff2 +0 -0
- package/dist/assets/fonts/archivo-latin-wdth-italic.woff2 +0 -0
- package/dist/assets/fonts/archivo-latin-wdth-normal.woff2 +0 -0
- package/dist/assets/fonts/atkinson-hyperlegible-mono-latin-ext-wght-italic.woff2 +0 -0
- package/dist/assets/fonts/atkinson-hyperlegible-mono-latin-ext-wght-normal.woff2 +0 -0
- package/dist/assets/fonts/atkinson-hyperlegible-mono-latin-wght-italic.woff2 +0 -0
- package/dist/assets/fonts/atkinson-hyperlegible-mono-latin-wght-normal.woff2 +0 -0
- package/dist/assets/fonts/b612-latin-400-italic.woff2 +0 -0
- package/dist/assets/fonts/b612-latin-400-normal.woff2 +0 -0
- package/dist/assets/fonts/b612-latin-700-italic.woff2 +0 -0
- package/dist/assets/fonts/b612-latin-700-normal.woff2 +0 -0
- package/dist/assets/fonts/b612-mono-latin-400-italic.woff2 +0 -0
- package/dist/assets/fonts/b612-mono-latin-400-normal.woff2 +0 -0
- package/dist/assets/fonts/b612-mono-latin-700-italic.woff2 +0 -0
- package/dist/assets/fonts/b612-mono-latin-700-normal.woff2 +0 -0
- package/dist/assets/fonts/golos-text-latin-ext-wght-normal.woff2 +0 -0
- package/dist/assets/fonts/golos-text-latin-wght-normal.woff2 +0 -0
- package/dist/assets/fonts/licenses/archivo.txt +93 -0
- package/dist/assets/fonts/licenses/atkinson-hyperlegible-mono.txt +93 -0
- package/dist/assets/fonts/licenses/b612-mono.txt +93 -0
- package/dist/assets/fonts/licenses/b612.txt +93 -0
- package/dist/assets/fonts/licenses/golos-text.txt +93 -0
- package/dist/assets/fonts/licenses/shantell-sans.txt +93 -0
- package/dist/assets/fonts/shantell-sans-latin-ext-full-italic.woff2 +0 -0
- package/dist/assets/fonts/shantell-sans-latin-ext-full-normal.woff2 +0 -0
- package/dist/assets/fonts/shantell-sans-latin-full-italic.woff2 +0 -0
- package/dist/assets/fonts/shantell-sans-latin-full-normal.woff2 +0 -0
- package/dist/components/actions/Button/Button.d.ts +8 -0
- package/dist/components/actions/Button/Button.js.map +1 -1
- package/dist/components/actions/ChipGroup/ChipGroup.d.ts +9 -0
- package/dist/components/actions/ChipGroup/ChipGroup.js.map +1 -1
- package/dist/components/actions/IconButton/IconButton.d.ts +8 -0
- package/dist/components/actions/IconButton/IconButton.js.map +1 -1
- package/dist/components/actions/ModeToggle/ModeToggle.d.ts +8 -0
- package/dist/components/actions/ModeToggle/ModeToggle.js.map +1 -1
- package/dist/components/actions/SegmentedControl/SegmentedControl.d.ts +9 -0
- package/dist/components/actions/SegmentedControl/SegmentedControl.js.map +1 -1
- package/dist/components/actions/ToggleChip/ToggleChip.d.ts +9 -0
- package/dist/components/actions/ToggleChip/ToggleChip.js.map +1 -1
- package/dist/components/display/Avatar/Avatar.d.ts +11 -1
- package/dist/components/display/Avatar/Avatar.js.map +1 -1
- package/dist/components/display/AvatarGroup/AvatarGroup.d.ts +7 -0
- package/dist/components/display/AvatarGroup/AvatarGroup.js.map +1 -1
- package/dist/components/display/Badge/Badge.d.ts +7 -0
- package/dist/components/display/Badge/Badge.js.map +1 -1
- package/dist/components/display/Card/Card.js.map +1 -1
- package/dist/components/display/CodeBlock/CodeBlock.d.ts +9 -0
- package/dist/components/display/CodeBlock/CodeBlock.js.map +1 -1
- package/dist/components/display/DataList/DataList.js.map +1 -1
- package/dist/components/display/Delta/Delta.d.ts +9 -0
- package/dist/components/display/Delta/Delta.js.map +1 -1
- package/dist/components/display/EmptyState/EmptyState.d.ts +8 -0
- package/dist/components/display/EmptyState/EmptyState.js.map +1 -1
- package/dist/components/display/List/List.js.map +1 -1
- package/dist/components/display/Marquee/Marquee.d.ts +8 -0
- package/dist/components/display/Marquee/Marquee.js.map +1 -1
- package/dist/components/display/Media/Media.d.ts +7 -0
- package/dist/components/display/Media/Media.js.map +1 -1
- package/dist/components/display/Meter/Meter.d.ts +9 -0
- package/dist/components/display/Meter/Meter.js.map +1 -1
- package/dist/components/display/Progress/Progress.d.ts +8 -0
- package/dist/components/display/Progress/Progress.js.map +1 -1
- package/dist/components/display/Skeleton/Skeleton.js.map +1 -1
- package/dist/components/display/Stamp/Stamp.d.ts +8 -0
- package/dist/components/display/Stamp/Stamp.js.map +1 -1
- package/dist/components/display/Stat/Stat.d.ts +8 -0
- package/dist/components/display/Stat/Stat.js.map +1 -1
- package/dist/components/display/Table/Table.js.map +1 -1
- package/dist/components/display/Tag/Tag.d.ts +7 -0
- package/dist/components/display/Tag/Tag.js.map +1 -1
- package/dist/components/feedback/Alert/Alert.d.ts +10 -0
- package/dist/components/feedback/Alert/Alert.js.map +1 -1
- package/dist/components/feedback/LiveIndicator/LiveIndicator.d.ts +7 -0
- package/dist/components/feedback/LiveIndicator/LiveIndicator.js.map +1 -1
- package/dist/components/feedback/RelativeTime/RelativeTime.d.ts +8 -0
- package/dist/components/feedback/RelativeTime/RelativeTime.js.map +1 -1
- package/dist/components/feedback/Spinner/Spinner.d.ts +10 -1
- package/dist/components/feedback/Spinner/Spinner.js.map +1 -1
- package/dist/components/feedback/StatusDot/StatusDot.d.ts +10 -1
- package/dist/components/feedback/StatusDot/StatusDot.js.map +1 -1
- package/dist/components/inputs/AmountField/AmountField.d.ts +7 -0
- package/dist/components/inputs/AmountField/AmountField.js.map +1 -1
- package/dist/components/inputs/AmountInput/AmountInput.d.ts +8 -0
- package/dist/components/inputs/AmountInput/AmountInput.js.map +1 -1
- package/dist/components/inputs/Checkbox/Checkbox.d.ts +8 -0
- package/dist/components/inputs/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/inputs/CheckboxField/CheckboxField.d.ts +7 -0
- package/dist/components/inputs/CheckboxField/CheckboxField.js.map +1 -1
- package/dist/components/inputs/CheckboxGroup/CheckboxGroup.d.ts +8 -0
- package/dist/components/inputs/CheckboxGroup/CheckboxGroup.js.map +1 -1
- package/dist/components/inputs/CheckboxGroupField/CheckboxGroupField.d.ts +7 -0
- package/dist/components/inputs/CheckboxGroupField/CheckboxGroupField.js.map +1 -1
- package/dist/components/inputs/ChipGroupField/ChipGroupField.d.ts +7 -0
- package/dist/components/inputs/ChipGroupField/ChipGroupField.js.map +1 -1
- package/dist/components/inputs/ChoiceCards/ChoiceCards.d.ts +9 -0
- package/dist/components/inputs/ChoiceCards/ChoiceCards.js.map +1 -1
- package/dist/components/inputs/ChoiceCardsField/ChoiceCardsField.d.ts +7 -0
- package/dist/components/inputs/ChoiceCardsField/ChoiceCardsField.js.map +1 -1
- package/dist/components/inputs/ColorField/ColorField.d.ts +6 -0
- package/dist/components/inputs/ColorField/ColorField.js.map +1 -1
- package/dist/components/inputs/ColorInput/ColorInput.d.ts +8 -0
- package/dist/components/inputs/ColorInput/ColorInput.js.map +1 -1
- package/dist/components/inputs/Combobox/Combobox.d.ts +9 -0
- package/dist/components/inputs/Combobox/Combobox.js.map +1 -1
- package/dist/components/inputs/ComboboxField/ComboboxField.d.ts +7 -0
- package/dist/components/inputs/ComboboxField/ComboboxField.js.map +1 -1
- package/dist/components/inputs/DateRangeField/DateRangeField.d.ts +7 -0
- package/dist/components/inputs/DateRangeField/DateRangeField.js.map +1 -1
- package/dist/components/inputs/Field/Field.d.ts +26 -0
- package/dist/components/inputs/Field/Field.js.map +1 -1
- package/dist/components/inputs/Fieldset/Fieldset.d.ts +8 -0
- package/dist/components/inputs/Fieldset/Fieldset.js.map +1 -1
- package/dist/components/inputs/FileDrop/FileDrop.d.ts +10 -0
- package/dist/components/inputs/FileDrop/FileDrop.js.map +1 -1
- package/dist/components/inputs/FileField/FileField.d.ts +7 -0
- package/dist/components/inputs/FileField/FileField.js.map +1 -1
- package/dist/components/inputs/Input/Input.d.ts +9 -0
- package/dist/components/inputs/Input/Input.js.map +1 -1
- package/dist/components/inputs/NumberField/NumberField.d.ts +7 -0
- package/dist/components/inputs/NumberField/NumberField.js.map +1 -1
- package/dist/components/inputs/NumberInput/NumberInput.d.ts +8 -0
- package/dist/components/inputs/NumberInput/NumberInput.js.map +1 -1
- package/dist/components/inputs/OneTimeCodeField/OneTimeCodeField.d.ts +7 -0
- package/dist/components/inputs/OneTimeCodeField/OneTimeCodeField.js.map +1 -1
- package/dist/components/inputs/OneTimeCodeInput/OneTimeCodeInput.d.ts +8 -0
- package/dist/components/inputs/OneTimeCodeInput/OneTimeCodeInput.js.map +1 -1
- package/dist/components/inputs/PasswordField/PasswordField.d.ts +7 -0
- package/dist/components/inputs/PasswordField/PasswordField.js.map +1 -1
- package/dist/components/inputs/PasswordInput/PasswordInput.d.ts +10 -0
- package/dist/components/inputs/PasswordInput/PasswordInput.js.map +1 -1
- package/dist/components/inputs/RadioGroup/RadioGroup.d.ts +9 -0
- package/dist/components/inputs/RadioGroup/RadioGroup.js.map +1 -1
- package/dist/components/inputs/RadioGroupField/RadioGroupField.d.ts +8 -0
- package/dist/components/inputs/RadioGroupField/RadioGroupField.js.map +1 -1
- package/dist/components/inputs/RangeSlider/RangeSlider.d.ts +8 -0
- package/dist/components/inputs/RangeSlider/RangeSlider.js.map +1 -1
- package/dist/components/inputs/RangeSliderField/RangeSliderField.d.ts +7 -0
- package/dist/components/inputs/RangeSliderField/RangeSliderField.js.map +1 -1
- package/dist/components/inputs/Rating/Rating.d.ts +8 -0
- package/dist/components/inputs/Rating/Rating.js.map +1 -1
- package/dist/components/inputs/RatingField/RatingField.d.ts +7 -0
- package/dist/components/inputs/RatingField/RatingField.js.map +1 -1
- package/dist/components/inputs/SegmentedField/SegmentedField.d.ts +7 -0
- package/dist/components/inputs/SegmentedField/SegmentedField.js.map +1 -1
- package/dist/components/inputs/Select/Select.d.ts +9 -0
- package/dist/components/inputs/Select/Select.js.map +1 -1
- package/dist/components/inputs/SelectField/SelectField.d.ts +7 -0
- package/dist/components/inputs/SelectField/SelectField.js.map +1 -1
- package/dist/components/inputs/Slider/Slider.d.ts +8 -0
- package/dist/components/inputs/Slider/Slider.js.map +1 -1
- package/dist/components/inputs/SliderField/SliderField.d.ts +7 -0
- package/dist/components/inputs/SliderField/SliderField.js.map +1 -1
- package/dist/components/inputs/Switch/Switch.d.ts +8 -0
- package/dist/components/inputs/Switch/Switch.js.map +1 -1
- package/dist/components/inputs/SwitchField/SwitchField.d.ts +8 -0
- package/dist/components/inputs/SwitchField/SwitchField.js.map +1 -1
- package/dist/components/inputs/TagsField/TagsField.d.ts +6 -0
- package/dist/components/inputs/TagsField/TagsField.js.map +1 -1
- package/dist/components/inputs/TagsInput/TagsInput.d.ts +8 -0
- package/dist/components/inputs/TagsInput/TagsInput.js.map +1 -1
- package/dist/components/inputs/TextField/TextField.d.ts +8 -0
- package/dist/components/inputs/TextField/TextField.js.map +1 -1
- package/dist/components/inputs/Textarea/Textarea.d.ts +8 -0
- package/dist/components/inputs/Textarea/Textarea.js.map +1 -1
- package/dist/components/inputs/TextareaField/TextareaField.d.ts +7 -0
- package/dist/components/inputs/TextareaField/TextareaField.js.map +1 -1
- package/dist/components/layout/ActionBar/ActionBar.d.ts +7 -0
- package/dist/components/layout/ActionBar/ActionBar.js.map +1 -1
- package/dist/components/layout/AppShell/AppShell.js.map +1 -1
- package/dist/components/layout/AspectRatio/AspectRatio.d.ts +8 -0
- package/dist/components/layout/AspectRatio/AspectRatio.js.map +1 -1
- package/dist/components/layout/Box/Box.d.ts +8 -0
- package/dist/components/layout/Box/Box.js.map +1 -1
- package/dist/components/layout/Container/Container.d.ts +17 -0
- package/dist/components/layout/Container/Container.js.map +1 -1
- package/dist/components/layout/Divider/Divider.d.ts +7 -0
- package/dist/components/layout/Divider/Divider.js.map +1 -1
- package/dist/components/layout/Grid/Grid.d.ts +9 -0
- package/dist/components/layout/Grid/Grid.js.map +1 -1
- package/dist/components/layout/Inline/Inline.d.ts +8 -0
- package/dist/components/layout/Inline/Inline.js.map +1 -1
- package/dist/components/layout/Section/Section.d.ts +15 -0
- package/dist/components/layout/Section/Section.js.map +1 -1
- package/dist/components/layout/Split/Split.d.ts +9 -0
- package/dist/components/layout/Split/Split.js.map +1 -1
- package/dist/components/layout/Stack/Stack.d.ts +12 -0
- package/dist/components/layout/Stack/Stack.js.map +1 -1
- package/dist/components/layout/VisuallyHidden/VisuallyHidden.d.ts +7 -0
- package/dist/components/layout/VisuallyHidden/VisuallyHidden.js.map +1 -1
- package/dist/components/navigation/Accordion/Accordion.d.ts +7 -0
- package/dist/components/navigation/Accordion/Accordion.js.map +1 -1
- package/dist/components/navigation/BottomNav/BottomNav.d.ts +9 -0
- package/dist/components/navigation/BottomNav/BottomNav.js.map +1 -1
- package/dist/components/navigation/NavLinks/NavLinks.d.ts +9 -0
- package/dist/components/navigation/NavLinks/NavLinks.js.map +1 -1
- package/dist/components/navigation/Stepper/Stepper.d.ts +7 -0
- package/dist/components/navigation/Stepper/Stepper.js.map +1 -1
- package/dist/components/navigation/Tabs/Tabs.d.ts +8 -0
- package/dist/components/navigation/Tabs/Tabs.js.map +1 -1
- package/dist/components/overlays/Dialog/Dialog.d.ts +13 -0
- package/dist/components/overlays/Dialog/Dialog.js.map +1 -1
- package/dist/components/overlays/DropdownMenu/DropdownMenu.d.ts +8 -0
- package/dist/components/overlays/DropdownMenu/DropdownMenu.js.map +1 -1
- package/dist/components/overlays/Popover/Popover.d.ts +7 -0
- package/dist/components/overlays/Popover/Popover.js.map +1 -1
- package/dist/components/overlays/Sheet/Sheet.d.ts +8 -0
- package/dist/components/overlays/Sheet/Sheet.js.map +1 -1
- package/dist/components/overlays/Tooltip/Tooltip.d.ts +8 -0
- package/dist/components/overlays/Tooltip/Tooltip.js.map +1 -1
- package/dist/components/typography/Amount/Amount.d.ts +8 -0
- package/dist/components/typography/Amount/Amount.js.map +1 -1
- package/dist/components/typography/Code/Code.d.ts +8 -0
- package/dist/components/typography/Code/Code.js.map +1 -1
- package/dist/components/typography/Heading/Heading.d.ts +8 -0
- package/dist/components/typography/Heading/Heading.js.map +1 -1
- package/dist/components/typography/Kbd/Kbd.d.ts +6 -0
- package/dist/components/typography/Kbd/Kbd.js.map +1 -1
- package/dist/components/typography/Link/Link.d.ts +9 -0
- package/dist/components/typography/Link/Link.js.map +1 -1
- package/dist/components/typography/Numeral/Numeral.d.ts +8 -0
- package/dist/components/typography/Numeral/Numeral.js.map +1 -1
- package/dist/components/typography/Prose/Prose.d.ts +9 -0
- package/dist/components/typography/Prose/Prose.js.map +1 -1
- package/dist/components/typography/Quote/Quote.d.ts +7 -0
- package/dist/components/typography/Quote/Quote.js.map +1 -1
- package/dist/components/typography/SectionHeader/SectionHeader.d.ts +8 -0
- package/dist/components/typography/SectionHeader/SectionHeader.js.map +1 -1
- package/dist/components/typography/Text/Text.d.ts +8 -0
- package/dist/components/typography/Text/Text.js.map +1 -1
- package/dist/icons/Icon.d.ts +1 -1
- package/dist/icons/Icon.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/theme/ThemeProvider.d.ts +4 -4
- package/dist/theme/ThemeProvider.js.map +1 -1
- package/dist/theme/themes.d.ts +1 -1
- package/dist/theme/themes.js +15 -3
- package/dist/theme/themes.js.map +1 -1
- package/dist/themes/fiesta.css +1 -1
- package/dist/themes/flightdeck.css +1 -0
- package/dist/themes/ledger.css +1 -1
- package/dist/themes/monograph.css +1 -1
- package/dist/themes/riso.css +1 -0
- package/package.json +4 -2
- package/skills/custom-theme/SKILL.md +45 -43
- package/skills/custom-theme/references/colour.md +1 -1
- package/skills/custom-theme/references/motion.md +2 -2
- package/skills/custom-theme/references/tokens.md +42 -42
- package/skills/custom-theme/references/type.md +13 -10
- package/skills/design-rules/SKILL.md +31 -3
- package/skills/layout-composition/SKILL.md +27 -88
- package/skills/layout-composition/references/action-bar.md +3 -3
- package/skills/layout-composition/references/app-shell.md +10 -3
- package/skills/layout-composition/references/aspect-ratio.md +2 -0
- package/skills/layout-composition/references/box.md +6 -6
- package/skills/layout-composition/references/container.md +14 -12
- package/skills/layout-composition/references/divider.md +4 -4
- package/skills/layout-composition/references/section.md +69 -0
- package/skills/layout-composition/references/visually-hidden.md +3 -3
- package/skills/setup-and-theming/SKILL.md +10 -6
- package/skills/setup-and-theming/references/fiesta.md +3 -1
- package/skills/setup-and-theming/references/flightdeck.md +39 -0
- package/skills/setup-and-theming/references/ledger.md +7 -7
- package/skills/setup-and-theming/references/monograph.md +4 -0
- package/skills/setup-and-theming/references/paper.md +7 -7
- package/skills/setup-and-theming/references/riso.md +32 -0
|
@@ -45,25 +45,25 @@ Type roles:
|
|
|
45
45
|
|
|
46
46
|
| Token | Paper |
|
|
47
47
|
| --- | --- |
|
|
48
|
-
| `--font-display` | `'
|
|
49
|
-
| `--font-text` | `'
|
|
50
|
-
| `--font-prose` | `'
|
|
51
|
-
| `--font-mono` | `'
|
|
52
|
-
| `--font-numeric` | `'
|
|
48
|
+
| `--font-display` | `'Golos Text', ui-sans-serif, system-ui, sans-serif` |
|
|
49
|
+
| `--font-text` | `'Golos Text', ui-sans-serif, system-ui, sans-serif` |
|
|
50
|
+
| `--font-prose` | `'Golos Text', ui-sans-serif, system-ui, sans-serif` |
|
|
51
|
+
| `--font-mono` | `'Atkinson Hyperlegible Mono', ui-monospace, 'SFMono-Regular', Menlo, monospace` |
|
|
52
|
+
| `--font-numeric` | `'Golos Text', ui-sans-serif, system-ui, sans-serif` |
|
|
53
53
|
| `--type-base` | `1rem` |
|
|
54
54
|
| `--display-scale` | `1` |
|
|
55
55
|
| `--type-ratio` | `1.25` |
|
|
56
|
-
| `--display-weight` | `
|
|
56
|
+
| `--display-weight` | `740` |
|
|
57
57
|
| `--display-style` | `normal` |
|
|
58
58
|
| `--display-stretch` | `100%` |
|
|
59
59
|
| `--display-transform` | `none` |
|
|
60
|
-
| `--display-tracking` | `-0.
|
|
60
|
+
| `--display-tracking` | `-0.025em` |
|
|
61
61
|
| `--display-opsz` | `72` |
|
|
62
62
|
| `--heading-font` | `var(--font-display)` |
|
|
63
|
-
| `--heading-weight` | `
|
|
63
|
+
| `--heading-weight` | `650` |
|
|
64
64
|
| `--heading-tracking` | `-0.015em` |
|
|
65
65
|
| `--heading-transform` | `none` |
|
|
66
|
-
| `--label-weight` | `
|
|
66
|
+
| `--label-weight` | `600` |
|
|
67
67
|
| `--label-tracking` | `0` |
|
|
68
68
|
| `--label-transform` | `none` |
|
|
69
69
|
| `--numeric-stretch` | `100%` |
|
|
@@ -71,7 +71,7 @@ Type roles:
|
|
|
71
71
|
| `--leading-tight` | `1` |
|
|
72
72
|
| `--leading-snug` | `1.2` |
|
|
73
73
|
| `--leading-body` | `1.55` |
|
|
74
|
-
| `--prose-size` | `1.
|
|
74
|
+
| `--prose-size` | `1.0625rem` |
|
|
75
75
|
| `--prose-leading` | `1.6` |
|
|
76
76
|
|
|
77
77
|
Structure & temperament:
|
|
@@ -86,38 +86,38 @@ Structure & temperament:
|
|
|
86
86
|
| `--icon-stroke` | `1.5` |
|
|
87
87
|
| `--border-width` | `1px` |
|
|
88
88
|
| `--border-width-strong` | `2px` |
|
|
89
|
-
| `--radius-action` | `0.
|
|
90
|
-
| `--radius-field` | `0.
|
|
91
|
-
| `--radius-surface` | `0.
|
|
92
|
-
| `--radius-media` | `0.
|
|
93
|
-
| `--radius-chip` | `
|
|
89
|
+
| `--radius-action` | `0.25rem` |
|
|
90
|
+
| `--radius-field` | `0.25rem` |
|
|
91
|
+
| `--radius-surface` | `0.375rem` |
|
|
92
|
+
| `--radius-media` | `0.125rem` |
|
|
93
|
+
| `--radius-chip` | `999px` |
|
|
94
94
|
| `--radius-avatar` | `50%` |
|
|
95
95
|
|
|
96
96
|
Colour:
|
|
97
97
|
|
|
98
98
|
| Token | Paper |
|
|
99
99
|
| --- | --- |
|
|
100
|
-
| `--color-canvas` | `light-dark(oklch(0.
|
|
101
|
-
| `--color-surface` | `light-dark(oklch(0.
|
|
102
|
-
| `--color-surface-sunken` | `light-dark(oklch(0.
|
|
103
|
-
| `--color-surface-raised` | `light-dark(oklch(0.
|
|
104
|
-
| `--color-surface-inverse` | `light-dark(oklch(0.
|
|
105
|
-
| `--color-ink` | `light-dark(oklch(0.
|
|
106
|
-
| `--color-ink-muted` | `light-dark(oklch(0.
|
|
107
|
-
| `--color-ink-subtle` | `light-dark(oklch(0.
|
|
108
|
-
| `--color-ink-inverse` | `light-dark(oklch(0.
|
|
109
|
-
| `--color-line` | `light-dark(oklch(0.9 0.
|
|
110
|
-
| `--color-line-strong` | `light-dark(oklch(0.
|
|
111
|
-
| `--color-accent` | `light-dark(oklch(0.
|
|
112
|
-
| `--color-accent-hover` | `light-dark(oklch(0.
|
|
113
|
-
| `--color-accent-ink` | `light-dark(oklch(0.
|
|
114
|
-
| `--color-accent-text` | `light-dark(oklch(0.
|
|
115
|
-
| `--color-accent-soft` | `light-dark(oklch(0.
|
|
116
|
-
| `--color-highlight` | `light-dark(oklch(0.
|
|
100
|
+
| `--color-canvas` | `light-dark(oklch(0.952 0.006 250), oklch(0.17 0.008 250))` |
|
|
101
|
+
| `--color-surface` | `light-dark(oklch(0.995 0.002 250), oklch(0.215 0.009 250))` |
|
|
102
|
+
| `--color-surface-sunken` | `light-dark(oklch(0.935 0.006 250), oklch(0.14 0.008 250))` |
|
|
103
|
+
| `--color-surface-raised` | `light-dark(oklch(0.998 0.002 250), oklch(0.25 0.009 250))` |
|
|
104
|
+
| `--color-surface-inverse` | `light-dark(oklch(0.26 0.06 256), oklch(0.93 0.012 250))` |
|
|
105
|
+
| `--color-ink` | `light-dark(oklch(0.26 0.06 256), oklch(0.94 0.01 250))` |
|
|
106
|
+
| `--color-ink-muted` | `light-dark(oklch(0.42 0.06 256), oklch(0.77 0.015 250))` |
|
|
107
|
+
| `--color-ink-subtle` | `light-dark(oklch(0.47 0.06 256), oklch(0.66 0.015 250))` |
|
|
108
|
+
| `--color-ink-inverse` | `light-dark(oklch(0.96 0.006 250), oklch(0.2 0.05 256))` |
|
|
109
|
+
| `--color-line` | `light-dark(oklch(0.9 0.006 250), oklch(0.3 0.01 250))` |
|
|
110
|
+
| `--color-line-strong` | `light-dark(oklch(0.78 0.012 252), oklch(0.42 0.012 250))` |
|
|
111
|
+
| `--color-accent` | `light-dark(oklch(0.37 0.1 255), oklch(0.86 0.06 250))` |
|
|
112
|
+
| `--color-accent-hover` | `light-dark(oklch(0.31 0.095 255), oklch(0.92 0.045 250))` |
|
|
113
|
+
| `--color-accent-ink` | `light-dark(oklch(0.985 0.005 250), oklch(0.2 0.05 256))` |
|
|
114
|
+
| `--color-accent-text` | `light-dark(oklch(0.35 0.1 255), oklch(0.86 0.06 250))` |
|
|
115
|
+
| `--color-accent-soft` | `light-dark(oklch(0.93 0.025 252), oklch(0.285 0.03 252))` |
|
|
116
|
+
| `--color-highlight` | `light-dark(oklch(0.925 0.045 228), oklch(0.33 0.05 235))` |
|
|
117
117
|
| `--color-highlight-ink` | `var(--color-ink)` |
|
|
118
118
|
| `--color-focus` | `var(--color-ink)` |
|
|
119
119
|
| `--color-selection` | `light-dark(oklch(0.88 0.06 228), oklch(0.42 0.07 235))` |
|
|
120
|
-
| `--color-scrim` | `light-dark(oklch(0.22 0.
|
|
120
|
+
| `--color-scrim` | `light-dark(oklch(0.22 0.04 258 / 0.4), oklch(0.07 0.01 250 / 0.66))` |
|
|
121
121
|
| `--tone-positive` | `light-dark(oklch(0.52 0.11 155), oklch(0.72 0.12 158))` |
|
|
122
122
|
| `--tone-positive-soft` | `light-dark(oklch(0.94 0.035 155), oklch(0.28 0.045 158))` |
|
|
123
123
|
| `--tone-positive-text` | `light-dark(oklch(0.45 0.1 155), oklch(0.78 0.11 158))` |
|
|
@@ -141,8 +141,8 @@ Colour:
|
|
|
141
141
|
| `--color-cat-5` | `light-dark(oklch(0.8 0.05 300), oklch(0.7 0.06 300))` |
|
|
142
142
|
| `--color-cat-6` | `light-dark(oklch(0.82 0.06 125), oklch(0.72 0.07 125))` |
|
|
143
143
|
| `--color-cat-7` | `light-dark(oklch(0.8 0.05 195), oklch(0.7 0.06 195))` |
|
|
144
|
-
| `--color-cat-8` | `light-dark(oklch(0.8 0.01
|
|
145
|
-
| `--color-cat-ink` | `oklch(0.21 0.
|
|
144
|
+
| `--color-cat-8` | `light-dark(oklch(0.8 0.01 250), oklch(0.7 0.01 250))` |
|
|
145
|
+
| `--color-cat-ink` | `oklch(0.21 0.03 258)` |
|
|
146
146
|
|
|
147
147
|
Edges & depth:
|
|
148
148
|
|
|
@@ -151,13 +151,13 @@ Edges & depth:
|
|
|
151
151
|
| `--shadow-surface` | `none` |
|
|
152
152
|
| `--active-shift` | `0px` |
|
|
153
153
|
| `--shadow-active` | `none` |
|
|
154
|
-
| `--shadow-float` | `0 1px 2px oklch(0.2 0.
|
|
155
|
-
| `--shadow-overlay` | `0 2px 4px oklch(0.15 0.
|
|
154
|
+
| `--shadow-float` | `0 1px 2px oklch(0.2 0.04 258 / 0.1), 0 8px 24px -6px oklch(0.2 0.04 258 / 0.18)` |
|
|
155
|
+
| `--shadow-overlay` | `0 2px 4px oklch(0.15 0.04 258 / 0.12), 0 20px 56px -12px oklch(0.15 0.04 258 / 0.32)` |
|
|
156
156
|
| `--canvas-image` | `none` |
|
|
157
157
|
|
|
158
158
|
## Optional theme tokens
|
|
159
159
|
|
|
160
|
-
Some themes set a few more: Fiesta's inks for text on
|
|
160
|
+
Some themes set a few more: Fiesta's and Riso's inks for text on their tinted rows, Ledger's table rule. Every theme scope resets these first, so a theme nested inside another falls back to the component's default instead of inheriting its parent's value. Set them only when your theme's idea needs them:
|
|
161
161
|
|
|
162
162
|
`--canvas-image-size`, `--control-checked-border`, `--highlight-accent-text`, `--highlight-tone-caution-text`, `--highlight-tone-critical-text`, `--highlight-tone-info-text`, `--highlight-tone-positive-text`, `--marquee-edge`, `--numeral-scale`, `--numeral-weight`, `--section-divider-color`, `--stat-fit`, `--table-foot-rule`, `--table-head-font`
|
|
163
163
|
|
|
@@ -170,7 +170,7 @@ A component exposes a few tokens of its own where a theme might reasonably diffe
|
|
|
170
170
|
Radii are roles, not one global roundness. A theme can make actions pills and surfaces square.
|
|
171
171
|
|
|
172
172
|
|
|
173
|
-
One edge treatment per element: a border, a shadow or a change of fill, never all three. Static structure uses hairlines. Soft shadows are only for things that float, like popovers and dialogs. Fiesta
|
|
173
|
+
One edge treatment per element: a border, a shadow or a change of fill, never all three. Static structure uses hairlines. Soft shadows are only for things that float, like popovers and dialogs. Hard offsets never go on static surfaces in a new theme. Fiesta keeps its hard offset as a legacy preset: it's the print misregistration, and it _is_ the edge. Riso's misregistered offset, the second ink drum printing slightly off, is floating-only.
|
|
174
174
|
|
|
175
175
|
|
|
176
176
|
## Axes and scoping
|
|
@@ -178,13 +178,13 @@ One edge treatment per element: a border, a shadow or a change of fill, never al
|
|
|
178
178
|
Three attributes select tokens, and they're independent of each other.
|
|
179
179
|
|
|
180
180
|
```html
|
|
181
|
-
<html data-theme="
|
|
182
|
-
<div data-theme="
|
|
181
|
+
<html data-theme="flightdeck" data-mode="dark">
|
|
182
|
+
<div data-theme="riso">a Riso panel that keeps the page's dark mode</div>
|
|
183
183
|
<div data-density="compact">a denser table</div>
|
|
184
184
|
</html>
|
|
185
185
|
```
|
|
186
186
|
|
|
187
|
-
- `data-theme` is `paper`, `monograph`, `ledger`, `fiesta`, or the name of a theme you wrote. No attribute means Paper.
|
|
187
|
+
- `data-theme` is `paper`, `monograph`, `ledger`, `fiesta`, `flightdeck`, `riso`, or the name of a theme you wrote. No attribute means Paper.
|
|
188
188
|
- `data-mode` is `light`, `dark` or `system`. It drives `color-scheme`, which drives every `light-dark()` colour. Leave it off nested scopes and they inherit the page's mode.
|
|
189
189
|
- `data-density` is `compact` or `comfortable`, and multiplies the theme's own density.
|
|
190
190
|
|
|
@@ -20,7 +20,7 @@ A theme picks at most two families (plus a mono where it needs one) and assigns
|
|
|
20
20
|
| Numeric | `--font-numeric`, `--numeric-stretch` | `Numeral`, `Amount`, `Stat`, numeric cells |
|
|
21
21
|
| Mono | `--font-mono`, `--mono-stretch` | `Code`, `CodeBlock`, `Kbd` |
|
|
22
22
|
|
|
23
|
-
Fiesta sets `--heading-transform: uppercase` for poster headlines
|
|
23
|
+
Fiesta sets `--heading-transform: uppercase` for poster headlines. Ledger sets `--numeric-stretch` so its figures use a condensed width of the same family, and a column of money reads like receipt tape. Flightdeck keeps its numerals in B612, whose digits are already equal width, so columns align without a monospace. Neither needed a component change. Riso's Shantell Sans has no tabular figures, so its numerals don't line up in columns.
|
|
24
24
|
|
|
25
25
|
## The scale
|
|
26
26
|
|
|
@@ -50,12 +50,15 @@ Every number that aligns or updates uses tabular, lining figures: counts, money,
|
|
|
50
50
|
|
|
51
51
|
Kiln self-hosts every face its themes use, so there's nothing to set up:
|
|
52
52
|
|
|
53
|
-
| Face
|
|
54
|
-
|
|
|
55
|
-
|
|
|
56
|
-
|
|
|
57
|
-
|
|
|
58
|
-
|
|
|
59
|
-
|
|
|
60
|
-
|
|
61
|
-
|
|
53
|
+
| Face | Used by | Ships in |
|
|
54
|
+
| ---------------------------------- | ------------------------------- | ------------------------------------------- |
|
|
55
|
+
| Golos Text | Paper | `styles.css` |
|
|
56
|
+
| Atkinson Hyperlegible Mono | code in Paper, Ledger and Riso | `styles.css` |
|
|
57
|
+
| Newsreader, Schibsted Grotesk | Monograph | `themes/monograph.css` |
|
|
58
|
+
| Martian Mono | code in Monograph and Fiesta | `themes/monograph.css`, `themes/fiesta.css` |
|
|
59
|
+
| Archivo | Ledger | `themes/ledger.css` |
|
|
60
|
+
| Big Shoulders, Bricolage Grotesque | Fiesta | `themes/fiesta.css` |
|
|
61
|
+
| B612, B612 Mono | Flightdeck (B612 Mono for code) | `themes/flightdeck.css` |
|
|
62
|
+
| Shantell Sans | Riso | `themes/riso.css` |
|
|
63
|
+
|
|
64
|
+
Browsers download a face only when something renders in it, so a declared face you never use costs nothing. All of them are licensed under the SIL Open Font License 1.1, and the licences ship in the package at `dist/assets/fonts/licenses/`. A theme of your own loads its own fonts: see [Theming](../SKILL.md#5-load-its-fonts).
|
|
@@ -20,7 +20,7 @@ These rules come from [DESIGN.md](https://github.com/mitcsutt/kiln/blob/main/DES
|
|
|
20
20
|
## Principles
|
|
21
21
|
|
|
22
22
|
1. **Themes are data, components are structure.** A component never knows which theme it is in. Everything visual is a token; a new theme is one CSS file and zero component changes.
|
|
23
|
-
2. **One idea per theme, drawn from its subject.** Paper is
|
|
23
|
+
2. **One idea per theme, drawn from its subject.** Paper is an office that prints for everyone, on grey recycled stock in blue-black ink. Monograph is a scholar's monograph read under a desk lamp. Ledger is an accountant's columnar pad. Fiesta is a screen-printed festival poster. Flightdeck is a glass-cockpit display. Riso is a two-drum risograph zine. Monograph and Fiesta predate the second-order rules in §2 and are kept unchanged for compatibility. Every choice in a theme designed since has a one-line reason traced to its subject, written in the stylesheet next to the value. If you can't write the reason, the choice is wrong and it doesn't ship.
|
|
24
24
|
3. **Props, not styles.** Consumers compose layout and intent through typed props (`gap={5}`, `tone="critical"`, `width="text"`). No utility classes, no inline style soup, no raw px/hex/ms at call sites. `className` exists as an escape hatch, not a workflow.
|
|
25
25
|
4. **Durable by default.** Every component forwards refs, spreads native props, works with React 18 and 19, is keyboard- and screen-reader-complete, respects `prefers-reduced-motion`, and renders on the server.
|
|
26
26
|
5. **Specific beats safe.** The median choice is the wrong choice (see [Not AI slop](#not-ai-slop)).
|
|
@@ -34,7 +34,7 @@ Generated UI converges on the statistical median: indigo buttons, Inter, gradien
|
|
|
34
34
|
- Authored in **OKLCH**. Neutrals are **tinted** (chroma 0.004–0.02 toward the theme's hue). Never `#000`/`#fff` surfaces, never stock slate/zinc.
|
|
35
35
|
- **One accent, ~5–10% of pixels**: the primary action, the current item, live state, key data. A second hue only when it carries meaning (`--color-highlight` = "you" / selected; tones = status).
|
|
36
36
|
- **No gradients** unless they encode data. No gradient text. No glow halos in dark mode.
|
|
37
|
-
- No indigo/violet as a primary. No cream `#F4F1EA`
|
|
37
|
+
- No indigo/violet as a primary. No warm cream canvas (such as `#F4F1EA`) and no terracotta or ember accent (such as `#D97757`). See _Second-order tells_ below.
|
|
38
38
|
|
|
39
39
|
### Type
|
|
40
40
|
|
|
@@ -44,6 +44,34 @@ Generated UI converges on the statistical median: indigo buttons, Inter, gradien
|
|
|
44
44
|
- Prose measure ≤ 70ch (`width="text"`). `text-wrap: balance` on headings, `pretty` on paragraphs (the reset does it).
|
|
45
45
|
- **Banned patterns:** accenting one word of a headline in italic/colour; a tracked ALL-CAPS eyebrow over every section; `01 / 02 / 03` numbering on things that aren't a sequence; monospace used as decoration for small labels.
|
|
46
46
|
|
|
47
|
+
### Second-order tells
|
|
48
|
+
|
|
49
|
+
Models that are told to avoid the tells above converge on a second set instead ([research](https://github.com/mitcsutt/kiln/blob/main/docs/research/ai-design-tells.md), [ADR 0030](https://github.com/mitcsutt/kiln/blob/main/docs/adr/0030-theme-family-without-ai-tells.md)). None of these ships in a new built-in theme:
|
|
50
|
+
|
|
51
|
+
- A **cream or warm-paper canvas** (hue 40 to 100, with any visible chroma), including apricot and beige.
|
|
52
|
+
- An **ember, terracotta or burnt-orange accent**.
|
|
53
|
+
- A **near-black canvas with one acid or ember accent**.
|
|
54
|
+
- A **mint or sage canvas with a forest-green accent**, which is the cream tell in another hue.
|
|
55
|
+
- **Hard-offset "neo-brutalist" shadows on static surfaces.** A hard offset is allowed only where the theme's subject explains it, and only on floating layers. Fiesta, the legacy preset, keeps its hard offset on static surfaces; no new theme may.
|
|
56
|
+
- **Grain, noise or halftone** on the canvas (`--canvas-image` stays `none`).
|
|
57
|
+
- **Monospace beyond code**: for labels, eyebrows or every figure as decoration. A mono is allowed for figures only when the subject really uses one.
|
|
58
|
+
- A **serif display with one italic accent word**.
|
|
59
|
+
- A font from the banned list below.
|
|
60
|
+
|
|
61
|
+
`packages/ui/src/themes/tells.test.ts` enforces the checkable part for Paper, Ledger, Flightdeck and Riso, reading the light half of each `light-dark()` pair:
|
|
62
|
+
|
|
63
|
+
- no banned font family in their stylesheets or in any font stylesheet under `tokens/` except the legacy ones;
|
|
64
|
+
- no warm-cream canvas: `--color-canvas` fails when its lightness is above 0.85, its chroma above 0.008 and its hue 40 to 100;
|
|
65
|
+
- no ember, terracotta or indigo accent: `--color-accent` fails when its chroma is above 0.08 and its hue is 25 to 60 (ember) or above 262 up to 300 (indigo).
|
|
66
|
+
|
|
67
|
+
The rest is review.
|
|
68
|
+
|
|
69
|
+
**Legacy exemption.** Monograph and Fiesta are listed as `LEGACY` in that test and are exempt, along with the font stylesheets only they use (`fonts-monograph.css`, `fonts-fiesta.css` and `fonts-martian-mono.css`), because they ship unchanged from before these rules ([ADR 0030](https://github.com/mitcsutt/kiln/blob/main/docs/adr/0030-theme-family-without-ai-tells.md)). Monograph still has its ember accent and serif display, and Fiesta its apricot canvas and halftone. Do not treat them as precedent: a new theme gets no exemption, and a redesigned Monograph or Fiesta loses its own.
|
|
70
|
+
|
|
71
|
+
The banned font families, from the research: the first-order defaults plus the faces models now reach for as "distinctive" escapes (several are on Anthropic's own recommended list): Inter, Roboto, Open Sans, Poppins, Montserrat, Space Grotesk, Space Mono, Geist, DM Sans, DM Serif, Manrope, Plus Jakarta Sans, Outfit, Sora, Syne, Satoshi, Cabinet Grotesk, Clash Display, General Sans, Instrument Sans, Instrument Serif, Fraunces, Playfair Display, Cormorant, Lora, EB Garamond, Newsreader, Bricolage Grotesque, IBM Plex, JetBrains Mono and Fira Code. The list goes stale as model defaults move: change the list in the test and here together.
|
|
72
|
+
|
|
73
|
+
Beyond the checks, a theme has a subject, and each colour, face, radius and easing has a one-line reason in the stylesheet that traces it to that subject. Each theme also mixes radii on purpose (for example square fields with pill chips), so no theme is one uniform roundness.
|
|
74
|
+
|
|
47
75
|
### Layout
|
|
48
76
|
|
|
49
77
|
- **Left-aligned by default.** Centre is an exception (empty states, a lone CTA).
|
|
@@ -55,7 +83,7 @@ Generated UI converges on the statistical median: indigo buttons, Inter, gradien
|
|
|
55
83
|
### Components & depth
|
|
56
84
|
|
|
57
85
|
- **Radii are roles**, not a global roundness: `--radius-action`, `--radius-field`, `--radius-surface`, `--radius-media`, `--radius-chip`, `--radius-avatar`. Nested radii shrink (inner = outer − padding).
|
|
58
|
-
- **One edge treatment per element**: a border _or_ a shadow _or_ a fill change. Static structure uses hairlines; soft shadows are only for things that float (popover, menu, dialog). Fiesta
|
|
86
|
+
- **One edge treatment per element**: a border _or_ a shadow _or_ a fill change. Static structure uses hairlines; soft shadows are only for things that float (popover, menu, dialog). Hard-offset shadows never go on static surfaces in a new theme. Fiesta keeps its hard offset as a legacy preset: it is the print misregistration, and it _is_ the edge. Riso's misregistered offset (the second ink drum slightly off) is floating-only.
|
|
59
87
|
- **Icons**: the library ships ~20 glyphs on a 20px grid with a themed stroke. At most one icon per row; never an icon in a tinted chip; never emoji as UI.
|
|
60
88
|
- **No left-border-accent callouts.** Alerts are a neutral hairline frame; the tone lives only in the glyph and a short tab on the top edge (`variant="soft"` for a tinted box when it must shout).
|
|
61
89
|
- **Empty states** mark their frame with printer's crop marks, not a dashed box.
|
|
@@ -7,18 +7,18 @@ metadata:
|
|
|
7
7
|
library: "@mitcsutt/kiln-ui"
|
|
8
8
|
sources:
|
|
9
9
|
- mitcsutt/kiln:apps/docs/content/docs/ui/foundations/spacing.mdx
|
|
10
|
-
- mitcsutt/kiln:
|
|
11
|
-
- mitcsutt/kiln:
|
|
12
|
-
- mitcsutt/kiln:
|
|
13
|
-
- mitcsutt/kiln:
|
|
14
|
-
- mitcsutt/kiln:
|
|
15
|
-
- mitcsutt/kiln:
|
|
16
|
-
- mitcsutt/kiln:
|
|
17
|
-
- mitcsutt/kiln:
|
|
18
|
-
- mitcsutt/kiln:
|
|
19
|
-
- mitcsutt/kiln:
|
|
20
|
-
- mitcsutt/kiln:
|
|
21
|
-
- mitcsutt/kiln:
|
|
10
|
+
- mitcsutt/kiln:packages/ui/src/components/layout/Stack/Stack.tsx
|
|
11
|
+
- mitcsutt/kiln:packages/ui/src/components/layout/Inline/Inline.tsx
|
|
12
|
+
- mitcsutt/kiln:packages/ui/src/components/layout/Grid/Grid.tsx
|
|
13
|
+
- mitcsutt/kiln:packages/ui/src/components/layout/Split/Split.tsx
|
|
14
|
+
- mitcsutt/kiln:packages/ui/src/components/layout/Section/Section.tsx
|
|
15
|
+
- mitcsutt/kiln:packages/ui/src/components/layout/Container/Container.tsx
|
|
16
|
+
- mitcsutt/kiln:packages/ui/src/components/layout/Box/Box.tsx
|
|
17
|
+
- mitcsutt/kiln:packages/ui/src/components/layout/AppShell/AppShell.tsx
|
|
18
|
+
- mitcsutt/kiln:packages/ui/src/components/layout/ActionBar/ActionBar.tsx
|
|
19
|
+
- mitcsutt/kiln:packages/ui/src/components/layout/Divider/Divider.tsx
|
|
20
|
+
- mitcsutt/kiln:packages/ui/src/components/layout/AspectRatio/AspectRatio.tsx
|
|
21
|
+
- mitcsutt/kiln:packages/ui/src/components/layout/VisuallyHidden/VisuallyHidden.tsx
|
|
22
22
|
- mitcsutt/kiln:apps/docs/content/docs/ui/patterns/dashboard.mdx
|
|
23
23
|
- mitcsutt/kiln:apps/docs/content/docs/ui/patterns/settings.mdx
|
|
24
24
|
- mitcsutt/kiln:apps/docs/content/docs/ui/patterns/checkout.mdx
|
|
@@ -121,6 +121,8 @@ A column of things with consistent space between them. The layout you'll reach f
|
|
|
121
121
|
|
|
122
122
|
`Stack` lays its children out vertically with a gap from the space scale. Most screens are stacks of stacks, so most spacing in a Kiln app is a `gap` prop rather than a margin.
|
|
123
123
|
|
|
124
|
+
`align` sets the cross-axis alignment (`stretch` by default, so children fill the width). Use `align="start"` when a child like a button should keep its own width.
|
|
125
|
+
|
|
124
126
|
```tsx
|
|
125
127
|
import { Button, Heading, Stack, Text } from '@mitcsutt/kiln-ui'
|
|
126
128
|
|
|
@@ -137,8 +139,6 @@ export function Usage() {
|
|
|
137
139
|
}
|
|
138
140
|
```
|
|
139
141
|
|
|
140
|
-
`align` sets the cross-axis alignment (`stretch` by default, so children fill the width). Use `align="start"` when a child like a button should keep its own width.
|
|
141
|
-
|
|
142
142
|
### Rules between items
|
|
143
143
|
|
|
144
144
|
`dividers` draws a hairline between every child, centred in the gap. It's usually better than a card per item: lists, settings rows and timelines read as one document.
|
|
@@ -180,8 +180,8 @@ export function Dividers() {
|
|
|
180
180
|
| --- | --- | --- | --- |
|
|
181
181
|
| `gap` | `Responsive<Space>` | | Space between children, as a step on the theme's space scale. Responsive. |
|
|
182
182
|
| `align` | `Responsive<Align>` | `stretch` | Cross-axis alignment. Responsive. Default `stretch`. |
|
|
183
|
-
| `dividers` | `boolean` |
|
|
184
|
-
| `as` | `'div' \| 'section' \| 'article' \| 'aside' \| 'header' \| 'footer' \| 'main' \| 'nav' \| 'ul' \| 'ol' \| 'li' \| 'form' \| 'fieldset'` |
|
|
183
|
+
| `dividers` | `boolean` | `false` | Draw a hairline rule between children (the rule sits in the middle of the gap). |
|
|
184
|
+
| `as` | `'div' \| 'section' \| 'article' \| 'aside' \| 'header' \| 'footer' \| 'main' \| 'nav' \| 'ul' \| 'ol' \| 'li' \| 'form' \| 'fieldset'` | `div` | Render as a different element. Lists get `role="list"` semantics preserved. |
|
|
185
185
|
| `hideBelow` | `'sm' \| 'md' \| 'lg' \| 'xl'` | | Hide below this breakpoint (e.g. `md` → hidden on phones, shown from 48em). |
|
|
186
186
|
| `hideAbove` | `'sm' \| 'md' \| 'lg' \| 'xl'` | | Hide from this breakpoint up (e.g. `md` → shown on phones only). |
|
|
187
187
|
|
|
@@ -193,6 +193,8 @@ Things in a row that wrap when they run out of room. Button rows, tag lists, too
|
|
|
193
193
|
|
|
194
194
|
`Inline` lays its children out horizontally with a gap, vertically centred, wrapping onto new lines when they don't fit.
|
|
195
195
|
|
|
196
|
+
`justify` spreads the row (`between` pushes the groups to either end) and takes responsive values, so a header can stack its groups on a phone and spread them from `md` up. `wrap={false}` keeps everything on one line; children then shrink instead. `rowGap` sets the space between wrapped lines when it should differ from `gap`.
|
|
197
|
+
|
|
196
198
|
```tsx
|
|
197
199
|
import { Badge, Button, Inline, Text } from '@mitcsutt/kiln-ui'
|
|
198
200
|
|
|
@@ -214,8 +216,6 @@ export function Usage() {
|
|
|
214
216
|
}
|
|
215
217
|
```
|
|
216
218
|
|
|
217
|
-
`justify` spreads the row (`between` pushes the groups to either end) and takes responsive values, so a header can stack its groups on a phone and spread them from `md` up. `wrap={false}` keeps everything on one line; children then shrink instead. `rowGap` sets the space between wrapped lines when it should differ from `gap`.
|
|
218
|
-
|
|
219
219
|
### API
|
|
220
220
|
|
|
221
221
|
`InlineProps`:
|
|
@@ -227,7 +227,7 @@ export function Usage() {
|
|
|
227
227
|
| `align` | `Responsive<Align>` | `center` | Cross-axis alignment. Default `center`. Responsive. |
|
|
228
228
|
| `justify` | `Responsive<Justify>` | `start` | Main-axis distribution. Default `start`. Responsive. |
|
|
229
229
|
| `wrap` | `boolean` | `true` | Wrap onto new lines. Default `true`. |
|
|
230
|
-
| `as` | `'div' \| 'header' \| 'footer' \| 'nav' \| 'ul' \| 'ol' \| 'li' \| 'span' \| 'p'` |
|
|
230
|
+
| `as` | `'div' \| 'header' \| 'footer' \| 'nav' \| 'ul' \| 'ol' \| 'li' \| 'span' \| 'p'` | `div` | |
|
|
231
231
|
| `hideBelow` | `'sm' \| 'md' \| 'lg' \| 'xl'` | | Hide below this breakpoint (e.g. `md` → hidden on phones, shown from 48em). |
|
|
232
232
|
| `hideAbove` | `'sm' \| 'md' \| 'lg' \| 'xl'` | | Hide from this breakpoint up (e.g. `md` → shown on phones only). |
|
|
233
233
|
|
|
@@ -239,6 +239,8 @@ Two-dimensional layout, either with a column count per breakpoint or as an auto-
|
|
|
239
239
|
|
|
240
240
|
`Grid` has two modes. With `columns`, you choose how many equal columns there are, per breakpoint. With `minItemWidth`, the grid fits as many columns as there's room for, each at least that wide, so it adapts to its container without a single breakpoint.
|
|
241
241
|
|
|
242
|
+
One column on a phone, two from `sm` and four from `lg`.
|
|
243
|
+
|
|
242
244
|
```tsx
|
|
243
245
|
import { Box, Grid, Text } from '@mitcsutt/kiln-ui'
|
|
244
246
|
|
|
@@ -318,7 +320,7 @@ export function Items() {
|
|
|
318
320
|
| `gap` | `Responsive<Space>` | | Space between cells (both axes). Responsive. |
|
|
319
321
|
| `rowGap` | `Responsive<Space>` | | Row gap, if different from `gap`. Responsive. |
|
|
320
322
|
| `align` | `Responsive<Align>` | `stretch` | Cell alignment on the block axis. Default `stretch`. Responsive. |
|
|
321
|
-
| `as` | `'div' \| 'section' \| 'ul' \| 'ol' \| 'dl'` |
|
|
323
|
+
| `as` | `'div' \| 'section' \| 'ul' \| 'ol' \| 'dl'` | `div` | |
|
|
322
324
|
| `hideBelow` | `'sm' \| 'md' \| 'lg' \| 'xl'` | | Hide below this breakpoint (e.g. `md` → hidden on phones, shown from 48em). |
|
|
323
325
|
| `hideAbove` | `'sm' \| 'md' \| 'lg' \| 'xl'` | | Hide from this breakpoint up (e.g. `md` → shown on phones only). |
|
|
324
326
|
|
|
@@ -348,6 +350,8 @@ An asymmetric two-column layout that stacks on small screens. A heading beside i
|
|
|
348
350
|
|
|
349
351
|
`Split` takes exactly two children and puts them side by side in a ratio. Asymmetric splits read as designed; a 50/50 split of a heading and a list rarely does. Below `collapseBelow` (`md` by default) the two stack, first child on top.
|
|
350
352
|
|
|
353
|
+
A heading and a list of changes in a 5/7 split, stacked on a phone.
|
|
354
|
+
|
|
351
355
|
```tsx
|
|
352
356
|
import { Heading, Split, Stack, Text } from '@mitcsutt/kiln-ui'
|
|
353
357
|
|
|
@@ -410,82 +414,17 @@ export function Ratios() {
|
|
|
410
414
|
| `collapseBelow` | `'sm' \| 'md' \| 'lg'` | `md` | Stack the two children vertically below this breakpoint. Default `md`. |
|
|
411
415
|
| `gap` | `Responsive<Space>` | | Space between the two sides (and between them when stacked). Responsive. |
|
|
412
416
|
| `align` | `Responsive<Align>` | `start` | Block-axis alignment of the two sides. Default `start`. Responsive. |
|
|
413
|
-
| `reverse` | `boolean` |
|
|
417
|
+
| `reverse` | `boolean` | `false` | Put the second child first *visually* when split. DOM (and stacked) order is unchanged. |
|
|
414
418
|
| `children` (required) | `[ReactNode, ReactNode]` | | Exactly two children: the first and second side. |
|
|
415
|
-
| `as` | `'div' \| 'section' \| 'article' \| 'header' \| 'footer'` |
|
|
419
|
+
| `as` | `'div' \| 'section' \| 'article' \| 'header' \| 'footer'` | `div` | |
|
|
416
420
|
|
|
417
421
|
Also accepts every prop of `HTMLAttributes<HTMLElement>`.
|
|
418
422
|
|
|
419
|
-
## Section
|
|
420
|
-
|
|
421
|
-
A full-bleed band of vertical space, with an optional surface and rules. Put a Container inside it for width.
|
|
422
|
-
|
|
423
|
-
`Section` is how a page gets its rhythm: each band pads itself top and bottom with a step from the space scale, and can paint a surface across the full width. Width is the `Container`'s job, so a section is almost always `Section` then `Container`.
|
|
424
|
-
|
|
425
|
-
```tsx
|
|
426
|
-
import { Button, Container, Heading, Section, Stack, Text } from '@mitcsutt/kiln-ui'
|
|
427
|
-
|
|
428
|
-
export function Usage() {
|
|
429
|
-
return (
|
|
430
|
-
<>
|
|
431
|
-
<Section space={7}>
|
|
432
|
-
<Container width="text">
|
|
433
|
-
<Stack gap={3}>
|
|
434
|
-
<Heading level={3} size="2xl">
|
|
435
|
-
Ride the coast for less
|
|
436
|
-
</Heading>
|
|
437
|
-
<Text tone="muted">An annual pass covers every ferry and bus in the bay.</Text>
|
|
438
|
-
</Stack>
|
|
439
|
-
</Container>
|
|
440
|
-
</Section>
|
|
441
|
-
<Section space={6} surface="inverse" divider="top">
|
|
442
|
-
<Container width="text">
|
|
443
|
-
<Stack gap={4} align="start">
|
|
444
|
-
<Text>Commuting every day? The pass pays for itself in five weeks.</Text>
|
|
445
|
-
<Button>Buy an annual pass</Button>
|
|
446
|
-
</Stack>
|
|
447
|
-
</Container>
|
|
448
|
-
</Section>
|
|
449
|
-
</>
|
|
450
|
-
)
|
|
451
|
-
}
|
|
452
|
-
```
|
|
453
|
-
|
|
454
|
-
Vary `space` between neighbours. The scale is non-linear for this reason: a page of `space={8}` everywhere has no rhythm at all.
|
|
455
|
-
|
|
456
|
-
### Surfaces and bands
|
|
457
|
-
|
|
458
|
-
`surface` is `canvas`, `surface`, `sunken`, `inverse` or `accent`. On `inverse` and `accent`, the colour roles flip for everything inside, so text, links, focus rings and buttons stay legible with no extra props. `divider` adds a rule at the `top`, `bottom` or `both`.
|
|
459
|
-
|
|
460
|
-
### API
|
|
461
|
-
|
|
462
|
-
`SectionProps`:
|
|
463
|
-
|
|
464
|
-
| Prop | Type | Default | Description |
|
|
465
|
-
| --- | --- | --- | --- |
|
|
466
|
-
| `space` | `Responsive<Space>` | `8` | Block padding (top and bottom), as a step on the space scale. Responsive. Vary it: adjacent sections should not share the same step. Default `8`. |
|
|
467
|
-
| `surface` | `'accent' \| 'surface' \| 'canvas' \| 'sunken' \| 'inverse'` | | Full-bleed band colour. Omit to stay transparent on the canvas. `inverse` and `accent` re-point the ink, line and focus colours so children stay legible. |
|
|
468
|
-
| `divider` | `'top' \| 'bottom' \| 'both'` | | A hairline across the full bleed at the top, bottom or both edges. |
|
|
469
|
-
| `as` | `'div' \| 'section' \| 'article' \| 'aside' \| 'header' \| 'footer'` | | |
|
|
470
|
-
| `hideBelow` | `'sm' \| 'md' \| 'lg' \| 'xl'` | | Hide below this breakpoint (e.g. `md` → hidden on phones, shown from 48em). |
|
|
471
|
-
| `hideAbove` | `'sm' \| 'md' \| 'lg' \| 'xl'` | | Hide from this breakpoint up (e.g. `md` → shown on phones only). |
|
|
472
|
-
|
|
473
|
-
Also accepts every prop of `HTMLAttributes<HTMLElement>`.
|
|
474
|
-
|
|
475
|
-
#### Component tokens
|
|
476
|
-
|
|
477
|
-
Set these in a theme, or on one element, to change this component without touching the rest.
|
|
478
|
-
|
|
479
|
-
| Token | Default and use |
|
|
480
|
-
| --- | --- |
|
|
481
|
-
| `--section-fill` | / --section-on (read-only) the band's fill and ink on inverse/accent |
|
|
482
|
-
| `--section-space-default` | block padding when `space` is unset (default var(--space-8)) |
|
|
483
|
-
| `--section-divider-color` | hairline colour for `divider` (default var(--color-line)) |
|
|
484
|
-
|
|
485
423
|
## References
|
|
486
424
|
|
|
487
425
|
Read a reference when its description matches the task:
|
|
488
426
|
|
|
427
|
+
- [Section](references/section.md): A full-bleed band of vertical space, with an optional surface and rules. Put a Container inside it for width.
|
|
489
428
|
- [Container](references/container.md): Centres content at a readable maximum width, with a fluid gutter outside it.
|
|
490
429
|
- [Box](references/box.md): Padding, a surface and an edge, and nothing else. The escape hatch when no other layout fits.
|
|
491
430
|
- [AppShell](references/app-shell.md): The frame of an app screen. A header, an optional sidebar, the main region, a footer and a phone-only bottom bar.
|
|
@@ -8,6 +8,8 @@ Source: https://kiln.mitchellsutton.com/docs/ui/layout/action-bar
|
|
|
8
8
|
|
|
9
9
|
`ActionBar` is a row of buttons with consistent spacing and alignment: `end` by default, `between` to push a destructive action to the other side, `start` to follow a form's left edge.
|
|
10
10
|
|
|
11
|
+
`sticky` keeps the bar at the bottom of the viewport while a long form scrolls, so save is always in reach.
|
|
12
|
+
|
|
11
13
|
```tsx
|
|
12
14
|
import { ActionBar, Button, Stack, TextField } from '@mitcsutt/kiln-ui'
|
|
13
15
|
|
|
@@ -32,8 +34,6 @@ export function Usage() {
|
|
|
32
34
|
}
|
|
33
35
|
```
|
|
34
36
|
|
|
35
|
-
`sticky` keeps the bar at the bottom of the viewport while a long form scrolls, so save is always in reach.
|
|
36
|
-
|
|
37
37
|
## API
|
|
38
38
|
|
|
39
39
|
`ActionBarProps`:
|
|
@@ -41,7 +41,7 @@ export function Usage() {
|
|
|
41
41
|
| Prop | Type | Default | Description |
|
|
42
42
|
| --- | --- | --- | --- |
|
|
43
43
|
| `align` | `'start' \| 'end' \| 'between'` | `end` | Where the actions sit on the row. Default `end`. |
|
|
44
|
-
| `sticky` | `boolean` |
|
|
44
|
+
| `sticky` | `boolean` | `false` | Pins the bar to the bottom of its scroll container — a canvas surface above a top hairline, at `--z-sticky`. Use inside a scrolling form/dialog body so the primary action stays reachable. |
|
|
45
45
|
| `gap` | `Responsive<Space>` | `3` | Space between actions. Responsive. Default `3`. |
|
|
46
46
|
| `as` | `'div' \| 'footer'` | `div` | Render as `footer` when the bar is the form's own closing landmark. Default `div`. |
|
|
47
47
|
| `hideBelow` | `'sm' \| 'md' \| 'lg' \| 'xl'` | | Hide below this breakpoint (e.g. `md` → hidden on phones, shown from 48em). |
|
|
@@ -8,6 +8,8 @@ Source: https://kiln.mitchellsutton.com/docs/ui/layout/app-shell
|
|
|
8
8
|
|
|
9
9
|
`AppShell` is the outermost frame of an app: landmarks in the right order, a skip link, a sticky header, and a hand-over between a phone's bottom bar and a desktop's sidebar or header nav. These docs are an `AppShell`.
|
|
10
10
|
|
|
11
|
+
The window above scrolls; narrow it below `md` and the header links give way to the bottom bar.
|
|
12
|
+
|
|
11
13
|
```tsx
|
|
12
14
|
import {
|
|
13
15
|
AppShell,
|
|
@@ -86,8 +88,6 @@ export function Usage() {
|
|
|
86
88
|
}
|
|
87
89
|
```
|
|
88
90
|
|
|
89
|
-
The window above scrolls; narrow it below `md` and the header links give way to the bottom bar.
|
|
90
|
-
|
|
91
91
|
## Slots
|
|
92
92
|
|
|
93
93
|
`AppShell.Header`, `AppShell.Sidebar`, `AppShell.Main`, `AppShell.Footer` and `AppShell.BottomBar` place themselves, so their order in JSX doesn't affect the layout. Keep it the same as the reading order anyway: header, sidebar, main, footer, bottom bar.
|
|
@@ -108,7 +108,7 @@ The window above scrolls; narrow it below `md` and the header links give way to
|
|
|
108
108
|
| Prop | Type | Default | Description |
|
|
109
109
|
| --- | --- | --- | --- |
|
|
110
110
|
| `skipLinkLabel` | `string` | `"Skip to content"` | Text of the skip link rendered before everything else. Default "Skip to content". |
|
|
111
|
-
| `navBreakpoint` | `'md' \| 'lg'` |
|
|
111
|
+
| `navBreakpoint` | `'md' \| 'lg'` | `lg` | Where navigation hands over from phone to desktop: from this breakpoint up the `Sidebar` appears and the `BottomBar` is removed, so there is never a width with neither. `md` (48em) or `lg` (64em, default). Pair it with the same value on `BottomNav hideAbove` and header `NavLinks hideBelow`. |
|
|
112
112
|
| `mainId` | `string` | | Id given to `AppShell.Main` (the skip link target). Generated when omitted. |
|
|
113
113
|
|
|
114
114
|
Also accepts every prop of `HTMLAttributes<HTMLDivElement>`.
|
|
@@ -121,6 +121,9 @@ Also accepts every prop of `HTMLAttributes<HTMLDivElement>`.
|
|
|
121
121
|
|
|
122
122
|
Also accepts every prop of `HTMLAttributes<HTMLElement>`.
|
|
123
123
|
|
|
124
|
+
|
|
125
|
+
Accepts every prop of `HTMLAttributes<HTMLElement>`.
|
|
126
|
+
|
|
124
127
|
`AppShellSidebarProps`:
|
|
125
128
|
|
|
126
129
|
| Prop | Type | Default | Description |
|
|
@@ -129,6 +132,10 @@ Also accepts every prop of `HTMLAttributes<HTMLElement>`.
|
|
|
129
132
|
|
|
130
133
|
Also accepts every prop of `HTMLAttributes<HTMLElement>`.
|
|
131
134
|
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
|
|
132
139
|
### Component tokens
|
|
133
140
|
|
|
134
141
|
Set these in a theme, or on one element, to change this component without touching the rest.
|
|
@@ -8,6 +8,8 @@ Source: https://kiln.mitchellsutton.com/docs/ui/layout/aspect-ratio
|
|
|
8
8
|
|
|
9
9
|
`AspectRatio` holds a ratio as its width changes. Its child (an image, a video, an iframe, an SVG) fills it and is cropped with `object-fit: cover`. It has no edge or radius of its own: wrap it in `Media` or a `Card` for those.
|
|
10
10
|
|
|
11
|
+
The same chart framed at 16/9, 4/3 and 1/1.
|
|
12
|
+
|
|
11
13
|
```tsx
|
|
12
14
|
import { AspectRatio, Grid } from '@mitcsutt/kiln-ui'
|
|
13
15
|
|
|
@@ -8,6 +8,8 @@ Source: https://kiln.mitchellsutton.com/docs/ui/layout/box
|
|
|
8
8
|
|
|
9
9
|
`Box` adds padding, a background surface, a border and a radius to its content. Reach for `Stack`, `Inline` or `Grid` to arrange things, and for `Card` when something is a self-contained object. `Box` is for the wells and frames left over.
|
|
10
10
|
|
|
11
|
+
`surface="inverse"` flips the colour roles inside, like an inverse `Section`.
|
|
12
|
+
|
|
11
13
|
```tsx
|
|
12
14
|
import { Box, Stack, Text } from '@mitcsutt/kiln-ui'
|
|
13
15
|
|
|
@@ -28,8 +30,6 @@ export function Usage() {
|
|
|
28
30
|
}
|
|
29
31
|
```
|
|
30
32
|
|
|
31
|
-
`surface="inverse"` flips the colour roles inside, like an inverse `Section`.
|
|
32
|
-
|
|
33
33
|
## API
|
|
34
34
|
|
|
35
35
|
`BoxProps`:
|
|
@@ -39,10 +39,10 @@ export function Usage() {
|
|
|
39
39
|
| `padding` | `Responsive<Space>` | | Padding on every side. Responsive. |
|
|
40
40
|
| `paddingX` | `Responsive<Space>` | | Inline (left/right) padding; overrides `padding` on that axis. Responsive. |
|
|
41
41
|
| `paddingY` | `Responsive<Space>` | | Block (top/bottom) padding; overrides `padding` on that axis. Responsive. |
|
|
42
|
-
| `surface` | `'none' \| 'surface' \| 'canvas' \| 'sunken' \| 'raised' \| 'inverse'` |
|
|
43
|
-
| `border` | `boolean` |
|
|
44
|
-
| `radius` | `'none' \| 'surface' \| 'field' \| 'media'` |
|
|
45
|
-
| `as` | `'div' \| 'section' \| 'article' \| 'aside' \| 'header' \| 'footer' \| 'li' \| 'span'` |
|
|
42
|
+
| `surface` | `'none' \| 'surface' \| 'canvas' \| 'sunken' \| 'raised' \| 'inverse'` | `none` | Background fill. `inverse` also re-points ink and line colours for its children. |
|
|
43
|
+
| `border` | `boolean` | `false` | Hairline border in `--color-line`. One edge treatment per element — a border *or* a fill. |
|
|
44
|
+
| `radius` | `'none' \| 'surface' \| 'field' \| 'media'` | `none` | Corner radius, by role. |
|
|
45
|
+
| `as` | `'div' \| 'section' \| 'article' \| 'aside' \| 'header' \| 'footer' \| 'li' \| 'span'` | `div` | |
|
|
46
46
|
| `hideBelow` | `'sm' \| 'md' \| 'lg' \| 'xl'` | | Hide below this breakpoint (e.g. `md` → hidden on phones, shown from 48em). |
|
|
47
47
|
| `hideAbove` | `'sm' \| 'md' \| 'lg' \| 'xl'` | | Hide from this breakpoint up (e.g. `md` → shown on phones only). |
|
|
48
48
|
|