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.
- package/README.md +4 -24
- package/dist/components/AspectRatio.svelte +26 -0
- package/dist/components/AspectRatio.svelte.d.ts +8 -0
- package/dist/components/Avatar.svelte +105 -0
- package/dist/components/Avatar.svelte.d.ts +14 -0
- package/dist/{display → components}/Close.svelte +25 -7
- package/dist/components/Close.svelte.d.ts +7 -0
- package/dist/components/ContextTip.svelte +41 -0
- package/dist/components/ContextTip.svelte.d.ts +7 -0
- package/dist/components/Dialog.svelte +78 -0
- package/dist/components/Dialog.svelte.d.ts +14 -0
- package/dist/components/Icon.svelte +62 -0
- package/dist/components/Icon.svelte.d.ts +8 -0
- package/dist/{display → components}/IconButton.svelte +43 -14
- package/dist/components/IconButton.svelte.d.ts +16 -0
- package/dist/components/Image.svelte +172 -0
- package/dist/components/Image.svelte.d.ts +56 -0
- package/dist/{display → components}/Indicator.svelte +44 -9
- package/dist/components/Indicator.svelte.d.ts +12 -0
- package/dist/{display → components}/Inset.svelte +8 -3
- package/dist/components/Inset.svelte.d.ts +7 -0
- package/dist/components/Layout.svelte +33 -0
- package/dist/components/Layout.svelte.d.ts +11 -0
- package/dist/components/MenuDropdown.svelte +195 -0
- package/dist/components/MenuDropdown.svelte.d.ts +16 -0
- package/dist/{nav → components}/MenuItem.svelte +46 -38
- package/dist/components/MenuItem.svelte.d.ts +11 -0
- package/dist/components/MenuItemContent.svelte +25 -0
- package/dist/components/MenuItemContent.svelte.d.ts +10 -0
- package/dist/{nav → components}/MenuTypes.d.ts +19 -5
- package/dist/components/Modal.svelte +149 -0
- package/dist/components/Modal.svelte.d.ts +16 -0
- package/dist/{display → components}/Notification.svelte +33 -22
- package/dist/components/Notification.svelte.d.ts +12 -0
- package/dist/components/Overlay.svelte +31 -0
- package/dist/components/Overlay.svelte.d.ts +14 -0
- package/dist/{layout → components}/OverlayContainer.svelte +6 -3
- package/dist/{layout → components}/OverlayContainer.svelte.d.ts +4 -1
- package/dist/components/OverlayLayer.svelte +168 -0
- package/dist/components/OverlayLayer.svelte.d.ts +8 -0
- package/dist/components/PageContent.svelte +108 -0
- package/dist/components/PageContent.svelte.d.ts +38 -0
- package/dist/components/TabbedContent.svelte +74 -0
- package/dist/components/TabbedContent.svelte.d.ts +11 -0
- package/dist/components/TabbedContentItem.svelte +33 -0
- package/dist/components/TabbedContentItem.svelte.d.ts +10 -0
- package/dist/components/Table.svelte +41 -0
- package/dist/components/Table.svelte.d.ts +13 -0
- package/dist/{nav → components}/Tabs.svelte +99 -41
- package/dist/components/Tabs.svelte.d.ts +20 -0
- package/dist/components/Tag.svelte +120 -0
- package/dist/components/Tag.svelte.d.ts +21 -0
- package/dist/components/Theme.svelte +105 -0
- package/dist/components/Theme.svelte.d.ts +17 -0
- package/dist/{display → components}/Tooltip.svelte +41 -16
- package/dist/components/Tooltip.svelte.d.ts +12 -0
- package/dist/components/UIContent.svelte +19 -0
- package/dist/components/UIContent.svelte.d.ts +7 -0
- package/dist/components/index.d.ts +28 -0
- package/dist/components/index.js +29 -0
- package/dist/{display → components}/notifications.svelte.d.ts +1 -1
- package/dist/{display → components}/notifications.svelte.js +3 -4
- package/dist/{layout → components}/overlays.svelte.d.ts +4 -2
- package/dist/config.d.ts +30 -0
- package/dist/config.js +18 -0
- package/dist/css/1-props.css +440 -0
- package/dist/css/2-base.css +343 -0
- package/dist/css/3-typo.css +106 -0
- package/dist/css/4-layout.css +368 -0
- package/dist/css/5-media.css +116 -0
- package/dist/css/lutra.css +7 -0
- package/dist/css/themes/DefaultTheme.css +209 -0
- package/dist/form/Button.svelte +35 -16
- package/dist/form/Button.svelte.d.ts +8 -19
- package/dist/form/Datepicker.svelte +311 -0
- package/dist/form/Datepicker.svelte.d.ts +9 -0
- package/dist/form/FieldContent.svelte +69 -44
- package/dist/form/FieldContent.svelte.d.ts +7 -17
- package/dist/form/FieldError.svelte +16 -6
- package/dist/form/FieldError.svelte.d.ts +4 -15
- package/dist/form/Fieldset.svelte +48 -13
- package/dist/form/Fieldset.svelte.d.ts +5 -16
- package/dist/form/Form.svelte +158 -74
- package/dist/form/Form.svelte.d.ts +17 -17
- package/dist/form/{FieldActions.svelte → FormActions.svelte} +29 -17
- package/dist/form/FormActions.svelte.d.ts +9 -0
- package/dist/form/FormSection.svelte +96 -0
- package/dist/form/FormSection.svelte.d.ts +9 -0
- package/dist/form/ImageUpload.svelte +134 -94
- package/dist/form/ImageUpload.svelte.d.ts +5 -16
- package/dist/form/Input.svelte +254 -136
- package/dist/form/Input.svelte.d.ts +12 -21
- package/dist/form/InputLength.svelte +15 -5
- package/dist/form/InputLength.svelte.d.ts +4 -15
- package/dist/form/Label.svelte +55 -11
- package/dist/form/Label.svelte.d.ts +6 -15
- package/dist/form/LogoUpload.svelte +36 -21
- package/dist/form/LogoUpload.svelte.d.ts +4 -15
- package/dist/form/Select.svelte +100 -50
- package/dist/form/Select.svelte.d.ts +5 -16
- package/dist/form/Textarea.svelte +200 -98
- package/dist/form/Textarea.svelte.d.ts +11 -24
- package/dist/form/Toggle.svelte +3 -1
- package/dist/form/Toggle.svelte.d.ts +4 -1
- package/dist/form/client.svelte.d.ts +1 -0
- package/dist/form/client.svelte.js +6 -2
- package/dist/form/form.d.ts +10 -9
- package/dist/form/form.js +37 -32
- package/dist/form/index.d.ts +3 -4
- package/dist/form/index.js +3 -4
- package/dist/form/types.d.ts +9 -16
- package/dist/icons/IconAlert.svelte.d.ts +4 -1
- package/dist/icons/IconCopy.svelte.d.ts +4 -1
- package/dist/icons/IconDone.svelte.d.ts +4 -1
- package/dist/icons/IconError.svelte.d.ts +4 -1
- package/dist/icons/IconHelp.svelte.d.ts +4 -1
- package/dist/icons/IconHide.svelte.d.ts +4 -1
- package/dist/icons/IconInfo.svelte.d.ts +4 -1
- package/dist/icons/IconLink.svelte.d.ts +4 -1
- package/dist/icons/IconMenuBurger.svelte.d.ts +4 -1
- package/dist/icons/IconMenuDots.svelte.d.ts +4 -1
- package/dist/icons/IconSearch.svelte.d.ts +4 -1
- package/dist/icons/IconShow.svelte.d.ts +4 -1
- package/dist/icons/IconSuccess.svelte.d.ts +4 -1
- package/dist/icons/IconWarning.svelte.d.ts +4 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +3 -2
- package/dist/types.d.ts +39 -0
- package/dist/types.js +25 -0
- package/dist/util/StringOrComponent.svelte +20 -0
- package/dist/util/StringOrComponent.svelte.d.ts +8 -0
- package/dist/util/StringOrSnippet.svelte +16 -0
- package/dist/util/StringOrSnippet.svelte.d.ts +8 -0
- package/dist/{utils → util}/dom.js +1 -2
- package/dist/util/locale.d.ts +1 -0
- package/dist/util/locale.js +47 -0
- package/dist/util/settings.d.ts +4 -0
- package/package.json +35 -79
- package/dist/color.css +0 -0
- package/dist/display/Avatar.svelte +0 -61
- package/dist/display/Avatar.svelte.d.ts +0 -19
- package/dist/display/Badge.svelte +0 -91
- package/dist/display/Badge.svelte.d.ts +0 -30
- package/dist/display/Callout.svelte +0 -109
- package/dist/display/Callout.svelte.d.ts +0 -28
- package/dist/display/Close.svelte.d.ts +0 -18
- package/dist/display/Code.svelte +0 -190
- package/dist/display/Code.svelte.d.ts +0 -32
- package/dist/display/ContextTip.svelte +0 -23
- package/dist/display/ContextTip.svelte.d.ts +0 -18
- package/dist/display/DataList.svelte +0 -16
- package/dist/display/DataList.svelte.d.ts +0 -21
- package/dist/display/Details.svelte +0 -49
- package/dist/display/Details.svelte.d.ts +0 -27
- package/dist/display/Hero.svelte +0 -50
- package/dist/display/Hero.svelte.d.ts +0 -26
- package/dist/display/Icon.svelte +0 -39
- package/dist/display/Icon.svelte.d.ts +0 -19
- package/dist/display/IconButton.svelte.d.ts +0 -27
- package/dist/display/Image.svelte +0 -91
- package/dist/display/Image.svelte.d.ts +0 -26
- package/dist/display/Indicator.svelte.d.ts +0 -23
- package/dist/display/Inset.svelte.d.ts +0 -18
- package/dist/display/LineChart.svelte +0 -385
- package/dist/display/LineChart.svelte.d.ts +0 -24
- package/dist/display/LoadingIndicator.svelte +0 -33
- package/dist/display/LoadingIndicator.svelte.d.ts +0 -15
- package/dist/display/Modal.svelte +0 -116
- package/dist/display/Modal.svelte.d.ts +0 -27
- package/dist/display/Notification.svelte.d.ts +0 -23
- package/dist/display/Panel.svelte +0 -23
- package/dist/display/Panel.svelte.d.ts +0 -19
- package/dist/display/Popup.svelte +0 -111
- package/dist/display/Popup.svelte.d.ts +0 -25
- package/dist/display/Stat.svelte +0 -81
- package/dist/display/Stat.svelte.d.ts +0 -30
- package/dist/display/Table.svelte +0 -28
- package/dist/display/Table.svelte.d.ts +0 -24
- package/dist/display/TablePaginator.svelte +0 -51
- package/dist/display/TablePaginator.svelte.d.ts +0 -21
- package/dist/display/Tag.svelte +0 -90
- package/dist/display/Tag.svelte.d.ts +0 -32
- package/dist/display/Tooltip.svelte.d.ts +0 -23
- package/dist/display/chart.d.ts +0 -78
- package/dist/display/chart.js +0 -212
- package/dist/display/index.d.ts +0 -24
- package/dist/display/index.js +0 -24
- package/dist/form/FieldActions.svelte.d.ts +0 -20
- package/dist/form/FieldContainer.svelte +0 -37
- package/dist/form/FieldContainer.svelte.d.ts +0 -19
- package/dist/form/FieldSection.svelte +0 -86
- package/dist/form/FieldSection.svelte.d.ts +0 -20
- package/dist/layout/Layout.svelte +0 -47
- package/dist/layout/Layout.svelte.d.ts +0 -22
- package/dist/layout/LayoutFooter.svelte +0 -21
- package/dist/layout/LayoutFooter.svelte.d.ts +0 -18
- package/dist/layout/LayoutGrid.svelte +0 -51
- package/dist/layout/LayoutGrid.svelte.d.ts +0 -27
- package/dist/layout/LayoutHeader.svelte +0 -97
- package/dist/layout/LayoutHeader.svelte.d.ts +0 -34
- package/dist/layout/LayoutSideMenu.svelte +0 -55
- package/dist/layout/LayoutSideMenu.svelte.d.ts +0 -21
- package/dist/layout/LayoutTypes.d.ts +0 -15
- package/dist/layout/LayoutTypes.js +0 -9
- package/dist/layout/Overlay.svelte +0 -20
- package/dist/layout/Overlay.svelte.d.ts +0 -25
- package/dist/layout/OverlayLayer.svelte +0 -140
- package/dist/layout/OverlayLayer.svelte.d.ts +0 -19
- package/dist/layout/PageContent.svelte +0 -82
- package/dist/layout/PageContent.svelte.d.ts +0 -25
- package/dist/layout/Theme.svelte +0 -243
- package/dist/layout/Theme.svelte.d.ts +0 -19
- package/dist/layout/UIContent.svelte +0 -15
- package/dist/layout/UIContent.svelte.d.ts +0 -18
- package/dist/layout/index.d.ts +0 -11
- package/dist/layout/index.js +0 -11
- package/dist/nav/Breadcrumb.svelte +0 -82
- package/dist/nav/Breadcrumb.svelte.d.ts +0 -28
- package/dist/nav/Menu.svelte +0 -170
- package/dist/nav/Menu.svelte.d.ts +0 -27
- package/dist/nav/MenuItem.svelte.d.ts +0 -22
- package/dist/nav/NavMenu.svelte +0 -181
- package/dist/nav/NavMenu.svelte.d.ts +0 -19
- package/dist/nav/TabbedContent.svelte +0 -43
- package/dist/nav/TabbedContent.svelte.d.ts +0 -23
- package/dist/nav/Tabs.svelte.d.ts +0 -25
- package/dist/nav/index.d.ts +0 -7
- package/dist/nav/index.js +0 -6
- package/dist/style.css +0 -950
- package/dist/typo/Clamp.svelte +0 -25
- package/dist/typo/Clamp.svelte.d.ts +0 -24
- package/dist/typo/H.svelte +0 -52
- package/dist/typo/H.svelte.d.ts +0 -28
- package/dist/typo/H1.svelte +0 -14
- package/dist/typo/H1.svelte.d.ts +0 -26
- package/dist/typo/H2.svelte +0 -14
- package/dist/typo/H2.svelte.d.ts +0 -26
- package/dist/typo/H3.svelte +0 -14
- package/dist/typo/H3.svelte.d.ts +0 -26
- package/dist/typo/H4.svelte +0 -14
- package/dist/typo/H4.svelte.d.ts +0 -26
- package/dist/typo/H5.svelte +0 -14
- package/dist/typo/H5.svelte.d.ts +0 -26
- package/dist/typo/H6.svelte +0 -14
- package/dist/typo/H6.svelte.d.ts +0 -26
- package/dist/typo/P.svelte +0 -34
- package/dist/typo/P.svelte.d.ts +0 -26
- package/dist/typo/index.d.ts +0 -9
- package/dist/typo/index.js +0 -9
- package/dist/utils/StringOrComponent.svelte +0 -14
- package/dist/utils/StringOrComponent.svelte.d.ts +0 -19
- package/dist/utils/StringOrSnippet.svelte +0 -11
- package/dist/utils/StringOrSnippet.svelte.d.ts +0 -19
- package/dist/utils/defaults.d.ts +0 -4
- package/dist/utils/hooks.server.d.ts +0 -2
- package/dist/utils/hooks.server.js +0 -16
- package/dist/utils/id.d.ts +0 -1
- package/dist/utils/id.js +0 -3
- package/dist/utils/index.d.ts +0 -9
- package/dist/utils/index.js +0 -6
- package/dist/utils/isSnippet.d.ts +0 -3
- package/dist/utils/isSnippet.js +0 -11
- /package/dist/{nav → components}/MenuTypes.js +0 -0
- /package/dist/{layout → components}/overlays.svelte.js +0 -0
- /package/dist/{utils → util}/attr.d.ts +0 -0
- /package/dist/{utils → util}/attr.js +0 -0
- /package/dist/{utils → util}/color.d.ts +0 -0
- /package/dist/{utils → util}/color.js +0 -0
- /package/dist/{utils → util}/dom.d.ts +0 -0
- /package/dist/{utils → util}/keyboard.svelte.d.ts +0 -0
- /package/dist/{utils → util}/keyboard.svelte.js +0 -0
- /package/dist/{utils/defaults.js → util/settings.js} +0 -0
- /package/dist/{utils → util}/transitions.d.ts +0 -0
- /package/dist/{utils → util}/transitions.js +0 -0
package/dist/types.d.ts
ADDED
@@ -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 =
|
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
|
+
}
|
package/package.json
CHANGED
@@ -1,102 +1,58 @@
|
|
1
1
|
{
|
2
2
|
"name": "lutra",
|
3
|
-
"version": "0.
|
3
|
+
"version": "0.1.4",
|
4
4
|
"scripts": {
|
5
|
-
"dev": "vite dev
|
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
|
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
|
-
"./
|
25
|
-
"
|
26
|
-
"
|
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
|
-
"
|
66
|
-
"svelte": "^4.0.0"
|
35
|
+
"svelte": "^5.0.0"
|
67
36
|
},
|
68
37
|
"devDependencies": {
|
69
|
-
"@
|
70
|
-
"@
|
71
|
-
"@sveltejs/
|
72
|
-
"@sveltejs/
|
73
|
-
"@
|
74
|
-
"
|
75
|
-
"
|
76
|
-
"
|
77
|
-
"
|
78
|
-
"
|
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.
|
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.
|
99
|
-
"
|
100
|
-
"zod": "^
|
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>
|