lutra 0.0.33 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -24
- package/dist/components/AspectRatio.svelte +26 -0
- package/dist/components/AspectRatio.svelte.d.ts +8 -0
- package/dist/components/Dialog.svelte +78 -0
- package/dist/components/Dialog.svelte.d.ts +14 -0
- package/dist/components/Layout.svelte +32 -0
- package/dist/components/Layout.svelte.d.ts +11 -0
- package/dist/components/PageContent.svelte +108 -0
- package/dist/components/PageContent.svelte.d.ts +38 -0
- package/dist/components/Theme.svelte +87 -0
- package/dist/components/Theme.svelte.d.ts +17 -0
- package/dist/{display → components}/Tooltip.svelte +33 -8
- package/dist/components/Tooltip.svelte.d.ts +12 -0
- package/dist/config.d.ts +30 -0
- package/dist/config.js +18 -0
- package/dist/css/0-layers.css +1 -0
- package/dist/css/1-props.css +775 -0
- package/dist/css/2-base.css +209 -0
- package/dist/css/3-typo.css +65 -0
- package/dist/css/4-layout.css +5 -0
- package/dist/css/5-media.css +21 -0
- package/dist/css/lutra.css +6 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.js +5 -2
- package/dist/types.d.ts +39 -0
- package/dist/types.js +25 -0
- package/package.json +29 -82
- package/dist/color.css +0 -0
- package/dist/display/Avatar.svelte +0 -61
- package/dist/display/Avatar.svelte.d.ts +0 -19
- package/dist/display/Badge.svelte +0 -91
- package/dist/display/Badge.svelte.d.ts +0 -30
- package/dist/display/Callout.svelte +0 -109
- package/dist/display/Callout.svelte.d.ts +0 -28
- package/dist/display/Close.svelte +0 -58
- package/dist/display/Close.svelte.d.ts +0 -18
- package/dist/display/Code.svelte +0 -190
- package/dist/display/Code.svelte.d.ts +0 -32
- package/dist/display/ContextTip.svelte +0 -23
- package/dist/display/ContextTip.svelte.d.ts +0 -18
- package/dist/display/DataList.svelte +0 -16
- package/dist/display/DataList.svelte.d.ts +0 -21
- package/dist/display/Details.svelte +0 -49
- package/dist/display/Details.svelte.d.ts +0 -27
- package/dist/display/Hero.svelte +0 -50
- package/dist/display/Hero.svelte.d.ts +0 -26
- package/dist/display/Icon.svelte +0 -39
- package/dist/display/Icon.svelte.d.ts +0 -19
- package/dist/display/IconButton.svelte +0 -91
- package/dist/display/IconButton.svelte.d.ts +0 -27
- package/dist/display/Image.svelte +0 -91
- package/dist/display/Image.svelte.d.ts +0 -26
- package/dist/display/Indicator.svelte +0 -352
- package/dist/display/Indicator.svelte.d.ts +0 -23
- package/dist/display/Inset.svelte +0 -18
- package/dist/display/Inset.svelte.d.ts +0 -18
- package/dist/display/LineChart.svelte +0 -385
- package/dist/display/LineChart.svelte.d.ts +0 -24
- package/dist/display/LoadingIndicator.svelte +0 -33
- package/dist/display/LoadingIndicator.svelte.d.ts +0 -15
- package/dist/display/Modal.svelte +0 -116
- package/dist/display/Modal.svelte.d.ts +0 -27
- package/dist/display/Notification.svelte +0 -104
- package/dist/display/Notification.svelte.d.ts +0 -23
- package/dist/display/Panel.svelte +0 -23
- package/dist/display/Panel.svelte.d.ts +0 -19
- package/dist/display/Popup.svelte +0 -111
- package/dist/display/Popup.svelte.d.ts +0 -25
- package/dist/display/Stat.svelte +0 -81
- package/dist/display/Stat.svelte.d.ts +0 -30
- package/dist/display/Table.svelte +0 -28
- package/dist/display/Table.svelte.d.ts +0 -24
- package/dist/display/TablePaginator.svelte +0 -51
- package/dist/display/TablePaginator.svelte.d.ts +0 -21
- package/dist/display/Tag.svelte +0 -90
- package/dist/display/Tag.svelte.d.ts +0 -32
- package/dist/display/Tooltip.svelte.d.ts +0 -23
- package/dist/display/chart.d.ts +0 -78
- package/dist/display/chart.js +0 -212
- package/dist/display/index.d.ts +0 -24
- package/dist/display/index.js +0 -24
- package/dist/display/notifications.svelte.d.ts +0 -21
- package/dist/display/notifications.svelte.js +0 -31
- package/dist/form/Button.svelte +0 -39
- package/dist/form/Button.svelte.d.ts +0 -26
- package/dist/form/FieldActions.svelte +0 -68
- package/dist/form/FieldActions.svelte.d.ts +0 -20
- package/dist/form/FieldContainer.svelte +0 -37
- package/dist/form/FieldContainer.svelte.d.ts +0 -19
- package/dist/form/FieldContent.svelte +0 -153
- package/dist/form/FieldContent.svelte.d.ts +0 -31
- package/dist/form/FieldError.svelte +0 -14
- package/dist/form/FieldError.svelte.d.ts +0 -18
- package/dist/form/FieldSection.svelte +0 -86
- package/dist/form/FieldSection.svelte.d.ts +0 -20
- package/dist/form/Fieldset.svelte +0 -68
- package/dist/form/Fieldset.svelte.d.ts +0 -31
- package/dist/form/Form.svelte +0 -136
- package/dist/form/Form.svelte.d.ts +0 -38
- package/dist/form/ImageUpload.svelte +0 -259
- package/dist/form/ImageUpload.svelte.d.ts +0 -31
- package/dist/form/Input.svelte +0 -326
- package/dist/form/Input.svelte.d.ts +0 -117
- package/dist/form/InputLength.svelte +0 -32
- package/dist/form/InputLength.svelte.d.ts +0 -20
- package/dist/form/Label.svelte +0 -44
- package/dist/form/Label.svelte.d.ts +0 -25
- package/dist/form/LogoUpload.svelte +0 -100
- package/dist/form/LogoUpload.svelte.d.ts +0 -29
- package/dist/form/Select.svelte +0 -136
- package/dist/form/Select.svelte.d.ts +0 -70
- package/dist/form/Textarea.svelte +0 -163
- package/dist/form/Textarea.svelte.d.ts +0 -108
- package/dist/form/Toggle.svelte +0 -2
- package/dist/form/Toggle.svelte.d.ts +0 -15
- package/dist/form/client.svelte.d.ts +0 -44
- package/dist/form/client.svelte.js +0 -98
- package/dist/form/form.d.ts +0 -54
- package/dist/form/form.js +0 -340
- package/dist/form/index.d.ts +0 -18
- package/dist/form/index.js +0 -18
- package/dist/form/types.d.ts +0 -62
- package/dist/form/types.js +0 -1
- package/dist/icons/IconAlert.svelte +0 -3
- package/dist/icons/IconAlert.svelte.d.ts +0 -23
- package/dist/icons/IconCopy.svelte +0 -3
- package/dist/icons/IconCopy.svelte.d.ts +0 -23
- package/dist/icons/IconDone.svelte +0 -3
- package/dist/icons/IconDone.svelte.d.ts +0 -23
- package/dist/icons/IconError.svelte +0 -3
- package/dist/icons/IconError.svelte.d.ts +0 -23
- package/dist/icons/IconHelp.svelte +0 -3
- package/dist/icons/IconHelp.svelte.d.ts +0 -23
- package/dist/icons/IconHide.svelte +0 -3
- package/dist/icons/IconHide.svelte.d.ts +0 -23
- package/dist/icons/IconInfo.svelte +0 -3
- package/dist/icons/IconInfo.svelte.d.ts +0 -23
- package/dist/icons/IconLink.svelte +0 -3
- package/dist/icons/IconLink.svelte.d.ts +0 -23
- package/dist/icons/IconMenuBurger.svelte +0 -3
- package/dist/icons/IconMenuBurger.svelte.d.ts +0 -23
- package/dist/icons/IconMenuDots.svelte +0 -3
- package/dist/icons/IconMenuDots.svelte.d.ts +0 -23
- package/dist/icons/IconSearch.svelte +0 -3
- package/dist/icons/IconSearch.svelte.d.ts +0 -23
- package/dist/icons/IconShow.svelte +0 -3
- package/dist/icons/IconShow.svelte.d.ts +0 -23
- package/dist/icons/IconSuccess.svelte +0 -3
- package/dist/icons/IconSuccess.svelte.d.ts +0 -23
- package/dist/icons/IconWarning.svelte +0 -3
- package/dist/icons/IconWarning.svelte.d.ts +0 -23
- package/dist/icons/index.d.ts +0 -14
- package/dist/icons/index.js +0 -14
- package/dist/layout/Layout.svelte +0 -47
- package/dist/layout/Layout.svelte.d.ts +0 -22
- package/dist/layout/LayoutFooter.svelte +0 -21
- package/dist/layout/LayoutFooter.svelte.d.ts +0 -18
- package/dist/layout/LayoutGrid.svelte +0 -51
- package/dist/layout/LayoutGrid.svelte.d.ts +0 -27
- package/dist/layout/LayoutHeader.svelte +0 -97
- package/dist/layout/LayoutHeader.svelte.d.ts +0 -34
- package/dist/layout/LayoutSideMenu.svelte +0 -55
- package/dist/layout/LayoutSideMenu.svelte.d.ts +0 -21
- package/dist/layout/LayoutTypes.d.ts +0 -15
- package/dist/layout/LayoutTypes.js +0 -9
- package/dist/layout/Overlay.svelte +0 -20
- package/dist/layout/Overlay.svelte.d.ts +0 -25
- package/dist/layout/OverlayContainer.svelte +0 -28
- package/dist/layout/OverlayContainer.svelte.d.ts +0 -15
- package/dist/layout/OverlayLayer.svelte +0 -140
- package/dist/layout/OverlayLayer.svelte.d.ts +0 -19
- package/dist/layout/PageContent.svelte +0 -82
- package/dist/layout/PageContent.svelte.d.ts +0 -25
- package/dist/layout/Theme.svelte +0 -243
- package/dist/layout/Theme.svelte.d.ts +0 -19
- package/dist/layout/UIContent.svelte +0 -15
- package/dist/layout/UIContent.svelte.d.ts +0 -18
- package/dist/layout/index.d.ts +0 -11
- package/dist/layout/index.js +0 -11
- package/dist/layout/overlays.svelte.d.ts +0 -34
- package/dist/layout/overlays.svelte.js +0 -44
- package/dist/nav/Breadcrumb.svelte +0 -82
- package/dist/nav/Breadcrumb.svelte.d.ts +0 -28
- package/dist/nav/Menu.svelte +0 -170
- package/dist/nav/Menu.svelte.d.ts +0 -27
- package/dist/nav/MenuItem.svelte +0 -147
- package/dist/nav/MenuItem.svelte.d.ts +0 -22
- package/dist/nav/MenuTypes.d.ts +0 -58
- package/dist/nav/MenuTypes.js +0 -1
- package/dist/nav/NavMenu.svelte +0 -181
- package/dist/nav/NavMenu.svelte.d.ts +0 -19
- package/dist/nav/TabbedContent.svelte +0 -43
- package/dist/nav/TabbedContent.svelte.d.ts +0 -23
- package/dist/nav/Tabs.svelte +0 -158
- package/dist/nav/Tabs.svelte.d.ts +0 -25
- package/dist/nav/index.d.ts +0 -7
- package/dist/nav/index.js +0 -6
- package/dist/style.css +0 -950
- package/dist/typo/Clamp.svelte +0 -25
- package/dist/typo/Clamp.svelte.d.ts +0 -24
- package/dist/typo/H.svelte +0 -52
- package/dist/typo/H.svelte.d.ts +0 -28
- package/dist/typo/H1.svelte +0 -14
- package/dist/typo/H1.svelte.d.ts +0 -26
- package/dist/typo/H2.svelte +0 -14
- package/dist/typo/H2.svelte.d.ts +0 -26
- package/dist/typo/H3.svelte +0 -14
- package/dist/typo/H3.svelte.d.ts +0 -26
- package/dist/typo/H4.svelte +0 -14
- package/dist/typo/H4.svelte.d.ts +0 -26
- package/dist/typo/H5.svelte +0 -14
- package/dist/typo/H5.svelte.d.ts +0 -26
- package/dist/typo/H6.svelte +0 -14
- package/dist/typo/H6.svelte.d.ts +0 -26
- package/dist/typo/P.svelte +0 -34
- package/dist/typo/P.svelte.d.ts +0 -26
- package/dist/typo/index.d.ts +0 -9
- package/dist/typo/index.js +0 -9
- package/dist/utils/StringOrComponent.svelte +0 -14
- package/dist/utils/StringOrComponent.svelte.d.ts +0 -19
- package/dist/utils/StringOrSnippet.svelte +0 -11
- package/dist/utils/StringOrSnippet.svelte.d.ts +0 -19
- package/dist/utils/attr.d.ts +0 -5
- package/dist/utils/attr.js +0 -21
- package/dist/utils/color.d.ts +0 -51
- package/dist/utils/color.js +0 -97
- package/dist/utils/defaults.d.ts +0 -4
- package/dist/utils/defaults.js +0 -1
- package/dist/utils/dom.d.ts +0 -15
- package/dist/utils/dom.js +0 -74
- package/dist/utils/hooks.server.d.ts +0 -2
- package/dist/utils/hooks.server.js +0 -16
- package/dist/utils/id.d.ts +0 -1
- package/dist/utils/id.js +0 -3
- package/dist/utils/index.d.ts +0 -9
- package/dist/utils/index.js +0 -6
- package/dist/utils/isSnippet.d.ts +0 -3
- package/dist/utils/isSnippet.js +0 -11
- package/dist/utils/keyboard.svelte.d.ts +0 -22
- package/dist/utils/keyboard.svelte.js +0 -161
- /package/dist/{utils → util}/transitions.d.ts +0 -0
- /package/dist/{utils → util}/transitions.js +0 -0
package/dist/layout/index.d.ts
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
export { default as Layout } from './Layout.svelte';
|
2
|
-
export { default as LayoutFooter } from './LayoutFooter.svelte';
|
3
|
-
export { default as LayoutGrid } from './LayoutGrid.svelte';
|
4
|
-
export { default as LayoutHeader } from './LayoutHeader.svelte';
|
5
|
-
export { default as LayoutSideMenu } from './LayoutSideMenu.svelte';
|
6
|
-
export { default as Overlay } from './Overlay.svelte';
|
7
|
-
export { default as OverlayContainer } from './OverlayContainer.svelte';
|
8
|
-
export { default as OverlayLayer } from './OverlayLayer.svelte';
|
9
|
-
export { default as PageContent } from './PageContent.svelte';
|
10
|
-
export { default as UIContent } from './UIContent.svelte';
|
11
|
-
export { default as Theme } from './Theme.svelte';
|
package/dist/layout/index.js
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
export { default as Layout } from './Layout.svelte';
|
2
|
-
export { default as LayoutFooter } from './LayoutFooter.svelte';
|
3
|
-
export { default as LayoutGrid } from './LayoutGrid.svelte';
|
4
|
-
export { default as LayoutHeader } from './LayoutHeader.svelte';
|
5
|
-
export { default as LayoutSideMenu } from './LayoutSideMenu.svelte';
|
6
|
-
export { default as Overlay } from './Overlay.svelte';
|
7
|
-
export { default as OverlayContainer } from './OverlayContainer.svelte';
|
8
|
-
export { default as OverlayLayer } from './OverlayLayer.svelte';
|
9
|
-
export { default as PageContent } from './PageContent.svelte';
|
10
|
-
export { default as UIContent } from './UIContent.svelte';
|
11
|
-
export { default as Theme } from './Theme.svelte';
|
@@ -1,34 +0,0 @@
|
|
1
|
-
import type { Component, Snippet } from "svelte";
|
2
|
-
export type OverlayPosition = "top left" | "top center" | "top right" | "bottom left" | "bottom center" | "bottom right" | "center" | "anchor";
|
3
|
-
export type TransitionOpts = {
|
4
|
-
y?: number;
|
5
|
-
x?: number;
|
6
|
-
duration?: number;
|
7
|
-
origin?: string;
|
8
|
-
easing?: (t: number) => number;
|
9
|
-
};
|
10
|
-
export type OverlayItem = {
|
11
|
-
id: string;
|
12
|
-
z?: number;
|
13
|
-
content: string | Snippet | Component;
|
14
|
-
props?: Record<string, any>;
|
15
|
-
layer?: string;
|
16
|
-
anchor?: HTMLElement;
|
17
|
-
transition?: TransitionOpts;
|
18
|
-
position?: OverlayPosition;
|
19
|
-
sticky?: boolean;
|
20
|
-
stack?: string;
|
21
|
-
};
|
22
|
-
declare let overlays: {
|
23
|
-
topRight: OverlayItem[];
|
24
|
-
topLeft: OverlayItem[];
|
25
|
-
topCenter: OverlayItem[];
|
26
|
-
bottomRight: OverlayItem[];
|
27
|
-
bottomLeft: OverlayItem[];
|
28
|
-
bottomCenter: OverlayItem[];
|
29
|
-
center: OverlayItem[];
|
30
|
-
anchor: OverlayItem[];
|
31
|
-
};
|
32
|
-
declare function addOverlay(opts: OverlayItem): void;
|
33
|
-
declare function removeOverlay(id: string): void;
|
34
|
-
export { overlays, addOverlay, removeOverlay };
|
@@ -1,44 +0,0 @@
|
|
1
|
-
let overlays = $state({
|
2
|
-
topRight: [],
|
3
|
-
topLeft: [],
|
4
|
-
topCenter: [],
|
5
|
-
bottomRight: [],
|
6
|
-
bottomLeft: [],
|
7
|
-
bottomCenter: [],
|
8
|
-
center: [],
|
9
|
-
anchor: [],
|
10
|
-
});
|
11
|
-
function addOverlay(opts) {
|
12
|
-
switch (opts.position) {
|
13
|
-
case "top left":
|
14
|
-
overlays.topLeft.push(opts);
|
15
|
-
break;
|
16
|
-
case "top right":
|
17
|
-
overlays.topRight.push(opts);
|
18
|
-
break;
|
19
|
-
case "top center":
|
20
|
-
overlays.topCenter.push(opts);
|
21
|
-
break;
|
22
|
-
case "bottom left":
|
23
|
-
overlays.bottomLeft.push(opts);
|
24
|
-
break;
|
25
|
-
case "bottom right":
|
26
|
-
overlays.bottomRight.push(opts);
|
27
|
-
break;
|
28
|
-
case "bottom center":
|
29
|
-
overlays.bottomCenter.push(opts);
|
30
|
-
break;
|
31
|
-
case "center":
|
32
|
-
overlays.center.push(opts);
|
33
|
-
break;
|
34
|
-
default:
|
35
|
-
overlays.anchor.push(opts);
|
36
|
-
break;
|
37
|
-
}
|
38
|
-
}
|
39
|
-
function removeOverlay(id) {
|
40
|
-
for (const key in overlays) {
|
41
|
-
overlays[key] = overlays[key].filter((o) => o.id !== id);
|
42
|
-
}
|
43
|
-
}
|
44
|
-
export { overlays, addOverlay, removeOverlay };
|
@@ -1,82 +0,0 @@
|
|
1
|
-
<script lang="ts">let {
|
2
|
-
items,
|
3
|
-
separator = "/",
|
4
|
-
contained,
|
5
|
-
fullWidth,
|
6
|
-
center
|
7
|
-
} = $props();
|
8
|
-
</script>
|
9
|
-
|
10
|
-
<nav class:center class:contained class:fullWidth aria-label="Breadcrumb">
|
11
|
-
<ol>
|
12
|
-
{#each items as item, index}
|
13
|
-
<li aria-current={index === items.length - 1 ? "page" : undefined}>
|
14
|
-
{#if item.href && index < items.length - 1}
|
15
|
-
<a href={item.href}>{item.label}</a>
|
16
|
-
{:else}
|
17
|
-
<span>{item.label}</span>
|
18
|
-
{/if}
|
19
|
-
</li>
|
20
|
-
{#if index !== items.length - 1}
|
21
|
-
<li aria-hidden="true" class="separator">
|
22
|
-
{#if typeof separator === "string"}
|
23
|
-
<span>{separator}</span>
|
24
|
-
{/if}
|
25
|
-
</li>
|
26
|
-
{/if}
|
27
|
-
{/each}
|
28
|
-
</ol>
|
29
|
-
</nav>
|
30
|
-
|
31
|
-
<style>
|
32
|
-
nav {
|
33
|
-
padding: 0;
|
34
|
-
block-size: auto;
|
35
|
-
display: flex;
|
36
|
-
justify-content: start;
|
37
|
-
align-items: center;
|
38
|
-
font-size: var(--font-size, 1em);
|
39
|
-
}
|
40
|
-
|
41
|
-
nav ol {
|
42
|
-
display: flex;
|
43
|
-
align-items: center;
|
44
|
-
list-style: none;
|
45
|
-
margin: 0;
|
46
|
-
padding: 0;
|
47
|
-
gap: 0.5rem;
|
48
|
-
border-radius: var(--border-radius);
|
49
|
-
}
|
50
|
-
|
51
|
-
nav ol li {
|
52
|
-
display: flex;
|
53
|
-
align-items: center;
|
54
|
-
justify-content: center;
|
55
|
-
margin: 0;
|
56
|
-
padding: 0;
|
57
|
-
}
|
58
|
-
|
59
|
-
.separator span {
|
60
|
-
font-size: 1rem;
|
61
|
-
line-height: 1rem;
|
62
|
-
color: var(--text-subtle);
|
63
|
-
}
|
64
|
-
|
65
|
-
nav.contained ol {
|
66
|
-
padding: 0 1rem;
|
67
|
-
border: var(--border);
|
68
|
-
}
|
69
|
-
|
70
|
-
nav.contained ol li a {
|
71
|
-
padding: var(--padding, 0.5rem 0);
|
72
|
-
}
|
73
|
-
|
74
|
-
nav.center {
|
75
|
-
justify-content: center;
|
76
|
-
}
|
77
|
-
|
78
|
-
nav.fullWidth ol {
|
79
|
-
block-size: 100%;
|
80
|
-
}
|
81
|
-
|
82
|
-
</style>
|
@@ -1,28 +0,0 @@
|
|
1
|
-
import type { Component, Snippet } from "svelte";
|
2
|
-
import type { BreadcrumbItem } from "./MenuTypes.js";
|
3
|
-
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
4
|
-
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
5
|
-
$$bindings?: Bindings;
|
6
|
-
} & Exports;
|
7
|
-
(internal: unknown, props: Props & {
|
8
|
-
$$events?: Events;
|
9
|
-
$$slots?: Slots;
|
10
|
-
}): Exports;
|
11
|
-
z_$$bindings?: Bindings;
|
12
|
-
}
|
13
|
-
declare const Breadcrumb: $$__sveltets_2_IsomorphicComponent<{
|
14
|
-
/** The items to display in the breadcrumb. */
|
15
|
-
items: BreadcrumbItem[];
|
16
|
-
/** The separator to use between breadcrumb items. */
|
17
|
-
separator?: string | Snippet | Component;
|
18
|
-
/** Contain the element in a box. */
|
19
|
-
contained?: boolean;
|
20
|
-
/** Make the element full width. */
|
21
|
-
fullWidth?: boolean;
|
22
|
-
/** Center the items in the element. */
|
23
|
-
center?: boolean;
|
24
|
-
}, {
|
25
|
-
[evt: string]: CustomEvent<any>;
|
26
|
-
}, {}, {}, "">;
|
27
|
-
type Breadcrumb = InstanceType<typeof Breadcrumb>;
|
28
|
-
export default Breadcrumb;
|
package/dist/nav/Menu.svelte
DELETED
@@ -1,170 +0,0 @@
|
|
1
|
-
<script lang="ts">import MenuItem from "./MenuItem.svelte";
|
2
|
-
import { createId } from "../utils/id.js";
|
3
|
-
import UiContent from "../layout/UIContent.svelte";
|
4
|
-
import { arrowNavigation, getNextFocusableElement, matchOnType } from "../utils/keyboard.svelte.js";
|
5
|
-
import { findContainingBlock, getPossiblyContainedPosition } from "../utils/dom.js";
|
6
|
-
import Overlay from "../layout/Overlay.svelte";
|
7
|
-
let {
|
8
|
-
open = $bindable(false),
|
9
|
-
items,
|
10
|
-
trigger
|
11
|
-
} = $props();
|
12
|
-
let _open = $state(open);
|
13
|
-
let triggerEl = $state(null);
|
14
|
-
let contentEl = $state(null);
|
15
|
-
let menuEl = $state(null);
|
16
|
-
let currentIndex = $state(-1);
|
17
|
-
let keyboardHasFocus = $state(false);
|
18
|
-
const id = createId();
|
19
|
-
$effect(() => {
|
20
|
-
if (_open) {
|
21
|
-
window.addEventListener("click", clickoutside);
|
22
|
-
window.addEventListener("keydown", onkeydown);
|
23
|
-
} else {
|
24
|
-
window.removeEventListener("click", clickoutside);
|
25
|
-
window.removeEventListener("keydown", onkeydown);
|
26
|
-
}
|
27
|
-
});
|
28
|
-
function toggle() {
|
29
|
-
_open = !_open;
|
30
|
-
}
|
31
|
-
let scrollable = $derived.by(() => {
|
32
|
-
if (!contentEl) return false;
|
33
|
-
return contentEl.scrollHeight > contentEl.clientHeight;
|
34
|
-
});
|
35
|
-
function onclick(e) {
|
36
|
-
e.preventDefault();
|
37
|
-
_open = !_open;
|
38
|
-
}
|
39
|
-
function clickoutside(e) {
|
40
|
-
if (!_open) return;
|
41
|
-
if (contentEl && !contentEl.contains(e.target) && !triggerEl?.contains(e.target)) {
|
42
|
-
_open = false;
|
43
|
-
}
|
44
|
-
}
|
45
|
-
function onkeydown(e) {
|
46
|
-
if (!_open) return;
|
47
|
-
const active = document.activeElement;
|
48
|
-
switch (e.key) {
|
49
|
-
case "Escape":
|
50
|
-
e.preventDefault();
|
51
|
-
_open = false;
|
52
|
-
break;
|
53
|
-
case "Tab":
|
54
|
-
e.preventDefault();
|
55
|
-
e.stopPropagation();
|
56
|
-
_open = false;
|
57
|
-
setTimeout(() => {
|
58
|
-
const nextEl = getNextFocusableElement(menuEl, triggerEl, e.shiftKey ? "previous" : "next");
|
59
|
-
console.log("nextEl", nextEl);
|
60
|
-
if (nextEl) {
|
61
|
-
nextEl.focus();
|
62
|
-
if (nextEl.tagName === "BUTTON" || nextEl.tagName === "A" && nextEl.parentElement?.classList.contains("Trigger")) {
|
63
|
-
nextEl.click();
|
64
|
-
}
|
65
|
-
}
|
66
|
-
}, 0);
|
67
|
-
break;
|
68
|
-
case "ArrowDown":
|
69
|
-
e.preventDefault();
|
70
|
-
arrowNavigation(contentEl, "down");
|
71
|
-
matchOnType(contentEl, e);
|
72
|
-
keyboardHasFocus = true;
|
73
|
-
break;
|
74
|
-
case "ArrowUp":
|
75
|
-
e.preventDefault();
|
76
|
-
arrowNavigation(contentEl, "up");
|
77
|
-
matchOnType(contentEl, e);
|
78
|
-
keyboardHasFocus = true;
|
79
|
-
break;
|
80
|
-
case "Enter":
|
81
|
-
case "Space":
|
82
|
-
e.preventDefault();
|
83
|
-
active.click();
|
84
|
-
break;
|
85
|
-
default:
|
86
|
-
matchOnType(contentEl, e);
|
87
|
-
}
|
88
|
-
}
|
89
|
-
function mouseover(e, item, index) {
|
90
|
-
if (item.type === "item") {
|
91
|
-
currentIndex = index;
|
92
|
-
}
|
93
|
-
}
|
94
|
-
</script>
|
95
|
-
|
96
|
-
|
97
|
-
<UiContent>
|
98
|
-
<div class="Menu" bind:this={menuEl}>
|
99
|
-
<div
|
100
|
-
class="Trigger"
|
101
|
-
bind:this={triggerEl}
|
102
|
-
>
|
103
|
-
{#if typeof trigger === "string"}
|
104
|
-
<button type="button" class="button" {onclick} aria-haspopup="true" aria-controls={id} aria-expanded="{_open}">
|
105
|
-
{trigger}
|
106
|
-
</button>
|
107
|
-
{:else}
|
108
|
-
{@render trigger({ toggle: toggle, isOpen: _open })}
|
109
|
-
{/if}
|
110
|
-
</div>
|
111
|
-
{#if _open && triggerEl}
|
112
|
-
<Overlay position="anchor" id="o-{id}" anchor={triggerEl} layer="menu">
|
113
|
-
<div {id}
|
114
|
-
class="MenuContent"
|
115
|
-
class:scrollable={scrollable}
|
116
|
-
role="menu"
|
117
|
-
bind:this={contentEl}
|
118
|
-
>
|
119
|
-
<ul>
|
120
|
-
{#each items as item, index}
|
121
|
-
<MenuItem {keyboardHasFocus} onmouseover={mouseover} item={item} {index} />
|
122
|
-
{/each}
|
123
|
-
</ul>
|
124
|
-
</div>
|
125
|
-
</Overlay>
|
126
|
-
{/if}
|
127
|
-
</div>
|
128
|
-
</UiContent>
|
129
|
-
|
130
|
-
<style>
|
131
|
-
.Menu {
|
132
|
-
position: relative;
|
133
|
-
}
|
134
|
-
|
135
|
-
.Trigger {
|
136
|
-
position: relative;
|
137
|
-
display: inline-flex;
|
138
|
-
}
|
139
|
-
|
140
|
-
.MenuContent {
|
141
|
-
max-height: calc(50vh - 2rem);
|
142
|
-
margin: 0;
|
143
|
-
z-index: 1000;
|
144
|
-
margin: 0;
|
145
|
-
border: var(--menu-border);
|
146
|
-
border-radius: var(--border-radius);
|
147
|
-
box-shadow: 0 0.5rem 1rem var(--shadow);
|
148
|
-
background-color: var(--menu-bg);
|
149
|
-
width: var(--width, 25ch);
|
150
|
-
overflow-x: clip;
|
151
|
-
overflow-y: auto;
|
152
|
-
scrollbar-width: thin;
|
153
|
-
scrollbar-color: var(--scrollbar-color);
|
154
|
-
}
|
155
|
-
|
156
|
-
.MenuContent.scrollable {
|
157
|
-
border-top-right-radius: 0;
|
158
|
-
border-bottom-right-radius: 0;
|
159
|
-
}
|
160
|
-
|
161
|
-
.MenuContent:has(li:last-of-type[data-type="item"]) {
|
162
|
-
padding-block-end: 0.5rem;
|
163
|
-
}
|
164
|
-
|
165
|
-
ul {
|
166
|
-
margin: 0;
|
167
|
-
list-style: none;
|
168
|
-
padding: 0;
|
169
|
-
}
|
170
|
-
</style>
|
@@ -1,27 +0,0 @@
|
|
1
|
-
import type { Snippet } from "svelte";
|
2
|
-
import type { MenuItem as Item } from "./MenuTypes.js";
|
3
|
-
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
4
|
-
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
5
|
-
$$bindings?: Bindings;
|
6
|
-
} & Exports;
|
7
|
-
(internal: unknown, props: Props & {
|
8
|
-
$$events?: Events;
|
9
|
-
$$slots?: Slots;
|
10
|
-
}): Exports;
|
11
|
-
z_$$bindings?: Bindings;
|
12
|
-
}
|
13
|
-
declare const Menu: $$__sveltets_2_IsomorphicComponent<{
|
14
|
-
/** Whether the menu is open */
|
15
|
-
open?: boolean;
|
16
|
-
/** The items to display in the menu */
|
17
|
-
items: Item[];
|
18
|
-
/** The trigger for the menu */
|
19
|
-
trigger: string | Snippet<[{
|
20
|
-
toggle: () => void;
|
21
|
-
isOpen: boolean;
|
22
|
-
}]>;
|
23
|
-
}, {
|
24
|
-
[evt: string]: CustomEvent<any>;
|
25
|
-
}, {}, {}, "open">;
|
26
|
-
type Menu = InstanceType<typeof Menu>;
|
27
|
-
export default Menu;
|
package/dist/nav/MenuItem.svelte
DELETED
@@ -1,147 +0,0 @@
|
|
1
|
-
<script lang="ts">import StringOrSnippet from "../utils/StringOrSnippet.svelte";
|
2
|
-
import { isStatusColor } from "../utils/color.js";
|
3
|
-
import { isComponent, isSnippet } from "../utils/isSnippet.js";
|
4
|
-
let {
|
5
|
-
item,
|
6
|
-
index,
|
7
|
-
onmouseover,
|
8
|
-
keyboardHasFocus,
|
9
|
-
shape = "rounded"
|
10
|
-
} = $props();
|
11
|
-
let isSet = $derived(item.type !== "divider" ? isStatusColor(item.color) : false);
|
12
|
-
let el = $state(null);
|
13
|
-
function mouseover(e) {
|
14
|
-
if (onmouseover && item.type === "item") {
|
15
|
-
el?.focus();
|
16
|
-
}
|
17
|
-
}
|
18
|
-
</script>
|
19
|
-
|
20
|
-
<!-- svelte-ignore a11y_mouse_events_have_key_events -->
|
21
|
-
<li
|
22
|
-
onmouseover={mouseover}
|
23
|
-
data-index={index}
|
24
|
-
class:keyboardHasFocus
|
25
|
-
class:divider={item.type === 'divider'}
|
26
|
-
class:header={item.type === 'header'}
|
27
|
-
class={shape}
|
28
|
-
data-type="{item.type}"
|
29
|
-
style="--color: {isSet && item.type !== 'divider' ? 'var(--status-'+item.color+')' : (item.type !== 'divider' && item.color ? item.color : 'var(--menu-text)')}"
|
30
|
-
>
|
31
|
-
{#if item.type === 'divider'}
|
32
|
-
<hr />
|
33
|
-
{:else if item.type === 'header'}
|
34
|
-
<div class="Header">
|
35
|
-
<StringOrSnippet content={item.content} />
|
36
|
-
</div>
|
37
|
-
{:else if item.type === 'item'}
|
38
|
-
{#if item.href}
|
39
|
-
<a href="{item.href}" class="Item" bind:this={el}>
|
40
|
-
<span class="Content">
|
41
|
-
<StringOrSnippet content={item.content} />
|
42
|
-
</span>
|
43
|
-
{#if item.shortcut}
|
44
|
-
<span class="Shortcut">{item.shortcut}</span>
|
45
|
-
{/if}
|
46
|
-
</a>
|
47
|
-
{:else if item.onclick}
|
48
|
-
<button type="button" onclick={(e) => item.type === 'item' ? item.onclick!(e, item) : undefined} class="Item" bind:this={el}>
|
49
|
-
<span class="Content">
|
50
|
-
<StringOrSnippet content={item.content} />
|
51
|
-
</span>
|
52
|
-
{#if item.shortcut}
|
53
|
-
<span class="Shortcut">{item.shortcut}</span>
|
54
|
-
{/if}
|
55
|
-
</button>
|
56
|
-
{:else if isSnippet(item.content)}
|
57
|
-
<div class="Item Custom">
|
58
|
-
{@render item.content()}
|
59
|
-
</div>
|
60
|
-
{:else if isComponent(item.content)}
|
61
|
-
<div class="Item Custom">
|
62
|
-
<item.content />
|
63
|
-
</div>
|
64
|
-
{/if}
|
65
|
-
{/if}
|
66
|
-
</li>
|
67
|
-
|
68
|
-
<style>
|
69
|
-
li {
|
70
|
-
margin: 0;
|
71
|
-
list-style: none;
|
72
|
-
padding: 0;
|
73
|
-
user-select: none;
|
74
|
-
}
|
75
|
-
|
76
|
-
li .Item,
|
77
|
-
li .Header {
|
78
|
-
font-size: var(--font-size, 0.9em);
|
79
|
-
text-align: left;
|
80
|
-
padding-block: 0.5rem;
|
81
|
-
padding-inline: 1rem;
|
82
|
-
display: inline-flex;
|
83
|
-
align-items: center;
|
84
|
-
justify-content: space-between;
|
85
|
-
width: 100%;
|
86
|
-
color: inherit;
|
87
|
-
text-decoration: none;
|
88
|
-
color: var(--color);
|
89
|
-
--inset-block: 0.5rem;
|
90
|
-
--inset-inline: 1rem;
|
91
|
-
}
|
92
|
-
|
93
|
-
li.rounded .Item,
|
94
|
-
li.rounded .Header {
|
95
|
-
border-radius: var(--border-radius);
|
96
|
-
}
|
97
|
-
|
98
|
-
li .Header {
|
99
|
-
font-weight: 600;
|
100
|
-
}
|
101
|
-
|
102
|
-
li:not(.keyboardHasFocus) .Item:not(.Custom):hover,
|
103
|
-
li .Item:not(.Custom):focus-visible {
|
104
|
-
background-color: var(--bg-hover);
|
105
|
-
cursor: pointer;
|
106
|
-
outline: none;
|
107
|
-
}
|
108
|
-
|
109
|
-
li .Item span.Shortcut {
|
110
|
-
font-size: max(0.75em, 9px);
|
111
|
-
text-align: right;
|
112
|
-
color: var(--text-subtle);
|
113
|
-
}
|
114
|
-
|
115
|
-
li .Item:not(.Custom):active {
|
116
|
-
scale: 1;
|
117
|
-
}
|
118
|
-
|
119
|
-
li.divider {
|
120
|
-
padding-block: 0.5rem;
|
121
|
-
}
|
122
|
-
|
123
|
-
hr {
|
124
|
-
display: block;
|
125
|
-
border: none;
|
126
|
-
margin: 0;
|
127
|
-
border-top: 1px solid var(--border-color);
|
128
|
-
}
|
129
|
-
|
130
|
-
li:first-child[data-type="item"] {
|
131
|
-
margin-block-start: var(--menu-item-margin, 0.5rem);
|
132
|
-
}
|
133
|
-
|
134
|
-
li:first-child[data-type="header"]:has(+ li[data-type="item"]) {
|
135
|
-
margin-block-end: 0.125rem;
|
136
|
-
}
|
137
|
-
|
138
|
-
li:nth-last-child(2)[data-type="item"]:has(+ li[data-type="header"]:last-child) {
|
139
|
-
margin-block-end: 0.5rem;
|
140
|
-
}
|
141
|
-
|
142
|
-
@media (pointer: none) {
|
143
|
-
li .Item span.Shortcut {
|
144
|
-
display: none;
|
145
|
-
}
|
146
|
-
}
|
147
|
-
</style>
|
@@ -1,22 +0,0 @@
|
|
1
|
-
import type { MenuItem as Item } from "./MenuTypes.js";
|
2
|
-
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
3
|
-
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
4
|
-
$$bindings?: Bindings;
|
5
|
-
} & Exports;
|
6
|
-
(internal: unknown, props: Props & {
|
7
|
-
$$events?: Events;
|
8
|
-
$$slots?: Slots;
|
9
|
-
}): Exports;
|
10
|
-
z_$$bindings?: Bindings;
|
11
|
-
}
|
12
|
-
declare const MenuItem: $$__sveltets_2_IsomorphicComponent<{
|
13
|
-
item: Item;
|
14
|
-
index: number;
|
15
|
-
onmouseover?: (e: MouseEvent, item: Item, index: number) => void;
|
16
|
-
keyboardHasFocus?: boolean;
|
17
|
-
shape?: "rounded" | "square" | "pill";
|
18
|
-
}, {
|
19
|
-
[evt: string]: CustomEvent<any>;
|
20
|
-
}, {}, {}, "">;
|
21
|
-
type MenuItem = InstanceType<typeof MenuItem>;
|
22
|
-
export default MenuItem;
|
package/dist/nav/MenuTypes.d.ts
DELETED
@@ -1,58 +0,0 @@
|
|
1
|
-
import type { StatusColorOrString } from "../utils/color.js";
|
2
|
-
import type { Component, Snippet } from "svelte";
|
3
|
-
export type MenuItem = {
|
4
|
-
/** Type of menu item to render. */
|
5
|
-
type: 'divider';
|
6
|
-
} | {
|
7
|
-
/** Type of menu item to render. */
|
8
|
-
type: 'header';
|
9
|
-
/** Text label of the item to display to the user. */
|
10
|
-
content: string | Snippet;
|
11
|
-
/** Color to use for the item. */
|
12
|
-
color?: StatusColorOrString;
|
13
|
-
} | {
|
14
|
-
/** Type of menu item to render. */
|
15
|
-
type: 'item';
|
16
|
-
/** Content of the item to display to the user. */
|
17
|
-
content: string | Snippet;
|
18
|
-
/** Keyboard shortcut to display next to the item. */
|
19
|
-
shortcut?: string;
|
20
|
-
/** Icon to display. Pass either a Svelte Component or an URL. Use the Icon component to recolor your icons according to the user theme. */
|
21
|
-
icon?: string | Component;
|
22
|
-
/** Path or URL to use for the menu item. */
|
23
|
-
href?: string;
|
24
|
-
/** Click event handler. */
|
25
|
-
onclick?: (event: MouseEvent, item: MenuItem) => void;
|
26
|
-
/** If true, disables the item. */
|
27
|
-
disabled?: boolean;
|
28
|
-
/** Color to use for the item. */
|
29
|
-
color?: StatusColorOrString;
|
30
|
-
/** Menu item children. Pass an array of menu items to create a nested menu. */
|
31
|
-
children?: MenuItem[];
|
32
|
-
};
|
33
|
-
export type TabItem = {
|
34
|
-
/** Text label of the item to display to the user. */
|
35
|
-
label: string;
|
36
|
-
/** Path or URL to use for the item. If the href ends with a star (*), it will match any path that starts with the given path. This allows for nested active items. */
|
37
|
-
href?: string;
|
38
|
-
/** Click event handler. */
|
39
|
-
onclick?: (event: MouseEvent, item: TabItem, index: number) => void;
|
40
|
-
/** If true, overrides the currently selected item. */
|
41
|
-
active?: boolean;
|
42
|
-
};
|
43
|
-
export type TabbedContentItem = {
|
44
|
-
/** Text label of the item to display to the user. */
|
45
|
-
label: string;
|
46
|
-
/** URL hash to use for the item. */
|
47
|
-
hash?: string;
|
48
|
-
/** Content to display when the item is selected. */
|
49
|
-
content: Snippet;
|
50
|
-
};
|
51
|
-
export type BreadcrumbItem = {
|
52
|
-
/** Text label of the item to display to the user. */
|
53
|
-
label: string;
|
54
|
-
/** Icon to display. Pass either a Svelte Component or an URL. Use the Icon component to recolor your icons according to the user theme. */
|
55
|
-
icon?: string | Component;
|
56
|
-
/** Path or URL to use for the breadcrumb item. */
|
57
|
-
href?: string;
|
58
|
-
};
|
package/dist/nav/MenuTypes.js
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
export {};
|