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
@@ -0,0 +1,39 @@
1
+ export interface LutraConfig {
2
+ /**
3
+ * The default theme to use.
4
+ */
5
+ theme?: 'light' | 'dark' | 'auto' | 'inherit';
6
+ /**
7
+ * Theme color for the theme-color meta tag. Only used in the root theme.
8
+ * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta/name/theme-color
9
+ */
10
+ themeColor: {
11
+ light?: string;
12
+ dark?: string;
13
+ };
14
+ /**
15
+ * Whether to show a background color or image on the components.
16
+ */
17
+ background?: boolean;
18
+ /**
19
+ * Whether to use a contained layout (with borders and rounded corners).
20
+ */
21
+ contained?: boolean;
22
+ }
23
+ /**
24
+ * Default Lutra config.
25
+ */
26
+ export declare const defaultConfig: LutraConfig;
27
+ export declare const setConfig: (config: Partial<LutraConfig>) => void;
28
+ export declare enum LutraContext {
29
+ Theme = "lutra.theme",
30
+ Config = "lutra.config",
31
+ SecChPrefersColorScheme = "sec-ch-prefers-color-scheme"
32
+ }
33
+ export type LutraTheme = 'light' | 'dark' | 'invert' | undefined;
34
+ export type LutraContextTypeMap = {
35
+ [LutraContext.Theme]: LutraTheme;
36
+ [LutraContext.Config]: LutraConfig;
37
+ [LutraContext.SecChPrefersColorScheme]: 'light' | 'dark' | undefined;
38
+ };
39
+ export declare function getContextItem<K extends keyof LutraContextTypeMap>(key: K): LutraContextTypeMap[K] | undefined;
package/dist/types.js ADDED
@@ -0,0 +1,25 @@
1
+ import { getContext } from "svelte";
2
+ /**
3
+ * Default Lutra config.
4
+ */
5
+ export const defaultConfig = {
6
+ theme: undefined,
7
+ themeColor: {
8
+ light: '#fff',
9
+ dark: '#000',
10
+ },
11
+ background: true,
12
+ contained: true,
13
+ };
14
+ export const setConfig = (config) => {
15
+ Object.assign(config, config);
16
+ };
17
+ export var LutraContext;
18
+ (function (LutraContext) {
19
+ LutraContext["Theme"] = "lutra.theme";
20
+ LutraContext["Config"] = "lutra.config";
21
+ LutraContext["SecChPrefersColorScheme"] = "sec-ch-prefers-color-scheme";
22
+ })(LutraContext || (LutraContext = {}));
23
+ export function getContextItem(key) {
24
+ return getContext(key);
25
+ }
@@ -0,0 +1,20 @@
1
+ <script lang="ts">
2
+ import type { Component } from "svelte";
3
+ let {
4
+ content,
5
+ props,
6
+ }: {
7
+ content: string | Component | undefined;
8
+ props?: Record<string, any>;
9
+ } = $props();
10
+
11
+ let Content = content as Component;
12
+ </script>
13
+
14
+ {#if content}
15
+ {#if typeof content === 'string'}
16
+ {content}
17
+ {:else if Content}
18
+ <Content {...props} />
19
+ {/if}
20
+ {/if}
@@ -0,0 +1,8 @@
1
+ import type { Component } from "svelte";
2
+ type $$ComponentProps = {
3
+ content: string | Component | undefined;
4
+ props?: Record<string, any>;
5
+ };
6
+ declare const StringOrComponent: Component<$$ComponentProps, {}, "">;
7
+ type StringOrComponent = ReturnType<typeof StringOrComponent>;
8
+ export default StringOrComponent;
@@ -0,0 +1,16 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from "svelte";
3
+ let {
4
+ props,
5
+ content,
6
+ }: {
7
+ props?: Record<string, any>;
8
+ content?: string | Snippet<[Record<string, any> | undefined]>;
9
+ } = $props();
10
+ </script>
11
+
12
+ {#if typeof content === 'string'}
13
+ {content}
14
+ {:else if content}
15
+ {@render content(props)}
16
+ {/if}
@@ -0,0 +1,8 @@
1
+ import type { Snippet } from "svelte";
2
+ type $$ComponentProps = {
3
+ props?: Record<string, any>;
4
+ content?: string | Snippet<[Record<string, any> | undefined]>;
5
+ };
6
+ declare const StringOrSnippet: import("svelte").Component<$$ComponentProps, {}, "">;
7
+ type StringOrSnippet = ReturnType<typeof StringOrSnippet>;
8
+ export default StringOrSnippet;
@@ -1,4 +1,3 @@
1
- import { createId } from "./id.js";
2
1
  let initialElements = {};
3
2
  let initialStyles = {};
4
3
  /**
@@ -7,7 +6,7 @@ let initialStyles = {};
7
6
  * @returns {HTMLElement | null} - The containing block element, or null if none is found.
8
7
  * @see https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block
9
8
  */
10
- export function findContainingBlock(element, id = createId()) {
9
+ export function findContainingBlock(element, id = crypto.randomUUID()) {
11
10
  const elementToLookAt = element?.parentElement;
12
11
  // Base case for recursion: if the element is the body or null, return null as no containing block was found
13
12
  if (!elementToLookAt || !element || element.tagName === "BODY" || elementToLookAt.tagName === "BODY") {
@@ -0,0 +1 @@
1
+ export declare function getLocaleFirstDayOfWeek(): number;
@@ -0,0 +1,47 @@
1
+ export function getLocaleFirstDayOfWeek() {
2
+ // Returns 0..6 where 0 = Sunday, 1 = Monday
3
+ try {
4
+ if (typeof Intl !== "undefined") {
5
+ const LocaleCtor = Intl.Locale;
6
+ const resolvedLocale = typeof Intl.DateTimeFormat !== "undefined"
7
+ ? new Intl.DateTimeFormat(undefined).resolvedOptions().locale
8
+ : undefined;
9
+ const navigatorPrimary = (typeof navigator !== "undefined" && navigator.languages && navigator.languages.length > 0)
10
+ ? navigator.languages[0]
11
+ : (typeof navigator !== "undefined" ? navigator.language : undefined);
12
+ const languageTag = resolvedLocale || navigatorPrimary || "en-US";
13
+ let region;
14
+ let first;
15
+ if (LocaleCtor) {
16
+ const loc = new LocaleCtor(languageTag);
17
+ region = loc.region;
18
+ const weekInfo = loc.weekInfo;
19
+ if (weekInfo && typeof weekInfo.firstDay === "number") {
20
+ // Intl Locale weekInfo uses 1..7 where 1 = Monday, 7 = Sunday
21
+ first = weekInfo.firstDay % 7; // 7 -> 0 (Sunday), 1 -> 1 (Monday)
22
+ }
23
+ }
24
+ else {
25
+ // Try to infer region from language tag
26
+ const parts = typeof languageTag === "string" ? languageTag.split("-") : [];
27
+ region = parts.length >= 2 ? parts[1] : undefined;
28
+ }
29
+ const tz = typeof Intl.DateTimeFormat !== "undefined"
30
+ ? new Intl.DateTimeFormat(undefined).resolvedOptions().timeZone
31
+ : undefined;
32
+ // If first is explicitly Sunday but timezone/region suggests Europe, prefer Monday
33
+ if (first === 0 && ((tz && typeof tz === "string" && tz.startsWith("Europe/")) || (region && region !== "US"))) {
34
+ return 1;
35
+ }
36
+ if (typeof first === "number")
37
+ return first;
38
+ if (region === "US")
39
+ return 0; // Sunday for US
40
+ if (tz && typeof tz === "string" && tz.startsWith("Europe/"))
41
+ return 1; // Monday for Europe
42
+ return 1; // default Monday for others
43
+ }
44
+ }
45
+ catch { }
46
+ return 1; // fallback Monday
47
+ }
@@ -0,0 +1,4 @@
1
+ export type LutraSettings = {
2
+ contained: boolean;
3
+ rounded: boolean;
4
+ };
package/package.json CHANGED
@@ -1,102 +1,58 @@
1
1
  {
2
2
  "name": "lutra",
3
- "version": "0.0.33",
3
+ "version": "0.1.4",
4
4
  "scripts": {
5
- "dev": "vite dev --host 0.0.0.0",
6
- "props": "node read_props.js",
7
- "local": "node local",
5
+ "dev": "vite dev",
8
6
  "build": "vite build && npm run package",
9
7
  "preview": "vite preview",
10
- "package": "svelte-kit sync && svelte-package && publint && npm run props",
8
+ "package": "svelte-kit sync && svelte-package && publint",
11
9
  "prepublishOnly": "npm run package",
12
- "test": "npm run test:integration && npm run test:unit",
13
10
  "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
14
- "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
15
- "format": "prettier --write .",
16
- "test:integration": "playwright test",
17
- "test:unit": "vitest"
11
+ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch"
18
12
  },
13
+ "files": [
14
+ "dist",
15
+ "!dist/**/*.test.*",
16
+ "!dist/**/*.spec.*"
17
+ ],
18
+ "sideEffects": [
19
+ "**/*.css"
20
+ ],
21
+ "svelte": "./dist/index.js",
22
+ "types": "./dist/index.d.ts",
23
+ "type": "module",
19
24
  "exports": {
20
25
  ".": {
21
26
  "types": "./dist/index.d.ts",
22
27
  "svelte": "./dist/index.js"
23
28
  },
24
- "./display": {
25
- "types": "./dist/display/index.d.ts",
26
- "svelte": "./dist/display/index.js"
27
- },
28
- "./form": {
29
- "types": "./dist/form/index.d.ts",
30
- "svelte": "./dist/form/index.js",
31
- "import": "./dist/form/index.js"
32
- },
33
- "./form/types": {
34
- "types": "./dist/form/types.d.ts",
35
- "import": "./dist/form/types.js"
36
- },
37
- "./icons": {
38
- "types": "./dist/icons/index.d.ts",
39
- "svelte": "./dist/icons/index.js"
40
- },
41
- "./layout": {
42
- "types": "./dist/layout/index.d.ts",
43
- "svelte": "./dist/layout/index.js"
44
- },
45
- "./nav": {
46
- "types": "./dist/nav/index.d.ts",
47
- "svelte": "./dist/nav/index.js"
48
- },
49
- "./typo": {
50
- "types": "./dist/typo/index.d.ts",
51
- "svelte": "./dist/typo/index.js"
52
- },
53
- "./utils": {
54
- "types": "./dist/utils/index.d.ts",
55
- "svelte": "./dist/utils/index.js"
56
- },
57
- "./utils/*": "./dist/utils/*"
29
+ "./themes/DefaultTheme.css": {
30
+ "import": "./dist/css/themes/DefaultTheme.css",
31
+ "require": "./dist/css/themes/DefaultTheme.css"
32
+ }
58
33
  },
59
- "files": [
60
- "dist",
61
- "!dist/**/*.test.*",
62
- "!dist/**/*.spec.*"
63
- ],
64
34
  "peerDependencies": {
65
- "@sveltejs/kit": "^2.5.0",
66
- "svelte": "^4.0.0"
35
+ "svelte": "^5.0.0"
67
36
  },
68
37
  "devDependencies": {
69
- "@playwright/test": "^1.46.1",
70
- "@rollup/browser": "^4.21.2",
71
- "@sveltejs/adapter-auto": "^3.2.4",
72
- "@sveltejs/package": "^2.3.4",
73
- "@sveltejs/vite-plugin-svelte": "^3.1.2",
74
- "@types/glob": "8.1.0",
75
- "@types/ws": "^8.5.12",
76
- "glob": "^11.0.0",
77
- "highlight.js": "^11.10.0",
78
- "mdsvex": "^0.12.3",
79
- "monaco-editor": "^0.51.0",
80
- "prettier": "^3.3.3",
81
- "prettier-plugin-svelte": "^3.2.6",
82
- "publint": "^0.2.10",
83
- "svelte": "5.0.0-next.243",
84
- "svelte-check": "^4.0.0",
85
- "tslib": "^2.7.0",
86
- "typescript": "^5.5.4",
87
- "vite": "5.4.3",
88
- "vitest": "2.0.5"
38
+ "@sveltejs/adapter-auto": "^6.1.0",
39
+ "@sveltejs/kit": "^2.31.1",
40
+ "@sveltejs/package": "^2.4.1",
41
+ "@sveltejs/vite-plugin-svelte": "^6.1.2",
42
+ "@types/node": "^24.3.0",
43
+ "publint": "^0.3.12",
44
+ "svelte": "^5.38.1",
45
+ "svelte-check": "^4.3.1",
46
+ "typescript": "^5.9.2",
47
+ "vite": "^7.1.2"
89
48
  },
90
- "svelte": "./dist/index.js",
91
- "types": "./dist/index.d.ts",
92
- "type": "module",
93
49
  "dependencies": {
94
- "@auth70/bodyguard": "^1.6.2",
95
- "@auth70/zodex-esm": "^0.7.3",
50
+ "@auth70/bodyguard": "^1.7.1",
96
51
  "blurhash": "^2.0.5",
97
52
  "browser-image-compression": "^2.0.2",
98
- "esm-env": "^1.0.0",
99
- "ws": "^8.18.0",
100
- "zod": "^3.23.8"
53
+ "esm-env": "^1.2.2",
54
+ "marked": "16.2.0",
55
+ "zod": "^4.0.17",
56
+ "zodex": "^4.0.0"
101
57
  }
102
58
  }
package/dist/color.css DELETED
File without changes
@@ -1,61 +0,0 @@
1
- <script lang="ts">import { hexRelativeLuminance, stringToColor } from "../utils/color.js";
2
- let {
3
- src,
4
- name = "N/A",
5
- shape = "circle"
6
- } = $props();
7
- const color = stringToColor(name);
8
- const luminance = hexRelativeLuminance(color);
9
- const textColor = luminance < 0.5 ? "rgba(255,255,255,0.85)" : "rgba(0,0,0,0.85)";
10
- </script>
11
-
12
- <figure class="Avatar {shape}" style="--user-color: {color}; --text-color: {textColor};">
13
- {#if src}
14
- <img src={src} alt={name} />
15
- {:else}
16
- <div class="Placeholder">
17
- <span>{name[0]}</span>
18
- </div>
19
- {/if}
20
- </figure>
21
-
22
- <style>
23
- .Avatar {
24
- display: flex;
25
- align-items: center;
26
- justify-content: center;
27
- margin: 0;
28
- block-size: var(--size, 3rem);
29
- inline-size: var(--size, 3rem);
30
- overflow: hidden;
31
- background-color: var(--user-color);
32
- mask-image: var(--mask-image, none);
33
- mask-size: 100% 100%;
34
- mask-repeat: no-repeat;
35
- -webkit-mask-image: var(--mask-image, none);
36
- -webkit-mask-size: 100% 100%;
37
- -webkit-mask-repeat: no-repeat;
38
- }
39
- .Avatar.circle { border-radius: 50%; }
40
- .Avatar.square { border-radius: 0; }
41
- .Avatar.rounded { border-radius: var(--border-radius); }
42
- .Avatar img {
43
- block-size: 100%;
44
- inline-size: 100%;
45
- object-fit: cover;
46
- }
47
- .Avatar .Placeholder {
48
- display: flex;
49
- align-items: center;
50
- justify-content: center;
51
- block-size: 100%;
52
- inline-size: 100%;
53
- background-color: var(--user-color);
54
- }
55
- .Avatar .Placeholder span {
56
- font-size: 1rem;
57
- font-weight: 600;
58
- color: var(--text-color);
59
- user-select: none;
60
- }
61
- </style>
@@ -1,19 +0,0 @@
1
- interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
- $$bindings?: Bindings;
4
- } & Exports;
5
- (internal: unknown, props: Props & {
6
- $$events?: Events;
7
- $$slots?: Slots;
8
- }): Exports;
9
- z_$$bindings?: Bindings;
10
- }
11
- declare const Avatar: $$__sveltets_2_IsomorphicComponent<{
12
- src?: string;
13
- name?: string;
14
- shape?: "circle" | "square" | "rounded";
15
- }, {
16
- [evt: string]: CustomEvent<any>;
17
- }, {}, {}, "">;
18
- type Avatar = InstanceType<typeof Avatar>;
19
- export default Avatar;
@@ -1,91 +0,0 @@
1
- <script lang="ts">import { isStatusColor } from "../utils/color.js";
2
- let {
3
- count,
4
- max = 99,
5
- color = "alert",
6
- glow = true,
7
- outline = true,
8
- children
9
- } = $props();
10
- let el = $state(null);
11
- let isSet = $derived(isStatusColor(color));
12
- let charCount = $derived.by(() => {
13
- if (count === void 0) return 0;
14
- if (max && count > max) return max.toString().length + 1;
15
- return count.toString().length;
16
- });
17
- </script>
18
-
19
- <div class="BadgeContainer">
20
- <div class="BadgeContent">
21
- {#if children}
22
- {@render children()}
23
- {/if}
24
- </div>
25
- <span class="Badge" class:outline class:glow class:empty={count === undefined} bind:this={el} style="--charCount: {charCount}ch; --bgColor: {!isSet ? color : 'var(--status-'+color+')'};">
26
- {#if count && max}
27
- <em>
28
- {count > max ? `${max}+` : count}
29
- </em>
30
- {/if}
31
- </span>
32
- </div>
33
-
34
-
35
- <style>
36
- .BadgeContainer {
37
- position: relative;
38
- display: inline-grid;
39
- grid-template-columns: fit-content;
40
- grid-template-areas: "content";
41
- text-rendering: geometricPrecision;
42
- }
43
- .BadgeContent {
44
- grid-area: content;
45
- }
46
- .Badge {
47
- --internalSize: max(calc(var(--size, 0.75rem)), 14px);
48
- display: grid;
49
- place-items: center;
50
- align-items: center;
51
- justify-content: center;
52
- position: absolute;
53
- top: calc(1px + var(--top, 0%));
54
- right: var(--right, 0%);
55
- transform: translate(0.55rem, -50%);
56
- background-color: var(--bgColor);
57
- padding: 3px 5px 2px 5px;
58
- border-radius: 9999px;
59
- --h: max(calc(var(--internalSize) * 0.9), 9px);
60
- font-size: var(--h);
61
- line-height: var(--h);
62
- z-index: 100;
63
- font-weight: 600;
64
- grid-area: content;
65
- }
66
- .Badge.outline {
67
- outline: min(calc(var(--size, 0.75rem) * 0.25), 2px) solid var(--outline-color, var(--bg-app));
68
- }
69
- .Badge.empty {
70
- width: max(0.5rem, 8px);
71
- height: max(0.5rem, 8px);
72
- min-width: auto;
73
- aspect-ratio: 1/1;
74
- transform: translate(50%, -50%);
75
- padding: 0;
76
- }
77
- .Badge.glow {
78
- filter: drop-shadow(0 0 0.25rem color-mix(in srgb, var(--bgColor) 30%, transparent 70%));
79
- }
80
- em {
81
- opacity: 0.99;
82
- font-style: normal;
83
- color: var(--bgColor);
84
- filter: invert(1) grayscale(1) brightness(1.3) contrast(9000%);
85
- mix-blend-mode: luminosity;
86
- left: 50%;
87
- position: relative;
88
- display: block;
89
- transform: translateX(-50%);
90
- }
91
- </style>
@@ -1,30 +0,0 @@
1
- import type { Snippet } from "svelte";
2
- import type { StatusColorOrString } from "../utils/color.js";
3
- interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
4
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
5
- $$bindings?: Bindings;
6
- } & Exports;
7
- (internal: unknown, props: Props & {
8
- $$events?: Events;
9
- $$slots?: Slots;
10
- }): Exports;
11
- z_$$bindings?: Bindings;
12
- }
13
- declare const Badge: $$__sveltets_2_IsomorphicComponent<{
14
- /** Count to display in the badge. */
15
- count?: number;
16
- /** The maximum count to display. */
17
- max?: number;
18
- /** The color of the tag. */
19
- color?: StatusColorOrString;
20
- /** Whether to add a glow to the badge. */
21
- glow?: boolean;
22
- /** Whether to add an outline to the badge. */
23
- outline?: boolean;
24
- /** The content to display inside the badge. */
25
- children?: Snippet;
26
- }, {
27
- [evt: string]: CustomEvent<any>;
28
- }, {}, {}, "">;
29
- type Badge = InstanceType<typeof Badge>;
30
- export default Badge;
@@ -1,109 +0,0 @@
1
- <script lang="ts">import Icon from "./Icon.svelte";
2
- import Alert from "../icons/IconAlert.svelte";
3
- import Info from "../icons/IconInfo.svelte";
4
- import Success from "../icons/IconSuccess.svelte";
5
- import Warning from "../icons/IconWarning.svelte";
6
- import Error from "../icons/IconError.svelte";
7
- import Tooltip from "./Tooltip.svelte";
8
- let {
9
- icon,
10
- type,
11
- contained,
12
- rounded,
13
- dismissable,
14
- children
15
- } = $props();
16
- if (!icon) {
17
- switch (type) {
18
- case "alert":
19
- icon = Alert;
20
- break;
21
- case "info":
22
- icon = Info;
23
- break;
24
- case "ok":
25
- icon = Success;
26
- break;
27
- case "warn":
28
- icon = Warning;
29
- break;
30
- case "task":
31
- icon = Error;
32
- break;
33
- default:
34
- icon = void 0;
35
- break;
36
- }
37
- }
38
- </script>
39
-
40
- <div class="Callout {type}" class:hasIcon={!!icon} class:contained class:rounded class:dismissable style="--margin-scale: 0.5;">
41
- {#if icon}
42
- <Icon {icon} --icon-width="1.5rem" --icon-height="1.5rem" />
43
- {/if}
44
- <div class="CalloutText">
45
- {@render children()}
46
- </div>
47
- {#if dismissable}
48
- <div class="Dismiss">
49
- <Tooltip tip="Dismiss">
50
- <button type="button" class="CalloutDismiss" aria-label="Dismiss callout">
51
- <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
52
- <path d="M1 1L15 15" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
53
- <path d="M1 15L15 1" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
54
- </svg>
55
- </button>
56
- </Tooltip>
57
- </div>
58
- {/if}
59
- </div>
60
-
61
- <style>
62
- .Callout {
63
- background: var(--bg, var(--bg-subtle));
64
- padding: var(--padding, 1rem);
65
- display: grid;
66
- gap: var(--gap, 1rem);
67
- align-items: var(--align-items, start);
68
- --text-heading: hsla(240, 10%, 98%);
69
- --text: hsla(240, 10%, 95%);
70
- --text-subtle: hsla(240, 10%, 90%);
71
- color: var(--text-heading);
72
- }
73
- .Callout.contained {
74
- border: var(--border);
75
- }
76
- .Callout.rounded {
77
- border-radius: var(--border-radius);
78
- }
79
- .Callout.hasIcon {
80
- grid-template-columns: auto 1fr;
81
- }
82
- .Callout.dismissable {
83
- grid-template-columns: 1fr auto;
84
- }
85
- .Callout.dismissable.hasIcon {
86
- grid-template-columns: auto 1fr auto;
87
- }
88
- .CalloutText {
89
- font-size: var(--font-size, 1em);
90
- line-height: 1.5;
91
- }
92
- .Callout.info {
93
- --bg: var(--status-info);
94
- }
95
- .Callout.ok {
96
- --bg: var(--status-ok);
97
- }
98
- .Dismiss {
99
- margin: -0.75rem;
100
- }
101
- .CalloutDismiss {
102
- background: transparent;
103
- border: none;
104
- padding: 0.75rem;
105
- cursor: pointer;
106
- }
107
- .CalloutText {
108
- }
109
- </style>