@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,51 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { Combobox as ComboboxPrimitive } from '@base-ui/react/combobox';
|
|
4
|
+
import { NumberField as NumberFieldPrimitive } from '@base-ui/react/number-field';
|
|
5
|
+
import { OTPField as OTPPrimitive } from '@base-ui/react/otp-field';
|
|
6
|
+
import { Slider as SliderPrimitive } from '@base-ui/react/slider';
|
|
7
|
+
import { Check, ChevronsUpDown, Minus, Plus, X } from 'lucide-react';
|
|
8
|
+
import { useId } from 'react';
|
|
9
|
+
import { cn } from '../lib/cn.js';
|
|
10
|
+
import { popupMotionFast } from '../lib/motion.js';
|
|
11
|
+
import { useSkylcn } from '../lib/provider.js';
|
|
12
|
+
const groupClass = cn('flex min-h-9 w-full items-center gap-1 rounded-md border border-input bg-input-background px-2 text-xs text-foreground', 'transition-[border-color] duration-(--motion-duration-fast) focus-within:border-skylab-400/50 focus-within:ring-2 focus-within:ring-skylab-400/20', 'pointer-coarse:min-h-11 pointer-coarse:text-base');
|
|
13
|
+
const inputClass = 'h-7 min-w-16 flex-1 bg-transparent outline-hidden placeholder:text-subtle-foreground pointer-coarse:h-9';
|
|
14
|
+
function Options({ empty }) {
|
|
15
|
+
return (_jsx(ComboboxPrimitive.Portal, { children: _jsx(ComboboxPrimitive.Positioner, { sideOffset: 4, className: "z-50 outline-hidden", children: _jsxs(ComboboxPrimitive.Popup, { className: cn('scrollbar max-h-[min(20rem,var(--available-height))] w-(--anchor-width) min-w-48 overflow-y-auto rounded-lg border border-border bg-popover p-1 text-foreground shadow-overlay outline-hidden', popupMotionFast), children: [_jsx(ComboboxPrimitive.Empty, { className: "px-2 py-3 text-center text-xs text-muted-foreground empty:hidden", children: empty }), _jsx(ComboboxPrimitive.List, { children: (item) => (_jsxs(ComboboxPrimitive.Item, { value: item, className: "group flex cursor-default items-center gap-2 rounded-md px-2 py-2 text-xs text-secondary-foreground outline-hidden select-none pointer-coarse:py-2.5 pointer-coarse:text-sm data-highlighted:bg-accent data-highlighted:text-foreground-strong", children: [_jsx("span", { className: "flex size-3.5 shrink-0 items-center justify-center", children: _jsx(ComboboxPrimitive.ItemIndicator, { children: _jsx(Check, { className: "size-3.5 text-skylab-400" }) }) }), _jsx("span", { className: "min-w-0 flex-1 truncate", children: item.label }), item.hint ? (_jsx("span", { className: "shrink-0 text-3xs text-subtle-foreground", children: item.hint })) : null] }, item.value)) })] }) }) }));
|
|
16
|
+
}
|
|
17
|
+
/** A choice from a long list, narrowed by typing: a member, a team, a city. */
|
|
18
|
+
export function Combobox({ items, value, onValueChange, placeholder, emptyText, className, ...props }) {
|
|
19
|
+
const { messages } = useSkylcn();
|
|
20
|
+
const selected = items.find((item) => item.value === value) ?? null;
|
|
21
|
+
return (_jsxs(ComboboxPrimitive.Root, { items: items, value: selected, onValueChange: (item) => onValueChange(item?.value ?? null), itemToStringLabel: (item) => item.label, isItemEqualToValue: (a, b) => a.value === b.value, disabled: props.disabled, children: [_jsxs(ComboboxPrimitive.InputGroup, { className: cn(groupClass, className), children: [_jsx(ComboboxPrimitive.Input, { id: props.id, "aria-label": props['aria-label'], placeholder: placeholder, className: inputClass }), _jsx(ComboboxPrimitive.Clear, { "aria-label": messages.clearSearch, className: "grid size-6 place-items-center rounded text-subtle-foreground outline-hidden hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring", children: _jsx(X, { className: "size-3.5" }) }), _jsx(ComboboxPrimitive.Trigger, { "aria-label": messages.openList, className: "grid size-6 place-items-center rounded text-subtle-foreground outline-hidden hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring", children: _jsx(ChevronsUpDown, { className: "size-3.5" }) })] }), _jsx(Options, { empty: emptyText ?? messages.noResults })] }));
|
|
22
|
+
}
|
|
23
|
+
/** Several choices from a list, kept as removable chips: teams, tags, recipients. */
|
|
24
|
+
export function MultiSelect({ items, value, onValueChange, placeholder, emptyText, className, ...props }) {
|
|
25
|
+
const { messages } = useSkylcn();
|
|
26
|
+
const selected = items.filter((item) => value.includes(item.value));
|
|
27
|
+
return (_jsxs(ComboboxPrimitive.Root, { multiple: true, items: items, value: selected, onValueChange: (next) => onValueChange(next.map((item) => item.value)), itemToStringLabel: (item) => item.label, isItemEqualToValue: (a, b) => a.value === b.value, disabled: props.disabled, children: [_jsx(ComboboxPrimitive.InputGroup, { className: cn(groupClass, 'flex-wrap py-1', className), children: _jsxs(ComboboxPrimitive.Chips, { className: "contents", children: [selected.map((item) => (_jsxs(ComboboxPrimitive.Chip, { "aria-label": item.label, className: "flex enter-fade items-center gap-1 rounded-md border border-skylab-400/30 bg-skylab-500/10 py-0.5 pr-0.5 pl-2 text-2xs text-skylab-300 outline-hidden focus-visible:ring-2 focus-visible:ring-ring", children: [item.label, _jsx(ComboboxPrimitive.ChipRemove, { "aria-label": messages.removeItem(item.label), className: "grid size-4 place-items-center rounded hover:bg-skylab-500/20", children: _jsx(X, { className: "size-3" }) })] }, item.value))), _jsx(ComboboxPrimitive.Input, { id: props.id, "aria-label": props['aria-label'], placeholder: selected.length ? undefined : placeholder, className: inputClass })] }) }), _jsx(Options, { empty: emptyText ?? messages.noResults })] }));
|
|
28
|
+
}
|
|
29
|
+
/** A number with − and + steps, arrow keys and Shift for larger steps; typed values are held within min and max. */
|
|
30
|
+
export function NumberField({ className, 'aria-label': ariaLabel, ...props }) {
|
|
31
|
+
const { messages, locale } = useSkylcn();
|
|
32
|
+
const step = 'grid h-full w-8 place-items-center text-subtle-foreground outline-hidden transition-colors hover:bg-accent hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-40 pointer-coarse:w-10';
|
|
33
|
+
return (_jsx(NumberFieldPrimitive.Root, { locale: locale === 'tr' ? 'tr-TR' : 'en-US', className: className, ...props, children: _jsxs(NumberFieldPrimitive.Group, { className: "flex h-9 w-36 overflow-hidden rounded-md border border-input bg-input-background focus-within:border-skylab-400/50 focus-within:ring-2 focus-within:ring-skylab-400/20 pointer-coarse:h-11", children: [_jsx(NumberFieldPrimitive.Decrement, { "aria-label": messages.decrease, className: cn(step, 'border-r border-input'), children: _jsx(Minus, { className: "size-3.5" }) }), _jsx(NumberFieldPrimitive.Input, { "aria-label": ariaLabel, className: "min-w-0 flex-1 bg-transparent text-center text-xs text-foreground tabular-nums outline-hidden pointer-coarse:text-base" }), _jsx(NumberFieldPrimitive.Increment, { "aria-label": messages.increase, className: cn(step, 'border-l border-input'), children: _jsx(Plus, { className: "size-3.5" }) })] }) }));
|
|
34
|
+
}
|
|
35
|
+
/** A value, or a range with two thumbs, picked along a track: a budget, a team size. */
|
|
36
|
+
export function Slider({ label, showValue = true, thumbLabels, className, ...props }) {
|
|
37
|
+
const values = props.value ?? props.defaultValue;
|
|
38
|
+
const count = Array.isArray(values) ? values.length : 1;
|
|
39
|
+
return (_jsxs(SliderPrimitive.Root, { className: cn('flex w-full flex-col gap-2', className), ...props, children: [label || showValue ? (_jsxs("div", { className: "flex items-baseline justify-between gap-3 text-xs", children: [label ? (_jsx(SliderPrimitive.Label, { className: "text-secondary-foreground", children: label })) : (_jsx("span", {})), showValue ? (_jsx(SliderPrimitive.Value, { className: "text-subtle-foreground tabular-nums" })) : null] })) : null, _jsx(SliderPrimitive.Control, { className: "flex h-5 w-full touch-none items-center pointer-coarse:h-8", children: _jsxs(SliderPrimitive.Track, { className: "relative h-1.5 w-full rounded-full bg-muted", children: [_jsx(SliderPrimitive.Indicator, { className: "rounded-full bg-skylab-500" }), Array.from({ length: count }, (_, i) => (_jsx(SliderPrimitive.Thumb, { index: i, "aria-label": thumbLabels?.[i], className: "size-4 rounded-full border-2 border-skylab-400 bg-background shadow-sm outline-hidden transition-[scale] duration-(--motion-duration-fast) focus-visible:ring-4 focus-visible:ring-ring active:scale-110 data-dragging:scale-110 pointer-coarse:size-6" }, i)))] }) })] }));
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* A one-time code, one box per character. Pasting the whole code fills every
|
|
43
|
+
* box and password managers can fill it too; nothing blocks pasting.
|
|
44
|
+
*/
|
|
45
|
+
export function OTPField({ length = 6, className, id, 'aria-label': ariaLabel, ...props }) {
|
|
46
|
+
const { messages } = useSkylcn();
|
|
47
|
+
const autoId = useId();
|
|
48
|
+
const fieldId = id ?? autoId;
|
|
49
|
+
return (_jsxs(_Fragment, { children: [ariaLabel ? (_jsx("label", { htmlFor: fieldId, className: "sr-only", children: ariaLabel })) : null, _jsx(OTPPrimitive.Root, { id: fieldId, length: length, className: cn('flex items-center gap-1.5', className), ...props, children: Array.from({ length }, (_, i) => (_jsx(OTPPrimitive.Input, { "aria-label": i === 0 ? undefined : messages.codeCharacter(i + 1, length), className: "size-10 rounded-md border border-input bg-input-background text-center font-mono text-base text-foreground outline-hidden transition-[border-color] duration-(--motion-duration-fast) selection:bg-skylab-400/30 focus:border-skylab-400/60 focus:ring-2 focus:ring-skylab-400/20 pointer-coarse:size-12" }, i))) })] }));
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=form-extra.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-extra.js","sourceRoot":"","sources":["../../src/components/form-extra.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { LucideIcon } from 'lucide-react';
|
|
2
|
+
export type IconSwapProps = {
|
|
3
|
+
/** Shows `swappedIcon` instead of `icon`. */
|
|
4
|
+
swapped: boolean;
|
|
5
|
+
icon: LucideIcon;
|
|
6
|
+
swappedIcon: LucideIcon;
|
|
7
|
+
className?: string;
|
|
8
|
+
strokeWidth?: number;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Two icons in one spot that blend into each other when the state changes,
|
|
12
|
+
* such as open/close or copy/copied, instead of snapping.
|
|
13
|
+
*/
|
|
14
|
+
export declare function IconSwap({ swapped, icon: Icon, swappedIcon: SwappedIcon, className, strokeWidth, }: IconSwapProps): import("react").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=icon-swap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-swap.d.ts","sourceRoot":"","sources":["../../src/components/icon-swap.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAQ/C,MAAM,MAAM,aAAa,GAAG;IAC1B,6CAA6C;IAC7C,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,EAAE,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EACvB,OAAO,EACP,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,WAAW,EACxB,SAAS,EACT,WAAW,GACZ,EAAE,aAAa,+BAUf"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from '../lib/cn.js';
|
|
3
|
+
const LAYER = 'col-start-1 row-start-1 transition-[opacity,scale,filter] duration-(--motion-duration-base) ease-enter motion-reduce:scale-100 motion-reduce:blur-none';
|
|
4
|
+
const SHOWN = 'scale-100 opacity-100 blur-none';
|
|
5
|
+
const HIDDEN = 'scale-50 opacity-0 blur-[2px]';
|
|
6
|
+
/**
|
|
7
|
+
* Two icons in one spot that blend into each other when the state changes,
|
|
8
|
+
* such as open/close or copy/copied, instead of snapping.
|
|
9
|
+
*/
|
|
10
|
+
export function IconSwap({ swapped, icon: Icon, swappedIcon: SwappedIcon, className, strokeWidth, }) {
|
|
11
|
+
return (_jsxs("span", { "data-slot": "icon-swap", "aria-hidden": true, className: "inline-grid shrink-0 place-items-center", children: [_jsx(Icon, { strokeWidth: strokeWidth, className: cn(LAYER, swapped ? HIDDEN : SHOWN, className) }), _jsx(SwappedIcon, { strokeWidth: strokeWidth, className: cn(LAYER, swapped ? SHOWN : HIDDEN, className) })] }));
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=icon-swap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-swap.js","sourceRoot":"","sources":["../../src/components/icon-swap.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,MAAM,KAAK,GACT,wJAAwJ,CAAC;AAC3J,MAAM,KAAK,GAAG,iCAAiC,CAAC;AAChD,MAAM,MAAM,GAAG,+BAA+B,CAAC;AAW/C;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,EACvB,OAAO,EACP,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,WAAW,EACxB,SAAS,EACT,WAAW,GACG;IACd,OAAO,CACL,6BAAgB,WAAW,uBAAa,SAAS,EAAC,yCAAyC,aACzF,KAAC,IAAI,IAAC,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,GAAI,EAC7F,KAAC,WAAW,IACV,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,GACzD,IACG,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type LucideIcon } from 'lucide-react';
|
|
2
|
+
import type { ReactNode } from 'react';
|
|
3
|
+
export type ListStatus = {
|
|
4
|
+
kind: 'loading';
|
|
5
|
+
} | {
|
|
6
|
+
kind: 'empty';
|
|
7
|
+
message: string;
|
|
8
|
+
} | {
|
|
9
|
+
kind: 'ready';
|
|
10
|
+
};
|
|
11
|
+
/** Derives a list's status from its request state and row count. */
|
|
12
|
+
export declare function listStatus(options: {
|
|
13
|
+
loading: boolean;
|
|
14
|
+
failed?: boolean;
|
|
15
|
+
rowCount: number;
|
|
16
|
+
emptyMessage: string;
|
|
17
|
+
}): ListStatus;
|
|
18
|
+
export type ListPanelProps = {
|
|
19
|
+
status: ListStatus;
|
|
20
|
+
/** Draws the rounded border around the list. */
|
|
21
|
+
framed?: boolean;
|
|
22
|
+
emptyIcon?: LucideIcon;
|
|
23
|
+
emptyDescription?: ReactNode;
|
|
24
|
+
emptyAction?: ReactNode;
|
|
25
|
+
className?: string;
|
|
26
|
+
children?: ReactNode;
|
|
27
|
+
};
|
|
28
|
+
/** A plain list of rows that shows its own loading and empty states, cross-fading between them. */
|
|
29
|
+
export declare function ListPanel({ status, framed, emptyIcon, emptyDescription, emptyAction, className, children, }: ListPanelProps): import("react").JSX.Element;
|
|
30
|
+
export type ListItemProps = {
|
|
31
|
+
href?: string;
|
|
32
|
+
onSelect?: () => void;
|
|
33
|
+
title: ReactNode;
|
|
34
|
+
subtitle?: ReactNode;
|
|
35
|
+
/** An avatar, icon or status dot before the text. */
|
|
36
|
+
leading?: ReactNode;
|
|
37
|
+
/** Chips or actions after the text; they stay pressable over the row link. */
|
|
38
|
+
trailing?: ReactNode;
|
|
39
|
+
className?: string;
|
|
40
|
+
};
|
|
41
|
+
/** One row of a ListPanel: title, subtitle, leading and trailing slots, optionally a link. */
|
|
42
|
+
export declare function ListItem({ href, onSelect, title, subtitle, leading, trailing, className, }: ListItemProps): import("react").JSX.Element;
|
|
43
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/components/list.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvC,MAAM,MAAM,UAAU,GACpB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAE/E,oEAAoE;AACpE,wBAAgB,UAAU,CAAC,OAAO,EAAE;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,UAAU,CAKb;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,gDAAgD;IAChD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,mGAAmG;AACnG,wBAAgB,SAAS,CAAC,EACxB,MAAM,EACN,MAAa,EACb,SAAS,EACT,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,QAAQ,GACT,EAAE,cAAc,+BAoBhB;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,qDAAqD;IACrD,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,8FAA8F;AAC9F,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,SAAS,GACV,EAAE,aAAa,+BA8Cf"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { ChevronRight } from 'lucide-react';
|
|
4
|
+
import { cn } from '../lib/cn.js';
|
|
5
|
+
import { useSkylcn } from '../lib/provider.js';
|
|
6
|
+
import { Swap } from './motion.js';
|
|
7
|
+
import { StateCard } from './state-card.js';
|
|
8
|
+
/** Derives a list's status from its request state and row count. */
|
|
9
|
+
export function listStatus(options) {
|
|
10
|
+
if (options.loading)
|
|
11
|
+
return { kind: 'loading' };
|
|
12
|
+
if (options.failed)
|
|
13
|
+
return { kind: 'ready' };
|
|
14
|
+
if (options.rowCount === 0)
|
|
15
|
+
return { kind: 'empty', message: options.emptyMessage };
|
|
16
|
+
return { kind: 'ready' };
|
|
17
|
+
}
|
|
18
|
+
/** A plain list of rows that shows its own loading and empty states, cross-fading between them. */
|
|
19
|
+
export function ListPanel({ status, framed = true, emptyIcon, emptyDescription, emptyAction, className, children, }) {
|
|
20
|
+
return (_jsx("div", { "data-slot": "list-panel", className: cn(framed && 'overflow-hidden rounded-lg border border-border', className), children: _jsx(Swap, { id: status.kind, children: status.kind === 'loading' ? (_jsx(StateCard, { loading: true })) : status.kind === 'empty' ? (_jsx(StateCard, { title: status.message, description: emptyDescription, icon: emptyIcon, children: emptyAction })) : (_jsx("div", { className: "divide-y divide-border-subtle", children: children })) }) }));
|
|
21
|
+
}
|
|
22
|
+
/** One row of a ListPanel: title, subtitle, leading and trailing slots, optionally a link. */
|
|
23
|
+
export function ListItem({ href, onSelect, title, subtitle, leading, trailing, className, }) {
|
|
24
|
+
const { Link } = useSkylcn();
|
|
25
|
+
const pressable = Boolean(href || onSelect);
|
|
26
|
+
const overlay = 'absolute inset-0 outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset';
|
|
27
|
+
const name = typeof title === 'string' ? title : undefined;
|
|
28
|
+
return (_jsxs("div", { "data-slot": "list-item", className: cn('group/row relative transition-colors duration-(--motion-duration-fast)', pressable && 'hover:bg-card', className), children: [href ? (_jsx(Link, { href: href, className: overlay, children: _jsx("span", { className: "sr-only", children: name }) })) : onSelect ? (_jsx("button", { type: "button", onClick: onSelect, "aria-label": name, className: overlay })) : null, _jsxs("div", { className: "flex items-center gap-3 px-3 py-2.5 pointer-coarse:py-3", children: [leading, _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "truncate text-sm font-medium text-secondary-foreground transition-colors group-hover/row:text-foreground-strong", children: title }), subtitle ? (_jsx("p", { className: "mt-0.5 truncate text-3xs text-subtle-foreground", children: subtitle })) : null] }), trailing || pressable ? (_jsxs("div", { className: "relative z-10 flex items-center gap-1", children: [trailing, pressable ? (_jsx("span", { className: "pointer-events-none inline-flex size-6 items-center justify-center text-muted-foreground transition-colors group-hover/row:text-skylab-300", children: _jsx(ChevronRight, { className: "size-4 transition-transform duration-(--motion-duration-fast) group-hover/row:translate-x-0.5" }) })) : null] })) : null] })] }));
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/components/list.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { ContextMenu as ContextMenuPrimitive } from '@base-ui/react/context-menu';
|
|
2
|
+
import { Menu as MenuPrimitive } from '@base-ui/react/menu';
|
|
3
|
+
import { type LucideIcon } from 'lucide-react';
|
|
4
|
+
import type { ComponentProps, ReactNode } from 'react';
|
|
5
|
+
type ItemExtras = {
|
|
6
|
+
icon?: LucideIcon;
|
|
7
|
+
/** A keyboard shortcut hint at the end of the row. */
|
|
8
|
+
shortcut?: ReactNode;
|
|
9
|
+
/** Colours the item for actions that remove or sign out. */
|
|
10
|
+
destructive?: boolean;
|
|
11
|
+
/** Indents the item to line up with items that have icons. */
|
|
12
|
+
inset?: boolean;
|
|
13
|
+
};
|
|
14
|
+
export type MenuItemProps = MenuPrimitive.Item.Props & ItemExtras;
|
|
15
|
+
export declare function MenuItem({ className, icon, shortcut, destructive, inset, children, ...props }: MenuItemProps): import("react").JSX.Element;
|
|
16
|
+
export type MenuLinkItemProps = MenuPrimitive.LinkItem.Props & ItemExtras;
|
|
17
|
+
/** A menu row that navigates; pass `render={<Link href="…" />}` for client-side links. */
|
|
18
|
+
export declare function MenuLinkItem({ className, icon, shortcut, destructive, inset, children, ...props }: MenuLinkItemProps): import("react").JSX.Element;
|
|
19
|
+
export declare function MenuCheckboxItem({ className, children, ...props }: MenuPrimitive.CheckboxItem.Props): import("react").JSX.Element;
|
|
20
|
+
export declare const MenuRadioGroup: import("react").NamedExoticComponent<Omit<import("@base-ui/react").ContextMenuRadioGroupProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
21
|
+
export declare function MenuRadioItem({ className, children, ...props }: MenuPrimitive.RadioItem.Props): import("react").JSX.Element;
|
|
22
|
+
/** A run of related items; `label` names the group for assistive tech too. */
|
|
23
|
+
export declare function MenuGroup({ label, children, ...props }: MenuPrimitive.Group.Props & {
|
|
24
|
+
label?: ReactNode;
|
|
25
|
+
}): import("react").JSX.Element;
|
|
26
|
+
/** A small uppercase heading anywhere in a menu, such as the signed-in e-mail. */
|
|
27
|
+
export declare function MenuLabel({ className, ...props }: ComponentProps<'div'>): import("react").JSX.Element;
|
|
28
|
+
export declare function MenuSeparator({ className, ...props }: MenuPrimitive.Separator.Props): import("react").JSX.Element;
|
|
29
|
+
export declare function MenuShortcut({ className, ...props }: ComponentProps<'span'>): import("react").JSX.Element;
|
|
30
|
+
export declare const MenuSub: typeof ContextMenuPrimitive.SubmenuRoot;
|
|
31
|
+
export declare function MenuSubTrigger({ className, icon, inset, children, ...props }: MenuPrimitive.SubmenuTrigger.Props & Omit<ItemExtras, 'shortcut' | 'destructive'>): import("react").JSX.Element;
|
|
32
|
+
type ContentPlacement = Pick<MenuPrimitive.Positioner.Props, 'side' | 'align' | 'sideOffset' | 'alignOffset'>;
|
|
33
|
+
export declare function MenuSubContent({ side, align, sideOffset, alignOffset, ...props }: MenuPrimitive.Popup.Props & ContentPlacement): import("react").JSX.Element;
|
|
34
|
+
export declare const DropdownMenu: <Payload>(props: MenuPrimitive.Root.Props<Payload>) => React.JSX.Element;
|
|
35
|
+
export declare const DropdownMenuTrigger: MenuPrimitive.Trigger;
|
|
36
|
+
export declare function DropdownMenuContent({ side, align, sideOffset, ...props }: MenuPrimitive.Popup.Props & ContentPlacement): import("react").JSX.Element;
|
|
37
|
+
export declare const ContextMenu: typeof ContextMenuPrimitive.Root;
|
|
38
|
+
export declare function ContextMenuTrigger({ className, ...props }: ContextMenuPrimitive.Trigger.Props): import("react").JSX.Element;
|
|
39
|
+
export declare function ContextMenuContent({ className, ...props }: MenuPrimitive.Popup.Props): import("react").JSX.Element;
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=menu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/components/menu.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { ContextMenu as ContextMenuPrimitive } from '@base-ui/react/context-menu';
|
|
4
|
+
import { Menu as MenuPrimitive } from '@base-ui/react/menu';
|
|
5
|
+
import { Check, ChevronRight } from 'lucide-react';
|
|
6
|
+
import { cn } from '../lib/cn.js';
|
|
7
|
+
import { popupMotionFast } from '../lib/motion.js';
|
|
8
|
+
const popupClass = cn('min-w-44 rounded-lg border border-border bg-popover p-1 text-foreground shadow-overlay outline-hidden', popupMotionFast);
|
|
9
|
+
const itemClass = cn('group/menu-item relative flex w-full items-center gap-2 rounded-md px-2 py-2 text-left text-xs text-secondary-foreground outline-hidden select-none', 'transition-colors duration-(--motion-duration-instant)', 'data-highlighted:bg-accent data-highlighted:text-foreground-strong', 'data-disabled:cursor-not-allowed data-disabled:text-faint-foreground', 'pointer-coarse:py-2.5 pointer-coarse:text-sm', "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3.5");
|
|
10
|
+
const destructiveClass = 'text-destructive data-highlighted:bg-destructive/10 data-highlighted:text-destructive';
|
|
11
|
+
function ItemBody({ icon: Icon, shortcut, children, }) {
|
|
12
|
+
return (_jsxs(_Fragment, { children: [Icon ? (_jsx(Icon, { className: "text-subtle-foreground group-data-highlighted/menu-item:text-current" })) : null, typeof children === 'string' || typeof children === 'number' ? (_jsx("span", { className: "min-w-0 flex-1 truncate", children: children })) : (children), shortcut ? _jsx(MenuShortcut, { children: shortcut }) : null] }));
|
|
13
|
+
}
|
|
14
|
+
export function MenuItem({ className, icon, shortcut, destructive, inset, children, ...props }) {
|
|
15
|
+
return (_jsx(MenuPrimitive.Item, { "data-slot": "menu-item", className: cn(itemClass, destructive && destructiveClass, inset && 'pl-7.5', className), ...props, children: _jsx(ItemBody, { icon: icon, shortcut: shortcut, children: children }) }));
|
|
16
|
+
}
|
|
17
|
+
/** A menu row that navigates; pass `render={<Link href="…" />}` for client-side links. */
|
|
18
|
+
export function MenuLinkItem({ className, icon, shortcut, destructive, inset, children, ...props }) {
|
|
19
|
+
return (_jsx(MenuPrimitive.LinkItem, { "data-slot": "menu-item", className: cn(itemClass, destructive && destructiveClass, inset && 'pl-7.5', className), ...props, children: _jsx(ItemBody, { icon: icon, shortcut: shortcut, children: children }) }));
|
|
20
|
+
}
|
|
21
|
+
export function MenuCheckboxItem({ className, children, ...props }) {
|
|
22
|
+
return (_jsxs(MenuPrimitive.CheckboxItem, { "data-slot": "menu-checkbox-item", className: cn(itemClass, 'pl-7.5', className), ...props, children: [_jsx("span", { className: "absolute left-2 flex size-3.5 items-center justify-center", children: _jsx(MenuPrimitive.CheckboxItemIndicator, { children: _jsx(Check, { className: "size-3.5 text-skylab-400" }) }) }), children] }));
|
|
23
|
+
}
|
|
24
|
+
export const MenuRadioGroup = MenuPrimitive.RadioGroup;
|
|
25
|
+
export function MenuRadioItem({ className, children, ...props }) {
|
|
26
|
+
return (_jsxs(MenuPrimitive.RadioItem, { "data-slot": "menu-radio-item", className: cn(itemClass, 'pl-7.5', className), ...props, children: [_jsx("span", { className: "absolute left-2 flex size-3.5 items-center justify-center", children: _jsx(MenuPrimitive.RadioItemIndicator, { children: _jsx("span", { className: "block size-1.5 rounded-full bg-skylab-400" }) }) }), children] }));
|
|
27
|
+
}
|
|
28
|
+
const labelClass = 'px-2 pt-2 pb-1 text-3xs font-medium tracking-label text-subtle-foreground uppercase';
|
|
29
|
+
/** A run of related items; `label` names the group for assistive tech too. */
|
|
30
|
+
export function MenuGroup({ label, children, ...props }) {
|
|
31
|
+
return (_jsxs(MenuPrimitive.Group, { "data-slot": "menu-group", ...props, children: [label ? (_jsx(MenuPrimitive.GroupLabel, { className: labelClass, children: label })) : null, children] }));
|
|
32
|
+
}
|
|
33
|
+
/** A small uppercase heading anywhere in a menu, such as the signed-in e-mail. */
|
|
34
|
+
export function MenuLabel({ className, ...props }) {
|
|
35
|
+
return (_jsx("div", { "data-slot": "menu-label", role: "presentation", className: cn(labelClass, className), ...props }));
|
|
36
|
+
}
|
|
37
|
+
export function MenuSeparator({ className, ...props }) {
|
|
38
|
+
return (_jsx(MenuPrimitive.Separator, { "data-slot": "menu-separator", className: cn('-mx-1 my-1 h-px bg-border', className), ...props }));
|
|
39
|
+
}
|
|
40
|
+
export function MenuShortcut({ className, ...props }) {
|
|
41
|
+
return (_jsx("span", { "data-slot": "menu-shortcut", className: cn('ml-auto pl-4 font-mono text-3xs tracking-wide text-subtle-foreground', className), ...props }));
|
|
42
|
+
}
|
|
43
|
+
export const MenuSub = MenuPrimitive.SubmenuRoot;
|
|
44
|
+
export function MenuSubTrigger({ className, icon, inset, children, ...props }) {
|
|
45
|
+
return (_jsxs(MenuPrimitive.SubmenuTrigger, { "data-slot": "menu-sub-trigger", className: cn(itemClass, 'data-popup-open:bg-accent data-popup-open:text-foreground-strong', inset && 'pl-7.5', className), ...props, children: [_jsx(ItemBody, { icon: icon, children: children }), _jsx(ChevronRight, { className: "ml-auto text-subtle-foreground" })] }));
|
|
46
|
+
}
|
|
47
|
+
function MenuContent({ className, side, align, sideOffset, alignOffset, ...props }) {
|
|
48
|
+
return (_jsx(MenuPrimitive.Portal, { children: _jsx(MenuPrimitive.Positioner, { side: side, align: align, sideOffset: sideOffset, alignOffset: alignOffset, className: "z-50 outline-hidden", children: _jsx(MenuPrimitive.Popup, { "data-slot": "menu-content", className: cn(popupClass, className), ...props }) }) }));
|
|
49
|
+
}
|
|
50
|
+
export function MenuSubContent({ side = 'right', align = 'start', sideOffset = 2, alignOffset = -5, ...props }) {
|
|
51
|
+
return (_jsx(MenuContent, { side: side, align: align, sideOffset: sideOffset, alignOffset: alignOffset, ...props }));
|
|
52
|
+
}
|
|
53
|
+
/* Dropdown menu: opened from a trigger. */
|
|
54
|
+
export const DropdownMenu = MenuPrimitive.Root;
|
|
55
|
+
export const DropdownMenuTrigger = MenuPrimitive.Trigger;
|
|
56
|
+
export function DropdownMenuContent({ side = 'bottom', align = 'start', sideOffset = 4, ...props }) {
|
|
57
|
+
return _jsx(MenuContent, { side: side, align: align, sideOffset: sideOffset, ...props });
|
|
58
|
+
}
|
|
59
|
+
/* Context menu: opened by right click, or a long press on touch screens. */
|
|
60
|
+
export const ContextMenu = ContextMenuPrimitive.Root;
|
|
61
|
+
export function ContextMenuTrigger({ className, ...props }) {
|
|
62
|
+
return (_jsx(ContextMenuPrimitive.Trigger, { "data-slot": "context-menu-trigger", className: cn('select-none', className), ...props }));
|
|
63
|
+
}
|
|
64
|
+
export function ContextMenuContent({ className, ...props }) {
|
|
65
|
+
return (_jsx(ContextMenuPrimitive.Portal, { children: _jsx(ContextMenuPrimitive.Positioner, { className: "z-50 outline-hidden", children: _jsx(ContextMenuPrimitive.Popup, { "data-slot": "context-menu-content", className: cn(popupClass, className), ...props }) }) }));
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../../src/components/menu.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export type CalendarEvent = {
|
|
3
|
+
id: string;
|
|
4
|
+
/** The day, as an ISO date (YYYY-MM-DD). */
|
|
5
|
+
date: string;
|
|
6
|
+
title: string;
|
|
7
|
+
time?: string;
|
|
8
|
+
tone?: 'brand' | 'success' | 'warning' | 'info';
|
|
9
|
+
};
|
|
10
|
+
export type MonthCalendarProps = {
|
|
11
|
+
events: readonly CalendarEvent[];
|
|
12
|
+
/** The month first shown; this month by default. */
|
|
13
|
+
defaultMonth?: Date;
|
|
14
|
+
onSelectEvent?: (event: CalendarEvent) => void;
|
|
15
|
+
className?: string;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* The club's events on a month grid, weeks starting Monday in Turkish; on
|
|
19
|
+
* phones an agenda of the month's days that have events. Months slide in the
|
|
20
|
+
* direction you move.
|
|
21
|
+
*/
|
|
22
|
+
export declare function MonthCalendar({ events, defaultMonth, onSelectEvent, className, }: MonthCalendarProps): import("react").JSX.Element;
|
|
23
|
+
export type StatusPageProps = {
|
|
24
|
+
/** A large figure such as 404; leave out for a redirect or other wait. */
|
|
25
|
+
code?: ReactNode;
|
|
26
|
+
title: ReactNode;
|
|
27
|
+
description?: ReactNode;
|
|
28
|
+
/** Shows the SKY LAB loader instead of the code, for redirects. */
|
|
29
|
+
loading?: boolean;
|
|
30
|
+
/** Buttons such as "Ana sayfa" or "Yeniden dene". */
|
|
31
|
+
children?: ReactNode;
|
|
32
|
+
/** `div` when shown inside a page that already has its main landmark. */
|
|
33
|
+
as?: 'main' | 'div';
|
|
34
|
+
className?: string;
|
|
35
|
+
};
|
|
36
|
+
/** A whole-page state: not found, no access, a server error, or a redirect in progress. */
|
|
37
|
+
export declare function StatusPage({ code, title, description, loading, children, as: Root, className, }: StatusPageProps): import("react").JSX.Element;
|
|
38
|
+
//# sourceMappingURL=month-calendar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"month-calendar.d.ts","sourceRoot":"","sources":["../../src/components/month-calendar.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAOjD,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;CACjD,CAAC;AAYF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC;IACjC,oDAAoD;IACpD,YAAY,CAAC,EAAE,IAAI,CAAC;IACpB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,YAAY,EACZ,aAAa,EACb,SAAS,GACV,EAAE,kBAAkB,+BAiJpB;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,0EAA0E;IAC1E,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,mEAAmE;IACnE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,yEAAyE;IACzE,EAAE,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,2FAA2F;AAC3F,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,KAAK,EACL,WAAW,EACX,OAAe,EACf,QAAQ,EACR,EAAE,EAAE,IAAa,EACjB,SAAS,GACV,EAAE,eAAe,+BA4BjB"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { ChevronLeft, ChevronRight } from 'lucide-react';
|
|
4
|
+
import { useState } from 'react';
|
|
5
|
+
import { cn } from '../lib/cn.js';
|
|
6
|
+
import { useSkylcn } from '../lib/provider.js';
|
|
7
|
+
import { IconButton } from './button.js';
|
|
8
|
+
import { SkylabLoader } from './skylab-loader.js';
|
|
9
|
+
import { Swap } from './motion.js';
|
|
10
|
+
const TONE = {
|
|
11
|
+
brand: 'border-skylab-400/30 bg-skylab-500/10 text-skylab-300',
|
|
12
|
+
success: 'border-success/30 bg-success/10 text-success',
|
|
13
|
+
warning: 'border-warning/30 bg-warning/10 text-warning',
|
|
14
|
+
info: 'border-info/30 bg-info/10 text-info',
|
|
15
|
+
};
|
|
16
|
+
const iso = (d) => `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;
|
|
17
|
+
/**
|
|
18
|
+
* The club's events on a month grid, weeks starting Monday in Turkish; on
|
|
19
|
+
* phones an agenda of the month's days that have events. Months slide in the
|
|
20
|
+
* direction you move.
|
|
21
|
+
*/
|
|
22
|
+
export function MonthCalendar({ events, defaultMonth, onSelectEvent, className, }) {
|
|
23
|
+
const { locale, messages } = useSkylcn();
|
|
24
|
+
const tag = locale === 'tr' ? 'tr-TR' : 'en-US';
|
|
25
|
+
const [month, setMonth] = useState(() => {
|
|
26
|
+
const d = defaultMonth ?? new Date();
|
|
27
|
+
return new Date(d.getFullYear(), d.getMonth(), 1);
|
|
28
|
+
});
|
|
29
|
+
const [direction, setDirection] = useState(1);
|
|
30
|
+
const today = iso(new Date());
|
|
31
|
+
const move = (step) => {
|
|
32
|
+
setDirection(step);
|
|
33
|
+
setMonth((m) => new Date(m.getFullYear(), m.getMonth() + step, 1));
|
|
34
|
+
};
|
|
35
|
+
// Monday-first grid covering whole weeks around the month
|
|
36
|
+
const offset = (month.getDay() + 6) % 7;
|
|
37
|
+
const start = new Date(month.getFullYear(), month.getMonth(), 1 - offset);
|
|
38
|
+
const days = Array.from({ length: 42 }, (_, i) => new Date(start.getFullYear(), start.getMonth(), start.getDate() + i));
|
|
39
|
+
const weeks = days[35].getMonth() === month.getMonth() ? 6 : 5;
|
|
40
|
+
const shown = days.slice(0, weeks * 7);
|
|
41
|
+
const byDay = new Map();
|
|
42
|
+
for (const event of events)
|
|
43
|
+
byDay.set(event.date, [...(byDay.get(event.date) ?? []), event]);
|
|
44
|
+
const weekdays = Array.from({ length: 7 }, (_, i) => new Date(2024, 0, 1 + i).toLocaleDateString(tag, { weekday: 'short' }));
|
|
45
|
+
const title = month.toLocaleDateString(tag, { month: 'long', year: 'numeric' });
|
|
46
|
+
const chip = (event, block = false) => (_jsxs("button", { type: "button", onClick: () => onSelectEvent?.(event), className: cn('truncate rounded border px-1.5 py-0.5 text-left text-2xs outline-hidden focus-visible:ring-2 focus-visible:ring-ring', block && 'w-full py-1.5 text-xs', TONE[event.tone ?? 'brand']), children: [event.time ? _jsxs("span", { className: "tabular-nums", children: [event.time, " "] }) : null, event.title] }, event.id));
|
|
47
|
+
return (_jsxs("div", { "data-slot": "month-calendar", className: cn('flex flex-col gap-3', className), children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("h2", { "aria-live": "polite", className: "text-base font-semibold text-foreground capitalize", children: title }), _jsxs("div", { className: "ml-auto flex gap-1", children: [_jsx(IconButton, { icon: ChevronLeft, label: messages.previousMonth, variant: "ghost", size: "icon-sm", onClick: () => move(-1) }), _jsx(IconButton, { icon: ChevronRight, label: messages.nextMonth, variant: "ghost", size: "icon-sm", onClick: () => move(1) })] })] }), _jsxs(Swap, { id: iso(month), direction: direction, children: [_jsxs("div", { className: "hidden overflow-hidden rounded-xl border border-border md:block", children: [_jsx("div", { className: "grid grid-cols-7 border-b border-border bg-card", children: weekdays.map((day) => (_jsx("span", { className: "px-2 py-1.5 text-3xs font-medium tracking-label text-subtle-foreground uppercase", children: day }, day))) }), _jsx("div", { className: "grid grid-cols-7", children: shown.map((day) => {
|
|
48
|
+
const key = iso(day);
|
|
49
|
+
const inMonth = day.getMonth() === month.getMonth();
|
|
50
|
+
const list = byDay.get(key) ?? [];
|
|
51
|
+
return (_jsxs("div", { className: cn('flex min-h-24 flex-col gap-1 border-r border-b border-border-subtle p-1.5 [&:nth-child(7n)]:border-r-0', !inMonth && 'bg-muted/40'), children: [_jsx("span", { className: cn('grid size-6 place-items-center rounded-full text-2xs tabular-nums', key === today
|
|
52
|
+
? 'bg-primary text-primary-foreground'
|
|
53
|
+
: inMonth
|
|
54
|
+
? 'text-secondary-foreground'
|
|
55
|
+
: 'text-subtle-foreground'), children: day.getDate() }), list.slice(0, 2).map((event) => chip(event)), list.length > 2 ? (_jsxs("span", { className: "px-1 text-3xs text-subtle-foreground", children: ["+", list.length - 2] })) : null] }, key));
|
|
56
|
+
}) })] }), _jsxs("ol", { className: "flex flex-col gap-3 md:hidden", children: [shown
|
|
57
|
+
.filter((day) => day.getMonth() === month.getMonth() && byDay.has(iso(day)))
|
|
58
|
+
.map((day) => (_jsxs("li", { className: "flex gap-3", children: [_jsxs("span", { className: "w-12 shrink-0 text-center", children: [_jsx("span", { className: "block text-lg font-semibold text-foreground tabular-nums", children: day.getDate() }), _jsx("span", { className: "block text-3xs text-subtle-foreground uppercase", children: day.toLocaleDateString(tag, { weekday: 'short' }) })] }), _jsx("span", { className: "flex min-w-0 flex-1 flex-col gap-1", children: byDay.get(iso(day)).map((event) => chip(event, true)) })] }, iso(day)))), shown.some((day) => day.getMonth() === month.getMonth() && byDay.has(iso(day))) ? null : (_jsx("li", { className: "py-8 text-center text-xs text-muted-foreground", children: messages.noEventsThisMonth }))] })] })] }));
|
|
59
|
+
}
|
|
60
|
+
/** A whole-page state: not found, no access, a server error, or a redirect in progress. */
|
|
61
|
+
export function StatusPage({ code, title, description, loading = false, children, as: Root = 'main', className, }) {
|
|
62
|
+
return (_jsx(Root, { "data-slot": "status-page", role: loading ? 'status' : undefined, className: cn('flex min-h-dvh flex-col items-center justify-center gap-5 bg-background px-6 text-center', className), children: _jsxs("div", { className: "flex enter-rise-lg flex-col items-center gap-5", children: [loading ? (_jsx(SkylabLoader, { size: 64 })) : code ? (_jsx("p", { className: "bg-gradient-to-b from-foreground to-subtle-foreground bg-clip-text font-mono text-7xl font-bold text-transparent tabular-nums", children: code })) : null, _jsxs("div", { className: "flex max-w-md flex-col gap-2", children: [_jsx("h1", { className: "text-xl font-semibold text-foreground", children: title }), description ? (_jsx("p", { className: "text-sm leading-relaxed text-muted-foreground", children: description })) : null] }), children ? _jsx("div", { className: "flex flex-wrap justify-center gap-2", children: children }) : null] }) }));
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=month-calendar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"month-calendar.js","sourceRoot":"","sources":["../../src/components/month-calendar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export type CollapseProps = {
|
|
3
|
+
open: boolean;
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
className?: string;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Content that opens to its natural height and closes back to nothing, such
|
|
9
|
+
* as a field's error or a revealed section. Its overflow is released once
|
|
10
|
+
* open, so focus rings inside are not clipped.
|
|
11
|
+
*/
|
|
12
|
+
export declare function Collapse({ open, children, className }: CollapseProps): import("react").JSX.Element;
|
|
13
|
+
export type SwapProps = {
|
|
14
|
+
/** Identifies the content; changing it swaps the old content for the new. */
|
|
15
|
+
id: string | number;
|
|
16
|
+
/**
|
|
17
|
+
* Which way the new content comes from: 1 from the right (next), -1 from the
|
|
18
|
+
* left (previous), 0 a plain cross-fade.
|
|
19
|
+
*/
|
|
20
|
+
direction?: -1 | 0 | 1;
|
|
21
|
+
children: ReactNode;
|
|
22
|
+
className?: string;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Replaces content with a short cross-fade that slides in the direction of
|
|
26
|
+
* travel: tab panels, wizard steps, calendar months, a list and its empty state.
|
|
27
|
+
*/
|
|
28
|
+
export declare function Swap({ id, direction, children, className }: SwapProps): import("react").JSX.Element;
|
|
29
|
+
export type AnimatedNumberProps = {
|
|
30
|
+
value: number;
|
|
31
|
+
/** Formats the figure on every frame; whole numbers in the reader's locale by default. */
|
|
32
|
+
format?: (value: number) => string;
|
|
33
|
+
/** Gives every digit the same width, for figures in columns or small counters. */
|
|
34
|
+
tabular?: boolean;
|
|
35
|
+
className?: string;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* A figure that runs to its new value when it changes, never on first show.
|
|
39
|
+
* Screen readers get the final value only, once.
|
|
40
|
+
*/
|
|
41
|
+
export declare function AnimatedNumber({ value, format, tabular, className }: AnimatedNumberProps): import("react").JSX.Element;
|
|
42
|
+
export { AnimatePresence, LayoutGroup, m } from 'motion/react';
|
|
43
|
+
//# sourceMappingURL=motion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"motion.d.ts","sourceRoot":"","sources":["../../src/components/motion.tsx"],"names":[],"mappings":"AAGA,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAMpE,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,aAAa,+BA0BpE;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,6EAA6E;IAC7E,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAIF;;;GAGG;AACH,wBAAgB,IAAI,CAAC,EAAE,EAAE,EAAE,SAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,SAAS,+BAqBzE;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,0FAA0F;IAC1F,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,kFAAkF;IAClF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAe,EAAE,SAAS,EAAE,EAAE,mBAAmB,+BA4BhG;AAED,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { AnimatePresence, animate, m, useMotionValue, useTransform } from 'motion/react';
|
|
4
|
+
import { useEffect, useRef, useState } from 'react';
|
|
5
|
+
import { cn } from '../lib/cn.js';
|
|
6
|
+
import { motionTokens, transitions } from '../lib/motion-tokens.js';
|
|
7
|
+
import { useSkylcn } from '../lib/provider.js';
|
|
8
|
+
import { useReducedMotion } from '../lib/use-reduced-motion.js';
|
|
9
|
+
/**
|
|
10
|
+
* Content that opens to its natural height and closes back to nothing, such
|
|
11
|
+
* as a field's error or a revealed section. Its overflow is released once
|
|
12
|
+
* open, so focus rings inside are not clipped.
|
|
13
|
+
*/
|
|
14
|
+
export function Collapse({ open, children, className }) {
|
|
15
|
+
const reduced = useReducedMotion();
|
|
16
|
+
const [settled, setSettled] = useState(false);
|
|
17
|
+
return (_jsx(AnimatePresence, { initial: false, children: open ? (_jsx(m.div, { "data-slot": "collapse", initial: { height: 0, opacity: 0 }, animate: { height: 'auto', opacity: 1 }, exit: { height: 0, opacity: 0 }, transition: {
|
|
18
|
+
height: reduced ? { duration: 0 } : transitions.enterSlow,
|
|
19
|
+
opacity: transitions.enter,
|
|
20
|
+
}, onAnimationStart: () => setSettled(false), onAnimationComplete: () => setSettled(open), style: { overflow: settled ? 'visible' : 'hidden' }, className: className, children: children }, "collapse")) : null }));
|
|
21
|
+
}
|
|
22
|
+
const SWAP_SHIFT = 16;
|
|
23
|
+
/**
|
|
24
|
+
* Replaces content with a short cross-fade that slides in the direction of
|
|
25
|
+
* travel: tab panels, wizard steps, calendar months, a list and its empty state.
|
|
26
|
+
*/
|
|
27
|
+
export function Swap({ id, direction = 0, children, className }) {
|
|
28
|
+
return (_jsx("div", { "data-slot": "swap", className: cn('relative', className), children: _jsx(AnimatePresence, { initial: false, mode: "popLayout", custom: direction, children: _jsx(m.div, { custom: direction, variants: {
|
|
29
|
+
enter: (d) => ({ opacity: 0, x: d * SWAP_SHIFT }),
|
|
30
|
+
center: { opacity: 1, x: 0, transition: transitions.enter },
|
|
31
|
+
exit: (d) => ({ opacity: 0, x: d * -SWAP_SHIFT, transition: transitions.exit }),
|
|
32
|
+
}, initial: "enter", animate: "center", exit: "exit", children: children }, id) }) }));
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* A figure that runs to its new value when it changes, never on first show.
|
|
36
|
+
* Screen readers get the final value only, once.
|
|
37
|
+
*/
|
|
38
|
+
export function AnimatedNumber({ value, format, tabular = false, className }) {
|
|
39
|
+
const { locale } = useSkylcn();
|
|
40
|
+
const reduced = useReducedMotion();
|
|
41
|
+
const tag = locale === 'tr' ? 'tr-TR' : 'en-US';
|
|
42
|
+
const fmt = format ?? ((n) => Math.round(n).toLocaleString(tag));
|
|
43
|
+
const formatRef = useRef(fmt);
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
formatRef.current = fmt;
|
|
46
|
+
});
|
|
47
|
+
const current = useMotionValue(value);
|
|
48
|
+
const text = useTransform(current, (n) => formatRef.current(n));
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
const controls = animate(current, value, reduced ? { duration: 0 } : { duration: 0.6, ease: motionTokens.ease.enter });
|
|
51
|
+
return () => controls.stop();
|
|
52
|
+
}, [current, value, reduced]);
|
|
53
|
+
return (_jsxs("span", { "data-slot": "animated-number", className: cn(tabular && 'tabular-nums', className), children: [_jsx(m.span, { "aria-hidden": true, children: text }), _jsx("span", { className: "sr-only", children: fmt(value) })] }));
|
|
54
|
+
}
|
|
55
|
+
export { AnimatePresence, LayoutGroup, m } from 'motion/react';
|
|
56
|
+
//# sourceMappingURL=motion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"motion.js","sourceRoot":"","sources":["../../src/components/motion.tsx"],"names":[],"mappings":"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"}
|