@noxlovette/material 0.5.1 → 0.6.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/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 +24 -4
- 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 +45 -15
- package/dist/components/buttons/button-group/theme.js +13 -8
- 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 +33 -18
- package/dist/components/buttons/connected/theme.js +32 -9
- 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 +65 -48
- package/dist/components/buttons/split-button/SplitButton.svelte.d.ts +6 -11
- package/dist/components/buttons/split-button/theme.d.ts +110 -17
- package/dist/components/buttons/split-button/theme.js +74 -16
- package/dist/components/buttons/split-button/types.d.ts +24 -18
- package/dist/components/buttons/theme.d.ts +422 -230
- package/dist/components/buttons/theme.js +286 -380
- 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 +5 -5
- package/dist/components/chips/Chip.mdx +68 -0
- package/dist/components/chips/Chip.stories.svelte +4 -4
- package/dist/components/chips/theme.js +3 -3
- package/dist/components/containers/action-rail/ActionRail.stories.svelte +1 -0
- package/dist/components/containers/action-rail/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.js +10 -10
- 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 +1 -1
- package/dist/components/containers/dialogue/theme.js +3 -3
- 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 +6 -6
- package/dist/components/containers/divider/theme.js +2 -2
- package/dist/components/containers/index.d.ts +1 -1
- package/dist/components/containers/index.js +1 -1
- package/dist/components/containers/link-preview/theme.js +2 -2
- 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 +140 -13
- 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 +1 -1
- 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/menu-item/MenuItem.svelte +1 -1
- package/dist/components/containers/menu/theme.js +8 -8
- 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.js +129 -45
- 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.js +3 -3
- package/dist/components/containers/scroll-area/theme.js +2 -2
- 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 +7 -7
- package/dist/components/date/theme.js +31 -31
- 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.js +3 -3
- package/dist/components/forms/command/Command.stories.svelte +1 -0
- package/dist/components/forms/command/theme.js +9 -9
- package/dist/components/forms/pin/theme.js +4 -4
- package/dist/components/forms/radio-group/RadioGroup.svelte +1 -1
- package/dist/components/forms/radio-group/theme.js +5 -5
- 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 +45 -12
- package/dist/components/forms/search/theme.js +13 -8
- 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 +10 -2
- package/dist/components/forms/select/SelectItem.svelte +1 -1
- package/dist/components/forms/select/theme.js +12 -12
- 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 +14 -0
- package/dist/components/forms/slider/theme.js +28 -17
- 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.js +6 -6
- 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.js +19 -19
- package/dist/components/forms/toggle-group/theme.js +2 -2
- package/dist/components/forms/tooltip/Tooltip.stories.svelte +1 -0
- package/dist/components/forms/tooltip/theme.js +3 -3
- 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 +4 -4
- 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 +85 -18
- package/dist/components/nav/appbar/theme.js +159 -23
- 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.js +5 -5
- 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.js +6 -6
- 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 +1 -0
- package/dist/components/nav/rail/RailItem.svelte +12 -9
- package/dist/components/nav/rail/theme.js +13 -13
- package/dist/components/nav/rail/types.d.ts +4 -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.js +4 -4
- package/dist/components/pill/Pill.mdx +32 -0
- package/dist/components/pill/Pill.stories.svelte +1 -1
- package/dist/components/pill/theme.d.ts +1 -1
- package/dist/components/pill/theme.js +1 -1
- package/dist/components/progress/LinearProgress.svelte +1 -1
- 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 +3 -3
- package/dist/components/snackbar/theme.js +4 -4
- package/dist/components/table/Table.stories.svelte +1 -0
- package/dist/components/table/TableHeader.svelte +1 -1
- package/dist/components/table/theme.js +3 -3
- package/dist/components/time/TimeField.stories.svelte +3 -2
- package/dist/components/time/TimeField.svelte +1 -1
- package/dist/components/time/TimepickerInput.svelte +1 -1
- package/dist/components/time/theme.js +5 -5
- 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.js +14 -14
- 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 +15 -12
- package/dist/components/typography/body/theme.js +19 -4
- 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 +15 -12
- package/dist/components/typography/display/theme.js +19 -4
- 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 +15 -12
- package/dist/components/typography/headline/theme.js +19 -4
- 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 +4 -4
- package/dist/components/typography/kbd/theme.js +2 -2
- 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 +19 -4
- 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 +15 -12
- package/dist/components/typography/title/theme.js +19 -4
- package/dist/components/typography/title/types.d.ts +2 -1
- package/dist/index.css +1 -0
- package/dist/styles/component.css +78 -175
- package/dist/styles/elevation.css +9 -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/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,19 +1,24 @@
|
|
|
1
1
|
import { tv } from 'tailwind-variants';
|
|
2
|
+
/*
|
|
3
|
+
* Standard button group, per https://m3.material.io/components/button-groups/specs: an invisible
|
|
4
|
+
* container that spaces its buttons so each keeps a 48dp target (18/12/8/8/8dp for XS–XL).
|
|
5
|
+
* Pressing a button widens it by 15% and its neighbours give that width back (ButtonGroup.svelte).
|
|
6
|
+
*/
|
|
2
7
|
export const buttonGroup = tv({
|
|
3
8
|
slots: {
|
|
4
|
-
root: '
|
|
9
|
+
root: 'inline-flex w-max flex-nowrap'
|
|
5
10
|
},
|
|
6
11
|
variants: {
|
|
7
12
|
orientation: {
|
|
8
|
-
horizontal: { root: 'flex-row' },
|
|
9
|
-
vertical: { root: 'flex-col' }
|
|
13
|
+
horizontal: { root: 'flex-row items-center' },
|
|
14
|
+
vertical: { root: 'w-auto flex-col items-stretch' }
|
|
10
15
|
},
|
|
11
16
|
size: {
|
|
12
|
-
xs: {},
|
|
13
|
-
sm: {},
|
|
14
|
-
md: {},
|
|
15
|
-
lg: {},
|
|
16
|
-
xl: {}
|
|
17
|
+
xs: { root: 'gap-[1.125rem]' },
|
|
18
|
+
sm: { root: 'gap-spacing-150' },
|
|
19
|
+
md: { root: 'gap-spacing-100' },
|
|
20
|
+
lg: { root: 'gap-spacing-100' },
|
|
21
|
+
xl: { root: 'gap-spacing-100' }
|
|
17
22
|
}
|
|
18
23
|
},
|
|
19
24
|
defaultVariants: {
|
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
import type { Snippet } from 'svelte';
|
|
2
|
-
import type {
|
|
3
|
-
export type ButtonGroupProps =
|
|
4
|
-
/**
|
|
2
|
+
import type { ButtonSize } from '../theme.js';
|
|
3
|
+
export type ButtonGroupProps = {
|
|
4
|
+
/** @default 'horizontal' */
|
|
5
5
|
orientation?: 'horizontal' | 'vertical';
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* The size of the buttons inside. Sets the space between them: 18, 12, 8, 8 and 8dp for XS to
|
|
8
|
+
* XL, so each keeps a 48dp target.
|
|
9
|
+
* @default 'sm'
|
|
10
|
+
*/
|
|
11
|
+
size?: ButtonSize;
|
|
12
|
+
/**
|
|
13
|
+
* `Button`s, `Toggle`s and `ButtonIcon`s, mixed freely. Avoid `text` buttons and `standard`
|
|
14
|
+
* icon buttons, which have no container to change shape.
|
|
9
15
|
*/
|
|
10
|
-
size?: ButtonGroupVariants['size'];
|
|
11
|
-
/** The buttons in the group — `Button`, `ButtonIcon`, or `Toggle` components, mixed freely. */
|
|
12
16
|
children: Snippet;
|
|
17
|
+
/** Accessible name, when the group needs one (it gets `role="group"`). */
|
|
18
|
+
'aria-label'?: string;
|
|
13
19
|
class?: string;
|
|
14
20
|
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Meta, Title, Subtitle, Canvas, Controls } from '@storybook/addon-docs/blocks';
|
|
2
|
+
import * as ConnectedStories from './ConnectedButtonGroup.stories.svelte';
|
|
3
|
+
|
|
4
|
+
<Meta of={ConnectedStories} />
|
|
5
|
+
|
|
6
|
+
<Title />
|
|
7
|
+
|
|
8
|
+
<Subtitle>Connected button groups show related options, one or several selected.</Subtitle>
|
|
9
|
+
|
|
10
|
+
[M3 spec](https://m3.material.io/components/button-groups/specs) ·
|
|
11
|
+
`import { ConnectedButtonGroup, ConnectedButtonGroupItem } from '@noxlovette/material';`
|
|
12
|
+
|
|
13
|
+
<Canvas of={ConnectedStories.Playground} />
|
|
14
|
+
|
|
15
|
+
<Controls of={ConnectedStories.Playground} />
|
|
16
|
+
|
|
17
|
+
## When to use
|
|
18
|
+
|
|
19
|
+
For a small set of related options that change what the page shows, such as Walk, Bike, Drive.
|
|
20
|
+
It replaces M3's segmented button. For separate actions, use `ButtonGroup`.
|
|
21
|
+
`type="single"` keeps one item selected; `type="multiple"` allows several.
|
|
22
|
+
|
|
23
|
+
## Colour and shape
|
|
24
|
+
|
|
25
|
+
Items are toggle buttons in the group's `variant`: filled (default), tonal, outlined or
|
|
26
|
+
elevated, with the same unselected and selected colours as `Toggle`. Selection shows through
|
|
27
|
+
colour and shape, not a check mark:
|
|
28
|
+
|
|
29
|
+
- Items sit 2dp apart. The outer corners are fully round, or the inner size with
|
|
30
|
+
`shape="square"`.
|
|
31
|
+
- Inner corners are 8dp (16dp at L, 20dp at XL), tighten while pressed, and round out fully on
|
|
32
|
+
the selected item. Neighbours never change.
|
|
33
|
+
|
|
34
|
+
<Canvas of={ConnectedStories.ColourStyles} />
|
|
35
|
+
|
|
36
|
+
<Canvas of={ConnectedStories.SizesAndShapes} />
|
|
37
|
+
|
|
38
|
+
## Accessibility
|
|
39
|
+
|
|
40
|
+
Name the group with `aria-label`, and give icon-only items an `aria-label`. Arrow keys move
|
|
41
|
+
between items; Space and Enter select. XS and S items are at least 48dp wide.
|
|
42
|
+
|
|
43
|
+
<Canvas of={ConnectedStories.MultiSelectIcons} />
|
|
@@ -3,29 +3,22 @@
|
|
|
3
3
|
import ConnectedButtonGroup from './ConnectedButtonGroup.svelte';
|
|
4
4
|
import ConnectedButtonGroupItem from './ConnectedButtonGroupItem.svelte';
|
|
5
5
|
|
|
6
|
+
const sizes = ['xs', 'sm', 'md', 'lg', 'xl'] as const;
|
|
7
|
+
const variants = ['filled', 'tonal', 'outlined', 'elevated'] as const;
|
|
8
|
+
|
|
6
9
|
const { Story } = defineMeta({
|
|
7
10
|
title: 'Buttons/Connected Button Group',
|
|
8
11
|
component: ConnectedButtonGroup,
|
|
9
12
|
argTypes: {
|
|
10
|
-
type: {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
},
|
|
14
|
-
|
|
15
|
-
control: 'select',
|
|
16
|
-
options: ['horizontal', 'vertical']
|
|
17
|
-
},
|
|
18
|
-
shape: {
|
|
19
|
-
control: 'select',
|
|
20
|
-
options: ['round', 'square']
|
|
21
|
-
},
|
|
22
|
-
size: {
|
|
23
|
-
control: 'select',
|
|
24
|
-
options: ['xs', 'sm', 'md', 'lg', 'xl']
|
|
25
|
-
}
|
|
13
|
+
type: { control: 'inline-radio', options: ['single', 'multiple'] },
|
|
14
|
+
variant: { control: 'select', options: variants },
|
|
15
|
+
orientation: { control: 'inline-radio', options: ['horizontal', 'vertical'] },
|
|
16
|
+
shape: { control: 'inline-radio', options: ['round', 'square'] },
|
|
17
|
+
size: { control: 'select', options: sizes }
|
|
26
18
|
},
|
|
27
19
|
args: {
|
|
28
20
|
type: 'single',
|
|
21
|
+
variant: 'filled',
|
|
29
22
|
orientation: 'horizontal',
|
|
30
23
|
shape: 'round',
|
|
31
24
|
size: 'sm'
|
|
@@ -33,86 +26,75 @@
|
|
|
33
26
|
});
|
|
34
27
|
</script>
|
|
35
28
|
|
|
29
|
+
<script lang="ts">
|
|
30
|
+
let mode = $state('bike');
|
|
31
|
+
let format = $state<string[]>(['bold']);
|
|
32
|
+
</script>
|
|
33
|
+
|
|
36
34
|
<Story name="Playground">
|
|
37
35
|
{#snippet template(args)}
|
|
38
36
|
<ConnectedButtonGroup
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
size={args.size}
|
|
43
|
-
value="left"
|
|
37
|
+
{...args}
|
|
38
|
+
value={args.type === 'multiple' ? [] : 'walk'}
|
|
39
|
+
aria-label="Travel mode"
|
|
44
40
|
>
|
|
41
|
+
<ConnectedButtonGroupItem value="walk" label="Walk" iconProps={{ name: 'directions_walk' }} />
|
|
42
|
+
<ConnectedButtonGroupItem value="bike" label="Bike" iconProps={{ name: 'directions_bike' }} />
|
|
45
43
|
<ConnectedButtonGroupItem
|
|
46
|
-
value="
|
|
47
|
-
label="
|
|
48
|
-
iconProps={{ name: '
|
|
49
|
-
/>
|
|
50
|
-
<ConnectedButtonGroupItem
|
|
51
|
-
value="center"
|
|
52
|
-
label="Center"
|
|
53
|
-
iconProps={{ name: 'format_align_center' }}
|
|
54
|
-
/>
|
|
55
|
-
<ConnectedButtonGroupItem
|
|
56
|
-
value="right"
|
|
57
|
-
label="Right"
|
|
58
|
-
iconProps={{ name: 'format_align_right' }}
|
|
44
|
+
value="drive"
|
|
45
|
+
label="Drive"
|
|
46
|
+
iconProps={{ name: 'directions_car' }}
|
|
59
47
|
/>
|
|
60
48
|
</ConnectedButtonGroup>
|
|
61
49
|
{/snippet}
|
|
62
50
|
</Story>
|
|
63
51
|
|
|
64
|
-
<Story name="
|
|
65
|
-
<div class="p-
|
|
66
|
-
|
|
67
|
-
<
|
|
52
|
+
<Story name="Colour styles" asChild>
|
|
53
|
+
<div class="gap-spacing-200 p-spacing-300 flex max-w-md flex-col">
|
|
54
|
+
{#each variants as variant (variant)}
|
|
55
|
+
<ConnectedButtonGroup type="single" {variant} bind:value={mode} aria-label="Travel mode">
|
|
56
|
+
<ConnectedButtonGroupItem value="walk" label="Walk" />
|
|
57
|
+
<ConnectedButtonGroupItem value="bike" label="Bike" />
|
|
58
|
+
<ConnectedButtonGroupItem value="drive" label="Drive" />
|
|
59
|
+
</ConnectedButtonGroup>
|
|
60
|
+
{/each}
|
|
61
|
+
</div>
|
|
62
|
+
</Story>
|
|
63
|
+
|
|
64
|
+
<Story name="Multi-select icons" asChild>
|
|
65
|
+
<div class="gap-spacing-200 p-spacing-300 flex flex-col items-start">
|
|
66
|
+
<ConnectedButtonGroup type="multiple" bind:value={format} class="w-auto" aria-label="Format">
|
|
67
|
+
<ConnectedButtonGroupItem
|
|
68
|
+
value="bold"
|
|
69
|
+
aria-label="Bold"
|
|
70
|
+
iconProps={{ name: 'format_bold' }}
|
|
71
|
+
/>
|
|
68
72
|
<ConnectedButtonGroupItem
|
|
69
73
|
value="italic"
|
|
70
|
-
label="Italic"
|
|
74
|
+
aria-label="Italic"
|
|
71
75
|
iconProps={{ name: 'format_italic' }}
|
|
72
76
|
/>
|
|
73
77
|
<ConnectedButtonGroupItem
|
|
74
78
|
value="underline"
|
|
75
|
-
label="Underline"
|
|
79
|
+
aria-label="Underline"
|
|
76
80
|
iconProps={{ name: 'format_underlined' }}
|
|
77
81
|
/>
|
|
78
82
|
</ConnectedButtonGroup>
|
|
79
83
|
</div>
|
|
80
84
|
</Story>
|
|
81
85
|
|
|
82
|
-
<Story name="
|
|
83
|
-
<div class="p-
|
|
84
|
-
|
|
85
|
-
<
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
<ConnectedButtonGroupItem value="list" iconProps={{ name: 'view_list' }} />
|
|
95
|
-
<ConnectedButtonGroupItem value="grid" iconProps={{ name: 'grid_view' }} />
|
|
96
|
-
</ConnectedButtonGroup>
|
|
97
|
-
</div>
|
|
98
|
-
</Story>
|
|
99
|
-
|
|
100
|
-
<Story name="Sizes" asChild>
|
|
101
|
-
<div class="flex flex-col gap-6 p-6">
|
|
102
|
-
{#each ['xs', 'sm', 'md', 'lg', 'xl'] as const as size (size)}
|
|
103
|
-
<ConnectedButtonGroup type="single" {size} value="list">
|
|
104
|
-
<ConnectedButtonGroupItem value="list" iconProps={{ name: 'view_list' }} />
|
|
105
|
-
<ConnectedButtonGroupItem value="grid" iconProps={{ name: 'grid_view' }} />
|
|
106
|
-
</ConnectedButtonGroup>
|
|
86
|
+
<Story name="Sizes and shapes" asChild>
|
|
87
|
+
<div class="gap-spacing-200 p-spacing-300 flex max-w-xl flex-col">
|
|
88
|
+
{#each sizes as size (size)}
|
|
89
|
+
<div class="gap-spacing-200 flex">
|
|
90
|
+
{#each ['round', 'square'] as const as shape (shape)}
|
|
91
|
+
<ConnectedButtonGroup type="single" {size} {shape} value="b">
|
|
92
|
+
<ConnectedButtonGroupItem value="a" label="A" />
|
|
93
|
+
<ConnectedButtonGroupItem value="b" label="B" />
|
|
94
|
+
<ConnectedButtonGroupItem value="c" label="C" />
|
|
95
|
+
</ConnectedButtonGroup>
|
|
96
|
+
{/each}
|
|
97
|
+
</div>
|
|
107
98
|
{/each}
|
|
108
99
|
</div>
|
|
109
100
|
</Story>
|
|
110
|
-
|
|
111
|
-
<Story name="Vertical" asChild>
|
|
112
|
-
<div class="p-6">
|
|
113
|
-
<ConnectedButtonGroup type="single" orientation="vertical" value="list">
|
|
114
|
-
<ConnectedButtonGroupItem value="list" label="List" iconProps={{ name: 'view_list' }} />
|
|
115
|
-
<ConnectedButtonGroupItem value="grid" label="Grid" iconProps={{ name: 'grid_view' }} />
|
|
116
|
-
</ConnectedButtonGroup>
|
|
117
|
-
</div>
|
|
118
|
-
</Story>
|
|
@@ -1,19 +1,4 @@
|
|
|
1
1
|
import ConnectedButtonGroup from './ConnectedButtonGroup.svelte';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
$$bindings?: Bindings;
|
|
5
|
-
} & Exports;
|
|
6
|
-
(internal: unknown, props: {
|
|
7
|
-
$$events?: Events;
|
|
8
|
-
$$slots?: Slots;
|
|
9
|
-
}): Exports & {
|
|
10
|
-
$set?: any;
|
|
11
|
-
$on?: any;
|
|
12
|
-
};
|
|
13
|
-
z_$$bindings?: Bindings;
|
|
14
|
-
}
|
|
15
|
-
declare const ConnectedButtonGroup: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
|
|
16
|
-
[evt: string]: CustomEvent<any>;
|
|
17
|
-
}, {}, {}, string>;
|
|
18
|
-
type ConnectedButtonGroup = InstanceType<typeof ConnectedButtonGroup>;
|
|
2
|
+
declare const ConnectedButtonGroup: import("svelte").Component<Record<string, never>, {}, "">;
|
|
3
|
+
type ConnectedButtonGroup = ReturnType<typeof ConnectedButtonGroup>;
|
|
19
4
|
export default ConnectedButtonGroup;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
<!--
|
|
2
2
|
@component
|
|
3
|
-
A connected button group
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
A connected button group, M3's replacement for the segmented button: toggle buttons 2dp apart
|
|
4
|
+
in one shared shape, for related options such as Walk, Bike, Drive. Selecting an item rounds it
|
|
5
|
+
out and gives it the selected colours; pressing tightens its inner corners. Neighbours never
|
|
6
|
+
change.
|
|
7
7
|
|
|
8
8
|
@see https://m3.material.io/components/button-groups/overview
|
|
9
9
|
-->
|
|
@@ -21,9 +21,11 @@ color, never its neighbors'.
|
|
|
21
21
|
disabled = false,
|
|
22
22
|
loop = true,
|
|
23
23
|
orientation = 'horizontal',
|
|
24
|
+
variant = 'filled',
|
|
24
25
|
shape = 'round',
|
|
25
26
|
size = 'sm',
|
|
26
27
|
children,
|
|
28
|
+
'aria-label': ariaLabel,
|
|
27
29
|
class: className
|
|
28
30
|
}: ConnectedButtonGroupProps = $props();
|
|
29
31
|
|
|
@@ -35,6 +37,15 @@ color, never its neighbors'.
|
|
|
35
37
|
},
|
|
36
38
|
get shape() {
|
|
37
39
|
return shape;
|
|
40
|
+
},
|
|
41
|
+
get variant() {
|
|
42
|
+
return variant;
|
|
43
|
+
},
|
|
44
|
+
get type() {
|
|
45
|
+
return type;
|
|
46
|
+
},
|
|
47
|
+
get value() {
|
|
48
|
+
return value;
|
|
38
49
|
}
|
|
39
50
|
});
|
|
40
51
|
</script>
|
|
@@ -46,6 +57,7 @@ color, never its neighbors'.
|
|
|
46
57
|
{disabled}
|
|
47
58
|
{loop}
|
|
48
59
|
{orientation}
|
|
60
|
+
aria-label={ariaLabel}
|
|
49
61
|
class={cls.root({ class: clsx(className) })}
|
|
50
62
|
>
|
|
51
63
|
{@render children?.()}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { ConnectedButtonGroupProps } from './types.js';
|
|
2
2
|
/**
|
|
3
|
-
* A connected button group
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
3
|
+
* A connected button group, M3's replacement for the segmented button: toggle buttons 2dp apart
|
|
4
|
+
* in one shared shape, for related options such as Walk, Bike, Drive. Selecting an item rounds it
|
|
5
|
+
* out and gives it the selected colours; pressing tightens its inner corners. Neighbours never
|
|
6
|
+
* change.
|
|
7
7
|
*
|
|
8
8
|
* @see https://m3.material.io/components/button-groups/overview
|
|
9
9
|
*/
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
<!--
|
|
2
2
|
@component
|
|
3
|
-
|
|
4
|
-
shape (
|
|
5
|
-
through an overlaid check icon.
|
|
3
|
+
One item of a `ConnectedButtonGroup`: a toggle button. Selection shows through its colour and
|
|
4
|
+
shape (it rounds out), not a check mark.
|
|
6
5
|
-->
|
|
7
6
|
<script lang="ts">
|
|
8
7
|
import { ToggleGroup } from 'bits-ui';
|
|
9
8
|
import clsx from 'clsx';
|
|
10
9
|
import { getContext } from 'svelte';
|
|
11
10
|
import { Icon, Layer } from '../../../utils/index.js';
|
|
11
|
+
import { buttonColor, buttonElevation } from '../theme.js';
|
|
12
|
+
import { connectedCorners, shapeMorph } from '../shapeMorph.js';
|
|
12
13
|
import { connectedButtonGroupItem } from './theme.js';
|
|
13
14
|
import type { ConnectedButtonGroupCtx, ConnectedButtonGroupItemProps } from './types.js';
|
|
14
15
|
|
|
@@ -17,18 +18,44 @@ through an overlaid check icon.
|
|
|
17
18
|
label,
|
|
18
19
|
iconProps,
|
|
19
20
|
disabled = false,
|
|
21
|
+
'aria-label': ariaLabel,
|
|
20
22
|
class: className
|
|
21
23
|
}: ConnectedButtonGroupItemProps = $props();
|
|
22
24
|
|
|
25
|
+
let ref = $state<HTMLElement | null>(null);
|
|
26
|
+
$effect(() => (ref ? shapeMorph(ref, connectedCorners) : undefined));
|
|
27
|
+
|
|
23
28
|
const ctx = getContext<ConnectedButtonGroupCtx | undefined>('connectedButtonGroup');
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
|
|
29
|
+
const variant = $derived(ctx?.variant ?? 'filled');
|
|
30
|
+
const selected = $derived(
|
|
31
|
+
ctx?.type === 'multiple'
|
|
32
|
+
? Array.isArray(ctx.value) && ctx.value.includes(value)
|
|
33
|
+
: ctx?.value === value
|
|
34
|
+
);
|
|
35
|
+
const cls = $derived(
|
|
36
|
+
connectedButtonGroupItem({ size: ctx?.size ?? 'sm', shape: ctx?.shape ?? 'round' })
|
|
37
|
+
);
|
|
27
38
|
</script>
|
|
28
39
|
|
|
29
|
-
<ToggleGroup.Item
|
|
40
|
+
<ToggleGroup.Item
|
|
41
|
+
bind:ref
|
|
42
|
+
{value}
|
|
43
|
+
{disabled}
|
|
44
|
+
aria-label={ariaLabel}
|
|
45
|
+
class={cls.base({
|
|
46
|
+
class: clsx(
|
|
47
|
+
buttonColor({ variant, state: selected ? 'selected' : 'unselected' }),
|
|
48
|
+
buttonElevation[variant],
|
|
49
|
+
className
|
|
50
|
+
)
|
|
51
|
+
})}
|
|
52
|
+
>
|
|
30
53
|
{#if iconProps}
|
|
31
|
-
<Icon
|
|
54
|
+
<Icon
|
|
55
|
+
fill={selected ? 1 : 0}
|
|
56
|
+
{...iconProps}
|
|
57
|
+
class={cls.icon({ class: clsx(iconProps.class) })}
|
|
58
|
+
/>
|
|
32
59
|
{/if}
|
|
33
60
|
{#if label}
|
|
34
61
|
<span>{label}</span>
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import type { ConnectedButtonGroupItemProps } from './types.js';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
* shape (
|
|
5
|
-
* through an overlaid check icon.
|
|
3
|
+
* One item of a `ConnectedButtonGroup`: a toggle button. Selection shows through its colour and
|
|
4
|
+
* shape (it rounds out), not a check mark.
|
|
6
5
|
*/
|
|
7
6
|
declare const ConnectedButtonGroupItem: import("svelte").Component<ConnectedButtonGroupItemProps, {}, "">;
|
|
8
7
|
type ConnectedButtonGroupItem = ReturnType<typeof ConnectedButtonGroupItem>;
|
|
@@ -38,19 +38,24 @@ export declare const connectedButtonGroup: import("tailwind-variants").TVReturnT
|
|
|
38
38
|
export declare const connectedButtonGroupItem: import("tailwind-variants").TVReturnType<{
|
|
39
39
|
size: {
|
|
40
40
|
xs: {
|
|
41
|
-
base: string;
|
|
41
|
+
base: string[];
|
|
42
|
+
icon: "size-spacing-250 text-[20px]";
|
|
42
43
|
};
|
|
43
44
|
sm: {
|
|
44
|
-
base: string;
|
|
45
|
+
base: string[];
|
|
46
|
+
icon: "size-spacing-250 text-[20px]";
|
|
45
47
|
};
|
|
46
48
|
md: {
|
|
47
|
-
base: string;
|
|
49
|
+
base: string[];
|
|
50
|
+
icon: "size-spacing-300 text-[24px]";
|
|
48
51
|
};
|
|
49
52
|
lg: {
|
|
50
|
-
base: string;
|
|
53
|
+
base: string[];
|
|
54
|
+
icon: "size-spacing-400 text-[32px]";
|
|
51
55
|
};
|
|
52
56
|
xl: {
|
|
53
|
-
base: string;
|
|
57
|
+
base: string[];
|
|
58
|
+
icon: "size-spacing-500 text-[40px]";
|
|
54
59
|
};
|
|
55
60
|
};
|
|
56
61
|
shape: {
|
|
@@ -62,24 +67,29 @@ export declare const connectedButtonGroupItem: import("tailwind-variants").TVRet
|
|
|
62
67
|
};
|
|
63
68
|
};
|
|
64
69
|
}, {
|
|
65
|
-
base: string;
|
|
70
|
+
base: string[];
|
|
66
71
|
icon: string;
|
|
67
72
|
}, undefined, {
|
|
68
73
|
size: {
|
|
69
74
|
xs: {
|
|
70
|
-
base: string;
|
|
75
|
+
base: string[];
|
|
76
|
+
icon: "size-spacing-250 text-[20px]";
|
|
71
77
|
};
|
|
72
78
|
sm: {
|
|
73
|
-
base: string;
|
|
79
|
+
base: string[];
|
|
80
|
+
icon: "size-spacing-250 text-[20px]";
|
|
74
81
|
};
|
|
75
82
|
md: {
|
|
76
|
-
base: string;
|
|
83
|
+
base: string[];
|
|
84
|
+
icon: "size-spacing-300 text-[24px]";
|
|
77
85
|
};
|
|
78
86
|
lg: {
|
|
79
|
-
base: string;
|
|
87
|
+
base: string[];
|
|
88
|
+
icon: "size-spacing-400 text-[32px]";
|
|
80
89
|
};
|
|
81
90
|
xl: {
|
|
82
|
-
base: string;
|
|
91
|
+
base: string[];
|
|
92
|
+
icon: "size-spacing-500 text-[40px]";
|
|
83
93
|
};
|
|
84
94
|
};
|
|
85
95
|
shape: {
|
|
@@ -91,24 +101,29 @@ export declare const connectedButtonGroupItem: import("tailwind-variants").TVRet
|
|
|
91
101
|
};
|
|
92
102
|
};
|
|
93
103
|
}, {
|
|
94
|
-
base: string;
|
|
104
|
+
base: string[];
|
|
95
105
|
icon: string;
|
|
96
106
|
}, import("tailwind-variants").TVReturnTypeLike<{
|
|
97
107
|
size: {
|
|
98
108
|
xs: {
|
|
99
|
-
base: string;
|
|
109
|
+
base: string[];
|
|
110
|
+
icon: "size-spacing-250 text-[20px]";
|
|
100
111
|
};
|
|
101
112
|
sm: {
|
|
102
|
-
base: string;
|
|
113
|
+
base: string[];
|
|
114
|
+
icon: "size-spacing-250 text-[20px]";
|
|
103
115
|
};
|
|
104
116
|
md: {
|
|
105
|
-
base: string;
|
|
117
|
+
base: string[];
|
|
118
|
+
icon: "size-spacing-300 text-[24px]";
|
|
106
119
|
};
|
|
107
120
|
lg: {
|
|
108
|
-
base: string;
|
|
121
|
+
base: string[];
|
|
122
|
+
icon: "size-spacing-400 text-[32px]";
|
|
109
123
|
};
|
|
110
124
|
xl: {
|
|
111
|
-
base: string;
|
|
125
|
+
base: string[];
|
|
126
|
+
icon: "size-spacing-500 text-[40px]";
|
|
112
127
|
};
|
|
113
128
|
};
|
|
114
129
|
shape: {
|
|
@@ -120,6 +135,6 @@ export declare const connectedButtonGroupItem: import("tailwind-variants").TVRet
|
|
|
120
135
|
};
|
|
121
136
|
};
|
|
122
137
|
}, {
|
|
123
|
-
base: string;
|
|
138
|
+
base: string[];
|
|
124
139
|
icon: string;
|
|
125
140
|
}>>;
|
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
import { tv } from 'tailwind-variants';
|
|
2
|
+
import { buttonBase, buttonSizes } from '../theme.js';
|
|
3
|
+
/*
|
|
4
|
+
* Connected button group, per https://m3.material.io/components/button-groups/specs: toggle
|
|
5
|
+
* buttons 2dp apart that share one outline shape. Items take the button's measurements for their
|
|
6
|
+
* size. Corners (`.md-btn-connected` in styles/component.css): inner corners --cbg-inner, then
|
|
7
|
+
* --cbg-pressed while pressed and fully round while selected; outer corners --cbg-outer, fully
|
|
8
|
+
* round or, for the square shape, the inner size. XS and S items are at least 48dp wide.
|
|
9
|
+
*/
|
|
2
10
|
export const connectedButtonGroup = tv({
|
|
3
11
|
slots: {
|
|
4
|
-
root: 'flex w-full items-stretch gap-
|
|
12
|
+
root: 'flex w-full items-stretch gap-spacing-25'
|
|
5
13
|
},
|
|
6
14
|
variants: {
|
|
7
15
|
orientation: {
|
|
@@ -15,19 +23,34 @@ export const connectedButtonGroup = tv({
|
|
|
15
23
|
});
|
|
16
24
|
export const connectedButtonGroupItem = tv({
|
|
17
25
|
slots: {
|
|
18
|
-
base: 'md-btn-connected
|
|
19
|
-
icon: '
|
|
26
|
+
base: [buttonBase, 'md-btn-connected min-w-spacing-600 flex-1'],
|
|
27
|
+
icon: 'shrink-0'
|
|
20
28
|
},
|
|
21
29
|
variants: {
|
|
22
30
|
size: {
|
|
23
|
-
xs: {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
31
|
+
xs: {
|
|
32
|
+
base: [buttonSizes.xs.base, '[--cbg-inner:0.5rem] [--cbg-pressed:0.25rem]'],
|
|
33
|
+
icon: buttonSizes.xs.icon
|
|
34
|
+
},
|
|
35
|
+
sm: {
|
|
36
|
+
base: [buttonSizes.sm.base, '[--cbg-inner:0.5rem] [--cbg-pressed:0.25rem]'],
|
|
37
|
+
icon: buttonSizes.sm.icon
|
|
38
|
+
},
|
|
39
|
+
md: {
|
|
40
|
+
base: [buttonSizes.md.base, '[--cbg-inner:0.5rem] [--cbg-pressed:0.25rem]'],
|
|
41
|
+
icon: buttonSizes.md.icon
|
|
42
|
+
},
|
|
43
|
+
lg: {
|
|
44
|
+
base: [buttonSizes.lg.base, '[--cbg-inner:1rem] [--cbg-pressed:0.75rem]'],
|
|
45
|
+
icon: buttonSizes.lg.icon
|
|
46
|
+
},
|
|
47
|
+
xl: {
|
|
48
|
+
base: [buttonSizes.xl.base, '[--cbg-inner:1.25rem] [--cbg-pressed:1rem]'],
|
|
49
|
+
icon: buttonSizes.xl.icon
|
|
50
|
+
}
|
|
28
51
|
},
|
|
29
52
|
shape: {
|
|
30
|
-
round: { base: '[--cbg-outer:
|
|
53
|
+
round: { base: '[--cbg-outer:var(--btn-round)]' },
|
|
31
54
|
square: { base: '[--cbg-outer:var(--cbg-inner)]' }
|
|
32
55
|
}
|
|
33
56
|
},
|