lutra 0.0.33 → 0.1.4
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/Avatar.svelte +105 -0
- package/dist/components/Avatar.svelte.d.ts +14 -0
- package/dist/{display → components}/Close.svelte +25 -7
- package/dist/components/Close.svelte.d.ts +7 -0
- package/dist/components/ContextTip.svelte +41 -0
- package/dist/components/ContextTip.svelte.d.ts +7 -0
- package/dist/components/Dialog.svelte +78 -0
- package/dist/components/Dialog.svelte.d.ts +14 -0
- package/dist/components/Icon.svelte +62 -0
- package/dist/components/Icon.svelte.d.ts +8 -0
- package/dist/{display → components}/IconButton.svelte +43 -14
- package/dist/components/IconButton.svelte.d.ts +16 -0
- package/dist/components/Image.svelte +172 -0
- package/dist/components/Image.svelte.d.ts +56 -0
- package/dist/{display → components}/Indicator.svelte +44 -9
- package/dist/components/Indicator.svelte.d.ts +12 -0
- package/dist/{display → components}/Inset.svelte +8 -3
- package/dist/components/Inset.svelte.d.ts +7 -0
- package/dist/components/Layout.svelte +33 -0
- package/dist/components/Layout.svelte.d.ts +11 -0
- package/dist/components/MenuDropdown.svelte +195 -0
- package/dist/components/MenuDropdown.svelte.d.ts +16 -0
- package/dist/{nav → components}/MenuItem.svelte +46 -38
- package/dist/components/MenuItem.svelte.d.ts +11 -0
- package/dist/components/MenuItemContent.svelte +25 -0
- package/dist/components/MenuItemContent.svelte.d.ts +10 -0
- package/dist/{nav → components}/MenuTypes.d.ts +19 -5
- package/dist/components/Modal.svelte +149 -0
- package/dist/components/Modal.svelte.d.ts +16 -0
- package/dist/{display → components}/Notification.svelte +33 -22
- package/dist/components/Notification.svelte.d.ts +12 -0
- package/dist/components/Overlay.svelte +31 -0
- package/dist/components/Overlay.svelte.d.ts +14 -0
- package/dist/{layout → components}/OverlayContainer.svelte +6 -3
- package/dist/{layout → components}/OverlayContainer.svelte.d.ts +4 -1
- package/dist/components/OverlayLayer.svelte +168 -0
- package/dist/components/OverlayLayer.svelte.d.ts +8 -0
- package/dist/components/PageContent.svelte +108 -0
- package/dist/components/PageContent.svelte.d.ts +38 -0
- package/dist/components/TabbedContent.svelte +74 -0
- package/dist/components/TabbedContent.svelte.d.ts +11 -0
- package/dist/components/TabbedContentItem.svelte +33 -0
- package/dist/components/TabbedContentItem.svelte.d.ts +10 -0
- package/dist/components/Table.svelte +41 -0
- package/dist/components/Table.svelte.d.ts +13 -0
- package/dist/{nav → components}/Tabs.svelte +99 -41
- package/dist/components/Tabs.svelte.d.ts +20 -0
- package/dist/components/Tag.svelte +120 -0
- package/dist/components/Tag.svelte.d.ts +21 -0
- package/dist/components/Theme.svelte +105 -0
- package/dist/components/Theme.svelte.d.ts +17 -0
- package/dist/{display → components}/Tooltip.svelte +41 -16
- package/dist/components/Tooltip.svelte.d.ts +12 -0
- package/dist/components/UIContent.svelte +19 -0
- package/dist/components/UIContent.svelte.d.ts +7 -0
- package/dist/components/index.d.ts +28 -0
- package/dist/components/index.js +29 -0
- package/dist/{display → components}/notifications.svelte.d.ts +1 -1
- package/dist/{display → components}/notifications.svelte.js +3 -4
- package/dist/{layout → components}/overlays.svelte.d.ts +4 -2
- package/dist/config.d.ts +30 -0
- package/dist/config.js +18 -0
- package/dist/css/1-props.css +440 -0
- package/dist/css/2-base.css +343 -0
- package/dist/css/3-typo.css +106 -0
- package/dist/css/4-layout.css +368 -0
- package/dist/css/5-media.css +116 -0
- package/dist/css/lutra.css +7 -0
- package/dist/css/themes/DefaultTheme.css +209 -0
- package/dist/form/Button.svelte +35 -16
- package/dist/form/Button.svelte.d.ts +8 -19
- package/dist/form/Datepicker.svelte +311 -0
- package/dist/form/Datepicker.svelte.d.ts +9 -0
- package/dist/form/FieldContent.svelte +69 -44
- package/dist/form/FieldContent.svelte.d.ts +7 -17
- package/dist/form/FieldError.svelte +16 -6
- package/dist/form/FieldError.svelte.d.ts +4 -15
- package/dist/form/Fieldset.svelte +48 -13
- package/dist/form/Fieldset.svelte.d.ts +5 -16
- package/dist/form/Form.svelte +158 -74
- package/dist/form/Form.svelte.d.ts +17 -17
- package/dist/form/{FieldActions.svelte → FormActions.svelte} +29 -17
- package/dist/form/FormActions.svelte.d.ts +9 -0
- package/dist/form/FormSection.svelte +96 -0
- package/dist/form/FormSection.svelte.d.ts +9 -0
- package/dist/form/ImageUpload.svelte +134 -94
- package/dist/form/ImageUpload.svelte.d.ts +5 -16
- package/dist/form/Input.svelte +254 -136
- package/dist/form/Input.svelte.d.ts +12 -21
- package/dist/form/InputLength.svelte +15 -5
- package/dist/form/InputLength.svelte.d.ts +4 -15
- package/dist/form/Label.svelte +55 -11
- package/dist/form/Label.svelte.d.ts +6 -15
- package/dist/form/LogoUpload.svelte +36 -21
- package/dist/form/LogoUpload.svelte.d.ts +4 -15
- package/dist/form/Select.svelte +100 -50
- package/dist/form/Select.svelte.d.ts +5 -16
- package/dist/form/Textarea.svelte +200 -98
- package/dist/form/Textarea.svelte.d.ts +11 -24
- package/dist/form/Toggle.svelte +3 -1
- package/dist/form/Toggle.svelte.d.ts +4 -1
- package/dist/form/client.svelte.d.ts +1 -0
- package/dist/form/client.svelte.js +6 -2
- package/dist/form/form.d.ts +10 -9
- package/dist/form/form.js +37 -32
- package/dist/form/index.d.ts +3 -4
- package/dist/form/index.js +3 -4
- package/dist/form/types.d.ts +9 -16
- package/dist/icons/IconAlert.svelte.d.ts +4 -1
- package/dist/icons/IconCopy.svelte.d.ts +4 -1
- package/dist/icons/IconDone.svelte.d.ts +4 -1
- package/dist/icons/IconError.svelte.d.ts +4 -1
- package/dist/icons/IconHelp.svelte.d.ts +4 -1
- package/dist/icons/IconHide.svelte.d.ts +4 -1
- package/dist/icons/IconInfo.svelte.d.ts +4 -1
- package/dist/icons/IconLink.svelte.d.ts +4 -1
- package/dist/icons/IconMenuBurger.svelte.d.ts +4 -1
- package/dist/icons/IconMenuDots.svelte.d.ts +4 -1
- package/dist/icons/IconSearch.svelte.d.ts +4 -1
- package/dist/icons/IconShow.svelte.d.ts +4 -1
- package/dist/icons/IconSuccess.svelte.d.ts +4 -1
- package/dist/icons/IconWarning.svelte.d.ts +4 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +3 -2
- package/dist/types.d.ts +39 -0
- package/dist/types.js +25 -0
- package/dist/util/StringOrComponent.svelte +20 -0
- package/dist/util/StringOrComponent.svelte.d.ts +8 -0
- package/dist/util/StringOrSnippet.svelte +16 -0
- package/dist/util/StringOrSnippet.svelte.d.ts +8 -0
- package/dist/{utils → util}/dom.js +1 -2
- package/dist/util/locale.d.ts +1 -0
- package/dist/util/locale.js +47 -0
- package/dist/util/settings.d.ts +4 -0
- package/package.json +35 -79
- 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.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.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.d.ts +0 -23
- 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.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/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/FieldSection.svelte +0 -86
- package/dist/form/FieldSection.svelte.d.ts +0 -20
- 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/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/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.d.ts +0 -22
- 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.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/defaults.d.ts +0 -4
- 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/{nav → components}/MenuTypes.js +0 -0
- /package/dist/{layout → components}/overlays.svelte.js +0 -0
- /package/dist/{utils → util}/attr.d.ts +0 -0
- /package/dist/{utils → util}/attr.js +0 -0
- /package/dist/{utils → util}/color.d.ts +0 -0
- /package/dist/{utils → util}/color.js +0 -0
- /package/dist/{utils → util}/dom.d.ts +0 -0
- /package/dist/{utils → util}/keyboard.svelte.d.ts +0 -0
- /package/dist/{utils → util}/keyboard.svelte.js +0 -0
- /package/dist/{utils/defaults.js → util/settings.js} +0 -0
- /package/dist/{utils → util}/transitions.d.ts +0 -0
- /package/dist/{utils → util}/transitions.js +0 -0
@@ -1,20 +1,30 @@
|
|
1
|
-
<script lang="ts">
|
2
|
-
import { isStatusColor } from "../
|
3
|
-
import
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
1
|
+
<script lang="ts">
|
2
|
+
import { isStatusColor } from "../util/color.js";
|
3
|
+
import MenuItemContent from "./MenuItemContent.svelte";
|
4
|
+
import type { MenuItem as Item } from "./MenuTypes.js";
|
5
|
+
|
6
|
+
let {
|
7
|
+
item,
|
8
|
+
index,
|
9
|
+
onmouseover,
|
10
|
+
keyboardHasFocus,
|
11
|
+
shape = 'default',
|
12
|
+
}: {
|
13
|
+
item: Item;
|
14
|
+
index: number;
|
15
|
+
onmouseover?: (e: MouseEvent, item: Item, index: number) => void;
|
16
|
+
keyboardHasFocus?: boolean;
|
17
|
+
shape?: 'default' | 'rounded' | 'pill';
|
18
|
+
} = $props();
|
19
|
+
|
20
|
+
let isSet = $derived(item.type !== 'divider' ? isStatusColor(item.color) : false);
|
21
|
+
let el: HTMLElement | null = $state(null);
|
22
|
+
|
23
|
+
function mouseover(e: MouseEvent) {
|
24
|
+
if(onmouseover && item.type === "item") {
|
25
|
+
el?.focus();
|
26
|
+
}
|
27
|
+
}
|
18
28
|
</script>
|
19
29
|
|
20
30
|
<!-- svelte-ignore a11y_mouse_events_have_key_events -->
|
@@ -32,13 +42,13 @@ function mouseover(e) {
|
|
32
42
|
<hr />
|
33
43
|
{:else if item.type === 'header'}
|
34
44
|
<div class="Header">
|
35
|
-
<
|
45
|
+
<MenuItemContent {...item} />
|
36
46
|
</div>
|
37
47
|
{:else if item.type === 'item'}
|
38
48
|
{#if item.href}
|
39
49
|
<a href="{item.href}" class="Item" bind:this={el}>
|
40
50
|
<span class="Content">
|
41
|
-
<
|
51
|
+
<MenuItemContent {...item} />
|
42
52
|
</span>
|
43
53
|
{#if item.shortcut}
|
44
54
|
<span class="Shortcut">{item.shortcut}</span>
|
@@ -47,25 +57,30 @@ function mouseover(e) {
|
|
47
57
|
{:else if item.onclick}
|
48
58
|
<button type="button" onclick={(e) => item.type === 'item' ? item.onclick!(e, item) : undefined} class="Item" bind:this={el}>
|
49
59
|
<span class="Content">
|
50
|
-
<
|
60
|
+
<MenuItemContent {...item} />
|
51
61
|
</span>
|
52
62
|
{#if item.shortcut}
|
53
63
|
<span class="Shortcut">{item.shortcut}</span>
|
54
64
|
{/if}
|
55
65
|
</button>
|
56
|
-
{:else if
|
66
|
+
{:else if item.component}
|
57
67
|
<div class="Item Custom">
|
58
|
-
{
|
59
|
-
</div>
|
60
|
-
{:else if isComponent(item.content)}
|
61
|
-
<div class="Item Custom">
|
62
|
-
<item.content />
|
68
|
+
<MenuItemContent {...item} />
|
63
69
|
</div>
|
64
70
|
{/if}
|
65
71
|
{/if}
|
66
72
|
</li>
|
67
73
|
|
68
74
|
<style>
|
75
|
+
button {
|
76
|
+
background-color: transparent;
|
77
|
+
border: none;
|
78
|
+
padding: 0;
|
79
|
+
margin: 0;
|
80
|
+
font: inherit;
|
81
|
+
color: inherit;
|
82
|
+
text-align: left;
|
83
|
+
}
|
69
84
|
li {
|
70
85
|
margin: 0;
|
71
86
|
list-style: none;
|
@@ -88,11 +103,12 @@ function mouseover(e) {
|
|
88
103
|
color: var(--color);
|
89
104
|
--inset-block: 0.5rem;
|
90
105
|
--inset-inline: 1rem;
|
106
|
+
border-radius: none;
|
91
107
|
}
|
92
108
|
|
93
109
|
li.rounded .Item,
|
94
110
|
li.rounded .Header {
|
95
|
-
border-radius: var(--border-radius);
|
111
|
+
border-radius: var(--menu-border-radius);
|
96
112
|
}
|
97
113
|
|
98
114
|
li .Header {
|
@@ -101,7 +117,7 @@ function mouseover(e) {
|
|
101
117
|
|
102
118
|
li:not(.keyboardHasFocus) .Item:not(.Custom):hover,
|
103
119
|
li .Item:not(.Custom):focus-visible {
|
104
|
-
background-color: var(--
|
120
|
+
background-color: var(--menu-background-color-hover);
|
105
121
|
cursor: pointer;
|
106
122
|
outline: none;
|
107
123
|
}
|
@@ -109,7 +125,7 @@ function mouseover(e) {
|
|
109
125
|
li .Item span.Shortcut {
|
110
126
|
font-size: max(0.75em, 9px);
|
111
127
|
text-align: right;
|
112
|
-
color: var(--text-subtle);
|
128
|
+
color: var(--menu-text-color-subtle);
|
113
129
|
}
|
114
130
|
|
115
131
|
li .Item:not(.Custom):active {
|
@@ -124,21 +140,13 @@ function mouseover(e) {
|
|
124
140
|
display: block;
|
125
141
|
border: none;
|
126
142
|
margin: 0;
|
127
|
-
border-top: 1px solid var(--border-color);
|
143
|
+
border-top: 1px solid var(--menu-border-color);
|
128
144
|
}
|
129
145
|
|
130
146
|
li:first-child[data-type="item"] {
|
131
147
|
margin-block-start: var(--menu-item-margin, 0.5rem);
|
132
148
|
}
|
133
149
|
|
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
150
|
@media (pointer: none) {
|
143
151
|
li .Item span.Shortcut {
|
144
152
|
display: none;
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import type { MenuItem as Item } from "./MenuTypes.js";
|
2
|
+
type $$ComponentProps = {
|
3
|
+
item: Item;
|
4
|
+
index: number;
|
5
|
+
onmouseover?: (e: MouseEvent, item: Item, index: number) => void;
|
6
|
+
keyboardHasFocus?: boolean;
|
7
|
+
shape?: 'default' | 'rounded' | 'pill';
|
8
|
+
};
|
9
|
+
declare const MenuItem: import("svelte").Component<$$ComponentProps, {}, "">;
|
10
|
+
type MenuItem = ReturnType<typeof MenuItem>;
|
11
|
+
export default MenuItem;
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<script lang="ts">
|
2
|
+
import type { Component, Snippet } from "svelte";
|
3
|
+
|
4
|
+
let {
|
5
|
+
text,
|
6
|
+
snippet,
|
7
|
+
component: Comp,
|
8
|
+
props
|
9
|
+
}: {
|
10
|
+
text?: string;
|
11
|
+
snippet?: Snippet;
|
12
|
+
component?: Component;
|
13
|
+
props?: any;
|
14
|
+
} = $props();
|
15
|
+
</script>
|
16
|
+
|
17
|
+
{#if text}
|
18
|
+
{text}
|
19
|
+
{/if}
|
20
|
+
{#if snippet}
|
21
|
+
{@render snippet([...props])}
|
22
|
+
{/if}
|
23
|
+
{#if Comp}
|
24
|
+
<Comp {...props} />
|
25
|
+
{/if}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import type { Component, Snippet } from "svelte";
|
2
|
+
type $$ComponentProps = {
|
3
|
+
text?: string;
|
4
|
+
snippet?: Snippet;
|
5
|
+
component?: Component;
|
6
|
+
props?: any;
|
7
|
+
};
|
8
|
+
declare const MenuItemContent: Component<$$ComponentProps, {}, "">;
|
9
|
+
type MenuItemContent = ReturnType<typeof MenuItemContent>;
|
10
|
+
export default MenuItemContent;
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import type { StatusColorOrString } from "../
|
1
|
+
import type { StatusColorOrString } from "../util/color.js";
|
2
2
|
import type { Component, Snippet } from "svelte";
|
3
3
|
export type MenuItem = {
|
4
4
|
/** Type of menu item to render. */
|
@@ -7,14 +7,22 @@ export type MenuItem = {
|
|
7
7
|
/** Type of menu item to render. */
|
8
8
|
type: 'header';
|
9
9
|
/** Text label of the item to display to the user. */
|
10
|
-
|
10
|
+
text?: string;
|
11
|
+
/** Snippet to display. */
|
12
|
+
snippet?: Snippet;
|
13
|
+
/** Component to display. */
|
14
|
+
component?: Component;
|
11
15
|
/** Color to use for the item. */
|
12
16
|
color?: StatusColorOrString;
|
13
17
|
} | {
|
14
18
|
/** Type of menu item to render. */
|
15
19
|
type: 'item';
|
16
|
-
/**
|
17
|
-
|
20
|
+
/** Text label of the item to display to the user. */
|
21
|
+
text?: string;
|
22
|
+
/** Snippet to display. */
|
23
|
+
snippet?: Snippet;
|
24
|
+
/** Component to display. */
|
25
|
+
component?: Component;
|
18
26
|
/** Keyboard shortcut to display next to the item. */
|
19
27
|
shortcut?: string;
|
20
28
|
/** Icon to display. Pass either a Svelte Component or an URL. Use the Icon component to recolor your icons according to the user theme. */
|
@@ -31,6 +39,8 @@ export type MenuItem = {
|
|
31
39
|
children?: MenuItem[];
|
32
40
|
};
|
33
41
|
export type TabItem = {
|
42
|
+
/** Unique identifier of the item. */
|
43
|
+
id?: string;
|
34
44
|
/** Text label of the item to display to the user. */
|
35
45
|
label: string;
|
36
46
|
/** 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. */
|
@@ -46,7 +56,11 @@ export type TabbedContentItem = {
|
|
46
56
|
/** URL hash to use for the item. */
|
47
57
|
hash?: string;
|
48
58
|
/** Content to display when the item is selected. */
|
49
|
-
|
59
|
+
text?: string;
|
60
|
+
/** Snippet to display. */
|
61
|
+
snippet?: Snippet;
|
62
|
+
/** Component to display. */
|
63
|
+
component?: Component;
|
50
64
|
};
|
51
65
|
export type BreadcrumbItem = {
|
52
66
|
/** Text label of the item to display to the user. */
|
@@ -0,0 +1,149 @@
|
|
1
|
+
<script lang="ts">
|
2
|
+
import UiContent from "./UIContent.svelte";
|
3
|
+
import { getContext, type Snippet } from "svelte";
|
4
|
+
import { slidefade } from "../util/transitions.js";
|
5
|
+
import { attr } from "../util/attr.js";
|
6
|
+
|
7
|
+
/**
|
8
|
+
* @description
|
9
|
+
* A modal component that uses the popover api. Both trigger and content elements are snippets.
|
10
|
+
* For the trigger element, you get an `attrs` function that applies the necessary attributes to your trigger with the `use:attrs` directive.
|
11
|
+
* @example
|
12
|
+
* <div>
|
13
|
+
* {#snippet trigger(attrs)}
|
14
|
+
* <button use:attrs>foo</button>
|
15
|
+
* {/snippet}
|
16
|
+
* {#snippet content(close)}
|
17
|
+
* <div>bar</div>
|
18
|
+
* {/snippet}
|
19
|
+
* <Modal trigger={trigger} content={content} />
|
20
|
+
* <Modal trigger={trigger} content={content} hover />
|
21
|
+
* </div>
|
22
|
+
*/
|
23
|
+
let {
|
24
|
+
contained,
|
25
|
+
content,
|
26
|
+
buttons,
|
27
|
+
trigger,
|
28
|
+
shape = "rounded",
|
29
|
+
}: {
|
30
|
+
/** Whether the modal should be contained with a border */
|
31
|
+
contained?: boolean;
|
32
|
+
/** The content of the modal */
|
33
|
+
content: Snippet<[close: () => void]>;
|
34
|
+
/** Snippet containing the trigger element */
|
35
|
+
trigger: Snippet<[attrs: (node: Element) => void]>;
|
36
|
+
/** Buttons to be displayed in the modal */
|
37
|
+
buttons?: Snippet<[close: () => void]>;
|
38
|
+
/** The shape of the modal */
|
39
|
+
shape?: "rounded" | "sharp";
|
40
|
+
} = $props();
|
41
|
+
|
42
|
+
if(contained === undefined) { contained = getContext('lutra.modal.contained') ?? getContext('lutra.contained') ?? false; }
|
43
|
+
|
44
|
+
const id = `po-${Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15)}`;
|
45
|
+
let isOpen = $state(false);
|
46
|
+
|
47
|
+
function closeModal() { document.getElementById(id)!.hidePopover(); isOpen = false; }
|
48
|
+
function toggleModal() { isOpen = !isOpen; }
|
49
|
+
|
50
|
+
function clickElsewhere(e: MouseEvent) {
|
51
|
+
if (e.target instanceof HTMLElement && !e.target.closest('.ModalContent')) {
|
52
|
+
closeModal();
|
53
|
+
}
|
54
|
+
}
|
55
|
+
|
56
|
+
$effect(() => {
|
57
|
+
if(isOpen) {
|
58
|
+
document.getElementsByTagName("html")[0].style.overflow = "hidden";
|
59
|
+
} else {
|
60
|
+
document.getElementsByTagName("html")[0].style.overflow = "auto";
|
61
|
+
}
|
62
|
+
});
|
63
|
+
|
64
|
+
let attrs = $derived.by(() => {
|
65
|
+
return attr({
|
66
|
+
id: `trigger-${id}`,
|
67
|
+
popovertarget: id,
|
68
|
+
onclick: toggleModal,
|
69
|
+
})
|
70
|
+
});
|
71
|
+
|
72
|
+
</script>
|
73
|
+
|
74
|
+
<div class="Modal">
|
75
|
+
<div class="Trigger">
|
76
|
+
{@render trigger(attrs)}
|
77
|
+
</div>
|
78
|
+
{#if isOpen}
|
79
|
+
<UiContent>
|
80
|
+
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
81
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
82
|
+
<div {id} onclick={clickElsewhere} popover="auto" class="ModalContainer">
|
83
|
+
<div class="ModalContent {shape}" class:contained>
|
84
|
+
<div class="ModalContentInside">
|
85
|
+
{@render content(closeModal)}
|
86
|
+
{#if buttons}
|
87
|
+
<div class="ModalActions">
|
88
|
+
{@render buttons(closeModal)}
|
89
|
+
</div>
|
90
|
+
{/if}
|
91
|
+
</div>
|
92
|
+
</div>
|
93
|
+
</div>
|
94
|
+
</UiContent>
|
95
|
+
{/if}
|
96
|
+
</div>
|
97
|
+
|
98
|
+
<style>
|
99
|
+
.Modal, .Trigger {
|
100
|
+
position: relative;
|
101
|
+
display: inline-block;
|
102
|
+
}
|
103
|
+
.ModalContainer {
|
104
|
+
border: 0;
|
105
|
+
width: 100vw;
|
106
|
+
height: 100vh;
|
107
|
+
background-color: var(--bg-overlay);
|
108
|
+
backdrop-filter: var(--overlay-filter);
|
109
|
+
overflow-y: auto;
|
110
|
+
}
|
111
|
+
.ModalContent {
|
112
|
+
background: var(--bg, var(--background-main));
|
113
|
+
box-shadow: var(--shadow);
|
114
|
+
opacity: 1;
|
115
|
+
position: absolute;
|
116
|
+
left: 50%;
|
117
|
+
top: 50%;
|
118
|
+
transform: translate(-50%, -50%);
|
119
|
+
box-shadow: 0 0.25rem 1rem 0 var(--shadow);
|
120
|
+
}
|
121
|
+
.ModalContentInsize {
|
122
|
+
container-type: inline-size;
|
123
|
+
}
|
124
|
+
.ModalContent.rounded {
|
125
|
+
border-radius: var(--border-radius);
|
126
|
+
}
|
127
|
+
.ModalContent.contained {
|
128
|
+
border: var(--border);
|
129
|
+
}
|
130
|
+
.ModalActions {
|
131
|
+
display: flex;
|
132
|
+
gap: 1rem;
|
133
|
+
border-top: var(--border);
|
134
|
+
justify-content: flex-end;
|
135
|
+
padding: 1rem;
|
136
|
+
background: var(--bg-subtle) linear-gradient(0deg, transparent, 95%, color-mix(in hsl, transparent 95%, var(--mix-target)));
|
137
|
+
}
|
138
|
+
[popover] {
|
139
|
+
animation: fadeIn 0.2s;
|
140
|
+
}
|
141
|
+
@keyframes fadeIn {
|
142
|
+
from {
|
143
|
+
opacity: 0;
|
144
|
+
}
|
145
|
+
to {
|
146
|
+
opacity: 1;
|
147
|
+
}
|
148
|
+
}
|
149
|
+
</style>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
import { type Snippet } from "svelte";
|
2
|
+
type $$ComponentProps = {
|
3
|
+
/** Whether the modal should be contained with a border */
|
4
|
+
contained?: boolean;
|
5
|
+
/** The content of the modal */
|
6
|
+
content: Snippet<[close: () => void]>;
|
7
|
+
/** Snippet containing the trigger element */
|
8
|
+
trigger: Snippet<[attrs: (node: Element) => void]>;
|
9
|
+
/** Buttons to be displayed in the modal */
|
10
|
+
buttons?: Snippet<[close: () => void]>;
|
11
|
+
/** The shape of the modal */
|
12
|
+
shape?: "rounded" | "sharp";
|
13
|
+
};
|
14
|
+
declare const Modal: import("svelte").Component<$$ComponentProps, {}, "">;
|
15
|
+
type Modal = ReturnType<typeof Modal>;
|
16
|
+
export default Modal;
|
@@ -1,21 +1,32 @@
|
|
1
|
-
<script lang="ts">
|
2
|
-
import
|
3
|
-
import
|
4
|
-
import
|
5
|
-
import {
|
6
|
-
import
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
1
|
+
<script lang="ts">
|
2
|
+
import Overlay from "./Overlay.svelte";
|
3
|
+
import PageContent from "./PageContent.svelte";
|
4
|
+
import { removeOverlay } from "./overlays.svelte.js";
|
5
|
+
import type { Snippet, Component } from "svelte";
|
6
|
+
import Close from "./Close.svelte";
|
7
|
+
import Icon from "./Icon.svelte";
|
8
|
+
|
9
|
+
let {
|
10
|
+
id = crypto.randomUUID(),
|
11
|
+
children,
|
12
|
+
title,
|
13
|
+
content,
|
14
|
+
icon,
|
15
|
+
actions,
|
16
|
+
}: {
|
17
|
+
id?: string;
|
18
|
+
children?: Snippet;
|
19
|
+
title?: string;
|
20
|
+
content?: string;
|
21
|
+
icon?: string | Component;
|
22
|
+
actions?: Snippet;
|
23
|
+
} = $props();
|
24
|
+
|
25
|
+
function onclick(e: MouseEvent) {
|
26
|
+
e.preventDefault();
|
27
|
+
removeOverlay(id);
|
28
|
+
}
|
29
|
+
|
19
30
|
</script>
|
20
31
|
|
21
32
|
{#snippet notification()}
|
@@ -60,9 +71,9 @@ function onclick(e) {
|
|
60
71
|
.Notification {
|
61
72
|
display: block;
|
62
73
|
pointer-events: none;
|
63
|
-
background: var(--
|
64
|
-
border-radius: var(--border-radius);
|
65
|
-
border: var(--border);
|
74
|
+
background-color: var(--notification-background-color);
|
75
|
+
border-radius: var(--notification-border-radius);
|
76
|
+
border: var(--notification-border-size) var(--notification-border-style) var(--notification-border-color);
|
66
77
|
padding: 0.75rem 1rem;
|
67
78
|
width: 30rem;
|
68
79
|
font-size: 0.85em;
|
@@ -70,7 +81,7 @@ function onclick(e) {
|
|
70
81
|
grid-template-areas: "content";
|
71
82
|
grid-template-columns: 1fr;
|
72
83
|
gap: 1rem;
|
73
|
-
box-shadow: 0 0.5rem 1rem var(--shadow);
|
84
|
+
box-shadow: 0 0.5rem 1rem var(--shadow-color);
|
74
85
|
}
|
75
86
|
.Notification:has(.Icon):has(.Actions) {
|
76
87
|
grid-template-areas: "icon content actions";
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import type { Snippet, Component } from "svelte";
|
2
|
+
type $$ComponentProps = {
|
3
|
+
id?: string;
|
4
|
+
children?: Snippet;
|
5
|
+
title?: string;
|
6
|
+
content?: string;
|
7
|
+
icon?: string | Component;
|
8
|
+
actions?: Snippet;
|
9
|
+
};
|
10
|
+
declare const Notification: Component<$$ComponentProps, {}, "">;
|
11
|
+
type Notification = ReturnType<typeof Notification>;
|
12
|
+
export default Notification;
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<script lang="ts">
|
2
|
+
import { onDestroy, onMount, type Snippet } from "svelte";
|
3
|
+
import { addOverlay, removeOverlay, type OverlayPosition, type TransitionOpts } from "./overlays.svelte.js";
|
4
|
+
|
5
|
+
let {
|
6
|
+
id = crypto.randomUUID(),
|
7
|
+
children,
|
8
|
+
position = "center",
|
9
|
+
anchor,
|
10
|
+
layer,
|
11
|
+
transition,
|
12
|
+
z,
|
13
|
+
}: {
|
14
|
+
id?: string;
|
15
|
+
children: Snippet;
|
16
|
+
anchor?: HTMLElement;
|
17
|
+
layer?: string;
|
18
|
+
position?: OverlayPosition;
|
19
|
+
transition?: TransitionOpts;
|
20
|
+
z?: number;
|
21
|
+
} = $props();
|
22
|
+
|
23
|
+
onMount(() => {
|
24
|
+
addOverlay({ id, z, layer, snippet: children, transition, position, anchor });
|
25
|
+
});
|
26
|
+
|
27
|
+
onDestroy(() => {
|
28
|
+
removeOverlay(id);
|
29
|
+
});
|
30
|
+
</script>
|
31
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
import { type Snippet } from "svelte";
|
2
|
+
import { type OverlayPosition, type TransitionOpts } from "./overlays.svelte.js";
|
3
|
+
type $$ComponentProps = {
|
4
|
+
id?: string;
|
5
|
+
children: Snippet;
|
6
|
+
anchor?: HTMLElement;
|
7
|
+
layer?: string;
|
8
|
+
position?: OverlayPosition;
|
9
|
+
transition?: TransitionOpts;
|
10
|
+
z?: number;
|
11
|
+
};
|
12
|
+
declare const Overlay: import("svelte").Component<$$ComponentProps, {}, "">;
|
13
|
+
type Overlay = ReturnType<typeof Overlay>;
|
14
|
+
export default Overlay;
|
@@ -1,6 +1,8 @@
|
|
1
|
-
<script lang="ts">
|
2
|
-
import
|
3
|
-
import
|
1
|
+
<script lang="ts">
|
2
|
+
import { overlays, type OverlayItem } from './overlays.svelte.js';
|
3
|
+
import OverlayLayer from './OverlayLayer.svelte';
|
4
|
+
import { slidefade } from '../util/transitions.js';
|
5
|
+
|
4
6
|
</script>
|
5
7
|
|
6
8
|
<div class="Overlay">
|
@@ -16,6 +18,7 @@ import { slidefade } from "../utils/transitions.js";
|
|
16
18
|
|
17
19
|
<style>
|
18
20
|
.Overlay {
|
21
|
+
isolation: isolate;
|
19
22
|
display: block;
|
20
23
|
position: fixed;
|
21
24
|
top: 0;
|
@@ -5,7 +5,10 @@ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> =
|
|
5
5
|
(internal: unknown, props: {
|
6
6
|
$$events?: Events;
|
7
7
|
$$slots?: Slots;
|
8
|
-
}): Exports
|
8
|
+
}): Exports & {
|
9
|
+
$set?: any;
|
10
|
+
$on?: any;
|
11
|
+
};
|
9
12
|
z_$$bindings?: Bindings;
|
10
13
|
}
|
11
14
|
declare const OverlayContainer: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
|