lutra 0.0.1
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 +29 -0
- package/dist/Data/Stat.svelte +89 -0
- package/dist/Data/Stat.svelte.d.ts +33 -0
- package/dist/DataTable/DataTable.svelte +36 -0
- package/dist/DataTable/DataTable.svelte.d.ts +19 -0
- package/dist/DataTable/DataTableColumn.svelte +20 -0
- package/dist/DataTable/DataTableColumn.svelte.d.ts +18 -0
- package/dist/DataTable/DataTableRow.svelte +28 -0
- package/dist/DataTable/DataTableRow.svelte.d.ts +18 -0
- package/dist/Display/Avatar.svelte +61 -0
- package/dist/Display/Avatar.svelte.d.ts +18 -0
- package/dist/Display/Badge.svelte +93 -0
- package/dist/Display/Badge.svelte.d.ts +30 -0
- package/dist/Display/Callout.svelte +105 -0
- package/dist/Display/Callout.svelte.d.ts +34 -0
- package/dist/Display/Code.svelte +195 -0
- package/dist/Display/Code.svelte.d.ts +29 -0
- package/dist/Display/ContextTip.svelte +23 -0
- package/dist/Display/ContextTip.svelte.d.ts +17 -0
- package/dist/Display/Details.svelte +49 -0
- package/dist/Display/Details.svelte.d.ts +26 -0
- package/dist/Display/Hero.svelte +50 -0
- package/dist/Display/Hero.svelte.d.ts +25 -0
- package/dist/Display/Icon.svelte +35 -0
- package/dist/Display/Icon.svelte.d.ts +18 -0
- package/dist/Display/IconButton.svelte +85 -0
- package/dist/Display/IconButton.svelte.d.ts +28 -0
- package/dist/Display/Indicator.svelte +352 -0
- package/dist/Display/Indicator.svelte.d.ts +22 -0
- package/dist/Display/Popup.svelte +111 -0
- package/dist/Display/Popup.svelte.d.ts +26 -0
- package/dist/Display/Tag.svelte +90 -0
- package/dist/Display/Tag.svelte.d.ts +31 -0
- package/dist/Display/Tooltip.svelte +96 -0
- package/dist/Display/Tooltip.svelte.d.ts +22 -0
- package/dist/Form/Button.svelte +34 -0
- package/dist/Form/Button.svelte.d.ts +24 -0
- package/dist/Form/FieldActions.svelte +25 -0
- package/dist/Form/FieldActions.svelte.d.ts +17 -0
- package/dist/Form/FieldContainer.svelte +31 -0
- package/dist/Form/FieldContainer.svelte.d.ts +18 -0
- package/dist/Form/FieldContent.svelte +78 -0
- package/dist/Form/FieldContent.svelte.d.ts +32 -0
- package/dist/Form/FieldSection.svelte +97 -0
- package/dist/Form/FieldSection.svelte.d.ts +23 -0
- package/dist/Form/Fieldset.svelte +63 -0
- package/dist/Form/Fieldset.svelte.d.ts +32 -0
- package/dist/Form/Form.svelte +19 -0
- package/dist/Form/Form.svelte.d.ts +18 -0
- package/dist/Form/Input.svelte +266 -0
- package/dist/Form/Input.svelte.d.ts +113 -0
- package/dist/Form/InputLength.svelte +32 -0
- package/dist/Form/InputLength.svelte.d.ts +19 -0
- package/dist/Form/Label.svelte +26 -0
- package/dist/Form/Label.svelte.d.ts +25 -0
- package/dist/Form/Select.svelte +24 -0
- package/dist/Form/Select.svelte.d.ts +28 -0
- package/dist/Form/form.d.ts +34 -0
- package/dist/Form/form.js +31 -0
- package/dist/Form/types.d.ts +4 -0
- package/dist/Form/types.js +1 -0
- package/dist/Grid/Column.svelte +11 -0
- package/dist/Grid/Column.svelte.d.ts +17 -0
- package/dist/Grid/Grid.svelte +19 -0
- package/dist/Grid/Grid.svelte.d.ts +18 -0
- package/dist/Grid/Row.svelte +44 -0
- package/dist/Grid/Row.svelte.d.ts +19 -0
- package/dist/Icons/Alert.svelte +3 -0
- package/dist/Icons/Alert.svelte.d.ts +23 -0
- package/dist/Icons/Copy.svelte +3 -0
- package/dist/Icons/Copy.svelte.d.ts +23 -0
- package/dist/Icons/Done.svelte +3 -0
- package/dist/Icons/Done.svelte.d.ts +23 -0
- package/dist/Icons/Error.svelte +3 -0
- package/dist/Icons/Error.svelte.d.ts +23 -0
- package/dist/Icons/Help.svelte +3 -0
- package/dist/Icons/Help.svelte.d.ts +23 -0
- package/dist/Icons/Hide.svelte +3 -0
- package/dist/Icons/Hide.svelte.d.ts +23 -0
- package/dist/Icons/Info.svelte +3 -0
- package/dist/Icons/Info.svelte.d.ts +23 -0
- package/dist/Icons/Link.svelte +3 -0
- package/dist/Icons/Link.svelte.d.ts +23 -0
- package/dist/Icons/Show.svelte +3 -0
- package/dist/Icons/Show.svelte.d.ts +23 -0
- package/dist/Icons/Success.svelte +3 -0
- package/dist/Icons/Success.svelte.d.ts +23 -0
- package/dist/Icons/Warning.svelte +3 -0
- package/dist/Icons/Warning.svelte.d.ts +23 -0
- package/dist/Layout/Layout.svelte +43 -0
- package/dist/Layout/Layout.svelte.d.ts +21 -0
- package/dist/Layout/LayoutFooter.svelte +21 -0
- package/dist/Layout/LayoutFooter.svelte.d.ts +17 -0
- package/dist/Layout/LayoutGrid.svelte +51 -0
- package/dist/Layout/LayoutGrid.svelte.d.ts +30 -0
- package/dist/Layout/LayoutHeader.svelte +94 -0
- package/dist/Layout/LayoutHeader.svelte.d.ts +38 -0
- package/dist/Layout/LayoutTypes.svelte.d.ts +15 -0
- package/dist/Layout/LayoutTypes.svelte.js +9 -0
- package/dist/Layout/PageContent.svelte +89 -0
- package/dist/Layout/PageContent.svelte.d.ts +23 -0
- package/dist/Layout/Theme.svelte +215 -0
- package/dist/Layout/Theme.svelte.d.ts +18 -0
- package/dist/Layout/UIContent.svelte +15 -0
- package/dist/Layout/UIContent.svelte.d.ts +17 -0
- package/dist/Navigation/Breadcrumb.svelte +82 -0
- package/dist/Navigation/Breadcrumb.svelte.d.ts +29 -0
- package/dist/Navigation/Menu.svelte +180 -0
- package/dist/Navigation/Menu.svelte.d.ts +18 -0
- package/dist/Navigation/MenuTypes.svelte.d.ts +37 -0
- package/dist/Navigation/MenuTypes.svelte.js +1 -0
- package/dist/Navigation/TabbedContent.svelte +43 -0
- package/dist/Navigation/TabbedContent.svelte.d.ts +22 -0
- package/dist/Navigation/Tabs.svelte +118 -0
- package/dist/Navigation/Tabs.svelte.d.ts +24 -0
- package/dist/Pages/LoginPage.svelte +32 -0
- package/dist/Pages/LoginPage.svelte.d.ts +14 -0
- package/dist/Typography/Clamp.svelte +25 -0
- package/dist/Typography/Clamp.svelte.d.ts +23 -0
- package/dist/Typography/H.svelte +51 -0
- package/dist/Typography/H.svelte.d.ts +25 -0
- package/dist/Typography/H1.svelte +14 -0
- package/dist/Typography/H1.svelte.d.ts +23 -0
- package/dist/Typography/H2.svelte +13 -0
- package/dist/Typography/H2.svelte.d.ts +23 -0
- package/dist/Typography/H3.svelte +13 -0
- package/dist/Typography/H3.svelte.d.ts +23 -0
- package/dist/Typography/H4.svelte +13 -0
- package/dist/Typography/H4.svelte.d.ts +23 -0
- package/dist/Typography/H5.svelte +13 -0
- package/dist/Typography/H5.svelte.d.ts +23 -0
- package/dist/Typography/H6.svelte +13 -0
- package/dist/Typography/H6.svelte.d.ts +23 -0
- package/dist/Typography/P.svelte +32 -0
- package/dist/Typography/P.svelte.d.ts +23 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/style.css +787 -0
- package/dist/utils/attr.d.ts +5 -0
- package/dist/utils/attr.js +21 -0
- package/dist/utils/color.d.ts +51 -0
- package/dist/utils/color.js +97 -0
- package/dist/utils/defaults.d.ts +4 -0
- package/dist/utils/defaults.js +1 -0
- package/dist/utils/hooks.server.d.ts +2 -0
- package/dist/utils/hooks.server.js +16 -0
- package/dist/utils/id.d.ts +1 -0
- package/dist/utils/id.js +3 -0
- package/dist/utils/isSnippet.d.ts +5 -0
- package/dist/utils/isSnippet.js +6 -0
- package/dist/utils/transitions.d.ts +29 -0
- package/dist/utils/transitions.js +66 -0
- package/package.json +58 -0
package/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# AUI
|
2
|
+
|
3
|
+
## Local development
|
4
|
+
|
5
|
+
During local development, the REPL compiler requests library files from the local `dist` folder when they are imported. To serve these, run the `local.js` script.
|
6
|
+
|
7
|
+
```bash
|
8
|
+
pnpm local
|
9
|
+
```
|
10
|
+
|
11
|
+
### Rewriting props
|
12
|
+
|
13
|
+
When you edit a component's description or props, you need to regenerate `componentProps.ts`.
|
14
|
+
|
15
|
+
`read_props.js` reads all the library files and generates props to display in the docs from the AST. Running
|
16
|
+
|
17
|
+
```bash
|
18
|
+
pnpm props
|
19
|
+
```
|
20
|
+
|
21
|
+
will read the props and write `componentProps.ts`.
|
22
|
+
|
23
|
+
Running:
|
24
|
+
|
25
|
+
```bash
|
26
|
+
pnpm package
|
27
|
+
```
|
28
|
+
|
29
|
+
will write the props and generate the library Svelte files.
|
@@ -0,0 +1,89 @@
|
|
1
|
+
<script>import { getStatusColorVar, isStatusColor } from "../utils/color.js";
|
2
|
+
import { isSnippet } from "../utils/isSnippet.js";
|
3
|
+
let {
|
4
|
+
title,
|
5
|
+
value,
|
6
|
+
prefix,
|
7
|
+
suffix,
|
8
|
+
color,
|
9
|
+
formatter
|
10
|
+
} = $props();
|
11
|
+
let colorVar = $derived(getStatusColorVar(color, "var(--bg-app)"));
|
12
|
+
let _value = $derived.by(() => {
|
13
|
+
if (typeof value === "number" && formatter?.constructor === Intl.NumberFormat) {
|
14
|
+
console.log("value is number and formatter is object");
|
15
|
+
return formatter.format(value);
|
16
|
+
} else if (value instanceof Date && formatter?.constructor === Intl.DateTimeFormat) {
|
17
|
+
console.log("value is date and formatter is object");
|
18
|
+
return formatter.format(value);
|
19
|
+
} else if (typeof value === "number") {
|
20
|
+
console.log("value is number");
|
21
|
+
return value.toLocaleString();
|
22
|
+
} else if (typeof value === "string") {
|
23
|
+
console.log("value is string");
|
24
|
+
return value;
|
25
|
+
} else if (value instanceof Date) {
|
26
|
+
console.log("value is date");
|
27
|
+
return value.toLocaleDateString();
|
28
|
+
}
|
29
|
+
if (typeof formatter === "function") {
|
30
|
+
console.log("formatter is function");
|
31
|
+
return formatter(value);
|
32
|
+
}
|
33
|
+
return value;
|
34
|
+
});
|
35
|
+
</script>
|
36
|
+
|
37
|
+
<section class="Stat" style="--bgColor: {colorVar};">
|
38
|
+
{#if title}
|
39
|
+
<header>{title}</header>
|
40
|
+
{/if}
|
41
|
+
<main>
|
42
|
+
{#if prefix}
|
43
|
+
{#if typeof prefix === "string"}
|
44
|
+
<span class="Fix Prefix">{prefix}</span>
|
45
|
+
{:else if isSnippet(prefix)}
|
46
|
+
{@render prefix()}
|
47
|
+
{:else}
|
48
|
+
<svlte:component this={prefix} />
|
49
|
+
{/if}
|
50
|
+
{/if}
|
51
|
+
{_value}
|
52
|
+
{#if suffix}
|
53
|
+
{#if typeof suffix === "string"}
|
54
|
+
<span class="Fix Suffix">{suffix}</span>
|
55
|
+
{:else if isSnippet(suffix)}
|
56
|
+
{@render suffix()}
|
57
|
+
{:else}
|
58
|
+
<svlte:component this={suffix} />
|
59
|
+
{/if}
|
60
|
+
{/if}
|
61
|
+
</main>
|
62
|
+
</section>
|
63
|
+
|
64
|
+
<style>
|
65
|
+
.Stat {
|
66
|
+
display: grid;
|
67
|
+
grid-template-rows: auto 1fr;
|
68
|
+
align-items: center;
|
69
|
+
gap: 0.75rem;
|
70
|
+
padding: 1rem;
|
71
|
+
margin-inline: -1rem;
|
72
|
+
margin-block: -1rem;
|
73
|
+
background-color: var(--bgColor);
|
74
|
+
}
|
75
|
+
header {
|
76
|
+
font-size: max(0.9em, 11px);
|
77
|
+
font-weight: 500;
|
78
|
+
opacity: 0.75;
|
79
|
+
color: var(--bgColor);
|
80
|
+
filter: url(#bwFilter);
|
81
|
+
}
|
82
|
+
main {
|
83
|
+
font-size: 1.5em;
|
84
|
+
opacity: 0.95;
|
85
|
+
font-weight: 700;
|
86
|
+
color: var(--bgColor);
|
87
|
+
filter: url(#bwFilter);
|
88
|
+
}
|
89
|
+
</style>
|
@@ -0,0 +1,33 @@
|
|
1
|
+
import { SvelteComponent } from "svelte";
|
2
|
+
import type { ComponentType } from "svelte";
|
3
|
+
import { type StatusColorOrString } from "../utils/color.js";
|
4
|
+
declare const __propDef: {
|
5
|
+
props: {
|
6
|
+
/** The title of the stat. */
|
7
|
+
title?: string | undefined;
|
8
|
+
/** The value to display. */
|
9
|
+
value?: string | number | Date | undefined;
|
10
|
+
/** The prefix to display before the value. Can be a string, a URL, a Snippet, or a Svelte component. */
|
11
|
+
prefix?: string | ((this: void) => typeof import("svelte").SnippetReturn & {
|
12
|
+
_: "functions passed to {@render ...} tags must use the `Snippet` type imported from \"svelte\"";
|
13
|
+
}) | ComponentType | undefined;
|
14
|
+
/** The suffix to display after the value. Can be a string, a URL, a Snippet, or a Svelte component. */
|
15
|
+
suffix?: string | ((this: void) => typeof import("svelte").SnippetReturn & {
|
16
|
+
_: "functions passed to {@render ...} tags must use the `Snippet` type imported from \"svelte\"";
|
17
|
+
}) | ComponentType | undefined;
|
18
|
+
/** The color of the stat. */
|
19
|
+
color?: StatusColorOrString | undefined;
|
20
|
+
/** A function to format the value. Can be an [Intl.NumberFormat object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat), an [Intl.DateTimeFormat object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat), or a function that takes in a value and returns a string. */
|
21
|
+
formatter?: Intl.NumberFormat | Intl.DateTimeFormat | ((value: number | string | Date | undefined) => string) | undefined;
|
22
|
+
};
|
23
|
+
events: {
|
24
|
+
[evt: string]: CustomEvent<any>;
|
25
|
+
};
|
26
|
+
slots: {};
|
27
|
+
};
|
28
|
+
export type StatProps = typeof __propDef.props;
|
29
|
+
export type StatEvents = typeof __propDef.events;
|
30
|
+
export type StatSlots = typeof __propDef.slots;
|
31
|
+
export default class Stat extends SvelteComponent<StatProps, StatEvents, StatSlots> {
|
32
|
+
}
|
33
|
+
export {};
|
@@ -0,0 +1,36 @@
|
|
1
|
+
<script>import UiContent from "../Layout/UIContent.svelte";
|
2
|
+
import { setContext } from "svelte";
|
3
|
+
let {
|
4
|
+
contained,
|
5
|
+
children
|
6
|
+
} = $props();
|
7
|
+
let columns = $state(0);
|
8
|
+
setContext("DataTableColumns", {
|
9
|
+
addColumn: () => {
|
10
|
+
console.log("addColumn");
|
11
|
+
columns++;
|
12
|
+
}
|
13
|
+
});
|
14
|
+
</script>
|
15
|
+
|
16
|
+
<UiContent>
|
17
|
+
<section class="DataTable" class:contained style="--dtc: {contained ? 1 : 0}; --dtcols: {columns};">
|
18
|
+
{@render children()}
|
19
|
+
</section>
|
20
|
+
</UiContent>
|
21
|
+
|
22
|
+
<style>
|
23
|
+
section {
|
24
|
+
container-type: inline-size;
|
25
|
+
display: grid;
|
26
|
+
grid-template-columns: repeat(calc(var(--dtcols) - 1), auto) 1fr;
|
27
|
+
border-radius: var(--border-radius);
|
28
|
+
width: 100%;
|
29
|
+
font-size: var(--font-size, 1em);
|
30
|
+
}
|
31
|
+
section.contained {
|
32
|
+
border: var(--border);
|
33
|
+
border-radius: var(--border-radius);
|
34
|
+
overflow: clip;
|
35
|
+
}
|
36
|
+
</style>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import { SvelteComponent } from "svelte";
|
2
|
+
import { type Snippet } from "svelte";
|
3
|
+
declare const __propDef: {
|
4
|
+
props: {
|
5
|
+
/** The number of columns to display the data in. */
|
6
|
+
contained?: boolean | undefined;
|
7
|
+
children: Snippet;
|
8
|
+
};
|
9
|
+
events: {
|
10
|
+
[evt: string]: CustomEvent<any>;
|
11
|
+
};
|
12
|
+
slots: {};
|
13
|
+
};
|
14
|
+
export type DataTableProps = typeof __propDef.props;
|
15
|
+
export type DataTableEvents = typeof __propDef.events;
|
16
|
+
export type DataTableSlots = typeof __propDef.slots;
|
17
|
+
export default class DataTable extends SvelteComponent<DataTableProps, DataTableEvents, DataTableSlots> {
|
18
|
+
}
|
19
|
+
export {};
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<script>import { getContext } from "svelte";
|
2
|
+
let {
|
3
|
+
children
|
4
|
+
} = $props();
|
5
|
+
const { header } = getContext("DataTableRow");
|
6
|
+
if (header) {
|
7
|
+
getContext("DataTableColumns").addColumn();
|
8
|
+
}
|
9
|
+
</script>
|
10
|
+
|
11
|
+
<div class="DataTableColumn">
|
12
|
+
{#if children}
|
13
|
+
{@render children()}
|
14
|
+
{/if}
|
15
|
+
</div>
|
16
|
+
|
17
|
+
<style>
|
18
|
+
.DataTableColumn {
|
19
|
+
}
|
20
|
+
</style>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
import { SvelteComponent } from "svelte";
|
2
|
+
declare const __propDef: {
|
3
|
+
props: {
|
4
|
+
children?: ((this: void) => typeof import("svelte").SnippetReturn & {
|
5
|
+
_: "functions passed to {@render ...} tags must use the `Snippet` type imported from \"svelte\"";
|
6
|
+
}) | undefined;
|
7
|
+
};
|
8
|
+
events: {
|
9
|
+
[evt: string]: CustomEvent<any>;
|
10
|
+
};
|
11
|
+
slots: {};
|
12
|
+
};
|
13
|
+
export type DataTableColumnProps = typeof __propDef.props;
|
14
|
+
export type DataTableColumnEvents = typeof __propDef.events;
|
15
|
+
export type DataTableColumnSlots = typeof __propDef.slots;
|
16
|
+
export default class DataTableColumn extends SvelteComponent<DataTableColumnProps, DataTableColumnEvents, DataTableColumnSlots> {
|
17
|
+
}
|
18
|
+
export {};
|
@@ -0,0 +1,28 @@
|
|
1
|
+
<script>import { setContext } from "svelte";
|
2
|
+
let {
|
3
|
+
children,
|
4
|
+
header = false
|
5
|
+
} = $props();
|
6
|
+
setContext("DataTableRow", { header });
|
7
|
+
</script>
|
8
|
+
|
9
|
+
<svelte:element this={header ? "header" : "section"} class="DataTableRow" class:header>
|
10
|
+
{@render children()}
|
11
|
+
</svelte:element>
|
12
|
+
|
13
|
+
<style>
|
14
|
+
.DataTableRow {
|
15
|
+
display: grid;
|
16
|
+
grid-column: 1 / calc(var(--dtcols) + 1);
|
17
|
+
grid-template-columns: subgrid;
|
18
|
+
gap: 1.5em;
|
19
|
+
align-items: center;
|
20
|
+
padding: 0.75em calc(1.5em * var(--dtc));
|
21
|
+
}
|
22
|
+
.DataTableRow.header {
|
23
|
+
background: color-mix(in srgb, var(--bg-subtle) calc(var(--dtc) * 100%), transparent);
|
24
|
+
}
|
25
|
+
section:not(:first-child) {
|
26
|
+
border-top: var(--border);
|
27
|
+
}
|
28
|
+
</style>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
import { SvelteComponent } from "svelte";
|
2
|
+
import { type Snippet } from "svelte";
|
3
|
+
declare const __propDef: {
|
4
|
+
props: {
|
5
|
+
header?: boolean | undefined;
|
6
|
+
children: Snippet;
|
7
|
+
};
|
8
|
+
events: {
|
9
|
+
[evt: string]: CustomEvent<any>;
|
10
|
+
};
|
11
|
+
slots: {};
|
12
|
+
};
|
13
|
+
export type DataTableRowProps = typeof __propDef.props;
|
14
|
+
export type DataTableRowEvents = typeof __propDef.events;
|
15
|
+
export type DataTableRowSlots = typeof __propDef.slots;
|
16
|
+
export default class DataTableRow extends SvelteComponent<DataTableRowProps, DataTableRowEvents, DataTableRowSlots> {
|
17
|
+
}
|
18
|
+
export {};
|
@@ -0,0 +1,61 @@
|
|
1
|
+
<script>import { hexRelativeLuminance, stringToColor } from "../utils/color.js";
|
2
|
+
const {
|
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>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
import { SvelteComponent } from "svelte";
|
2
|
+
declare const __propDef: {
|
3
|
+
props: {
|
4
|
+
src?: string | undefined;
|
5
|
+
name?: string | undefined;
|
6
|
+
shape?: "circle" | "square" | "rounded" | undefined;
|
7
|
+
};
|
8
|
+
events: {
|
9
|
+
[evt: string]: CustomEvent<any>;
|
10
|
+
};
|
11
|
+
slots: {};
|
12
|
+
};
|
13
|
+
export type AvatarProps = typeof __propDef.props;
|
14
|
+
export type AvatarEvents = typeof __propDef.events;
|
15
|
+
export type AvatarSlots = typeof __propDef.slots;
|
16
|
+
export default class Avatar extends SvelteComponent<AvatarProps, AvatarEvents, AvatarSlots> {
|
17
|
+
}
|
18
|
+
export {};
|
@@ -0,0 +1,93 @@
|
|
1
|
+
<script>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)
|
14
|
+
return 0;
|
15
|
+
if (max && count > max)
|
16
|
+
return max.toString().length + 1;
|
17
|
+
return count.toString().length;
|
18
|
+
});
|
19
|
+
</script>
|
20
|
+
|
21
|
+
<div class="BadgeContainer">
|
22
|
+
<div class="BadgeContent">
|
23
|
+
{#if children}
|
24
|
+
{@render children()}
|
25
|
+
{/if}
|
26
|
+
</div>
|
27
|
+
<span class="Badge" class:outline class:glow class:empty={count === undefined} bind:this={el} style="--charCount: {charCount}ch; --bgColor: {!isSet ? color : 'var(--status-'+color+')'};">
|
28
|
+
{#if count && max}
|
29
|
+
<em>
|
30
|
+
{count > max ? `${max}+` : count}
|
31
|
+
</em>
|
32
|
+
{/if}
|
33
|
+
</span>
|
34
|
+
</div>
|
35
|
+
|
36
|
+
|
37
|
+
<style>
|
38
|
+
.BadgeContainer {
|
39
|
+
position: relative;
|
40
|
+
display: inline-grid;
|
41
|
+
grid-template-columns: fit-content;
|
42
|
+
grid-template-areas: "content";
|
43
|
+
text-rendering: geometricPrecision;
|
44
|
+
}
|
45
|
+
.BadgeContent {
|
46
|
+
grid-area: content;
|
47
|
+
}
|
48
|
+
.Badge {
|
49
|
+
--internalSize: max(calc(var(--size, 0.75rem)), 14px);
|
50
|
+
display: grid;
|
51
|
+
place-items: center;
|
52
|
+
align-items: center;
|
53
|
+
justify-content: center;
|
54
|
+
position: absolute;
|
55
|
+
top: calc(1px + var(--top, 0%));
|
56
|
+
right: var(--right, 0%);
|
57
|
+
transform: translate(0.55rem, -50%);
|
58
|
+
background-color: var(--bgColor);
|
59
|
+
padding: 3px 5px 2px 5px;
|
60
|
+
border-radius: 9999px;
|
61
|
+
--h: max(calc(var(--internalSize) * 0.9), 9px);
|
62
|
+
font-size: var(--h);
|
63
|
+
line-height: var(--h);
|
64
|
+
z-index: 100;
|
65
|
+
font-weight: 600;
|
66
|
+
grid-area: content;
|
67
|
+
}
|
68
|
+
.Badge.outline {
|
69
|
+
outline: min(calc(var(--size, 0.75rem) * 0.25), 2px) solid var(--outline-color, var(--bg-app));
|
70
|
+
}
|
71
|
+
.Badge.empty {
|
72
|
+
width: max(0.5rem, 8px);
|
73
|
+
height: max(0.5rem, 8px);
|
74
|
+
min-width: auto;
|
75
|
+
aspect-ratio: 1/1;
|
76
|
+
transform: translate(50%, -50%);
|
77
|
+
padding: 0;
|
78
|
+
}
|
79
|
+
.Badge.glow {
|
80
|
+
filter: drop-shadow(0 0 0.25rem color-mix(in srgb, var(--bgColor) 30%, transparent 70%));
|
81
|
+
}
|
82
|
+
em {
|
83
|
+
opacity: 0.99;
|
84
|
+
font-style: normal;
|
85
|
+
color: var(--bgColor);
|
86
|
+
filter: invert(1) grayscale(1) brightness(1.3) contrast(9000%);
|
87
|
+
mix-blend-mode: luminosity;
|
88
|
+
left: 50%;
|
89
|
+
position: relative;
|
90
|
+
display: block;
|
91
|
+
transform: translateX(-50%);
|
92
|
+
}
|
93
|
+
</style>
|
@@ -0,0 +1,30 @@
|
|
1
|
+
import { SvelteComponent } from "svelte";
|
2
|
+
import type { StatusColorOrString } from "../utils/color.js";
|
3
|
+
declare const __propDef: {
|
4
|
+
props: {
|
5
|
+
/** Count to display in the badge. */
|
6
|
+
count?: number | undefined;
|
7
|
+
/** The maximum count to display. */
|
8
|
+
max?: number | undefined;
|
9
|
+
/** The color of the tag. */
|
10
|
+
color?: StatusColorOrString | undefined;
|
11
|
+
/** Whether to add a glow to the badge. */
|
12
|
+
glow?: boolean | undefined;
|
13
|
+
/** Whether to add an outline to the badge. */
|
14
|
+
outline?: boolean | undefined;
|
15
|
+
/** The content to display inside the badge. */
|
16
|
+
children?: ((this: void) => typeof import("svelte").SnippetReturn & {
|
17
|
+
_: "functions passed to {@render ...} tags must use the `Snippet` type imported from \"svelte\"";
|
18
|
+
}) | undefined;
|
19
|
+
};
|
20
|
+
events: {
|
21
|
+
[evt: string]: CustomEvent<any>;
|
22
|
+
};
|
23
|
+
slots: {};
|
24
|
+
};
|
25
|
+
export type BadgeProps = typeof __propDef.props;
|
26
|
+
export type BadgeEvents = typeof __propDef.events;
|
27
|
+
export type BadgeSlots = typeof __propDef.slots;
|
28
|
+
export default class Badge extends SvelteComponent<BadgeProps, BadgeEvents, BadgeSlots> {
|
29
|
+
}
|
30
|
+
export {};
|
@@ -0,0 +1,105 @@
|
|
1
|
+
<script>import Icon from "./Icon.svelte";
|
2
|
+
import Alert from "../Icons/Alert.svelte";
|
3
|
+
import Info from "../Icons/Info.svelte";
|
4
|
+
import Success from "../Icons/Success.svelte";
|
5
|
+
import Warning from "../Icons/Warning.svelte";
|
6
|
+
import Error from "../Icons/Error.svelte";
|
7
|
+
import PageContent from "../Layout/PageContent.svelte";
|
8
|
+
import Tooltip from "./Tooltip.svelte";
|
9
|
+
let {
|
10
|
+
icon,
|
11
|
+
type,
|
12
|
+
contained,
|
13
|
+
rounded,
|
14
|
+
dismissable
|
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>
|
41
|
+
{#if icon}
|
42
|
+
<Icon {icon} width="1.5rem" />
|
43
|
+
{/if}
|
44
|
+
<div class="CalloutText">
|
45
|
+
<PageContent>
|
46
|
+
<slot />
|
47
|
+
</PageContent>
|
48
|
+
</div>
|
49
|
+
{#if dismissable}
|
50
|
+
<div class="Dismiss">
|
51
|
+
<Tooltip tip="Dismiss">
|
52
|
+
<button class="CalloutDismiss" aria-label="Dismiss callout">
|
53
|
+
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
54
|
+
<path d="M1 1L15 15" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
55
|
+
<path d="M1 15L15 1" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
56
|
+
</svg>
|
57
|
+
</button>
|
58
|
+
</Tooltip>
|
59
|
+
</div>
|
60
|
+
{/if}
|
61
|
+
</div>
|
62
|
+
|
63
|
+
<style>
|
64
|
+
.Callout {
|
65
|
+
background: var(--bg, var(--bg-subtle));
|
66
|
+
padding: var(--padding, 1rem);
|
67
|
+
display: grid;
|
68
|
+
gap: var(--gap, 1rem);
|
69
|
+
align-items: var(--align-items, start);
|
70
|
+
}
|
71
|
+
.Callout.contained {
|
72
|
+
border: var(--border);
|
73
|
+
}
|
74
|
+
.Callout.rounded {
|
75
|
+
border-radius: var(--border-radius);
|
76
|
+
}
|
77
|
+
.Callout.hasIcon {
|
78
|
+
grid-template-columns: auto 1fr;
|
79
|
+
}
|
80
|
+
.Callout.dismissable {
|
81
|
+
grid-template-columns: 1fr auto;
|
82
|
+
}
|
83
|
+
.Callout.dismissable.hasIcon {
|
84
|
+
grid-template-columns: auto 1fr auto;
|
85
|
+
}
|
86
|
+
.CalloutText {
|
87
|
+
font-size: var(--font-size, 1em);
|
88
|
+
line-height: 1.5;
|
89
|
+
}
|
90
|
+
.Callout.info {
|
91
|
+
--bg: var(--status-info);
|
92
|
+
}
|
93
|
+
.Callout.ok {
|
94
|
+
--bg: var(--status-ok);
|
95
|
+
}
|
96
|
+
.Dismiss {
|
97
|
+
margin: -0.75rem;
|
98
|
+
}
|
99
|
+
.CalloutDismiss {
|
100
|
+
background: transparent;
|
101
|
+
border: none;
|
102
|
+
padding: 0.75rem;
|
103
|
+
cursor: pointer;
|
104
|
+
}
|
105
|
+
</style>
|
@@ -0,0 +1,34 @@
|
|
1
|
+
import { SvelteComponent } from "svelte";
|
2
|
+
import type { ComponentType } from "svelte";
|
3
|
+
declare const __propDef: {
|
4
|
+
props: {
|
5
|
+
/** The icon to display. If not specified, it will default to the type. */
|
6
|
+
icon?: string | ((this: void) => typeof import("svelte").SnippetReturn & {
|
7
|
+
_: "functions passed to {@render ...} tags must use the `Snippet` type imported from \"svelte\"";
|
8
|
+
}) | ComponentType | undefined;
|
9
|
+
/** The type of callout. If not specified and no icon is provided, no icon will be displayed. */
|
10
|
+
type?: "ok" | "alert" | "warn" | "info" | "task" | undefined;
|
11
|
+
/** Whether to contain the element in a box. */
|
12
|
+
contained?: boolean | undefined;
|
13
|
+
/** Whether to round the corners of the element. */
|
14
|
+
rounded?: boolean | undefined;
|
15
|
+
/** Whether the callout is dismissable. */
|
16
|
+
dismissable?: boolean | undefined;
|
17
|
+
} & {
|
18
|
+
children?: ((this: void) => typeof import("svelte").SnippetReturn & {
|
19
|
+
_: "functions passed to {@render ...} tags must use the `Snippet` type imported from \"svelte\"";
|
20
|
+
}) | undefined;
|
21
|
+
};
|
22
|
+
events: {
|
23
|
+
[evt: string]: CustomEvent<any>;
|
24
|
+
};
|
25
|
+
slots: {
|
26
|
+
default: {};
|
27
|
+
};
|
28
|
+
};
|
29
|
+
export type CalloutProps = typeof __propDef.props;
|
30
|
+
export type CalloutEvents = typeof __propDef.events;
|
31
|
+
export type CalloutSlots = typeof __propDef.slots;
|
32
|
+
export default class Callout extends SvelteComponent<CalloutProps, CalloutEvents, CalloutSlots> {
|
33
|
+
}
|
34
|
+
export {};
|