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.
Files changed (274) 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/Avatar.svelte +105 -0
  5. package/dist/components/Avatar.svelte.d.ts +14 -0
  6. package/dist/{display → components}/Close.svelte +25 -7
  7. package/dist/components/Close.svelte.d.ts +7 -0
  8. package/dist/components/ContextTip.svelte +41 -0
  9. package/dist/components/ContextTip.svelte.d.ts +7 -0
  10. package/dist/components/Dialog.svelte +78 -0
  11. package/dist/components/Dialog.svelte.d.ts +14 -0
  12. package/dist/components/Icon.svelte +62 -0
  13. package/dist/components/Icon.svelte.d.ts +8 -0
  14. package/dist/{display → components}/IconButton.svelte +43 -14
  15. package/dist/components/IconButton.svelte.d.ts +16 -0
  16. package/dist/components/Image.svelte +172 -0
  17. package/dist/components/Image.svelte.d.ts +56 -0
  18. package/dist/{display → components}/Indicator.svelte +44 -9
  19. package/dist/components/Indicator.svelte.d.ts +12 -0
  20. package/dist/{display → components}/Inset.svelte +8 -3
  21. package/dist/components/Inset.svelte.d.ts +7 -0
  22. package/dist/components/Layout.svelte +33 -0
  23. package/dist/components/Layout.svelte.d.ts +11 -0
  24. package/dist/components/MenuDropdown.svelte +195 -0
  25. package/dist/components/MenuDropdown.svelte.d.ts +16 -0
  26. package/dist/{nav → components}/MenuItem.svelte +46 -38
  27. package/dist/components/MenuItem.svelte.d.ts +11 -0
  28. package/dist/components/MenuItemContent.svelte +25 -0
  29. package/dist/components/MenuItemContent.svelte.d.ts +10 -0
  30. package/dist/{nav → components}/MenuTypes.d.ts +19 -5
  31. package/dist/components/Modal.svelte +149 -0
  32. package/dist/components/Modal.svelte.d.ts +16 -0
  33. package/dist/{display → components}/Notification.svelte +33 -22
  34. package/dist/components/Notification.svelte.d.ts +12 -0
  35. package/dist/components/Overlay.svelte +31 -0
  36. package/dist/components/Overlay.svelte.d.ts +14 -0
  37. package/dist/{layout → components}/OverlayContainer.svelte +6 -3
  38. package/dist/{layout → components}/OverlayContainer.svelte.d.ts +4 -1
  39. package/dist/components/OverlayLayer.svelte +168 -0
  40. package/dist/components/OverlayLayer.svelte.d.ts +8 -0
  41. package/dist/components/PageContent.svelte +108 -0
  42. package/dist/components/PageContent.svelte.d.ts +38 -0
  43. package/dist/components/TabbedContent.svelte +74 -0
  44. package/dist/components/TabbedContent.svelte.d.ts +11 -0
  45. package/dist/components/TabbedContentItem.svelte +33 -0
  46. package/dist/components/TabbedContentItem.svelte.d.ts +10 -0
  47. package/dist/components/Table.svelte +41 -0
  48. package/dist/components/Table.svelte.d.ts +13 -0
  49. package/dist/{nav → components}/Tabs.svelte +99 -41
  50. package/dist/components/Tabs.svelte.d.ts +20 -0
  51. package/dist/components/Tag.svelte +120 -0
  52. package/dist/components/Tag.svelte.d.ts +21 -0
  53. package/dist/components/Theme.svelte +105 -0
  54. package/dist/components/Theme.svelte.d.ts +17 -0
  55. package/dist/{display → components}/Tooltip.svelte +41 -16
  56. package/dist/components/Tooltip.svelte.d.ts +12 -0
  57. package/dist/components/UIContent.svelte +19 -0
  58. package/dist/components/UIContent.svelte.d.ts +7 -0
  59. package/dist/components/index.d.ts +28 -0
  60. package/dist/components/index.js +29 -0
  61. package/dist/{display → components}/notifications.svelte.d.ts +1 -1
  62. package/dist/{display → components}/notifications.svelte.js +3 -4
  63. package/dist/{layout → components}/overlays.svelte.d.ts +4 -2
  64. package/dist/config.d.ts +30 -0
  65. package/dist/config.js +18 -0
  66. package/dist/css/1-props.css +440 -0
  67. package/dist/css/2-base.css +343 -0
  68. package/dist/css/3-typo.css +106 -0
  69. package/dist/css/4-layout.css +368 -0
  70. package/dist/css/5-media.css +116 -0
  71. package/dist/css/lutra.css +7 -0
  72. package/dist/css/themes/DefaultTheme.css +209 -0
  73. package/dist/form/Button.svelte +35 -16
  74. package/dist/form/Button.svelte.d.ts +8 -19
  75. package/dist/form/Datepicker.svelte +311 -0
  76. package/dist/form/Datepicker.svelte.d.ts +9 -0
  77. package/dist/form/FieldContent.svelte +69 -44
  78. package/dist/form/FieldContent.svelte.d.ts +7 -17
  79. package/dist/form/FieldError.svelte +16 -6
  80. package/dist/form/FieldError.svelte.d.ts +4 -15
  81. package/dist/form/Fieldset.svelte +48 -13
  82. package/dist/form/Fieldset.svelte.d.ts +5 -16
  83. package/dist/form/Form.svelte +158 -74
  84. package/dist/form/Form.svelte.d.ts +17 -17
  85. package/dist/form/{FieldActions.svelte → FormActions.svelte} +29 -17
  86. package/dist/form/FormActions.svelte.d.ts +9 -0
  87. package/dist/form/FormSection.svelte +96 -0
  88. package/dist/form/FormSection.svelte.d.ts +9 -0
  89. package/dist/form/ImageUpload.svelte +134 -94
  90. package/dist/form/ImageUpload.svelte.d.ts +5 -16
  91. package/dist/form/Input.svelte +254 -136
  92. package/dist/form/Input.svelte.d.ts +12 -21
  93. package/dist/form/InputLength.svelte +15 -5
  94. package/dist/form/InputLength.svelte.d.ts +4 -15
  95. package/dist/form/Label.svelte +55 -11
  96. package/dist/form/Label.svelte.d.ts +6 -15
  97. package/dist/form/LogoUpload.svelte +36 -21
  98. package/dist/form/LogoUpload.svelte.d.ts +4 -15
  99. package/dist/form/Select.svelte +100 -50
  100. package/dist/form/Select.svelte.d.ts +5 -16
  101. package/dist/form/Textarea.svelte +200 -98
  102. package/dist/form/Textarea.svelte.d.ts +11 -24
  103. package/dist/form/Toggle.svelte +3 -1
  104. package/dist/form/Toggle.svelte.d.ts +4 -1
  105. package/dist/form/client.svelte.d.ts +1 -0
  106. package/dist/form/client.svelte.js +6 -2
  107. package/dist/form/form.d.ts +10 -9
  108. package/dist/form/form.js +37 -32
  109. package/dist/form/index.d.ts +3 -4
  110. package/dist/form/index.js +3 -4
  111. package/dist/form/types.d.ts +9 -16
  112. package/dist/icons/IconAlert.svelte.d.ts +4 -1
  113. package/dist/icons/IconCopy.svelte.d.ts +4 -1
  114. package/dist/icons/IconDone.svelte.d.ts +4 -1
  115. package/dist/icons/IconError.svelte.d.ts +4 -1
  116. package/dist/icons/IconHelp.svelte.d.ts +4 -1
  117. package/dist/icons/IconHide.svelte.d.ts +4 -1
  118. package/dist/icons/IconInfo.svelte.d.ts +4 -1
  119. package/dist/icons/IconLink.svelte.d.ts +4 -1
  120. package/dist/icons/IconMenuBurger.svelte.d.ts +4 -1
  121. package/dist/icons/IconMenuDots.svelte.d.ts +4 -1
  122. package/dist/icons/IconSearch.svelte.d.ts +4 -1
  123. package/dist/icons/IconShow.svelte.d.ts +4 -1
  124. package/dist/icons/IconSuccess.svelte.d.ts +4 -1
  125. package/dist/icons/IconWarning.svelte.d.ts +4 -1
  126. package/dist/index.d.ts +3 -1
  127. package/dist/index.js +3 -2
  128. package/dist/types.d.ts +39 -0
  129. package/dist/types.js +25 -0
  130. package/dist/util/StringOrComponent.svelte +20 -0
  131. package/dist/util/StringOrComponent.svelte.d.ts +8 -0
  132. package/dist/util/StringOrSnippet.svelte +16 -0
  133. package/dist/util/StringOrSnippet.svelte.d.ts +8 -0
  134. package/dist/{utils → util}/dom.js +1 -2
  135. package/dist/util/locale.d.ts +1 -0
  136. package/dist/util/locale.js +47 -0
  137. package/dist/util/settings.d.ts +4 -0
  138. package/package.json +35 -79
  139. package/dist/color.css +0 -0
  140. package/dist/display/Avatar.svelte +0 -61
  141. package/dist/display/Avatar.svelte.d.ts +0 -19
  142. package/dist/display/Badge.svelte +0 -91
  143. package/dist/display/Badge.svelte.d.ts +0 -30
  144. package/dist/display/Callout.svelte +0 -109
  145. package/dist/display/Callout.svelte.d.ts +0 -28
  146. package/dist/display/Close.svelte.d.ts +0 -18
  147. package/dist/display/Code.svelte +0 -190
  148. package/dist/display/Code.svelte.d.ts +0 -32
  149. package/dist/display/ContextTip.svelte +0 -23
  150. package/dist/display/ContextTip.svelte.d.ts +0 -18
  151. package/dist/display/DataList.svelte +0 -16
  152. package/dist/display/DataList.svelte.d.ts +0 -21
  153. package/dist/display/Details.svelte +0 -49
  154. package/dist/display/Details.svelte.d.ts +0 -27
  155. package/dist/display/Hero.svelte +0 -50
  156. package/dist/display/Hero.svelte.d.ts +0 -26
  157. package/dist/display/Icon.svelte +0 -39
  158. package/dist/display/Icon.svelte.d.ts +0 -19
  159. package/dist/display/IconButton.svelte.d.ts +0 -27
  160. package/dist/display/Image.svelte +0 -91
  161. package/dist/display/Image.svelte.d.ts +0 -26
  162. package/dist/display/Indicator.svelte.d.ts +0 -23
  163. package/dist/display/Inset.svelte.d.ts +0 -18
  164. package/dist/display/LineChart.svelte +0 -385
  165. package/dist/display/LineChart.svelte.d.ts +0 -24
  166. package/dist/display/LoadingIndicator.svelte +0 -33
  167. package/dist/display/LoadingIndicator.svelte.d.ts +0 -15
  168. package/dist/display/Modal.svelte +0 -116
  169. package/dist/display/Modal.svelte.d.ts +0 -27
  170. package/dist/display/Notification.svelte.d.ts +0 -23
  171. package/dist/display/Panel.svelte +0 -23
  172. package/dist/display/Panel.svelte.d.ts +0 -19
  173. package/dist/display/Popup.svelte +0 -111
  174. package/dist/display/Popup.svelte.d.ts +0 -25
  175. package/dist/display/Stat.svelte +0 -81
  176. package/dist/display/Stat.svelte.d.ts +0 -30
  177. package/dist/display/Table.svelte +0 -28
  178. package/dist/display/Table.svelte.d.ts +0 -24
  179. package/dist/display/TablePaginator.svelte +0 -51
  180. package/dist/display/TablePaginator.svelte.d.ts +0 -21
  181. package/dist/display/Tag.svelte +0 -90
  182. package/dist/display/Tag.svelte.d.ts +0 -32
  183. package/dist/display/Tooltip.svelte.d.ts +0 -23
  184. package/dist/display/chart.d.ts +0 -78
  185. package/dist/display/chart.js +0 -212
  186. package/dist/display/index.d.ts +0 -24
  187. package/dist/display/index.js +0 -24
  188. package/dist/form/FieldActions.svelte.d.ts +0 -20
  189. package/dist/form/FieldContainer.svelte +0 -37
  190. package/dist/form/FieldContainer.svelte.d.ts +0 -19
  191. package/dist/form/FieldSection.svelte +0 -86
  192. package/dist/form/FieldSection.svelte.d.ts +0 -20
  193. package/dist/layout/Layout.svelte +0 -47
  194. package/dist/layout/Layout.svelte.d.ts +0 -22
  195. package/dist/layout/LayoutFooter.svelte +0 -21
  196. package/dist/layout/LayoutFooter.svelte.d.ts +0 -18
  197. package/dist/layout/LayoutGrid.svelte +0 -51
  198. package/dist/layout/LayoutGrid.svelte.d.ts +0 -27
  199. package/dist/layout/LayoutHeader.svelte +0 -97
  200. package/dist/layout/LayoutHeader.svelte.d.ts +0 -34
  201. package/dist/layout/LayoutSideMenu.svelte +0 -55
  202. package/dist/layout/LayoutSideMenu.svelte.d.ts +0 -21
  203. package/dist/layout/LayoutTypes.d.ts +0 -15
  204. package/dist/layout/LayoutTypes.js +0 -9
  205. package/dist/layout/Overlay.svelte +0 -20
  206. package/dist/layout/Overlay.svelte.d.ts +0 -25
  207. package/dist/layout/OverlayLayer.svelte +0 -140
  208. package/dist/layout/OverlayLayer.svelte.d.ts +0 -19
  209. package/dist/layout/PageContent.svelte +0 -82
  210. package/dist/layout/PageContent.svelte.d.ts +0 -25
  211. package/dist/layout/Theme.svelte +0 -243
  212. package/dist/layout/Theme.svelte.d.ts +0 -19
  213. package/dist/layout/UIContent.svelte +0 -15
  214. package/dist/layout/UIContent.svelte.d.ts +0 -18
  215. package/dist/layout/index.d.ts +0 -11
  216. package/dist/layout/index.js +0 -11
  217. package/dist/nav/Breadcrumb.svelte +0 -82
  218. package/dist/nav/Breadcrumb.svelte.d.ts +0 -28
  219. package/dist/nav/Menu.svelte +0 -170
  220. package/dist/nav/Menu.svelte.d.ts +0 -27
  221. package/dist/nav/MenuItem.svelte.d.ts +0 -22
  222. package/dist/nav/NavMenu.svelte +0 -181
  223. package/dist/nav/NavMenu.svelte.d.ts +0 -19
  224. package/dist/nav/TabbedContent.svelte +0 -43
  225. package/dist/nav/TabbedContent.svelte.d.ts +0 -23
  226. package/dist/nav/Tabs.svelte.d.ts +0 -25
  227. package/dist/nav/index.d.ts +0 -7
  228. package/dist/nav/index.js +0 -6
  229. package/dist/style.css +0 -950
  230. package/dist/typo/Clamp.svelte +0 -25
  231. package/dist/typo/Clamp.svelte.d.ts +0 -24
  232. package/dist/typo/H.svelte +0 -52
  233. package/dist/typo/H.svelte.d.ts +0 -28
  234. package/dist/typo/H1.svelte +0 -14
  235. package/dist/typo/H1.svelte.d.ts +0 -26
  236. package/dist/typo/H2.svelte +0 -14
  237. package/dist/typo/H2.svelte.d.ts +0 -26
  238. package/dist/typo/H3.svelte +0 -14
  239. package/dist/typo/H3.svelte.d.ts +0 -26
  240. package/dist/typo/H4.svelte +0 -14
  241. package/dist/typo/H4.svelte.d.ts +0 -26
  242. package/dist/typo/H5.svelte +0 -14
  243. package/dist/typo/H5.svelte.d.ts +0 -26
  244. package/dist/typo/H6.svelte +0 -14
  245. package/dist/typo/H6.svelte.d.ts +0 -26
  246. package/dist/typo/P.svelte +0 -34
  247. package/dist/typo/P.svelte.d.ts +0 -26
  248. package/dist/typo/index.d.ts +0 -9
  249. package/dist/typo/index.js +0 -9
  250. package/dist/utils/StringOrComponent.svelte +0 -14
  251. package/dist/utils/StringOrComponent.svelte.d.ts +0 -19
  252. package/dist/utils/StringOrSnippet.svelte +0 -11
  253. package/dist/utils/StringOrSnippet.svelte.d.ts +0 -19
  254. package/dist/utils/defaults.d.ts +0 -4
  255. package/dist/utils/hooks.server.d.ts +0 -2
  256. package/dist/utils/hooks.server.js +0 -16
  257. package/dist/utils/id.d.ts +0 -1
  258. package/dist/utils/id.js +0 -3
  259. package/dist/utils/index.d.ts +0 -9
  260. package/dist/utils/index.js +0 -6
  261. package/dist/utils/isSnippet.d.ts +0 -3
  262. package/dist/utils/isSnippet.js +0 -11
  263. /package/dist/{nav → components}/MenuTypes.js +0 -0
  264. /package/dist/{layout → components}/overlays.svelte.js +0 -0
  265. /package/dist/{utils → util}/attr.d.ts +0 -0
  266. /package/dist/{utils → util}/attr.js +0 -0
  267. /package/dist/{utils → util}/color.d.ts +0 -0
  268. /package/dist/{utils → util}/color.js +0 -0
  269. /package/dist/{utils → util}/dom.d.ts +0 -0
  270. /package/dist/{utils → util}/keyboard.svelte.d.ts +0 -0
  271. /package/dist/{utils → util}/keyboard.svelte.js +0 -0
  272. /package/dist/{utils/defaults.js → util/settings.js} +0 -0
  273. /package/dist/{utils → util}/transitions.d.ts +0 -0
  274. /package/dist/{utils → util}/transitions.js +0 -0
@@ -1,20 +1,30 @@
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
- }
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
- <StringOrSnippet content={item.content} />
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
- <StringOrSnippet content={item.content} />
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
- <StringOrSnippet content={item.content} />
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 isSnippet(item.content)}
66
+ {:else if item.component}
57
67
  <div class="Item Custom">
58
- {@render item.content()}
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(--bg-hover);
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 "../utils/color.js";
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
- content: string | Snippet;
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
- /** Content of the item to display to the user. */
17
- content: string | Snippet;
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
- content: Snippet;
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">import Overlay from "../layout/Overlay.svelte";
2
- import PageContent from "../layout/PageContent.svelte";
3
- import { removeOverlay } from "../layout/overlays.svelte.js";
4
- import Close from "./Close.svelte";
5
- import { createId } from "../utils/id.js";
6
- import Icon from "./Icon.svelte";
7
- let {
8
- id = createId(),
9
- children,
10
- title,
11
- content,
12
- icon,
13
- actions
14
- } = $props();
15
- function onclick(e) {
16
- e.preventDefault();
17
- removeOverlay(id);
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(--bg-app);
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">import { overlays } from "./overlays.svelte.js";
2
- import OverlayLayer from "./OverlayLayer.svelte";
3
- import { slidefade } from "../utils/transitions.js";
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>, {