lutra 0.0.20 → 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.
Files changed (223) hide show
  1. package/README.md +4 -24
  2. package/dist/components/AspectRatio.svelte +26 -0
  3. package/dist/components/AspectRatio.svelte.d.ts +8 -0
  4. package/dist/components/Dialog.svelte +78 -0
  5. package/dist/components/Dialog.svelte.d.ts +14 -0
  6. package/dist/components/Layout.svelte +32 -0
  7. package/dist/components/Layout.svelte.d.ts +11 -0
  8. package/dist/components/PageContent.svelte +108 -0
  9. package/dist/components/PageContent.svelte.d.ts +38 -0
  10. package/dist/components/Theme.svelte +87 -0
  11. package/dist/components/Theme.svelte.d.ts +17 -0
  12. package/dist/{display → components}/Tooltip.svelte +37 -11
  13. package/dist/components/Tooltip.svelte.d.ts +12 -0
  14. package/dist/config.d.ts +30 -0
  15. package/dist/config.js +18 -0
  16. package/dist/css/0-layers.css +1 -0
  17. package/dist/css/1-props.css +775 -0
  18. package/dist/css/2-base.css +209 -0
  19. package/dist/css/3-typo.css +65 -0
  20. package/dist/css/4-layout.css +5 -0
  21. package/dist/css/5-media.css +21 -0
  22. package/dist/css/lutra.css +6 -0
  23. package/dist/index.d.ts +5 -1
  24. package/dist/index.js +5 -2
  25. package/dist/types.d.ts +39 -0
  26. package/dist/types.js +25 -0
  27. package/package.json +29 -75
  28. package/dist/data/Stat.svelte +0 -89
  29. package/dist/data/Stat.svelte.d.ts +0 -39
  30. package/dist/data/index.d.ts +0 -1
  31. package/dist/data/index.js +0 -1
  32. package/dist/display/Avatar.svelte +0 -61
  33. package/dist/display/Avatar.svelte.d.ts +0 -23
  34. package/dist/display/Badge.svelte +0 -93
  35. package/dist/display/Badge.svelte.d.ts +0 -34
  36. package/dist/display/Callout.svelte +0 -109
  37. package/dist/display/Callout.svelte.d.ts +0 -36
  38. package/dist/display/Close.svelte +0 -58
  39. package/dist/display/Close.svelte.d.ts +0 -21
  40. package/dist/display/Code.svelte +0 -195
  41. package/dist/display/Code.svelte.d.ts +0 -31
  42. package/dist/display/ContextTip.svelte +0 -26
  43. package/dist/display/ContextTip.svelte.d.ts +0 -22
  44. package/dist/display/Details.svelte +0 -49
  45. package/dist/display/Details.svelte.d.ts +0 -32
  46. package/dist/display/Hero.svelte +0 -50
  47. package/dist/display/Hero.svelte.d.ts +0 -30
  48. package/dist/display/Icon.svelte +0 -40
  49. package/dist/display/Icon.svelte.d.ts +0 -24
  50. package/dist/display/IconButton.svelte +0 -84
  51. package/dist/display/IconButton.svelte.d.ts +0 -30
  52. package/dist/display/Image.svelte +0 -91
  53. package/dist/display/Image.svelte.d.ts +0 -37
  54. package/dist/display/Indicator.svelte +0 -352
  55. package/dist/display/Indicator.svelte.d.ts +0 -24
  56. package/dist/display/Inset.svelte +0 -18
  57. package/dist/display/Inset.svelte.d.ts +0 -22
  58. package/dist/display/Notification.svelte +0 -104
  59. package/dist/display/Notification.svelte.d.ts +0 -42
  60. package/dist/display/Popup.svelte +0 -111
  61. package/dist/display/Popup.svelte.d.ts +0 -30
  62. package/dist/display/Table.svelte +0 -24
  63. package/dist/display/Table.svelte.d.ts +0 -34
  64. package/dist/display/Tag.svelte +0 -90
  65. package/dist/display/Tag.svelte.d.ts +0 -35
  66. package/dist/display/Tooltip.svelte.d.ts +0 -28
  67. package/dist/display/index.d.ts +0 -14
  68. package/dist/display/index.js +0 -14
  69. package/dist/display/notifications.svelte.d.ts +0 -21
  70. package/dist/display/notifications.svelte.js +0 -31
  71. package/dist/form/Button.svelte +0 -34
  72. package/dist/form/Button.svelte.d.ts +0 -36
  73. package/dist/form/FieldActions.svelte +0 -46
  74. package/dist/form/FieldActions.svelte.d.ts +0 -24
  75. package/dist/form/FieldContainer.svelte +0 -37
  76. package/dist/form/FieldContainer.svelte.d.ts +0 -24
  77. package/dist/form/FieldContent.svelte +0 -134
  78. package/dist/form/FieldContent.svelte.d.ts +0 -59
  79. package/dist/form/FieldError.svelte +0 -14
  80. package/dist/form/FieldError.svelte.d.ts +0 -21
  81. package/dist/form/FieldSection.svelte +0 -86
  82. package/dist/form/FieldSection.svelte.d.ts +0 -34
  83. package/dist/form/Fieldset.svelte +0 -68
  84. package/dist/form/Fieldset.svelte.d.ts +0 -42
  85. package/dist/form/Form.svelte +0 -98
  86. package/dist/form/Form.svelte.d.ts +0 -33
  87. package/dist/form/Input.svelte +0 -287
  88. package/dist/form/Input.svelte.d.ts +0 -142
  89. package/dist/form/InputLength.svelte +0 -32
  90. package/dist/form/InputLength.svelte.d.ts +0 -21
  91. package/dist/form/Label.svelte +0 -27
  92. package/dist/form/Label.svelte.d.ts +0 -31
  93. package/dist/form/Select.svelte +0 -88
  94. package/dist/form/Select.svelte.d.ts +0 -97
  95. package/dist/form/client.svelte.d.ts +0 -45
  96. package/dist/form/client.svelte.js +0 -90
  97. package/dist/form/form.d.ts +0 -52
  98. package/dist/form/form.js +0 -326
  99. package/dist/form/index.d.ts +0 -15
  100. package/dist/form/index.js +0 -15
  101. package/dist/form/types.d.ts +0 -52
  102. package/dist/form/types.js +0 -1
  103. package/dist/grid/Column.svelte +0 -11
  104. package/dist/grid/Column.svelte.d.ts +0 -22
  105. package/dist/grid/Grid.svelte +0 -19
  106. package/dist/grid/Grid.svelte.d.ts +0 -24
  107. package/dist/grid/Row.svelte +0 -44
  108. package/dist/grid/Row.svelte.d.ts +0 -24
  109. package/dist/icons/Alert.svelte +0 -3
  110. package/dist/icons/Alert.svelte.d.ts +0 -23
  111. package/dist/icons/Copy.svelte +0 -3
  112. package/dist/icons/Copy.svelte.d.ts +0 -23
  113. package/dist/icons/Done.svelte +0 -3
  114. package/dist/icons/Done.svelte.d.ts +0 -23
  115. package/dist/icons/Error.svelte +0 -3
  116. package/dist/icons/Error.svelte.d.ts +0 -23
  117. package/dist/icons/Help.svelte +0 -3
  118. package/dist/icons/Help.svelte.d.ts +0 -23
  119. package/dist/icons/Hide.svelte +0 -3
  120. package/dist/icons/Hide.svelte.d.ts +0 -23
  121. package/dist/icons/Info.svelte +0 -3
  122. package/dist/icons/Info.svelte.d.ts +0 -23
  123. package/dist/icons/Link.svelte +0 -3
  124. package/dist/icons/Link.svelte.d.ts +0 -23
  125. package/dist/icons/MenuBurger.svelte +0 -3
  126. package/dist/icons/MenuBurger.svelte.d.ts +0 -23
  127. package/dist/icons/MenuDots.svelte +0 -3
  128. package/dist/icons/MenuDots.svelte.d.ts +0 -23
  129. package/dist/icons/Show.svelte +0 -3
  130. package/dist/icons/Show.svelte.d.ts +0 -23
  131. package/dist/icons/Success.svelte +0 -3
  132. package/dist/icons/Success.svelte.d.ts +0 -23
  133. package/dist/icons/Warning.svelte +0 -3
  134. package/dist/icons/Warning.svelte.d.ts +0 -23
  135. package/dist/icons/index.d.ts +0 -11
  136. package/dist/icons/index.js +0 -11
  137. package/dist/layout/Layout.svelte +0 -45
  138. package/dist/layout/Layout.svelte.d.ts +0 -25
  139. package/dist/layout/LayoutFooter.svelte +0 -21
  140. package/dist/layout/LayoutFooter.svelte.d.ts +0 -19
  141. package/dist/layout/LayoutGrid.svelte +0 -51
  142. package/dist/layout/LayoutGrid.svelte.d.ts +0 -38
  143. package/dist/layout/LayoutHeader.svelte +0 -94
  144. package/dist/layout/LayoutHeader.svelte.d.ts +0 -39
  145. package/dist/layout/LayoutSideMenu.svelte +0 -54
  146. package/dist/layout/LayoutSideMenu.svelte.d.ts +0 -25
  147. package/dist/layout/LayoutTypes.d.ts +0 -15
  148. package/dist/layout/LayoutTypes.js +0 -9
  149. package/dist/layout/Overlay.svelte +0 -20
  150. package/dist/layout/Overlay.svelte.d.ts +0 -35
  151. package/dist/layout/OverlayContainer.svelte +0 -28
  152. package/dist/layout/OverlayContainer.svelte.d.ts +0 -16
  153. package/dist/layout/OverlayLayer.svelte +0 -145
  154. package/dist/layout/OverlayLayer.svelte.d.ts +0 -22
  155. package/dist/layout/PageContent.svelte +0 -97
  156. package/dist/layout/PageContent.svelte.d.ts +0 -28
  157. package/dist/layout/Theme.svelte +0 -228
  158. package/dist/layout/Theme.svelte.d.ts +0 -24
  159. package/dist/layout/UIContent.svelte +0 -15
  160. package/dist/layout/UIContent.svelte.d.ts +0 -22
  161. package/dist/layout/index.d.ts +0 -7
  162. package/dist/layout/index.js +0 -7
  163. package/dist/layout/overlays.svelte.d.ts +0 -34
  164. package/dist/layout/overlays.svelte.js +0 -44
  165. package/dist/nav/Breadcrumb.svelte +0 -82
  166. package/dist/nav/Breadcrumb.svelte.d.ts +0 -33
  167. package/dist/nav/Menu.svelte +0 -177
  168. package/dist/nav/Menu.svelte.d.ts +0 -33
  169. package/dist/nav/MenuItem.svelte +0 -140
  170. package/dist/nav/MenuItem.svelte.d.ts +0 -26
  171. package/dist/nav/MenuTypes.d.ts +0 -58
  172. package/dist/nav/MenuTypes.js +0 -1
  173. package/dist/nav/NavMenu.svelte +0 -183
  174. package/dist/nav/NavMenu.svelte.d.ts +0 -20
  175. package/dist/nav/TabbedContent.svelte +0 -43
  176. package/dist/nav/TabbedContent.svelte.d.ts +0 -24
  177. package/dist/nav/Tabs.svelte +0 -118
  178. package/dist/nav/Tabs.svelte.d.ts +0 -26
  179. package/dist/nav/index.d.ts +0 -6
  180. package/dist/nav/index.js +0 -5
  181. package/dist/style.css +0 -853
  182. package/dist/typo/Clamp.svelte +0 -25
  183. package/dist/typo/Clamp.svelte.d.ts +0 -28
  184. package/dist/typo/H.svelte +0 -52
  185. package/dist/typo/H.svelte.d.ts +0 -32
  186. package/dist/typo/H1.svelte +0 -14
  187. package/dist/typo/H1.svelte.d.ts +0 -30
  188. package/dist/typo/H2.svelte +0 -14
  189. package/dist/typo/H2.svelte.d.ts +0 -30
  190. package/dist/typo/H3.svelte +0 -14
  191. package/dist/typo/H3.svelte.d.ts +0 -30
  192. package/dist/typo/H4.svelte +0 -14
  193. package/dist/typo/H4.svelte.d.ts +0 -30
  194. package/dist/typo/H5.svelte +0 -14
  195. package/dist/typo/H5.svelte.d.ts +0 -30
  196. package/dist/typo/H6.svelte +0 -14
  197. package/dist/typo/H6.svelte.d.ts +0 -30
  198. package/dist/typo/P.svelte +0 -34
  199. package/dist/typo/P.svelte.d.ts +0 -30
  200. package/dist/typo/index.d.ts +0 -9
  201. package/dist/typo/index.js +0 -9
  202. package/dist/utils/StringOrComponentOrSnippet.svelte +0 -14
  203. package/dist/utils/StringOrComponentOrSnippet.svelte.d.ts +0 -24
  204. package/dist/utils/attr.d.ts +0 -5
  205. package/dist/utils/attr.js +0 -21
  206. package/dist/utils/color.d.ts +0 -51
  207. package/dist/utils/color.js +0 -97
  208. package/dist/utils/defaults.d.ts +0 -4
  209. package/dist/utils/defaults.js +0 -1
  210. package/dist/utils/dom.d.ts +0 -15
  211. package/dist/utils/dom.js +0 -74
  212. package/dist/utils/hooks.server.d.ts +0 -2
  213. package/dist/utils/hooks.server.js +0 -16
  214. package/dist/utils/id.d.ts +0 -1
  215. package/dist/utils/id.js +0 -3
  216. package/dist/utils/index.d.ts +0 -8
  217. package/dist/utils/index.js +0 -5
  218. package/dist/utils/isSnippet.d.ts +0 -5
  219. package/dist/utils/isSnippet.js +0 -6
  220. package/dist/utils/keyboard.svelte.d.ts +0 -22
  221. package/dist/utils/keyboard.svelte.js +0 -161
  222. /package/dist/{utils → util}/transitions.d.ts +0 -0
  223. /package/dist/{utils → util}/transitions.js +0 -0
@@ -1,82 +0,0 @@
1
- <script lang="ts">const {
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,33 +0,0 @@
1
- import { SvelteComponent } from "svelte";
2
- import type { ComponentType } from "svelte";
3
- import type { BreadcrumbItem } from "./MenuTypes.js";
4
- declare const __propDef: {
5
- props: {
6
- items: BreadcrumbItem[];
7
- separator?: string | ((this: void) => typeof import("svelte").SnippetReturn & {
8
- _: "functions passed to {@render ...} tags must use the `Snippet` type imported from \"svelte\"";
9
- }) | ComponentType | undefined;
10
- contained?: boolean | undefined;
11
- fullWidth?: boolean | undefined;
12
- center?: boolean | undefined;
13
- };
14
- events: {
15
- [evt: string]: CustomEvent<any>;
16
- };
17
- slots: {};
18
- };
19
- export type BreadcrumbProps = typeof __propDef.props;
20
- export type BreadcrumbEvents = typeof __propDef.events;
21
- export type BreadcrumbSlots = typeof __propDef.slots;
22
- export default class Breadcrumb extends SvelteComponent<BreadcrumbProps, BreadcrumbEvents, BreadcrumbSlots> {
23
- constructor(options?: import("svelte").ComponentConstructorOptions<{
24
- items: BreadcrumbItem[];
25
- separator?: string | ((this: void) => typeof import("svelte").SnippetReturn & {
26
- _: "functions passed to {@render ...} tags must use the `Snippet` type imported from \"svelte\"";
27
- }) | ComponentType | undefined;
28
- contained?: boolean | undefined;
29
- fullWidth?: boolean | undefined;
30
- center?: boolean | undefined;
31
- }>);
32
- }
33
- export {};
@@ -1,177 +0,0 @@
1
- <script lang="ts">import { BROWSER } from "esm-env";
2
- import MenuItem from "./MenuItem.svelte";
3
- import { isComponent } from "../utils/isSnippet.js";
4
- import { createId } from "../utils/id.js";
5
- import { slidefade } from "../utils/transitions.js";
6
- import UiContent from "../layout/UIContent.svelte";
7
- import { arrowNavigation, getNextFocusableElement, matchOnType } from "../utils/keyboard.svelte.js";
8
- import StringOrComponentOrSnippet from "../utils/StringOrComponentOrSnippet.svelte";
9
- import { findContainingBlock, getPossiblyContainedPosition } from "../utils/dom.js";
10
- import Overlay from "../layout/Overlay.svelte";
11
- let {
12
- open = $bindable(false),
13
- items,
14
- trigger
15
- } = $props();
16
- let _open = $state(open);
17
- let triggerEl = $state(null);
18
- let contentEl = $state(null);
19
- let menuEl = $state(null);
20
- let currentIndex = $state(-1);
21
- let keyboardHasFocus = $state(false);
22
- const id = createId();
23
- $effect(() => {
24
- if (_open) {
25
- window.addEventListener("click", clickoutside);
26
- window.addEventListener("keydown", onkeydown);
27
- } else {
28
- window.removeEventListener("click", clickoutside);
29
- window.removeEventListener("keydown", onkeydown);
30
- }
31
- });
32
- function toggle() {
33
- _open = !_open;
34
- }
35
- let scrollable = $derived.by(() => {
36
- if (!contentEl)
37
- return false;
38
- return contentEl.scrollHeight > contentEl.clientHeight;
39
- });
40
- function onclick(e) {
41
- e.preventDefault();
42
- _open = !_open;
43
- }
44
- function clickoutside(e) {
45
- if (!_open)
46
- return;
47
- if (contentEl && !contentEl.contains(e.target) && !triggerEl?.contains(e.target)) {
48
- _open = false;
49
- }
50
- }
51
- function onkeydown(e) {
52
- if (!_open)
53
- return;
54
- const active = document.activeElement;
55
- switch (e.key) {
56
- case "Escape":
57
- e.preventDefault();
58
- _open = false;
59
- break;
60
- case "Tab":
61
- e.preventDefault();
62
- e.stopPropagation();
63
- _open = false;
64
- setTimeout(() => {
65
- const nextEl = getNextFocusableElement(menuEl, triggerEl, e.shiftKey ? "previous" : "next");
66
- console.log("nextEl", nextEl);
67
- if (nextEl) {
68
- nextEl.focus();
69
- if (nextEl.tagName === "BUTTON" || nextEl.tagName === "A" && nextEl.parentElement?.classList.contains("Trigger")) {
70
- nextEl.click();
71
- }
72
- }
73
- }, 0);
74
- break;
75
- case "ArrowDown":
76
- e.preventDefault();
77
- arrowNavigation(contentEl, "down");
78
- matchOnType(contentEl, e);
79
- keyboardHasFocus = true;
80
- break;
81
- case "ArrowUp":
82
- e.preventDefault();
83
- arrowNavigation(contentEl, "up");
84
- matchOnType(contentEl, e);
85
- keyboardHasFocus = true;
86
- break;
87
- case "Enter":
88
- case "Space":
89
- e.preventDefault();
90
- active.click();
91
- break;
92
- default:
93
- matchOnType(contentEl, e);
94
- }
95
- }
96
- function mouseover(e, item, index) {
97
- if (item.type === "item") {
98
- currentIndex = index;
99
- }
100
- }
101
- </script>
102
-
103
-
104
- <UiContent>
105
- <div class="Menu" bind:this={menuEl}>
106
- <div
107
- class="Trigger"
108
- bind:this={triggerEl}
109
- >
110
- {#if typeof trigger === "string" || isComponent(trigger)}
111
- <button type="button" class="button" {onclick} aria-haspopup="true" aria-controls={id} aria-expanded="{_open}">
112
- <StringOrComponentOrSnippet content={trigger} />
113
- </button>
114
- {:else}
115
- {@render trigger({ toggle: toggle, isOpen: _open })}
116
- {/if}
117
- </div>
118
- {#if _open && triggerEl}
119
- <Overlay position="anchor" id="o-{id}" anchor={triggerEl} layer="menu">
120
- <div {id}
121
- class="MenuContent"
122
- class:scrollable={scrollable}
123
- role="menu"
124
- bind:this={contentEl}
125
- >
126
- <ul>
127
- {#each items as item, index}
128
- <MenuItem {keyboardHasFocus} onmouseover={mouseover} item={item} {index} />
129
- {/each}
130
- </ul>
131
- </div>
132
- </Overlay>
133
- {/if}
134
- </div>
135
- </UiContent>
136
-
137
- <style>
138
- .Menu {
139
- position: relative;
140
- }
141
-
142
- .Trigger {
143
- position: relative;
144
- display: inline-flex;
145
- }
146
-
147
- .MenuContent {
148
- max-height: calc(50vh - 2rem);
149
- margin: 0;
150
- z-index: 1000;
151
- margin: 0;
152
- border: var(--menu-border);
153
- border-radius: var(--border-radius);
154
- box-shadow: 0 0.5rem 1rem var(--shadow);
155
- background-color: var(--menu-bg);
156
- width: var(--width, 25ch);
157
- overflow-x: clip;
158
- overflow-y: auto;
159
- scrollbar-width: thin;
160
- scrollbar-color: var(--scrollbar-color);
161
- }
162
-
163
- .MenuContent.scrollable {
164
- border-top-right-radius: 0;
165
- border-bottom-right-radius: 0;
166
- }
167
-
168
- .MenuContent:has(li:last-of-type[data-type="item"]) {
169
- padding-block-end: 0.5rem;
170
- }
171
-
172
- ul {
173
- margin: 0;
174
- list-style: none;
175
- padding: 0;
176
- }
177
- </style>
@@ -1,33 +0,0 @@
1
- import { SvelteComponent } from "svelte";
2
- import type { ComponentType, Snippet } from "svelte";
3
- import type { MenuItem as Item } from "./MenuTypes.js";
4
- declare const __propDef: {
5
- props: {
6
- open?: import("svelte").Bindable<boolean | undefined>;
7
- items: Item[];
8
- trigger: string | ComponentType | Snippet<[{
9
- toggle: () => void;
10
- isOpen: boolean;
11
- }]>;
12
- };
13
- events: {
14
- [evt: string]: CustomEvent<any>;
15
- };
16
- slots: {};
17
- };
18
- export type MenuProps = typeof __propDef.props;
19
- export type MenuEvents = typeof __propDef.events;
20
- export type MenuSlots = typeof __propDef.slots;
21
- export default class Menu extends SvelteComponent<MenuProps, MenuEvents, MenuSlots> {
22
- constructor(options?: import("svelte").ComponentConstructorOptions<{
23
- open?: import("svelte").Bindable<boolean | undefined>;
24
- items: Item[];
25
- trigger: string | ComponentType | ((this: void, args_0: {
26
- toggle: () => void;
27
- isOpen: boolean;
28
- }) => typeof import("svelte").SnippetReturn & {
29
- _: "functions passed to {@render ...} tags must use the `Snippet` type imported from \"svelte\"";
30
- });
31
- }>);
32
- }
33
- export {};
@@ -1,140 +0,0 @@
1
- <script lang="ts">import StringOrComponentOrSnippet from "../utils/StringOrComponentOrSnippet.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
- } = $props();
10
- let isSet = $derived(item.type !== "divider" ? isStatusColor(item.color) : false);
11
- let el = $state(null);
12
- function mouseover(e) {
13
- if (onmouseover && item.type === "item") {
14
- el?.focus();
15
- }
16
- }
17
- </script>
18
-
19
- <!-- svelte-ignore a11y_mouse_events_have_key_events -->
20
- <li
21
- onmouseover={mouseover}
22
- data-index={index}
23
- class:keyboardHasFocus
24
- class:divider={item.type === 'divider'}
25
- class:header={item.type === 'header'}
26
- data-type="{item.type}"
27
- style="--color: {isSet && item.type !== 'divider' ? 'var(--status-'+item.color+')' : (item.type !== 'divider' && item.color ? item.color : 'var(--menu-text)')}"
28
- >
29
- {#if item.type === 'divider'}
30
- <hr />
31
- {:else if item.type === 'header'}
32
- <div class="Header">
33
- <StringOrComponentOrSnippet content={item.content} />
34
- </div>
35
- {:else if item.type === 'item'}
36
- {#if item.href}
37
- <a href="{item.href}" class="Item" bind:this={el}>
38
- <span class="Content">
39
- <StringOrComponentOrSnippet content={item.content} />
40
- </span>
41
- {#if item.shortcut}
42
- <span class="Shortcut">{item.shortcut}</span>
43
- {/if}
44
- </a>
45
- {:else if item.onclick}
46
- <button type="button" onclick={(e) => item.type === 'item' ? item.onclick!(e, item) : undefined} class="Item" bind:this={el}>
47
- <span class="Content">
48
- <StringOrComponentOrSnippet content={item.content} />
49
- </span>
50
- {#if item.shortcut}
51
- <span class="Shortcut">{item.shortcut}</span>
52
- {/if}
53
- </button>
54
- {:else if isSnippet(item.content)}
55
- <div class="Item Custom">
56
- {@render item.content()}
57
- </div>
58
- {:else if isComponent(item.content)}
59
- <div class="Item Custom">
60
- <svelte:component this={item.content} />
61
- </div>
62
- {/if}
63
- {/if}
64
- </li>
65
-
66
- <style>
67
- li {
68
- margin: 0;
69
- list-style: none;
70
- padding: 0;
71
- user-select: none;
72
- }
73
-
74
- li .Item,
75
- li .Header {
76
- font-size: 1em;
77
- text-align: left;
78
- padding-block: 0.5rem;
79
- padding-inline: 1rem;
80
- display: inline-flex;
81
- align-items: center;
82
- justify-content: space-between;
83
- width: 100%;
84
- color: inherit;
85
- text-decoration: none;
86
- color: var(--color);
87
- --inset-block: 0.5rem;
88
- --inset-inline: 1rem;
89
- }
90
-
91
- li .Header {
92
- font-weight: 600;
93
- }
94
-
95
- li:not(.keyboardHasFocus) .Item:not(.Custom):hover,
96
- li .Item:not(.Custom):focus-visible {
97
- background-color: var(--menu-bg-hover);
98
- cursor: pointer;
99
- outline: none;
100
- }
101
-
102
- li .Item span.Shortcut {
103
- font-size: max(0.75em, 9px);
104
- text-align: right;
105
- color: var(--text-subtle);
106
- }
107
-
108
- li .Item:not(.Custom):active {
109
- scale: 1;
110
- }
111
-
112
- li.divider {
113
- padding-block: 0.5rem;
114
- }
115
-
116
- hr {
117
- display: block;
118
- border: none;
119
- margin: 0;
120
- border-top: 1px solid var(--border-color);
121
- }
122
-
123
- li:first-child[data-type="item"] {
124
- margin-block-start: var(--menu-item-margin, 0.5rem);
125
- }
126
-
127
- li:first-child[data-type="header"]:has(+ li[data-type="item"]) {
128
- margin-block-end: 0.125rem;
129
- }
130
-
131
- li:nth-last-child(2)[data-type="item"]:has(+ li[data-type="header"]:last-child) {
132
- margin-block-end: 0.5rem;
133
- }
134
-
135
- @media (pointer: none) {
136
- li .Item span.Shortcut {
137
- display: none;
138
- }
139
- }
140
- </style>
@@ -1,26 +0,0 @@
1
- import { SvelteComponent } from "svelte";
2
- import type { MenuItem as Item } from "./MenuTypes.js";
3
- declare const __propDef: {
4
- props: {
5
- item: Item;
6
- index: number;
7
- onmouseover?: ((e: MouseEvent, item: Item, index: number) => void) | undefined;
8
- keyboardHasFocus?: boolean | undefined;
9
- };
10
- events: {
11
- [evt: string]: CustomEvent<any>;
12
- };
13
- slots: {};
14
- };
15
- export type MenuItemProps = typeof __propDef.props;
16
- export type MenuItemEvents = typeof __propDef.events;
17
- export type MenuItemSlots = typeof __propDef.slots;
18
- export default class MenuItem extends SvelteComponent<MenuItemProps, MenuItemEvents, MenuItemSlots> {
19
- constructor(options?: import("svelte").ComponentConstructorOptions<{
20
- item: Item;
21
- index: number;
22
- onmouseover?: ((e: MouseEvent, item: Item, index: number) => void) | undefined;
23
- keyboardHasFocus?: boolean | undefined;
24
- }>);
25
- }
26
- export {};
@@ -1,58 +0,0 @@
1
- import type { StatusColorOrString } from "../utils/color.js";
2
- import type { ComponentType, 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 | ComponentType | Snippet;
11
- /** Color to use for the item. */
12
- color?: StatusColorOrString;
13
- } | {
14
- /** Type of menu item to render. */
15
- type: 'item';
16
- /** Text label of the item to display to the user. */
17
- content: string | ComponentType | 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 | ComponentType;
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 | ComponentType;
56
- /** Path or URL to use for the breadcrumb item. */
57
- href?: string;
58
- };
@@ -1 +0,0 @@
1
- export {};