@skylab-kulubu/skylcn-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 +100 -0
- package/dist/assets/skylab-mark.d.ts +5 -0
- package/dist/assets/skylab-mark.d.ts.map +1 -0
- package/dist/assets/skylab-mark.js +29 -0
- package/dist/assets/skylab-mark.js.map +1 -0
- package/dist/charts/chart-frame.d.ts +42 -0
- package/dist/charts/chart-frame.d.ts.map +1 -0
- package/dist/charts/chart-frame.js +33 -0
- package/dist/charts/chart-frame.js.map +1 -0
- package/dist/charts/charts.d.ts +84 -0
- package/dist/charts/charts.d.ts.map +1 -0
- package/dist/charts/charts.js +194 -0
- package/dist/charts/charts.js.map +1 -0
- package/dist/charts/index.d.ts +3 -0
- package/dist/charts/index.d.ts.map +1 -0
- package/dist/charts/index.js +3 -0
- package/dist/charts/index.js.map +1 -0
- package/dist/components/accordion.d.ts +7 -0
- package/dist/components/accordion.d.ts.map +1 -0
- package/dist/components/accordion.js +17 -0
- package/dist/components/accordion.js.map +1 -0
- package/dist/components/app-shell.d.ts +96 -0
- package/dist/components/app-shell.d.ts.map +1 -0
- package/dist/components/app-shell.js +191 -0
- package/dist/components/app-shell.js.map +1 -0
- package/dist/components/avatar.d.ts +28 -0
- package/dist/components/avatar.d.ts.map +1 -0
- package/dist/components/avatar.js +26 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/badge.d.ts +41 -0
- package/dist/components/badge.d.ts.map +1 -0
- package/dist/components/badge.js +42 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/bar-list.d.ts +33 -0
- package/dist/components/bar-list.d.ts.map +1 -0
- package/dist/components/bar-list.js +31 -0
- package/dist/components/bar-list.js.map +1 -0
- package/dist/components/breadcrumbs.d.ts +16 -0
- package/dist/components/breadcrumbs.d.ts.map +1 -0
- package/dist/components/breadcrumbs.js +21 -0
- package/dist/components/breadcrumbs.js.map +1 -0
- package/dist/components/button.d.ts +30 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.js +51 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/calendar.d.ts +44 -0
- package/dist/components/calendar.d.ts.map +1 -0
- package/dist/components/calendar.js +93 -0
- package/dist/components/calendar.js.map +1 -0
- package/dist/components/card.d.ts +38 -0
- package/dist/components/card.d.ts.map +1 -0
- package/dist/components/card.js +38 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/carousel.d.ts +42 -0
- package/dist/components/carousel.d.ts.map +1 -0
- package/dist/components/carousel.js +92 -0
- package/dist/components/carousel.js.map +1 -0
- package/dist/components/checkbox.d.ts +3 -0
- package/dist/components/checkbox.d.ts.map +1 -0
- package/dist/components/checkbox.js +9 -0
- package/dist/components/checkbox.js.map +1 -0
- package/dist/components/command.d.ts +31 -0
- package/dist/components/command.d.ts.map +1 -0
- package/dist/components/command.js +91 -0
- package/dist/components/command.js.map +1 -0
- package/dist/components/copy-button.d.ts +10 -0
- package/dist/components/copy-button.d.ts.map +1 -0
- package/dist/components/copy-button.js +23 -0
- package/dist/components/copy-button.js.map +1 -0
- package/dist/components/data-list.d.ts +70 -0
- package/dist/components/data-list.d.ts.map +1 -0
- package/dist/components/data-list.js +119 -0
- package/dist/components/data-list.js.map +1 -0
- package/dist/components/dialog.d.ts +41 -0
- package/dist/components/dialog.d.ts.map +1 -0
- package/dist/components/dialog.js +49 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/display-extra.d.ts +91 -0
- package/dist/components/display-extra.d.ts.map +1 -0
- package/dist/components/display-extra.js +91 -0
- package/dist/components/display-extra.js.map +1 -0
- package/dist/components/drawer.d.ts +22 -0
- package/dist/components/drawer.d.ts.map +1 -0
- package/dist/components/drawer.js +50 -0
- package/dist/components/drawer.js.map +1 -0
- package/dist/components/feedback.d.ts +63 -0
- package/dist/components/feedback.d.ts.map +1 -0
- package/dist/components/feedback.js +59 -0
- package/dist/components/feedback.js.map +1 -0
- package/dist/components/field.d.ts +21 -0
- package/dist/components/field.d.ts.map +1 -0
- package/dist/components/field.js +38 -0
- package/dist/components/field.js.map +1 -0
- package/dist/components/form-extra.d.ts +58 -0
- package/dist/components/form-extra.d.ts.map +1 -0
- package/dist/components/form-extra.js +51 -0
- package/dist/components/form-extra.js.map +1 -0
- package/dist/components/icon-swap.d.ts +15 -0
- package/dist/components/icon-swap.d.ts.map +1 -0
- package/dist/components/icon-swap.js +13 -0
- package/dist/components/icon-swap.js.map +1 -0
- package/dist/components/list.d.ts +43 -0
- package/dist/components/list.d.ts.map +1 -0
- package/dist/components/list.js +30 -0
- package/dist/components/list.js.map +1 -0
- package/dist/components/menu.d.ts +41 -0
- package/dist/components/menu.d.ts.map +1 -0
- package/dist/components/menu.js +67 -0
- package/dist/components/menu.js.map +1 -0
- package/dist/components/month-calendar.d.ts +38 -0
- package/dist/components/month-calendar.d.ts.map +1 -0
- package/dist/components/month-calendar.js +64 -0
- package/dist/components/month-calendar.js.map +1 -0
- package/dist/components/motion.d.ts +43 -0
- package/dist/components/motion.d.ts.map +1 -0
- package/dist/components/motion.js +56 -0
- package/dist/components/motion.js.map +1 -0
- package/dist/components/navigation-menu.d.ts +28 -0
- package/dist/components/navigation-menu.d.ts.map +1 -0
- package/dist/components/navigation-menu.js +26 -0
- package/dist/components/navigation-menu.js.map +1 -0
- package/dist/components/page-header.d.ts +45 -0
- package/dist/components/page-header.d.ts.map +1 -0
- package/dist/components/page-header.js +37 -0
- package/dist/components/page-header.js.map +1 -0
- package/dist/components/pagination.d.ts +19 -0
- package/dist/components/pagination.d.ts.map +1 -0
- package/dist/components/pagination.js +70 -0
- package/dist/components/pagination.js.map +1 -0
- package/dist/components/popover.d.ts +10 -0
- package/dist/components/popover.d.ts.map +1 -0
- package/dist/components/popover.js +15 -0
- package/dist/components/popover.js.map +1 -0
- package/dist/components/preview-card.d.ts +11 -0
- package/dist/components/preview-card.d.ts.map +1 -0
- package/dist/components/preview-card.js +18 -0
- package/dist/components/preview-card.js.map +1 -0
- package/dist/components/proportion-bar.d.ts +16 -0
- package/dist/components/proportion-bar.d.ts.map +1 -0
- package/dist/components/proportion-bar.js +20 -0
- package/dist/components/proportion-bar.js.map +1 -0
- package/dist/components/radio-group.d.ts +11 -0
- package/dist/components/radio-group.d.ts.map +1 -0
- package/dist/components/radio-group.js +13 -0
- package/dist/components/radio-group.js.map +1 -0
- package/dist/components/reveal.d.ts +19 -0
- package/dist/components/reveal.d.ts.map +1 -0
- package/dist/components/reveal.js +25 -0
- package/dist/components/reveal.js.map +1 -0
- package/dist/components/segmented-control.d.ts +16 -0
- package/dist/components/segmented-control.d.ts.map +1 -0
- package/dist/components/segmented-control.js +21 -0
- package/dist/components/segmented-control.js.map +1 -0
- package/dist/components/select.d.ts +25 -0
- package/dist/components/select.d.ts.map +1 -0
- package/dist/components/select.js +33 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/side-nav.d.ts +33 -0
- package/dist/components/side-nav.d.ts.map +1 -0
- package/dist/components/side-nav.js +52 -0
- package/dist/components/side-nav.js.map +1 -0
- package/dist/components/skeleton.d.ts +4 -0
- package/dist/components/skeleton.d.ts.map +1 -0
- package/dist/components/skeleton.js +7 -0
- package/dist/components/skeleton.js.map +1 -0
- package/dist/components/skylab-loader.d.ts +10 -0
- package/dist/components/skylab-loader.d.ts.map +1 -0
- package/dist/components/skylab-loader.js +12 -0
- package/dist/components/skylab-loader.js.map +1 -0
- package/dist/components/sparkline.d.ts +12 -0
- package/dist/components/sparkline.d.ts.map +1 -0
- package/dist/components/sparkline.js +26 -0
- package/dist/components/sparkline.js.map +1 -0
- package/dist/components/state-card.d.ts +27 -0
- package/dist/components/state-card.d.ts.map +1 -0
- package/dist/components/state-card.js +17 -0
- package/dist/components/state-card.js.map +1 -0
- package/dist/components/switch.d.ts +15 -0
- package/dist/components/switch.d.ts.map +1 -0
- package/dist/components/switch.js +12 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/tabs.d.ts +8 -0
- package/dist/components/tabs.d.ts.map +1 -0
- package/dist/components/tabs.js +17 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/toast.d.ts +17 -0
- package/dist/components/toast.d.ts.map +1 -0
- package/dist/components/toast.js +30 -0
- package/dist/components/toast.js.map +1 -0
- package/dist/components/tooltip.d.ts +15 -0
- package/dist/components/tooltip.d.ts.map +1 -0
- package/dist/components/tooltip.js +13 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/components/tree.d.ts +26 -0
- package/dist/components/tree.d.ts.map +1 -0
- package/dist/components/tree.js +92 -0
- package/dist/components/tree.js.map +1 -0
- package/dist/components/trend-badge.d.ts +13 -0
- package/dist/components/trend-badge.d.ts.map +1 -0
- package/dist/components/trend-badge.js +22 -0
- package/dist/components/trend-badge.js.map +1 -0
- package/dist/data-table/data-table.d.ts +59 -0
- package/dist/data-table/data-table.d.ts.map +1 -0
- package/dist/data-table/data-table.js +207 -0
- package/dist/data-table/data-table.js.map +1 -0
- package/dist/data-table/index.d.ts +2 -0
- package/dist/data-table/index.d.ts.map +1 -0
- package/dist/data-table/index.js +2 -0
- package/dist/data-table/index.js.map +1 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/cn.d.ts +2 -0
- package/dist/lib/cn.d.ts.map +1 -0
- package/dist/lib/cn.js +2 -0
- package/dist/lib/cn.js.map +1 -0
- package/dist/lib/motion-preference.d.ts +11 -0
- package/dist/lib/motion-preference.d.ts.map +1 -0
- package/dist/lib/motion-preference.js +42 -0
- package/dist/lib/motion-preference.js.map +1 -0
- package/dist/lib/motion-tokens.d.ts +55 -0
- package/dist/lib/motion-tokens.d.ts.map +1 -0
- package/dist/lib/motion-tokens.js +26 -0
- package/dist/lib/motion-tokens.js.map +1 -0
- package/dist/lib/motion.d.ts +3 -0
- package/dist/lib/motion.d.ts.map +1 -0
- package/dist/lib/motion.js +19 -0
- package/dist/lib/motion.js.map +1 -0
- package/dist/lib/provider.d.ts +160 -0
- package/dist/lib/provider.d.ts.map +1 -0
- package/dist/lib/provider.js +156 -0
- package/dist/lib/provider.js.map +1 -0
- package/dist/lib/theme-script.d.ts +15 -0
- package/dist/lib/theme-script.d.ts.map +1 -0
- package/dist/lib/theme-script.js +15 -0
- package/dist/lib/theme-script.js.map +1 -0
- package/dist/lib/theme.d.ts +13 -0
- package/dist/lib/theme.d.ts.map +1 -0
- package/dist/lib/theme.js +78 -0
- package/dist/lib/theme.js.map +1 -0
- package/dist/lib/use-pending-indicator.d.ts +7 -0
- package/dist/lib/use-pending-indicator.d.ts.map +1 -0
- package/dist/lib/use-pending-indicator.js +27 -0
- package/dist/lib/use-pending-indicator.js.map +1 -0
- package/dist/lib/use-reduced-motion.d.ts +7 -0
- package/dist/lib/use-reduced-motion.d.ts.map +1 -0
- package/dist/lib/use-reduced-motion.js +28 -0
- package/dist/lib/use-reduced-motion.js.map +1 -0
- package/dist/styles/theme.css +368 -0
- package/dist/styles/tokens.css +248 -0
- package/package.json +90 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { type LucideIcon } from 'lucide-react';
|
|
2
|
+
import { type ComponentProps, type ReactNode } from 'react';
|
|
3
|
+
export type DescriptionItem = {
|
|
4
|
+
label: ReactNode;
|
|
5
|
+
value: ReactNode;
|
|
6
|
+
};
|
|
7
|
+
/** Labelled facts about one thing, for detail pages: e-mail, team, joined, role. */
|
|
8
|
+
export declare function DescriptionList({ items, columns, className, }: {
|
|
9
|
+
items: readonly DescriptionItem[];
|
|
10
|
+
/** Columns from the sm breakpoint; one column on phones. */
|
|
11
|
+
columns?: 1 | 2 | 3;
|
|
12
|
+
className?: string;
|
|
13
|
+
}): import("react").JSX.Element;
|
|
14
|
+
export type TimelineItem = {
|
|
15
|
+
id: string;
|
|
16
|
+
title: ReactNode;
|
|
17
|
+
description?: ReactNode;
|
|
18
|
+
/** When it happened, already formatted, such as "2 saat önce". */
|
|
19
|
+
time?: ReactNode;
|
|
20
|
+
icon?: LucideIcon;
|
|
21
|
+
/** Someone who did it, shown instead of an icon. */
|
|
22
|
+
person?: {
|
|
23
|
+
name: string;
|
|
24
|
+
src?: string | null;
|
|
25
|
+
};
|
|
26
|
+
tone?: 'neutral' | 'brand' | 'success' | 'warning' | 'danger';
|
|
27
|
+
};
|
|
28
|
+
/** What happened, in order, along a line: an approval's history, a member's activity, an event programme. */
|
|
29
|
+
export declare function Timeline({ items, className, }: {
|
|
30
|
+
items: readonly TimelineItem[];
|
|
31
|
+
className?: string;
|
|
32
|
+
}): import("react").JSX.Element;
|
|
33
|
+
export type Step = {
|
|
34
|
+
id: string;
|
|
35
|
+
label: ReactNode;
|
|
36
|
+
description?: ReactNode;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Where a multi-step task stands: done steps ticked, the current one ringed.
|
|
40
|
+
* Pair it with Swap for the step's content.
|
|
41
|
+
*/
|
|
42
|
+
export declare function Stepper({ steps, current, className, }: {
|
|
43
|
+
steps: readonly Step[];
|
|
44
|
+
/** Index of the current step. */
|
|
45
|
+
current: number;
|
|
46
|
+
className?: string;
|
|
47
|
+
}): import("react").JSX.Element;
|
|
48
|
+
/** A few people as overlapping avatars, with how many more there are. */
|
|
49
|
+
export declare function AvatarGroup({ people, max, size, className, }: {
|
|
50
|
+
people: readonly {
|
|
51
|
+
name: string;
|
|
52
|
+
src?: string | null;
|
|
53
|
+
}[];
|
|
54
|
+
max?: number;
|
|
55
|
+
size?: 'sm' | 'md';
|
|
56
|
+
className?: string;
|
|
57
|
+
}): import("react").JSX.Element;
|
|
58
|
+
export type DropzoneProps = {
|
|
59
|
+
onFiles: (files: File[]) => void;
|
|
60
|
+
/** File types the picker offers, such as "image/*,.pdf". */
|
|
61
|
+
accept?: string;
|
|
62
|
+
multiple?: boolean;
|
|
63
|
+
/** What the files are for, such as "Özgeçmiş (PDF, en fazla 5 MB)". */
|
|
64
|
+
hint?: ReactNode;
|
|
65
|
+
disabled?: boolean;
|
|
66
|
+
className?: string;
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Drop files here or press to pick them; dragging is never the only way in.
|
|
70
|
+
* The frame lights up while files are held over it.
|
|
71
|
+
*/
|
|
72
|
+
export declare function Dropzone({ onFiles, accept, multiple, hint, disabled, className, }: DropzoneProps): import("react").JSX.Element;
|
|
73
|
+
/**
|
|
74
|
+
* Actions for the rows a reader has picked, rising from the bottom while
|
|
75
|
+
* anything is selected: move, e-mail, remove.
|
|
76
|
+
*/
|
|
77
|
+
export declare function BulkBar({ count, onClear, children, className, }: {
|
|
78
|
+
count: number;
|
|
79
|
+
onClear: () => void;
|
|
80
|
+
/** The actions, usually small buttons. */
|
|
81
|
+
children: ReactNode;
|
|
82
|
+
className?: string;
|
|
83
|
+
}): import("react").JSX.Element;
|
|
84
|
+
export type BannerProps = Omit<ComponentProps<'div'>, 'title'> & {
|
|
85
|
+
icon?: LucideIcon;
|
|
86
|
+
action?: ReactNode;
|
|
87
|
+
onDismiss?: () => void;
|
|
88
|
+
};
|
|
89
|
+
/** A strip across the top of a page for news everyone should see once: a new console, a maintenance window. */
|
|
90
|
+
export declare function Banner({ icon: Icon, action, onDismiss, className, children, ...props }: BannerProps): import("react").JSX.Element;
|
|
91
|
+
//# sourceMappingURL=display-extra.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display-extra.d.ts","sourceRoot":"","sources":["../../src/components/display-extra.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Check, FileUp, Megaphone, X } from 'lucide-react';
|
|
4
|
+
import { AnimatePresence, m } from 'motion/react';
|
|
5
|
+
import { useId, useRef, useState } from 'react';
|
|
6
|
+
import { cn } from '../lib/cn.js';
|
|
7
|
+
import { transitions } from '../lib/motion-tokens.js';
|
|
8
|
+
import { useSkylcn } from '../lib/provider.js';
|
|
9
|
+
import { Avatar } from './avatar.js';
|
|
10
|
+
/** Labelled facts about one thing, for detail pages: e-mail, team, joined, role. */
|
|
11
|
+
export function DescriptionList({ items, columns = 2, className, }) {
|
|
12
|
+
return (_jsx("dl", { "data-slot": "description-list", className: cn('grid gap-x-6 gap-y-4', columns === 2 && 'sm:grid-cols-2', columns === 3 && 'sm:grid-cols-3', className), children: items.map((item, i) => (_jsxs("div", { className: "flex min-w-0 flex-col gap-1", children: [_jsx("dt", { className: "text-3xs font-medium tracking-label text-subtle-foreground uppercase", children: item.label }), _jsx("dd", { className: "min-w-0 text-sm break-words text-foreground", children: item.value })] }, i))) }));
|
|
13
|
+
}
|
|
14
|
+
const TONE = {
|
|
15
|
+
neutral: 'border-border bg-muted text-muted-foreground',
|
|
16
|
+
brand: 'border-skylab-400/40 bg-skylab-500/10 text-skylab-300',
|
|
17
|
+
success: 'border-success/40 bg-success/10 text-success',
|
|
18
|
+
warning: 'border-warning/40 bg-warning/10 text-warning',
|
|
19
|
+
danger: 'border-destructive/40 bg-destructive/10 text-destructive',
|
|
20
|
+
};
|
|
21
|
+
/** What happened, in order, along a line: an approval's history, a member's activity, an event programme. */
|
|
22
|
+
export function Timeline({ items, className, }) {
|
|
23
|
+
return (_jsx("ol", { "data-slot": "timeline", className: cn('flex flex-col', className), children: items.map((item, i) => {
|
|
24
|
+
const Icon = item.icon;
|
|
25
|
+
return (_jsxs("li", { className: "relative flex gap-3 pb-5 last:pb-0", children: [i < items.length - 1 ? (_jsx("span", { "aria-hidden": true, className: "absolute top-8 bottom-0 left-3.5 w-px -translate-x-1/2 bg-border" })) : null, item.person ? (_jsx(Avatar, { name: item.person.name, src: item.person.src, size: "sm" })) : (_jsx("span", { className: cn('grid size-7 shrink-0 place-items-center rounded-full border', TONE[item.tone ?? 'neutral']), children: Icon ? (_jsx(Icon, { className: "size-3.5", "aria-hidden": true })) : (_jsx("span", { className: "size-1.5 rounded-full bg-current" })) })), _jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-0.5 pt-1", children: [_jsxs("div", { className: "flex flex-wrap items-baseline justify-between gap-x-3", children: [_jsx("p", { className: "text-sm text-foreground", children: item.title }), item.time ? (_jsx("p", { className: "text-2xs text-subtle-foreground tabular-nums", children: item.time })) : null] }), item.description ? (_jsx("div", { className: "text-xs leading-relaxed text-muted-foreground", children: item.description })) : null] })] }, item.id));
|
|
26
|
+
}) }));
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Where a multi-step task stands: done steps ticked, the current one ringed.
|
|
30
|
+
* Pair it with Swap for the step's content.
|
|
31
|
+
*/
|
|
32
|
+
export function Stepper({ steps, current, className, }) {
|
|
33
|
+
return (_jsx("ol", { "data-slot": "stepper", className: cn('flex w-full items-start gap-2', className), children: steps.map((step, i) => {
|
|
34
|
+
const done = i < current;
|
|
35
|
+
const active = i === current;
|
|
36
|
+
return (_jsxs("li", { "aria-current": active ? 'step' : undefined, className: "flex min-w-0 flex-1 flex-col gap-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: cn('grid size-6 shrink-0 place-items-center rounded-full border text-2xs font-semibold tabular-nums transition-colors duration-(--motion-duration-base)', done && 'border-skylab-400 bg-skylab-500 text-primary-foreground', active &&
|
|
37
|
+
'border-skylab-400 bg-skylab-500/15 text-skylab-300 ring-4 ring-skylab-500/10', !done && !active && 'border-border text-subtle-foreground'), children: done ? _jsx(Check, { className: "size-3.5", "aria-hidden": true }) : i + 1 }), i < steps.length - 1 ? (_jsx("span", { "aria-hidden": true, className: "h-px flex-1 overflow-hidden rounded-full bg-border", children: _jsx("span", { className: "block h-full bg-skylab-400 transition-[width] duration-(--motion-duration-slow) ease-enter", style: { width: done ? '100%' : '0%' } }) })) : null] }), _jsxs("div", { className: "min-w-0 pr-2", children: [_jsx("p", { className: cn('truncate text-xs font-medium', active || done ? 'text-foreground' : 'text-muted-foreground'), children: step.label }), step.description ? (_jsx("p", { className: "hidden truncate text-2xs text-subtle-foreground sm:block", children: step.description })) : null] })] }, step.id));
|
|
38
|
+
}) }));
|
|
39
|
+
}
|
|
40
|
+
/* Avatar group */
|
|
41
|
+
/** A few people as overlapping avatars, with how many more there are. */
|
|
42
|
+
export function AvatarGroup({ people, max = 4, size = 'sm', className, }) {
|
|
43
|
+
const { messages } = useSkylcn();
|
|
44
|
+
const shown = people.slice(0, max);
|
|
45
|
+
const rest = people.length - shown.length;
|
|
46
|
+
return (_jsxs("div", { "data-slot": "avatar-group", className: cn('flex items-center', className), children: [shown.map((person, i) => (_jsx(Avatar, { name: person.name, src: person.src, size: size, className: cn('ring-2 ring-background', i > 0 && '-ml-2') }, `${person.name}-${i}`))), rest > 0 ? (_jsxs("span", { title: messages.morePeople(rest), className: cn('-ml-2 grid shrink-0 place-items-center rounded-full border border-border bg-muted text-3xs font-semibold text-muted-foreground tabular-nums ring-2 ring-background', size === 'sm' ? 'size-7' : 'size-9'), children: ["+", rest] })) : null] }));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Drop files here or press to pick them; dragging is never the only way in.
|
|
50
|
+
* The frame lights up while files are held over it.
|
|
51
|
+
*/
|
|
52
|
+
export function Dropzone({ onFiles, accept, multiple = false, hint, disabled = false, className, }) {
|
|
53
|
+
const { messages } = useSkylcn();
|
|
54
|
+
const input = useRef(null);
|
|
55
|
+
const [over, setOver] = useState(false);
|
|
56
|
+
const id = useId();
|
|
57
|
+
return (_jsxs("div", { "data-slot": "dropzone", "data-over": over || undefined, onDragOver: (event) => {
|
|
58
|
+
if (disabled)
|
|
59
|
+
return;
|
|
60
|
+
event.preventDefault();
|
|
61
|
+
setOver(true);
|
|
62
|
+
}, onDragLeave: () => setOver(false), onDrop: (event) => {
|
|
63
|
+
event.preventDefault();
|
|
64
|
+
setOver(false);
|
|
65
|
+
if (disabled)
|
|
66
|
+
return;
|
|
67
|
+
const files = Array.from(event.dataTransfer.files);
|
|
68
|
+
if (files.length)
|
|
69
|
+
onFiles(multiple ? files : files.slice(0, 1));
|
|
70
|
+
}, className: cn('relative flex flex-col items-center justify-center gap-2 rounded-xl border border-dashed border-border-strong px-6 py-8 text-center', 'transition-[border-color,background-color] duration-(--motion-duration-fast)', over && 'border-skylab-400 bg-skylab-500/10', disabled && 'opacity-50', className), children: [_jsx("span", { className: cn('grid size-10 place-items-center rounded-full bg-muted text-muted-foreground transition-transform duration-(--motion-duration-base) ease-enter', over && 'scale-110 text-skylab-300'), children: _jsx(FileUp, { className: "size-5", "aria-hidden": true }) }), _jsxs("label", { htmlFor: id, className: "text-sm text-foreground", children: [_jsx("span", { className: "cursor-pointer font-medium text-skylab-300 underline-offset-4 hover:underline", children: messages.chooseFile }), ' ', messages.orDropHere] }), hint ? _jsx("p", { className: "text-2xs text-subtle-foreground", children: hint }) : null, _jsx("input", { ref: input, id: id, type: "file", accept: accept, multiple: multiple, disabled: disabled, className: "sr-only", onChange: (event) => {
|
|
71
|
+
const files = Array.from(event.target.files ?? []);
|
|
72
|
+
if (files.length)
|
|
73
|
+
onFiles(files);
|
|
74
|
+
event.target.value = '';
|
|
75
|
+
} })] }));
|
|
76
|
+
}
|
|
77
|
+
/* Bulk action bar */
|
|
78
|
+
/**
|
|
79
|
+
* Actions for the rows a reader has picked, rising from the bottom while
|
|
80
|
+
* anything is selected: move, e-mail, remove.
|
|
81
|
+
*/
|
|
82
|
+
export function BulkBar({ count, onClear, children, className, }) {
|
|
83
|
+
const { messages } = useSkylcn();
|
|
84
|
+
return (_jsx(AnimatePresence, { children: count > 0 ? (_jsxs(m.div, { role: "toolbar", "aria-label": messages.selected(count), initial: { y: 24, opacity: 0 }, animate: { y: 0, opacity: 1, transition: transitions.spring }, exit: { y: 24, opacity: 0, transition: transitions.exit }, className: cn('fixed inset-x-4 bottom-4 z-40 mx-auto flex max-w-xl items-center gap-2 rounded-xl border border-border-strong bg-popover px-3 py-2 shadow-overlay sm:bottom-6', 'pb-[calc(0.5rem+env(safe-area-inset-bottom))] sm:pb-2', className), children: [_jsx("span", { className: "text-xs text-foreground tabular-nums", children: messages.selected(count) }), _jsx("span", { "aria-hidden": true, className: "h-4 w-px bg-border" }), _jsx("div", { className: "flex min-w-0 flex-1 flex-wrap items-center gap-1.5", children: children }), _jsx("button", { type: "button", onClick: onClear, "aria-label": messages.clearSelection, className: "grid size-7 place-items-center rounded-md text-subtle-foreground outline-hidden hover:bg-accent hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring", children: _jsx(X, { className: "size-4" }) })] }, "bulk")) : null }));
|
|
85
|
+
}
|
|
86
|
+
/** A strip across the top of a page for news everyone should see once: a new console, a maintenance window. */
|
|
87
|
+
export function Banner({ icon: Icon = Megaphone, action, onDismiss, className, children, ...props }) {
|
|
88
|
+
const { messages } = useSkylcn();
|
|
89
|
+
return (_jsxs("div", { "data-slot": "banner", role: "status", className: cn('flex items-center gap-3 border-b border-skylab-400/20 bg-skylab-500/10 px-4 py-2 text-xs text-foreground', className), ...props, children: [_jsx(Icon, { className: "size-4 shrink-0 text-skylab-300", "aria-hidden": true }), _jsx("div", { className: "min-w-0 flex-1", children: children }), action, onDismiss ? (_jsx("button", { type: "button", onClick: onDismiss, "aria-label": messages.close, className: "grid size-6 place-items-center rounded-md text-subtle-foreground outline-hidden hover:bg-accent hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring", children: _jsx(X, { className: "size-3.5" }) })) : null] }));
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=display-extra.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display-extra.js","sourceRoot":"","sources":["../../src/components/display-extra.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Drawer as DrawerPrimitive } from '@base-ui/react/drawer';
|
|
2
|
+
import { type ComponentProps, type ReactNode } from 'react';
|
|
3
|
+
export type DrawerSide = 'right' | 'left' | 'bottom';
|
|
4
|
+
export type DrawerProps = DrawerPrimitive.Root.Props & {
|
|
5
|
+
/** The edge it slides from, and the way a swipe sends it back. */
|
|
6
|
+
side?: DrawerSide;
|
|
7
|
+
};
|
|
8
|
+
/** A panel that slides in from an edge and is swiped, tapped outside or Esc'd away. */
|
|
9
|
+
export declare function Drawer({ side, ...props }: DrawerProps): import("react").JSX.Element;
|
|
10
|
+
export declare const DrawerTrigger: DrawerPrimitive.Trigger;
|
|
11
|
+
export declare const DrawerClose: DrawerPrimitive.Close;
|
|
12
|
+
export type DrawerContentProps = DrawerPrimitive.Popup.Props & {
|
|
13
|
+
/** Render inside this element instead of the page body, e.g. the admin content panel. */
|
|
14
|
+
container?: DrawerPrimitive.Portal.Props['container'];
|
|
15
|
+
children?: ReactNode;
|
|
16
|
+
};
|
|
17
|
+
export declare function DrawerContent({ className, container, children, ...props }: DrawerContentProps): import("react").JSX.Element;
|
|
18
|
+
export declare function DrawerHeader({ className, ...props }: ComponentProps<'div'>): import("react").JSX.Element;
|
|
19
|
+
export declare function DrawerTitle({ className, ...props }: DrawerPrimitive.Title.Props): import("react").JSX.Element;
|
|
20
|
+
export declare function DrawerDescription({ className, ...props }: DrawerPrimitive.Description.Props): import("react").JSX.Element;
|
|
21
|
+
export declare function DrawerBody({ className, ...props }: ComponentProps<'div'>): import("react").JSX.Element;
|
|
22
|
+
//# sourceMappingURL=drawer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drawer.d.ts","sourceRoot":"","sources":["../../src/components/drawer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAA6B,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvF,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAMrD,MAAM,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,GAAG;IACrD,kEAAkE;IAClE,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB,CAAC;AAEF,uFAAuF;AACvF,wBAAgB,MAAM,CAAC,EAAE,IAAc,EAAE,GAAG,KAAK,EAAE,EAAE,WAAW,+BAM/D;AAED,eAAO,MAAM,aAAa,yBAA0B,CAAC;AACrD,eAAO,MAAM,WAAW,uBAAwB,CAAC;AAiBjD,MAAM,MAAM,kBAAkB,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG;IAC7D,yFAAyF;IACzF,SAAS,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACtD,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,wBAAgB,aAAa,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,kBAAkB,+BA8E7F;AAED,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,KAAK,CAAC,+BAU1E;AAED,wBAAgB,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,+BAU/E;AAED,wBAAgB,iBAAiB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,eAAe,CAAC,WAAW,CAAC,KAAK,+BAO3F;AAED,wBAAgB,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,KAAK,CAAC,+BAIxE"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { Drawer as DrawerPrimitive } from '@base-ui/react/drawer';
|
|
4
|
+
import { ChevronsLeft, ChevronsRight } from 'lucide-react';
|
|
5
|
+
import { createContext, useContext } from 'react';
|
|
6
|
+
import { cn } from '../lib/cn.js';
|
|
7
|
+
import { useSkylcn } from '../lib/provider.js';
|
|
8
|
+
const SideContext = createContext('right');
|
|
9
|
+
const SWIPE = { right: 'right', left: 'left', bottom: 'down' };
|
|
10
|
+
/** A panel that slides in from an edge and is swiped, tapped outside or Esc'd away. */
|
|
11
|
+
export function Drawer({ side = 'right', ...props }) {
|
|
12
|
+
return (_jsx(SideContext.Provider, { value: side, children: _jsx(DrawerPrimitive.Root, { swipeDirection: SWIPE[side], ...props }) }));
|
|
13
|
+
}
|
|
14
|
+
export const DrawerTrigger = DrawerPrimitive.Trigger;
|
|
15
|
+
export const DrawerClose = DrawerPrimitive.Close;
|
|
16
|
+
// Follows the finger while swiping, then settles with a speed that matches the swipe.
|
|
17
|
+
const MOVE = {
|
|
18
|
+
right: '[transform:translateX(var(--drawer-swipe-movement-x))] data-starting-style:[transform:translateX(100%)] data-ending-style:[transform:translateX(100%)]',
|
|
19
|
+
left: '[transform:translateX(var(--drawer-swipe-movement-x))] data-starting-style:[transform:translateX(-100%)] data-ending-style:[transform:translateX(-100%)]',
|
|
20
|
+
bottom: '[transform:translateY(var(--drawer-swipe-movement-y))] data-starting-style:[transform:translateY(100%)] data-ending-style:[transform:translateY(100%)]',
|
|
21
|
+
};
|
|
22
|
+
const PLACE = {
|
|
23
|
+
right: 'inset-y-0 right-0 flex-row',
|
|
24
|
+
left: 'inset-y-0 left-0 flex-row-reverse',
|
|
25
|
+
bottom: 'inset-x-0 bottom-0 flex-col',
|
|
26
|
+
};
|
|
27
|
+
export function DrawerContent({ className, container, children, ...props }) {
|
|
28
|
+
const { messages } = useSkylcn();
|
|
29
|
+
const side = useContext(SideContext);
|
|
30
|
+
const scoped = Boolean(container);
|
|
31
|
+
const EdgeIcon = side === 'left' ? ChevronsLeft : ChevronsRight;
|
|
32
|
+
return (_jsxs(DrawerPrimitive.Portal, { container: container, children: [_jsx(DrawerPrimitive.Backdrop, { className: cn('inset-0 z-50 bg-black opacity-[calc(0.4*(1-var(--drawer-swipe-progress)))] transition-opacity duration-(--motion-duration-slow) ease-enter', 'data-ending-style:opacity-0 data-starting-style:opacity-0 data-swiping:duration-0', scoped ? 'absolute' : 'fixed') }), _jsx(DrawerPrimitive.Viewport, { className: cn('inset-0 z-50', scoped ? 'absolute' : 'fixed'), children: _jsx(DrawerPrimitive.Popup, { "data-slot": "drawer-content", "data-side": side, className: cn('absolute flex outline-hidden', PLACE[side], MOVE[side], 'transition-[transform,opacity] duration-(--motion-duration-spring) ease-spring data-swiping:duration-0', 'data-ending-style:duration-[calc(var(--drawer-swipe-strength,1)*var(--motion-duration-base))] data-ending-style:ease-exit',
|
|
33
|
+
// Reduced motion fades the panel in place instead of sliding it
|
|
34
|
+
'motion-reduce:data-ending-style:[transform:none] motion-reduce:data-ending-style:opacity-0 motion-reduce:data-starting-style:[transform:none] motion-reduce:data-starting-style:opacity-0'), ...props, children: side === 'bottom' ? (_jsxs("div", { className: cn('flex max-h-[85dvh] w-full flex-col overflow-hidden rounded-t-2xl border-t border-border bg-sheet pb-[env(safe-area-inset-bottom)] shadow-overlay', className), children: [_jsx("div", { "aria-hidden": true, className: "mx-auto mt-2.5 mb-1 h-1 w-10 shrink-0 rounded-full bg-border-strong" }), _jsx(DrawerPrimitive.Content, { className: "flex min-h-0 flex-1 flex-col", children: children })] })) : (_jsxs(_Fragment, { children: [_jsx(DrawerPrimitive.Close, { title: messages.closePanel, "aria-label": messages.closePanel, className: cn('group relative flex h-full w-5 items-center justify-center border-y border-border bg-sheet text-subtle-foreground outline-hidden transition-colors hover:text-secondary-foreground focus-visible:text-foreground', side === 'right'
|
|
35
|
+
? '-mr-px rounded-l-full border-l'
|
|
36
|
+
: '-ml-px rounded-r-full border-r'), children: _jsx(EdgeIcon, { className: "size-3.5 opacity-60 transition-transform duration-(--motion-duration-base) group-hover:scale-110 group-hover:opacity-100", strokeWidth: 2.5 }) }), _jsx("div", { className: cn('flex h-full w-[min(92vw,420px)] flex-col overflow-hidden border-y border-border bg-sheet pb-[env(safe-area-inset-bottom)] shadow-overlay', side === 'right' ? 'border-r' : 'border-l', className), children: _jsx(DrawerPrimitive.Content, { className: "flex min-h-0 flex-1 flex-col", children: children }) })] })) }) })] }));
|
|
37
|
+
}
|
|
38
|
+
export function DrawerHeader({ className, ...props }) {
|
|
39
|
+
return (_jsx("div", { className: cn('flex min-h-10 shrink-0 flex-col justify-center gap-0.5 border-b border-border px-4 py-2', className), ...props }));
|
|
40
|
+
}
|
|
41
|
+
export function DrawerTitle({ className, ...props }) {
|
|
42
|
+
return (_jsx(DrawerPrimitive.Title, { className: cn('min-w-0 truncate text-sm font-semibold tracking-wide text-foreground', className), ...props }));
|
|
43
|
+
}
|
|
44
|
+
export function DrawerDescription({ className, ...props }) {
|
|
45
|
+
return (_jsx(DrawerPrimitive.Description, { className: cn('text-2xs text-subtle-foreground', className), ...props }));
|
|
46
|
+
}
|
|
47
|
+
export function DrawerBody({ className, ...props }) {
|
|
48
|
+
return (_jsx("div", { className: cn('scrollbar min-h-0 flex-1 overflow-y-auto p-4', className), ...props }));
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=drawer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drawer.js","sourceRoot":"","sources":["../../src/components/drawer.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAuC,MAAM,OAAO,CAAC;AACvF,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAI/C,MAAM,WAAW,GAAG,aAAa,CAAa,OAAO,CAAC,CAAC;AAEvD,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAW,CAAC;AAOxE,uFAAuF;AACvF,MAAM,UAAU,MAAM,CAAC,EAAE,IAAI,GAAG,OAAO,EAAE,GAAG,KAAK,EAAe;IAC9D,OAAO,CACL,KAAC,WAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,IAAI,YAC/B,KAAC,eAAe,CAAC,IAAI,IAAC,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,KAAM,KAAK,GAAI,GAC3C,CACxB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC,OAAO,CAAC;AACrD,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAC,KAAK,CAAC;AAEjD,sFAAsF;AACtF,MAAM,IAAI,GAAG;IACX,KAAK,EACH,wJAAwJ;IAC1J,IAAI,EAAE,0JAA0J;IAChK,MAAM,EACJ,wJAAwJ;CAClJ,CAAC;AAEX,MAAM,KAAK,GAAG;IACZ,KAAK,EAAE,4BAA4B;IACnC,IAAI,EAAE,mCAAmC;IACzC,MAAM,EAAE,6BAA6B;CAC7B,CAAC;AAQX,MAAM,UAAU,aAAa,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAsB;IAC5F,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC;IAChE,OAAO,CACL,MAAC,eAAe,CAAC,MAAM,IAAC,SAAS,EAAE,SAAS,aAC1C,KAAC,eAAe,CAAC,QAAQ,IACvB,SAAS,EAAE,EAAE,CACX,4IAA4I,EAC5I,mFAAmF,EACnF,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAC9B,GACD,EACF,KAAC,eAAe,CAAC,QAAQ,IAAC,SAAS,EAAE,EAAE,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,YACpF,KAAC,eAAe,CAAC,KAAK,iBACV,gBAAgB,eACf,IAAI,EACf,SAAS,EAAE,EAAE,CACX,8BAA8B,EAC9B,KAAK,CAAC,IAAI,CAAC,EACX,IAAI,CAAC,IAAI,CAAC,EACV,wGAAwG,EACxG,2HAA2H;oBAC3H,gEAAgE;oBAChE,2LAA2L,CAC5L,KACG,KAAK,YAER,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CACnB,eACE,SAAS,EAAE,EAAE,CACX,kJAAkJ,EAClJ,SAAS,CACV,aAED,mCAEE,SAAS,EAAC,qEAAqE,GAC/E,EACF,KAAC,eAAe,CAAC,OAAO,IAAC,SAAS,EAAC,8BAA8B,YAC9D,QAAQ,GACe,IACtB,CACP,CAAC,CAAC,CAAC,CACF,8BACE,KAAC,eAAe,CAAC,KAAK,IACpB,KAAK,EAAE,QAAQ,CAAC,UAAU,gBACd,QAAQ,CAAC,UAAU,EAC/B,SAAS,EAAE,EAAE,CACX,kNAAkN,EAClN,IAAI,KAAK,OAAO;oCACd,CAAC,CAAC,gCAAgC;oCAClC,CAAC,CAAC,gCAAgC,CACrC,YAED,KAAC,QAAQ,IACP,SAAS,EAAC,0HAA0H,EACpI,WAAW,EAAE,GAAG,GAChB,GACoB,EACxB,cACE,SAAS,EAAE,EAAE,CACX,0IAA0I,EAC1I,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAC1C,SAAS,CACV,YAED,KAAC,eAAe,CAAC,OAAO,IAAC,SAAS,EAAC,8BAA8B,YAC9D,QAAQ,GACe,GACtB,IACL,CACJ,GACqB,GACC,IACJ,CAC1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAyB;IACzE,OAAO,CACL,cACE,SAAS,EAAE,EAAE,CACX,yFAAyF,EACzF,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA+B;IAC9E,OAAO,CACL,KAAC,eAAe,CAAC,KAAK,IACpB,SAAS,EAAE,EAAE,CACX,sEAAsE,EACtE,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAqC;IAC1F,OAAO,CACL,KAAC,eAAe,CAAC,WAAW,IAC1B,SAAS,EAAE,EAAE,CAAC,iCAAiC,EAAE,SAAS,CAAC,KACvD,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAyB;IACvE,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,8CAA8C,EAAE,SAAS,CAAC,KAAM,KAAK,GAAI,CAC7F,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Meter as MeterPrimitive } from '@base-ui/react/meter';
|
|
2
|
+
import { Progress as ProgressPrimitive } from '@base-ui/react/progress';
|
|
3
|
+
import { Separator as SeparatorPrimitive } from '@base-ui/react/separator';
|
|
4
|
+
import type { ComponentProps, ReactNode } from 'react';
|
|
5
|
+
/** A key or shortcut as the reader types it, such as ⌘K. */
|
|
6
|
+
export declare function Kbd({ className, ...props }: ComponentProps<'kbd'>): import("react").JSX.Element;
|
|
7
|
+
export declare function Separator({ className, orientation, ...props }: SeparatorPrimitive.Props): import("react").JSX.Element;
|
|
8
|
+
export type ProgressProps = ProgressPrimitive.Root.Props & {
|
|
9
|
+
label?: ReactNode;
|
|
10
|
+
/** Shows the value at the end of the label row. */
|
|
11
|
+
showValue?: boolean;
|
|
12
|
+
};
|
|
13
|
+
/** How far a task has come: an upload, a send going out. Without a value it runs as busy. */
|
|
14
|
+
export declare function Progress({ label, showValue, className, ...props }: ProgressProps): import("react").JSX.Element;
|
|
15
|
+
export type MeterProps = MeterPrimitive.Root.Props & {
|
|
16
|
+
label: ReactNode;
|
|
17
|
+
/** Shares of max where the fill turns to warning, then danger. */
|
|
18
|
+
warnAt?: number;
|
|
19
|
+
dangerAt?: number;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* A level within known bounds: storage used, seats taken. The fill carries
|
|
23
|
+
* the severity and the track is a lighter step of the same colour; the value
|
|
24
|
+
* is always written, never told by colour alone.
|
|
25
|
+
*/
|
|
26
|
+
export declare function Meter({ label, warnAt, dangerAt, value, max, min, className, ...props }: MeterProps): import("react").JSX.Element;
|
|
27
|
+
declare const NOTICE: {
|
|
28
|
+
readonly info: {
|
|
29
|
+
readonly icon: import("lucide-react").LucideIcon;
|
|
30
|
+
readonly box: "border-info/30 bg-info/5";
|
|
31
|
+
readonly icon_: "text-info";
|
|
32
|
+
};
|
|
33
|
+
readonly success: {
|
|
34
|
+
readonly icon: import("lucide-react").LucideIcon;
|
|
35
|
+
readonly box: "border-success/30 bg-success/5";
|
|
36
|
+
readonly icon_: "text-success";
|
|
37
|
+
};
|
|
38
|
+
readonly warning: {
|
|
39
|
+
readonly icon: import("lucide-react").LucideIcon;
|
|
40
|
+
readonly box: "border-warning/30 bg-warning/5";
|
|
41
|
+
readonly icon_: "text-warning";
|
|
42
|
+
};
|
|
43
|
+
readonly danger: {
|
|
44
|
+
readonly icon: import("lucide-react").LucideIcon;
|
|
45
|
+
readonly box: "border-destructive/30 bg-destructive/5";
|
|
46
|
+
readonly icon_: "text-destructive";
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
export type NoticeProps = Omit<ComponentProps<'div'>, 'title'> & {
|
|
50
|
+
tone?: keyof typeof NOTICE;
|
|
51
|
+
title?: ReactNode;
|
|
52
|
+
/** A button or link under the text. */
|
|
53
|
+
action?: ReactNode;
|
|
54
|
+
/** Shows a close button; the parent removes the notice. */
|
|
55
|
+
onDismiss?: () => void;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* A message inside the page: a service under maintenance, a form that closes
|
|
59
|
+
* tomorrow. The tone comes with an icon, so it is not told by colour alone.
|
|
60
|
+
*/
|
|
61
|
+
export declare function Notice({ tone, title, action, onDismiss, className, children, ...props }: NoticeProps): import("react").JSX.Element;
|
|
62
|
+
export {};
|
|
63
|
+
//# sourceMappingURL=feedback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../src/components/feedback.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,SAAS,IAAI,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE3E,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvD,4DAA4D;AAC5D,wBAAgB,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,KAAK,CAAC,+BAWjE;AAED,wBAAgB,SAAS,CAAC,EACxB,SAAS,EACT,WAA0B,EAC1B,GAAG,KAAK,EACT,EAAE,kBAAkB,CAAC,KAAK,+BAY1B;AAED,MAAM,MAAM,aAAa,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,GAAG;IACzD,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,mDAAmD;IACnD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,6FAA6F;AAC7F,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,SAAgB,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,+BA6BvF;AAED,MAAM,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,GAAG;IACnD,KAAK,EAAE,SAAS,CAAC;IACjB,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,MAAa,EACb,QAAc,EACd,KAAK,EACL,GAAS,EACT,GAAO,EACP,SAAS,EACT,GAAG,KAAK,EACT,EAAE,UAAU,+BAqCZ;AAED,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;CASF,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,GAAG;IAC/D,IAAI,CAAC,EAAE,MAAM,OAAO,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,uCAAuC;IACvC,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,MAAM,CAAC,EACrB,IAAa,EACb,KAAK,EACL,MAAM,EACN,SAAS,EACT,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,WAAW,+BA+Bb"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Meter as MeterPrimitive } from '@base-ui/react/meter';
|
|
4
|
+
import { Progress as ProgressPrimitive } from '@base-ui/react/progress';
|
|
5
|
+
import { Separator as SeparatorPrimitive } from '@base-ui/react/separator';
|
|
6
|
+
import { CircleAlert, CircleCheck, Info, TriangleAlert, X } from 'lucide-react';
|
|
7
|
+
import { cn } from '../lib/cn.js';
|
|
8
|
+
import { useSkylcn } from '../lib/provider.js';
|
|
9
|
+
/** A key or shortcut as the reader types it, such as ⌘K. */
|
|
10
|
+
export function Kbd({ className, ...props }) {
|
|
11
|
+
return (_jsx("kbd", { "data-slot": "kbd", className: cn('inline-flex h-5 min-w-5 items-center justify-center rounded border border-border-strong bg-muted px-1 font-mono text-3xs text-secondary-foreground', className), ...props }));
|
|
12
|
+
}
|
|
13
|
+
export function Separator({ className, orientation = 'horizontal', ...props }) {
|
|
14
|
+
return (_jsx(SeparatorPrimitive, { orientation: orientation, className: cn('shrink-0 bg-border', orientation === 'horizontal' ? 'h-px w-full' : 'w-px self-stretch', className), ...props }));
|
|
15
|
+
}
|
|
16
|
+
/** How far a task has come: an upload, a send going out. Without a value it runs as busy. */
|
|
17
|
+
export function Progress({ label, showValue = true, className, ...props }) {
|
|
18
|
+
const { locale } = useSkylcn();
|
|
19
|
+
return (_jsxs(ProgressPrimitive.Root, { "data-slot": "progress",
|
|
20
|
+
// A fixed locale keeps the server and browser writing the value the same way
|
|
21
|
+
locale: locale === 'tr' ? 'tr-TR' : 'en-US', className: cn('flex flex-col gap-1.5', className), ...props, children: [label || showValue ? (_jsxs("div", { className: "flex items-baseline justify-between gap-3 text-xs", children: [label ? (_jsx(ProgressPrimitive.Label, { className: "text-secondary-foreground", children: label })) : (_jsx("span", {})), showValue ? (_jsx(ProgressPrimitive.Value, { className: "text-subtle-foreground tabular-nums" })) : null] })) : null, _jsx(ProgressPrimitive.Track, { className: "h-1.5 overflow-hidden rounded-full bg-muted", children: _jsx(ProgressPrimitive.Indicator, { className: "block h-full rounded-full bg-skylab-500 transition-[width] duration-(--motion-duration-slow) ease-enter data-indeterminate:w-1/3 data-indeterminate:animate-pulse" }) })] }));
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* A level within known bounds: storage used, seats taken. The fill carries
|
|
25
|
+
* the severity and the track is a lighter step of the same colour; the value
|
|
26
|
+
* is always written, never told by colour alone.
|
|
27
|
+
*/
|
|
28
|
+
export function Meter({ label, warnAt = 0.75, dangerAt = 0.9, value, max = 100, min = 0, className, ...props }) {
|
|
29
|
+
const { locale } = useSkylcn();
|
|
30
|
+
const share = (value - min) / (max - min || 1);
|
|
31
|
+
const tone = share >= dangerAt ? 'bg-destructive' : share >= warnAt ? 'bg-warning' : 'bg-skylab-500';
|
|
32
|
+
const track = share >= dangerAt
|
|
33
|
+
? 'bg-destructive/15'
|
|
34
|
+
: share >= warnAt
|
|
35
|
+
? 'bg-warning/15'
|
|
36
|
+
: 'bg-skylab-500/15';
|
|
37
|
+
return (_jsxs(MeterPrimitive.Root, { "data-slot": "meter", locale: locale === 'tr' ? 'tr-TR' : 'en-US', value: value, max: max, min: min, className: cn('flex flex-col gap-1.5', className), ...props, children: [_jsxs("div", { className: "flex items-baseline justify-between gap-3 text-xs", children: [_jsx(MeterPrimitive.Label, { className: "text-secondary-foreground", children: label }), _jsx(MeterPrimitive.Value, { className: "text-subtle-foreground tabular-nums" })] }), _jsx(MeterPrimitive.Track, { className: cn('h-1.5 overflow-hidden rounded-full transition-colors', track), children: _jsx(MeterPrimitive.Indicator, { className: cn('block h-full rounded-full transition-[width,background-color] duration-(--motion-duration-slow) ease-enter', tone) }) })] }));
|
|
38
|
+
}
|
|
39
|
+
const NOTICE = {
|
|
40
|
+
info: { icon: Info, box: 'border-info/30 bg-info/5', icon_: 'text-info' },
|
|
41
|
+
success: { icon: CircleCheck, box: 'border-success/30 bg-success/5', icon_: 'text-success' },
|
|
42
|
+
warning: { icon: TriangleAlert, box: 'border-warning/30 bg-warning/5', icon_: 'text-warning' },
|
|
43
|
+
danger: {
|
|
44
|
+
icon: CircleAlert,
|
|
45
|
+
box: 'border-destructive/30 bg-destructive/5',
|
|
46
|
+
icon_: 'text-destructive',
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* A message inside the page: a service under maintenance, a form that closes
|
|
51
|
+
* tomorrow. The tone comes with an icon, so it is not told by colour alone.
|
|
52
|
+
*/
|
|
53
|
+
export function Notice({ tone = 'info', title, action, onDismiss, className, children, ...props }) {
|
|
54
|
+
const { messages } = useSkylcn();
|
|
55
|
+
const style = NOTICE[tone];
|
|
56
|
+
const Icon = style.icon;
|
|
57
|
+
return (_jsxs("div", { "data-slot": "notice", role: tone === 'danger' ? 'alert' : 'status', className: cn('relative flex gap-3 rounded-lg border p-3 pr-10', style.box, className), ...props, children: [_jsx(Icon, { className: cn('mt-0.5 size-4 shrink-0', style.icon_), "aria-hidden": true }), _jsxs("div", { className: "flex min-w-0 flex-col gap-1", children: [title ? _jsx("p", { className: "text-sm font-medium text-foreground", children: title }) : null, children ? (_jsx("div", { className: "text-xs leading-relaxed text-muted-foreground", children: children })) : null, action ? _jsx("div", { className: "mt-1", children: action }) : null] }), onDismiss ? (_jsx("button", { type: "button", onClick: onDismiss, "aria-label": messages.close, className: "absolute top-2.5 right-2.5 grid size-6 place-items-center rounded-md text-subtle-foreground outline-hidden hover:bg-accent hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring", children: _jsx(X, { className: "size-3.5" }) })) : null] }));
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=feedback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/components/feedback.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Field as FieldPrimitive } from '@base-ui/react/field';
|
|
2
|
+
import { Input as InputPrimitive } from '@base-ui/react/input';
|
|
3
|
+
import type { LucideIcon } from 'lucide-react';
|
|
4
|
+
import { type ComponentProps, type ReactNode } from 'react';
|
|
5
|
+
export type InputProps = InputPrimitive.Props & {
|
|
6
|
+
/** A leading icon inside the box, such as a search glass. */
|
|
7
|
+
icon?: LucideIcon;
|
|
8
|
+
inputSize?: 'sm' | 'md';
|
|
9
|
+
};
|
|
10
|
+
export declare function Input({ className, icon: Icon, inputSize, ...props }: InputProps): import("react").JSX.Element;
|
|
11
|
+
export declare function Textarea({ className, ...props }: ComponentProps<'textarea'>): import("react").JSX.Element;
|
|
12
|
+
export declare function Label({ className, ...props }: ComponentProps<'label'>): import("react").JSX.Element;
|
|
13
|
+
export type FieldProps = FieldPrimitive.Root.Props & {
|
|
14
|
+
label?: ReactNode;
|
|
15
|
+
description?: ReactNode;
|
|
16
|
+
/** Shown under the control and marks it invalid. */
|
|
17
|
+
error?: ReactNode;
|
|
18
|
+
};
|
|
19
|
+
/** A label, a control, a hint and an error, wired together for assistive tech. */
|
|
20
|
+
export declare function Field({ label, description, error, className, children, ...props }: FieldProps): import("react").JSX.Element;
|
|
21
|
+
//# sourceMappingURL=field.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../src/components/field.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,KAAK,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAY,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAetE,MAAM,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,GAAG;IAC9C,6DAA6D;IAC7D,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACzB,CAAC;AAEF,wBAAgB,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,SAAgB,EAAE,GAAG,KAAK,EAAE,EAAE,UAAU,+BAoBtF;AAED,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,UAAU,CAAC,+BAY3E;AAED,wBAAgB,KAAK,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,OAAO,CAAC,+BAQrE;AAED,MAAM,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,GAAG;IACnD,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,oDAAoD;IACpD,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB,CAAC;AAEF,kFAAkF;AAClF,wBAAgB,KAAK,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,UAAU,+BA8B7F"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Field as FieldPrimitive } from '@base-ui/react/field';
|
|
4
|
+
import { Input as InputPrimitive } from '@base-ui/react/input';
|
|
5
|
+
import { useState } from 'react';
|
|
6
|
+
import { cn } from '../lib/cn.js';
|
|
7
|
+
import { Collapse } from './motion.js';
|
|
8
|
+
const controlClass = [
|
|
9
|
+
'w-full min-w-0 rounded-md border border-input bg-input-background text-xs text-foreground outline-hidden',
|
|
10
|
+
// 16px on touch screens keeps iOS from zooming into the field
|
|
11
|
+
'pointer-coarse:text-base',
|
|
12
|
+
'transition-[border-color] duration-(--motion-duration-fast) ease-enter',
|
|
13
|
+
'placeholder:text-subtle-foreground',
|
|
14
|
+
'hover:border-border-strong focus-visible:border-skylab-400/50 focus-visible:ring-2 focus-visible:ring-skylab-400/20',
|
|
15
|
+
'aria-invalid:border-destructive/60 aria-invalid:ring-destructive/20 data-invalid:border-destructive/60',
|
|
16
|
+
'disabled:cursor-not-allowed disabled:opacity-60',
|
|
17
|
+
];
|
|
18
|
+
export function Input({ className, icon: Icon, inputSize = 'md', ...props }) {
|
|
19
|
+
const input = (_jsx(InputPrimitive, { "data-slot": "input", className: cn(controlClass, inputSize === 'sm' ? 'h-7 px-2 pointer-coarse:h-9' : 'h-8 px-2.5 pointer-coarse:h-10', Icon && (inputSize === 'sm' ? 'pl-7' : 'pl-8'), !Icon && className), ...props }));
|
|
20
|
+
if (!Icon)
|
|
21
|
+
return input;
|
|
22
|
+
return (_jsxs("div", { className: cn('relative', className), children: [_jsx(Icon, { className: "pointer-events-none absolute top-1/2 left-2.5 size-3.5 -translate-y-1/2 text-subtle-foreground" }), input] }));
|
|
23
|
+
}
|
|
24
|
+
export function Textarea({ className, ...props }) {
|
|
25
|
+
return (_jsx("textarea", { "data-slot": "textarea", className: cn(controlClass, 'field-sizing-content min-h-16 resize-y px-2.5 py-2 leading-relaxed', className), ...props }));
|
|
26
|
+
}
|
|
27
|
+
export function Label({ className, ...props }) {
|
|
28
|
+
return (_jsx("label", { "data-slot": "label", className: cn('text-2xs font-medium text-muted-foreground select-none', className), ...props }));
|
|
29
|
+
}
|
|
30
|
+
/** A label, a control, a hint and an error, wired together for assistive tech. */
|
|
31
|
+
export function Field({ label, description, error, className, children, ...props }) {
|
|
32
|
+
// Keeps the last message while it closes, so it does not empty out on the way
|
|
33
|
+
const [shownError, setShownError] = useState(error);
|
|
34
|
+
if (error && error !== shownError)
|
|
35
|
+
setShownError(error);
|
|
36
|
+
return (_jsxs(FieldPrimitive.Root, { "data-slot": "field", invalid: Boolean(error) || undefined, className: cn('flex flex-col gap-1.5', className), ...props, children: [label ? (_jsx(FieldPrimitive.Label, { className: "text-2xs font-medium text-muted-foreground", children: label })) : null, children, description ? (_jsx(FieldPrimitive.Description, { className: "text-2xs leading-relaxed text-subtle-foreground", children: description })) : null, _jsx(Collapse, { open: Boolean(error), className: "-mt-1.5", children: _jsx(FieldPrimitive.Error, { match: true, className: "pt-1.5 text-2xs text-destructive", children: shownError }) })] }));
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=field.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field.js","sourceRoot":"","sources":["../../src/components/field.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { NumberField as NumberFieldPrimitive } from '@base-ui/react/number-field';
|
|
2
|
+
import { OTPField as OTPPrimitive } from '@base-ui/react/otp-field';
|
|
3
|
+
import { Slider as SliderPrimitive } from '@base-ui/react/slider';
|
|
4
|
+
import { type ReactNode } from 'react';
|
|
5
|
+
export type ComboboxItem = {
|
|
6
|
+
value: string;
|
|
7
|
+
label: string;
|
|
8
|
+
hint?: ReactNode;
|
|
9
|
+
};
|
|
10
|
+
type CommonProps = {
|
|
11
|
+
items: readonly ComboboxItem[];
|
|
12
|
+
placeholder?: string;
|
|
13
|
+
/** Shown when typing matches nothing. */
|
|
14
|
+
emptyText?: ReactNode;
|
|
15
|
+
'aria-label'?: string;
|
|
16
|
+
id?: string;
|
|
17
|
+
disabled?: boolean;
|
|
18
|
+
className?: string;
|
|
19
|
+
};
|
|
20
|
+
export type ComboboxProps = CommonProps & {
|
|
21
|
+
value: string | null;
|
|
22
|
+
onValueChange: (value: string | null) => void;
|
|
23
|
+
};
|
|
24
|
+
/** A choice from a long list, narrowed by typing: a member, a team, a city. */
|
|
25
|
+
export declare function Combobox({ items, value, onValueChange, placeholder, emptyText, className, ...props }: ComboboxProps): import("react").JSX.Element;
|
|
26
|
+
export type MultiSelectProps = CommonProps & {
|
|
27
|
+
value: readonly string[];
|
|
28
|
+
onValueChange: (value: string[]) => void;
|
|
29
|
+
};
|
|
30
|
+
/** Several choices from a list, kept as removable chips: teams, tags, recipients. */
|
|
31
|
+
export declare function MultiSelect({ items, value, onValueChange, placeholder, emptyText, className, ...props }: MultiSelectProps): import("react").JSX.Element;
|
|
32
|
+
export type NumberFieldProps = NumberFieldPrimitive.Root.Props & {
|
|
33
|
+
'aria-label'?: string;
|
|
34
|
+
};
|
|
35
|
+
/** A number with − and + steps, arrow keys and Shift for larger steps; typed values are held within min and max. */
|
|
36
|
+
export declare function NumberField({ className, 'aria-label': ariaLabel, ...props }: NumberFieldProps): import("react").JSX.Element;
|
|
37
|
+
export type SliderProps = SliderPrimitive.Root.Props & {
|
|
38
|
+
label?: ReactNode;
|
|
39
|
+
/** Writes the value, or both ends of a range, beside the label. */
|
|
40
|
+
showValue?: boolean;
|
|
41
|
+
/** Names each thumb when there is no visible label, one per thumb. */
|
|
42
|
+
thumbLabels?: readonly string[];
|
|
43
|
+
};
|
|
44
|
+
/** A value, or a range with two thumbs, picked along a track: a budget, a team size. */
|
|
45
|
+
export declare function Slider({ label, showValue, thumbLabels, className, ...props }: SliderProps): import("react").JSX.Element;
|
|
46
|
+
export type OTPFieldProps = Omit<OTPPrimitive.Root.Props, 'length'> & {
|
|
47
|
+
/** How many characters the code has; six by default. */
|
|
48
|
+
length?: number;
|
|
49
|
+
/** Names the field for assistive tech when no label points at it. */
|
|
50
|
+
'aria-label'?: string;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* A one-time code, one box per character. Pasting the whole code fills every
|
|
54
|
+
* box and password managers can fill it too; nothing blocks pasting.
|
|
55
|
+
*/
|
|
56
|
+
export declare function OTPField({ length, className, id, 'aria-label': ariaLabel, ...props }: OTPFieldProps): import("react").JSX.Element;
|
|
57
|
+
export {};
|
|
58
|
+
//# sourceMappingURL=form-extra.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-extra.d.ts","sourceRoot":"","sources":["../../src/components/form-extra.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,IAAI,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAClF,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAAS,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAK9C,MAAM,MAAM,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC;AAgD9E,KAAK,WAAW,GAAG;IACjB,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG;IACxC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC/C,CAAC;AAEF,+EAA+E;AAC/E,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,KAAK,EACL,aAAa,EACb,WAAW,EACX,SAAS,EACT,SAAS,EACT,GAAG,KAAK,EACT,EAAE,aAAa,+BAmCf;AAED,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG;IAC3C,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CAC1C,CAAC;AAEF,qFAAqF;AACrF,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,KAAK,EACL,aAAa,EACb,WAAW,EACX,SAAS,EACT,SAAS,EACT,GAAG,KAAK,EACT,EAAE,gBAAgB,+BAyClB;AAED,MAAM,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,IAAI,CAAC,KAAK,GAAG;IAC/D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,oHAAoH;AACpH,wBAAgB,WAAW,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,gBAAgB,+BA8B7F;AAED,MAAM,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,GAAG;IACrD,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,mEAAmE;IACnE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sEAAsE;IACtE,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC,CAAC;AAEF,wFAAwF;AACxF,wBAAgB,MAAM,CAAC,EAAE,KAAK,EAAE,SAAgB,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,WAAW,+BAkChG;AAED,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG;IACpE,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EACvB,MAAU,EACV,SAAS,EACT,EAAE,EACF,YAAY,EAAE,SAAS,EACvB,GAAG,KAAK,EACT,EAAE,aAAa,+BA4Bf"}
|