@noxlovette/material 0.3.3 → 0.4.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/README.md +1 -0
- package/dist/actions/index.d.ts +1 -0
- package/dist/actions/index.js +1 -0
- package/dist/actions/rovingFocusGroup.d.ts +20 -0
- package/dist/actions/rovingFocusGroup.js +82 -0
- package/dist/components/badge/theme.d.ts +8 -8
- package/dist/components/buttons/button-group/ButtonGroup.stories.svelte +83 -0
- package/dist/components/buttons/button-group/ButtonGroup.stories.svelte.d.ts +19 -0
- package/dist/components/buttons/button-group/ButtonGroup.svelte +10 -29
- package/dist/components/buttons/button-group/ButtonGroup.svelte.d.ts +7 -3
- package/dist/components/buttons/button-group/index.d.ts +0 -1
- package/dist/components/buttons/button-group/index.js +3 -1
- package/dist/components/buttons/button-group/theme.d.ts +17 -103
- package/dist/components/buttons/button-group/theme.js +7 -35
- package/dist/components/buttons/button-group/types.d.ts +9 -20
- package/dist/components/buttons/connected/ConnectedButtonGroup.stories.svelte +118 -0
- package/dist/components/buttons/connected/ConnectedButtonGroup.stories.svelte.d.ts +19 -0
- package/dist/components/buttons/connected/ConnectedButtonGroup.svelte +52 -0
- package/dist/components/buttons/connected/ConnectedButtonGroup.svelte.d.ts +12 -0
- package/dist/components/buttons/connected/ConnectedButtonGroupItem.svelte +37 -0
- package/dist/components/buttons/connected/ConnectedButtonGroupItem.svelte.d.ts +9 -0
- package/dist/components/buttons/connected/index.d.ts +3 -1
- package/dist/components/buttons/connected/index.js +3 -1
- package/dist/components/buttons/connected/theme.d.ts +125 -0
- package/dist/components/buttons/connected/theme.js +38 -0
- package/dist/components/buttons/connected/types.d.ts +32 -13
- package/dist/components/buttons/index.d.ts +1 -0
- package/dist/components/buttons/index.js +1 -0
- package/dist/components/buttons/split-button/SplitButton.stories.svelte +103 -0
- package/dist/components/buttons/split-button/SplitButton.stories.svelte.d.ts +19 -0
- package/dist/components/buttons/split-button/SplitButton.svelte +104 -0
- package/dist/components/buttons/split-button/SplitButton.svelte.d.ts +19 -0
- package/dist/components/buttons/split-button/index.d.ts +3 -0
- package/dist/components/{containers/panes → buttons/split-button}/index.js +1 -3
- package/dist/components/buttons/split-button/theme.d.ts +35 -0
- package/dist/components/buttons/split-button/theme.js +26 -0
- package/dist/components/buttons/split-button/types.d.ts +33 -0
- package/dist/components/buttons/theme.d.ts +142 -142
- package/dist/components/buttons/theme.js +2 -2
- package/dist/components/cards/Card.stories.svelte +58 -0
- package/dist/components/cards/Card.stories.svelte.d.ts +2 -17
- package/dist/components/cards/Card.svelte +76 -8
- package/dist/components/cards/theme.d.ts +26 -14
- package/dist/components/cards/theme.js +5 -1
- package/dist/components/cards/types.d.ts +39 -1
- package/dist/components/chips/Chip.stories.svelte +64 -0
- package/dist/components/chips/Chip.stories.svelte.d.ts +19 -0
- package/dist/components/chips/Chip.svelte +115 -0
- package/dist/components/chips/Chip.svelte.d.ts +14 -0
- package/dist/components/chips/index.d.ts +3 -0
- package/dist/components/{containers/merger → chips}/index.js +2 -1
- package/dist/components/chips/theme.d.ts +78 -0
- package/dist/components/chips/theme.js +72 -0
- package/dist/components/chips/types.d.ts +43 -0
- package/dist/components/containers/action-rail/ActionRail.stories.svelte +36 -0
- package/dist/components/containers/{panes/SinglePane.stories.svelte.d.ts → action-rail/ActionRail.stories.svelte.d.ts} +4 -4
- package/dist/components/containers/action-rail/ActionRail.svelte +35 -0
- package/dist/components/containers/action-rail/ActionRail.svelte.d.ts +17 -0
- package/dist/components/containers/action-rail/index.d.ts +3 -0
- package/dist/components/containers/action-rail/index.js +6 -0
- package/dist/components/containers/action-rail/theme.d.ts +45 -0
- package/dist/components/containers/action-rail/theme.js +26 -0
- package/dist/components/containers/action-rail/types.d.ts +20 -0
- package/dist/components/containers/action-rail/types.js +1 -0
- package/dist/components/containers/app/App.svelte +6 -6
- package/dist/components/containers/app/App.svelte.d.ts +4 -2
- package/dist/components/containers/app/theme.d.ts +1 -1
- package/dist/components/containers/app/types.d.ts +9 -4
- package/dist/components/containers/bottom-sheet/BottomSheet.stories.svelte +1 -1
- package/dist/components/containers/bottom-sheet/BottomSheet.svelte +1 -1
- package/dist/components/containers/context-menu/ContextMenu.stories.svelte +44 -0
- package/dist/components/containers/context-menu/ContextMenu.svelte +21 -5
- package/dist/components/containers/context-menu/ContextMenu.svelte.d.ts +11 -0
- package/dist/components/containers/context-menu/theme.d.ts +20 -2
- package/dist/components/containers/context-menu/theme.js +31 -8
- package/dist/components/containers/context-menu/types.d.ts +14 -2
- package/dist/components/containers/dialogue/theme.d.ts +20 -20
- package/dist/components/containers/divider/theme.d.ts +17 -17
- package/dist/components/containers/index.d.ts +2 -3
- package/dist/components/containers/index.js +2 -3
- package/dist/components/containers/link-preview/theme.d.ts +11 -11
- package/dist/components/containers/list/theme.d.ts +14 -14
- package/dist/components/containers/list/theme.js +1 -1
- package/dist/components/containers/menu/Menu.stories.svelte +105 -3
- package/dist/components/containers/menu/Menu.stories.svelte.d.ts +2 -17
- package/dist/components/containers/menu/Menu.svelte +9 -7
- package/dist/components/containers/menu/MenuCheckboxItem.svelte +55 -0
- package/dist/components/containers/menu/MenuCheckboxItem.svelte.d.ts +25 -0
- package/dist/components/containers/menu/MenuGroup.svelte +43 -0
- package/dist/components/containers/menu/MenuGroup.svelte.d.ts +28 -0
- package/dist/components/containers/menu/MenuRadioGroup.svelte +39 -0
- package/dist/components/containers/menu/MenuRadioGroup.svelte.d.ts +27 -0
- package/dist/components/containers/menu/MenuRadioItem.svelte +49 -0
- package/dist/components/containers/menu/MenuRadioItem.svelte.d.ts +17 -0
- package/dist/components/containers/menu/MenuSub.svelte +91 -0
- package/dist/components/containers/menu/MenuSub.svelte.d.ts +29 -0
- package/dist/components/containers/menu/index.d.ts +7 -0
- package/dist/components/containers/menu/index.js +8 -0
- package/dist/components/containers/menu/menu-item/MenuItem.svelte +71 -0
- package/dist/components/containers/{menu-item → menu/menu-item}/MenuItem.svelte.d.ts +2 -1
- package/dist/components/containers/{menu-item → menu/menu-item}/types.d.ts +5 -1
- package/dist/components/containers/menu/menu-item/types.js +1 -0
- package/dist/components/containers/menu/theme.d.ts +68 -0
- package/dist/components/containers/menu/theme.js +36 -0
- package/dist/components/containers/menu/types.d.ts +113 -2
- package/dist/components/containers/pane/DraggablePane.stories.svelte +199 -0
- package/dist/components/containers/pane/DraggablePane.stories.svelte.d.ts +4 -0
- package/dist/components/containers/pane/DraggablePane.svelte +533 -0
- package/dist/components/containers/pane/DraggablePane.svelte.d.ts +29 -0
- package/dist/components/containers/pane/Pane.stories.svelte +104 -0
- package/dist/components/containers/pane/Pane.stories.svelte.d.ts +19 -0
- package/dist/components/containers/pane/Pane.svelte +78 -0
- package/dist/components/containers/pane/Pane.svelte.d.ts +18 -0
- package/dist/components/containers/pane/PaneGrid.stories.svelte +134 -0
- package/dist/components/containers/pane/PaneGrid.stories.svelte.d.ts +19 -0
- package/dist/components/containers/pane/PaneGrid.svelte +43 -0
- package/dist/components/containers/pane/PaneGrid.svelte.d.ts +13 -0
- package/dist/components/containers/pane/PaneHandle.svelte +90 -0
- package/dist/components/containers/pane/PaneHandle.svelte.d.ts +12 -0
- package/dist/components/containers/pane/dragStore.svelte.d.ts +16 -0
- package/dist/components/containers/pane/dragStore.svelte.js +38 -0
- package/dist/components/containers/pane/index.d.ts +8 -0
- package/dist/components/containers/pane/index.js +11 -0
- package/dist/components/containers/pane/resizeStore.svelte.d.ts +10 -0
- package/dist/components/containers/pane/resizeStore.svelte.js +30 -0
- package/dist/components/containers/pane/theme.d.ts +571 -0
- package/dist/components/containers/pane/theme.js +211 -0
- package/dist/components/containers/pane/types.d.ts +249 -0
- package/dist/components/containers/pane/types.js +1 -0
- package/dist/components/containers/popover/Popover.stories.svelte +4 -4
- package/dist/components/containers/popover/Popover.svelte +3 -1
- package/dist/components/containers/popover/theme.d.ts +20 -20
- package/dist/components/containers/popover/types.d.ts +6 -2
- package/dist/components/containers/scroll-area/theme.d.ts +2 -2
- package/dist/components/containers/side-sheet/SideSheet.stories.svelte +16 -24
- package/dist/components/containers/side-sheet/SideSheet.svelte +73 -7
- package/dist/components/containers/side-sheet/SideSheet.svelte.d.ts +5 -0
- package/dist/components/containers/stack/theme.d.ts +44 -44
- package/dist/components/date/DateField.stories.svelte +57 -0
- package/dist/components/{containers/panes/SplitPane.stories.svelte.d.ts → date/DateField.stories.svelte.d.ts} +4 -4
- package/dist/components/date/DateField.svelte +11 -2
- package/dist/components/date/DateRangeField.stories.svelte +53 -0
- package/dist/components/{containers/panes/SupportingPane.stories.svelte.d.ts → date/DateRangeField.stories.svelte.d.ts} +4 -4
- package/dist/components/date/DateRangeField.svelte +2 -1
- package/dist/components/date/theme.d.ts +73 -4
- package/dist/components/date/theme.js +95 -26
- package/dist/components/date/types.d.ts +5 -0
- package/dist/components/forms/checkbox/Checkbox.svelte +7 -9
- package/dist/components/forms/checkbox/theme.d.ts +8 -8
- package/dist/components/forms/checkbox/theme.js +31 -9
- package/dist/components/forms/command/theme.d.ts +35 -35
- package/dist/components/forms/pin/theme.d.ts +2 -2
- package/dist/components/forms/radio-group/theme.d.ts +2 -2
- package/dist/components/forms/search/theme.d.ts +8 -8
- package/dist/components/forms/select/Select.svelte +3 -2
- package/dist/components/forms/select/theme.d.ts +26 -2
- package/dist/components/forms/select/theme.js +56 -22
- package/dist/components/forms/slider/theme.d.ts +20 -20
- package/dist/components/forms/switch/theme.d.ts +2 -2
- package/dist/components/forms/textfield/Textfield.stories.svelte +22 -0
- package/dist/components/forms/textfield/Textfield.svelte +10 -1
- package/dist/components/forms/textfield/theme.d.ts +44 -2
- package/dist/components/forms/textfield/theme.js +56 -16
- package/dist/components/forms/toggle-group/ToggleGroup.svelte +2 -2
- package/dist/components/forms/toggle-group/ToggleGroup.svelte.d.ts +2 -2
- package/dist/components/forms/toggle-group/ToggleGroupItem.svelte +1 -1
- package/dist/components/forms/toggle-group/ToggleGroupItem.svelte.d.ts +1 -1
- package/dist/components/forms/toggle-group/theme.d.ts +16 -16
- package/dist/components/forms/toggle-group/types.d.ts +2 -2
- package/dist/components/forms/tooltip/Tooltip.svelte +1 -1
- package/dist/components/forms/tooltip/theme.d.ts +2 -2
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.js +1 -0
- package/dist/components/misc/Avatar.stories.svelte +8 -0
- package/dist/components/misc/Avatar.svelte +35 -10
- package/dist/components/misc/DicebearAvatarBuilder.d.ts +59 -0
- package/dist/components/misc/DicebearAvatarBuilder.js +115 -0
- package/dist/components/misc/ThemeSettings.svelte +1 -1
- package/dist/components/misc/ThemeSwitcher.svelte +2 -2
- package/dist/components/misc/dicebearStyles.d.ts +21 -0
- package/dist/components/misc/dicebearStyles.js +169 -0
- package/dist/components/misc/index.d.ts +3 -0
- package/dist/components/misc/index.js +3 -0
- package/dist/components/misc/materialAvatarPalette.d.ts +6 -0
- package/dist/components/misc/materialAvatarPalette.js +44 -0
- package/dist/components/misc/theme.d.ts +20 -2
- package/dist/components/misc/theme.js +7 -1
- package/dist/components/misc/types.d.ts +20 -2
- package/dist/components/nav/appbar/AppBar.stories.svelte +1 -1
- package/dist/components/nav/appbar/AppBar.svelte +46 -15
- package/dist/components/nav/appbar/AppBar.svelte.d.ts +5 -0
- package/dist/components/nav/appbar/theme.d.ts +20 -14
- package/dist/components/nav/appbar/theme.js +11 -7
- package/dist/components/nav/appbar/types.d.ts +3 -1
- package/dist/components/nav/breadcrumb/Breadcrumb.stories.svelte +50 -0
- package/dist/components/nav/breadcrumb/Breadcrumb.stories.svelte.d.ts +19 -0
- package/dist/components/nav/breadcrumb/Breadcrumb.svelte +46 -0
- package/dist/components/nav/breadcrumb/Breadcrumb.svelte.d.ts +13 -0
- package/dist/components/nav/breadcrumb/index.d.ts +3 -0
- package/dist/components/nav/breadcrumb/index.js +6 -0
- package/dist/components/nav/breadcrumb/theme.d.ts +84 -0
- package/dist/components/nav/breadcrumb/theme.js +35 -0
- package/dist/components/nav/breadcrumb/types.d.ts +14 -0
- package/dist/components/nav/breadcrumb/types.js +1 -0
- package/dist/components/nav/index.d.ts +1 -0
- package/dist/components/nav/index.js +1 -0
- package/dist/components/nav/navbar/theme.d.ts +19 -19
- package/dist/components/nav/rail/Rail.stories.svelte +1 -5
- package/dist/components/nav/rail/Rail.svelte +3 -25
- package/dist/components/nav/rail/theme.d.ts +4 -4
- package/dist/components/nav/rail/types.d.ts +0 -5
- package/dist/components/nav/tabs/TabHolder.svelte +2 -1
- package/dist/components/nav/tabs/theme.d.ts +21 -21
- package/dist/components/nav/tabs/theme.js +6 -0
- package/dist/components/nav/tabs/types.d.ts +2 -2
- package/dist/components/pill/theme.d.ts +35 -35
- package/dist/components/snackbar/theme.d.ts +8 -8
- package/dist/components/table/Table.stories.svelte +267 -0
- package/dist/components/table/Table.stories.svelte.d.ts +19 -0
- package/dist/components/table/Table.svelte +1 -1
- package/dist/components/table/TableBody.svelte +16 -3
- package/dist/components/table/TableBody.svelte.d.ts +5 -1
- package/dist/components/table/TableRow.svelte +1 -1
- package/dist/components/table/theme.d.ts +2 -2
- package/dist/components/table/theme.js +2 -2
- package/dist/components/table/types.d.ts +7 -0
- package/dist/components/time/theme.d.ts +29 -29
- package/dist/components/toolbar/Toolbar.stories.svelte +71 -0
- package/dist/components/toolbar/Toolbar.stories.svelte.d.ts +19 -0
- package/dist/components/toolbar/Toolbar.svelte +19 -3
- package/dist/components/toolbar/Toolbar.svelte.d.ts +8 -2
- package/dist/components/toolbar/ToolbarButton.svelte +28 -4
- package/dist/components/toolbar/ToolbarDivider.svelte +4 -3
- package/dist/components/toolbar/ToolbarGroup.svelte +7 -2
- package/dist/components/toolbar/ToolbarGroupItem.svelte +29 -4
- package/dist/components/toolbar/ToolbarSection.svelte +35 -0
- package/dist/components/toolbar/ToolbarSection.svelte.d.ts +9 -0
- package/dist/components/toolbar/ToolbarSpacer.svelte +18 -0
- package/dist/components/toolbar/ToolbarSpacer.svelte.d.ts +9 -0
- package/dist/components/toolbar/index.d.ts +2 -0
- package/dist/components/toolbar/index.js +2 -0
- package/dist/components/toolbar/theme.d.ts +36 -21
- package/dist/components/toolbar/theme.js +27 -11
- package/dist/components/toolbar/types.d.ts +37 -4
- package/dist/components/typography/body/theme.d.ts +14 -14
- package/dist/components/typography/display/theme.d.ts +14 -14
- package/dist/components/typography/headline/theme.d.ts +14 -14
- package/dist/components/typography/kbd/Kbd.stories.svelte +1 -1
- package/dist/components/typography/kbd/theme.d.ts +8 -8
- package/dist/components/typography/label/theme.d.ts +14 -14
- package/dist/components/typography/title/theme.d.ts +14 -14
- package/dist/styles/component.css +126 -4
- package/dist/styles/motion.css +6 -3
- package/dist/utils/Layer.svelte +7 -3
- package/dist/utils/Theme.svelte +20 -20
- package/dist/utils/ThemeScript.svelte +1 -1
- package/dist/utils/icon/theme.d.ts +14 -14
- package/dist/utils/theme.svelte.js +1 -1
- package/package.json +39 -38
- package/bin/install-skill.js +0 -29
- package/dist/components/buttons/button-group/ButtonGroupItem.svelte +0 -41
- package/dist/components/buttons/button-group/ButtonGroupItem.svelte.d.ts +0 -8
- package/dist/components/buttons/connected/ConnectedButtons.svelte +0 -14
- package/dist/components/buttons/connected/ConnectedButtons.svelte.d.ts +0 -8
- package/dist/components/containers/menu-item/MenuItem.svelte +0 -74
- package/dist/components/containers/merger/InputMerger.svelte +0 -24
- package/dist/components/containers/merger/InputMerger.svelte.d.ts +0 -14
- package/dist/components/containers/merger/index.d.ts +0 -2
- package/dist/components/containers/merger/theme.d.ts +0 -1
- package/dist/components/containers/merger/theme.js +0 -4
- package/dist/components/containers/panes/SinglePane.stories.svelte +0 -67
- package/dist/components/containers/panes/SinglePane.svelte +0 -32
- package/dist/components/containers/panes/SinglePane.svelte.d.ts +0 -5
- package/dist/components/containers/panes/SplitPane.stories.svelte +0 -124
- package/dist/components/containers/panes/SplitPane.svelte +0 -144
- package/dist/components/containers/panes/SplitPane.svelte.d.ts +0 -8
- package/dist/components/containers/panes/SupportingPane.stories.svelte +0 -113
- package/dist/components/containers/panes/SupportingPane.svelte +0 -175
- package/dist/components/containers/panes/SupportingPane.svelte.d.ts +0 -9
- package/dist/components/containers/panes/index.d.ts +0 -5
- package/dist/components/containers/panes/theme.d.ts +0 -490
- package/dist/components/containers/panes/theme.js +0 -185
- package/dist/components/containers/panes/types.d.ts +0 -108
- package/dist/components/nav/rail/RailNavContext.svelte +0 -14
- package/dist/components/nav/rail/RailNavContext.svelte.d.ts +0 -8
- /package/dist/components/{containers/menu-item → buttons/split-button}/types.js +0 -0
- /package/dist/components/{containers/panes → chips}/types.js +0 -0
- /package/dist/components/containers/{menu-item → menu/menu-item}/index.d.ts +0 -0
- /package/dist/components/containers/{menu-item → menu/menu-item}/index.js +0 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
A `MenuItem`-like row that opens a nested submenu panel on hover or press,
|
|
4
|
+
instead of firing a selection itself.
|
|
5
|
+
|
|
6
|
+
Wraps bits-ui's `DropdownMenu.Sub` + `SubTrigger` + `SubContent`. The
|
|
7
|
+
trigger row (`iconProps`/`helper`/`children` label) behaves like a
|
|
8
|
+
`MenuItem`; pass the nested rows — `MenuItem`, `MenuCheckboxItem`,
|
|
9
|
+
`MenuRadioItem`, `MenuGroup`, more `MenuSub`, etc. — as `submenu`.
|
|
10
|
+
|
|
11
|
+
@example
|
|
12
|
+
```svelte
|
|
13
|
+
<Menu label="File">
|
|
14
|
+
<MenuItem iconProps={{ name: 'draft' }}>New</MenuItem>
|
|
15
|
+
<MenuSub iconProps={{ name: 'ios_share' }}>
|
|
16
|
+
Share
|
|
17
|
+
{#snippet submenu()}
|
|
18
|
+
<MenuItem>Email</MenuItem>
|
|
19
|
+
<MenuItem>Link</MenuItem>
|
|
20
|
+
{/snippet}
|
|
21
|
+
</MenuSub>
|
|
22
|
+
</Menu>
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
@see https://m3.material.io/components/menus/guidelines
|
|
26
|
+
-->
|
|
27
|
+
<script lang="ts">
|
|
28
|
+
import { DropdownMenu } from 'bits-ui';
|
|
29
|
+
import clsx from 'clsx';
|
|
30
|
+
import Icon from '../../../utils/icon/Icon.svelte';
|
|
31
|
+
import Layer from '../../../utils/Layer.svelte';
|
|
32
|
+
import { menu as menuCls } from './theme.js';
|
|
33
|
+
import { enterExit } from '../../../animation/enterExit.js';
|
|
34
|
+
import { easeEmphasizedDecel } from '../../../animation/easing.js';
|
|
35
|
+
import type { MenuSubProps } from './types.js';
|
|
36
|
+
|
|
37
|
+
let {
|
|
38
|
+
iconProps,
|
|
39
|
+
disabled = false,
|
|
40
|
+
helper,
|
|
41
|
+
children,
|
|
42
|
+
submenu,
|
|
43
|
+
open = $bindable(false),
|
|
44
|
+
class: className,
|
|
45
|
+
submenuClass
|
|
46
|
+
}: MenuSubProps = $props();
|
|
47
|
+
|
|
48
|
+
const cls = $derived(menuCls());
|
|
49
|
+
</script>
|
|
50
|
+
|
|
51
|
+
<DropdownMenu.Sub bind:open>
|
|
52
|
+
<DropdownMenu.SubTrigger {disabled}>
|
|
53
|
+
{#snippet child({ props })}
|
|
54
|
+
<div {...props} class={cls.item({ class: className })}>
|
|
55
|
+
{#if iconProps}
|
|
56
|
+
<Icon class={cls.icon()} {...iconProps} />
|
|
57
|
+
{/if}
|
|
58
|
+
<div class={cls.itemContent()}>
|
|
59
|
+
{@render children()}
|
|
60
|
+
{#if helper}
|
|
61
|
+
<span class={cls.helper()}>{helper}</span>
|
|
62
|
+
{/if}
|
|
63
|
+
</div>
|
|
64
|
+
<Icon name="chevron_right" class={cls.rightSlot()} />
|
|
65
|
+
<Layer />
|
|
66
|
+
</div>
|
|
67
|
+
{/snippet}
|
|
68
|
+
</DropdownMenu.SubTrigger>
|
|
69
|
+
|
|
70
|
+
<DropdownMenu.Portal>
|
|
71
|
+
<DropdownMenu.SubContent forceMount sideOffset={4} class="z-100">
|
|
72
|
+
{#snippet child({ wrapperProps, props, open: isOpen })}
|
|
73
|
+
{#if isOpen}
|
|
74
|
+
<div {...wrapperProps} class={wrapperProps.class as any}>
|
|
75
|
+
<div
|
|
76
|
+
{...props}
|
|
77
|
+
class={clsx(cls.content(), props.class as any, submenuClass)}
|
|
78
|
+
transition:enterExit={{
|
|
79
|
+
duration: 200,
|
|
80
|
+
easing: easeEmphasizedDecel,
|
|
81
|
+
mode: 'scale'
|
|
82
|
+
}}
|
|
83
|
+
>
|
|
84
|
+
{@render submenu()}
|
|
85
|
+
</div>
|
|
86
|
+
</div>
|
|
87
|
+
{/if}
|
|
88
|
+
{/snippet}
|
|
89
|
+
</DropdownMenu.SubContent>
|
|
90
|
+
</DropdownMenu.Portal>
|
|
91
|
+
</DropdownMenu.Sub>
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { MenuSubProps } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* A `MenuItem`-like row that opens a nested submenu panel on hover or press,
|
|
4
|
+
* instead of firing a selection itself.
|
|
5
|
+
*
|
|
6
|
+
* Wraps bits-ui's `DropdownMenu.Sub` + `SubTrigger` + `SubContent`. The
|
|
7
|
+
* trigger row (`iconProps`/`helper`/`children` label) behaves like a
|
|
8
|
+
* `MenuItem`; pass the nested rows — `MenuItem`, `MenuCheckboxItem`,
|
|
9
|
+
* `MenuRadioItem`, `MenuGroup`, more `MenuSub`, etc. — as `submenu`.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```svelte
|
|
13
|
+
* <Menu label="File">
|
|
14
|
+
* <MenuItem iconProps={{ name: 'draft' }}>New</MenuItem>
|
|
15
|
+
* <MenuSub iconProps={{ name: 'ios_share' }}>
|
|
16
|
+
* Share
|
|
17
|
+
* {#snippet submenu()}
|
|
18
|
+
* <MenuItem>Email</MenuItem>
|
|
19
|
+
* <MenuItem>Link</MenuItem>
|
|
20
|
+
* {/snippet}
|
|
21
|
+
* </MenuSub>
|
|
22
|
+
* </Menu>
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* @see https://m3.material.io/components/menus/guidelines
|
|
26
|
+
*/
|
|
27
|
+
declare const MenuSub: import("svelte").Component<MenuSubProps, {}, "open">;
|
|
28
|
+
type MenuSub = ReturnType<typeof MenuSub>;
|
|
29
|
+
export default MenuSub;
|
|
@@ -1,2 +1,9 @@
|
|
|
1
|
+
export * from './menu-item/index.js';
|
|
2
|
+
export * from './theme.js';
|
|
1
3
|
export * from './types.js';
|
|
2
4
|
export { default as Menu } from './Menu.svelte';
|
|
5
|
+
export { default as MenuCheckboxItem } from './MenuCheckboxItem.svelte';
|
|
6
|
+
export { default as MenuGroup } from './MenuGroup.svelte';
|
|
7
|
+
export { default as MenuRadioGroup } from './MenuRadioGroup.svelte';
|
|
8
|
+
export { default as MenuRadioItem } from './MenuRadioItem.svelte';
|
|
9
|
+
export { default as MenuSub } from './MenuSub.svelte';
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
// THIS FILE IS AUTO-GENERATED BY scripts/generate-components-index.ts - DO NOT EDIT MANUALLY
|
|
2
|
+
// folder re-exports (export everything from these folders)
|
|
3
|
+
export * from './menu-item/index.js';
|
|
2
4
|
// re-export TS/JS modules from this folder
|
|
5
|
+
export * from './theme.js';
|
|
3
6
|
export * from './types.js';
|
|
4
7
|
// default exports for components in this folder
|
|
5
8
|
export { default as Menu } from './Menu.svelte';
|
|
9
|
+
export { default as MenuCheckboxItem } from './MenuCheckboxItem.svelte';
|
|
10
|
+
export { default as MenuGroup } from './MenuGroup.svelte';
|
|
11
|
+
export { default as MenuRadioGroup } from './MenuRadioGroup.svelte';
|
|
12
|
+
export { default as MenuRadioItem } from './MenuRadioItem.svelte';
|
|
13
|
+
export { default as MenuSub } from './MenuSub.svelte';
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
A single interactive row inside a `Menu`.
|
|
4
|
+
|
|
5
|
+
`MenuItem` is the leaf node of the menu system. It wraps bits-ui's
|
|
6
|
+
`DropdownMenu.Item` so each row automatically gets keyboard navigation,
|
|
7
|
+
focus management, and the ARIA `menuitem` role.
|
|
8
|
+
|
|
9
|
+
Pass `onclick` (or `onSelect`) for the action; use `iconProps` for a
|
|
10
|
+
leading icon and `helper` for a supporting line below the label.
|
|
11
|
+
|
|
12
|
+
Contrast with `Menu`, which is just the shell (open state + floating panel),
|
|
13
|
+
and `ContextMenu`, which owns its own item list and is right-click triggered.
|
|
14
|
+
|
|
15
|
+
@see https://m3.material.io/components/menus/guidelines
|
|
16
|
+
-->
|
|
17
|
+
<script lang="ts">
|
|
18
|
+
import type { MenuItemProps } from './types.js';
|
|
19
|
+
import type { DropdownMenuItemProps } from 'bits-ui';
|
|
20
|
+
import Icon from '../../../../utils/icon/Icon.svelte';
|
|
21
|
+
import Layer from '../../../../utils/Layer.svelte';
|
|
22
|
+
import { DropdownMenu } from 'bits-ui';
|
|
23
|
+
import { menu as menuCls } from '../theme.js';
|
|
24
|
+
|
|
25
|
+
let {
|
|
26
|
+
iconProps,
|
|
27
|
+
disabled = false,
|
|
28
|
+
onclick,
|
|
29
|
+
onSelect,
|
|
30
|
+
isGap,
|
|
31
|
+
selected,
|
|
32
|
+
helper,
|
|
33
|
+
children,
|
|
34
|
+
class: className,
|
|
35
|
+
...restProps
|
|
36
|
+
}: MenuItemProps & DropdownMenuItemProps = $props();
|
|
37
|
+
|
|
38
|
+
// bits-ui fires onSelect at the Item level; avoid wiring onclick to the
|
|
39
|
+
// native button as well or it would fire twice on every click.
|
|
40
|
+
const handleSelect = $derived(onSelect ?? (onclick ? () => onclick() : undefined));
|
|
41
|
+
|
|
42
|
+
const cls = $derived(menuCls({ selected }));
|
|
43
|
+
</script>
|
|
44
|
+
|
|
45
|
+
{#if !isGap}
|
|
46
|
+
<DropdownMenu.Item
|
|
47
|
+
{...restProps}
|
|
48
|
+
{disabled}
|
|
49
|
+
onSelect={handleSelect}
|
|
50
|
+
class={cls.item({ class: className as string })}
|
|
51
|
+
>
|
|
52
|
+
{#if iconProps}
|
|
53
|
+
<Icon class={cls.icon()} {...iconProps} />
|
|
54
|
+
{/if}
|
|
55
|
+
|
|
56
|
+
<div class={cls.itemContent()}>
|
|
57
|
+
{@render children()}
|
|
58
|
+
{#if helper}
|
|
59
|
+
<span class={cls.helper()}>
|
|
60
|
+
{helper}
|
|
61
|
+
</span>
|
|
62
|
+
{/if}
|
|
63
|
+
</div>
|
|
64
|
+
<Layer />
|
|
65
|
+
</DropdownMenu.Item>
|
|
66
|
+
{:else}
|
|
67
|
+
<!-- Render as a gap -->
|
|
68
|
+
<DropdownMenu.Item>
|
|
69
|
+
<hr class="h-1" />
|
|
70
|
+
</DropdownMenu.Item>
|
|
71
|
+
{/if}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { MenuItemProps } from './types.js';
|
|
2
|
-
type
|
|
2
|
+
import type { DropdownMenuItemProps } from 'bits-ui';
|
|
3
|
+
type $$ComponentProps = MenuItemProps & DropdownMenuItemProps;
|
|
3
4
|
/**
|
|
4
5
|
* A single interactive row inside a `Menu`.
|
|
5
6
|
*
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { IconProps } from '
|
|
1
|
+
import type { IconProps } from '../../../../utils/icon/types.js';
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
3
|
/**
|
|
4
4
|
* Props for the MenuItem component.
|
|
@@ -33,4 +33,8 @@ export interface MenuItemProps {
|
|
|
33
33
|
* The content of the menu item, typically a label.
|
|
34
34
|
*/
|
|
35
35
|
children: Snippet;
|
|
36
|
+
/**
|
|
37
|
+
* Whether this item is in fact a gap
|
|
38
|
+
*/
|
|
39
|
+
isGap?: boolean;
|
|
36
40
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { type VariantProps } from 'tailwind-variants';
|
|
2
|
+
/**
|
|
3
|
+
* Shared styling for every row-shaped element inside a `Menu`'s floating
|
|
4
|
+
* panel: `MenuItem`, `MenuCheckboxItem`, `MenuRadioItem`, and `MenuSub`'s
|
|
5
|
+
* trigger row all pull from this one `tv()` so they stay visually identical.
|
|
6
|
+
*/
|
|
7
|
+
export type MenuVariants = VariantProps<typeof menu>;
|
|
8
|
+
export declare const menu: import("tailwind-variants").TVReturnType<{
|
|
9
|
+
selected: {
|
|
10
|
+
true: {
|
|
11
|
+
item: string;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
checked: {
|
|
15
|
+
true: {
|
|
16
|
+
indicator: string;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
}, {
|
|
20
|
+
content: string;
|
|
21
|
+
item: string;
|
|
22
|
+
icon: string;
|
|
23
|
+
indicator: string;
|
|
24
|
+
itemContent: string;
|
|
25
|
+
helper: string;
|
|
26
|
+
rightSlot: string;
|
|
27
|
+
groupHeading: string;
|
|
28
|
+
}, undefined, {
|
|
29
|
+
selected: {
|
|
30
|
+
true: {
|
|
31
|
+
item: string;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
checked: {
|
|
35
|
+
true: {
|
|
36
|
+
indicator: string;
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
}, {
|
|
40
|
+
content: string;
|
|
41
|
+
item: string;
|
|
42
|
+
icon: string;
|
|
43
|
+
indicator: string;
|
|
44
|
+
itemContent: string;
|
|
45
|
+
helper: string;
|
|
46
|
+
rightSlot: string;
|
|
47
|
+
groupHeading: string;
|
|
48
|
+
}, import("tailwind-variants").TVReturnTypeLike<{
|
|
49
|
+
selected: {
|
|
50
|
+
true: {
|
|
51
|
+
item: string;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
checked: {
|
|
55
|
+
true: {
|
|
56
|
+
indicator: string;
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
}, {
|
|
60
|
+
content: string;
|
|
61
|
+
item: string;
|
|
62
|
+
icon: string;
|
|
63
|
+
indicator: string;
|
|
64
|
+
itemContent: string;
|
|
65
|
+
helper: string;
|
|
66
|
+
rightSlot: string;
|
|
67
|
+
groupHeading: string;
|
|
68
|
+
}>>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { tv } from 'tailwind-variants';
|
|
2
|
+
export const menu = tv({
|
|
3
|
+
slots: {
|
|
4
|
+
content: `
|
|
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-1
|
|
7
|
+
overflow-y-auto rounded-lg px-2 py-1
|
|
8
|
+
`,
|
|
9
|
+
item: `
|
|
10
|
+
rounded-sm h-11 relative flex w-full cursor-pointer items-center gap-2 px-3 py-2
|
|
11
|
+
md-sys-typescale-body-medium whitespace-nowrap text-md-sys-color-on-surface
|
|
12
|
+
hover:bg-md-sys-color-on-surface/8 data-[highlighted]:bg-md-sys-color-on-surface/8
|
|
13
|
+
focus-visible:outline-2 focus-visible:outline-offset-2
|
|
14
|
+
focus-visible:outline-md-sys-color-primary
|
|
15
|
+
data-[disabled]:cursor-not-allowed data-[disabled]:opacity-38
|
|
16
|
+
`,
|
|
17
|
+
icon: 'text-md-sys-color-on-surface-variant size-5 text-[20px] shrink-0',
|
|
18
|
+
indicator: 'size-5 text-[20px] shrink-0 text-md-sys-color-on-surface-variant',
|
|
19
|
+
itemContent: 'flex flex-1 flex-col gap-1 text-left min-w-0',
|
|
20
|
+
helper: 'md-sys-typescale-body-medium text-md-sys-color-on-surface-variant',
|
|
21
|
+
rightSlot: 'text-md-sys-color-on-surface-variant size-5 text-[20px] shrink-0',
|
|
22
|
+
groupHeading: 'px-3 pt-2 pb-1 md-sys-typescale-label-medium text-md-sys-color-primary'
|
|
23
|
+
},
|
|
24
|
+
variants: {
|
|
25
|
+
selected: {
|
|
26
|
+
true: {
|
|
27
|
+
item: 'bg-md-sys-color-secondary-container rounded-lg text-md-sys-color-on-secondary-container'
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
checked: {
|
|
31
|
+
true: {
|
|
32
|
+
indicator: 'text-md-sys-color-primary'
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
});
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { IconProps } from '../../../utils/icon/types.js';
|
|
1
2
|
import type { Snippet } from 'svelte';
|
|
2
3
|
/**
|
|
3
4
|
* Props for the Menu component.
|
|
@@ -18,9 +19,11 @@ export type MenuProps = {
|
|
|
18
19
|
children: Snippet;
|
|
19
20
|
/**
|
|
20
21
|
* Custom trigger element. When omitted, a default filled `Button` labelled
|
|
21
|
-
* by `label` is used.
|
|
22
|
+
* by `label` is used. Receives the trigger's props — spread them onto the
|
|
23
|
+
* rendered element/component so bits-ui doesn't wrap it in its own
|
|
24
|
+
* `<button>` (which would nest buttons).
|
|
22
25
|
*/
|
|
23
|
-
trigger?: Snippet
|
|
26
|
+
trigger?: Snippet<[Record<string, unknown>]>;
|
|
24
27
|
/**
|
|
25
28
|
* Label for the default button trigger. Ignored when `trigger` is provided.
|
|
26
29
|
* @default 'Open menu'
|
|
@@ -38,3 +41,111 @@ export type MenuProps = {
|
|
|
38
41
|
/** Additional CSS classes applied to the floating content panel. */
|
|
39
42
|
class?: string;
|
|
40
43
|
};
|
|
44
|
+
/**
|
|
45
|
+
* Props for `MenuGroup`, which wraps related `MenuItem`s (or
|
|
46
|
+
* `MenuCheckboxItem`/`MenuRadioItem`s) under an optional heading so screen
|
|
47
|
+
* readers announce them as a labelled set.
|
|
48
|
+
*/
|
|
49
|
+
export type MenuGroupProps = {
|
|
50
|
+
/** Optional label rendered above the group's items. */
|
|
51
|
+
heading?: string;
|
|
52
|
+
/** Items inside the group. */
|
|
53
|
+
children: Snippet;
|
|
54
|
+
/** Additional CSS classes applied to the group container. */
|
|
55
|
+
class?: string;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Props for `MenuRadioGroup`, which restricts its `MenuRadioItem` children
|
|
59
|
+
* to a single selected value at a time.
|
|
60
|
+
*/
|
|
61
|
+
export type MenuRadioGroupProps = {
|
|
62
|
+
/**
|
|
63
|
+
* The value of the currently selected radio item.
|
|
64
|
+
* Supports two-way binding with `bind:value`.
|
|
65
|
+
*/
|
|
66
|
+
value?: string;
|
|
67
|
+
/** Called when the selected value changes. */
|
|
68
|
+
onValueChange?: (value: string) => void;
|
|
69
|
+
/** `MenuRadioItem`s inside the group. */
|
|
70
|
+
children: Snippet;
|
|
71
|
+
/** Additional CSS classes applied to the group container. */
|
|
72
|
+
class?: string;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Props for a single option inside a `MenuRadioGroup`.
|
|
76
|
+
*/
|
|
77
|
+
export type MenuRadioItemProps = {
|
|
78
|
+
/** The value this item represents within its `MenuRadioGroup`. */
|
|
79
|
+
value: string;
|
|
80
|
+
/**
|
|
81
|
+
* Whether the item is disabled.
|
|
82
|
+
* @default false
|
|
83
|
+
*/
|
|
84
|
+
disabled?: boolean;
|
|
85
|
+
/** Optional supporting text shown below the label. */
|
|
86
|
+
helper?: string;
|
|
87
|
+
/** The item's label. */
|
|
88
|
+
children: Snippet;
|
|
89
|
+
/**
|
|
90
|
+
* Whether the menu closes when this item is selected.
|
|
91
|
+
* @default true
|
|
92
|
+
*/
|
|
93
|
+
closeOnSelect?: boolean;
|
|
94
|
+
/** Additional CSS classes applied to the item row. */
|
|
95
|
+
class?: string;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Props for a toggleable option inside a `Menu`, independent of any other
|
|
99
|
+
* item (unlike `MenuRadioItem`, any number of `MenuCheckboxItem`s can be
|
|
100
|
+
* checked at once).
|
|
101
|
+
*/
|
|
102
|
+
export type MenuCheckboxItemProps = {
|
|
103
|
+
/**
|
|
104
|
+
* The checked state. Supports two-way binding with `bind:checked`.
|
|
105
|
+
* @default false
|
|
106
|
+
*/
|
|
107
|
+
checked?: boolean;
|
|
108
|
+
/** Called when the checked state changes. */
|
|
109
|
+
onCheckedChange?: (checked: boolean) => void;
|
|
110
|
+
/**
|
|
111
|
+
* Whether the item is disabled.
|
|
112
|
+
* @default false
|
|
113
|
+
*/
|
|
114
|
+
disabled?: boolean;
|
|
115
|
+
/** Optional supporting text shown below the label. */
|
|
116
|
+
helper?: string;
|
|
117
|
+
/** The item's label. */
|
|
118
|
+
children: Snippet;
|
|
119
|
+
/**
|
|
120
|
+
* Whether the menu closes when this item is selected.
|
|
121
|
+
* @default true
|
|
122
|
+
*/
|
|
123
|
+
closeOnSelect?: boolean;
|
|
124
|
+
/** Additional CSS classes applied to the item row. */
|
|
125
|
+
class?: string;
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* Props for `MenuSub`, a `MenuItem`-like row that opens a nested submenu
|
|
129
|
+
* panel on hover/click instead of firing a selection.
|
|
130
|
+
*/
|
|
131
|
+
export type MenuSubProps = {
|
|
132
|
+
/** Props for the trigger row's leading icon. */
|
|
133
|
+
iconProps?: IconProps;
|
|
134
|
+
/**
|
|
135
|
+
* Whether the submenu trigger is disabled.
|
|
136
|
+
* @default false
|
|
137
|
+
*/
|
|
138
|
+
disabled?: boolean;
|
|
139
|
+
/** Optional supporting text shown below the trigger's label. */
|
|
140
|
+
helper?: string;
|
|
141
|
+
/** The trigger row's label. */
|
|
142
|
+
children: Snippet;
|
|
143
|
+
/** Items rendered inside the nested submenu panel. */
|
|
144
|
+
submenu: Snippet;
|
|
145
|
+
/** Controlled open state for the submenu. */
|
|
146
|
+
open?: boolean;
|
|
147
|
+
/** Additional CSS classes applied to the trigger row. */
|
|
148
|
+
class?: string;
|
|
149
|
+
/** Additional CSS classes applied to the submenu's floating panel. */
|
|
150
|
+
submenuClass?: string;
|
|
151
|
+
};
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
<script module lang="ts">
|
|
2
|
+
import { defineMeta } from '@storybook/addon-svelte-csf';
|
|
3
|
+
import DraggablePane from './DraggablePane.svelte';
|
|
4
|
+
|
|
5
|
+
const { Story } = defineMeta({
|
|
6
|
+
title: 'Containers/DraggablePane',
|
|
7
|
+
component: DraggablePane,
|
|
8
|
+
argTypes: {
|
|
9
|
+
title: { control: 'text' },
|
|
10
|
+
disableDrag: { control: 'boolean' }
|
|
11
|
+
},
|
|
12
|
+
args: {
|
|
13
|
+
title: 'Inspector',
|
|
14
|
+
disableDrag: false
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
<script lang="ts">
|
|
20
|
+
let boundedEl: HTMLDivElement | undefined = $state();
|
|
21
|
+
let boundedX: number | undefined = $state();
|
|
22
|
+
let boundedY: number | undefined = $state();
|
|
23
|
+
|
|
24
|
+
// DraggablePane positions with `position: fixed` (viewport coordinates), so
|
|
25
|
+
// seed x/y from the container's own rect rather than an arbitrary offset —
|
|
26
|
+
// `bounds` only clamps the drag, it doesn't reposition the panel into the box.
|
|
27
|
+
$effect(() => {
|
|
28
|
+
if (boundedEl && boundedX === undefined) {
|
|
29
|
+
const rect = boundedEl.getBoundingClientRect();
|
|
30
|
+
boundedX = rect.left + 16;
|
|
31
|
+
boundedY = rect.top + 16;
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
</script>
|
|
35
|
+
|
|
36
|
+
<!--
|
|
37
|
+
Bare `position: fixed` panel — drag the header around the Storybook canvas
|
|
38
|
+
by pointer or, once focused, the arrow keys (shift for a bigger step).
|
|
39
|
+
-->
|
|
40
|
+
<Story name="Playground">
|
|
41
|
+
{#snippet template(args)}
|
|
42
|
+
<DraggablePane title={args.title} disableDrag={args.disableDrag} initialX={32} initialY={32}>
|
|
43
|
+
<p class="md-sys-typescale-body-medium text-md-sys-color-on-surface-variant w-56">
|
|
44
|
+
Drag the header to move this panel. Its position is bindable via <code>x</code>/<code
|
|
45
|
+
>y</code
|
|
46
|
+
>.
|
|
47
|
+
</p>
|
|
48
|
+
</DraggablePane>
|
|
49
|
+
{/snippet}
|
|
50
|
+
</Story>
|
|
51
|
+
|
|
52
|
+
<!-- A closable pane, and a second one demonstrating `persistKey` position persistence. -->
|
|
53
|
+
<Story name="Closable + Persisted" asChild>
|
|
54
|
+
<DraggablePane title="Closable" initialX={32} initialY={32} onClose={() => {}}>
|
|
55
|
+
<p class="md-sys-typescale-body-medium text-md-sys-color-on-surface-variant w-56">
|
|
56
|
+
Has a close button in its header.
|
|
57
|
+
</p>
|
|
58
|
+
</DraggablePane>
|
|
59
|
+
<DraggablePane
|
|
60
|
+
title="Remembers position"
|
|
61
|
+
initialX={340}
|
|
62
|
+
initialY={32}
|
|
63
|
+
persistKey="storybook-draggable-pane-demo"
|
|
64
|
+
>
|
|
65
|
+
<p class="md-sys-typescale-body-medium text-md-sys-color-on-surface-variant w-56">
|
|
66
|
+
Drag me, then reload the story — <code>persistKey</code> saves the position to
|
|
67
|
+
<code>localStorage</code>.
|
|
68
|
+
</p>
|
|
69
|
+
</DraggablePane>
|
|
70
|
+
</Story>
|
|
71
|
+
|
|
72
|
+
<!--
|
|
73
|
+
`onClickOutside` fires on any click landing outside the panel — wired to
|
|
74
|
+
`onClose` here, so clicking the surrounding canvas dismisses it.
|
|
75
|
+
-->
|
|
76
|
+
<Story name="Close On Outside Click" asChild>
|
|
77
|
+
<DraggablePane
|
|
78
|
+
title="Click outside to close"
|
|
79
|
+
initialX={32}
|
|
80
|
+
initialY={32}
|
|
81
|
+
onClose={() => console.log('DraggablePane closed')}
|
|
82
|
+
onClickOutside={() => console.log('DraggablePane: click outside')}
|
|
83
|
+
>
|
|
84
|
+
<p class="md-sys-typescale-body-medium text-md-sys-color-on-surface-variant w-56">
|
|
85
|
+
Click anywhere outside this panel (or the close button) to dismiss it.
|
|
86
|
+
</p>
|
|
87
|
+
</DraggablePane>
|
|
88
|
+
</Story>
|
|
89
|
+
|
|
90
|
+
<!-- Custom header content via the `header` snippet instead of `title`/`onClose`. -->
|
|
91
|
+
<Story name="Custom Header" asChild>
|
|
92
|
+
<DraggablePane initialX={32} initialY={32}>
|
|
93
|
+
{#snippet header()}
|
|
94
|
+
<span
|
|
95
|
+
class="md-sys-typescale-label-large text-md-sys-color-on-surface flex-1 truncate px-1 py-1"
|
|
96
|
+
>
|
|
97
|
+
⠿ Custom drag handle
|
|
98
|
+
</span>
|
|
99
|
+
{/snippet}
|
|
100
|
+
<p class="md-sys-typescale-body-medium text-md-sys-color-on-surface-variant w-56">
|
|
101
|
+
The default grip/title/close row is fully replaceable.
|
|
102
|
+
</p>
|
|
103
|
+
</DraggablePane>
|
|
104
|
+
</Story>
|
|
105
|
+
|
|
106
|
+
<!--
|
|
107
|
+
`bounds` clamps dragging to a given element's current rect instead of the
|
|
108
|
+
viewport — here, the dashed container below.
|
|
109
|
+
-->
|
|
110
|
+
<Story name="Bounded To Container">
|
|
111
|
+
{#snippet template()}
|
|
112
|
+
<div
|
|
113
|
+
bind:this={boundedEl}
|
|
114
|
+
class="border-md-sys-color-outline relative h-[320px] w-full overflow-hidden rounded-lg border border-dashed"
|
|
115
|
+
>
|
|
116
|
+
{#if boundedEl && boundedX !== undefined && boundedY !== undefined}
|
|
117
|
+
<DraggablePane title="Confined" bind:x={boundedX} bind:y={boundedY} bounds={boundedEl}>
|
|
118
|
+
<p class="md-sys-typescale-body-medium text-md-sys-color-on-surface-variant w-48">
|
|
119
|
+
Can't leave this box.
|
|
120
|
+
</p>
|
|
121
|
+
</DraggablePane>
|
|
122
|
+
{/if}
|
|
123
|
+
</div>
|
|
124
|
+
{/snippet}
|
|
125
|
+
</Story>
|
|
126
|
+
|
|
127
|
+
<!--
|
|
128
|
+
`resizable` adds edge/corner handles (pointer drag, or arrow keys once an
|
|
129
|
+
edge handle is focused). `minWidth`/`minHeight` are the safety net that
|
|
130
|
+
keeps a resize from shrinking the panel into uselessness; `maxWidth`/
|
|
131
|
+
`maxHeight` cap the other direction (both are also implicitly capped by
|
|
132
|
+
`bounds`, the viewport here).
|
|
133
|
+
-->
|
|
134
|
+
<Story name="Resizable" asChild>
|
|
135
|
+
<DraggablePane
|
|
136
|
+
title="Resizable"
|
|
137
|
+
initialX={32}
|
|
138
|
+
initialY={32}
|
|
139
|
+
resizable
|
|
140
|
+
minWidth={220}
|
|
141
|
+
minHeight={140}
|
|
142
|
+
maxWidth={520}
|
|
143
|
+
maxHeight={420}
|
|
144
|
+
>
|
|
145
|
+
<p class="md-sys-typescale-body-medium text-md-sys-color-on-surface-variant">
|
|
146
|
+
Drag any edge or corner to resize. Can't go below 220×140, or above 520×420.
|
|
147
|
+
</p>
|
|
148
|
+
</DraggablePane>
|
|
149
|
+
</Story>
|
|
150
|
+
|
|
151
|
+
<!--
|
|
152
|
+
Content-sized (no `height`) is the default — but content taller than the
|
|
153
|
+
viewport still carries a standing `max-height` (`bounds` minus
|
|
154
|
+
`boundsPadding`, see the component doc comment), so it scrolls internally
|
|
155
|
+
instead of rendering off-screen with the bottom of the panel unreachable.
|
|
156
|
+
-->
|
|
157
|
+
<Story name="Content Overflow (Unbounded)" asChild>
|
|
158
|
+
<DraggablePane title="Long Form">
|
|
159
|
+
<div
|
|
160
|
+
class="md-sys-typescale-body-medium text-md-sys-color-on-surface-variant flex w-56 flex-col gap-3"
|
|
161
|
+
>
|
|
162
|
+
{#each Array(30) as _, i (i)}
|
|
163
|
+
<p>
|
|
164
|
+
Field {i + 1} — this panel never sets `height`, yet can't render taller than the viewport.
|
|
165
|
+
</p>
|
|
166
|
+
{/each}
|
|
167
|
+
</div>
|
|
168
|
+
</DraggablePane>
|
|
169
|
+
</Story>
|
|
170
|
+
|
|
171
|
+
<!--
|
|
172
|
+
A fixed `height` turns the content area into an internal scroll region
|
|
173
|
+
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-height: auto` lets it grow past its flex-basis and overflow the fixed-
|
|
176
|
+
height panel instead of scrolling internally.
|
|
177
|
+
-->
|
|
178
|
+
<Story name="Scrollable Content" asChild>
|
|
179
|
+
<DraggablePane title="Long List" initialX={32} initialY={32} height={240} width={280}>
|
|
180
|
+
<ul class="md-sys-typescale-body-medium text-md-sys-color-on-surface-variant">
|
|
181
|
+
{#each Array(40) as _, i (i)}
|
|
182
|
+
<li>Item {i + 1}</li>
|
|
183
|
+
{/each}
|
|
184
|
+
</ul>
|
|
185
|
+
</DraggablePane>
|
|
186
|
+
</Story>
|
|
187
|
+
|
|
188
|
+
<!--
|
|
189
|
+
`collapsible` adds a minimize button that docks the pane into a small pill
|
|
190
|
+
at `minimizedCorner` (default bottom-left) showing `minimizedTitle` (falls
|
|
191
|
+
back to `title`); clicking the pill restores it at its previous position.
|
|
192
|
+
-->
|
|
193
|
+
<Story name="Collapsible" asChild>
|
|
194
|
+
<DraggablePane title="Mini Player" initialX={32} initialY={32} collapsible resizable>
|
|
195
|
+
<p class="md-sys-typescale-body-medium text-md-sys-color-on-surface-variant w-56">
|
|
196
|
+
Click the minimize icon in the header to collapse this into a pill in the bottom-left corner.
|
|
197
|
+
</p>
|
|
198
|
+
</DraggablePane>
|
|
199
|
+
</Story>
|