lutra 0.0.33 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) 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 +33 -8
  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 -82
  28. package/dist/color.css +0 -0
  29. package/dist/display/Avatar.svelte +0 -61
  30. package/dist/display/Avatar.svelte.d.ts +0 -19
  31. package/dist/display/Badge.svelte +0 -91
  32. package/dist/display/Badge.svelte.d.ts +0 -30
  33. package/dist/display/Callout.svelte +0 -109
  34. package/dist/display/Callout.svelte.d.ts +0 -28
  35. package/dist/display/Close.svelte +0 -58
  36. package/dist/display/Close.svelte.d.ts +0 -18
  37. package/dist/display/Code.svelte +0 -190
  38. package/dist/display/Code.svelte.d.ts +0 -32
  39. package/dist/display/ContextTip.svelte +0 -23
  40. package/dist/display/ContextTip.svelte.d.ts +0 -18
  41. package/dist/display/DataList.svelte +0 -16
  42. package/dist/display/DataList.svelte.d.ts +0 -21
  43. package/dist/display/Details.svelte +0 -49
  44. package/dist/display/Details.svelte.d.ts +0 -27
  45. package/dist/display/Hero.svelte +0 -50
  46. package/dist/display/Hero.svelte.d.ts +0 -26
  47. package/dist/display/Icon.svelte +0 -39
  48. package/dist/display/Icon.svelte.d.ts +0 -19
  49. package/dist/display/IconButton.svelte +0 -91
  50. package/dist/display/IconButton.svelte.d.ts +0 -27
  51. package/dist/display/Image.svelte +0 -91
  52. package/dist/display/Image.svelte.d.ts +0 -26
  53. package/dist/display/Indicator.svelte +0 -352
  54. package/dist/display/Indicator.svelte.d.ts +0 -23
  55. package/dist/display/Inset.svelte +0 -18
  56. package/dist/display/Inset.svelte.d.ts +0 -18
  57. package/dist/display/LineChart.svelte +0 -385
  58. package/dist/display/LineChart.svelte.d.ts +0 -24
  59. package/dist/display/LoadingIndicator.svelte +0 -33
  60. package/dist/display/LoadingIndicator.svelte.d.ts +0 -15
  61. package/dist/display/Modal.svelte +0 -116
  62. package/dist/display/Modal.svelte.d.ts +0 -27
  63. package/dist/display/Notification.svelte +0 -104
  64. package/dist/display/Notification.svelte.d.ts +0 -23
  65. package/dist/display/Panel.svelte +0 -23
  66. package/dist/display/Panel.svelte.d.ts +0 -19
  67. package/dist/display/Popup.svelte +0 -111
  68. package/dist/display/Popup.svelte.d.ts +0 -25
  69. package/dist/display/Stat.svelte +0 -81
  70. package/dist/display/Stat.svelte.d.ts +0 -30
  71. package/dist/display/Table.svelte +0 -28
  72. package/dist/display/Table.svelte.d.ts +0 -24
  73. package/dist/display/TablePaginator.svelte +0 -51
  74. package/dist/display/TablePaginator.svelte.d.ts +0 -21
  75. package/dist/display/Tag.svelte +0 -90
  76. package/dist/display/Tag.svelte.d.ts +0 -32
  77. package/dist/display/Tooltip.svelte.d.ts +0 -23
  78. package/dist/display/chart.d.ts +0 -78
  79. package/dist/display/chart.js +0 -212
  80. package/dist/display/index.d.ts +0 -24
  81. package/dist/display/index.js +0 -24
  82. package/dist/display/notifications.svelte.d.ts +0 -21
  83. package/dist/display/notifications.svelte.js +0 -31
  84. package/dist/form/Button.svelte +0 -39
  85. package/dist/form/Button.svelte.d.ts +0 -26
  86. package/dist/form/FieldActions.svelte +0 -68
  87. package/dist/form/FieldActions.svelte.d.ts +0 -20
  88. package/dist/form/FieldContainer.svelte +0 -37
  89. package/dist/form/FieldContainer.svelte.d.ts +0 -19
  90. package/dist/form/FieldContent.svelte +0 -153
  91. package/dist/form/FieldContent.svelte.d.ts +0 -31
  92. package/dist/form/FieldError.svelte +0 -14
  93. package/dist/form/FieldError.svelte.d.ts +0 -18
  94. package/dist/form/FieldSection.svelte +0 -86
  95. package/dist/form/FieldSection.svelte.d.ts +0 -20
  96. package/dist/form/Fieldset.svelte +0 -68
  97. package/dist/form/Fieldset.svelte.d.ts +0 -31
  98. package/dist/form/Form.svelte +0 -136
  99. package/dist/form/Form.svelte.d.ts +0 -38
  100. package/dist/form/ImageUpload.svelte +0 -259
  101. package/dist/form/ImageUpload.svelte.d.ts +0 -31
  102. package/dist/form/Input.svelte +0 -326
  103. package/dist/form/Input.svelte.d.ts +0 -117
  104. package/dist/form/InputLength.svelte +0 -32
  105. package/dist/form/InputLength.svelte.d.ts +0 -20
  106. package/dist/form/Label.svelte +0 -44
  107. package/dist/form/Label.svelte.d.ts +0 -25
  108. package/dist/form/LogoUpload.svelte +0 -100
  109. package/dist/form/LogoUpload.svelte.d.ts +0 -29
  110. package/dist/form/Select.svelte +0 -136
  111. package/dist/form/Select.svelte.d.ts +0 -70
  112. package/dist/form/Textarea.svelte +0 -163
  113. package/dist/form/Textarea.svelte.d.ts +0 -108
  114. package/dist/form/Toggle.svelte +0 -2
  115. package/dist/form/Toggle.svelte.d.ts +0 -15
  116. package/dist/form/client.svelte.d.ts +0 -44
  117. package/dist/form/client.svelte.js +0 -98
  118. package/dist/form/form.d.ts +0 -54
  119. package/dist/form/form.js +0 -340
  120. package/dist/form/index.d.ts +0 -18
  121. package/dist/form/index.js +0 -18
  122. package/dist/form/types.d.ts +0 -62
  123. package/dist/form/types.js +0 -1
  124. package/dist/icons/IconAlert.svelte +0 -3
  125. package/dist/icons/IconAlert.svelte.d.ts +0 -23
  126. package/dist/icons/IconCopy.svelte +0 -3
  127. package/dist/icons/IconCopy.svelte.d.ts +0 -23
  128. package/dist/icons/IconDone.svelte +0 -3
  129. package/dist/icons/IconDone.svelte.d.ts +0 -23
  130. package/dist/icons/IconError.svelte +0 -3
  131. package/dist/icons/IconError.svelte.d.ts +0 -23
  132. package/dist/icons/IconHelp.svelte +0 -3
  133. package/dist/icons/IconHelp.svelte.d.ts +0 -23
  134. package/dist/icons/IconHide.svelte +0 -3
  135. package/dist/icons/IconHide.svelte.d.ts +0 -23
  136. package/dist/icons/IconInfo.svelte +0 -3
  137. package/dist/icons/IconInfo.svelte.d.ts +0 -23
  138. package/dist/icons/IconLink.svelte +0 -3
  139. package/dist/icons/IconLink.svelte.d.ts +0 -23
  140. package/dist/icons/IconMenuBurger.svelte +0 -3
  141. package/dist/icons/IconMenuBurger.svelte.d.ts +0 -23
  142. package/dist/icons/IconMenuDots.svelte +0 -3
  143. package/dist/icons/IconMenuDots.svelte.d.ts +0 -23
  144. package/dist/icons/IconSearch.svelte +0 -3
  145. package/dist/icons/IconSearch.svelte.d.ts +0 -23
  146. package/dist/icons/IconShow.svelte +0 -3
  147. package/dist/icons/IconShow.svelte.d.ts +0 -23
  148. package/dist/icons/IconSuccess.svelte +0 -3
  149. package/dist/icons/IconSuccess.svelte.d.ts +0 -23
  150. package/dist/icons/IconWarning.svelte +0 -3
  151. package/dist/icons/IconWarning.svelte.d.ts +0 -23
  152. package/dist/icons/index.d.ts +0 -14
  153. package/dist/icons/index.js +0 -14
  154. package/dist/layout/Layout.svelte +0 -47
  155. package/dist/layout/Layout.svelte.d.ts +0 -22
  156. package/dist/layout/LayoutFooter.svelte +0 -21
  157. package/dist/layout/LayoutFooter.svelte.d.ts +0 -18
  158. package/dist/layout/LayoutGrid.svelte +0 -51
  159. package/dist/layout/LayoutGrid.svelte.d.ts +0 -27
  160. package/dist/layout/LayoutHeader.svelte +0 -97
  161. package/dist/layout/LayoutHeader.svelte.d.ts +0 -34
  162. package/dist/layout/LayoutSideMenu.svelte +0 -55
  163. package/dist/layout/LayoutSideMenu.svelte.d.ts +0 -21
  164. package/dist/layout/LayoutTypes.d.ts +0 -15
  165. package/dist/layout/LayoutTypes.js +0 -9
  166. package/dist/layout/Overlay.svelte +0 -20
  167. package/dist/layout/Overlay.svelte.d.ts +0 -25
  168. package/dist/layout/OverlayContainer.svelte +0 -28
  169. package/dist/layout/OverlayContainer.svelte.d.ts +0 -15
  170. package/dist/layout/OverlayLayer.svelte +0 -140
  171. package/dist/layout/OverlayLayer.svelte.d.ts +0 -19
  172. package/dist/layout/PageContent.svelte +0 -82
  173. package/dist/layout/PageContent.svelte.d.ts +0 -25
  174. package/dist/layout/Theme.svelte +0 -243
  175. package/dist/layout/Theme.svelte.d.ts +0 -19
  176. package/dist/layout/UIContent.svelte +0 -15
  177. package/dist/layout/UIContent.svelte.d.ts +0 -18
  178. package/dist/layout/index.d.ts +0 -11
  179. package/dist/layout/index.js +0 -11
  180. package/dist/layout/overlays.svelte.d.ts +0 -34
  181. package/dist/layout/overlays.svelte.js +0 -44
  182. package/dist/nav/Breadcrumb.svelte +0 -82
  183. package/dist/nav/Breadcrumb.svelte.d.ts +0 -28
  184. package/dist/nav/Menu.svelte +0 -170
  185. package/dist/nav/Menu.svelte.d.ts +0 -27
  186. package/dist/nav/MenuItem.svelte +0 -147
  187. package/dist/nav/MenuItem.svelte.d.ts +0 -22
  188. package/dist/nav/MenuTypes.d.ts +0 -58
  189. package/dist/nav/MenuTypes.js +0 -1
  190. package/dist/nav/NavMenu.svelte +0 -181
  191. package/dist/nav/NavMenu.svelte.d.ts +0 -19
  192. package/dist/nav/TabbedContent.svelte +0 -43
  193. package/dist/nav/TabbedContent.svelte.d.ts +0 -23
  194. package/dist/nav/Tabs.svelte +0 -158
  195. package/dist/nav/Tabs.svelte.d.ts +0 -25
  196. package/dist/nav/index.d.ts +0 -7
  197. package/dist/nav/index.js +0 -6
  198. package/dist/style.css +0 -950
  199. package/dist/typo/Clamp.svelte +0 -25
  200. package/dist/typo/Clamp.svelte.d.ts +0 -24
  201. package/dist/typo/H.svelte +0 -52
  202. package/dist/typo/H.svelte.d.ts +0 -28
  203. package/dist/typo/H1.svelte +0 -14
  204. package/dist/typo/H1.svelte.d.ts +0 -26
  205. package/dist/typo/H2.svelte +0 -14
  206. package/dist/typo/H2.svelte.d.ts +0 -26
  207. package/dist/typo/H3.svelte +0 -14
  208. package/dist/typo/H3.svelte.d.ts +0 -26
  209. package/dist/typo/H4.svelte +0 -14
  210. package/dist/typo/H4.svelte.d.ts +0 -26
  211. package/dist/typo/H5.svelte +0 -14
  212. package/dist/typo/H5.svelte.d.ts +0 -26
  213. package/dist/typo/H6.svelte +0 -14
  214. package/dist/typo/H6.svelte.d.ts +0 -26
  215. package/dist/typo/P.svelte +0 -34
  216. package/dist/typo/P.svelte.d.ts +0 -26
  217. package/dist/typo/index.d.ts +0 -9
  218. package/dist/typo/index.js +0 -9
  219. package/dist/utils/StringOrComponent.svelte +0 -14
  220. package/dist/utils/StringOrComponent.svelte.d.ts +0 -19
  221. package/dist/utils/StringOrSnippet.svelte +0 -11
  222. package/dist/utils/StringOrSnippet.svelte.d.ts +0 -19
  223. package/dist/utils/attr.d.ts +0 -5
  224. package/dist/utils/attr.js +0 -21
  225. package/dist/utils/color.d.ts +0 -51
  226. package/dist/utils/color.js +0 -97
  227. package/dist/utils/defaults.d.ts +0 -4
  228. package/dist/utils/defaults.js +0 -1
  229. package/dist/utils/dom.d.ts +0 -15
  230. package/dist/utils/dom.js +0 -74
  231. package/dist/utils/hooks.server.d.ts +0 -2
  232. package/dist/utils/hooks.server.js +0 -16
  233. package/dist/utils/id.d.ts +0 -1
  234. package/dist/utils/id.js +0 -3
  235. package/dist/utils/index.d.ts +0 -9
  236. package/dist/utils/index.js +0 -6
  237. package/dist/utils/isSnippet.d.ts +0 -3
  238. package/dist/utils/isSnippet.js +0 -11
  239. package/dist/utils/keyboard.svelte.d.ts +0 -22
  240. package/dist/utils/keyboard.svelte.js +0 -161
  241. /package/dist/{utils → util}/transitions.d.ts +0 -0
  242. /package/dist/{utils → util}/transitions.js +0 -0
package/README.md CHANGED
@@ -1,29 +1,9 @@
1
- # AUI
1
+ # Lutra
2
2
 
3
- ## Local development
3
+ UI library for Svelte 5.
4
4
 
5
- During local development, the REPL compiler requests library files from the local `dist` folder when they are imported. To serve these, run the `local.js` script.
5
+ ## Installation
6
6
 
7
7
  ```bash
8
- pnpm local
8
+ npm install --save lutra
9
9
  ```
10
-
11
- ### Rewriting props
12
-
13
- When you edit a component's description or props, you need to regenerate `componentProps.ts`.
14
-
15
- `read_props.js` reads all the library files and generates props to display in the docs from the AST. Running
16
-
17
- ```bash
18
- pnpm props
19
- ```
20
-
21
- will read the props and write `componentProps.ts`.
22
-
23
- Running:
24
-
25
- ```bash
26
- pnpm package
27
- ```
28
-
29
- will write the props and generate the library Svelte files.
@@ -0,0 +1,26 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from "svelte";
3
+ let {
4
+ ratio = 16 / 9,
5
+ children
6
+ }: {
7
+ ratio?: number;
8
+ children: Snippet;
9
+ } = $props();
10
+ </script>
11
+
12
+ <div class="AspectRatio" style="--aspect-ratio: {ratio}">
13
+ {@render children()}
14
+ </div>
15
+
16
+ <style>
17
+ @property --aspect-ratio {
18
+ syntax: "<number-percentage> / <number-percentage>";
19
+ inherits: false;
20
+ initial-value: 16 / 9;
21
+ }
22
+ .AspectRatio {
23
+ aspect-ratio: var(--aspect-ratio);
24
+ }
25
+ </style>
26
+
@@ -0,0 +1,8 @@
1
+ import type { Snippet } from "svelte";
2
+ type $$ComponentProps = {
3
+ ratio?: number;
4
+ children: Snippet;
5
+ };
6
+ declare const AspectRatio: import("svelte").Component<$$ComponentProps, {}, "">;
7
+ type AspectRatio = ReturnType<typeof AspectRatio>;
8
+ export default AspectRatio;
@@ -0,0 +1,78 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from "svelte";
3
+ import { slidefade } from "../util/transitions.js";
4
+
5
+ /**
6
+ * @description
7
+ * A dialog component that follows the HTML dialog element spec.
8
+ * Provides a modal dialog with a backdrop and proper focus management.
9
+ */
10
+ let {
11
+ open = $bindable(false),
12
+ title,
13
+ children,
14
+ onClose,
15
+ }: {
16
+ /** [Bindable] Whether the dialog is open */
17
+ open?: boolean;
18
+ /** The title of the dialog */
19
+ title?: string;
20
+ /** The content of the dialog */
21
+ children: Snippet;
22
+ /** Callback when the dialog is closed */
23
+ onClose?: () => void;
24
+ } = $props();
25
+
26
+ let dialog: HTMLDialogElement;
27
+
28
+ $effect(() => {
29
+ if (open && dialog) {
30
+ dialog.showModal();
31
+ } else if (dialog) {
32
+ dialog.close();
33
+ }
34
+ });
35
+
36
+ function handleClose() {
37
+ if (onClose) onClose();
38
+ }
39
+
40
+ </script>
41
+
42
+ <dialog
43
+ bind:this={dialog}
44
+ class="Dialog"
45
+ transition:slidefade
46
+ >
47
+ {#if title}
48
+ <header class="DialogHeader">
49
+ <h6>{title}</h6>
50
+ </header>
51
+ {/if}
52
+ <div class="DialogContent">
53
+ {@render children()}
54
+ </div>
55
+ </dialog>
56
+
57
+ <style>
58
+ .Dialog {
59
+ padding: 0;
60
+ border: var(--field-border-size) var(--field-border-style) var(--field-border-color);
61
+ border-radius: var(--field-radius);
62
+ background: var(--bg-surface);
63
+ color: var(--fg-surface);
64
+ max-width: min(calc(100vw - 2rem), 32rem);
65
+ max-height: min(calc(100vh - 2rem), 32rem);
66
+ }
67
+ .Dialog::backdrop {
68
+ background: var(--bg-scrim);
69
+ backdrop-filter: blur(2px);
70
+ }
71
+ .DialogHeader {
72
+ padding: var(--pad-m);
73
+ border-bottom: var(--field-border-size) var(--field-border-style) var(--field-border-color);
74
+ }
75
+ .DialogContent {
76
+ padding: var(--pad-m);
77
+ }
78
+ </style>
@@ -0,0 +1,14 @@
1
+ import type { Snippet } from "svelte";
2
+ type $$ComponentProps = {
3
+ /** [Bindable] Whether the dialog is open */
4
+ open?: boolean;
5
+ /** The title of the dialog */
6
+ title?: string;
7
+ /** The content of the dialog */
8
+ children: Snippet;
9
+ /** Callback when the dialog is closed */
10
+ onClose?: () => void;
11
+ };
12
+ declare const Dialog: import("svelte").Component<$$ComponentProps, {}, "open">;
13
+ type Dialog = ReturnType<typeof Dialog>;
14
+ export default Dialog;
@@ -0,0 +1,32 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from "svelte";
3
+ import "../css/lutra.css";
4
+ import Theme from "./Theme.svelte";
5
+ /**
6
+ * @description
7
+ * Default layout component that imports default styles and wraps the entire application in a theme.
8
+ */
9
+ let {
10
+ theme,
11
+ children,
12
+ }: {
13
+ /** The theme to use for the layout. Leave empty to detect automatically or get from user preferences, if any exist. */
14
+ theme?: 'light' | 'dark' | undefined;
15
+ /** The content to display. */
16
+ children: Snippet;
17
+ } = $props();
18
+ </script>
19
+
20
+ <Theme theme={theme}>
21
+ <div class="Layout">
22
+ {@render children()}
23
+ </div>
24
+ </Theme>
25
+
26
+ <style>
27
+ .Layout {
28
+ background: var(--bg-app);
29
+ min-height: 100dvh;
30
+ height: 100dvh;
31
+ }
32
+ </style>
@@ -0,0 +1,11 @@
1
+ import type { Snippet } from "svelte";
2
+ import "../css/lutra.css";
3
+ type $$ComponentProps = {
4
+ /** The theme to use for the layout. Leave empty to detect automatically or get from user preferences, if any exist. */
5
+ theme?: 'light' | 'dark' | undefined;
6
+ /** The content to display. */
7
+ children: Snippet;
8
+ };
9
+ declare const Layout: import("svelte").Component<$$ComponentProps, {}, "">;
10
+ type Layout = ReturnType<typeof Layout>;
11
+ export default Layout;
@@ -0,0 +1,108 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from "svelte";
3
+
4
+ /**
5
+ * @description
6
+ * A container for page content.
7
+ * If you want to add padding to the container, pass in `pad`. You can also pass in an array of booleans or strings to specify padding on the block and inline axis.
8
+ * Padding will be halved for smaller viewport sizes.
9
+ * @example
10
+ * <PageContent pad>
11
+ * <p>Paragraph</p>
12
+ * </PageContent>
13
+ */
14
+ let {
15
+ children,
16
+ pad = false,
17
+ middle = false,
18
+ center = false,
19
+ style,
20
+ }: {
21
+ children: Snippet;
22
+ /** Add padding to the container. Pass in either a boolean or an array of booleans to specify padding on the block and inline axes. */
23
+ pad?: boolean |
24
+ [boolean, boolean] |
25
+ [boolean, boolean, boolean] |
26
+ [boolean, boolean, boolean, boolean] |
27
+ string |
28
+ [string, string] |
29
+ [string, string, string] |
30
+ [string, string, string, string] |
31
+ 'xs' |
32
+ 's' |
33
+ 'm' |
34
+ 'l' |
35
+ 'xl' |
36
+ 'xxl';
37
+ /** Center the content in the block direction. */
38
+ middle?: boolean;
39
+ /** Center the content in the inline direction. */
40
+ center?: boolean;
41
+ style?: string;
42
+ } = $props();
43
+
44
+ let padStyle = $derived.by(() => {
45
+ if(typeof pad === 'boolean') {
46
+ return `--padBlockStart: ${pad ? 'var(--page-padding, var(--padding-block, var(--pad-xl)))' : '0'};
47
+ --padBlockEnd: ${pad ? 'var(--page-padding, var(--padding-block, var(--pad-xl)))' : '0'};
48
+ --padInlineStart: ${pad ? 'var(--page-padding, var(--padding-inline, var(--pad-xl)))' : '0'};
49
+ --padInlineEnd: ${pad ? 'var(--page-padding, var(--padding-inline, var(--pad-xl)))' : '0'};`;
50
+ } else if(typeof pad === 'string') {
51
+ return `--padBlockStart: ${pad};
52
+ --padBlockEnd: ${pad};
53
+ --padInlineStart: ${pad};
54
+ --padInlineEnd: ${pad};`;
55
+ }
56
+ else if(Array.isArray(pad) && pad.length > 1 && typeof pad[0] === 'string') {
57
+ switch(pad.length) {
58
+ case 2:
59
+ return `--padBlockStart: ${pad[0]};
60
+ --padBlockEnd: ${pad[0]};
61
+ --padInlineStart: ${pad[1]};
62
+ --padInlineEnd: ${pad[1]};`;
63
+ case 3:
64
+ return `--padBlockStart: ${pad[0]};
65
+ --padBlockEnd: ${pad[1]};
66
+ --padInlineStart: ${pad[2]};
67
+ --padInlineEnd: ${pad[2]};`;
68
+ case 4:
69
+ return `--padBlockStart: ${pad[0]};
70
+ --padBlockEnd: ${pad[1]};
71
+ --padInlineStart: ${pad[2]};
72
+ --padInlineEnd: ${pad[3]};`;
73
+ }
74
+ } else if(Array.isArray(pad) && pad.length > 1) {
75
+ switch(pad.length) {
76
+ case 2:
77
+ return `--padBlockStart: ${pad[0] ? 'var(--page-padding, var(--padding-block, var(--pad-xl)))' : '0'};
78
+ --padBlockEnd: ${pad[0] ? 'var(--page-padding, var(--padding-block, var(--pad-xl)))' : '0'};
79
+ --padInlineStart: ${pad[1] ? 'var(--page-padding, var(--padding-inline, var(--pad-xl)))' : '0'};
80
+ --padInlineEnd: ${pad[1] ? 'var(--page-padding, var(--padding-inline, var(--pad-xl)))' : '0'};`;
81
+ case 3:
82
+ return `--padBlockStart: ${pad[0] ? 'var(--page-padding, var(--padding-block, var(--pad-xl)))' : '0'};
83
+ --padBlockEnd: ${pad[1] ? 'var(--page-padding, var(--padding-block, var(--pad-xl)))' : '0'};
84
+ --padInlineStart: ${pad[2] ? 'var(--page-padding, var(--padding-inline, var(--pad-xl)))' : '0'};
85
+ --padInlineEnd: ${pad[2] ? 'var(--page-padding, var(--padding-inline, var(--pad-xl)))' : '0'};`;
86
+ case 4:
87
+ return `--padBlockStart: ${pad[0] ? 'var(--page-padding, var(--padding-block, var(--pad-xl)))' : '0'};
88
+ --padBlockEnd: ${pad[1] ? 'var(--page-padding, var(--padding-block, var(--pad-xl)))' : '0'};
89
+ --padInlineStart: ${pad[2] ? 'var(--page-padding, var(--padding-inline, var(--pad-xl)))' : '0'};
90
+ --padInlineEnd: ${pad[3] ? 'var(--page-padding, var(--padding-inline, var(--pad-xl)))' : '0'};`;
91
+ }
92
+ }
93
+ return '';
94
+ });
95
+
96
+ </script>
97
+
98
+ <div class="PageContent" class:middle class:center style={padStyle}>
99
+ {@render children()}
100
+ </div>
101
+
102
+ <style>
103
+ .PageContent {
104
+ display: block;
105
+ min-width: 0;
106
+ min-height: 0;
107
+ }
108
+ </style>
@@ -0,0 +1,38 @@
1
+ import type { Snippet } from "svelte";
2
+ type $$ComponentProps = {
3
+ children: Snippet;
4
+ /** Add padding to the container. Pass in either a boolean or an array of booleans to specify padding on the block and inline axes. */
5
+ pad?: boolean | [
6
+ boolean,
7
+ boolean
8
+ ] | [
9
+ boolean,
10
+ boolean,
11
+ boolean
12
+ ] | [
13
+ boolean,
14
+ boolean,
15
+ boolean,
16
+ boolean
17
+ ] | string | [
18
+ string,
19
+ string
20
+ ] | [
21
+ string,
22
+ string,
23
+ string
24
+ ] | [
25
+ string,
26
+ string,
27
+ string,
28
+ string
29
+ ] | 'xs' | 's' | 'm' | 'l' | 'xl' | 'xxl';
30
+ /** Center the content in the block direction. */
31
+ middle?: boolean;
32
+ /** Center the content in the inline direction. */
33
+ center?: boolean;
34
+ style?: string;
35
+ };
36
+ declare const PageContent: import("svelte").Component<$$ComponentProps, {}, "">;
37
+ type PageContent = ReturnType<typeof PageContent>;
38
+ export default PageContent;
@@ -0,0 +1,87 @@
1
+ <script lang="ts">
2
+ import { browser } from "$app/environment";
3
+ import { setContext, type Snippet } from "svelte";
4
+ import { defaultConfig, type LutraConfig, type LutraRootConfig } from "../config.js";
5
+ import { getContextItem, LutraContext, type LutraTheme } from "../types.js";
6
+
7
+ /**
8
+ * @description
9
+ * A theme component. It is used to set the theme of the app in the root of the layout. You can also use it to set the theme of a specific section of the app.
10
+ */
11
+
12
+ // Destructuring props with default values
13
+ let {
14
+ theme,
15
+ config,
16
+ children
17
+ }: {
18
+ /**
19
+ * The theme to use. Leave undefined to use the system theme.
20
+ */
21
+ theme?: LutraTheme;
22
+ /**
23
+ * Lutra config. Leave undefined to use the default config.
24
+ */
25
+ config?: LutraRootConfig;
26
+ children: Snippet
27
+ } = $props();
28
+
29
+ // Determine if this is the root theme context
30
+ const root = getContextItem(LutraContext.Theme) === undefined;
31
+
32
+ // Retrieve existing configuration from context if available
33
+ const existingConfig = getContextItem(LutraContext.Config);
34
+
35
+ // If no config is provided, use the existing one from context or default to the defaultConfig
36
+ if(!config) {
37
+ config = existingConfig || defaultConfig;
38
+ }
39
+
40
+ // Set the configuration in the context for child components to access
41
+ setContext(LutraContext.Config, config);
42
+
43
+ // Retrieve existing theme from context if available
44
+ const existingTheme = getContextItem(LutraContext.Theme);
45
+
46
+ function getTheme() {
47
+ if(browser) {
48
+ return localStorage.getItem('lutra.theme') || (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) ? 'dark' : 'light';
49
+ }
50
+ // TODO: Implement Sec-CH-Prefers-Color-Scheme header getting from context
51
+ return getContextItem(LutraContext.SecChPrefersColorScheme) || 'light';
52
+ }
53
+
54
+ // If no theme is provided, determine it from localStorage or system preferences
55
+ if(!theme) {
56
+ theme = existingTheme || getTheme();
57
+ } else if(theme === 'invert') {
58
+ theme = (existingTheme || getTheme()) === 'light' ? 'dark' : 'light';
59
+ }
60
+
61
+ // Set the theme in the context for child components to access
62
+ setContext(LutraContext.Theme, theme);
63
+ </script>
64
+
65
+ <svelte:head>
66
+ {#if !root}
67
+ <meta name="theme-color" content="{theme === 'dark' ? (config?.themeColor?.dark || '#000') : (config?.themeColor?.light || '#fff')}" />
68
+ {/if}
69
+ </svelte:head>
70
+
71
+ <div class="Theme{theme ? ' '+theme : ''}" class:root>
72
+ {@render children()}
73
+ </div>
74
+
75
+ <style>
76
+ .Theme {
77
+ display: contents;
78
+ color-scheme: light dark;
79
+ }
80
+ .Theme.light {
81
+ color-scheme: light;
82
+ }
83
+ .Theme.dark {
84
+ color-scheme: dark;
85
+ }
86
+ </style>
87
+
@@ -0,0 +1,17 @@
1
+ import { type Snippet } from "svelte";
2
+ import { type LutraRootConfig } from "../config.js";
3
+ import { type LutraTheme } from "../types.js";
4
+ type $$ComponentProps = {
5
+ /**
6
+ * The theme to use. Leave undefined to use the system theme.
7
+ */
8
+ theme?: LutraTheme;
9
+ /**
10
+ * Lutra config. Leave undefined to use the default config.
11
+ */
12
+ config?: LutraRootConfig;
13
+ children: Snippet;
14
+ };
15
+ declare const Theme: import("svelte").Component<$$ComponentProps, {}, "">;
16
+ type Theme = ReturnType<typeof Theme>;
17
+ export default Theme;
@@ -1,11 +1,36 @@
1
- <script lang="ts">import Theme from "../layout/Theme.svelte";
2
- let {
3
- children,
4
- tip,
5
- open
6
- } = $props();
7
- const id = `tt-${Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15)}`;
8
- let offsetX = $state(0);
1
+ <script lang="ts">
2
+ import Theme from "./Theme.svelte";
3
+ import type { Snippet } from "svelte";
4
+
5
+ /**
6
+ * @description
7
+ * A tooltip component that displays a tooltip when hovering or focusing on the trigger element.
8
+ * When hovering, the tooltip will fade in with a default delay of 0.5s (can be changed with the `--delay` CSS prop). With a keyboard focus, the tooltip will fade in immediately.
9
+ * @supports prefers-reduced-motion
10
+ * @supports hover
11
+ * @aria role="tooltip"
12
+ * @aria aria-describedby=""
13
+ * @cssprop --delay - The delay of the tooltip fade in animation. (Default: 0.5s)
14
+ * @example
15
+ * <h3>Tooltip example</h3>
16
+ * <p>Lorem ipsum <Tooltip tip="This is a tooltip"><a href="#">dolor sit amet</a></Tooltip></p>
17
+ */
18
+ let {
19
+ children,
20
+ tip,
21
+ open,
22
+ }: {
23
+ /** Content to trigger the tooltip */
24
+ children: Snippet;
25
+ /** The content of the tooltip */
26
+ tip: string | Snippet;
27
+ /** Open the tooltip on render (cannot be closed) */
28
+ open?: boolean;
29
+ } = $props();
30
+
31
+ const id = `tt-${Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15)}`;
32
+ let offsetX = $state(0);
33
+
9
34
  </script>
10
35
 
11
36
  <span class="Tooltip" class:open>
@@ -0,0 +1,12 @@
1
+ import type { Snippet } from "svelte";
2
+ type $$ComponentProps = {
3
+ /** Content to trigger the tooltip */
4
+ children: Snippet;
5
+ /** The content of the tooltip */
6
+ tip: string | Snippet;
7
+ /** Open the tooltip on render (cannot be closed) */
8
+ open?: boolean;
9
+ };
10
+ declare const Tooltip: import("svelte").Component<$$ComponentProps, {}, "">;
11
+ type Tooltip = ReturnType<typeof Tooltip>;
12
+ export default Tooltip;
@@ -0,0 +1,30 @@
1
+ export interface LutraConfig {
2
+ /**
3
+ * Whether to show a background color or image on the components.
4
+ */
5
+ background?: boolean;
6
+ /**
7
+ * Whether to use a contained layout (with borders and rounded corners).
8
+ */
9
+ contained?: boolean;
10
+ }
11
+ export interface LutraRootConfig extends LutraConfig {
12
+ /**
13
+ * The default theme to use.
14
+ */
15
+ theme?: 'light' | 'dark' | 'auto' | 'inherit';
16
+ /**
17
+ * Theme color for the theme-color meta tag. Only used in the root theme.
18
+ * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta/name/theme-color
19
+ */
20
+ themeColor?: {
21
+ light?: string;
22
+ dark?: string;
23
+ };
24
+ }
25
+ /**
26
+ * Default Lutra config.
27
+ */
28
+ export declare const defaultConfig: LutraConfig;
29
+ export declare const defaultRootConfig: LutraRootConfig;
30
+ export declare const setConfig: (config: Partial<LutraConfig>) => void;
package/dist/config.js ADDED
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Default Lutra config.
3
+ */
4
+ export const defaultConfig = {
5
+ background: true,
6
+ contained: true,
7
+ };
8
+ export const defaultRootConfig = {
9
+ theme: 'auto',
10
+ themeColor: {
11
+ light: '#fff',
12
+ dark: '#000',
13
+ },
14
+ ...defaultConfig,
15
+ };
16
+ export const setConfig = (config) => {
17
+ Object.assign(config, config);
18
+ };
@@ -0,0 +1 @@
1
+ @layer l-base, base-overrides, l-typo, typo-overrides, l-layout, layout-overrides, l-media, media-overrides, misc;