@xtyle/svelte 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -0
- package/dist/Accordion.svelte +50 -0
- package/dist/Accordion.svelte.d.ts +22 -0
- package/dist/Alert.svelte +55 -0
- package/dist/Alert.svelte.d.ts +25 -0
- package/dist/AppShell.svelte +69 -0
- package/dist/AppShell.svelte.d.ts +27 -0
- package/dist/Avatar.svelte +53 -0
- package/dist/Avatar.svelte.d.ts +23 -0
- package/dist/AvatarGroup.svelte +31 -0
- package/dist/AvatarGroup.svelte.d.ts +18 -0
- package/dist/Badge.svelte +56 -0
- package/dist/Badge.svelte.d.ts +21 -0
- package/dist/Bar.svelte +69 -0
- package/dist/Bar.svelte.d.ts +30 -0
- package/dist/Breadcrumb.svelte +33 -0
- package/dist/Breadcrumb.svelte.d.ts +27 -0
- package/dist/Button.svelte +74 -0
- package/dist/Button.svelte.d.ts +28 -0
- package/dist/Card.svelte +26 -0
- package/dist/Card.svelte.d.ts +18 -0
- package/dist/CardLink.svelte +45 -0
- package/dist/CardLink.svelte.d.ts +18 -0
- package/dist/Carousel.svelte +39 -0
- package/dist/Carousel.svelte.d.ts +16 -0
- package/dist/Checkbox.svelte +59 -0
- package/dist/Checkbox.svelte.d.ts +21 -0
- package/dist/CheckboxGroup.svelte +47 -0
- package/dist/CheckboxGroup.svelte.d.ts +20 -0
- package/dist/Cluster.svelte +24 -0
- package/dist/Cluster.svelte.d.ts +17 -0
- package/dist/Code.svelte +29 -0
- package/dist/Code.svelte.d.ts +23 -0
- package/dist/ColorPicker.svelte +82 -0
- package/dist/ColorPicker.svelte.d.ts +26 -0
- package/dist/Dialog.svelte +60 -0
- package/dist/Dialog.svelte.d.ts +22 -0
- package/dist/Dock.svelte +57 -0
- package/dist/Dock.svelte.d.ts +23 -0
- package/dist/DockZone.svelte +74 -0
- package/dist/DockZone.svelte.d.ts +33 -0
- package/dist/Eyebrow.svelte +24 -0
- package/dist/Eyebrow.svelte.d.ts +17 -0
- package/dist/Field.svelte +92 -0
- package/dist/Field.svelte.d.ts +34 -0
- package/dist/FormGroup.svelte +43 -0
- package/dist/FormGroup.svelte.d.ts +18 -0
- package/dist/Grid.svelte +24 -0
- package/dist/Grid.svelte.d.ts +17 -0
- package/dist/Heading.svelte +20 -0
- package/dist/Heading.svelte.d.ts +14 -0
- package/dist/Heatmap.svelte +100 -0
- package/dist/Heatmap.svelte.d.ts +41 -0
- package/dist/Hero.svelte +20 -0
- package/dist/Hero.svelte.d.ts +13 -0
- package/dist/Icon.svelte +20 -0
- package/dist/Icon.svelte.d.ts +16 -0
- package/dist/Image.svelte +44 -0
- package/dist/Image.svelte.d.ts +19 -0
- package/dist/Kbd.svelte +21 -0
- package/dist/Kbd.svelte.d.ts +14 -0
- package/dist/Link.svelte +34 -0
- package/dist/Link.svelte.d.ts +18 -0
- package/dist/Menu.svelte +34 -0
- package/dist/Menu.svelte.d.ts +13 -0
- package/dist/NumberInput.svelte +76 -0
- package/dist/NumberInput.svelte.d.ts +25 -0
- package/dist/Pagination.svelte +56 -0
- package/dist/Pagination.svelte.d.ts +22 -0
- package/dist/Panel.svelte +52 -0
- package/dist/Panel.svelte.d.ts +19 -0
- package/dist/Parallax.svelte +19 -0
- package/dist/Parallax.svelte.d.ts +13 -0
- package/dist/Pie.svelte +48 -0
- package/dist/Pie.svelte.d.ts +17 -0
- package/dist/Progress.svelte +68 -0
- package/dist/Progress.svelte.d.ts +30 -0
- package/dist/Radio.svelte +72 -0
- package/dist/Radio.svelte.d.ts +24 -0
- package/dist/RadioGroup.svelte +39 -0
- package/dist/RadioGroup.svelte.d.ts +16 -0
- package/dist/Section.svelte +37 -0
- package/dist/Section.svelte.d.ts +21 -0
- package/dist/Segment.svelte +23 -0
- package/dist/Segment.svelte.d.ts +14 -0
- package/dist/Segmented.svelte +64 -0
- package/dist/Segmented.svelte.d.ts +28 -0
- package/dist/Select.svelte +57 -0
- package/dist/Select.svelte.d.ts +21 -0
- package/dist/Separator.svelte +23 -0
- package/dist/Separator.svelte.d.ts +16 -0
- package/dist/Skeleton.svelte +19 -0
- package/dist/Skeleton.svelte.d.ts +14 -0
- package/dist/Slider.svelte +82 -0
- package/dist/Slider.svelte.d.ts +24 -0
- package/dist/Sparkline.svelte +62 -0
- package/dist/Sparkline.svelte.d.ts +25 -0
- package/dist/Spinner.svelte +16 -0
- package/dist/Spinner.svelte.d.ts +12 -0
- package/dist/Splitter.svelte +85 -0
- package/dist/Splitter.svelte.d.ts +30 -0
- package/dist/Stack.svelte +23 -0
- package/dist/Stack.svelte.d.ts +16 -0
- package/dist/Stat.svelte +41 -0
- package/dist/Stat.svelte.d.ts +23 -0
- package/dist/Statusbar.svelte +50 -0
- package/dist/Statusbar.svelte.d.ts +20 -0
- package/dist/Swatch.svelte +48 -0
- package/dist/Swatch.svelte.d.ts +22 -0
- package/dist/Switch.svelte +69 -0
- package/dist/Switch.svelte.d.ts +24 -0
- package/dist/Table.svelte +39 -0
- package/dist/Table.svelte.d.ts +17 -0
- package/dist/Tabs.svelte +84 -0
- package/dist/Tabs.svelte.d.ts +28 -0
- package/dist/Text.svelte +38 -0
- package/dist/Text.svelte.d.ts +22 -0
- package/dist/Textarea.svelte +74 -0
- package/dist/Textarea.svelte.d.ts +25 -0
- package/dist/Toast.svelte +55 -0
- package/dist/Toast.svelte.d.ts +25 -0
- package/dist/Toc.svelte +22 -0
- package/dist/Toc.svelte.d.ts +15 -0
- package/dist/Toolbar.svelte +49 -0
- package/dist/Toolbar.svelte.d.ts +20 -0
- package/dist/Tooltip.svelte +28 -0
- package/dist/Tooltip.svelte.d.ts +19 -0
- package/dist/Tree.svelte +51 -0
- package/dist/Tree.svelte.d.ts +24 -0
- package/dist/elements.d.ts +65 -0
- package/dist/index.d.ts +65 -0
- package/dist/index.js +65 -0
- package/dist/register.d.ts +2 -0
- package/dist/register.js +2 -0
- package/package.json +41 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import "./register.js";
|
|
2
|
+
import type { Snippet } from "svelte";
|
|
3
|
+
import type { Size } from "@xtyle/core";
|
|
4
|
+
interface Props {
|
|
5
|
+
open?: boolean;
|
|
6
|
+
size?: Size;
|
|
7
|
+
heading?: string;
|
|
8
|
+
label?: string;
|
|
9
|
+
labelledby?: string;
|
|
10
|
+
closeLabel?: string;
|
|
11
|
+
noCloseButton?: boolean;
|
|
12
|
+
onclose?: (event: Event) => void;
|
|
13
|
+
oncancel?: (event: Event) => void;
|
|
14
|
+
header?: Snippet;
|
|
15
|
+
footer?: Snippet;
|
|
16
|
+
children?: Snippet;
|
|
17
|
+
/** Any other attribute (`title`, `id`, `data-*`, `aria-*`, …) passes through to the element. */
|
|
18
|
+
[key: string]: unknown;
|
|
19
|
+
}
|
|
20
|
+
declare const Dialog: import("svelte").Component<Props, {}, "open">;
|
|
21
|
+
type Dialog = ReturnType<typeof Dialog>;
|
|
22
|
+
export default Dialog;
|
package/dist/Dock.svelte
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import "./register.js";
|
|
3
|
+
import type { Snippet } from "svelte";
|
|
4
|
+
import type { Size, FullTone as Tone } from "@xtyle/core";
|
|
5
|
+
|
|
6
|
+
type DockSide = "left" | "right";
|
|
7
|
+
|
|
8
|
+
interface Props {
|
|
9
|
+
side?: DockSide;
|
|
10
|
+
size?: Size;
|
|
11
|
+
tone?: Tone;
|
|
12
|
+
reverseEdge?: boolean;
|
|
13
|
+
edgeWidth?: "thin" | "thick" | "bold";
|
|
14
|
+
nav?: boolean;
|
|
15
|
+
label?: string;
|
|
16
|
+
ariaLabel?: string;
|
|
17
|
+
hideHeader?: boolean;
|
|
18
|
+
header?: Snippet;
|
|
19
|
+
footer?: Snippet;
|
|
20
|
+
children?: Snippet;
|
|
21
|
+
/** Any other attribute (`title`, `id`, `data-*`, `aria-*`, …) passes through to the element. */
|
|
22
|
+
[key: string]: unknown;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
let {
|
|
26
|
+
side = "left",
|
|
27
|
+
size = "md",
|
|
28
|
+
tone,
|
|
29
|
+
reverseEdge = false,
|
|
30
|
+
edgeWidth,
|
|
31
|
+
nav = false,
|
|
32
|
+
label,
|
|
33
|
+
ariaLabel,
|
|
34
|
+
hideHeader = false,
|
|
35
|
+
header,
|
|
36
|
+
footer,
|
|
37
|
+
children,
|
|
38
|
+
...rest
|
|
39
|
+
}: Props = $props();
|
|
40
|
+
</script>
|
|
41
|
+
|
|
42
|
+
<xtyle-dock
|
|
43
|
+
{...rest}
|
|
44
|
+
{side}
|
|
45
|
+
{size}
|
|
46
|
+
{tone}
|
|
47
|
+
reverse-edge={reverseEdge || undefined}
|
|
48
|
+
edge-width={edgeWidth}
|
|
49
|
+
nav={nav || undefined}
|
|
50
|
+
{label}
|
|
51
|
+
aria-label={ariaLabel ?? (rest["aria-label"] as string | undefined)}
|
|
52
|
+
hide-header={hideHeader || undefined}
|
|
53
|
+
>
|
|
54
|
+
{#if header}<span slot="header">{@render header()}</span>{/if}
|
|
55
|
+
{@render children?.()}
|
|
56
|
+
{#if footer}<span slot="footer">{@render footer()}</span>{/if}
|
|
57
|
+
</xtyle-dock>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import "./register.js";
|
|
2
|
+
import type { Snippet } from "svelte";
|
|
3
|
+
import type { Size, FullTone as Tone } from "@xtyle/core";
|
|
4
|
+
type DockSide = "left" | "right";
|
|
5
|
+
interface Props {
|
|
6
|
+
side?: DockSide;
|
|
7
|
+
size?: Size;
|
|
8
|
+
tone?: Tone;
|
|
9
|
+
reverseEdge?: boolean;
|
|
10
|
+
edgeWidth?: "thin" | "thick" | "bold";
|
|
11
|
+
nav?: boolean;
|
|
12
|
+
label?: string;
|
|
13
|
+
ariaLabel?: string;
|
|
14
|
+
hideHeader?: boolean;
|
|
15
|
+
header?: Snippet;
|
|
16
|
+
footer?: Snippet;
|
|
17
|
+
children?: Snippet;
|
|
18
|
+
/** Any other attribute (`title`, `id`, `data-*`, `aria-*`, …) passes through to the element. */
|
|
19
|
+
[key: string]: unknown;
|
|
20
|
+
}
|
|
21
|
+
declare const Dock: import("svelte").Component<Props, {}, "">;
|
|
22
|
+
type Dock = ReturnType<typeof Dock>;
|
|
23
|
+
export default Dock;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import "./register.js";
|
|
3
|
+
import type { Snippet } from "svelte";
|
|
4
|
+
import type { DockNode, DockLayout, FloatRect } from "@xtyle/core/elements";
|
|
5
|
+
|
|
6
|
+
type LayoutChange = CustomEvent<{ layout: DockLayout | null }>;
|
|
7
|
+
type PanelClose = CustomEvent<{ panelId: string }>;
|
|
8
|
+
type PanelAction = CustomEvent<{ panelId: string; actionId: string }>;
|
|
9
|
+
|
|
10
|
+
interface Props {
|
|
11
|
+
/** Restore a persisted layout (a `DockLayout` with docks + floats, or a bare `DockNode` tree).
|
|
12
|
+
* Read the current one back from `onLayoutChange`. */
|
|
13
|
+
layout?: DockNode | DockLayout | null;
|
|
14
|
+
onLayoutChange?: (event: LayoutChange) => void;
|
|
15
|
+
/** A panel's close button was pressed. Cancelable: call `event.preventDefault()` to keep the panel. */
|
|
16
|
+
onPanelClose?: (event: PanelClose) => void;
|
|
17
|
+
/** A panel header button or menu row was activated (`detail: { panelId, actionId }`). */
|
|
18
|
+
onPanelAction?: (event: PanelAction) => void;
|
|
19
|
+
children?: Snippet;
|
|
20
|
+
/** Any other attribute (`style`, `id`, `data-*`, `aria-*`, …) passes through to the element. */
|
|
21
|
+
[key: string]: unknown;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
let { layout, onLayoutChange, onPanelClose, onPanelAction, children, ...rest }: Props = $props();
|
|
25
|
+
|
|
26
|
+
let host:
|
|
27
|
+
| (HTMLElement & {
|
|
28
|
+
layout: DockNode | DockLayout | null;
|
|
29
|
+
closePanel(panelId: string): void;
|
|
30
|
+
floatPanel(panelId: string, rect?: FloatRect): void;
|
|
31
|
+
dockFloating(panelId: string, target?: string, region?: string): void;
|
|
32
|
+
})
|
|
33
|
+
| undefined = $state();
|
|
34
|
+
|
|
35
|
+
/** Close a panel through the element's own path (cancelable `panel-close`, then removal). Exposed so
|
|
36
|
+
* a `bind:this` consumer can wire a `data-menu` "close" row's `panel-action` back to a real close. */
|
|
37
|
+
export function closePanel(panelId: string): void {
|
|
38
|
+
host?.closePanel(panelId);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Tear a docked panel out into a floating window (a `data-menu` "float" row wires here through `bind:this`). */
|
|
42
|
+
export function floatPanel(panelId: string, rect?: FloatRect): void {
|
|
43
|
+
host?.floatPanel(panelId, rect);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Re-dock a floating panel back into the tree (defaults to the root zone as a tab). */
|
|
47
|
+
export function dockFloating(panelId: string, target?: string, region?: string): void {
|
|
48
|
+
host?.dockFloating(panelId, target, region);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// `layout` is a tree object, not an attribute, so set it as a property on the live element.
|
|
52
|
+
$effect(() => {
|
|
53
|
+
if (host && layout !== undefined) host.layout = layout;
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// The callback is read through a getter so swapping the prop re-registers the listener.
|
|
57
|
+
function forward<E extends Event>(type: string, callback: () => ((event: E) => void) | undefined): void {
|
|
58
|
+
$effect(() => {
|
|
59
|
+
const cb = callback();
|
|
60
|
+
if (!host || !cb) return;
|
|
61
|
+
const handler = (event: Event) => cb(event as E);
|
|
62
|
+
host.addEventListener(type, handler);
|
|
63
|
+
return () => host?.removeEventListener(type, handler);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
forward<LayoutChange>("layout-change", () => onLayoutChange);
|
|
68
|
+
forward<PanelClose>("panel-close", () => onPanelClose);
|
|
69
|
+
forward<PanelAction>("panel-action", () => onPanelAction);
|
|
70
|
+
</script>
|
|
71
|
+
|
|
72
|
+
<xtyle-dock-zone {...rest} bind:this={host}>
|
|
73
|
+
{@render children?.()}
|
|
74
|
+
</xtyle-dock-zone>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import "./register.js";
|
|
2
|
+
import type { Snippet } from "svelte";
|
|
3
|
+
import type { DockNode, DockLayout, FloatRect } from "@xtyle/core/elements";
|
|
4
|
+
type LayoutChange = CustomEvent<{
|
|
5
|
+
layout: DockLayout | null;
|
|
6
|
+
}>;
|
|
7
|
+
type PanelClose = CustomEvent<{
|
|
8
|
+
panelId: string;
|
|
9
|
+
}>;
|
|
10
|
+
type PanelAction = CustomEvent<{
|
|
11
|
+
panelId: string;
|
|
12
|
+
actionId: string;
|
|
13
|
+
}>;
|
|
14
|
+
interface Props {
|
|
15
|
+
/** Restore a persisted layout (a `DockLayout` with docks + floats, or a bare `DockNode` tree).
|
|
16
|
+
* Read the current one back from `onLayoutChange`. */
|
|
17
|
+
layout?: DockNode | DockLayout | null;
|
|
18
|
+
onLayoutChange?: (event: LayoutChange) => void;
|
|
19
|
+
/** A panel's close button was pressed. Cancelable: call `event.preventDefault()` to keep the panel. */
|
|
20
|
+
onPanelClose?: (event: PanelClose) => void;
|
|
21
|
+
/** A panel header button or menu row was activated (`detail: { panelId, actionId }`). */
|
|
22
|
+
onPanelAction?: (event: PanelAction) => void;
|
|
23
|
+
children?: Snippet;
|
|
24
|
+
/** Any other attribute (`style`, `id`, `data-*`, `aria-*`, …) passes through to the element. */
|
|
25
|
+
[key: string]: unknown;
|
|
26
|
+
}
|
|
27
|
+
declare const DockZone: import("svelte").Component<Props, {
|
|
28
|
+
closePanel: (panelId: string) => void;
|
|
29
|
+
floatPanel: (panelId: string, rect?: FloatRect) => void;
|
|
30
|
+
dockFloating: (panelId: string, target?: string, region?: string) => void;
|
|
31
|
+
}, "">;
|
|
32
|
+
type DockZone = ReturnType<typeof DockZone>;
|
|
33
|
+
export default DockZone;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import "./register.js";
|
|
3
|
+
import type { Snippet } from "svelte";
|
|
4
|
+
import type { FullTone } from "@xtyle/core";
|
|
5
|
+
|
|
6
|
+
type EyebrowTag = "p" | "span" | "div";
|
|
7
|
+
type EyebrowTone = "muted" | "subtle" | FullTone;
|
|
8
|
+
type EyebrowTracking = "normal" | "wide";
|
|
9
|
+
|
|
10
|
+
interface Props {
|
|
11
|
+
as?: EyebrowTag;
|
|
12
|
+
tone?: EyebrowTone;
|
|
13
|
+
tracking?: EyebrowTracking;
|
|
14
|
+
children?: Snippet;
|
|
15
|
+
/** Any other attribute (`title`, `id`, `data-*`, `aria-*`, …) passes through to the element. */
|
|
16
|
+
[key: string]: unknown;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let { as = "p", tone = "accent", tracking = "normal", children, ...rest }: Props = $props();
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
<xtyle-eyebrow {...rest} {as} {tone} {tracking}>
|
|
23
|
+
{@render children?.()}
|
|
24
|
+
</xtyle-eyebrow>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import "./register.js";
|
|
2
|
+
import type { Snippet } from "svelte";
|
|
3
|
+
import type { FullTone } from "@xtyle/core";
|
|
4
|
+
type EyebrowTag = "p" | "span" | "div";
|
|
5
|
+
type EyebrowTone = "muted" | "subtle" | FullTone;
|
|
6
|
+
type EyebrowTracking = "normal" | "wide";
|
|
7
|
+
interface Props {
|
|
8
|
+
as?: EyebrowTag;
|
|
9
|
+
tone?: EyebrowTone;
|
|
10
|
+
tracking?: EyebrowTracking;
|
|
11
|
+
children?: Snippet;
|
|
12
|
+
/** Any other attribute (`title`, `id`, `data-*`, `aria-*`, …) passes through to the element. */
|
|
13
|
+
[key: string]: unknown;
|
|
14
|
+
}
|
|
15
|
+
declare const Eyebrow: import("svelte").Component<Props, {}, "">;
|
|
16
|
+
type Eyebrow = ReturnType<typeof Eyebrow>;
|
|
17
|
+
export default Eyebrow;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import "./register.js";
|
|
3
|
+
import type { Snippet } from "svelte";
|
|
4
|
+
import type { Size } from "@xtyle/core";
|
|
5
|
+
|
|
6
|
+
type FieldOption = { value: string; label?: string };
|
|
7
|
+
|
|
8
|
+
interface Props {
|
|
9
|
+
label?: string;
|
|
10
|
+
name?: string;
|
|
11
|
+
placeholder?: string;
|
|
12
|
+
value?: string;
|
|
13
|
+
type?: string;
|
|
14
|
+
size?: Size;
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
readonly?: boolean;
|
|
17
|
+
invalid?: boolean;
|
|
18
|
+
required?: boolean;
|
|
19
|
+
clearable?: boolean;
|
|
20
|
+
description?: string;
|
|
21
|
+
error?: string;
|
|
22
|
+
ariaLabel?: string;
|
|
23
|
+
options?: ReadonlyArray<string | FieldOption>;
|
|
24
|
+
mono?: boolean;
|
|
25
|
+
oninput?: (event: Event) => void;
|
|
26
|
+
onchange?: (event: Event) => void;
|
|
27
|
+
prefix?: Snippet;
|
|
28
|
+
suffix?: Snippet;
|
|
29
|
+
/** Any other attribute (`title`, `id`, `data-*`, `aria-*`, …) passes through to the element. */
|
|
30
|
+
[key: string]: unknown;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
let {
|
|
34
|
+
label = "",
|
|
35
|
+
name,
|
|
36
|
+
placeholder = "",
|
|
37
|
+
value = $bindable(""),
|
|
38
|
+
type = "text",
|
|
39
|
+
size = "md",
|
|
40
|
+
disabled = false,
|
|
41
|
+
readonly = false,
|
|
42
|
+
invalid = false,
|
|
43
|
+
required = false,
|
|
44
|
+
clearable = false,
|
|
45
|
+
description = "",
|
|
46
|
+
error = "",
|
|
47
|
+
ariaLabel,
|
|
48
|
+
options,
|
|
49
|
+
mono = false,
|
|
50
|
+
oninput,
|
|
51
|
+
onchange,
|
|
52
|
+
prefix,
|
|
53
|
+
suffix,
|
|
54
|
+
...rest
|
|
55
|
+
}: Props = $props();
|
|
56
|
+
|
|
57
|
+
let host: (HTMLElement & { options: ReadonlyArray<string | FieldOption> }) | undefined = $state();
|
|
58
|
+
|
|
59
|
+
$effect(() => {
|
|
60
|
+
if (host) host.options = options ?? [];
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
function handleInput(event: Event) {
|
|
64
|
+
value = (event.target as HTMLElement & { value: string }).value;
|
|
65
|
+
oninput?.(event);
|
|
66
|
+
}
|
|
67
|
+
</script>
|
|
68
|
+
|
|
69
|
+
<xtyle-field
|
|
70
|
+
bind:this={host}
|
|
71
|
+
{...rest}
|
|
72
|
+
{label}
|
|
73
|
+
name={name || undefined}
|
|
74
|
+
{placeholder}
|
|
75
|
+
{value}
|
|
76
|
+
{type}
|
|
77
|
+
{size}
|
|
78
|
+
disabled={disabled || undefined}
|
|
79
|
+
readonly={readonly || undefined}
|
|
80
|
+
invalid={invalid || undefined}
|
|
81
|
+
required={required || undefined}
|
|
82
|
+
clearable={clearable || undefined}
|
|
83
|
+
mono={mono || undefined}
|
|
84
|
+
{description}
|
|
85
|
+
{error}
|
|
86
|
+
aria-label={ariaLabel ?? (rest["aria-label"] as string | undefined)}
|
|
87
|
+
oninput={handleInput}
|
|
88
|
+
{onchange}
|
|
89
|
+
>
|
|
90
|
+
{#if prefix}<span slot="prefix">{@render prefix()}</span>{/if}
|
|
91
|
+
{#if suffix}<span slot="suffix">{@render suffix()}</span>{/if}
|
|
92
|
+
</xtyle-field>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import "./register.js";
|
|
2
|
+
import type { Snippet } from "svelte";
|
|
3
|
+
import type { Size } from "@xtyle/core";
|
|
4
|
+
type FieldOption = {
|
|
5
|
+
value: string;
|
|
6
|
+
label?: string;
|
|
7
|
+
};
|
|
8
|
+
interface Props {
|
|
9
|
+
label?: string;
|
|
10
|
+
name?: string;
|
|
11
|
+
placeholder?: string;
|
|
12
|
+
value?: string;
|
|
13
|
+
type?: string;
|
|
14
|
+
size?: Size;
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
readonly?: boolean;
|
|
17
|
+
invalid?: boolean;
|
|
18
|
+
required?: boolean;
|
|
19
|
+
clearable?: boolean;
|
|
20
|
+
description?: string;
|
|
21
|
+
error?: string;
|
|
22
|
+
ariaLabel?: string;
|
|
23
|
+
options?: ReadonlyArray<string | FieldOption>;
|
|
24
|
+
mono?: boolean;
|
|
25
|
+
oninput?: (event: Event) => void;
|
|
26
|
+
onchange?: (event: Event) => void;
|
|
27
|
+
prefix?: Snippet;
|
|
28
|
+
suffix?: Snippet;
|
|
29
|
+
/** Any other attribute (`title`, `id`, `data-*`, `aria-*`, …) passes through to the element. */
|
|
30
|
+
[key: string]: unknown;
|
|
31
|
+
}
|
|
32
|
+
declare const Field: import("svelte").Component<Props, {}, "value">;
|
|
33
|
+
type Field = ReturnType<typeof Field>;
|
|
34
|
+
export default Field;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import "./register.js";
|
|
3
|
+
import type { Snippet } from "svelte";
|
|
4
|
+
import type { Size } from "@xtyle/core";
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
label?: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
error?: string;
|
|
10
|
+
size?: Size;
|
|
11
|
+
invalid?: boolean;
|
|
12
|
+
required?: boolean;
|
|
13
|
+
for?: string;
|
|
14
|
+
children?: Snippet;
|
|
15
|
+
/** Any other attribute (`title`, `id`, `data-*`, `aria-*`, …) passes through to the element. */
|
|
16
|
+
[key: string]: unknown;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let {
|
|
20
|
+
label = "",
|
|
21
|
+
description = "",
|
|
22
|
+
error = "",
|
|
23
|
+
size = "md",
|
|
24
|
+
invalid = false,
|
|
25
|
+
required = false,
|
|
26
|
+
for: htmlFor,
|
|
27
|
+
children,
|
|
28
|
+
...rest
|
|
29
|
+
}: Props = $props();
|
|
30
|
+
</script>
|
|
31
|
+
|
|
32
|
+
<xtyle-form-group
|
|
33
|
+
{...rest}
|
|
34
|
+
{label}
|
|
35
|
+
{description}
|
|
36
|
+
{error}
|
|
37
|
+
{size}
|
|
38
|
+
invalid={invalid || undefined}
|
|
39
|
+
required={required || undefined}
|
|
40
|
+
for={htmlFor || undefined}
|
|
41
|
+
>
|
|
42
|
+
{@render children?.()}
|
|
43
|
+
</xtyle-form-group>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import "./register.js";
|
|
2
|
+
import type { Snippet } from "svelte";
|
|
3
|
+
import type { Size } from "@xtyle/core";
|
|
4
|
+
interface Props {
|
|
5
|
+
label?: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
error?: string;
|
|
8
|
+
size?: Size;
|
|
9
|
+
invalid?: boolean;
|
|
10
|
+
required?: boolean;
|
|
11
|
+
for?: string;
|
|
12
|
+
children?: Snippet;
|
|
13
|
+
/** Any other attribute (`title`, `id`, `data-*`, `aria-*`, …) passes through to the element. */
|
|
14
|
+
[key: string]: unknown;
|
|
15
|
+
}
|
|
16
|
+
declare const FormGroup: import("svelte").Component<Props, {}, "">;
|
|
17
|
+
type FormGroup = ReturnType<typeof FormGroup>;
|
|
18
|
+
export default FormGroup;
|
package/dist/Grid.svelte
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import "./register.js";
|
|
3
|
+
import type { Snippet } from "svelte";
|
|
4
|
+
|
|
5
|
+
type GridAlign = "start" | "center" | "end" | "stretch";
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
gap?: number;
|
|
9
|
+
columns?: number;
|
|
10
|
+
minColWidth?: string;
|
|
11
|
+
align?: GridAlign;
|
|
12
|
+
justify?: GridAlign;
|
|
13
|
+
inline?: boolean;
|
|
14
|
+
children?: Snippet;
|
|
15
|
+
/** Any other attribute (`title`, `id`, `data-*`, `aria-*`, …) passes through to the element. */
|
|
16
|
+
[key: string]: unknown;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let { gap = 4, columns, minColWidth, align, justify, inline = false, children, ...rest }: Props = $props();
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
<xtyle-grid {...rest} {gap} {columns} min-col-width={minColWidth} {align} {justify} inline={inline || undefined}>
|
|
23
|
+
{@render children?.()}
|
|
24
|
+
</xtyle-grid>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import "./register.js";
|
|
2
|
+
import type { Snippet } from "svelte";
|
|
3
|
+
type GridAlign = "start" | "center" | "end" | "stretch";
|
|
4
|
+
interface Props {
|
|
5
|
+
gap?: number;
|
|
6
|
+
columns?: number;
|
|
7
|
+
minColWidth?: string;
|
|
8
|
+
align?: GridAlign;
|
|
9
|
+
justify?: GridAlign;
|
|
10
|
+
inline?: boolean;
|
|
11
|
+
children?: Snippet;
|
|
12
|
+
/** Any other attribute (`title`, `id`, `data-*`, `aria-*`, …) passes through to the element. */
|
|
13
|
+
[key: string]: unknown;
|
|
14
|
+
}
|
|
15
|
+
declare const Grid: import("svelte").Component<Props, {}, "">;
|
|
16
|
+
type Grid = ReturnType<typeof Grid>;
|
|
17
|
+
export default Grid;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import "./register.js";
|
|
3
|
+
import type { Snippet } from "svelte";
|
|
4
|
+
import type { HeadingLevel, HeadingSize, HeadingTone } from "@xtyle/core";
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
level?: HeadingLevel;
|
|
8
|
+
size?: HeadingSize;
|
|
9
|
+
tone?: HeadingTone;
|
|
10
|
+
children?: Snippet;
|
|
11
|
+
/** Any other attribute (`title`, `id`, `data-*`, `aria-*`, …) passes through to the element. */
|
|
12
|
+
[key: string]: unknown;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
let { level = 2, size, tone = "default", children, ...rest }: Props = $props();
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
<xtyle-heading {...rest} level={level} {size} {tone}>
|
|
19
|
+
{@render children?.()}
|
|
20
|
+
</xtyle-heading>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import "./register.js";
|
|
2
|
+
import type { Snippet } from "svelte";
|
|
3
|
+
import type { HeadingLevel, HeadingSize, HeadingTone } from "@xtyle/core";
|
|
4
|
+
interface Props {
|
|
5
|
+
level?: HeadingLevel;
|
|
6
|
+
size?: HeadingSize;
|
|
7
|
+
tone?: HeadingTone;
|
|
8
|
+
children?: Snippet;
|
|
9
|
+
/** Any other attribute (`title`, `id`, `data-*`, `aria-*`, …) passes through to the element. */
|
|
10
|
+
[key: string]: unknown;
|
|
11
|
+
}
|
|
12
|
+
declare const Heading: import("svelte").Component<Props, {}, "">;
|
|
13
|
+
type Heading = ReturnType<typeof Heading>;
|
|
14
|
+
export default Heading;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import "./register.js";
|
|
3
|
+
import type { HeatmapScheme } from "@xtyle/core";
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
values?: number[][];
|
|
7
|
+
glow?: number[][];
|
|
8
|
+
rows?: string[];
|
|
9
|
+
cols?: string[];
|
|
10
|
+
scheme?: HeatmapScheme;
|
|
11
|
+
reverse?: boolean;
|
|
12
|
+
max?: number;
|
|
13
|
+
glowMax?: number;
|
|
14
|
+
glowBlur?: number;
|
|
15
|
+
glowLabel?: string;
|
|
16
|
+
/** Show a color-scale key (five swatches from the ramp with 0..max endpoints) below the grid. */
|
|
17
|
+
/** Cells to ring as the current / "now" marker, each a `[rowIndex, colIndex]` pair. */
|
|
18
|
+
current?: number[][];
|
|
19
|
+
/** Tint for the current-cell ring: a semantic tone (`success` / `danger` / `warn` / `info` / `neutral`); defaults to accent. */
|
|
20
|
+
currentTone?: "success" | "danger" | "warn" | "info" | "neutral";
|
|
21
|
+
/** Pulse the current-cell ring (honors `prefers-reduced-motion`). */
|
|
22
|
+
currentPulse?: boolean;
|
|
23
|
+
/** Per-cell hover text (same shape as `values`); overrides a cell's default readout and accessible name. */
|
|
24
|
+
titles?: string[][];
|
|
25
|
+
scale?: boolean;
|
|
26
|
+
showValues?: boolean;
|
|
27
|
+
/** Make cells actionable: each becomes a `role="button"` that fires `select` on click or Enter/Space. */
|
|
28
|
+
selectable?: boolean;
|
|
29
|
+
label?: string;
|
|
30
|
+
/** Fired when a cell is activated (only when `selectable`), carrying the row, column, value, and indices. */
|
|
31
|
+
onselect?: (
|
|
32
|
+
event: CustomEvent<{ row: string; col: string; value: number; rowIndex: number; colIndex: number }>,
|
|
33
|
+
) => void;
|
|
34
|
+
/** Any other attribute (`title`, `id`, `data-*`, `aria-*`, …) passes through to the element. */
|
|
35
|
+
[key: string]: unknown;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
let {
|
|
39
|
+
values = [],
|
|
40
|
+
glow = [],
|
|
41
|
+
rows = [],
|
|
42
|
+
cols = [],
|
|
43
|
+
current = [],
|
|
44
|
+
currentTone,
|
|
45
|
+
currentPulse = false,
|
|
46
|
+
titles = [],
|
|
47
|
+
scheme = "accent",
|
|
48
|
+
reverse = false,
|
|
49
|
+
max,
|
|
50
|
+
glowMax,
|
|
51
|
+
glowBlur,
|
|
52
|
+
glowLabel,
|
|
53
|
+
scale = false,
|
|
54
|
+
showValues = false,
|
|
55
|
+
selectable = false,
|
|
56
|
+
label,
|
|
57
|
+
onselect,
|
|
58
|
+
...rest
|
|
59
|
+
}: Props = $props();
|
|
60
|
+
|
|
61
|
+
let host:
|
|
62
|
+
| (HTMLElement & {
|
|
63
|
+
values: number[][];
|
|
64
|
+
glow: number[][];
|
|
65
|
+
rows: string[];
|
|
66
|
+
cols: string[];
|
|
67
|
+
current: number[][];
|
|
68
|
+
titles: string[][];
|
|
69
|
+
scheme: HeatmapScheme;
|
|
70
|
+
})
|
|
71
|
+
| undefined = $state();
|
|
72
|
+
|
|
73
|
+
$effect(() => {
|
|
74
|
+
if (!host) return;
|
|
75
|
+
host.values = values;
|
|
76
|
+
host.glow = glow;
|
|
77
|
+
host.rows = rows;
|
|
78
|
+
host.cols = cols;
|
|
79
|
+
host.current = current;
|
|
80
|
+
host.titles = titles;
|
|
81
|
+
host.scheme = scheme;
|
|
82
|
+
});
|
|
83
|
+
</script>
|
|
84
|
+
|
|
85
|
+
<xtyle-heatmap
|
|
86
|
+
bind:this={host}
|
|
87
|
+
{...rest}
|
|
88
|
+
reverse={reverse || undefined}
|
|
89
|
+
max={max ?? undefined}
|
|
90
|
+
glow-max={glowMax ?? undefined}
|
|
91
|
+
glow-blur={glowBlur ?? undefined}
|
|
92
|
+
glow-label={glowLabel ?? undefined}
|
|
93
|
+
current-tone={currentTone ?? undefined}
|
|
94
|
+
current-pulse={currentPulse || undefined}
|
|
95
|
+
scale={scale || undefined}
|
|
96
|
+
show-values={showValues || undefined}
|
|
97
|
+
selectable={selectable || undefined}
|
|
98
|
+
{onselect}
|
|
99
|
+
{label}
|
|
100
|
+
></xtyle-heatmap>
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import "./register.js";
|
|
2
|
+
import type { HeatmapScheme } from "@xtyle/core";
|
|
3
|
+
interface Props {
|
|
4
|
+
values?: number[][];
|
|
5
|
+
glow?: number[][];
|
|
6
|
+
rows?: string[];
|
|
7
|
+
cols?: string[];
|
|
8
|
+
scheme?: HeatmapScheme;
|
|
9
|
+
reverse?: boolean;
|
|
10
|
+
max?: number;
|
|
11
|
+
glowMax?: number;
|
|
12
|
+
glowBlur?: number;
|
|
13
|
+
glowLabel?: string;
|
|
14
|
+
/** Show a color-scale key (five swatches from the ramp with 0..max endpoints) below the grid. */
|
|
15
|
+
/** Cells to ring as the current / "now" marker, each a `[rowIndex, colIndex]` pair. */
|
|
16
|
+
current?: number[][];
|
|
17
|
+
/** Tint for the current-cell ring: a semantic tone (`success` / `danger` / `warn` / `info` / `neutral`); defaults to accent. */
|
|
18
|
+
currentTone?: "success" | "danger" | "warn" | "info" | "neutral";
|
|
19
|
+
/** Pulse the current-cell ring (honors `prefers-reduced-motion`). */
|
|
20
|
+
currentPulse?: boolean;
|
|
21
|
+
/** Per-cell hover text (same shape as `values`); overrides a cell's default readout and accessible name. */
|
|
22
|
+
titles?: string[][];
|
|
23
|
+
scale?: boolean;
|
|
24
|
+
showValues?: boolean;
|
|
25
|
+
/** Make cells actionable: each becomes a `role="button"` that fires `select` on click or Enter/Space. */
|
|
26
|
+
selectable?: boolean;
|
|
27
|
+
label?: string;
|
|
28
|
+
/** Fired when a cell is activated (only when `selectable`), carrying the row, column, value, and indices. */
|
|
29
|
+
onselect?: (event: CustomEvent<{
|
|
30
|
+
row: string;
|
|
31
|
+
col: string;
|
|
32
|
+
value: number;
|
|
33
|
+
rowIndex: number;
|
|
34
|
+
colIndex: number;
|
|
35
|
+
}>) => void;
|
|
36
|
+
/** Any other attribute (`title`, `id`, `data-*`, `aria-*`, …) passes through to the element. */
|
|
37
|
+
[key: string]: unknown;
|
|
38
|
+
}
|
|
39
|
+
declare const Heatmap: import("svelte").Component<Props, {}, "">;
|
|
40
|
+
type Heatmap = ReturnType<typeof Heatmap>;
|
|
41
|
+
export default Heatmap;
|