@noxlovette/material 0.5.0 → 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 +60 -0
- package/dist/animation/Shapes.stories.svelte.d.ts +3 -0
- package/dist/animation/TransitionPatterns.stories.svelte +32 -20
- package/dist/animation/containerTransform.d.ts +11 -0
- package/dist/animation/containerTransform.js +11 -0
- package/dist/animation/enterExit.d.ts +9 -0
- package/dist/animation/enterExit.js +6 -3
- package/dist/animation/index.d.ts +1 -0
- package/dist/animation/index.js +1 -0
- package/dist/animation/shapeMorph.svelte.d.ts +52 -0
- package/dist/animation/shapeMorph.svelte.js +112 -0
- package/dist/animation/shapesAnimatableSmall.d.ts +28 -22
- package/dist/animation/shapesAnimatableSmall.js +32 -23
- package/dist/animation/sharedAxisTransition.d.ts +22 -0
- package/dist/animation/sharedAxisTransition.js +25 -1
- package/dist/animation/skeleton.d.ts +6 -1
- package/dist/animation/skeleton.js +6 -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 +49 -26
- package/dist/components/date/DateField.svelte.d.ts +2 -0
- package/dist/components/date/DateRangeField.stories.svelte +4 -3
- package/dist/components/date/DateRangeField.svelte +54 -31
- package/dist/components/date/DateRangeField.svelte.d.ts +2 -0
- package/dist/components/date/calendarMotion.d.ts +9 -0
- package/dist/components/date/calendarMotion.js +23 -0
- package/dist/components/date/theme.d.ts +7 -7
- package/dist/components/date/theme.js +34 -30
- 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.d.ts +3 -0
- package/dist/components/forms/textfield/theme.js +22 -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/TabHolder.svelte +29 -3
- package/dist/components/nav/tabs/TabHolder.svelte.d.ts +3 -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 +14 -8
- package/dist/components/time/TimeField.svelte.d.ts +6 -0
- package/dist/components/time/TimepickerInput.svelte +9 -5
- package/dist/components/time/theme.js +5 -5
- package/dist/components/time/types.d.ts +11 -1
- 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/dist/utils/icon/loadingShapes.js +11 -10
- 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
|
@@ -4,15 +4,18 @@ Material 3 Tabs container.
|
|
|
4
4
|
|
|
5
5
|
Wraps bits-ui Tabs.Root + Tabs.List and renders a sliding active indicator.
|
|
6
6
|
Use TabContent for content-panel tabs; omit it for navigation (href) tabs.
|
|
7
|
+
Switching panels runs the M3 lateral transition: the new panel pushes the old one out in the
|
|
8
|
+
direction of the selected tab.
|
|
7
9
|
|
|
8
10
|
@see https://m3.material.io/components/tabs/overview
|
|
9
11
|
-->
|
|
10
12
|
<script lang="ts">
|
|
13
|
+
import { lateral } from '../../../animation/index.js';
|
|
11
14
|
import { tabHolder } from './theme.js';
|
|
12
15
|
import type { TabHolderProps } from './types.js';
|
|
13
16
|
import Tab from './Tab.svelte';
|
|
14
17
|
import { Tabs } from 'bits-ui';
|
|
15
|
-
import type
|
|
18
|
+
import { tick, type Snippet } from 'svelte';
|
|
16
19
|
|
|
17
20
|
let {
|
|
18
21
|
items,
|
|
@@ -27,9 +30,28 @@ Use TabContent for content-panel tabs; omit it for navigation (href) tabs.
|
|
|
27
30
|
const idx = $derived(items.findIndex((i) => i.value === value));
|
|
28
31
|
const count = $derived(items.length);
|
|
29
32
|
const { base, bar } = $derived(tabHolder({ rounded }));
|
|
33
|
+
|
|
34
|
+
let panels = $state<HTMLElement>();
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Tabs are peers, so switching panels is the M3 lateral transition: the new panel pushes the
|
|
38
|
+
* old one out toward the side of the newly selected tab. Navigation (href) tabs have no panels
|
|
39
|
+
* here — the route change is the app's to animate.
|
|
40
|
+
* https://m3.material.io/styles/motion/transitions/transition-patterns#lateral
|
|
41
|
+
*/
|
|
42
|
+
const select = (next: string) => {
|
|
43
|
+
const from = idx;
|
|
44
|
+
const to = items.findIndex((i) => i.value === next);
|
|
45
|
+
const update = async () => {
|
|
46
|
+
value = next;
|
|
47
|
+
await tick();
|
|
48
|
+
};
|
|
49
|
+
if (!children || !panels || from === -1 || to === -1 || from === to) return void update();
|
|
50
|
+
lateral(update, { target: panels, direction: to > from ? 'forward' : 'backward' });
|
|
51
|
+
};
|
|
30
52
|
</script>
|
|
31
53
|
|
|
32
|
-
<Tabs.Root bind:value {onValueChange} {activationMode}>
|
|
54
|
+
<Tabs.Root bind:value={() => value, select} {onValueChange} {activationMode}>
|
|
33
55
|
<Tabs.List class={base()}>
|
|
34
56
|
{#each items as item (item)}
|
|
35
57
|
<Tab {...item} {variant} />
|
|
@@ -41,5 +63,9 @@ Use TabContent for content-panel tabs; omit it for navigation (href) tabs.
|
|
|
41
63
|
></div>
|
|
42
64
|
</Tabs.List>
|
|
43
65
|
|
|
44
|
-
{
|
|
66
|
+
{#if children}
|
|
67
|
+
<div bind:this={panels}>
|
|
68
|
+
{@render children()}
|
|
69
|
+
</div>
|
|
70
|
+
{/if}
|
|
45
71
|
</Tabs.Root>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { TabHolderProps } from './types.js';
|
|
2
|
-
import type
|
|
2
|
+
import { type Snippet } from 'svelte';
|
|
3
3
|
type $$ComponentProps = TabHolderProps & {
|
|
4
4
|
children?: Snippet;
|
|
5
5
|
};
|
|
@@ -8,6 +8,8 @@ type $$ComponentProps = TabHolderProps & {
|
|
|
8
8
|
*
|
|
9
9
|
* Wraps bits-ui Tabs.Root + Tabs.List and renders a sliding active indicator.
|
|
10
10
|
* Use TabContent for content-panel tabs; omit it for navigation (href) tabs.
|
|
11
|
+
* Switching panels runs the M3 lateral transition: the new panel pushes the old one out in the
|
|
12
|
+
* direction of the selected tab.
|
|
11
13
|
*
|
|
12
14
|
* @see https://m3.material.io/components/tabs/overview
|
|
13
15
|
*/
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Meta, Title, Subtitle, Canvas, Controls } from '@storybook/addon-docs/blocks';
|
|
2
|
+
import * as TabsStories from './Tabs.stories.svelte';
|
|
3
|
+
|
|
4
|
+
<Meta of={TabsStories} />
|
|
5
|
+
|
|
6
|
+
<Title />
|
|
7
|
+
|
|
8
|
+
<Subtitle>Tabs organise related content across views at the same level.</Subtitle>
|
|
9
|
+
|
|
10
|
+
[M3 spec](https://m3.material.io/components/tabs/specs) ·
|
|
11
|
+
`import { TabHolder, TabContent } from '@noxlovette/material';`
|
|
12
|
+
|
|
13
|
+
<Canvas of={TabsStories.Playground} />
|
|
14
|
+
|
|
15
|
+
<Controls of={TabsStories.Playground} />
|
|
16
|
+
|
|
17
|
+
## Anatomy
|
|
18
|
+
|
|
19
|
+
- **`TabHolder`** renders the tab row from an `items` array, plus the sliding active indicator.
|
|
20
|
+
- **`Tab`** is one trigger, rendered by `TabHolder` for each item: an `<a>` when the item has
|
|
21
|
+
`href`, a `<button>` otherwise.
|
|
22
|
+
- **`TabContent`** is the panel matched to a tab by `value`, for content tabs only.
|
|
23
|
+
|
|
24
|
+
## Content tabs
|
|
25
|
+
|
|
26
|
+
Give each item a `value` and a matching `TabContent`:
|
|
27
|
+
|
|
28
|
+
```svelte
|
|
29
|
+
<TabHolder
|
|
30
|
+
bind:value
|
|
31
|
+
items={[
|
|
32
|
+
{ value: 'flights', name: 'Flights', iconProps: { name: 'flight' } },
|
|
33
|
+
{ value: 'trips', name: 'Trips', iconProps: { name: 'luggage' } }
|
|
34
|
+
]}
|
|
35
|
+
/>
|
|
36
|
+
|
|
37
|
+
<TabContent value="flights">Flights panel</TabContent>
|
|
38
|
+
<TabContent value="trips">Trips panel</TabContent>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Navigation tabs
|
|
42
|
+
|
|
43
|
+
Give each item an `href` instead of a `value`, and leave out `TabContent`. The tabs then route
|
|
44
|
+
between pages.
|
|
45
|
+
|
|
46
|
+
<Canvas of={TabsStories.NavigationTabsHref} />
|
|
47
|
+
|
|
48
|
+
## Motion
|
|
49
|
+
|
|
50
|
+
Tabs are peers, so switching panels runs the M3 lateral transition: the new panel pushes the old
|
|
51
|
+
one out toward the selected tab's side. The indicator slides on the fast spatial spring. Nothing
|
|
52
|
+
needs configuring.
|
|
53
|
+
|
|
54
|
+
Navigation tabs have no panels inside `TabHolder`, so animate the route change yourself with
|
|
55
|
+
`lateral()` from `@noxlovette/material`.
|
|
56
|
+
|
|
57
|
+
## Accessibility
|
|
58
|
+
|
|
59
|
+
- **Keyboard.** Arrow keys move between tabs. With `activationMode="automatic"`, focus selects;
|
|
60
|
+
with `manual`, Enter or Space does.
|
|
61
|
+
- **Selection.** The active tab gets `aria-selected`; the indicator is decoration.
|
|
62
|
+
- **Disabled tabs** are skipped by the arrow keys.
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
|
|
33
33
|
<Story name="Playground">
|
|
34
34
|
{#snippet template(args)}
|
|
35
|
-
<div class="flex flex-col
|
|
35
|
+
<div class="gap-spacing-200 flex flex-col">
|
|
36
36
|
<TabHolder {...args} {items}>
|
|
37
37
|
<TabContent value="flights"><Body>Flights panel content.</Body></TabContent>
|
|
38
38
|
<TabContent value="trips"><Body>Trips panel content.</Body></TabContent>
|
|
@@ -2,7 +2,7 @@ import { tv } from 'tailwind-variants';
|
|
|
2
2
|
export const tabHolder = tv({
|
|
3
3
|
slots: {
|
|
4
4
|
base: 'relative flex w-full bg-md-sys-color-surface',
|
|
5
|
-
bar: 'absolute bottom-0 h-[3px] rounded-t-full bg-md-sys-color-primary transition-transform md-sys-motion-fast-spatial'
|
|
5
|
+
bar: 'absolute bottom-spacing-0 h-[3px] rounded-t-full bg-md-sys-color-primary transition-transform md-sys-motion-fast-spatial'
|
|
6
6
|
},
|
|
7
7
|
variants: {
|
|
8
8
|
rounded: {
|
|
@@ -19,15 +19,15 @@ export const tab = tv({
|
|
|
19
19
|
'data-[state=inactive]:text-md-sys-color-on-surface-variant'
|
|
20
20
|
].join(' '),
|
|
21
21
|
label: 'md-sys-typescale-title-small',
|
|
22
|
-
icon: 'size-
|
|
22
|
+
icon: 'size-spacing-300 text-[24px]'
|
|
23
23
|
},
|
|
24
24
|
variants: {
|
|
25
25
|
variant: {
|
|
26
26
|
primary: {
|
|
27
|
-
base: 'h-
|
|
27
|
+
base: 'h-spacing-800 gap-spacing-50 py-spacing-150'
|
|
28
28
|
},
|
|
29
29
|
secondary: {
|
|
30
|
-
base: 'h-
|
|
30
|
+
base: 'h-spacing-600 py-spacing-150',
|
|
31
31
|
icon: 'hidden'
|
|
32
32
|
}
|
|
33
33
|
},
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Meta, Title, Subtitle, Canvas, Controls } from '@storybook/addon-docs/blocks';
|
|
2
|
+
import * as PillStories from './Pill.stories.svelte';
|
|
3
|
+
|
|
4
|
+
<Meta of={PillStories} />
|
|
5
|
+
|
|
6
|
+
<Title />
|
|
7
|
+
|
|
8
|
+
<Subtitle>A small rounded label for short static text: a status, a count, a category.</Subtitle>
|
|
9
|
+
|
|
10
|
+
`import { Pill } from '@noxlovette/material';`
|
|
11
|
+
|
|
12
|
+
<Canvas of={PillStories.Playground} />
|
|
13
|
+
|
|
14
|
+
<Controls of={PillStories.Playground} />
|
|
15
|
+
|
|
16
|
+
## Pill or Chip
|
|
17
|
+
|
|
18
|
+
`Pill` is not an M3 component. It renders a plain `<div>` with no click handler, remove button or
|
|
19
|
+
selected state. For anything the user interacts with, use `Chip`, which implements M3 chips.
|
|
20
|
+
|
|
21
|
+
## Variants
|
|
22
|
+
|
|
23
|
+
The system variants (`primary`, `secondary-container`, and so on) use M3 color roles, so they
|
|
24
|
+
follow the theme. `yellow` and `green` are fixed colors for status labels like "New" or "Beta"
|
|
25
|
+
that should look the same in every theme.
|
|
26
|
+
|
|
27
|
+
<Canvas of={PillStories.Variants} />
|
|
28
|
+
|
|
29
|
+
## Accessibility
|
|
30
|
+
|
|
31
|
+
- **Not a control.** A pill has no role and isn't focusable, so never make one clickable.
|
|
32
|
+
- **Contrast.** Each system variant pairs a container with its `on-*` role.
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
<Story name="Playground">New</Story>
|
|
33
33
|
|
|
34
34
|
<Story name="Variants" asChild>
|
|
35
|
-
<div class="flex flex-wrap items-center
|
|
35
|
+
<div class="gap-spacing-150 p-spacing-300 flex flex-wrap items-center">
|
|
36
36
|
<Pill variant="primary">Primary</Pill>
|
|
37
37
|
<Pill variant="secondary">Secondary</Pill>
|
|
38
38
|
<Pill variant="tertiary">Tertiary</Pill>
|
|
@@ -14,7 +14,7 @@ export declare const pill: import("tailwind-variants").TVReturnType<{
|
|
|
14
14
|
yellow: "bg-yellow-400 text-yellow-950 dark:bg-yellow-300 dark:text-yellow-950";
|
|
15
15
|
green: "bg-green-600 text-white dark:bg-green-500 dark:text-green-950";
|
|
16
16
|
};
|
|
17
|
-
}, undefined, "relative inline-flex items-center justify-center px-
|
|
17
|
+
}, undefined, "relative inline-flex items-center justify-center px-spacing-200 py-spacing-75 md-sys-typescale-label-large select-none rounded-full whitespace-nowrap", {
|
|
18
18
|
variant: {
|
|
19
19
|
primary: "md-component-button-filled-primary";
|
|
20
20
|
secondary: "md-component-button-filled-secondary";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { tv } from 'tailwind-variants';
|
|
2
2
|
export const pill = tv({
|
|
3
|
-
base: 'relative inline-flex items-center justify-center px-
|
|
3
|
+
base: 'relative inline-flex items-center justify-center px-spacing-200 py-spacing-75 md-sys-typescale-label-large select-none rounded-full whitespace-nowrap',
|
|
4
4
|
variants: {
|
|
5
5
|
variant: {
|
|
6
6
|
primary: 'md-component-button-filled-primary',
|
|
@@ -35,7 +35,7 @@ The track always keeps a gap either side of the bar.
|
|
|
35
35
|
const linearProgress = tv({
|
|
36
36
|
slots: {
|
|
37
37
|
container: 'relative overflow-hidden',
|
|
38
|
-
segment: 'absolute inset-y-0 rounded-full',
|
|
38
|
+
segment: 'absolute inset-y-spacing-0 rounded-full',
|
|
39
39
|
bar: 'bg-md-sys-color-primary',
|
|
40
40
|
track: 'bg-md-sys-color-secondary-container'
|
|
41
41
|
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Meta, Title, Subtitle, Canvas } from '@storybook/addon-docs/blocks';
|
|
2
|
+
import * as ProgressStories from './Progress.stories.svelte';
|
|
3
|
+
|
|
4
|
+
<Meta of={ProgressStories} />
|
|
5
|
+
|
|
6
|
+
<Title />
|
|
7
|
+
|
|
8
|
+
<Subtitle>Progress indicators show the status of an ongoing process.</Subtitle>
|
|
9
|
+
|
|
10
|
+
[M3 spec](https://m3.material.io/components/progress-indicators/specs) ·
|
|
11
|
+
`import { CircularProgress, LinearProgress, WavyLinearProgress } from '@noxlovette/material';`
|
|
12
|
+
|
|
13
|
+
## Three components
|
|
14
|
+
|
|
15
|
+
There's no shared `variant` prop. Pick the component for the shape you need:
|
|
16
|
+
|
|
17
|
+
- **`CircularProgress`** and **`LinearProgress`** are M3's circular and linear indicators.
|
|
18
|
+
- **`WavyLinearProgress`** is this library's own sine-wave linear indicator, inspired by M3
|
|
19
|
+
Expressive but not a literal reproduction of the spec.
|
|
20
|
+
|
|
21
|
+
All three take the same `percent`: a number from 0 to 100 for a determinate indicator, or
|
|
22
|
+
omitted (or `null`) for an indeterminate one.
|
|
23
|
+
|
|
24
|
+
```svelte
|
|
25
|
+
<CircularProgress percent={uploadPercent} />
|
|
26
|
+
<LinearProgress percent={uploadPercent} class="w-full" />
|
|
27
|
+
|
|
28
|
+
<!-- Indeterminate: omit percent -->
|
|
29
|
+
<CircularProgress />
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
<Canvas of={ProgressStories.CircularDeterminate} />
|
|
33
|
+
|
|
34
|
+
<Canvas of={ProgressStories.CircularIndeterminate} />
|
|
35
|
+
|
|
36
|
+
<Canvas of={ProgressStories.LinearDeterminate} />
|
|
37
|
+
|
|
38
|
+
<Canvas of={ProgressStories.WavyDeterminate} />
|
|
39
|
+
|
|
40
|
+
## Motion
|
|
41
|
+
|
|
42
|
+
A determinate indicator springs to each new `percent` on a critically damped spring, so progress
|
|
43
|
+
never visibly runs backwards. Indeterminate indicators animate continuously.
|
|
44
|
+
|
|
45
|
+
## Accessibility
|
|
46
|
+
|
|
47
|
+
- **Role.** Each renders `role="progressbar"`, with `aria-valuenow` set from `percent` and left
|
|
48
|
+
out when indeterminate.
|
|
49
|
+
- **Label.** None of them says what is loading. Give each an `aria-label`, or put visible text
|
|
50
|
+
next to it.
|
|
@@ -23,42 +23,42 @@
|
|
|
23
23
|
|
|
24
24
|
<Story name="Circular (Determinate)">
|
|
25
25
|
{#snippet template(args)}
|
|
26
|
-
<div class="flex items-center justify-center
|
|
26
|
+
<div class="p-spacing-300 flex items-center justify-center">
|
|
27
27
|
<CircularProgress percent={args.percent} />
|
|
28
28
|
</div>
|
|
29
29
|
{/snippet}
|
|
30
30
|
</Story>
|
|
31
31
|
|
|
32
32
|
<Story name="Circular (Indeterminate)" asChild>
|
|
33
|
-
<div class="flex items-center justify-center
|
|
33
|
+
<div class="p-spacing-300 flex items-center justify-center">
|
|
34
34
|
<CircularProgress />
|
|
35
35
|
</div>
|
|
36
36
|
</Story>
|
|
37
37
|
|
|
38
38
|
<Story name="Linear (Determinate)">
|
|
39
39
|
{#snippet template(args)}
|
|
40
|
-
<div class="flex items-center
|
|
40
|
+
<div class="p-spacing-300 flex items-center">
|
|
41
41
|
<LinearProgress percent={args.percent} class="w-full max-w-sm" />
|
|
42
42
|
</div>
|
|
43
43
|
{/snippet}
|
|
44
44
|
</Story>
|
|
45
45
|
|
|
46
46
|
<Story name="Linear (Indeterminate)" asChild>
|
|
47
|
-
<div class="flex items-center
|
|
47
|
+
<div class="p-spacing-300 flex items-center">
|
|
48
48
|
<LinearProgress class="w-full max-w-sm" />
|
|
49
49
|
</div>
|
|
50
50
|
</Story>
|
|
51
51
|
|
|
52
52
|
<Story name="Wavy (Determinate)">
|
|
53
53
|
{#snippet template(args)}
|
|
54
|
-
<div class="flex items-center
|
|
54
|
+
<div class="p-spacing-300 flex items-center">
|
|
55
55
|
<WavyLinearProgress percent={args.percent} class="w-full max-w-sm" />
|
|
56
56
|
</div>
|
|
57
57
|
{/snippet}
|
|
58
58
|
</Story>
|
|
59
59
|
|
|
60
60
|
<Story name="Wavy (Indeterminate)" asChild>
|
|
61
|
-
<div class="flex items-center
|
|
61
|
+
<div class="p-spacing-300 flex items-center">
|
|
62
62
|
<WavyLinearProgress class="w-full max-w-sm" />
|
|
63
63
|
</div>
|
|
64
64
|
</Story>
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Meta, Title, Subtitle, Canvas, Controls } from '@storybook/addon-docs/blocks';
|
|
2
|
+
import * as SnackbarStories from './Snackbar.stories.svelte';
|
|
3
|
+
|
|
4
|
+
<Meta of={SnackbarStories} />
|
|
5
|
+
|
|
6
|
+
<Title />
|
|
7
|
+
|
|
8
|
+
<Subtitle>
|
|
9
|
+
Snackbars show a brief message about an app process at the bottom of the screen.
|
|
10
|
+
</Subtitle>
|
|
11
|
+
|
|
12
|
+
[M3 spec](https://m3.material.io/components/snackbar/specs) ·
|
|
13
|
+
`import { Snackbar } from '@noxlovette/material';`
|
|
14
|
+
|
|
15
|
+
<Canvas of={SnackbarStories.Playground} />
|
|
16
|
+
|
|
17
|
+
<Controls of={SnackbarStories.Playground} />
|
|
18
|
+
|
|
19
|
+
## Showing a snackbar
|
|
20
|
+
|
|
21
|
+
There's no `toast()` function or queue. Mount one `Snackbar`, bind its `message`, and assign to
|
|
22
|
+
that state to show it:
|
|
23
|
+
|
|
24
|
+
```svelte
|
|
25
|
+
<script lang="ts">
|
|
26
|
+
import { Snackbar } from '@noxlovette/material';
|
|
27
|
+
|
|
28
|
+
let snackbarMessage = $state('');
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
<button onclick={() => (snackbarMessage = 'Changes saved.')}>Save</button>
|
|
32
|
+
|
|
33
|
+
<Snackbar bind:message={snackbarMessage} label="Undo" callback={undoSave} />
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
When `message` becomes non-empty (a string or a snippet), the snackbar slides in. After 4
|
|
37
|
+
seconds it hides and resets a string `message` to `''`, so the same text can be shown again. With
|
|
38
|
+
`static`, it stays until the user closes it.
|
|
39
|
+
|
|
40
|
+
`label` and `callback` add an action button.
|
|
41
|
+
|
|
42
|
+
<Canvas of={SnackbarStories.Triggered} />
|
|
43
|
+
|
|
44
|
+
<Canvas of={SnackbarStories.WithAction} />
|
|
45
|
+
|
|
46
|
+
## Accessibility
|
|
47
|
+
|
|
48
|
+
- **Timing.** A non-static snackbar disappears on its own, so never make it the only place
|
|
49
|
+
critical information appears.
|
|
50
|
+
- **Dismiss.** `showClose` (on by default) renders a close button labelled "Dismiss snackbar".
|
|
51
|
+
- **One at a time.** Mount one snackbar per region and drive it through one binding; stacking
|
|
52
|
+
instances isn't supported.
|
|
@@ -9,10 +9,6 @@
|
|
|
9
9
|
<script module lang="ts">
|
|
10
10
|
import { defineMeta } from '@storybook/addon-svelte-csf';
|
|
11
11
|
import Snackbar from './Snackbar.svelte';
|
|
12
|
-
</script>
|
|
13
|
-
|
|
14
|
-
<script lang="ts">
|
|
15
|
-
import Button from '../buttons/Button.svelte';
|
|
16
12
|
|
|
17
13
|
const { Story } = defineMeta({
|
|
18
14
|
title: 'Feedback/Snackbar',
|
|
@@ -28,6 +24,10 @@
|
|
|
28
24
|
static: false
|
|
29
25
|
}
|
|
30
26
|
});
|
|
27
|
+
</script>
|
|
28
|
+
|
|
29
|
+
<script lang="ts">
|
|
30
|
+
import Button from '../buttons/Button.svelte';
|
|
31
31
|
|
|
32
32
|
let playgroundMessage = $state('This is a snackbar message.');
|
|
33
33
|
let triggeredMessage = $state('');
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
</Story>
|
|
51
51
|
|
|
52
52
|
<Story name="Triggered" asChild>
|
|
53
|
-
<div class="relative flex min-h-32 flex-col items-center justify-center
|
|
53
|
+
<div class="gap-spacing-200 relative flex min-h-32 flex-col items-center justify-center">
|
|
54
54
|
<Button
|
|
55
55
|
variant="tonal"
|
|
56
56
|
onclick={() => {
|
|
@@ -88,7 +88,7 @@ Snackbars provide brief messages about app processes at the bottom of the screen
|
|
|
88
88
|
|
|
89
89
|
{#if showClose}
|
|
90
90
|
<button
|
|
91
|
-
class="relative rounded-full
|
|
91
|
+
class="p-spacing-50 relative rounded-full"
|
|
92
92
|
onclick={() => {
|
|
93
93
|
dismissed = true;
|
|
94
94
|
if (typeof message === 'string') {
|
|
@@ -2,7 +2,7 @@ import { type VariantProps } from 'tailwind-variants';
|
|
|
2
2
|
export type SnackBarVariants = VariantProps<typeof snackbar>;
|
|
3
3
|
export declare const snackbar: import("tailwind-variants").TVReturnType<{
|
|
4
4
|
fixed: {
|
|
5
|
-
true: "fixed bottom-20 md:bottom-
|
|
5
|
+
true: "fixed bottom-20 md:bottom-spacing-300 left-1/2 -translate-x-1/2";
|
|
6
6
|
false: "";
|
|
7
7
|
};
|
|
8
8
|
}, {
|
|
@@ -13,7 +13,7 @@ export declare const snackbar: import("tailwind-variants").TVReturnType<{
|
|
|
13
13
|
icon: string;
|
|
14
14
|
}, undefined, {
|
|
15
15
|
fixed: {
|
|
16
|
-
true: "fixed bottom-20 md:bottom-
|
|
16
|
+
true: "fixed bottom-20 md:bottom-spacing-300 left-1/2 -translate-x-1/2";
|
|
17
17
|
false: "";
|
|
18
18
|
};
|
|
19
19
|
}, {
|
|
@@ -24,7 +24,7 @@ export declare const snackbar: import("tailwind-variants").TVReturnType<{
|
|
|
24
24
|
icon: string;
|
|
25
25
|
}, import("tailwind-variants").TVReturnTypeLike<{
|
|
26
26
|
fixed: {
|
|
27
|
-
true: "fixed bottom-20 md:bottom-
|
|
27
|
+
true: "fixed bottom-20 md:bottom-spacing-300 left-1/2 -translate-x-1/2";
|
|
28
28
|
false: "";
|
|
29
29
|
};
|
|
30
30
|
}, {
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { tv } from 'tailwind-variants';
|
|
2
2
|
export const snackbar = tv({
|
|
3
3
|
slots: {
|
|
4
|
-
base: 'rounded-xs relative min-h-
|
|
5
|
-
label: 'text-md-sys-color-inverse-primary md-sys-typescale-label-large px-
|
|
4
|
+
base: 'rounded-xs relative min-h-spacing-600 md:max-h-17 flex z-[100] items-center bg-md-sys-color-inverse-surface shadow-elevation-3 pr-spacing-100 pl-spacing-200 justify-between h-max py-spacing-150',
|
|
5
|
+
label: 'text-md-sys-color-inverse-primary md-sys-typescale-label-large px-spacing-150 cursor-pointer ',
|
|
6
6
|
actionWrapper: 'flex items-center z-40',
|
|
7
7
|
supportingText: 'text-md-sys-color-inverse-on-surface md-sys-typescale-body-medium max-w-[60ch] ',
|
|
8
|
-
icon: 'size-
|
|
8
|
+
icon: 'size-spacing-300 text-[24px] text-md-sys-color-inverse-on-surface mr-spacing-50 ml-spacing-150'
|
|
9
9
|
},
|
|
10
10
|
variants: {
|
|
11
11
|
fixed: {
|
|
12
|
-
true: 'fixed bottom-20 md:bottom-
|
|
12
|
+
true: 'fixed bottom-20 md:bottom-spacing-300 left-1/2 -translate-x-1/2',
|
|
13
13
|
false: ''
|
|
14
14
|
}
|
|
15
15
|
}
|
|
@@ -25,7 +25,7 @@ and `sortDirection` props. Defaults to `scope="col"`.
|
|
|
25
25
|
</script>
|
|
26
26
|
|
|
27
27
|
<th {scope} class={header({ class: clsx(className) })} {...restProps}>
|
|
28
|
-
<span class="inline-flex items-center
|
|
28
|
+
<span class="gap-spacing-50 inline-flex items-center">
|
|
29
29
|
{@render children?.()}
|
|
30
30
|
{#if sortable}
|
|
31
31
|
<span
|
|
@@ -6,8 +6,8 @@ export const table = tv({
|
|
|
6
6
|
body: '[&_tr:last-child]:border-b-0',
|
|
7
7
|
foot: 'border-t border-md-sys-color-outline-variant',
|
|
8
8
|
row: 'border-b border-md-sys-color-outline-variant transition-colors md-sys-motion-fast-effects focus-visible:outline focus-visible:-outline-offset-2 focus-visible:outline-md-sys-color-primary',
|
|
9
|
-
cell: 'px-
|
|
10
|
-
header: 'px-
|
|
9
|
+
cell: 'px-spacing-200 py-spacing-150 align-middle',
|
|
10
|
+
header: 'px-spacing-200 py-spacing-200 align-middle md-sys-typescale-label-large text-md-sys-color-on-surface whitespace-nowrap'
|
|
11
11
|
},
|
|
12
12
|
variants: {
|
|
13
13
|
hoverable: {
|
|
@@ -43,7 +43,7 @@ export const table = tv({
|
|
|
43
43
|
},
|
|
44
44
|
sticky: {
|
|
45
45
|
true: {
|
|
46
|
-
head: 'sticky top-0 z-10 bg-md-sys-color-surface-container-high shadow-[0_1px_0_0_var(--md-sys-color-outline-variant)]'
|
|
46
|
+
head: 'sticky top-spacing-0 z-10 bg-md-sys-color-surface-container-high shadow-[0_1px_0_0_var(--md-sys-color-outline-variant)]'
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
const { Story } = defineMeta({
|
|
11
11
|
title: 'Time/TimeField',
|
|
12
|
+
tags: ['autodocs'],
|
|
12
13
|
component: TimeField,
|
|
13
14
|
argTypes: {
|
|
14
15
|
label: { control: 'text' },
|
|
@@ -28,14 +29,14 @@
|
|
|
28
29
|
|
|
29
30
|
<Story name="Playground">
|
|
30
31
|
{#snippet template(args)}
|
|
31
|
-
<div class="max-w-xs
|
|
32
|
+
<div class="p-spacing-400 max-w-xs">
|
|
32
33
|
<TimeField {...args} />
|
|
33
34
|
</div>
|
|
34
35
|
{/snippet}
|
|
35
36
|
</Story>
|
|
36
37
|
|
|
37
38
|
<Story name="Near Bottom Edge" asChild>
|
|
38
|
-
<div class="flex min-h-dvh max-w-xs flex-col justify-end
|
|
39
|
+
<div class="p-spacing-400 flex min-h-dvh max-w-xs flex-col justify-end">
|
|
39
40
|
<TimeField label="Time" value="18:45" />
|
|
40
41
|
</div>
|
|
41
42
|
</Story>
|
|
@@ -11,9 +11,11 @@ It combines a Material 3 Textfield with a TimepickerInput for intuitive time sel
|
|
|
11
11
|
import Textfield from '../forms/textfield/Textfield.svelte';
|
|
12
12
|
import TimepickerInput from './TimepickerInput.svelte';
|
|
13
13
|
import { Popover } from 'bits-ui';
|
|
14
|
+
import type { Snippet } from 'svelte';
|
|
15
|
+
import type { TimepickerLabels } from './types.js';
|
|
14
16
|
|
|
15
17
|
let {
|
|
16
|
-
label = '
|
|
18
|
+
label = 'Time',
|
|
17
19
|
value = $bindable(),
|
|
18
20
|
required = false,
|
|
19
21
|
disabled = false,
|
|
@@ -21,6 +23,8 @@ It combines a Material 3 Textfield with a TimepickerInput for intuitive time sel
|
|
|
21
23
|
datePickerTitle = 'Pick date',
|
|
22
24
|
name,
|
|
23
25
|
leadingIconProps,
|
|
26
|
+
supportingText,
|
|
27
|
+
pickerLabels,
|
|
24
28
|
...restProps
|
|
25
29
|
}: {
|
|
26
30
|
/** The label for the text field. */
|
|
@@ -39,6 +43,10 @@ It combines a Material 3 Textfield with a TimepickerInput for intuitive time sel
|
|
|
39
43
|
datePickerTitle?: string;
|
|
40
44
|
/** Props for the leading icon. */
|
|
41
45
|
leadingIconProps?: any;
|
|
46
|
+
/** Supporting text under the field. */
|
|
47
|
+
supportingText?: Snippet;
|
|
48
|
+
/** Headline, input and button strings for the picker overlay (English by default). */
|
|
49
|
+
pickerLabels?: TimepickerLabels;
|
|
42
50
|
} & HTMLInputAttributes = $props();
|
|
43
51
|
|
|
44
52
|
const id = $props.id();
|
|
@@ -58,21 +66,18 @@ It combines a Material 3 Textfield with a TimepickerInput for intuitive time sel
|
|
|
58
66
|
{error}
|
|
59
67
|
{leadingIconProps}
|
|
60
68
|
class="pointer-events-none"
|
|
61
|
-
trailingIconProps={{ name: '
|
|
69
|
+
trailingIconProps={{ name: 'schedule' }}
|
|
62
70
|
trailingOnClick={() => !disabled && (picker = !picker)}
|
|
71
|
+
{supportingText}
|
|
63
72
|
{...restProps as any}
|
|
64
|
-
|
|
65
|
-
{#snippet supportingText()}
|
|
66
|
-
ЧЧ-ММ
|
|
67
|
-
{/snippet}
|
|
68
|
-
</Textfield>
|
|
73
|
+
/>
|
|
69
74
|
|
|
70
75
|
<Popover.Trigger {disabled}>
|
|
71
76
|
{#snippet child({ props })}
|
|
72
77
|
<button
|
|
73
78
|
{...props}
|
|
74
79
|
title="time-overlay"
|
|
75
|
-
class="
|
|
80
|
+
class="inset-spacing-0 absolute cursor-pointer disabled:cursor-not-allowed"
|
|
76
81
|
type="button"
|
|
77
82
|
data-cy="calendar-time-toggle"
|
|
78
83
|
></button>
|
|
@@ -100,6 +105,7 @@ It combines a Material 3 Textfield with a TimepickerInput for intuitive time sel
|
|
|
100
105
|
{@attach presence(() => open, enterExit.scale)}
|
|
101
106
|
>
|
|
102
107
|
<TimepickerInput
|
|
108
|
+
{...pickerLabels}
|
|
103
109
|
time={value}
|
|
104
110
|
close={() => (picker = false)}
|
|
105
111
|
setTime={(t) => (value = t)}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { HTMLInputAttributes } from 'svelte/elements';
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import type { TimepickerLabels } from './types.js';
|
|
2
4
|
type $$ComponentProps = {
|
|
3
5
|
/** The label for the text field. */
|
|
4
6
|
label?: string;
|
|
@@ -16,6 +18,10 @@ type $$ComponentProps = {
|
|
|
16
18
|
datePickerTitle?: string;
|
|
17
19
|
/** Props for the leading icon. */
|
|
18
20
|
leadingIconProps?: any;
|
|
21
|
+
/** Supporting text under the field. */
|
|
22
|
+
supportingText?: Snippet;
|
|
23
|
+
/** Headline, input and button strings for the picker overlay (English by default). */
|
|
24
|
+
pickerLabels?: TimepickerLabels;
|
|
19
25
|
} & HTMLInputAttributes;
|
|
20
26
|
/**
|
|
21
27
|
* TimeField component provides a text input that opens a Timepicker overlay when interacted with.
|