@noxlovette/material 0.5.1 → 0.6.1
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/bin/material-claude-skill.js +31 -0
- package/claude-skill/material-design/SKILL.md +68 -0
- package/claude-skill/material-design/references/accessibility-checklist.md +29 -0
- package/claude-skill/material-design/references/component-patterns.md +55 -0
- package/claude-skill/material-design/references/motion-guide.md +163 -0
- package/claude-skill/material-design/references/tokens-and-styles.md +68 -0
- package/dist/animation/Shapes.stories.svelte +10 -6
- package/dist/animation/TransitionPatterns.stories.svelte +30 -20
- package/dist/animation/containerTransform.d.ts +4 -2
- package/dist/animation/containerTransform.js +4 -2
- package/dist/animation/enterExit.js +5 -2
- package/dist/animation/skeleton.d.ts +1 -1
- package/dist/animation/skeleton.js +1 -1
- package/dist/components/badge/Badge.mdx +70 -0
- package/dist/components/badge/Badge.stories.svelte +38 -20
- package/dist/components/badge/Badge.svelte +12 -5
- package/dist/components/badge/theme.d.ts +30 -7
- package/dist/components/badge/theme.js +25 -5
- package/dist/components/badge/types.d.ts +18 -4
- package/dist/components/buttons/Button.mdx +85 -0
- package/dist/components/buttons/Button.stories.svelte +62 -27
- package/dist/components/buttons/Button.svelte +29 -25
- package/dist/components/buttons/Button.svelte.d.ts +11 -9
- package/dist/components/buttons/ButtonIcon.mdx +52 -0
- package/dist/components/buttons/ButtonIcon.stories.svelte +72 -48
- package/dist/components/buttons/ButtonIcon.svelte +58 -36
- package/dist/components/buttons/ButtonIcon.svelte.d.ts +9 -7
- package/dist/components/buttons/FAB.mdx +84 -0
- package/dist/components/buttons/FAB.stories.svelte +103 -24
- package/dist/components/buttons/FAB.stories.svelte.d.ts +2 -17
- package/dist/components/buttons/FAB.svelte +353 -29
- package/dist/components/buttons/FAB.svelte.d.ts +11 -6
- package/dist/components/buttons/FABMenu.svelte +27 -8
- package/dist/components/buttons/FABMenu.svelte.d.ts +7 -3
- package/dist/components/buttons/FABMenuItem.svelte +20 -16
- package/dist/components/buttons/FABMenuItem.svelte.d.ts +3 -3
- package/dist/components/buttons/Toggle.stories.svelte +31 -23
- package/dist/components/buttons/Toggle.stories.svelte.d.ts +2 -17
- package/dist/components/buttons/Toggle.svelte +28 -25
- package/dist/components/buttons/Toggle.svelte.d.ts +5 -5
- package/dist/components/buttons/button-group/ButtonGroup.mdx +39 -0
- package/dist/components/buttons/button-group/ButtonGroup.stories.svelte +62 -43
- package/dist/components/buttons/button-group/ButtonGroup.stories.svelte.d.ts +2 -17
- package/dist/components/buttons/button-group/ButtonGroup.svelte +102 -8
- package/dist/components/buttons/button-group/ButtonGroup.svelte.d.ts +6 -7
- package/dist/components/buttons/button-group/theme.d.ts +46 -16
- package/dist/components/buttons/button-group/theme.js +14 -9
- package/dist/components/buttons/button-group/types.d.ts +13 -7
- package/dist/components/buttons/connected/ConnectedButtonGroup.mdx +43 -0
- package/dist/components/buttons/connected/ConnectedButtonGroup.stories.svelte +56 -74
- package/dist/components/buttons/connected/ConnectedButtonGroup.stories.svelte.d.ts +2 -17
- package/dist/components/buttons/connected/ConnectedButtonGroup.svelte +16 -4
- package/dist/components/buttons/connected/ConnectedButtonGroup.svelte.d.ts +4 -4
- package/dist/components/buttons/connected/ConnectedButtonGroupItem.svelte +35 -8
- package/dist/components/buttons/connected/ConnectedButtonGroupItem.svelte.d.ts +2 -3
- package/dist/components/buttons/connected/theme.d.ts +34 -19
- package/dist/components/buttons/connected/theme.js +33 -10
- package/dist/components/buttons/connected/types.d.ts +36 -9
- package/dist/components/buttons/shapeMorph.d.ts +26 -0
- package/dist/components/buttons/shapeMorph.js +142 -0
- package/dist/components/buttons/split-button/SplitButton.mdx +48 -0
- package/dist/components/buttons/split-button/SplitButton.stories.svelte +9 -14
- package/dist/components/buttons/split-button/SplitButton.svelte +66 -49
- package/dist/components/buttons/split-button/SplitButton.svelte.d.ts +6 -11
- package/dist/components/buttons/split-button/theme.d.ts +111 -18
- package/dist/components/buttons/split-button/theme.js +75 -17
- package/dist/components/buttons/split-button/types.d.ts +24 -18
- package/dist/components/buttons/theme.d.ts +423 -231
- package/dist/components/buttons/theme.js +287 -381
- package/dist/components/buttons/types.d.ts +130 -125
- package/dist/components/cards/Card.mdx +44 -0
- package/dist/components/cards/Card.stories.svelte +11 -11
- package/dist/components/cards/theme.js +6 -6
- package/dist/components/chips/Chip.mdx +68 -0
- package/dist/components/chips/Chip.stories.svelte +4 -4
- package/dist/components/chips/theme.d.ts +1 -1
- package/dist/components/chips/theme.js +4 -4
- package/dist/components/containers/action-rail/ActionRail.stories.svelte +1 -0
- package/dist/components/containers/action-rail/theme.d.ts +1 -1
- package/dist/components/containers/action-rail/theme.js +2 -2
- package/dist/components/containers/app/theme.d.ts +1 -1
- package/dist/components/containers/app/theme.js +1 -1
- package/dist/components/containers/bottom-sheet/BottomSheet.mdx +64 -0
- package/dist/components/containers/bottom-sheet/BottomSheet.stories.svelte +108 -12
- package/dist/components/containers/bottom-sheet/BottomSheet.svelte +179 -109
- package/dist/components/containers/bottom-sheet/BottomSheet.svelte.d.ts +10 -5
- package/dist/components/containers/bottom-sheet/index.d.ts +1 -0
- package/dist/components/containers/bottom-sheet/index.js +1 -0
- package/dist/components/containers/bottom-sheet/theme.d.ts +45 -0
- package/dist/components/containers/bottom-sheet/theme.js +42 -0
- package/dist/components/containers/bottom-sheet/types.d.ts +37 -5
- package/dist/components/containers/carousel/Carousel.mdx +80 -0
- package/dist/components/containers/carousel/Carousel.stories.svelte +131 -0
- package/dist/components/containers/carousel/Carousel.stories.svelte.d.ts +4 -0
- package/dist/components/containers/carousel/Carousel.svelte +194 -0
- package/dist/components/containers/carousel/Carousel.svelte.d.ts +25 -0
- package/dist/components/containers/carousel/index.d.ts +3 -0
- package/dist/components/containers/{stack → carousel}/index.js +1 -2
- package/dist/components/containers/carousel/keylines.d.ts +32 -0
- package/dist/components/containers/carousel/keylines.js +88 -0
- package/dist/components/containers/carousel/theme.d.ts +162 -0
- package/dist/components/containers/carousel/theme.js +67 -0
- package/dist/components/containers/carousel/types.d.ts +52 -0
- package/dist/components/containers/context-menu/ContextMenu.stories.svelte +1 -0
- package/dist/components/containers/context-menu/ContextMenu.svelte +2 -2
- package/dist/components/containers/context-menu/ContextMenu.svelte.d.ts +1 -1
- package/dist/components/containers/context-menu/theme.d.ts +1 -1
- package/dist/components/containers/context-menu/theme.js +11 -11
- package/dist/components/containers/dialogue/Dialogue.mdx +65 -0
- package/dist/components/containers/dialogue/Dialogue.stories.svelte +4 -4
- package/dist/components/containers/dialogue/Dialogue.svelte +2 -2
- package/dist/components/containers/dialogue/theme.d.ts +1 -1
- package/dist/components/containers/dialogue/theme.js +4 -4
- package/dist/components/containers/dialogue/types.d.ts +1 -1
- package/dist/components/containers/divider/Divider.stories.svelte +2 -1
- package/dist/components/containers/divider/Divider.svelte +2 -2
- package/dist/components/containers/divider/theme.d.ts +7 -7
- package/dist/components/containers/divider/theme.js +3 -3
- package/dist/components/containers/index.d.ts +1 -1
- package/dist/components/containers/index.js +1 -1
- package/dist/components/containers/link-preview/theme.d.ts +1 -1
- package/dist/components/containers/link-preview/theme.js +3 -3
- package/dist/components/containers/list/List.svelte +18 -0
- package/dist/components/containers/list/List.svelte.d.ts +4 -0
- package/dist/components/containers/list/ListItem.mdx +100 -0
- package/dist/components/containers/list/ListItem.stories.svelte +177 -42
- package/dist/components/containers/list/ListItem.stories.svelte.d.ts +2 -17
- package/dist/components/containers/list/ListItem.svelte +92 -37
- package/dist/components/containers/list/ListItem.svelte.d.ts +1 -1
- package/dist/components/containers/list/context.d.ts +6 -0
- package/dist/components/containers/list/context.js +4 -0
- package/dist/components/containers/list/index.d.ts +1 -0
- package/dist/components/containers/list/index.js +1 -0
- package/dist/components/containers/list/theme.d.ts +487 -12
- package/dist/components/containers/list/theme.js +141 -14
- package/dist/components/containers/list/types.d.ts +39 -5
- package/dist/components/containers/menu/Menu.mdx +52 -0
- package/dist/components/containers/menu/Menu.stories.svelte +14 -14
- package/dist/components/containers/menu/Menu.svelte +2 -2
- package/dist/components/containers/menu/MenuGroup.svelte +1 -1
- package/dist/components/containers/menu/MenuGroup.svelte.d.ts +1 -1
- package/dist/components/containers/menu/MenuSub.svelte +1 -1
- package/dist/components/containers/menu/menu-item/MenuItem.svelte +1 -1
- package/dist/components/containers/menu/theme.d.ts +1 -1
- package/dist/components/containers/menu/theme.js +9 -9
- package/dist/components/containers/pane/DraggablePane.stories.svelte +4 -3
- package/dist/components/containers/pane/DraggablePane.svelte +2 -2
- package/dist/components/containers/pane/Pane.stories.svelte +11 -10
- package/dist/components/containers/pane/Pane.svelte +24 -2
- package/dist/components/containers/pane/PaneGrid.stories.svelte +19 -18
- package/dist/components/containers/pane/PaneGrid.svelte +3 -2
- package/dist/components/containers/pane/PaneGrid.svelte.d.ts +2 -1
- package/dist/components/containers/pane/PaneHandle.svelte +48 -2
- package/dist/components/containers/pane/PaneHandle.svelte.d.ts +4 -0
- package/dist/components/containers/pane/resizeStore.svelte.d.ts +10 -1
- package/dist/components/containers/pane/resizeStore.svelte.js +13 -2
- package/dist/components/containers/pane/theme.d.ts +1 -1
- package/dist/components/containers/pane/theme.js +131 -47
- package/dist/components/containers/pane/types.d.ts +3 -2
- package/dist/components/containers/popover/Popover.mdx +45 -0
- package/dist/components/containers/popover/Popover.stories.svelte +1 -1
- package/dist/components/containers/popover/Popover.svelte +1 -1
- package/dist/components/containers/popover/theme.d.ts +1 -1
- package/dist/components/containers/popover/theme.js +4 -4
- package/dist/components/containers/scroll-area/theme.js +3 -3
- package/dist/components/containers/side-sheet/SideSheet.mdx +71 -0
- package/dist/components/containers/side-sheet/SideSheet.stories.svelte +113 -17
- package/dist/components/containers/side-sheet/SideSheet.svelte +113 -66
- package/dist/components/containers/side-sheet/SideSheet.svelte.d.ts +8 -7
- package/dist/components/containers/side-sheet/index.d.ts +1 -0
- package/dist/components/containers/side-sheet/index.js +1 -0
- package/dist/components/containers/side-sheet/theme.d.ts +108 -0
- package/dist/components/containers/side-sheet/theme.js +72 -0
- package/dist/components/containers/side-sheet/types.d.ts +35 -7
- package/dist/components/date/DateField.stories.svelte +4 -3
- package/dist/components/date/DateField.svelte +11 -2
- package/dist/components/date/DateRangeField.stories.svelte +4 -3
- package/dist/components/date/DateRangeField.svelte +12 -3
- package/dist/components/date/theme.d.ts +8 -8
- package/dist/components/date/theme.js +32 -32
- package/dist/components/forms/checkbox/Checkbox.mdx +35 -0
- package/dist/components/forms/checkbox/Checkbox.stories.svelte +2 -2
- package/dist/components/forms/checkbox/Checkbox.svelte +1 -1
- package/dist/components/forms/checkbox/theme.d.ts +1 -1
- package/dist/components/forms/checkbox/theme.js +4 -4
- package/dist/components/forms/command/Command.stories.svelte +1 -0
- package/dist/components/forms/command/theme.d.ts +1 -1
- package/dist/components/forms/command/theme.js +10 -10
- package/dist/components/forms/pin/theme.d.ts +1 -1
- package/dist/components/forms/pin/theme.js +5 -5
- package/dist/components/forms/radio-group/RadioGroup.svelte +1 -1
- package/dist/components/forms/radio-group/theme.d.ts +1 -1
- package/dist/components/forms/radio-group/theme.js +6 -6
- package/dist/components/forms/search/Search.mdx +38 -0
- package/dist/components/forms/search/Search.stories.svelte +19 -9
- package/dist/components/forms/search/Search.svelte +40 -17
- package/dist/components/forms/search/Search.svelte.d.ts +2 -2
- package/dist/components/forms/search/theme.d.ts +46 -13
- package/dist/components/forms/search/theme.js +14 -9
- package/dist/components/forms/search/types.d.ts +18 -12
- package/dist/components/forms/select/Select.mdx +53 -0
- package/dist/components/forms/select/Select.stories.svelte +4 -4
- package/dist/components/forms/select/Select.svelte +12 -4
- package/dist/components/forms/select/SelectItem.svelte +1 -1
- package/dist/components/forms/select/theme.d.ts +1 -1
- package/dist/components/forms/select/theme.js +14 -14
- package/dist/components/forms/slider/Slider.mdx +85 -0
- package/dist/components/forms/slider/Slider.stories.svelte +7 -7
- package/dist/components/forms/slider/Slider.svelte +46 -28
- package/dist/components/forms/slider/theme.d.ts +15 -1
- package/dist/components/forms/slider/theme.js +29 -18
- package/dist/components/forms/slider/types.d.ts +3 -2
- package/dist/components/forms/switch/Switch.mdx +38 -0
- package/dist/components/forms/switch/Switch.stories.svelte +3 -3
- package/dist/components/forms/switch/theme.d.ts +1 -1
- package/dist/components/forms/switch/theme.js +7 -7
- package/dist/components/forms/textfield/Textfield.mdx +53 -0
- package/dist/components/forms/textfield/Textfield.stories.svelte +6 -6
- package/dist/components/forms/textfield/Textfield.svelte +1 -0
- package/dist/components/forms/textfield/theme.d.ts +1 -1
- package/dist/components/forms/textfield/theme.js +20 -20
- package/dist/components/forms/toggle-group/theme.d.ts +1 -1
- package/dist/components/forms/toggle-group/theme.js +3 -3
- package/dist/components/forms/tooltip/Tooltip.stories.svelte +1 -0
- package/dist/components/forms/tooltip/theme.d.ts +1 -1
- package/dist/components/forms/tooltip/theme.js +4 -4
- package/dist/components/misc/Avatar.stories.svelte +5 -4
- package/dist/components/misc/ThemeSettings.svelte +9 -9
- package/dist/components/misc/ThemeSwitcher.svelte +3 -3
- package/dist/components/misc/theme.js +5 -5
- package/dist/components/nav/appbar/AppBar.mdx +71 -0
- package/dist/components/nav/appbar/AppBar.stories.svelte +93 -3
- package/dist/components/nav/appbar/AppBar.stories.svelte.d.ts +2 -17
- package/dist/components/nav/appbar/AppBar.svelte +90 -37
- package/dist/components/nav/appbar/AppBar.svelte.d.ts +9 -2
- package/dist/components/nav/appbar/theme.d.ts +86 -19
- package/dist/components/nav/appbar/theme.js +160 -24
- package/dist/components/nav/appbar/types.d.ts +46 -9
- package/dist/components/nav/breadcrumb/Breadcrumb.stories.svelte +1 -0
- package/dist/components/nav/breadcrumb/theme.d.ts +1 -1
- package/dist/components/nav/breadcrumb/theme.js +6 -6
- package/dist/components/nav/navbar/Navbar.mdx +38 -0
- package/dist/components/nav/navbar/Navbar.svelte +1 -1
- package/dist/components/nav/navbar/NavbarItem.svelte +12 -9
- package/dist/components/nav/navbar/theme.d.ts +3 -3
- package/dist/components/nav/navbar/theme.js +7 -7
- package/dist/components/nav/rail/Rail.mdx +73 -0
- package/dist/components/nav/rail/Rail.stories.svelte +3 -7
- package/dist/components/nav/rail/Rail.svelte +5 -2
- package/dist/components/nav/rail/RailItem.svelte +12 -9
- package/dist/components/nav/rail/theme.d.ts +1 -1
- package/dist/components/nav/rail/theme.js +14 -14
- package/dist/components/nav/rail/types.d.ts +8 -1
- package/dist/components/nav/tabs/Tabs.mdx +62 -0
- package/dist/components/nav/tabs/Tabs.stories.svelte +1 -1
- package/dist/components/nav/tabs/theme.d.ts +1 -1
- package/dist/components/nav/tabs/theme.js +5 -5
- package/dist/components/pill/Pill.mdx +32 -0
- package/dist/components/pill/Pill.stories.svelte +1 -1
- package/dist/components/pill/theme.d.ts +2 -2
- package/dist/components/pill/theme.js +2 -2
- package/dist/components/progress/LinearProgress.svelte +2 -2
- package/dist/components/progress/Progress.mdx +50 -0
- package/dist/components/progress/Progress.stories.svelte +6 -6
- package/dist/components/snackbar/Snackbar.mdx +52 -0
- package/dist/components/snackbar/Snackbar.stories.svelte +5 -5
- package/dist/components/snackbar/Snackbar.svelte +1 -1
- package/dist/components/snackbar/theme.d.ts +4 -4
- package/dist/components/snackbar/theme.js +5 -5
- package/dist/components/table/Table.stories.svelte +1 -0
- package/dist/components/table/TableHeader.svelte +1 -1
- package/dist/components/table/theme.d.ts +1 -1
- package/dist/components/table/theme.js +4 -4
- package/dist/components/time/TimeField.stories.svelte +3 -2
- package/dist/components/time/TimeField.svelte +2 -2
- package/dist/components/time/TimepickerInput.svelte +1 -1
- package/dist/components/time/theme.d.ts +1 -1
- package/dist/components/time/theme.js +6 -6
- package/dist/components/toolbar/Toolbar.stories.svelte +1 -0
- package/dist/components/toolbar/Toolbar.svelte +1 -1
- package/dist/components/toolbar/Toolbar.svelte.d.ts +1 -1
- package/dist/components/toolbar/theme.d.ts +1 -1
- package/dist/components/toolbar/theme.js +15 -15
- package/dist/components/typography/Typography.mdx +67 -0
- package/dist/components/typography/body/Body.stories.svelte +2 -1
- package/dist/components/typography/body/theme.d.ts +16 -13
- package/dist/components/typography/body/theme.js +20 -5
- package/dist/components/typography/body/types.d.ts +2 -1
- package/dist/components/typography/display/Display.stories.svelte +2 -1
- package/dist/components/typography/display/theme.d.ts +16 -13
- package/dist/components/typography/display/theme.js +20 -5
- package/dist/components/typography/display/types.d.ts +2 -1
- package/dist/components/typography/headline/Headline.stories.svelte +2 -1
- package/dist/components/typography/headline/theme.d.ts +16 -13
- package/dist/components/typography/headline/theme.js +20 -5
- package/dist/components/typography/headline/types.d.ts +2 -1
- package/dist/components/typography/kbd/Kbd.stories.svelte +2 -1
- package/dist/components/typography/kbd/theme.d.ts +5 -5
- package/dist/components/typography/kbd/theme.js +3 -3
- package/dist/components/typography/label/Label.stories.svelte +2 -1
- package/dist/components/typography/label/theme.d.ts +15 -12
- package/dist/components/typography/label/theme.js +20 -5
- package/dist/components/typography/label/types.d.ts +2 -1
- package/dist/components/typography/title/Title.stories.svelte +2 -1
- package/dist/components/typography/title/theme.d.ts +16 -13
- package/dist/components/typography/title/theme.js +20 -5
- package/dist/components/typography/title/types.d.ts +2 -1
- package/dist/index.css +2 -0
- package/dist/styles/component.css +78 -175
- package/dist/styles/elevation.css +9 -0
- package/dist/styles/layers.css +33 -0
- package/dist/styles/spacing.css +29 -0
- package/dist/styles/typescale.css +635 -20
- package/dist/utils/Layer.svelte +1 -1
- package/dist/utils/icon/Icon.svelte +8 -6
- package/dist/utils/icon/theme.d.ts +1 -1
- package/dist/utils/icon/theme.js +1 -1
- package/dist/utils/tv.d.ts +6 -0
- package/dist/utils/tv.js +12 -0
- package/package.json +19 -15
- package/dist/components/containers/stack/HStack.svelte +0 -23
- package/dist/components/containers/stack/HStack.svelte.d.ts +0 -5
- package/dist/components/containers/stack/VStack.svelte +0 -23
- package/dist/components/containers/stack/VStack.svelte.d.ts +0 -5
- package/dist/components/containers/stack/index.d.ts +0 -4
- package/dist/components/containers/stack/theme.d.ts +0 -66
- package/dist/components/containers/stack/theme.js +0 -26
- package/dist/components/containers/stack/types.d.ts +0 -12
- /package/dist/components/containers/{stack → carousel}/types.js +0 -0
|
@@ -1,27 +1,154 @@
|
|
|
1
|
-
import { tv } from '
|
|
2
|
-
|
|
1
|
+
import { tv } from '../../../utils/tv.js';
|
|
2
|
+
/*
|
|
3
|
+
M3 Expressive lists (https://m3.material.io/components/lists/specs).
|
|
4
|
+
|
|
5
|
+
Item shape: every item reads its corners from `--li-top`/`--li-bottom`, falling back to its own
|
|
6
|
+
state shape `--li-shape` (4dp at rest, 12dp hovered, 16dp focused/pressed/selected). A segmented
|
|
7
|
+
`List` sets `--li-top`/`--li-bottom` to 16dp on its first/last child, so the list's outer
|
|
8
|
+
corners stay 16dp while the inner ones morph. Custom properties inherit, so this reaches an item
|
|
9
|
+
through its `<li>`; each `<ul>` resets both so nested lists start clean.
|
|
10
|
+
*/
|
|
11
|
+
export const list = tv({
|
|
12
|
+
base: 'flex w-full flex-col [--li-bottom:initial] [--li-top:initial]',
|
|
13
|
+
variants: {
|
|
14
|
+
variant: {
|
|
15
|
+
standard: '',
|
|
16
|
+
// 2dp between segments; outer corners 16dp (md.comp.list.container.shape).
|
|
17
|
+
segmented: 'gap-spacing-25 [&>:first-child]:[--li-top:1rem] [&>:last-child]:[--li-bottom:1rem]'
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
defaultVariants: { variant: 'standard' }
|
|
21
|
+
});
|
|
22
|
+
export const listItem = tv({
|
|
3
23
|
slots: {
|
|
4
|
-
base:
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
24
|
+
base: [
|
|
25
|
+
'relative flex w-full min-w-spacing-0 gap-spacing-150 ps-spacing-200 pe-spacing-200 pt-spacing-125 pb-spacing-125 text-start',
|
|
26
|
+
'[--li-shape:0.25rem] rounded-t-[var(--li-top,var(--li-shape))] rounded-b-[var(--li-bottom,var(--li-shape))]',
|
|
27
|
+
'transition-[border-radius,background-color,color] md-sys-motion-fast-spatial',
|
|
28
|
+
'text-md-sys-color-on-surface-variant'
|
|
29
|
+
],
|
|
30
|
+
leading: 'flex shrink-0 items-center text-md-sys-color-on-surface-variant',
|
|
31
|
+
body: 'flex min-w-spacing-0 flex-1 flex-col justify-center',
|
|
32
|
+
overline: 'md-sys-typescale-label-small line-clamp-1 text-md-sys-color-on-surface-variant',
|
|
33
|
+
headline: 'md-sys-typescale-body-large line-clamp-1 text-md-sys-color-on-surface',
|
|
34
|
+
supporting: 'md-sys-typescale-body-medium line-clamp-2 text-md-sys-color-on-surface-variant',
|
|
35
|
+
trailing: 'relative flex shrink-0 items-center gap-spacing-150 overflow-visible text-md-sys-color-on-surface-variant',
|
|
36
|
+
trailingText: 'md-sys-typescale-label-small text-md-sys-color-on-surface-variant',
|
|
37
|
+
expandIcon: 'grid size-spacing-400 place-items-center rounded-full text-md-sys-color-on-surface transition-[background-color,rotate] md-sys-motion-fast-spatial',
|
|
38
|
+
group: 'flex flex-col',
|
|
39
|
+
region: 'grid transition-[grid-template-rows] md-sys-motion-spatial',
|
|
40
|
+
regionInner: 'min-h-spacing-0 overflow-hidden',
|
|
41
|
+
nested: 'flex flex-col [--li-top:initial] [--li-bottom:initial]'
|
|
11
42
|
},
|
|
12
43
|
variants: {
|
|
44
|
+
// md.comp.list.list-item.{one,two,three}-line.container.height: minimums, so larger text grows
|
|
45
|
+
// the item instead of clipping. From 88dp up, leading/text/trailing align to the top.
|
|
13
46
|
lines: {
|
|
14
|
-
1: 'h-
|
|
15
|
-
2: 'h-
|
|
16
|
-
3: 'h-22'
|
|
47
|
+
1: { base: 'min-h-spacing-700 items-center' },
|
|
48
|
+
2: { base: 'min-h-spacing-900 items-center' },
|
|
49
|
+
3: { base: 'min-h-22 items-start', leading: 'items-start', trailing: 'items-start' }
|
|
50
|
+
},
|
|
51
|
+
variant: {
|
|
52
|
+
standard: { base: 'bg-md-sys-color-surface', nested: '' },
|
|
53
|
+
/* The segmented token resolves to `surface`, but the spec's own figures draw segments one
|
|
54
|
+
tone up so they read against the page; surface-container matches the figures. */
|
|
55
|
+
segmented: {
|
|
56
|
+
base: 'bg-md-sys-color-surface-container',
|
|
57
|
+
nested: 'gap-spacing-25 pt-spacing-25'
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
interactive: {
|
|
61
|
+
true: {
|
|
62
|
+
base: [
|
|
63
|
+
'cursor-pointer outline-none',
|
|
64
|
+
'hover:[--li-shape:0.75rem]',
|
|
65
|
+
'focus-visible:[--li-shape:1rem]',
|
|
66
|
+
'focus-visible:outline-3 focus-visible:-outline-offset-3 focus-visible:outline-md-sys-color-secondary',
|
|
67
|
+
'active:[--li-shape:1rem]'
|
|
68
|
+
]
|
|
69
|
+
},
|
|
70
|
+
false: ''
|
|
17
71
|
},
|
|
18
72
|
selected: {
|
|
19
73
|
true: {
|
|
20
|
-
base: '
|
|
74
|
+
base: 'bg-md-sys-color-secondary-container text-md-sys-color-on-secondary-container [--li-shape:1rem] hover:[--li-shape:1rem]',
|
|
75
|
+
leading: 'text-md-sys-color-on-secondary-container',
|
|
76
|
+
overline: 'text-md-sys-color-on-secondary-container',
|
|
21
77
|
headline: 'text-md-sys-color-on-secondary-container',
|
|
22
|
-
|
|
78
|
+
supporting: 'text-md-sys-color-on-secondary-container',
|
|
79
|
+
trailing: 'text-md-sys-color-on-secondary-container',
|
|
80
|
+
trailingText: 'text-md-sys-color-on-secondary-container'
|
|
81
|
+
},
|
|
82
|
+
false: ''
|
|
83
|
+
},
|
|
84
|
+
disabled: {
|
|
85
|
+
true: {
|
|
86
|
+
base: 'pointer-events-none cursor-default',
|
|
87
|
+
leading: 'text-md-sys-color-on-surface opacity-38',
|
|
88
|
+
overline: 'text-md-sys-color-on-surface/38',
|
|
89
|
+
headline: 'text-md-sys-color-on-surface/38',
|
|
90
|
+
supporting: 'text-md-sys-color-on-surface/38',
|
|
91
|
+
trailing: 'text-md-sys-color-on-surface opacity-38',
|
|
92
|
+
trailingText: 'text-md-sys-color-on-surface/38'
|
|
23
93
|
},
|
|
24
94
|
false: ''
|
|
95
|
+
},
|
|
96
|
+
expanded: {
|
|
97
|
+
true: {
|
|
98
|
+
// The expanded group is one 16dp container: header on top, nested items below.
|
|
99
|
+
base: '[--li-top:1rem] [--li-bottom:var(--li-shape)]',
|
|
100
|
+
expandIcon: 'rotate-180 bg-md-sys-color-surface-container',
|
|
101
|
+
region: 'grid-rows-[1fr]',
|
|
102
|
+
nested: '[&>:last-child]:[--li-bottom:1rem]'
|
|
103
|
+
},
|
|
104
|
+
false: {
|
|
105
|
+
expandIcon: 'bg-md-sys-color-surface',
|
|
106
|
+
region: 'grid-rows-[0fr]'
|
|
107
|
+
}
|
|
25
108
|
}
|
|
109
|
+
},
|
|
110
|
+
compoundVariants: [
|
|
111
|
+
{
|
|
112
|
+
selected: true,
|
|
113
|
+
disabled: true,
|
|
114
|
+
class: { base: 'bg-md-sys-color-on-surface/12 text-md-sys-color-on-surface/38' }
|
|
115
|
+
}
|
|
116
|
+
],
|
|
117
|
+
defaultVariants: {
|
|
118
|
+
lines: 1,
|
|
119
|
+
variant: 'standard',
|
|
120
|
+
interactive: false,
|
|
121
|
+
selected: false,
|
|
122
|
+
disabled: false
|
|
26
123
|
}
|
|
27
124
|
});
|
|
125
|
+
/** @deprecated Misspelled; use `listItem`. */
|
|
126
|
+
export const listiem = listItem;
|
|
127
|
+
/**
|
|
128
|
+
* Sizes and shapes for a list item's leading media, per the M3 list spec. Apply it to whatever you
|
|
129
|
+
* render in `leading`, so the item keeps spec padding and alignment:
|
|
130
|
+
*
|
|
131
|
+
* ```svelte
|
|
132
|
+
* {#snippet leading()}
|
|
133
|
+
* <img src={cover} alt="" class={listMedia({ kind: 'image' })} />
|
|
134
|
+
* {/snippet}
|
|
135
|
+
* ```
|
|
136
|
+
*
|
|
137
|
+
* - `icon`: 20dp. Prefer `<Icon size="sm">`, which is already 20dp.
|
|
138
|
+
* - `avatar`: 40dp circle, e.g. `<Avatar class={listMedia({ kind: 'avatar' })} />`.
|
|
139
|
+
* - `image`: 56dp square, 8dp corners.
|
|
140
|
+
* - `video`: 100×56dp, 8dp corners. `videoLarge`: 114×64dp.
|
|
141
|
+
*/
|
|
142
|
+
export const listMedia = tv({
|
|
143
|
+
base: 'shrink-0',
|
|
144
|
+
variants: {
|
|
145
|
+
kind: {
|
|
146
|
+
icon: 'size-spacing-250',
|
|
147
|
+
avatar: 'size-spacing-500 rounded-full',
|
|
148
|
+
image: 'size-spacing-700 rounded-lg object-cover',
|
|
149
|
+
video: 'h-spacing-700 w-25 rounded-lg object-cover',
|
|
150
|
+
videoLarge: 'h-spacing-800 w-28.5 rounded-lg object-cover'
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
defaultVariants: { kind: 'icon' }
|
|
154
|
+
});
|
|
@@ -1,24 +1,47 @@
|
|
|
1
1
|
import type { ButtonAttrs, DivAttrs, NotButton } from '../../../utils/index.js';
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
|
-
import type { HTMLAnchorAttributes, HTMLLabelAttributes } from 'svelte/elements';
|
|
3
|
+
import type { HTMLAnchorAttributes, HTMLAttributes, HTMLLabelAttributes } from 'svelte/elements';
|
|
4
4
|
export type ActionProps = DivAttrs | ButtonAttrs | ({
|
|
5
5
|
label: true;
|
|
6
6
|
} & NotButton<HTMLLabelAttributes>) | ({
|
|
7
7
|
href: string | null;
|
|
8
8
|
} & NotButton<HTMLAnchorAttributes>);
|
|
9
|
+
/** Props for the `List` container. */
|
|
10
|
+
export type ListProps = HTMLAttributes<HTMLUListElement> & {
|
|
11
|
+
/**
|
|
12
|
+
* `standard`: items sit on the page. `segmented`: each item is its own segment, 2dp apart, with
|
|
13
|
+
* 16dp outer corners. A visual choice only; it doesn't change behavior.
|
|
14
|
+
* @default 'standard'
|
|
15
|
+
*/
|
|
16
|
+
variant?: 'standard' | 'segmented';
|
|
17
|
+
children?: Snippet;
|
|
18
|
+
};
|
|
9
19
|
/**
|
|
10
20
|
* Props for the ListItem component.
|
|
11
21
|
* Lists are continuous, vertical indexes of text or images.
|
|
12
22
|
*/
|
|
13
23
|
export type ListitemProps = {
|
|
14
24
|
/**
|
|
15
|
-
*
|
|
25
|
+
* The leading slot: must be narrower than the text and hold one element. Allowed content, per
|
|
26
|
+
* the M3 list spec (size it with `listMedia`):
|
|
27
|
+
* - **Icon**: 20dp (`<Icon size="sm">`).
|
|
28
|
+
* - **Avatar**: 40dp circle (`listMedia({ kind: 'avatar' })`).
|
|
29
|
+
* - **Image**: 56×56dp, 8dp corners (`listMedia({ kind: 'image' })`).
|
|
30
|
+
* - **Video thumbnail**: 100×56dp or 114×64dp, 8dp corners (`kind: 'video' | 'videoLarge'`).
|
|
31
|
+
* - **Selection control**: a checkbox, radio button or switch. Use `label` so the whole item
|
|
32
|
+
* toggles it, and don't add a second selection control in `trailing`.
|
|
33
|
+
*
|
|
34
|
+
* Decorative media gets `alt=""`; the headline is the item's accessible name.
|
|
16
35
|
*/
|
|
17
36
|
leading?: Snippet;
|
|
18
37
|
/**
|
|
19
|
-
* Whether the
|
|
38
|
+
* Whether the item is selected: secondary-container fill and a 16dp shape. Exposed to
|
|
39
|
+
* assistive tech as `aria-selected` (with `role="option"`), `aria-current="page"` (links) or
|
|
40
|
+
* `aria-pressed` (buttons).
|
|
20
41
|
*/
|
|
21
42
|
selected?: boolean;
|
|
43
|
+
/** Disables the item: 38% content, no interaction. */
|
|
44
|
+
disabled?: boolean;
|
|
22
45
|
/**
|
|
23
46
|
* Optional overline text displayed above the headline.
|
|
24
47
|
*/
|
|
@@ -32,9 +55,12 @@ export type ListitemProps = {
|
|
|
32
55
|
*/
|
|
33
56
|
supporting?: string | null;
|
|
34
57
|
/**
|
|
35
|
-
*
|
|
58
|
+
* The trailing slot: an icon (20dp, `<Icon size="sm">`), an icon button, or a selection control
|
|
59
|
+
* (checkbox, radio, switch). Interactive content keeps a 48dp target.
|
|
36
60
|
*/
|
|
37
61
|
trailing?: Snippet;
|
|
62
|
+
/** Short trailing text, e.g. a count, time or shortcut ("100+", "⌘C"). */
|
|
63
|
+
trailingText?: string;
|
|
38
64
|
/**
|
|
39
65
|
* Badge to display in the trailing area.
|
|
40
66
|
* - `true`: renders a small dot badge (notification indicator).
|
|
@@ -42,10 +68,18 @@ export type ListitemProps = {
|
|
|
42
68
|
*/
|
|
43
69
|
badge?: number | boolean;
|
|
44
70
|
/**
|
|
45
|
-
* The number of text lines to reserve space for.
|
|
71
|
+
* The number of text lines to reserve space for (56, 72 or 88dp minimum height). At 3 lines,
|
|
72
|
+
* content aligns to the top.
|
|
46
73
|
* If not provided, it's calculated based on presence of overline and supporting text.
|
|
47
74
|
*/
|
|
48
75
|
lines?: 1 | 2 | 3;
|
|
76
|
+
/**
|
|
77
|
+
* Nested items. Giving `children` makes this an expandable item: the item becomes a button
|
|
78
|
+
* that toggles them, with a trailing expand indicator.
|
|
79
|
+
*/
|
|
80
|
+
children?: Snippet;
|
|
81
|
+
/** Whether the nested `children` are shown. Bindable. */
|
|
82
|
+
expanded?: boolean;
|
|
49
83
|
/**
|
|
50
84
|
* If true, the component will not wrap its content in an `<li>` element.
|
|
51
85
|
* Useful for when the parent already provides the list item container.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Meta, Title, Subtitle, Canvas, Controls } from '@storybook/addon-docs/blocks';
|
|
2
|
+
import * as MenuStories from './Menu.stories.svelte';
|
|
3
|
+
|
|
4
|
+
<Meta of={MenuStories} />
|
|
5
|
+
|
|
6
|
+
<Title />
|
|
7
|
+
|
|
8
|
+
<Subtitle>Menus show a list of choices on a temporary surface.</Subtitle>
|
|
9
|
+
|
|
10
|
+
[M3 spec](https://m3.material.io/components/menus/specs) ·
|
|
11
|
+
`import { Menu, MenuItem } from '@noxlovette/material';`
|
|
12
|
+
|
|
13
|
+
<Canvas of={MenuStories.Playground} />
|
|
14
|
+
|
|
15
|
+
<Controls of={MenuStories.Playground} />
|
|
16
|
+
|
|
17
|
+
## Composition
|
|
18
|
+
|
|
19
|
+
`Menu` handles only the open state and where the panel floats. Its children are the rows:
|
|
20
|
+
|
|
21
|
+
- `MenuItem`: a single action, with optional icon, supporting text and `selected` check.
|
|
22
|
+
- `MenuGroup`: a labelled set of items.
|
|
23
|
+
- `MenuCheckboxItem`, `MenuRadioGroup`/`MenuRadioItem`: checkable items.
|
|
24
|
+
- `MenuSub`: a nested submenu.
|
|
25
|
+
- `Divider`: a separator.
|
|
26
|
+
|
|
27
|
+
```svelte
|
|
28
|
+
<Menu label="Options" align="end">
|
|
29
|
+
<MenuItem iconProps={{ name: 'edit' }} onclick={edit}>Edit</MenuItem>
|
|
30
|
+
<MenuItem iconProps={{ name: 'delete' }} onclick={remove}>Delete</MenuItem>
|
|
31
|
+
</Menu>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
<Canvas of={MenuStories.WithGroups} />
|
|
35
|
+
|
|
36
|
+
<Canvas of={MenuStories.WithSubmenu} />
|
|
37
|
+
|
|
38
|
+
## Trigger
|
|
39
|
+
|
|
40
|
+
Without a `trigger` snippet, `Menu` renders a filled `Button` labelled `label`. Pass `trigger` to
|
|
41
|
+
use your own element, such as an icon button, and spread the props it receives onto it.
|
|
42
|
+
|
|
43
|
+
<Canvas of={MenuStories.WithCustomTrigger} />
|
|
44
|
+
|
|
45
|
+
For a right-click menu, use `ContextMenu`.
|
|
46
|
+
|
|
47
|
+
## Accessibility
|
|
48
|
+
|
|
49
|
+
- **Keyboard.** Arrow keys move through items, Enter and Space activate, and Escape closes and
|
|
50
|
+
returns focus to the trigger.
|
|
51
|
+
- **Selection** shows a check icon as well as a color, so it doesn't rely on color alone.
|
|
52
|
+
- **Disabled items** are skipped by keyboard navigation.
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
|
|
41
41
|
<Story name="Playground">
|
|
42
42
|
{#snippet template(args)}
|
|
43
|
-
<div class="p-
|
|
43
|
+
<div class="p-spacing-300">
|
|
44
44
|
<Menu label={args.label} align={args.align}>
|
|
45
45
|
<MenuItem iconProps={{ name: 'content_cut' }}>Cut</MenuItem>
|
|
46
46
|
<MenuItem iconProps={{ name: 'content_copy' }}>Copy</MenuItem>
|
|
@@ -51,21 +51,21 @@
|
|
|
51
51
|
</Story>
|
|
52
52
|
|
|
53
53
|
<Story name="With Custom Trigger" asChild>
|
|
54
|
-
<div class="p-
|
|
54
|
+
<div class="p-spacing-300">
|
|
55
55
|
<Menu align="end">
|
|
56
56
|
{#snippet trigger(triggerProps)}
|
|
57
|
-
<ButtonIcon iconProps={{ name: 'more_vert' }} variant="
|
|
57
|
+
<ButtonIcon iconProps={{ name: 'more_vert' }} variant="standard" {...triggerProps} />
|
|
58
58
|
{/snippet}
|
|
59
59
|
<MenuItem iconProps={{ name: 'edit' }}>Edit</MenuItem>
|
|
60
60
|
<MenuItem iconProps={{ name: 'archive' }} helper="Move to archive folder">Archive</MenuItem>
|
|
61
|
-
<Divider class="my-
|
|
61
|
+
<Divider class="my-spacing-100" />
|
|
62
62
|
<MenuItem iconProps={{ name: 'delete' }} disabled>Delete</MenuItem>
|
|
63
63
|
</Menu>
|
|
64
64
|
</div>
|
|
65
65
|
</Story>
|
|
66
66
|
|
|
67
67
|
<Story name="With Selected Item" asChild>
|
|
68
|
-
<div class="p-
|
|
68
|
+
<div class="p-spacing-300">
|
|
69
69
|
<Menu label="Sort by">
|
|
70
70
|
<MenuItem selected>Name</MenuItem>
|
|
71
71
|
<MenuItem>Date modified</MenuItem>
|
|
@@ -75,13 +75,13 @@
|
|
|
75
75
|
</Story>
|
|
76
76
|
|
|
77
77
|
<Story name="With Groups" asChild>
|
|
78
|
-
<div class="p-
|
|
78
|
+
<div class="p-spacing-300">
|
|
79
79
|
<Menu label="Sort by">
|
|
80
80
|
<MenuGroup heading="Name">
|
|
81
81
|
<MenuItem>A to Z</MenuItem>
|
|
82
82
|
<MenuItem>Z to A</MenuItem>
|
|
83
83
|
</MenuGroup>
|
|
84
|
-
<Divider class="my-
|
|
84
|
+
<Divider class="my-spacing-50" />
|
|
85
85
|
<MenuGroup heading="Date">
|
|
86
86
|
<MenuItem>Newest first</MenuItem>
|
|
87
87
|
<MenuItem>Oldest first</MenuItem>
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
</Story>
|
|
92
92
|
|
|
93
93
|
<Story name="With Checkboxes" asChild>
|
|
94
|
-
<div class="p-
|
|
94
|
+
<div class="p-spacing-300">
|
|
95
95
|
<Menu label="View">
|
|
96
96
|
<MenuCheckboxItem bind:checked={showHidden}>Show hidden files</MenuCheckboxItem>
|
|
97
97
|
<MenuCheckboxItem bind:checked={showExtensions}>Show file extensions</MenuCheckboxItem>
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
</Story>
|
|
102
102
|
|
|
103
103
|
<Story name="With Radio Group" asChild>
|
|
104
|
-
<div class="p-
|
|
104
|
+
<div class="p-spacing-300">
|
|
105
105
|
<Menu label="Sort by">
|
|
106
106
|
<MenuRadioGroup bind:value={sortBy}>
|
|
107
107
|
<MenuRadioItem value="name">Name</MenuRadioItem>
|
|
@@ -113,7 +113,7 @@
|
|
|
113
113
|
</Story>
|
|
114
114
|
|
|
115
115
|
<Story name="With Submenu" asChild>
|
|
116
|
-
<div class="p-
|
|
116
|
+
<div class="p-spacing-300">
|
|
117
117
|
<Menu label="File">
|
|
118
118
|
<MenuItem iconProps={{ name: 'draft' }}>New</MenuItem>
|
|
119
119
|
<MenuItem iconProps={{ name: 'folder' }}>Open</MenuItem>
|
|
@@ -131,14 +131,14 @@
|
|
|
131
131
|
</MenuSub>
|
|
132
132
|
{/snippet}
|
|
133
133
|
</MenuSub>
|
|
134
|
-
<Divider class="my-
|
|
134
|
+
<Divider class="my-spacing-50" />
|
|
135
135
|
<MenuItem iconProps={{ name: 'delete' }}>Delete</MenuItem>
|
|
136
136
|
</Menu>
|
|
137
137
|
</div>
|
|
138
138
|
</Story>
|
|
139
139
|
|
|
140
140
|
<Story name="Kitchen Sink" asChild>
|
|
141
|
-
<div class="p-
|
|
141
|
+
<div class="p-spacing-300">
|
|
142
142
|
<Menu label="Document">
|
|
143
143
|
<MenuGroup heading="Sort by">
|
|
144
144
|
<MenuRadioGroup bind:value={kitchenSinkSort}>
|
|
@@ -146,11 +146,11 @@
|
|
|
146
146
|
<MenuRadioItem value="date">Date modified</MenuRadioItem>
|
|
147
147
|
</MenuRadioGroup>
|
|
148
148
|
</MenuGroup>
|
|
149
|
-
<Divider class="my-
|
|
149
|
+
<Divider class="my-spacing-50" />
|
|
150
150
|
<MenuGroup heading="View">
|
|
151
151
|
<MenuCheckboxItem bind:checked={kitchenSinkWordWrap}>Word wrap</MenuCheckboxItem>
|
|
152
152
|
</MenuGroup>
|
|
153
|
-
<Divider class="my-
|
|
153
|
+
<Divider class="my-spacing-50" />
|
|
154
154
|
<MenuSub iconProps={{ name: 'ios_share' }}>
|
|
155
155
|
Share
|
|
156
156
|
{#snippet submenu()}
|
|
@@ -44,13 +44,13 @@ Contrast with `MenuItem` (a single interactive row inside the panel) and
|
|
|
44
44
|
</DropdownMenu.Trigger>
|
|
45
45
|
|
|
46
46
|
<DropdownMenu.Portal>
|
|
47
|
-
<DropdownMenu.Content {align} sideOffset={4} class="z-
|
|
47
|
+
<DropdownMenu.Content {align} sideOffset={4} class="z-layer-popup">
|
|
48
48
|
{#snippet child({ wrapperProps, props, open: isOpen })}
|
|
49
49
|
<div {...wrapperProps} class={wrapperProps.class as any}>
|
|
50
50
|
<div
|
|
51
51
|
{...props}
|
|
52
52
|
class={clsx(
|
|
53
|
-
'bg-md-sys-color-surface-container-high shadow-elevation-3 ring-md-sys-color-outline/10 max-w-sm min-w-48
|
|
53
|
+
'bg-md-sys-color-surface-container-high shadow-elevation-3 ring-md-sys-color-outline/10 gap-spacing-50 px-spacing-100 py-spacing-50 max-w-sm min-w-48 overflow-y-auto rounded-lg',
|
|
54
54
|
props.class as any,
|
|
55
55
|
contentClass
|
|
56
56
|
)}
|
|
@@ -13,7 +13,7 @@ set. Purely organizational — it renders no interactive behavior of its own.
|
|
|
13
13
|
<MenuItem>A to Z</MenuItem>
|
|
14
14
|
<MenuItem>Z to A</MenuItem>
|
|
15
15
|
</MenuGroup>
|
|
16
|
-
<Divider class="my-
|
|
16
|
+
<Divider class="my-spacing-50" />
|
|
17
17
|
<MenuGroup heading="Date">
|
|
18
18
|
<MenuItem>Newest first</MenuItem>
|
|
19
19
|
<MenuItem>Oldest first</MenuItem>
|
|
@@ -13,7 +13,7 @@ import type { MenuGroupProps } from './types.js';
|
|
|
13
13
|
* <MenuItem>A to Z</MenuItem>
|
|
14
14
|
* <MenuItem>Z to A</MenuItem>
|
|
15
15
|
* </MenuGroup>
|
|
16
|
-
* <Divider class="my-
|
|
16
|
+
* <Divider class="my-spacing-50" />
|
|
17
17
|
* <MenuGroup heading="Date">
|
|
18
18
|
* <MenuItem>Newest first</MenuItem>
|
|
19
19
|
* <MenuItem>Oldest first</MenuItem>
|
|
@@ -67,7 +67,7 @@ trigger row (`iconProps`/`helper`/`children` label) behaves like a
|
|
|
67
67
|
</DropdownMenu.SubTrigger>
|
|
68
68
|
|
|
69
69
|
<DropdownMenu.Portal>
|
|
70
|
-
<DropdownMenu.SubContent sideOffset={4} class="z-
|
|
70
|
+
<DropdownMenu.SubContent sideOffset={4} class="z-layer-popup">
|
|
71
71
|
{#snippet child({ wrapperProps, props, open: isOpen })}
|
|
72
72
|
<div {...wrapperProps} class={wrapperProps.class as any}>
|
|
73
73
|
<div
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import { tv } from '
|
|
1
|
+
import { tv } from '../../../utils/tv.js';
|
|
2
2
|
export const menu = tv({
|
|
3
3
|
slots: {
|
|
4
4
|
content: `
|
|
5
5
|
bg-md-sys-color-surface-container-high shadow-elevation-3
|
|
6
|
-
ring-md-sys-color-outline/10 max-w-sm min-w-48 gap-
|
|
7
|
-
overflow-y-auto rounded-lg px-
|
|
6
|
+
ring-md-sys-color-outline/10 max-w-sm min-w-48 gap-spacing-50
|
|
7
|
+
overflow-y-auto rounded-lg px-spacing-100 py-spacing-50
|
|
8
8
|
`,
|
|
9
9
|
item: `
|
|
10
|
-
rounded-sm h-11 relative flex w-full cursor-pointer items-center gap-
|
|
10
|
+
rounded-sm h-11 relative flex w-full cursor-pointer items-center gap-spacing-100 px-spacing-150 py-spacing-100
|
|
11
11
|
md-sys-typescale-body-medium whitespace-nowrap text-md-sys-color-on-surface
|
|
12
12
|
hover:bg-md-sys-color-on-surface/8 data-[highlighted]:bg-md-sys-color-on-surface/8
|
|
13
13
|
focus-visible:outline-2 focus-visible:outline-offset-2
|
|
14
14
|
focus-visible:outline-md-sys-color-primary
|
|
15
15
|
data-[disabled]:cursor-not-allowed data-[disabled]:opacity-38
|
|
16
16
|
`,
|
|
17
|
-
icon: 'text-md-sys-color-on-surface-variant size-
|
|
18
|
-
indicator: 'size-
|
|
19
|
-
itemContent: 'flex flex-1 flex-col gap-
|
|
17
|
+
icon: 'text-md-sys-color-on-surface-variant size-spacing-250 text-[20px] shrink-0',
|
|
18
|
+
indicator: 'size-spacing-250 text-[20px] shrink-0 text-md-sys-color-on-surface-variant',
|
|
19
|
+
itemContent: 'flex flex-1 flex-col gap-spacing-50 text-left min-w-spacing-0',
|
|
20
20
|
helper: 'md-sys-typescale-body-medium text-md-sys-color-on-surface-variant',
|
|
21
|
-
rightSlot: 'text-md-sys-color-on-surface-variant size-
|
|
22
|
-
groupHeading: 'px-
|
|
21
|
+
rightSlot: 'text-md-sys-color-on-surface-variant size-spacing-250 text-[20px] shrink-0',
|
|
22
|
+
groupHeading: 'px-spacing-150 pt-spacing-100 pb-spacing-50 md-sys-typescale-label-medium text-md-sys-color-primary'
|
|
23
23
|
},
|
|
24
24
|
variants: {
|
|
25
25
|
selected: {
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
const { Story } = defineMeta({
|
|
6
6
|
title: 'Containers/DraggablePane',
|
|
7
|
+
tags: ['autodocs'],
|
|
7
8
|
component: DraggablePane,
|
|
8
9
|
argTypes: {
|
|
9
10
|
title: { control: 'text' },
|
|
@@ -92,7 +93,7 @@
|
|
|
92
93
|
<DraggablePane initialX={32} initialY={32}>
|
|
93
94
|
{#snippet header()}
|
|
94
95
|
<span
|
|
95
|
-
class="md-sys-typescale-label-large text-md-sys-color-on-surface
|
|
96
|
+
class="md-sys-typescale-label-large text-md-sys-color-on-surface px-spacing-50 py-spacing-50 flex-1 truncate"
|
|
96
97
|
>
|
|
97
98
|
⠿ Custom drag handle
|
|
98
99
|
</span>
|
|
@@ -157,7 +158,7 @@
|
|
|
157
158
|
<Story name="Content Overflow (Unbounded)" asChild>
|
|
158
159
|
<DraggablePane title="Long Form">
|
|
159
160
|
<div
|
|
160
|
-
class="md-sys-typescale-body-medium text-md-sys-color-on-surface-variant flex w-56 flex-col
|
|
161
|
+
class="md-sys-typescale-body-medium text-md-sys-color-on-surface-variant gap-spacing-150 flex w-56 flex-col"
|
|
161
162
|
>
|
|
162
163
|
{#each Array(30) as _, i (i)}
|
|
163
164
|
<p>
|
|
@@ -171,7 +172,7 @@
|
|
|
171
172
|
<!--
|
|
172
173
|
A fixed `height` turns the content area into an internal scroll region
|
|
173
174
|
instead of letting the panel grow past its bound — the `content` slot needs
|
|
174
|
-
`min-h-0` alongside `flex-1 overflow-auto`, otherwise a flex child's default
|
|
175
|
+
`min-h-spacing-0` alongside `flex-1 overflow-auto`, otherwise a flex child's default
|
|
175
176
|
`min-height: auto` lets it grow past its flex-basis and overflow the fixed-
|
|
176
177
|
height panel instead of scrolling internally.
|
|
177
178
|
-->
|
|
@@ -560,7 +560,7 @@ the pane itself stays `position: fixed` and doesn't move with either.
|
|
|
560
560
|
>
|
|
561
561
|
{#if collapsible}
|
|
562
562
|
<ButtonIcon
|
|
563
|
-
variant="
|
|
563
|
+
variant="standard"
|
|
564
564
|
size="sm"
|
|
565
565
|
iconProps={{ name: 'collapse_all' }}
|
|
566
566
|
aria-label="Minimize"
|
|
@@ -569,7 +569,7 @@ the pane itself stays `position: fixed` and doesn't move with either.
|
|
|
569
569
|
{/if}
|
|
570
570
|
{#if onClose}
|
|
571
571
|
<ButtonIcon
|
|
572
|
-
variant="
|
|
572
|
+
variant="standard"
|
|
573
573
|
size="sm"
|
|
574
574
|
iconProps={{ name: 'close' }}
|
|
575
575
|
aria-label="Close"
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
const { Story } = defineMeta({
|
|
7
7
|
title: 'Containers/Pane',
|
|
8
|
+
tags: ['autodocs'],
|
|
8
9
|
component: Pane,
|
|
9
10
|
argTypes: {
|
|
10
11
|
padding: {
|
|
@@ -39,24 +40,24 @@
|
|
|
39
40
|
full={args.full}
|
|
40
41
|
rounded={args.rounded}
|
|
41
42
|
>
|
|
42
|
-
<div class="bg-md-sys-color-surface-container-high rounded-lg
|
|
43
|
-
<div class="bg-md-sys-color-surface-container-high rounded-lg
|
|
44
|
-
<div class="bg-md-sys-color-surface-container-high rounded-lg
|
|
43
|
+
<div class="bg-md-sys-color-surface-container-high p-spacing-300 rounded-lg">Block one</div>
|
|
44
|
+
<div class="bg-md-sys-color-surface-container-high p-spacing-300 rounded-lg">Block two</div>
|
|
45
|
+
<div class="bg-md-sys-color-surface-container-high p-spacing-300 rounded-lg">Block three</div>
|
|
45
46
|
</Pane>
|
|
46
47
|
{/snippet}
|
|
47
48
|
</Story>
|
|
48
49
|
|
|
49
50
|
<!-- Pane has no built-in centered-width variant — center content by passing `contentClass`. -->
|
|
50
51
|
<Story name="Centered Widths" asChild>
|
|
51
|
-
<div class="flex flex-col
|
|
52
|
+
<div class="gap-spacing-300 flex flex-col">
|
|
52
53
|
<Pane contentClass="max-w-2xl mx-auto" background={false}>
|
|
53
|
-
<div class="bg-md-sys-color-secondary-container rounded-lg
|
|
54
|
+
<div class="bg-md-sys-color-secondary-container p-spacing-200 rounded-lg text-sm">narrow</div>
|
|
54
55
|
</Pane>
|
|
55
56
|
<Pane contentClass="max-w-5xl mx-auto" background={false}>
|
|
56
|
-
<div class="bg-md-sys-color-secondary-container rounded-lg
|
|
57
|
+
<div class="bg-md-sys-color-secondary-container p-spacing-200 rounded-lg text-sm">medium</div>
|
|
57
58
|
</Pane>
|
|
58
59
|
<Pane background={false}>
|
|
59
|
-
<div class="bg-md-sys-color-secondary-container rounded-lg
|
|
60
|
+
<div class="bg-md-sys-color-secondary-container p-spacing-200 rounded-lg text-sm">
|
|
60
61
|
none (full width)
|
|
61
62
|
</div>
|
|
62
63
|
</Pane>
|
|
@@ -77,7 +78,7 @@
|
|
|
77
78
|
<Story name="With AppBar" asChild parameters={{ viewport: { defaultViewport: 'mobile1' } }}>
|
|
78
79
|
<AppBar title="Inbox" ghost />
|
|
79
80
|
<Pane>
|
|
80
|
-
<div class="bg-md-sys-color-secondary-container rounded-lg
|
|
81
|
+
<div class="bg-md-sys-color-secondary-container p-spacing-200 rounded-lg text-sm">
|
|
81
82
|
This pane's min-height is <code>100dvh</code> minus the AppBar's measured height above —
|
|
82
83
|
automatic, via <code>appbarStore.svelte.ts</code>.
|
|
83
84
|
</div>
|
|
@@ -90,12 +91,12 @@
|
|
|
90
91
|
>
|
|
91
92
|
<div class="flex h-full">
|
|
92
93
|
<Pane width={200} background={false} padding="sm">
|
|
93
|
-
<div class="bg-md-sys-color-secondary-container h-full rounded-lg
|
|
94
|
+
<div class="bg-md-sys-color-secondary-container p-spacing-200 h-full rounded-lg text-sm">
|
|
94
95
|
width=200 (fixed)
|
|
95
96
|
</div>
|
|
96
97
|
</Pane>
|
|
97
98
|
<Pane background={false} padding="sm">
|
|
98
|
-
<div class="bg-md-sys-color-surface-container-high h-full rounded-lg
|
|
99
|
+
<div class="bg-md-sys-color-surface-container-high p-spacing-200 h-full rounded-lg text-sm">
|
|
99
100
|
width unset (flexible, grows)
|
|
100
101
|
</div>
|
|
101
102
|
</Pane>
|