lutra 0.1.0 → 0.1.5

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 (154) hide show
  1. package/dist/components/Avatar.svelte +105 -0
  2. package/dist/components/Avatar.svelte.d.ts +14 -0
  3. package/dist/components/Close.svelte +76 -0
  4. package/dist/components/Close.svelte.d.ts +7 -0
  5. package/dist/components/ContextTip.svelte +41 -0
  6. package/dist/components/ContextTip.svelte.d.ts +7 -0
  7. package/dist/components/Icon.svelte +62 -0
  8. package/dist/components/Icon.svelte.d.ts +8 -0
  9. package/dist/components/IconButton.svelte +120 -0
  10. package/dist/components/IconButton.svelte.d.ts +16 -0
  11. package/dist/components/Image.svelte +172 -0
  12. package/dist/components/Image.svelte.d.ts +56 -0
  13. package/dist/components/Indicator.svelte +387 -0
  14. package/dist/components/Indicator.svelte.d.ts +12 -0
  15. package/dist/components/Inset.svelte +23 -0
  16. package/dist/components/Inset.svelte.d.ts +7 -0
  17. package/dist/components/Layout.svelte +2 -1
  18. package/dist/components/MenuDropdown.svelte +195 -0
  19. package/dist/components/MenuDropdown.svelte.d.ts +16 -0
  20. package/dist/components/MenuItem.svelte +159 -0
  21. package/dist/components/MenuItem.svelte.d.ts +11 -0
  22. package/dist/components/MenuItemContent.svelte +25 -0
  23. package/dist/components/MenuItemContent.svelte.d.ts +10 -0
  24. package/dist/components/MenuTypes.d.ts +79 -0
  25. package/dist/components/MenuTypes.js +1 -0
  26. package/dist/components/Modal.svelte +149 -0
  27. package/dist/components/Modal.svelte.d.ts +16 -0
  28. package/dist/components/Notification.svelte +115 -0
  29. package/dist/components/Notification.svelte.d.ts +12 -0
  30. package/dist/components/Overlay.svelte +31 -0
  31. package/dist/components/Overlay.svelte.d.ts +14 -0
  32. package/dist/components/OverlayContainer.svelte +31 -0
  33. package/dist/components/OverlayContainer.svelte.d.ts +18 -0
  34. package/dist/components/OverlayLayer.svelte +168 -0
  35. package/dist/components/OverlayLayer.svelte.d.ts +8 -0
  36. package/dist/components/PageContent.svelte +4 -82
  37. package/dist/components/PageContent.svelte.d.ts +0 -31
  38. package/dist/components/TabbedContent.svelte +74 -0
  39. package/dist/components/TabbedContent.svelte.d.ts +11 -0
  40. package/dist/components/TabbedContentItem.svelte +33 -0
  41. package/dist/components/TabbedContentItem.svelte.d.ts +10 -0
  42. package/dist/components/Table.svelte +41 -0
  43. package/dist/components/Table.svelte.d.ts +13 -0
  44. package/dist/components/Tabs.svelte +216 -0
  45. package/dist/components/Tabs.svelte.d.ts +20 -0
  46. package/dist/components/Tag.svelte +120 -0
  47. package/dist/components/Tag.svelte.d.ts +21 -0
  48. package/dist/components/Theme.svelte +32 -14
  49. package/dist/components/Tooltip.svelte +8 -8
  50. package/dist/components/UIContent.svelte +19 -0
  51. package/dist/components/UIContent.svelte.d.ts +7 -0
  52. package/dist/components/index.d.ts +28 -0
  53. package/dist/components/index.js +29 -0
  54. package/dist/components/notifications.svelte.d.ts +21 -0
  55. package/dist/components/notifications.svelte.js +30 -0
  56. package/dist/components/overlays.svelte.d.ts +36 -0
  57. package/dist/components/overlays.svelte.js +44 -0
  58. package/dist/css/1-props.css +389 -724
  59. package/dist/css/2-base.css +257 -123
  60. package/dist/css/3-typo.css +74 -34
  61. package/dist/css/4-layout.css +364 -1
  62. package/dist/css/5-media.css +106 -11
  63. package/dist/css/lutra.css +2 -1
  64. package/dist/css/themes/DefaultTheme.css +209 -0
  65. package/dist/form/Button.svelte +58 -0
  66. package/dist/form/Button.svelte.d.ts +15 -0
  67. package/dist/form/Datepicker.svelte +311 -0
  68. package/dist/form/Datepicker.svelte.d.ts +9 -0
  69. package/dist/form/FieldContent.svelte +178 -0
  70. package/dist/form/FieldContent.svelte.d.ts +21 -0
  71. package/dist/form/FieldError.svelte +24 -0
  72. package/dist/form/FieldError.svelte.d.ts +7 -0
  73. package/dist/form/Fieldset.svelte +103 -0
  74. package/dist/form/Fieldset.svelte.d.ts +20 -0
  75. package/dist/form/Form.svelte +220 -0
  76. package/dist/form/Form.svelte.d.ts +38 -0
  77. package/dist/form/FormActions.svelte +80 -0
  78. package/dist/form/FormActions.svelte.d.ts +9 -0
  79. package/dist/form/FormSection.svelte +96 -0
  80. package/dist/form/FormSection.svelte.d.ts +9 -0
  81. package/dist/form/ImageUpload.svelte +299 -0
  82. package/dist/form/ImageUpload.svelte.d.ts +20 -0
  83. package/dist/form/Input.svelte +444 -0
  84. package/dist/form/Input.svelte.d.ts +108 -0
  85. package/dist/form/InputLength.svelte +42 -0
  86. package/dist/form/InputLength.svelte.d.ts +9 -0
  87. package/dist/form/Label.svelte +88 -0
  88. package/dist/form/Label.svelte.d.ts +16 -0
  89. package/dist/form/LogoUpload.svelte +115 -0
  90. package/dist/form/LogoUpload.svelte.d.ts +18 -0
  91. package/dist/form/Select.svelte +186 -0
  92. package/dist/form/Select.svelte.d.ts +59 -0
  93. package/dist/form/Textarea.svelte +265 -0
  94. package/dist/form/Textarea.svelte.d.ts +95 -0
  95. package/dist/form/Toggle.svelte +4 -0
  96. package/dist/form/Toggle.svelte.d.ts +18 -0
  97. package/dist/form/client.svelte.d.ts +45 -0
  98. package/dist/form/client.svelte.js +102 -0
  99. package/dist/form/form.d.ts +55 -0
  100. package/dist/form/form.js +345 -0
  101. package/dist/form/index.d.ts +17 -0
  102. package/dist/form/index.js +17 -0
  103. package/dist/form/types.d.ts +55 -0
  104. package/dist/form/types.js +1 -0
  105. package/dist/icons/IconAlert.svelte +3 -0
  106. package/dist/icons/IconAlert.svelte.d.ts +26 -0
  107. package/dist/icons/IconCopy.svelte +3 -0
  108. package/dist/icons/IconCopy.svelte.d.ts +26 -0
  109. package/dist/icons/IconDone.svelte +3 -0
  110. package/dist/icons/IconDone.svelte.d.ts +26 -0
  111. package/dist/icons/IconError.svelte +3 -0
  112. package/dist/icons/IconError.svelte.d.ts +26 -0
  113. package/dist/icons/IconHelp.svelte +3 -0
  114. package/dist/icons/IconHelp.svelte.d.ts +26 -0
  115. package/dist/icons/IconHide.svelte +3 -0
  116. package/dist/icons/IconHide.svelte.d.ts +26 -0
  117. package/dist/icons/IconInfo.svelte +3 -0
  118. package/dist/icons/IconInfo.svelte.d.ts +26 -0
  119. package/dist/icons/IconLink.svelte +3 -0
  120. package/dist/icons/IconLink.svelte.d.ts +26 -0
  121. package/dist/icons/IconMenuBurger.svelte +3 -0
  122. package/dist/icons/IconMenuBurger.svelte.d.ts +26 -0
  123. package/dist/icons/IconMenuDots.svelte +3 -0
  124. package/dist/icons/IconMenuDots.svelte.d.ts +26 -0
  125. package/dist/icons/IconSearch.svelte +3 -0
  126. package/dist/icons/IconSearch.svelte.d.ts +26 -0
  127. package/dist/icons/IconShow.svelte +3 -0
  128. package/dist/icons/IconShow.svelte.d.ts +26 -0
  129. package/dist/icons/IconSuccess.svelte +3 -0
  130. package/dist/icons/IconSuccess.svelte.d.ts +26 -0
  131. package/dist/icons/IconWarning.svelte +3 -0
  132. package/dist/icons/IconWarning.svelte.d.ts +26 -0
  133. package/dist/icons/index.d.ts +14 -0
  134. package/dist/icons/index.js +14 -0
  135. package/dist/index.d.ts +3 -5
  136. package/dist/index.js +3 -5
  137. package/dist/util/StringOrComponent.svelte +20 -0
  138. package/dist/util/StringOrComponent.svelte.d.ts +8 -0
  139. package/dist/util/StringOrSnippet.svelte +16 -0
  140. package/dist/util/StringOrSnippet.svelte.d.ts +8 -0
  141. package/dist/util/attr.d.ts +5 -0
  142. package/dist/util/attr.js +21 -0
  143. package/dist/util/color.d.ts +51 -0
  144. package/dist/util/color.js +97 -0
  145. package/dist/util/dom.d.ts +15 -0
  146. package/dist/util/dom.js +73 -0
  147. package/dist/util/keyboard.svelte.d.ts +22 -0
  148. package/dist/util/keyboard.svelte.js +161 -0
  149. package/dist/util/locale.d.ts +1 -0
  150. package/dist/util/locale.js +47 -0
  151. package/dist/util/settings.d.ts +4 -0
  152. package/dist/util/settings.js +1 -0
  153. package/package.json +20 -11
  154. package/dist/css/0-layers.css +0 -1
@@ -0,0 +1,168 @@
1
+ <script lang="ts">
2
+ import { type OverlayItem, type OverlayPosition } from "./overlays.svelte.js";
3
+ import { slidefade } from "../util/transitions.js";
4
+ import { BROWSER } from "esm-env";
5
+ import { untrack } from "svelte";
6
+
7
+ let {
8
+ position,
9
+ items,
10
+ }: {
11
+ position?: OverlayPosition;
12
+ items: OverlayItem[]
13
+ } = $props();
14
+
15
+ const fudge = 8;
16
+
17
+ let contentEls: Record<string, HTMLElement> = $state({});
18
+ let scrollX = $state(BROWSER ? window.scrollX : 0);
19
+ let scrollY = $state(BROWSER ? window.scrollY : 0);
20
+ let innerWidth = $state(BROWSER ? window.innerWidth : 0);
21
+ let innerHeight = $state(BROWSER ? window.innerHeight : 0);
22
+
23
+ let positions = $derived.by(() => {
24
+
25
+ innerWidth;
26
+ innerHeight;
27
+ scrollX;
28
+ scrollY;
29
+ contentEls;
30
+
31
+ return items.map((item) => {
32
+ const contentEl = contentEls[item.id];
33
+ if(!item.anchor || !contentEl) return { left: 0, top: 0, index: 1 };
34
+ const triggerPos = item.anchor.getBoundingClientRect();
35
+
36
+ const height = contentEl.clientHeight;
37
+ const width = contentEl.clientWidth;
38
+
39
+ const isOffBottom = triggerPos.bottom + height > window.innerHeight - fudge;
40
+ const isOffRight = triggerPos.left + width > window.innerWidth - fudge;
41
+
42
+ let left = triggerPos.left;
43
+ let top = triggerPos.top + triggerPos.height + fudge;
44
+
45
+ if(isOffRight) left = left - width + triggerPos.width;
46
+ if(isOffBottom) top = top - height - triggerPos.height - (fudge * 2);
47
+
48
+ return {
49
+ left,
50
+ top,
51
+ index: 1,
52
+ };
53
+ });
54
+ });
55
+
56
+ let originCache: Record<string, string> = $state({});
57
+
58
+ /**
59
+ * The origin of the menu content based on the trigger position.
60
+ */
61
+ let origins = $derived.by(() => {
62
+ return items.map((item, index) => {
63
+ if (!item.anchor || item.position !== "anchor") {
64
+ return item.position || "center";
65
+ }
66
+
67
+ const triggerPos = item.anchor!.getBoundingClientRect();
68
+ const contentEl = document.getElementById(item.id);
69
+ const contentRect = contentEl?.getBoundingClientRect();
70
+
71
+ const height = contentRect!.height;
72
+ const width = contentRect!.width;
73
+
74
+ const isOffBottom = triggerPos.bottom + height > innerHeight - fudge;
75
+ const isOffRight = triggerPos.left + width > innerWidth - fudge;
76
+
77
+ let text = "top left";
78
+
79
+ if (isOffRight) text = text.replace("left", "right");
80
+ if (isOffBottom) text = text.replace("top", "bottom");
81
+
82
+ return text;
83
+ });
84
+ });
85
+
86
+ $effect(() => {
87
+ origins;
88
+ origins.forEach((origin, index) => {
89
+ originCache[untrack(() => items[index].id)] = origin;
90
+ });
91
+ });
92
+
93
+ function introstart(item: OverlayItem) {
94
+ document.getElementById(item.id)!.style.pointerEvents = "none";
95
+ }
96
+
97
+ function introend(item: OverlayItem) {
98
+ document.getElementById(item.id)!.style.pointerEvents = "auto";
99
+ }
100
+ </script>
101
+
102
+ <svelte:window bind:scrollX bind:scrollY bind:innerWidth bind:innerHeight />
103
+
104
+ <div class="Layer {position}">
105
+ {#each items as item, index (item.id)}
106
+ <div
107
+ id={item.id}
108
+ bind:this={contentEls[item.id]}
109
+ class="LayerItem"
110
+ class:anchor={item.anchor ? true : false}
111
+ onintrostart={() => introstart(item)}
112
+ onintroend={() => introend(item)}
113
+ transition:slidefade|global={{ duration: 150, origin: originCache[item.id] || origins[index], noMargin: !!!item.anchor }}
114
+ style="--index: {index}; --z: {item.z}; --left: {positions[index].left}px; --top: {positions[index].top}px;"
115
+ >
116
+ {#if item.component}
117
+ <item.component {...item.props} />
118
+ {:else if item.snippet}
119
+ {@render item.snippet()}
120
+ {/if}
121
+ </div>
122
+ {/each}
123
+ </div>
124
+
125
+ <style>
126
+ .Layer {
127
+ pointer-events: auto;
128
+ position: absolute;
129
+ display: flex;
130
+ flex-direction: column-reverse;
131
+ gap: 0.75rem;
132
+ }
133
+ .Layer.center {
134
+ left: 50%;
135
+ right: auto;
136
+ transform: translateX(-50%);
137
+ }
138
+ .Layer.top {
139
+ top: calc(1rem + env(safe-area-inset-top));
140
+ bottom: unset;
141
+ }
142
+ .Layer.bottom {
143
+ top: unset;
144
+ bottom: calc(1rem + env(safe-area-inset-bottom));
145
+ }
146
+ .Layer.right {
147
+ left: unset;
148
+ right: calc(1rem + env(safe-area-inset-right));
149
+ }
150
+ .Layer.left {
151
+ left: calc(1rem + env(safe-area-inset-left));
152
+ right: unset;
153
+ }
154
+ .Layer.center:not(.top):not(.bottom):not(.anchor) {
155
+ top: 50%;
156
+ bottom: auto;
157
+ transform: translate(calc(-50% + env(safe-area-inset-left) + env(safe-area-inset-right)), calc(-50% + env(safe-area-inset-top) + env(safe-area-inset-bottom)));
158
+ }
159
+ .LayerItem {
160
+ position: relative;
161
+ z-index: calc(100 + var(--z, 1) - var(--index, 0));
162
+ }
163
+ .LayerItem.anchor {
164
+ position: absolute;
165
+ top: var(--top, 0);
166
+ left: var(--left, 0);
167
+ }
168
+ </style>
@@ -0,0 +1,8 @@
1
+ import { type OverlayItem, type OverlayPosition } from "./overlays.svelte.js";
2
+ type $$ComponentProps = {
3
+ position?: OverlayPosition;
4
+ items: OverlayItem[];
5
+ };
6
+ declare const OverlayLayer: import("svelte").Component<$$ComponentProps, {}, "">;
7
+ type OverlayLayer = ReturnType<typeof OverlayLayer>;
8
+ export default OverlayLayer;
@@ -4,105 +4,27 @@
4
4
  /**
5
5
  * @description
6
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
7
  * @example
10
- * <PageContent pad>
8
+ * <PageContent>
11
9
  * <p>Paragraph</p>
12
10
  * </PageContent>
13
11
  */
14
12
  let {
15
13
  children,
16
- pad = false,
17
- middle = false,
18
- center = false,
19
- style,
20
14
  }: {
21
15
  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
16
  } = $props();
43
17
 
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
18
 
96
19
  </script>
97
20
 
98
- <div class="PageContent" class:middle class:center style={padStyle}>
21
+ <div class="PageContent">
99
22
  {@render children()}
100
23
  </div>
101
24
 
102
25
  <style>
103
26
  .PageContent {
104
- display: block;
105
- min-width: 0;
106
- min-height: 0;
27
+ display: contents;
28
+ --isPage: 1;
107
29
  }
108
30
  </style>
@@ -1,37 +1,6 @@
1
1
  import type { Snippet } from "svelte";
2
2
  type $$ComponentProps = {
3
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
4
  };
36
5
  declare const PageContent: import("svelte").Component<$$ComponentProps, {}, "">;
37
6
  type PageContent = ReturnType<typeof PageContent>;
@@ -0,0 +1,74 @@
1
+ <script lang="ts">
2
+ import { page } from "$app/stores";
3
+ import { setContext, type Snippet } from "svelte";
4
+ import type { TabbedContentItem } from "./MenuTypes.js";
5
+ import Tabs from "./Tabs.svelte";
6
+
7
+ /**
8
+ * @description
9
+ * Tabbed content that will display the content of the selected tab.
10
+ * @cssprop --gap - The gap between the tabs and the content. (Default: 1.5rem)
11
+ * @example
12
+ * {#snippet c1()}
13
+ * <p>foo</p>
14
+ * {/snippet}
15
+ * {#snippet c2()}
16
+ * <p>bar</p>
17
+ * {/snippet}
18
+ * <TabbedContent contained rounded items={[
19
+ * {
20
+ * label: 'Tab 1',
21
+ * hash: '#tab1',
22
+ * content: c1,
23
+ * },
24
+ * {
25
+ * label: 'Tab 2',
26
+ * hash: '#tab2',
27
+ * content: c2,
28
+ * },
29
+ * ]} />
30
+ */
31
+ let {
32
+ contained,
33
+ rounded,
34
+ children,
35
+ }: {
36
+ /** Contain the element in a box. */
37
+ contained?: boolean;
38
+ /** Round the corners of the element if contained. */
39
+ rounded?: boolean;
40
+ children: Snippet;
41
+ } = $props();
42
+
43
+ function formatHash(hash: string) {
44
+ hash = hash.toLowerCase().replace(/\s/g, '-');
45
+ if(!hash.startsWith('#')) {
46
+ hash = `#${hash}`;
47
+ }
48
+ return hash;
49
+ };
50
+
51
+ /**
52
+ * Construct the tabs from the children. Each child calls the setTabItem function.
53
+ */
54
+ let items = $state<{ id: string, label: string, href?: string }[]>([]);
55
+
56
+ function setTabItem(id: string, label: string, href?: string) {
57
+ items.push({ id, label, href });
58
+ }
59
+
60
+ setContext('TabbedContent.setTabItem', setTabItem);
61
+ </script>
62
+
63
+ <div>
64
+ <Tabs items={items} {contained} {rounded} />
65
+ {@render children()}
66
+ </div>
67
+
68
+ <style>
69
+ div {
70
+ display: flex;
71
+ flex-direction: column;
72
+ gap: var(--gap, 1.5rem);
73
+ }
74
+ </style>
@@ -0,0 +1,11 @@
1
+ import { type Snippet } from "svelte";
2
+ type $$ComponentProps = {
3
+ /** Contain the element in a box. */
4
+ contained?: boolean;
5
+ /** Round the corners of the element if contained. */
6
+ rounded?: boolean;
7
+ children: Snippet;
8
+ };
9
+ declare const TabbedContent: import("svelte").Component<$$ComponentProps, {}, "">;
10
+ type TabbedContent = ReturnType<typeof TabbedContent>;
11
+ export default TabbedContent;
@@ -0,0 +1,33 @@
1
+ <script lang="ts">
2
+ import { getContext, type Snippet } from "svelte";
3
+
4
+ let {
5
+ id,
6
+ label,
7
+ href,
8
+ children,
9
+ }: {
10
+ id?: string;
11
+ label: string;
12
+ href?: string;
13
+ children: Snippet;
14
+ } = $props();
15
+
16
+ if(!id) {
17
+ id = label.toLowerCase().replace(/ /g, '-');
18
+ }
19
+
20
+ if(href && !href.startsWith('#')) {
21
+ href = `#${encodeURIComponent(href)}`;
22
+ }
23
+
24
+ const setTabItem = getContext<((id: string, label: string, href?: string) => void)>('TabbedContent.setTabItem');
25
+ setTabItem(id, label, href);
26
+ </script>
27
+
28
+ <div class="TabbedContentItem">
29
+ {@render children()}
30
+ </div>
31
+
32
+ <style>
33
+ </style>
@@ -0,0 +1,10 @@
1
+ import { type Snippet } from "svelte";
2
+ type $$ComponentProps = {
3
+ id?: string;
4
+ label: string;
5
+ href?: string;
6
+ children: Snippet;
7
+ };
8
+ declare const TabbedContentItem: import("svelte").Component<$$ComponentProps, {}, "">;
9
+ type TabbedContentItem = ReturnType<typeof TabbedContentItem>;
10
+ export default TabbedContentItem;
@@ -0,0 +1,41 @@
1
+ <script lang="ts">
2
+ import { getContext, type Snippet } from "svelte";
3
+
4
+ let {
5
+ colored,
6
+ contained,
7
+ rounded,
8
+ hoverable,
9
+ hang,
10
+ fullWidth,
11
+ children,
12
+ }: {
13
+ colored?: boolean;
14
+ contained?: boolean;
15
+ rounded?: boolean;
16
+ hang?: boolean;
17
+ hoverable?: boolean;
18
+ fullWidth?: boolean;
19
+ children: Snippet;
20
+ } = $props();
21
+
22
+ if(contained === undefined) { contained = getContext('lutra.table.contained') ?? getContext('lutra.contained') ?? false; }
23
+ </script>
24
+
25
+ <div
26
+ class="table-container"
27
+ class:hang
28
+ class:contained
29
+ class:rounded
30
+ >
31
+ <table
32
+ class:colored
33
+ class:contained
34
+ class:rounded
35
+ class:hang
36
+ class:fullWidth
37
+ class:hoverable
38
+ >
39
+ {@render children()}
40
+ </table>
41
+ </div>
@@ -0,0 +1,13 @@
1
+ import { type Snippet } from "svelte";
2
+ type $$ComponentProps = {
3
+ colored?: boolean;
4
+ contained?: boolean;
5
+ rounded?: boolean;
6
+ hang?: boolean;
7
+ hoverable?: boolean;
8
+ fullWidth?: boolean;
9
+ children: Snippet;
10
+ };
11
+ declare const Table: import("svelte").Component<$$ComponentProps, {}, "">;
12
+ type Table = ReturnType<typeof Table>;
13
+ export default Table;