@nqmcreative/ui 0.1.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/LICENSE +21 -0
- package/README.md +507 -0
- package/cli/index.mjs +410 -0
- package/dist/actions/anchor.d.ts +29 -0
- package/dist/actions/anchor.js +122 -0
- package/dist/actions/dismissable.d.ts +44 -0
- package/dist/actions/dismissable.js +147 -0
- package/dist/components/Accordion.svelte +14 -0
- package/dist/components/Accordion.svelte.d.ts +8 -0
- package/dist/components/AccordionItem.svelte +46 -0
- package/dist/components/AccordionItem.svelte.d.ts +14 -0
- package/dist/components/Alert.svelte +88 -0
- package/dist/components/Alert.svelte.d.ts +18 -0
- package/dist/components/Avatar.svelte +58 -0
- package/dist/components/Avatar.svelte.d.ts +16 -0
- package/dist/components/AvatarGroup.svelte +17 -0
- package/dist/components/AvatarGroup.svelte.d.ts +8 -0
- package/dist/components/Badge.svelte +53 -0
- package/dist/components/Badge.svelte.d.ts +18 -0
- package/dist/components/Breadcrumb.svelte +46 -0
- package/dist/components/Breadcrumb.svelte.d.ts +14 -0
- package/dist/components/Button.svelte +94 -0
- package/dist/components/Button.svelte.d.ts +21 -0
- package/dist/components/Calendar.svelte +206 -0
- package/dist/components/Calendar.svelte.d.ts +22 -0
- package/dist/components/Card.svelte +76 -0
- package/dist/components/Card.svelte.d.ts +21 -0
- package/dist/components/Checkbox.svelte +69 -0
- package/dist/components/Checkbox.svelte.d.ts +15 -0
- package/dist/components/CheckboxGroup.svelte +109 -0
- package/dist/components/CheckboxGroup.svelte.d.ts +30 -0
- package/dist/components/Combobox.svelte +268 -0
- package/dist/components/Combobox.svelte.d.ts +29 -0
- package/dist/components/CommandPalette.svelte +226 -0
- package/dist/components/CommandPalette.svelte.d.ts +32 -0
- package/dist/components/ConfirmDialog.svelte +97 -0
- package/dist/components/ConfirmDialog.svelte.d.ts +22 -0
- package/dist/components/ContextMenu.svelte +90 -0
- package/dist/components/ContextMenu.svelte.d.ts +15 -0
- package/dist/components/DatePicker.svelte +186 -0
- package/dist/components/DatePicker.svelte.d.ts +23 -0
- package/dist/components/Divider.svelte +30 -0
- package/dist/components/Divider.svelte.d.ts +10 -0
- package/dist/components/Drawer.svelte +161 -0
- package/dist/components/Drawer.svelte.d.ts +20 -0
- package/dist/components/Dropdown.svelte +112 -0
- package/dist/components/Dropdown.svelte.d.ts +23 -0
- package/dist/components/Dropzone.svelte +226 -0
- package/dist/components/Dropzone.svelte.d.ts +32 -0
- package/dist/components/EmptyState.svelte +57 -0
- package/dist/components/EmptyState.svelte.d.ts +18 -0
- package/dist/components/Field.svelte +42 -0
- package/dist/components/Field.svelte.d.ts +16 -0
- package/dist/components/Footer.svelte +93 -0
- package/dist/components/Footer.svelte.d.ts +25 -0
- package/dist/components/Input.svelte +60 -0
- package/dist/components/Input.svelte.d.ts +18 -0
- package/dist/components/InputGroup.svelte +19 -0
- package/dist/components/InputGroup.svelte.d.ts +10 -0
- package/dist/components/Kbd.svelte +17 -0
- package/dist/components/Kbd.svelte.d.ts +8 -0
- package/dist/components/Label.svelte +16 -0
- package/dist/components/Label.svelte.d.ts +9 -0
- package/dist/components/Link.svelte +44 -0
- package/dist/components/Link.svelte.d.ts +16 -0
- package/dist/components/LocaleProvider.svelte +24 -0
- package/dist/components/LocaleProvider.svelte.d.ts +10 -0
- package/dist/components/MenuItem.svelte +58 -0
- package/dist/components/MenuItem.svelte.d.ts +18 -0
- package/dist/components/MenuSeparator.svelte +22 -0
- package/dist/components/MenuSeparator.svelte.d.ts +8 -0
- package/dist/components/Modal.svelte +114 -0
- package/dist/components/Modal.svelte.d.ts +21 -0
- package/dist/components/MultiSelect.svelte +292 -0
- package/dist/components/MultiSelect.svelte.d.ts +31 -0
- package/dist/components/Navbar.svelte +190 -0
- package/dist/components/Navbar.svelte.d.ts +33 -0
- package/dist/components/NumberInput.svelte +100 -0
- package/dist/components/NumberInput.svelte.d.ts +15 -0
- package/dist/components/Pagination.svelte +90 -0
- package/dist/components/Pagination.svelte.d.ts +15 -0
- package/dist/components/PasswordInput.svelte +104 -0
- package/dist/components/PasswordInput.svelte.d.ts +12 -0
- package/dist/components/Popover.svelte +114 -0
- package/dist/components/Popover.svelte.d.ts +19 -0
- package/dist/components/Progress.svelte +56 -0
- package/dist/components/Progress.svelte.d.ts +17 -0
- package/dist/components/Radio.svelte +55 -0
- package/dist/components/Radio.svelte.d.ts +15 -0
- package/dist/components/RadioGroup.svelte +93 -0
- package/dist/components/RadioGroup.svelte.d.ts +27 -0
- package/dist/components/SegmentedControl.svelte +88 -0
- package/dist/components/SegmentedControl.svelte.d.ts +25 -0
- package/dist/components/Select.svelte +61 -0
- package/dist/components/Select.svelte.d.ts +20 -0
- package/dist/components/Sidebar.svelte +206 -0
- package/dist/components/Sidebar.svelte.d.ts +36 -0
- package/dist/components/Skeleton.svelte +46 -0
- package/dist/components/Skeleton.svelte.d.ts +13 -0
- package/dist/components/Slider.svelte +79 -0
- package/dist/components/Slider.svelte.d.ts +19 -0
- package/dist/components/Spinner.svelte +34 -0
- package/dist/components/Spinner.svelte.d.ts +13 -0
- package/dist/components/Stat.svelte +49 -0
- package/dist/components/Stat.svelte.d.ts +16 -0
- package/dist/components/Steps.svelte +136 -0
- package/dist/components/Steps.svelte.d.ts +24 -0
- package/dist/components/Switch.svelte +64 -0
- package/dist/components/Switch.svelte.d.ts +14 -0
- package/dist/components/Table.svelte +236 -0
- package/dist/components/Table.svelte.d.ts +70 -0
- package/dist/components/Tabs.svelte +91 -0
- package/dist/components/Tabs.svelte.d.ts +23 -0
- package/dist/components/Textarea.svelte +54 -0
- package/dist/components/Textarea.svelte.d.ts +12 -0
- package/dist/components/ThemeToggle.svelte +133 -0
- package/dist/components/ThemeToggle.svelte.d.ts +20 -0
- package/dist/components/Toaster.svelte +110 -0
- package/dist/components/Toaster.svelte.d.ts +8 -0
- package/dist/components/Tooltip.svelte +33 -0
- package/dist/components/Tooltip.svelte.d.ts +12 -0
- package/dist/date.d.ts +35 -0
- package/dist/date.js +108 -0
- package/dist/fonts.css +193 -0
- package/dist/index.d.ts +105 -0
- package/dist/index.js +77 -0
- package/dist/locale.svelte.d.ts +93 -0
- package/dist/locale.svelte.js +153 -0
- package/dist/theme.css +210 -0
- package/dist/toast.svelte.d.ts +47 -0
- package/dist/toast.svelte.js +60 -0
- package/dist/tones.d.ts +48 -0
- package/dist/tones.js +209 -0
- package/package.json +349 -0
- package/registry.json +669 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { flip } from 'svelte/animate';
|
|
3
|
+
import { fly } from 'svelte/transition';
|
|
4
|
+
import { portal } from '../actions/dismissable.js';
|
|
5
|
+
import { toast } from '../toast.svelte.js';
|
|
6
|
+
import { toneBorderSoft, toneSurface, toneText } from '../tones.js';
|
|
7
|
+
import Spinner from './Spinner.svelte';
|
|
8
|
+
import { useLocale } from '../locale.svelte.js';
|
|
9
|
+
|
|
10
|
+
export type ToasterPosition =
|
|
11
|
+
'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';
|
|
12
|
+
|
|
13
|
+
interface Props {
|
|
14
|
+
position?: ToasterPosition;
|
|
15
|
+
class?: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
let { position = 'bottom-right', class: className = '' }: Props = $props();
|
|
19
|
+
|
|
20
|
+
const t = useLocale();
|
|
21
|
+
|
|
22
|
+
const positions: Record<ToasterPosition, string> = {
|
|
23
|
+
'top-left': 'top-4 left-4 items-start',
|
|
24
|
+
'top-center': 'top-4 left-1/2 -translate-x-1/2 items-center',
|
|
25
|
+
'top-right': 'top-4 right-4 items-end',
|
|
26
|
+
'bottom-left': 'bottom-4 left-4 items-start',
|
|
27
|
+
'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2 items-center',
|
|
28
|
+
'bottom-right': 'bottom-4 right-4 items-end'
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const fromTop = $derived(position.startsWith('top'));
|
|
32
|
+
const fromLeft = $derived(position.endsWith('left'));
|
|
33
|
+
const fromCenter = $derived(position.endsWith('center'));
|
|
34
|
+
|
|
35
|
+
const enter = $derived(
|
|
36
|
+
fromCenter ? { y: fromTop ? -16 : 16, x: 0 } : { x: fromLeft ? -16 : 16, y: 0 }
|
|
37
|
+
);
|
|
38
|
+
</script>
|
|
39
|
+
|
|
40
|
+
<div
|
|
41
|
+
use:portal
|
|
42
|
+
aria-live="polite"
|
|
43
|
+
aria-label={t.current.notifications}
|
|
44
|
+
class="pointer-events-none fixed z-[100] flex w-[min(24rem,calc(100vw-2rem))] flex-col gap-3 {positions[
|
|
45
|
+
position
|
|
46
|
+
]} {fromTop ? '' : 'flex-col-reverse'} {className}"
|
|
47
|
+
>
|
|
48
|
+
{#each toast.items as item (item.id)}
|
|
49
|
+
<div
|
|
50
|
+
animate:flip={{ duration: 200 }}
|
|
51
|
+
in:fly={{ ...enter, duration: 220 }}
|
|
52
|
+
out:fly={{ ...enter, duration: 160 }}
|
|
53
|
+
role={item.tone === 'danger' ? 'alert' : 'status'}
|
|
54
|
+
class="pointer-events-auto flex w-full items-start gap-3 border p-4 font-sans
|
|
55
|
+
{toneSurface[item.tone]} {toneBorderSoft[item.tone]}"
|
|
56
|
+
>
|
|
57
|
+
<span class="mt-0.5 shrink-0 {toneText[item.tone]}">
|
|
58
|
+
{#if item.loading}
|
|
59
|
+
<Spinner size="sm" label="" />
|
|
60
|
+
{:else if item.tone === 'success'}
|
|
61
|
+
<svg class="size-4" viewBox="0 0 16 16" fill="none" aria-hidden="true">
|
|
62
|
+
<path d="m3 8.5 3.2 3.2L13 5" stroke="currentColor" stroke-width="1.6" />
|
|
63
|
+
</svg>
|
|
64
|
+
{:else if item.tone === 'danger'}
|
|
65
|
+
<svg class="size-4" viewBox="0 0 16 16" fill="none" aria-hidden="true">
|
|
66
|
+
<path d="m3.5 3.5 9 9M12.5 3.5l-9 9" stroke="currentColor" stroke-width="1.6" />
|
|
67
|
+
</svg>
|
|
68
|
+
{:else}
|
|
69
|
+
<svg class="size-4" viewBox="0 0 16 16" fill="none" aria-hidden="true">
|
|
70
|
+
<circle cx="8" cy="8" r="7" stroke="currentColor" stroke-width="1.5" />
|
|
71
|
+
<path d="M8 4.5v4.5" stroke="currentColor" stroke-width="1.5" />
|
|
72
|
+
<circle cx="8" cy="11.5" r="0.9" fill="currentColor" />
|
|
73
|
+
</svg>
|
|
74
|
+
{/if}
|
|
75
|
+
</span>
|
|
76
|
+
|
|
77
|
+
<div class="flex min-w-0 flex-1 flex-col gap-1">
|
|
78
|
+
<p class="text-[15px] leading-snug font-medium {toneText[item.tone]}">{item.title}</p>
|
|
79
|
+
{#if item.description}
|
|
80
|
+
<p class="text-sm leading-relaxed text-text-secondary">{item.description}</p>
|
|
81
|
+
{/if}
|
|
82
|
+
{#if item.action}
|
|
83
|
+
<button
|
|
84
|
+
type="button"
|
|
85
|
+
onclick={() => {
|
|
86
|
+
item.action?.onclick();
|
|
87
|
+
toast.dismiss(item.id);
|
|
88
|
+
}}
|
|
89
|
+
class="mt-1 self-start font-sans text-sm font-medium underline underline-offset-4 {toneText[
|
|
90
|
+
item.tone
|
|
91
|
+
]}"
|
|
92
|
+
>
|
|
93
|
+
{item.action.label}
|
|
94
|
+
</button>
|
|
95
|
+
{/if}
|
|
96
|
+
</div>
|
|
97
|
+
|
|
98
|
+
<button
|
|
99
|
+
type="button"
|
|
100
|
+
onclick={() => toast.dismiss(item.id)}
|
|
101
|
+
aria-label={t.current.dismiss}
|
|
102
|
+
class="-m-1 shrink-0 p-1 text-text-muted transition-colors duration-150 hover:text-text focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-current"
|
|
103
|
+
>
|
|
104
|
+
<svg class="size-3.5" viewBox="0 0 14 14" fill="none" aria-hidden="true">
|
|
105
|
+
<path d="m2 2 10 10M12 2 2 12" stroke="currentColor" stroke-width="1.5" />
|
|
106
|
+
</svg>
|
|
107
|
+
</button>
|
|
108
|
+
</div>
|
|
109
|
+
{/each}
|
|
110
|
+
</div>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type ToasterPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';
|
|
2
|
+
interface Props {
|
|
3
|
+
position?: ToasterPosition;
|
|
4
|
+
class?: string;
|
|
5
|
+
}
|
|
6
|
+
declare const Toaster: import("svelte").Component<Props, {}, "">;
|
|
7
|
+
type Toaster = ReturnType<typeof Toaster>;
|
|
8
|
+
export default Toaster;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
4
|
+
|
|
5
|
+
export type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right';
|
|
6
|
+
|
|
7
|
+
interface Props extends HTMLAttributes<HTMLSpanElement> {
|
|
8
|
+
/** Tooltip text. CSS-only: shows on hover and on keyboard focus. */
|
|
9
|
+
content: string;
|
|
10
|
+
placement?: TooltipPlacement;
|
|
11
|
+
children: Snippet;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
let { content, placement = 'top', class: className = '', children, ...rest }: Props = $props();
|
|
15
|
+
|
|
16
|
+
const placements: Record<TooltipPlacement, string> = {
|
|
17
|
+
top: 'bottom-full left-1/2 mb-2 -translate-x-1/2',
|
|
18
|
+
bottom: 'top-full left-1/2 mt-2 -translate-x-1/2',
|
|
19
|
+
left: 'right-full top-1/2 mr-2 -translate-y-1/2',
|
|
20
|
+
right: 'left-full top-1/2 ml-2 -translate-y-1/2'
|
|
21
|
+
};
|
|
22
|
+
</script>
|
|
23
|
+
|
|
24
|
+
<span class="group/tt relative inline-flex" {...rest}>
|
|
25
|
+
{@render children()}
|
|
26
|
+
<span
|
|
27
|
+
role="tooltip"
|
|
28
|
+
class="pointer-events-none invisible absolute z-50 bg-text px-2.5 py-1.5 font-sans text-xs whitespace-nowrap text-text-inverse opacity-0 transition-opacity duration-150 ease-brand-out group-focus-within/tt:visible group-focus-within/tt:opacity-100 group-hover/tt:visible group-hover/tt:opacity-100
|
|
29
|
+
{placements[placement]} {className}"
|
|
30
|
+
>
|
|
31
|
+
{content}
|
|
32
|
+
</span>
|
|
33
|
+
</span>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
+
export type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right';
|
|
4
|
+
interface Props extends HTMLAttributes<HTMLSpanElement> {
|
|
5
|
+
/** Tooltip text. CSS-only: shows on hover and on keyboard focus. */
|
|
6
|
+
content: string;
|
|
7
|
+
placement?: TooltipPlacement;
|
|
8
|
+
children: Snippet;
|
|
9
|
+
}
|
|
10
|
+
declare const Tooltip: import("svelte").Component<Props, {}, "">;
|
|
11
|
+
type Tooltip = ReturnType<typeof Tooltip>;
|
|
12
|
+
export default Tooltip;
|
package/dist/date.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Date helpers for `Calendar` and `DatePicker`.
|
|
3
|
+
*
|
|
4
|
+
* Dates cross the component boundary as `YYYY-MM-DD` strings, never as `Date`
|
|
5
|
+
* objects: a `Date` is a UTC instant, so `new Date('2026-03-01')` is the last
|
|
6
|
+
* day of February for anyone west of Greenwich. Everything below stays in the
|
|
7
|
+
* viewer's local calendar.
|
|
8
|
+
*/
|
|
9
|
+
/** `YYYY-MM-DD` for a local date. */
|
|
10
|
+
export declare function toISO(date: Date): string;
|
|
11
|
+
/** Parses `YYYY-MM-DD` as local midnight. Returns `null` for anything else. */
|
|
12
|
+
export declare function fromISO(value: string | undefined | null): Date | null;
|
|
13
|
+
export declare function today(): Date;
|
|
14
|
+
export declare function isSameDay(a: Date | null, b: Date | null): boolean;
|
|
15
|
+
export declare function addDays(date: Date, days: number): Date;
|
|
16
|
+
export declare function addMonths(date: Date, months: number): Date;
|
|
17
|
+
/**
|
|
18
|
+
* The 42 cells of a month grid: trailing days of the previous month, the month
|
|
19
|
+
* itself, then enough of the next to fill six rows, so the grid never jumps
|
|
20
|
+
* height between months.
|
|
21
|
+
*/
|
|
22
|
+
export declare function monthGrid(month: Date, weekStart?: 0 | 1): Date[];
|
|
23
|
+
/** Localised weekday initials, starting on `weekStart`. */
|
|
24
|
+
export declare function weekdayNames(locale: string, weekStart?: 0 | 1): string[];
|
|
25
|
+
export declare function monthLabel(month: Date, locale: string): string;
|
|
26
|
+
/** `true` when `date` falls outside `min`/`max`, both inclusive and optional. */
|
|
27
|
+
export declare function isOutOfRange(date: Date, min?: string, max?: string): boolean;
|
|
28
|
+
export type DateFormat = 'dmy' | 'mdy' | 'ymd';
|
|
29
|
+
/** Prints `YYYY-MM-DD` in the locale's part order, e.g. `31/12/2026`. */
|
|
30
|
+
export declare function formatISO(value: string, format: DateFormat, separator?: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* The inverse of `formatISO`, forgiving about separators and single digits.
|
|
33
|
+
* Returns `null` when the text isn't a complete, real date.
|
|
34
|
+
*/
|
|
35
|
+
export declare function parseFormatted(text: string, format: DateFormat): string | null;
|
package/dist/date.js
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Date helpers for `Calendar` and `DatePicker`.
|
|
3
|
+
*
|
|
4
|
+
* Dates cross the component boundary as `YYYY-MM-DD` strings, never as `Date`
|
|
5
|
+
* objects: a `Date` is a UTC instant, so `new Date('2026-03-01')` is the last
|
|
6
|
+
* day of February for anyone west of Greenwich. Everything below stays in the
|
|
7
|
+
* viewer's local calendar.
|
|
8
|
+
*/
|
|
9
|
+
/** `YYYY-MM-DD` for a local date. */
|
|
10
|
+
export function toISO(date) {
|
|
11
|
+
const month = `${date.getMonth() + 1}`.padStart(2, '0');
|
|
12
|
+
const day = `${date.getDate()}`.padStart(2, '0');
|
|
13
|
+
return `${date.getFullYear()}-${month}-${day}`;
|
|
14
|
+
}
|
|
15
|
+
/** Parses `YYYY-MM-DD` as local midnight. Returns `null` for anything else. */
|
|
16
|
+
export function fromISO(value) {
|
|
17
|
+
if (!value)
|
|
18
|
+
return null;
|
|
19
|
+
const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(value.trim());
|
|
20
|
+
if (!match)
|
|
21
|
+
return null;
|
|
22
|
+
const [, y, m, d] = match;
|
|
23
|
+
const date = new Date(Number(y), Number(m) - 1, Number(d));
|
|
24
|
+
// Rejects 2026-02-31 and friends, which Date would roll forward.
|
|
25
|
+
return date.getMonth() === Number(m) - 1 ? date : null;
|
|
26
|
+
}
|
|
27
|
+
export function today() {
|
|
28
|
+
const now = new Date();
|
|
29
|
+
return new Date(now.getFullYear(), now.getMonth(), now.getDate());
|
|
30
|
+
}
|
|
31
|
+
export function isSameDay(a, b) {
|
|
32
|
+
return !!a && !!b && toISO(a) === toISO(b);
|
|
33
|
+
}
|
|
34
|
+
export function addDays(date, days) {
|
|
35
|
+
return new Date(date.getFullYear(), date.getMonth(), date.getDate() + days);
|
|
36
|
+
}
|
|
37
|
+
export function addMonths(date, months) {
|
|
38
|
+
const target = new Date(date.getFullYear(), date.getMonth() + months, 1);
|
|
39
|
+
const lastDay = new Date(target.getFullYear(), target.getMonth() + 1, 0).getDate();
|
|
40
|
+
target.setDate(Math.min(date.getDate(), lastDay));
|
|
41
|
+
return target;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* The 42 cells of a month grid: trailing days of the previous month, the month
|
|
45
|
+
* itself, then enough of the next to fill six rows, so the grid never jumps
|
|
46
|
+
* height between months.
|
|
47
|
+
*/
|
|
48
|
+
export function monthGrid(month, weekStart = 1) {
|
|
49
|
+
const first = new Date(month.getFullYear(), month.getMonth(), 1);
|
|
50
|
+
const offset = (first.getDay() - weekStart + 7) % 7;
|
|
51
|
+
const start = addDays(first, -offset);
|
|
52
|
+
return Array.from({ length: 42 }, (_, i) => addDays(start, i));
|
|
53
|
+
}
|
|
54
|
+
/** Localised weekday initials, starting on `weekStart`. */
|
|
55
|
+
export function weekdayNames(locale, weekStart = 1) {
|
|
56
|
+
const format = new Intl.DateTimeFormat(locale, { weekday: 'short' });
|
|
57
|
+
// 2024-01-07 was a Sunday, so this walks a full week in order.
|
|
58
|
+
return Array.from({ length: 7 }, (_, i) => format.format(new Date(2024, 0, 7 + ((i + weekStart) % 7))));
|
|
59
|
+
}
|
|
60
|
+
export function monthLabel(month, locale) {
|
|
61
|
+
return new Intl.DateTimeFormat(locale, { month: 'long', year: 'numeric' }).format(month);
|
|
62
|
+
}
|
|
63
|
+
/** `true` when `date` falls outside `min`/`max`, both inclusive and optional. */
|
|
64
|
+
export function isOutOfRange(date, min, max) {
|
|
65
|
+
const iso = toISO(date);
|
|
66
|
+
if (min && iso < min)
|
|
67
|
+
return true;
|
|
68
|
+
if (max && iso > max)
|
|
69
|
+
return true;
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
/** Prints `YYYY-MM-DD` in the locale's part order, e.g. `31/12/2026`. */
|
|
73
|
+
export function formatISO(value, format, separator = '/') {
|
|
74
|
+
const date = fromISO(value);
|
|
75
|
+
if (!date)
|
|
76
|
+
return '';
|
|
77
|
+
const d = `${date.getDate()}`.padStart(2, '0');
|
|
78
|
+
const m = `${date.getMonth() + 1}`.padStart(2, '0');
|
|
79
|
+
const y = `${date.getFullYear()}`;
|
|
80
|
+
if (format === 'ymd')
|
|
81
|
+
return [y, m, d].join(separator);
|
|
82
|
+
if (format === 'mdy')
|
|
83
|
+
return [m, d, y].join(separator);
|
|
84
|
+
return [d, m, y].join(separator);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* The inverse of `formatISO`, forgiving about separators and single digits.
|
|
88
|
+
* Returns `null` when the text isn't a complete, real date.
|
|
89
|
+
*/
|
|
90
|
+
export function parseFormatted(text, format) {
|
|
91
|
+
const parts = text
|
|
92
|
+
.trim()
|
|
93
|
+
.split(/[^\d]+/)
|
|
94
|
+
.filter(Boolean);
|
|
95
|
+
if (parts.length !== 3)
|
|
96
|
+
return null;
|
|
97
|
+
let y, m, d;
|
|
98
|
+
if (format === 'ymd')
|
|
99
|
+
[y, m, d] = parts;
|
|
100
|
+
else if (format === 'mdy')
|
|
101
|
+
[m, d, y] = parts;
|
|
102
|
+
else
|
|
103
|
+
[d, m, y] = parts;
|
|
104
|
+
if (y.length !== 4)
|
|
105
|
+
return null;
|
|
106
|
+
const iso = `${y}-${m.padStart(2, '0')}-${d.padStart(2, '0')}`;
|
|
107
|
+
return fromISO(iso) ? iso : null;
|
|
108
|
+
}
|
package/dist/fonts.css
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Optional: the exact Google Fonts used by nqmcreative.com — Sora (headings),
|
|
3
|
+
* Work Sans (body), JetBrains Mono (labels and code). Import this only if your
|
|
4
|
+
* project doesn't already self-host or load these fonts another way.
|
|
5
|
+
*
|
|
6
|
+
* These are plain `@font-face` rules rather than an `@import` of the Google
|
|
7
|
+
* stylesheet on purpose: `@import` is only valid before every other rule, so a
|
|
8
|
+
* bundler silently drops it when this file is imported after `tailwindcss` —
|
|
9
|
+
* the fonts then fall back to system-ui with no error anywhere. `@font-face`
|
|
10
|
+
* works wherever you put it, and it skips the CSS-to-CSS round trip before the
|
|
11
|
+
* font files start downloading.
|
|
12
|
+
*
|
|
13
|
+
* Latin and Latin Extended subsets only. Add
|
|
14
|
+
* `<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>` to
|
|
15
|
+
* your document head to open the connection earlier.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/* --- Sora --- */
|
|
19
|
+
/* latin */
|
|
20
|
+
@font-face {
|
|
21
|
+
font-family: 'Sora';
|
|
22
|
+
font-style: normal;
|
|
23
|
+
font-weight: 400;
|
|
24
|
+
font-display: swap;
|
|
25
|
+
src: url(https://fonts.gstatic.com/s/sora/v17/xMQ9uFFYT72X5wkB_18qmnndmSdSnh2BAfO5mnuyOo1lfiQwV6-x.woff2)
|
|
26
|
+
format('woff2');
|
|
27
|
+
unicode-range:
|
|
28
|
+
U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329,
|
|
29
|
+
U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
|
30
|
+
}
|
|
31
|
+
/* latin-ext */
|
|
32
|
+
@font-face {
|
|
33
|
+
font-family: 'Sora';
|
|
34
|
+
font-style: normal;
|
|
35
|
+
font-weight: 400;
|
|
36
|
+
font-display: swap;
|
|
37
|
+
src: url(https://fonts.gstatic.com/s/sora/v17/xMQ9uFFYT72X5wkB_18qmnndmSdSnh2BAfO5mnuyOo1lfiQwWa-xsaQ.woff2)
|
|
38
|
+
format('woff2');
|
|
39
|
+
unicode-range:
|
|
40
|
+
U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329,
|
|
41
|
+
U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F,
|
|
42
|
+
U+A720-A7FF;
|
|
43
|
+
}
|
|
44
|
+
/* latin */
|
|
45
|
+
@font-face {
|
|
46
|
+
font-family: 'Sora';
|
|
47
|
+
font-style: normal;
|
|
48
|
+
font-weight: 500;
|
|
49
|
+
font-display: swap;
|
|
50
|
+
src: url(https://fonts.gstatic.com/s/sora/v17/xMQ9uFFYT72X5wkB_18qmnndmSdSnh2BAfO5mnuyOo1lfiQwV6-x.woff2)
|
|
51
|
+
format('woff2');
|
|
52
|
+
unicode-range:
|
|
53
|
+
U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329,
|
|
54
|
+
U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
|
55
|
+
}
|
|
56
|
+
/* latin-ext */
|
|
57
|
+
@font-face {
|
|
58
|
+
font-family: 'Sora';
|
|
59
|
+
font-style: normal;
|
|
60
|
+
font-weight: 500;
|
|
61
|
+
font-display: swap;
|
|
62
|
+
src: url(https://fonts.gstatic.com/s/sora/v17/xMQ9uFFYT72X5wkB_18qmnndmSdSnh2BAfO5mnuyOo1lfiQwWa-xsaQ.woff2)
|
|
63
|
+
format('woff2');
|
|
64
|
+
unicode-range:
|
|
65
|
+
U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329,
|
|
66
|
+
U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F,
|
|
67
|
+
U+A720-A7FF;
|
|
68
|
+
}
|
|
69
|
+
/* latin */
|
|
70
|
+
@font-face {
|
|
71
|
+
font-family: 'Sora';
|
|
72
|
+
font-style: normal;
|
|
73
|
+
font-weight: 600;
|
|
74
|
+
font-display: swap;
|
|
75
|
+
src: url(https://fonts.gstatic.com/s/sora/v17/xMQ9uFFYT72X5wkB_18qmnndmSdSnh2BAfO5mnuyOo1lfiQwV6-x.woff2)
|
|
76
|
+
format('woff2');
|
|
77
|
+
unicode-range:
|
|
78
|
+
U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329,
|
|
79
|
+
U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
|
80
|
+
}
|
|
81
|
+
/* latin-ext */
|
|
82
|
+
@font-face {
|
|
83
|
+
font-family: 'Sora';
|
|
84
|
+
font-style: normal;
|
|
85
|
+
font-weight: 600;
|
|
86
|
+
font-display: swap;
|
|
87
|
+
src: url(https://fonts.gstatic.com/s/sora/v17/xMQ9uFFYT72X5wkB_18qmnndmSdSnh2BAfO5mnuyOo1lfiQwWa-xsaQ.woff2)
|
|
88
|
+
format('woff2');
|
|
89
|
+
unicode-range:
|
|
90
|
+
U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329,
|
|
91
|
+
U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F,
|
|
92
|
+
U+A720-A7FF;
|
|
93
|
+
}
|
|
94
|
+
/* --- Work Sans --- */
|
|
95
|
+
/* latin */
|
|
96
|
+
@font-face {
|
|
97
|
+
font-family: 'Work Sans';
|
|
98
|
+
font-style: normal;
|
|
99
|
+
font-weight: 400;
|
|
100
|
+
font-display: swap;
|
|
101
|
+
src: url(https://fonts.gstatic.com/s/worksans/v24/QGYsz_wNahGAdqQ43Rh_fKDp.woff2) format('woff2');
|
|
102
|
+
unicode-range:
|
|
103
|
+
U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329,
|
|
104
|
+
U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
|
105
|
+
}
|
|
106
|
+
/* latin-ext */
|
|
107
|
+
@font-face {
|
|
108
|
+
font-family: 'Work Sans';
|
|
109
|
+
font-style: normal;
|
|
110
|
+
font-weight: 400;
|
|
111
|
+
font-display: swap;
|
|
112
|
+
src: url(https://fonts.gstatic.com/s/worksans/v24/QGYsz_wNahGAdqQ43Rh_cqDpp_k.woff2)
|
|
113
|
+
format('woff2');
|
|
114
|
+
unicode-range:
|
|
115
|
+
U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329,
|
|
116
|
+
U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F,
|
|
117
|
+
U+A720-A7FF;
|
|
118
|
+
}
|
|
119
|
+
/* latin */
|
|
120
|
+
@font-face {
|
|
121
|
+
font-family: 'Work Sans';
|
|
122
|
+
font-style: normal;
|
|
123
|
+
font-weight: 500;
|
|
124
|
+
font-display: swap;
|
|
125
|
+
src: url(https://fonts.gstatic.com/s/worksans/v24/QGYsz_wNahGAdqQ43Rh_fKDp.woff2) format('woff2');
|
|
126
|
+
unicode-range:
|
|
127
|
+
U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329,
|
|
128
|
+
U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
|
129
|
+
}
|
|
130
|
+
/* latin-ext */
|
|
131
|
+
@font-face {
|
|
132
|
+
font-family: 'Work Sans';
|
|
133
|
+
font-style: normal;
|
|
134
|
+
font-weight: 500;
|
|
135
|
+
font-display: swap;
|
|
136
|
+
src: url(https://fonts.gstatic.com/s/worksans/v24/QGYsz_wNahGAdqQ43Rh_cqDpp_k.woff2)
|
|
137
|
+
format('woff2');
|
|
138
|
+
unicode-range:
|
|
139
|
+
U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329,
|
|
140
|
+
U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F,
|
|
141
|
+
U+A720-A7FF;
|
|
142
|
+
}
|
|
143
|
+
/* --- JetBrains Mono --- */
|
|
144
|
+
/* latin */
|
|
145
|
+
@font-face {
|
|
146
|
+
font-family: 'JetBrains Mono';
|
|
147
|
+
font-style: normal;
|
|
148
|
+
font-weight: 400;
|
|
149
|
+
font-display: swap;
|
|
150
|
+
src: url(https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPxDcwg.woff2)
|
|
151
|
+
format('woff2');
|
|
152
|
+
unicode-range:
|
|
153
|
+
U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329,
|
|
154
|
+
U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
|
155
|
+
}
|
|
156
|
+
/* latin-ext */
|
|
157
|
+
@font-face {
|
|
158
|
+
font-family: 'JetBrains Mono';
|
|
159
|
+
font-style: normal;
|
|
160
|
+
font-weight: 400;
|
|
161
|
+
font-display: swap;
|
|
162
|
+
src: url(https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPx7cwhsk.woff2)
|
|
163
|
+
format('woff2');
|
|
164
|
+
unicode-range:
|
|
165
|
+
U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329,
|
|
166
|
+
U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F,
|
|
167
|
+
U+A720-A7FF;
|
|
168
|
+
}
|
|
169
|
+
/* latin */
|
|
170
|
+
@font-face {
|
|
171
|
+
font-family: 'JetBrains Mono';
|
|
172
|
+
font-style: normal;
|
|
173
|
+
font-weight: 500;
|
|
174
|
+
font-display: swap;
|
|
175
|
+
src: url(https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPxDcwg.woff2)
|
|
176
|
+
format('woff2');
|
|
177
|
+
unicode-range:
|
|
178
|
+
U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329,
|
|
179
|
+
U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
|
180
|
+
}
|
|
181
|
+
/* latin-ext */
|
|
182
|
+
@font-face {
|
|
183
|
+
font-family: 'JetBrains Mono';
|
|
184
|
+
font-style: normal;
|
|
185
|
+
font-weight: 500;
|
|
186
|
+
font-display: swap;
|
|
187
|
+
src: url(https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPx7cwhsk.woff2)
|
|
188
|
+
format('woff2');
|
|
189
|
+
unicode-range:
|
|
190
|
+
U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329,
|
|
191
|
+
U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F,
|
|
192
|
+
U+A720-A7FF;
|
|
193
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nqmcreative/ui — public entry point.
|
|
3
|
+
* Tokens live in `theme.css`; shared tone maps live in `tones.ts`.
|
|
4
|
+
*/
|
|
5
|
+
export { TONES, focusRing, peerFocusRing, toneBorder, toneBorderLeft, toneBorderSoft, toneFill, toneFocusBorder, toneFocusWithinBorder, toneHoverBorder, toneHoverText, tonePeerChecked, tonePeerFocus, toneRing, toneSoft, toneSoftHover, toneSolid, toneSolidHover, toneSurface, toneText } from './tones.js';
|
|
6
|
+
export type { Tone } from './tones.js';
|
|
7
|
+
export { anchored } from './actions/anchor.js';
|
|
8
|
+
export type { Placement, AnchorOptions } from './actions/anchor.js';
|
|
9
|
+
export { clickOutside, focusTrap, focusable, navigateList, portal } from './actions/dismissable.js';
|
|
10
|
+
export type { ClickOutsideOptions, FocusTrapOptions } from './actions/dismissable.js';
|
|
11
|
+
export { toast } from './toast.svelte.js';
|
|
12
|
+
export type { Toast, ToastOptions, ToastAction } from './toast.svelte.js';
|
|
13
|
+
export { locale, setLocale, provideLocale, useLocale, enUS, idID, LocaleStore } from './locale.svelte.js';
|
|
14
|
+
export type { Locale } from './locale.svelte.js';
|
|
15
|
+
export { default as LocaleProvider } from './components/LocaleProvider.svelte';
|
|
16
|
+
export { default as Button } from './components/Button.svelte';
|
|
17
|
+
export type { ButtonVariant, ButtonSize } from './components/Button.svelte';
|
|
18
|
+
export { default as Link } from './components/Link.svelte';
|
|
19
|
+
export { default as Input } from './components/Input.svelte';
|
|
20
|
+
export type { InputSize } from './components/Input.svelte';
|
|
21
|
+
export { default as Textarea } from './components/Textarea.svelte';
|
|
22
|
+
export { default as Select } from './components/Select.svelte';
|
|
23
|
+
export type { SelectOption } from './components/Select.svelte';
|
|
24
|
+
export { default as Checkbox } from './components/Checkbox.svelte';
|
|
25
|
+
export { default as Radio } from './components/Radio.svelte';
|
|
26
|
+
export { default as Switch } from './components/Switch.svelte';
|
|
27
|
+
export type { SwitchSize } from './components/Switch.svelte';
|
|
28
|
+
export { default as Field } from './components/Field.svelte';
|
|
29
|
+
export { default as Label } from './components/Label.svelte';
|
|
30
|
+
export { default as PasswordInput } from './components/PasswordInput.svelte';
|
|
31
|
+
export { default as NumberInput } from './components/NumberInput.svelte';
|
|
32
|
+
export { default as Slider } from './components/Slider.svelte';
|
|
33
|
+
export { default as RadioGroup } from './components/RadioGroup.svelte';
|
|
34
|
+
export type { RadioOption } from './components/RadioGroup.svelte';
|
|
35
|
+
export { default as CheckboxGroup } from './components/CheckboxGroup.svelte';
|
|
36
|
+
export type { CheckboxOption } from './components/CheckboxGroup.svelte';
|
|
37
|
+
export { default as SegmentedControl } from './components/SegmentedControl.svelte';
|
|
38
|
+
export type { SegmentOption, SegmentedSize } from './components/SegmentedControl.svelte';
|
|
39
|
+
export { default as InputGroup } from './components/InputGroup.svelte';
|
|
40
|
+
export { default as Combobox } from './components/Combobox.svelte';
|
|
41
|
+
export type { ComboboxOption } from './components/Combobox.svelte';
|
|
42
|
+
export { default as MultiSelect } from './components/MultiSelect.svelte';
|
|
43
|
+
export type { MultiSelectOption } from './components/MultiSelect.svelte';
|
|
44
|
+
export { default as DatePicker } from './components/DatePicker.svelte';
|
|
45
|
+
export { default as Calendar } from './components/Calendar.svelte';
|
|
46
|
+
export { toISO, fromISO, today, isSameDay, addDays, addMonths, monthGrid, weekdayNames, monthLabel, isOutOfRange, formatISO, parseFormatted } from './date.js';
|
|
47
|
+
export type { DateFormat } from './date.js';
|
|
48
|
+
export { default as Dropzone } from './components/Dropzone.svelte';
|
|
49
|
+
export type { RejectedFile } from './components/Dropzone.svelte';
|
|
50
|
+
export { default as Badge } from './components/Badge.svelte';
|
|
51
|
+
export type { BadgeTone, BadgeVariant, BadgeSize } from './components/Badge.svelte';
|
|
52
|
+
export { default as Avatar } from './components/Avatar.svelte';
|
|
53
|
+
export type { AvatarSize } from './components/Avatar.svelte';
|
|
54
|
+
export { default as AvatarGroup } from './components/AvatarGroup.svelte';
|
|
55
|
+
export { default as Card } from './components/Card.svelte';
|
|
56
|
+
export type { CardVariant } from './components/Card.svelte';
|
|
57
|
+
export { default as Stat } from './components/Stat.svelte';
|
|
58
|
+
export type { StatTrend } from './components/Stat.svelte';
|
|
59
|
+
export { default as Table } from './components/Table.svelte';
|
|
60
|
+
export type { TableColumn, TableSort, SortDirection } from './components/Table.svelte';
|
|
61
|
+
export { default as Kbd } from './components/Kbd.svelte';
|
|
62
|
+
export { default as Alert } from './components/Alert.svelte';
|
|
63
|
+
export type { AlertVariant } from './components/Alert.svelte';
|
|
64
|
+
export { default as Progress } from './components/Progress.svelte';
|
|
65
|
+
export type { ProgressSize } from './components/Progress.svelte';
|
|
66
|
+
export { default as Spinner } from './components/Spinner.svelte';
|
|
67
|
+
export type { SpinnerSize } from './components/Spinner.svelte';
|
|
68
|
+
export { default as Skeleton } from './components/Skeleton.svelte';
|
|
69
|
+
export type { SkeletonVariant } from './components/Skeleton.svelte';
|
|
70
|
+
export { default as EmptyState } from './components/EmptyState.svelte';
|
|
71
|
+
export { default as Toaster } from './components/Toaster.svelte';
|
|
72
|
+
export type { ToasterPosition } from './components/Toaster.svelte';
|
|
73
|
+
export { default as Divider } from './components/Divider.svelte';
|
|
74
|
+
export type { DividerOrientation } from './components/Divider.svelte';
|
|
75
|
+
export { default as Tabs } from './components/Tabs.svelte';
|
|
76
|
+
export type { TabItem, TabsVariant } from './components/Tabs.svelte';
|
|
77
|
+
export { default as Accordion } from './components/Accordion.svelte';
|
|
78
|
+
export { default as AccordionItem } from './components/AccordionItem.svelte';
|
|
79
|
+
export { default as Breadcrumb } from './components/Breadcrumb.svelte';
|
|
80
|
+
export type { BreadcrumbItem } from './components/Breadcrumb.svelte';
|
|
81
|
+
export { default as Pagination } from './components/Pagination.svelte';
|
|
82
|
+
export { default as Steps } from './components/Steps.svelte';
|
|
83
|
+
export type { StepItem } from './components/Steps.svelte';
|
|
84
|
+
export { default as Navbar } from './components/Navbar.svelte';
|
|
85
|
+
export type { NavItem } from './components/Navbar.svelte';
|
|
86
|
+
export { default as Sidebar } from './components/Sidebar.svelte';
|
|
87
|
+
export type { SidebarItem, SidebarSection } from './components/Sidebar.svelte';
|
|
88
|
+
export { default as Footer } from './components/Footer.svelte';
|
|
89
|
+
export type { FooterColumn, FooterLink } from './components/Footer.svelte';
|
|
90
|
+
export { default as Modal } from './components/Modal.svelte';
|
|
91
|
+
export type { ModalSize } from './components/Modal.svelte';
|
|
92
|
+
export { default as Drawer } from './components/Drawer.svelte';
|
|
93
|
+
export type { DrawerSide, DrawerSize } from './components/Drawer.svelte';
|
|
94
|
+
export { default as ConfirmDialog } from './components/ConfirmDialog.svelte';
|
|
95
|
+
export { default as CommandPalette } from './components/CommandPalette.svelte';
|
|
96
|
+
export type { CommandItem } from './components/CommandPalette.svelte';
|
|
97
|
+
export { default as ContextMenu } from './components/ContextMenu.svelte';
|
|
98
|
+
export { default as Dropdown } from './components/Dropdown.svelte';
|
|
99
|
+
export { default as MenuItem } from './components/MenuItem.svelte';
|
|
100
|
+
export { default as MenuSeparator } from './components/MenuSeparator.svelte';
|
|
101
|
+
export { default as Popover } from './components/Popover.svelte';
|
|
102
|
+
export { default as ThemeToggle, applyTheme, storedTheme } from './components/ThemeToggle.svelte';
|
|
103
|
+
export type { Theme } from './components/ThemeToggle.svelte';
|
|
104
|
+
export { default as Tooltip } from './components/Tooltip.svelte';
|
|
105
|
+
export type { TooltipPlacement } from './components/Tooltip.svelte';
|