@g4rcez/components 4.0.2 → 4.1.2
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/ai/SKILL.md +120 -153
- package/ai/docs/Alert.md +47 -48
- package/ai/docs/AnimatedList.md +88 -87
- package/ai/docs/Autocomplete.md +102 -106
- package/ai/docs/Button.md +33 -33
- package/ai/docs/Calendar.md +67 -101
- package/ai/docs/Card.md +59 -55
- package/ai/docs/Checkbox.md +77 -82
- package/ai/docs/CommandPalette.md +154 -172
- package/ai/docs/DatePicker.md +45 -64
- package/ai/docs/Dropdown.md +98 -126
- package/ai/docs/Empty.md +41 -44
- package/ai/docs/Expand.md +40 -54
- package/ai/docs/FileUpload.md +102 -109
- package/ai/docs/Form.md +35 -29
- package/ai/docs/FormReset.md +37 -37
- package/ai/docs/Heading.md +4 -6
- package/ai/docs/Input.md +73 -98
- package/ai/docs/InputField.md +67 -67
- package/ai/docs/List.md +88 -85
- package/ai/docs/Menu.md +62 -60
- package/ai/docs/Modal.md +129 -136
- package/ai/docs/MultiSelect.md +65 -84
- package/ai/docs/Notifications.md +96 -96
- package/ai/docs/PageCalendar.md +88 -97
- package/ai/docs/Polymorph.md +25 -41
- package/ai/docs/Progress.md +55 -51
- package/ai/docs/Radiobox.md +49 -41
- package/ai/docs/RenderOnView.md +26 -32
- package/ai/docs/Resizable.md +60 -65
- package/ai/docs/Select.md +158 -158
- package/ai/docs/Shortcut.md +14 -14
- package/ai/docs/Skeleton.md +56 -60
- package/ai/docs/Slider.md +26 -49
- package/ai/docs/Slot.md +15 -17
- package/ai/docs/Spinner.md +17 -15
- package/ai/docs/Stats.md +44 -42
- package/ai/docs/Step.md +60 -60
- package/ai/docs/Switch.md +44 -54
- package/ai/docs/Table.md +124 -136
- package/ai/docs/Tabs.md +90 -90
- package/ai/docs/Tag.md +63 -65
- package/ai/docs/TaskList.md +40 -50
- package/ai/docs/Textarea.md +47 -70
- package/ai/docs/Timeline.md +98 -96
- package/ai/docs/Toolbar.md +46 -46
- package/ai/docs/Tooltip.md +103 -103
- package/ai/docs/Typography.md +55 -55
- package/ai/docs/Wizard.md +104 -109
- package/ai/docs/index.md +116 -116
- package/dist/autocomplete-DcTNOwyg.js +393 -0
- package/dist/autocomplete-DcTNOwyg.js.map +1 -0
- package/dist/{calendar-B5lSd0ID.js → calendar-BJMHRoy2.js} +104 -105
- package/dist/calendar-BJMHRoy2.js.map +1 -0
- package/dist/components/core/button.d.ts.map +1 -1
- package/dist/components/core/button.js +10 -10
- package/dist/components/core/button.js.map +1 -1
- package/dist/components/core/button.jsx +79 -0
- package/dist/components/core/heading.jsx +4 -0
- package/dist/components/core/polymorph.d.ts +1 -1
- package/dist/components/core/polymorph.d.ts.map +1 -1
- package/dist/components/core/polymorph.jsx +5 -0
- package/dist/components/core/render-on-view.jsx +31 -0
- package/dist/components/core/resizable.jsx +51 -0
- package/dist/components/core/slot.d.ts.map +1 -1
- package/dist/components/core/slot.jsx +156 -0
- package/dist/components/core/tag.d.ts +1 -1
- package/dist/components/core/tag.d.ts.map +1 -1
- package/dist/components/core/tag.js +4 -4
- package/dist/components/core/tag.js.map +1 -1
- package/dist/components/core/tag.jsx +51 -0
- package/dist/components/core/typography.jsx +18 -0
- package/dist/components/display/alert.d.ts +1 -1
- package/dist/components/display/alert.d.ts.map +1 -1
- package/dist/components/display/alert.js +48 -46
- package/dist/components/display/alert.js.map +1 -1
- package/dist/components/display/alert.jsx +61 -0
- package/dist/components/display/calendar.js +6 -6
- package/dist/components/display/calendar.jsx +299 -0
- package/dist/components/display/card.js +2 -2
- package/dist/components/display/card.js.map +1 -1
- package/dist/components/display/card.jsx +43 -0
- package/dist/components/display/empty.jsx +11 -0
- package/dist/components/display/list.js +1 -1
- package/dist/components/display/list.js.map +1 -1
- package/dist/components/display/list.jsx +81 -0
- package/dist/components/display/notifications.d.ts +1 -1
- package/dist/components/display/notifications.d.ts.map +1 -1
- package/dist/components/display/notifications.js +3 -3
- package/dist/components/display/notifications.jsx +126 -0
- package/dist/components/display/progress.jsx +11 -0
- package/dist/components/display/shortcut.jsx +23 -0
- package/dist/components/display/skeleton.d.ts.map +1 -1
- package/dist/components/display/skeleton.jsx +19 -0
- package/dist/components/display/spinner.d.ts.map +1 -1
- package/dist/components/display/spinner.jsx +11 -0
- package/dist/components/display/stats.js +1 -1
- package/dist/components/display/stats.jsx +20 -0
- package/dist/components/display/step.jsx +131 -0
- package/dist/components/display/tabs.d.ts +1 -1
- package/dist/components/display/tabs.d.ts.map +1 -1
- package/dist/components/display/tabs.js +2 -2
- package/dist/components/display/tabs.jsx +125 -0
- package/dist/components/display/timeline.js +1 -1
- package/dist/components/display/timeline.jsx +25 -0
- package/dist/components/floating/command-palette.d.ts.map +1 -1
- package/dist/components/floating/command-palette.jsx +197 -0
- package/dist/components/floating/dropdown.d.ts.map +1 -1
- package/dist/components/floating/dropdown.js +25 -17
- package/dist/components/floating/dropdown.js.map +1 -1
- package/dist/components/floating/dropdown.jsx +56 -0
- package/dist/components/floating/expand.js +7 -7
- package/dist/components/floating/expand.js.map +1 -1
- package/dist/components/floating/expand.jsx +44 -0
- package/dist/components/floating/menu.js +10 -10
- package/dist/components/floating/menu.js.map +1 -1
- package/dist/components/floating/menu.jsx +147 -0
- package/dist/components/floating/modal.d.ts +4 -4
- package/dist/components/floating/modal.d.ts.map +1 -1
- package/dist/components/floating/modal.js +106 -102
- package/dist/components/floating/modal.js.map +1 -1
- package/dist/components/floating/modal.jsx +301 -0
- package/dist/components/floating/toolbar.jsx +5 -0
- package/dist/components/floating/tooltip.d.ts.map +1 -1
- package/dist/components/floating/tooltip.js +14 -14
- package/dist/components/floating/tooltip.js.map +1 -1
- package/dist/components/floating/tooltip.jsx +58 -0
- package/dist/components/floating/wizard.jsx +161 -0
- package/dist/components/form/autocomplete.d.ts.map +1 -1
- package/dist/components/form/autocomplete.js +6 -6
- package/dist/components/form/autocomplete.jsx +278 -0
- package/dist/components/form/checkbox.js +1 -1
- package/dist/components/form/checkbox.jsx +12 -0
- package/dist/components/form/date-picker.d.ts.map +1 -1
- package/dist/components/form/date-picker.js +5 -5
- package/dist/components/form/date-picker.jsx +115 -0
- package/dist/components/form/file-upload.d.ts.map +1 -1
- package/dist/components/form/file-upload.js +2 -2
- package/dist/components/form/file-upload.jsx +134 -0
- package/dist/components/form/form.js.map +1 -1
- package/dist/components/form/form.jsx +10 -0
- package/dist/components/form/formReset.jsx +17 -0
- package/dist/components/form/free-text.d.ts.map +1 -1
- package/dist/components/form/free-text.jsx +41 -0
- package/dist/components/form/input-field.d.ts +11 -11
- package/dist/components/form/input-field.d.ts.map +1 -1
- package/dist/components/form/input-field.jsx +58 -0
- package/dist/components/form/input.js +1 -1
- package/dist/components/form/input.jsx +36 -0
- package/dist/components/form/multi-select.d.ts.map +1 -1
- package/dist/components/form/multi-select.jsx +336 -0
- package/dist/components/form/radiobox.js +1 -1
- package/dist/components/form/radiobox.jsx +6 -0
- package/dist/components/form/select.js +3 -3
- package/dist/components/form/select.jsx +42 -0
- package/dist/components/form/slider.jsx +45 -0
- package/dist/components/form/switch.js +2 -2
- package/dist/components/form/switch.js.map +1 -1
- package/dist/components/form/switch.jsx +46 -0
- package/dist/components/form/task-list.jsx +26 -0
- package/dist/components/form/textarea.jsx +12 -0
- package/dist/components/index.d.ts +0 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +44 -0
- package/dist/components/page-calendar/calendar-header.jsx +83 -0
- package/dist/components/page-calendar/day-view.jsx +94 -0
- package/dist/components/page-calendar/event-pill.d.ts.map +1 -1
- package/dist/components/page-calendar/event-pill.jsx +25 -0
- package/dist/components/page-calendar/index.js +2 -0
- package/dist/components/page-calendar/month-view.jsx +46 -0
- package/dist/components/page-calendar/page-calendar.jsx +41 -0
- package/dist/components/page-calendar/page-calendar.types.js +1 -0
- package/dist/components/page-calendar/page-calendar.utils.js +93 -0
- package/dist/components/page-calendar/week-view.jsx +71 -0
- package/dist/components/table/filter.jsx +141 -0
- package/dist/components/table/group.jsx +68 -0
- package/dist/components/table/index.d.ts +2 -3
- package/dist/components/table/index.d.ts.map +1 -1
- package/dist/components/table/index.jsx +60 -0
- package/dist/components/table/inner-table.d.ts +2 -3
- package/dist/components/table/inner-table.d.ts.map +1 -1
- package/dist/components/table/inner-table.jsx +102 -0
- package/dist/components/table/metadata.jsx +36 -0
- package/dist/components/table/pagination.d.ts +3 -1
- package/dist/components/table/pagination.d.ts.map +1 -1
- package/dist/components/table/pagination.jsx +74 -0
- package/dist/components/table/row.d.ts +4 -5
- package/dist/components/table/row.d.ts.map +1 -1
- package/dist/components/table/row.jsx +49 -0
- package/dist/components/table/sort.d.ts.map +1 -1
- package/dist/components/table/sort.jsx +109 -0
- package/dist/components/table/table-lib.d.ts +1 -1
- package/dist/components/table/table-lib.d.ts.map +1 -1
- package/dist/components/table/table-lib.js +83 -0
- package/dist/components/table/table.context.jsx +4 -0
- package/dist/components/table/table.js +3 -3
- package/dist/components/table/thead.jsx +103 -0
- package/dist/config/context.js +12 -0
- package/dist/config/default-translations.d.ts +4 -0
- package/dist/config/default-translations.d.ts.map +1 -1
- package/dist/config/default-translations.jsx +87 -0
- package/dist/config/default-tweaks.js +4 -0
- package/dist/constants.js +2 -0
- package/dist/{date-picker-DwNo22lx.js → date-picker-Bnl07nd8.js} +8 -6
- package/dist/date-picker-Bnl07nd8.js.map +1 -0
- package/dist/{dom-Dl8XH0CK.js → dom-CyQHY7ID.js} +66 -61
- package/dist/dom-CyQHY7ID.js.map +1 -0
- package/dist/{file-upload-Brf2NkLr.js → file-upload-93d5DR4q.js} +139 -129
- package/dist/file-upload-93d5DR4q.js.map +1 -0
- package/dist/{floating-ui.react-QNHG9W4N.js → floating-ui.react-M2PGXLDp.js} +8 -8
- package/dist/floating-ui.react-M2PGXLDp.js.map +1 -0
- package/dist/{fns-D2eyJKd5.js → fns-C7Dt27Qd.js} +2 -2
- package/dist/fns-C7Dt27Qd.js.map +1 -0
- package/dist/hooks/use-click-outside.js +17 -0
- package/dist/hooks/use-color-parser.js +9 -0
- package/dist/hooks/use-components-provider.jsx +22 -0
- package/dist/hooks/use-debounce.d.ts +3 -3
- package/dist/hooks/use-debounce.d.ts.map +1 -1
- package/dist/hooks/use-debounce.js +12 -0
- package/dist/hooks/use-floating-ref.js +6 -0
- package/dist/hooks/use-form.d.ts +14 -13
- package/dist/hooks/use-form.d.ts.map +1 -1
- package/dist/hooks/use-form.js +563 -0
- package/dist/hooks/use-hover.js +18 -0
- package/dist/hooks/use-input-id.js +5 -0
- package/dist/hooks/use-is-coarse-device.js +12 -0
- package/dist/hooks/use-locale.js +10 -0
- package/dist/hooks/use-media-query.js +25 -0
- package/dist/hooks/use-on-event.js +7 -0
- package/dist/hooks/use-parent.js +21 -0
- package/dist/hooks/use-preferences.js +23 -0
- package/dist/hooks/use-previous.js +9 -0
- package/dist/hooks/use-reactive.js +9 -0
- package/dist/hooks/use-remove-scroll.d.ts.map +1 -1
- package/dist/hooks/use-remove-scroll.js +48 -0
- package/dist/hooks/use-resize-observer.js +17 -0
- package/dist/hooks/use-stable-ref.js +9 -0
- package/dist/hooks/use-swipe.js +17 -0
- package/dist/hooks/use-translations.d.ts +4 -0
- package/dist/hooks/use-translations.d.ts.map +1 -1
- package/dist/hooks/use-translations.js +9 -0
- package/dist/hooks/use-tweaks.js +9 -0
- package/dist/hooks/use-window-size.js +14 -0
- package/dist/index-BJ1ayTam.js +126 -0
- package/dist/index-BJ1ayTam.js.map +1 -0
- package/dist/index-C-PuFUZi.js.map +1 -1
- package/dist/{index-BelDtX5M.js → index-DDeQW0JW.js} +399 -404
- package/dist/index-DDeQW0JW.js.map +1 -0
- package/dist/index-DE4shK8D.js +215 -0
- package/dist/index-DE4shK8D.js.map +1 -0
- package/dist/{index-DJSMaZR4.js → index-DlJ_2RBL.js} +2 -2
- package/dist/index-DlJ_2RBL.js.map +1 -0
- package/dist/index.css +1 -1
- package/dist/index.esm-BaIwleSE.js.map +1 -1
- package/dist/index.js +20 -8177
- package/dist/index.js.map +1 -1
- package/dist/{input-CrGrSnUt.js → input-_MVxmIpu.js} +116 -114
- package/dist/input-_MVxmIpu.js.map +1 -0
- package/dist/{input-field-5vYcz5tT.js → input-field-CDCOODOl.js} +63 -47
- package/dist/input-field-CDCOODOl.js.map +1 -0
- package/dist/lib/combi-keys.js +60 -0
- package/dist/lib/dict.d.ts +1 -4
- package/dist/lib/dict.d.ts.map +1 -1
- package/dist/lib/dict.js +28 -0
- package/dist/lib/dom.d.ts +3 -2
- package/dist/lib/dom.d.ts.map +1 -1
- package/dist/lib/dom.js +66 -0
- package/dist/lib/fns.js +46 -0
- package/dist/lib/fzf.d.ts.map +1 -1
- package/dist/lib/fzf.js +115 -0
- package/dist/lib/keyboard-area.js +14 -0
- package/dist/notifications-Dp0ydKJS.js +2576 -0
- package/dist/notifications-Dp0ydKJS.js.map +1 -0
- package/dist/polymorph-B5n9fs_K.js.map +1 -1
- package/dist/preset/plugin.tailwind.d.ts.map +1 -1
- package/dist/preset/plugin.tailwind.js +20 -18
- package/dist/preset/preset.tailwind.js +24 -25
- package/dist/preset/src/styles/common.js +6 -3
- package/dist/preset/src/styles/dark.d.ts.map +1 -1
- package/dist/preset/src/styles/dark.js +9 -5
- package/dist/preset/src/styles/design-tokens.js +68 -89
- package/dist/preset/src/styles/light.d.ts.map +1 -1
- package/dist/preset/src/styles/light.js +9 -5
- package/dist/preset/src/styles/theme.js +7 -4
- package/dist/preset/src/styles/theme.types.d.ts +2 -1
- package/dist/preset/src/styles/theme.types.d.ts.map +1 -1
- package/dist/preset/src/styles/theme.types.js +2 -1
- package/dist/skeleton-BjJobYYf.js +24 -0
- package/dist/skeleton-BjJobYYf.js.map +1 -0
- package/dist/slot-CRyweuj0.js.map +1 -1
- package/dist/styles/common.js +6 -3
- package/dist/styles/dark.d.ts.map +1 -1
- package/dist/styles/dark.js +9 -5
- package/dist/styles/design-tokens.js +68 -89
- package/dist/styles/light.d.ts.map +1 -1
- package/dist/styles/light.js +9 -5
- package/dist/styles/theme.js +7 -4
- package/dist/styles/theme.types.d.ts +2 -1
- package/dist/styles/theme.types.d.ts.map +1 -1
- package/dist/styles/theme.types.js +2 -1
- package/dist/tabs-B0g7YtQv.js +123 -0
- package/dist/tabs-B0g7YtQv.js.map +1 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/dist/types.d.ts +2 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -0
- package/dist/{context-BFXNJVn2.js → use-translations-DSltA7H_.js} +38 -30
- package/dist/use-translations-DSltA7H_.js.map +1 -0
- package/package.json +99 -86
- package/ai/docs/TransferList.md +0 -142
- package/dist/autocomplete-Cn9Z2hLq.js +0 -375
- package/dist/autocomplete-Cn9Z2hLq.js.map +0 -1
- package/dist/calendar-B5lSd0ID.js.map +0 -1
- package/dist/components/form/transfer-list.d.ts +0 -14
- package/dist/components/form/transfer-list.d.ts.map +0 -1
- package/dist/components/form/transfer-list.js +0 -55
- package/dist/components/form/transfer-list.js.map +0 -1
- package/dist/context-BFXNJVn2.js.map +0 -1
- package/dist/date-picker-DwNo22lx.js.map +0 -1
- package/dist/dom-Dl8XH0CK.js.map +0 -1
- package/dist/file-upload-Brf2NkLr.js.map +0 -1
- package/dist/floating-ui.react-QNHG9W4N.js.map +0 -1
- package/dist/fns-D2eyJKd5.js.map +0 -1
- package/dist/index-BelDtX5M.js.map +0 -1
- package/dist/index-DJSMaZR4.js.map +0 -1
- package/dist/index-Z-fZHxfJ.js +0 -335
- package/dist/index-Z-fZHxfJ.js.map +0 -1
- package/dist/input-CrGrSnUt.js.map +0 -1
- package/dist/input-field-5vYcz5tT.js.map +0 -1
- package/dist/notifications-cUdVPs-B.js +0 -2786
- package/dist/notifications-cUdVPs-B.js.map +0 -1
- package/dist/skeleton-D75GFBV6.js +0 -10
- package/dist/skeleton-D75GFBV6.js.map +0 -1
- package/dist/tabs-S00a8qq8.js +0 -106
- package/dist/tabs-S00a8qq8.js.map +0 -1
- package/dist/use-translations-BwLKTrZv.js +0 -10
- package/dist/use-translations-BwLKTrZv.js.map +0 -1
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { InfoIcon } from "@phosphor-icons/react";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { Is } from "sidekicker";
|
|
4
|
+
import { css } from "../../lib/dom";
|
|
5
|
+
import { Polymorph } from "../core/polymorph";
|
|
6
|
+
import { Skeleton } from "./skeleton";
|
|
7
|
+
export const Card = ({ title, loading, children, as, header = null, container = "", titleClassName = "", ...props }) => (<Polymorph {...props} as={as || "div"} data-component="card" className={css("flex w-full flex-col gap-4 rounded-card border border-card-border bg-card-background py-3 shadow-shadow-card", container)}>
|
|
8
|
+
{title ? (<header data-component="card-title" className={css("mb-2 w-full border-b border-card-border px-6 pb-2 text-xl font-medium", titleClassName)}>
|
|
9
|
+
{title}
|
|
10
|
+
</header>) : (header)}
|
|
11
|
+
<div data-component="card-body" className={css("min-w-full px-6", props.className)}>
|
|
12
|
+
{loading ? (<div className="flex flex-col gap-4">
|
|
13
|
+
<Skeleton className="w-full"/>
|
|
14
|
+
<Skeleton className="w-8/12"/>
|
|
15
|
+
<Skeleton className="w-10/12"/>
|
|
16
|
+
<Skeleton className="w-1/2"/>
|
|
17
|
+
</div>) : (children)}
|
|
18
|
+
</div>
|
|
19
|
+
</Polymorph>);
|
|
20
|
+
Card.Title = ({ as, titleTag, navTag, children, ...props }) => {
|
|
21
|
+
const Component = (as || "div");
|
|
22
|
+
const Title = (titleTag || "h2");
|
|
23
|
+
const Nav = (navTag || "nav");
|
|
24
|
+
return (<Component {...props} title={Is.string(props.title) ? props.title : undefined} className={css("flex w-full flex-col flex-wrap items-start justify-between gap-base sm:flex-row sm:items-center", props.className)}>
|
|
25
|
+
<Title className="font-semibold">{props.title}</Title>
|
|
26
|
+
{children ? (<Nav className="gap-kilo flex flex-col items-start justify-start sm:flex-row sm:items-center sm:justify-end">{children}</Nav>) : null}
|
|
27
|
+
</Component>);
|
|
28
|
+
};
|
|
29
|
+
export const StatsCard = (props) => {
|
|
30
|
+
const interactive = props.interactive ?? true;
|
|
31
|
+
const Icon = props.Icon ?? InfoIcon;
|
|
32
|
+
return (<Card {...props} title={null} loading={undefined} container="px-0 py-0" className="flex items-center gap-4 px-0">
|
|
33
|
+
<div className={`flex w-full items-center gap-4 rounded-card px-0 lg:px-0 ${interactive ? "transition-colors duration-300 ease-linear hover:bg-primary-hover/10" : ""}`}>
|
|
34
|
+
<div className={css("flex aspect-square h-[stretch] w-20 items-center justify-center rounded-l-card bg-primary p-4 text-primary-foreground", props.mark)}>
|
|
35
|
+
{<Icon size={48}/>}
|
|
36
|
+
</div>
|
|
37
|
+
<div className="flex flex-col justify-center gap-2 py-2">
|
|
38
|
+
<p className="text-lg">{props.title}</p>
|
|
39
|
+
{props.loading ? <Skeleton className="h-10"/> : <p className="text-4xl font-bold tracking-wide">{props.value}</p>}
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
</Card>);
|
|
43
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { FileIcon } from "@phosphor-icons/react";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { useTranslations } from "../../hooks/use-translations";
|
|
4
|
+
export const Empty = (props) => {
|
|
5
|
+
const Icon = props.Icon ?? FileIcon;
|
|
6
|
+
const translate = useTranslations();
|
|
7
|
+
return (<div className="flex w-full flex-col items-center justify-center gap-4 px-8 py-12">
|
|
8
|
+
<Icon size={64} className="text-disabled"/>
|
|
9
|
+
<p className="text-disabled">{props.message ?? translate.emptyDataMessage}</p>
|
|
10
|
+
</div>);
|
|
11
|
+
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as e, jsxs as r } from "react/jsx-runtime";
|
|
2
|
-
import { u as w, n as F, d as k,
|
|
2
|
+
import { u as w, n as F, d as k, j as C, c as I, F as j, l as A, m as O } from "../../floating-ui.react-M2PGXLDp.js";
|
|
3
3
|
import { e as P } from "../../X.es-BJ1O93El.js";
|
|
4
4
|
import $, { useState as L, useId as M, useCallback as z, Fragment as m } from "react";
|
|
5
5
|
import { m as s, A as S } from "../../proxy-BZcQiBrp.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sources":["../../../src/components/display/list.tsx"],"sourcesContent":["\"use client\";\nimport {\n FloatingContext,\n FloatingFocusManager,\n FloatingOverlay,\n FloatingPortal,\n useClick,\n useDismiss,\n useFloating,\n useInteractions,\n useRole,\n} from \"@floating-ui/react\";\nimport { AnimatePresence, motion, MotionConfig } from \"motion/react\";\nimport { XIcon } from \"@phosphor-icons/react\";\nimport React, { Fragment, PropsWithChildren, useCallback, useId, useState } from \"react\";\nimport { Label } from \"../../types\";\n\ntype AnimatedItemProps = {\n title: Label;\n description: Label;\n children: Label;\n avatar?: Label;\n leading?: React.FC<{ open: () => void }>;\n};\n\ntype IdAnimatedItem = AnimatedItemProps & { id: string };\n\ntype AnimatedListProps = object;\n\ntype FloatItemProps = {\n setter: () => void;\n context: FloatingContext;\n item: IdAnimatedItem | null;\n refs: { setFloating: any };\n get: ReturnType<typeof useInteractions>[\"getFloatingProps\"];\n};\n\nconst FloatItem = ({ item, context, setter, get, refs }: FloatItemProps) => (\n <FloatingPortal>\n <MotionConfig reducedMotion=\"user\" transition={{ type: \"spring\", damping: 30, stiffness: 350 }}>\n <AnimatePresence mode=\"wait\" presenceAffectsLayout>\n {item ? (\n <motion.div\n key=\"overlay\"\n exit={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n initial={{ opacity: 0 }}\n transition={{ type: \"tween\", duration: 0.15, ease: \"easeOut\" }}\n className=\"pointer-events-none fixed inset-0 top-0 z-overlay h-screen w-screen bg-floating-overlay/70\"\n />\n ) : null}\n {item ? (\n <FloatingOverlay key=\"card\" lockScroll className=\"absolute inset-0 z-floating flex items-center justify-center\">\n <FloatingFocusManager visuallyHiddenDismiss modal closeOnFocusOut context={context}>\n <motion.div\n layout\n layoutId={`item-${item.id}`}\n initial={{ opacity: 0.6, scale: 0.98 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.98 }}\n className=\"relative flex h-min w-min min-w-xs flex-col gap-4 rounded-card border border-card-border bg-card-background p-6 py-4 pb-8 shadow-shadow-card\"\n ref={refs.setFloating}\n {...get()}\n >\n <nav className=\"absolute right-4 top-1 lg:right-2\">\n <button\n type=\"button\"\n onClick={setter}\n className=\"p-1 opacity-70 transition-colors hover:text-danger hover:opacity-100 focus:text-danger\"\n >\n <XIcon />\n </button>\n </nav>\n <motion.header layout className=\"flex w-full flex-wrap items-center justify-between gap-2\">\n <h3 className=\"min-w-full text-balance text-2xl font-medium\">{item.title}</h3>\n <p className=\"text-sm leading-snug text-secondary\">{item.description}</p>\n </motion.header>\n <motion.div layout>{item.children}</motion.div>\n </motion.div>\n </FloatingFocusManager>\n </FloatingOverlay>\n ) : null}\n </AnimatePresence>\n </MotionConfig>\n </FloatingPortal>\n);\n\nexport const AnimatedList = (props: PropsWithChildren<AnimatedListProps>) => {\n const [selected, setSelected] = useState<IdAnimatedItem | null>(null);\n const id = useId();\n const { context, refs } = useFloating({\n open: selected !== null,\n transform: true,\n onOpenChange: (open) => (open ? undefined : setSelected(null)),\n });\n const click = useClick(context);\n const role = useRole(context, { role: \"dialog\" });\n const dismiss = useDismiss(context, { escapeKey: true, referencePress: true, outsidePress: true });\n const { getFloatingProps } = useInteractions([click, role, dismiss]);\n\n const clear = useCallback(() => {\n setSelected(null);\n }, []);\n\n const items = React.Children.toArray(props.children);\n\n return (\n <Fragment>\n <FloatItem refs={refs} context={context} get={getFloatingProps} item={selected} setter={clear} />\n <ul role=\"list\">\n {items.map((x, index) => {\n const item: AnimatedItemProps = (x as any).props;\n const innerId = `${id}-${index}`;\n const setter = () => setSelected({ ...item, id: innerId });\n const Leading = item.leading;\n return (\n <motion.li\n layout\n key={innerId}\n layoutId={`item-${innerId}`}\n className={`border-b border-card-border py-2 last:border-transparent`}\n >\n <motion.div layoutId={`toast-${innerId}`} className=\"relative\">\n <div className=\"relative flex items-start space-x-3\">\n <Fragment>\n {item.avatar ? (\n <div>\n <div className=\"relative px-1\">\n <button onClick={setter} className=\"flex size-10 items-center justify-center ring-primary\">\n {item.avatar}\n </button>\n </div>\n </div>\n ) : null}\n <div className=\"min-w-0 flex-1 py-1 text-foreground\">\n <div className=\"flex flex-row flex-nowrap justify-between gap-4\">\n <button\n onClick={setter}\n className=\"cursor-pointer text-left transition-all ease-out hover:text-primary\"\n >\n <h3>{item.title}</h3>\n <p className=\"text-sm leading-snug text-secondary\">{item.description}</p>\n </button>\n {Leading ? <Leading open={setter} /> : null}\n </div>\n </div>\n </Fragment>\n </div>\n </motion.div>\n </motion.li>\n );\n })}\n </ul>\n </Fragment>\n );\n};\n\nexport const AnimatedListItem = (props: PropsWithChildren<AnimatedItemProps>) => <Fragment>{props.children}</Fragment>;\n"],"names":["FloatItem","item","context","setter","get","refs","jsx","FloatingPortal","MotionConfig","jsxs","AnimatePresence","motion","FloatingOverlay","FloatingFocusManager","XIcon","AnimatedList","props","selected","setSelected","useState","id","useId","useFloating","open","click","useClick","role","useRole","dismiss","useDismiss","getFloatingProps","useInteractions","clear","useCallback","items","React","Fragment","x","index","innerId","Leading","AnimatedListItem"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"list.js","sources":["../../../src/components/display/list.tsx"],"sourcesContent":["\"use client\";\nimport {\n FloatingContext,\n FloatingFocusManager,\n FloatingOverlay,\n FloatingPortal,\n useClick,\n useDismiss,\n useFloating,\n useInteractions,\n useRole,\n} from \"@floating-ui/react\";\nimport { AnimatePresence, motion, MotionConfig } from \"motion/react\";\nimport { XIcon } from \"@phosphor-icons/react\";\nimport React, { Fragment, PropsWithChildren, useCallback, useId, useState } from \"react\";\nimport { Label } from \"../../types\";\n\ntype AnimatedItemProps = {\n title: Label;\n description: Label;\n children: Label;\n avatar?: Label;\n leading?: React.FC<{ open: () => void }>;\n};\n\ntype IdAnimatedItem = AnimatedItemProps & { id: string };\n\ntype AnimatedListProps = object;\n\ntype FloatItemProps = {\n setter: () => void;\n context: FloatingContext;\n item: IdAnimatedItem | null;\n refs: { setFloating: (node: HTMLElement | null) => void };\n get: ReturnType<typeof useInteractions>[\"getFloatingProps\"];\n};\n\nconst FloatItem = ({ item, context, setter, get, refs }: FloatItemProps) => (\n <FloatingPortal>\n <MotionConfig reducedMotion=\"user\" transition={{ type: \"spring\", damping: 30, stiffness: 350 }}>\n <AnimatePresence mode=\"wait\" presenceAffectsLayout>\n {item ? (\n <motion.div\n key=\"overlay\"\n exit={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n initial={{ opacity: 0 }}\n transition={{ type: \"tween\", duration: 0.15, ease: \"easeOut\" }}\n className=\"pointer-events-none fixed inset-0 top-0 z-overlay h-screen w-screen bg-floating-overlay/70\"\n />\n ) : null}\n {item ? (\n <FloatingOverlay key=\"card\" lockScroll className=\"absolute inset-0 z-floating flex items-center justify-center\">\n <FloatingFocusManager visuallyHiddenDismiss modal closeOnFocusOut context={context}>\n <motion.div\n layout\n layoutId={`item-${item.id}`}\n initial={{ opacity: 0.6, scale: 0.98 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.98 }}\n className=\"relative flex h-min w-min min-w-xs flex-col gap-4 rounded-card border border-card-border bg-card-background p-6 py-4 pb-8 shadow-shadow-card\"\n ref={refs.setFloating}\n {...get()}\n >\n <nav className=\"absolute right-4 top-1 lg:right-2\">\n <button\n type=\"button\"\n onClick={setter}\n className=\"p-1 opacity-70 transition-colors hover:text-danger hover:opacity-100 focus:text-danger\"\n >\n <XIcon />\n </button>\n </nav>\n <motion.header layout className=\"flex w-full flex-wrap items-center justify-between gap-2\">\n <h3 className=\"min-w-full text-balance text-2xl font-medium\">{item.title}</h3>\n <p className=\"text-sm leading-snug text-secondary\">{item.description}</p>\n </motion.header>\n <motion.div layout>{item.children}</motion.div>\n </motion.div>\n </FloatingFocusManager>\n </FloatingOverlay>\n ) : null}\n </AnimatePresence>\n </MotionConfig>\n </FloatingPortal>\n);\n\nexport const AnimatedList = (props: PropsWithChildren<AnimatedListProps>) => {\n const [selected, setSelected] = useState<IdAnimatedItem | null>(null);\n const id = useId();\n const { context, refs } = useFloating({\n open: selected !== null,\n transform: true,\n onOpenChange: (open) => (open ? undefined : setSelected(null)),\n });\n const click = useClick(context);\n const role = useRole(context, { role: \"dialog\" });\n const dismiss = useDismiss(context, { escapeKey: true, referencePress: true, outsidePress: true });\n const { getFloatingProps } = useInteractions([click, role, dismiss]);\n\n const clear = useCallback(() => {\n setSelected(null);\n }, []);\n\n const items = React.Children.toArray(props.children);\n\n return (\n <Fragment>\n <FloatItem refs={refs} context={context} get={getFloatingProps} item={selected} setter={clear} />\n <ul role=\"list\">\n {items.map((x, index) => {\n const item = (x as React.ReactElement<AnimatedItemProps>).props;\n const innerId = `${id}-${index}`;\n const setter = () => setSelected({ ...item, id: innerId });\n const Leading = item.leading;\n return (\n <motion.li\n layout\n key={innerId}\n layoutId={`item-${innerId}`}\n className={`border-b border-card-border py-2 last:border-transparent`}\n >\n <motion.div layoutId={`toast-${innerId}`} className=\"relative\">\n <div className=\"relative flex items-start space-x-3\">\n <Fragment>\n {item.avatar ? (\n <div>\n <div className=\"relative px-1\">\n <button onClick={setter} className=\"flex size-10 items-center justify-center ring-primary\">\n {item.avatar}\n </button>\n </div>\n </div>\n ) : null}\n <div className=\"min-w-0 flex-1 py-1 text-foreground\">\n <div className=\"flex flex-row flex-nowrap justify-between gap-4\">\n <button\n onClick={setter}\n className=\"cursor-pointer text-left transition-all ease-out hover:text-primary\"\n >\n <h3>{item.title}</h3>\n <p className=\"text-sm leading-snug text-secondary\">{item.description}</p>\n </button>\n {Leading ? <Leading open={setter} /> : null}\n </div>\n </div>\n </Fragment>\n </div>\n </motion.div>\n </motion.li>\n );\n })}\n </ul>\n </Fragment>\n );\n};\n\nexport const AnimatedListItem = (props: PropsWithChildren<AnimatedItemProps>) => <Fragment>{props.children}</Fragment>;\n"],"names":["FloatItem","item","context","setter","get","refs","jsx","FloatingPortal","MotionConfig","jsxs","AnimatePresence","motion","FloatingOverlay","FloatingFocusManager","XIcon","AnimatedList","props","selected","setSelected","useState","id","useId","useFloating","open","click","useClick","role","useRole","dismiss","useDismiss","getFloatingProps","useInteractions","clear","useCallback","items","React","Fragment","x","index","innerId","Leading","AnimatedListItem"],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { FloatingFocusManager, FloatingOverlay, FloatingPortal, useClick, useDismiss, useFloating, useInteractions, useRole, } from "@floating-ui/react";
|
|
3
|
+
import { AnimatePresence, motion, MotionConfig } from "motion/react";
|
|
4
|
+
import { XIcon } from "@phosphor-icons/react";
|
|
5
|
+
import React, { Fragment, useCallback, useId, useState } from "react";
|
|
6
|
+
const FloatItem = ({ item, context, setter, get, refs }) => (<FloatingPortal>
|
|
7
|
+
<MotionConfig reducedMotion="user" transition={{ type: "spring", damping: 30, stiffness: 350 }}>
|
|
8
|
+
<AnimatePresence mode="wait" presenceAffectsLayout>
|
|
9
|
+
{item ? (<motion.div key="overlay" exit={{ opacity: 0 }} animate={{ opacity: 1 }} initial={{ opacity: 0 }} transition={{ type: "tween", duration: 0.15, ease: "easeOut" }} className="pointer-events-none fixed inset-0 top-0 z-overlay h-screen w-screen bg-floating-overlay/70"/>) : null}
|
|
10
|
+
{item ? (<FloatingOverlay key="card" lockScroll className="absolute inset-0 z-floating flex items-center justify-center">
|
|
11
|
+
<FloatingFocusManager visuallyHiddenDismiss modal closeOnFocusOut context={context}>
|
|
12
|
+
<motion.div layout layoutId={`item-${item.id}`} initial={{ opacity: 0.6, scale: 0.98 }} animate={{ opacity: 1, scale: 1 }} exit={{ opacity: 0, scale: 0.98 }} className="relative flex h-min w-min min-w-xs flex-col gap-4 rounded-card border border-card-border bg-card-background p-6 py-4 pb-8 shadow-shadow-card" ref={refs.setFloating} {...get()}>
|
|
13
|
+
<nav className="absolute right-4 top-1 lg:right-2">
|
|
14
|
+
<button type="button" onClick={setter} className="p-1 opacity-70 transition-colors hover:text-danger hover:opacity-100 focus:text-danger">
|
|
15
|
+
<XIcon />
|
|
16
|
+
</button>
|
|
17
|
+
</nav>
|
|
18
|
+
<motion.header layout className="flex w-full flex-wrap items-center justify-between gap-2">
|
|
19
|
+
<h3 className="min-w-full text-balance text-2xl font-medium">{item.title}</h3>
|
|
20
|
+
<p className="text-sm leading-snug text-secondary">{item.description}</p>
|
|
21
|
+
</motion.header>
|
|
22
|
+
<motion.div layout>{item.children}</motion.div>
|
|
23
|
+
</motion.div>
|
|
24
|
+
</FloatingFocusManager>
|
|
25
|
+
</FloatingOverlay>) : null}
|
|
26
|
+
</AnimatePresence>
|
|
27
|
+
</MotionConfig>
|
|
28
|
+
</FloatingPortal>);
|
|
29
|
+
export const AnimatedList = (props) => {
|
|
30
|
+
const [selected, setSelected] = useState(null);
|
|
31
|
+
const id = useId();
|
|
32
|
+
const { context, refs } = useFloating({
|
|
33
|
+
open: selected !== null,
|
|
34
|
+
transform: true,
|
|
35
|
+
onOpenChange: (open) => (open ? undefined : setSelected(null)),
|
|
36
|
+
});
|
|
37
|
+
const click = useClick(context);
|
|
38
|
+
const role = useRole(context, { role: "dialog" });
|
|
39
|
+
const dismiss = useDismiss(context, { escapeKey: true, referencePress: true, outsidePress: true });
|
|
40
|
+
const { getFloatingProps } = useInteractions([click, role, dismiss]);
|
|
41
|
+
const clear = useCallback(() => {
|
|
42
|
+
setSelected(null);
|
|
43
|
+
}, []);
|
|
44
|
+
const items = React.Children.toArray(props.children);
|
|
45
|
+
return (<Fragment>
|
|
46
|
+
<FloatItem refs={refs} context={context} get={getFloatingProps} item={selected} setter={clear}/>
|
|
47
|
+
<ul role="list">
|
|
48
|
+
{items.map((x, index) => {
|
|
49
|
+
const item = x.props;
|
|
50
|
+
const innerId = `${id}-${index}`;
|
|
51
|
+
const setter = () => setSelected({ ...item, id: innerId });
|
|
52
|
+
const Leading = item.leading;
|
|
53
|
+
return (<motion.li layout key={innerId} layoutId={`item-${innerId}`} className={`border-b border-card-border py-2 last:border-transparent`}>
|
|
54
|
+
<motion.div layoutId={`toast-${innerId}`} className="relative">
|
|
55
|
+
<div className="relative flex items-start space-x-3">
|
|
56
|
+
<Fragment>
|
|
57
|
+
{item.avatar ? (<div>
|
|
58
|
+
<div className="relative px-1">
|
|
59
|
+
<button onClick={setter} className="flex size-10 items-center justify-center ring-primary">
|
|
60
|
+
{item.avatar}
|
|
61
|
+
</button>
|
|
62
|
+
</div>
|
|
63
|
+
</div>) : null}
|
|
64
|
+
<div className="min-w-0 flex-1 py-1 text-foreground">
|
|
65
|
+
<div className="flex flex-row flex-nowrap justify-between gap-4">
|
|
66
|
+
<button onClick={setter} className="cursor-pointer text-left transition-all ease-out hover:text-primary">
|
|
67
|
+
<h3>{item.title}</h3>
|
|
68
|
+
<p className="text-sm leading-snug text-secondary">{item.description}</p>
|
|
69
|
+
</button>
|
|
70
|
+
{Leading ? <Leading open={setter}/> : null}
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
73
|
+
</Fragment>
|
|
74
|
+
</div>
|
|
75
|
+
</motion.div>
|
|
76
|
+
</motion.li>);
|
|
77
|
+
})}
|
|
78
|
+
</ul>
|
|
79
|
+
</Fragment>);
|
|
80
|
+
};
|
|
81
|
+
export const AnimatedListItem = (props) => <Fragment>{props.children}</Fragment>;
|
|
@@ -3,7 +3,7 @@ import { type PropsWithChildren } from "react";
|
|
|
3
3
|
import { Label } from "../../types";
|
|
4
4
|
declare const variants: (props?: ({
|
|
5
5
|
theme?: "info" | "warn" | "muted" | "danger" | "success" | "secondary" | "default" | null | undefined;
|
|
6
|
-
} & import("class-variance-authority/
|
|
6
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
7
7
|
type NotificationOptions = Partial<{
|
|
8
8
|
id: string;
|
|
9
9
|
title: Label;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../../src/components/display/notifications.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGlE,OAAO,EAAiB,KAAK,iBAAiB,EAAmC,MAAM,OAAO,CAAC;AAG/F,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,QAAA,MAAM,QAAQ;;
|
|
1
|
+
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../../src/components/display/notifications.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGlE,OAAO,EAAiB,KAAK,iBAAiB,EAAmC,MAAM,OAAO,CAAC;AAG/F,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,QAAA,MAAM,QAAQ;;8EAgBb,CAAC;AAYF,KAAK,mBAAmB,GAAG,OAAO,CAAC;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC;CACjD,CAAC,CAAC;AAQH,KAAK,sBAAsB,GAAG;IAAE,KAAK,EAAE,MAAM,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC;AAEvE,KAAK,eAAe,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,mBAAmB,KAAK,sBAAsB,CAAC;AAMlG,eAAO,MAAM,eAAe,uBAAwC,CAAC;AAkDrE,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAsF1E,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,GAAO,EAAE,OAAc,EAAE,EAAE,iBAAiB,CAAC,iBAAiB,CAAC,+BAMxG"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import "react/jsx-runtime";
|
|
2
|
-
import "../../index-
|
|
2
|
+
import "../../index-DlJ_2RBL.js";
|
|
3
3
|
import "../../CheckCircle.es-C6QWLfk_.js";
|
|
4
|
-
import { w as n, s as N } from "../../notifications-
|
|
4
|
+
import { w as n, s as N } from "../../notifications-Dp0ydKJS.js";
|
|
5
5
|
import "../../Info.es-CrZKs4q4.js";
|
|
6
6
|
import "../../Warning.es-D_eI6tLe.js";
|
|
7
7
|
import "../../X.es-BJ1O93El.js";
|
|
8
8
|
import "react";
|
|
9
|
-
import "../../dom-
|
|
9
|
+
import "../../dom-CyQHY7ID.js";
|
|
10
10
|
import "../../proxy-BZcQiBrp.js";
|
|
11
11
|
export {
|
|
12
12
|
n as Notifications,
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Toast as Base } from "@base-ui/react/toast";
|
|
3
|
+
import { cva } from "class-variance-authority";
|
|
4
|
+
import { XIcon, CheckCircleIcon, WarningIcon, InfoIcon, CircleNotchIcon } from "@phosphor-icons/react";
|
|
5
|
+
import { AnimatePresence, motion } from "motion/react";
|
|
6
|
+
import { createContext, useCallback, useContext, useRef } from "react";
|
|
7
|
+
import { useHover } from "../../hooks/use-hover";
|
|
8
|
+
import { css } from "../../lib/dom";
|
|
9
|
+
const variants = cva("shadow-notification relative isolate z-tooltip flex w-full flex-col overflow-hidden rounded-xl border bg-card-background text-sm backdrop-blur-md transition-all duration-300", {
|
|
10
|
+
variants: {
|
|
11
|
+
theme: {
|
|
12
|
+
default: "border-card-border text-foreground shadow-black/5",
|
|
13
|
+
info: "border-alert-info-border bg-alert-info-bg text-alert-info-text",
|
|
14
|
+
warn: "border-alert-warn-border bg-alert-warn-bg text-alert-warn-text",
|
|
15
|
+
muted: "border-alert-muted-border bg-alert-muted-bg text-alert-muted-text",
|
|
16
|
+
danger: "border-alert-danger-border bg-alert-danger-bg text-alert-danger-text",
|
|
17
|
+
success: "border-alert-success-border bg-alert-success-bg text-alert-success-text",
|
|
18
|
+
secondary: "border-alert-secondary-border bg-alert-secondary-bg text-alert-secondary-text",
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
defaultVariants: { theme: "default" },
|
|
22
|
+
});
|
|
23
|
+
const themeIcons = {
|
|
24
|
+
default: InfoIcon,
|
|
25
|
+
info: InfoIcon,
|
|
26
|
+
warn: WarningIcon,
|
|
27
|
+
muted: InfoIcon,
|
|
28
|
+
danger: WarningIcon,
|
|
29
|
+
success: CheckCircleIcon,
|
|
30
|
+
secondary: InfoIcon,
|
|
31
|
+
};
|
|
32
|
+
const NotificationContext = createContext(() => {
|
|
33
|
+
throw new Error("Not implemented");
|
|
34
|
+
});
|
|
35
|
+
export const useNotification = () => useContext(NotificationContext);
|
|
36
|
+
function Notification(props) {
|
|
37
|
+
const closable = props.toast.data?.closable ?? true;
|
|
38
|
+
const loading = props.toast.data?.loading ?? false;
|
|
39
|
+
const theme = props.toast.data?.theme || "default";
|
|
40
|
+
const className = variants({ theme });
|
|
41
|
+
const Icon = loading ? CircleNotchIcon : themeIcons[theme] || InfoIcon;
|
|
42
|
+
return (<Base.Root toast={props.toast} swipeDirection="right">
|
|
43
|
+
<motion.li layout initial={{ opacity: 0, y: -20, scale: 0.95 }} animate={{ opacity: 1, y: 0, scale: 1 }} exit={{ opacity: 0, scale: 0.9, y: -20, transition: { duration: 0.2 } }} transition={{
|
|
44
|
+
type: "spring",
|
|
45
|
+
damping: 25,
|
|
46
|
+
stiffness: 300,
|
|
47
|
+
}} className="pointer-events-auto w-full list-none">
|
|
48
|
+
<Base.Content className={css(className, "shadow-lg")}>
|
|
49
|
+
<div className="flex items-start gap-3 p-4">
|
|
50
|
+
<div className={css("mt-0.5 shrink-0 opacity-80", loading && "animate-spin")}>
|
|
51
|
+
<Icon className="size-4"/>
|
|
52
|
+
</div>
|
|
53
|
+
|
|
54
|
+
<div className="flex flex-1 flex-col gap-1 overflow-hidden">
|
|
55
|
+
{props.toast.title ? <Base.Title className="select-text truncate font-semibold leading-tight tracking-tight"/> : null}
|
|
56
|
+
<Base.Description className="line-clamp-2 select-text text-xs font-medium leading-relaxed opacity-90"/>
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
{closable && !loading ? (<Base.Close className="-mr-1 -mt-1 shrink-0 rounded-lg p-1.5 text-foreground/40 transition hover:bg-foreground/10 hover:text-foreground">
|
|
60
|
+
<XIcon className="size-3.5"/>
|
|
61
|
+
</Base.Close>) : null}
|
|
62
|
+
</div>
|
|
63
|
+
</Base.Content>
|
|
64
|
+
</motion.li>
|
|
65
|
+
</Base.Root>);
|
|
66
|
+
}
|
|
67
|
+
function NotificationsViewport({ max = 5 }) {
|
|
68
|
+
const ref = useRef(null);
|
|
69
|
+
const hover = useHover(ref);
|
|
70
|
+
const toastManager = Base.useToastManager();
|
|
71
|
+
const allToasts = max ? toastManager.toasts.slice(0, max) : toastManager.toasts;
|
|
72
|
+
const visibleToasts = hover ? allToasts : allToasts.slice(0, 3);
|
|
73
|
+
const hiddenCount = allToasts.length - visibleToasts.length;
|
|
74
|
+
return (<Base.Viewport ref={ref} className="pointer-events-none fixed left-1/2 top-6 z-[100] flex w-full max-w-[380px] -translate-x-1/2 flex-col gap-3 overflow-visible outline-none">
|
|
75
|
+
<AnimatePresence mode="popLayout" initial={false}>
|
|
76
|
+
{visibleToasts.map((toast) => (<Notification key={toast.id} toast={toast}/>))}
|
|
77
|
+
</AnimatePresence>
|
|
78
|
+
|
|
79
|
+
{!hover && hiddenCount > 0 && (<motion.div layout initial={{ opacity: 0, y: -10 }} animate={{ opacity: 1, y: 0 }} exit={{ opacity: 0, y: -10 }} className="pointer-events-auto cursor-default self-center rounded-full border border-card-border bg-card-background/80 px-3 py-1 text-[10px] font-bold uppercase tracking-wider text-foreground/50 shadow-sm backdrop-blur transition-all hover:bg-card-background hover:text-foreground/80">
|
|
80
|
+
+{hiddenCount} more
|
|
81
|
+
</motion.div>)}
|
|
82
|
+
</Base.Viewport>);
|
|
83
|
+
}
|
|
84
|
+
function NotificationsInner({ children, max = 5 }) {
|
|
85
|
+
const toastManager = Base.useToastManager();
|
|
86
|
+
const clear = useCallback(() => {
|
|
87
|
+
toastManager.toasts.forEach((t) => toastManager.close(t.id));
|
|
88
|
+
}, [toastManager]);
|
|
89
|
+
const notify = useCallback((description, args) => {
|
|
90
|
+
const data = { theme: args?.theme, closable: args?.closable, loading: args?.loading };
|
|
91
|
+
if (args?.id) {
|
|
92
|
+
const existing = toastManager.toasts.find((t) => t.id === args.id);
|
|
93
|
+
if (existing) {
|
|
94
|
+
toastManager.update(args.id, {
|
|
95
|
+
description,
|
|
96
|
+
title: args.title,
|
|
97
|
+
timeout: args.timeout,
|
|
98
|
+
data,
|
|
99
|
+
});
|
|
100
|
+
return { close: () => toastManager.close(args.id), clear };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const id = toastManager.add({
|
|
104
|
+
description,
|
|
105
|
+
id: args?.id,
|
|
106
|
+
title: args?.title,
|
|
107
|
+
timeout: args?.timeout,
|
|
108
|
+
data,
|
|
109
|
+
});
|
|
110
|
+
return {
|
|
111
|
+
close: () => toastManager.close(id),
|
|
112
|
+
clear,
|
|
113
|
+
};
|
|
114
|
+
}, [toastManager, clear]);
|
|
115
|
+
return (<NotificationContext.Provider value={notify}>
|
|
116
|
+
{children}
|
|
117
|
+
<Base.Portal>
|
|
118
|
+
<NotificationsViewport max={max}/>
|
|
119
|
+
</Base.Portal>
|
|
120
|
+
</NotificationContext.Provider>);
|
|
121
|
+
}
|
|
122
|
+
export function Notifications({ children, max = 5, timeout = 5000 }) {
|
|
123
|
+
return (<Base.Provider limit={max} timeout={timeout}>
|
|
124
|
+
<NotificationsInner max={max}>{children}</NotificationsInner>
|
|
125
|
+
</Base.Provider>);
|
|
126
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Is } from "sidekicker";
|
|
2
|
+
import { Progress as RadixProgress } from "@base-ui/react/progress";
|
|
3
|
+
import { css } from "../../lib/dom";
|
|
4
|
+
export const Progress = (props) => {
|
|
5
|
+
return (<RadixProgress.Root max={props.max} value={props.percent ?? null} style={{ transform: "translateZ(0)" }} className={css("relative h-6 w-full overflow-hidden rounded-full bg-background", props.container)}>
|
|
6
|
+
<RadixProgress.Indicator style={{ transform: Is.number(props.percent) ? `translateX(-${100 - props.percent}%)` : undefined }} className={css("size-full bg-primary transition-transform duration-500 ease-in-out", props.className)}/>
|
|
7
|
+
{Is.number(props.percent) ? (<p className={css("absolute inset-0 flex w-full items-center justify-center font-semibold tabular-nums text-primary-foreground", props.textClassName)}>
|
|
8
|
+
{props.label ? props.label : `${props.percent} %`}
|
|
9
|
+
</p>) : null}
|
|
10
|
+
</RadixProgress.Root>);
|
|
11
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { CommandIcon, OptionIcon } from "@phosphor-icons/react";
|
|
2
|
+
import { Fragment } from "react";
|
|
3
|
+
import { isMac } from "../../lib/combi-keys";
|
|
4
|
+
const remap = (x) => {
|
|
5
|
+
x = x.trim();
|
|
6
|
+
if (x === "Alt")
|
|
7
|
+
return isMac() ? <OptionIcon aria-label="Option" size={12}/> : "Alt";
|
|
8
|
+
if (x === "Mod")
|
|
9
|
+
return isMac() ? <CommandIcon aria-label="Command" size={12}/> : "Ctrl";
|
|
10
|
+
return x;
|
|
11
|
+
};
|
|
12
|
+
export const Shortcut = (props) => {
|
|
13
|
+
const p = props.value.trim().split("+");
|
|
14
|
+
return (<span className="flex items-center gap-1 text-sm">
|
|
15
|
+
{p.map((x, i) => {
|
|
16
|
+
const isLast = p.length - 1 === i;
|
|
17
|
+
return (<Fragment key={`${props.value}-${x}-key-${i}`}>
|
|
18
|
+
<kbd aria-label={x}>{remap(x)}</kbd>
|
|
19
|
+
{isLast ? null : <span>+</span>}
|
|
20
|
+
</Fragment>);
|
|
21
|
+
})}
|
|
22
|
+
</span>);
|
|
23
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skeleton.d.ts","sourceRoot":"","sources":["../../../src/components/display/skeleton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,aAAa,EAAU,KAAK,WAAW,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"skeleton.d.ts","sourceRoot":"","sources":["../../../src/components/display/skeleton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,aAAa,EAAU,KAAK,WAAW,EAAE,MAAM,OAAO,CAAC;AAKvE,eAAO,MAAM,YAAY,mBAExB,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,OAAO;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,WAAW,CAAC;IAAC,KAAK,CAAC,EAAE,aAAa,CAAA;CAAE,sBAY9F,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,OAAO;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,sBAavE,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React, { useRef } from "react";
|
|
2
|
+
import { useTranslations } from "../../hooks/use-translations";
|
|
3
|
+
import { css } from "../../lib/dom";
|
|
4
|
+
import { Polymorph } from "../core/polymorph";
|
|
5
|
+
export const SkeletonCell = (<div role="status" aria-busy="true" aria-label="Loading content" className="h-6 w-10/12 animate-pulse rounded bg-muted"/>);
|
|
6
|
+
export const Skeleton = (props) => {
|
|
7
|
+
const t = useTranslations();
|
|
8
|
+
return (<Polymorph {...props} role="status" aria-busy="true" aria-label={t.skeletonLoading} as={props.as || "span"} className={css("block h-8 w-32 animate-pulse rounded bg-muted", props.className)}/>);
|
|
9
|
+
};
|
|
10
|
+
export const SkeletonList = (props) => {
|
|
11
|
+
const t = useTranslations();
|
|
12
|
+
const items = useRef(Array.from({ length: props.rows }).map((_, i) => {
|
|
13
|
+
const rand = Math.max(100, Math.random() * 99);
|
|
14
|
+
return <Skeleton key={`skeleton-${rand}-${i}`} style={{ width: `${rand}%` }} as="li"/>;
|
|
15
|
+
}));
|
|
16
|
+
return (<ul role="status" aria-busy="true" aria-label={t.skeletonLoading} className={css("flex flex-col gap-6", props.className)}>
|
|
17
|
+
{items.current}
|
|
18
|
+
</ul>);
|
|
19
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../../src/components/display/spinner.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../../src/components/display/spinner.tsx"],"names":[],"mappings":"AAGA,eAAO,MAAM,OAAO,GAAI,OAAO;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,gCAapD,CAAC;AAEF,eAAO,MAAM,OAAO,mCAMnB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { useTranslations } from "../../hooks/use-translations";
|
|
2
|
+
import { css } from "../../lib/dom";
|
|
3
|
+
export const Spinner = (props) => {
|
|
4
|
+
const t = useTranslations();
|
|
5
|
+
return (<span role="status" aria-live="polite" aria-label={t.spinnerLoading} className={css("box-border inline-block aspect-square size-12 animate-spin rounded-full border-4 border-background border-b-primary", props.className)}/>);
|
|
6
|
+
};
|
|
7
|
+
export const Loading = () => {
|
|
8
|
+
return (<div className="flex h-full w-full items-center justify-center p-12">
|
|
9
|
+
<Spinner />
|
|
10
|
+
</div>);
|
|
11
|
+
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsxs as a, jsx as e } from "react/jsx-runtime";
|
|
2
|
-
import { c as d } from "../../dom-
|
|
2
|
+
import { c as d } from "../../dom-CyQHY7ID.js";
|
|
3
3
|
const i = (r) => /* @__PURE__ */ a("div", { className: "divide-y divide-card-border rounded-card border border-card-border bg-card-background shadow-shadow-card", children: [
|
|
4
4
|
/* @__PURE__ */ a("header", { className: "flex items-start gap-4 p-6", children: [
|
|
5
5
|
/* @__PURE__ */ e("div", { className: d("flex aspect-square size-10 items-center justify-center rounded-card bg-primary p-8", r.iconContainer), children: /* @__PURE__ */ e("div", { children: /* @__PURE__ */ e(r.Icon, { className: "aspect-square size-10 text-primary-foreground" }) }) }),
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { css } from "../../lib/dom";
|
|
3
|
+
export const Stats = (props) => {
|
|
4
|
+
return (<div className="divide-y divide-card-border rounded-card border border-card-border bg-card-background shadow-shadow-card">
|
|
5
|
+
<header className="flex items-start gap-4 p-6">
|
|
6
|
+
<div className={css("flex aspect-square size-10 items-center justify-center rounded-card bg-primary p-8", props.iconContainer)}>
|
|
7
|
+
<div>
|
|
8
|
+
<props.Icon className="aspect-square size-10 text-primary-foreground"/>
|
|
9
|
+
</div>
|
|
10
|
+
</div>
|
|
11
|
+
<div className="flex flex-col gap-1">
|
|
12
|
+
<header>
|
|
13
|
+
<h3 className="text-base leading-none">{props.title}</h3>
|
|
14
|
+
</header>
|
|
15
|
+
<p className="text-4xl font-semibold">{props.children}</p>
|
|
16
|
+
</div>
|
|
17
|
+
</header>
|
|
18
|
+
{props.footer ? <footer className="px-6 py-2">{props.footer}</footer> : null}
|
|
19
|
+
</div>);
|
|
20
|
+
};
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { motion } from "motion/react";
|
|
3
|
+
import React, { createContext, Fragment, useContext, useEffect, useRef, useState } from "react";
|
|
4
|
+
import { useColorParser } from "../../hooks/use-color-parser";
|
|
5
|
+
const PROGRESS_BAR_DURATION = 0.3;
|
|
6
|
+
const transition = { duration: PROGRESS_BAR_DURATION, type: "tween", ease: "easeInOut" };
|
|
7
|
+
const StepContext = createContext(null);
|
|
8
|
+
const iconTransitions = { delay: 0.2, duration: 0.3, type: "tween", ease: "easeOut" };
|
|
9
|
+
const states = {
|
|
10
|
+
initial: { pathLength: 0, opacity: 0 },
|
|
11
|
+
animate: { pathLength: 1, opacity: 1 },
|
|
12
|
+
};
|
|
13
|
+
const ErrorIcon = (props) => (<svg {...props} viewBox="0 0 24 24" fill="currentColor" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
|
|
14
|
+
<motion.path className="currentColor" initial={states.initial} animate={states.animate} transition={iconTransitions} d="M18 6 6 18"/>
|
|
15
|
+
<motion.path className="currentColor" initial={states.initial} animate={states.animate} transition={iconTransitions} d="m6 6 12 12"/>
|
|
16
|
+
</svg>);
|
|
17
|
+
const CheckIcon = (props) => (<svg {...props} fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={3}>
|
|
18
|
+
<motion.path d="M5 13l4 4L19 7" strokeLinecap="round" strokeLinejoin="round" animate={states.animate} initial={states.initial} transition={iconTransitions}/>
|
|
19
|
+
</svg>);
|
|
20
|
+
const variants = {
|
|
21
|
+
complete: { scale: 1.25 },
|
|
22
|
+
active: { scale: 1, transition: { delay: 0, duration: 0.3 } },
|
|
23
|
+
};
|
|
24
|
+
const transitions = { duration: 0.6, delay: 0.2, type: "tween", ease: "circOut" };
|
|
25
|
+
const getCurrentStatus = (step, currentStep, status) => {
|
|
26
|
+
if (status === "error")
|
|
27
|
+
return "error";
|
|
28
|
+
if (currentStep === step)
|
|
29
|
+
return "active";
|
|
30
|
+
if (currentStep < step)
|
|
31
|
+
return "inactive";
|
|
32
|
+
return "complete";
|
|
33
|
+
};
|
|
34
|
+
const calculateStepDelay = (step, currentStep, previousStep, duration) => {
|
|
35
|
+
if (currentStep === previousStep)
|
|
36
|
+
return 0;
|
|
37
|
+
const isForward = currentStep > previousStep;
|
|
38
|
+
if (isForward) {
|
|
39
|
+
if (step <= previousStep || step > currentStep)
|
|
40
|
+
return 0;
|
|
41
|
+
return ((step - previousStep) / (currentStep - previousStep)) * duration;
|
|
42
|
+
}
|
|
43
|
+
if (step <= currentStep || step > previousStep)
|
|
44
|
+
return 0;
|
|
45
|
+
return ((previousStep - step) / (previousStep - currentStep)) * duration;
|
|
46
|
+
};
|
|
47
|
+
export const useStepContext = () => useContext(StepContext);
|
|
48
|
+
export const Step = ({ step, currentStep, status, title, titleClassName, ...props }) => {
|
|
49
|
+
const parser = useColorParser();
|
|
50
|
+
const context = useStepContext();
|
|
51
|
+
const [visualCurrentStep, setVisualCurrentStep] = useState(currentStep);
|
|
52
|
+
useEffect(() => {
|
|
53
|
+
if (!context) {
|
|
54
|
+
setVisualCurrentStep(currentStep);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const delay = calculateStepDelay(step, context.currentStep, context.previousStep, context.progressBarDuration);
|
|
58
|
+
if (delay === 0) {
|
|
59
|
+
setVisualCurrentStep(currentStep);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const timer = setTimeout(() => {
|
|
63
|
+
setVisualCurrentStep(currentStep);
|
|
64
|
+
}, delay * 1000);
|
|
65
|
+
return () => clearTimeout(timer);
|
|
66
|
+
}, [currentStep, context, step]);
|
|
67
|
+
const innerStatus = getCurrentStatus(step, visualCurrentStep, status);
|
|
68
|
+
const widthPerStep = context?.steps ? 100 / context?.steps : undefined;
|
|
69
|
+
return (<Fragment>
|
|
70
|
+
<div className={`hidden h-[2px] w-full bg-card-border first:hidden xl:block ${innerStatus === "active" || innerStatus === "complete" ? "bg-success" : ""}`}/>
|
|
71
|
+
<motion.button {...props} type="button" data-step={step} animate={innerStatus} className="relative flex w-auto items-center justify-center text-center">
|
|
72
|
+
<motion.div variants={variants} transition={transitions} className={`absolute inset-0 hidden rounded-full text-center xl:block ${innerStatus === "error" ? "bg-danger" : ""}`}/>
|
|
73
|
+
<motion.div initial={false} animate={innerStatus} transition={transition} className="relative flex aspect-square size-10 items-center justify-center rounded-full font-medium" variants={{
|
|
74
|
+
error: {
|
|
75
|
+
color: parser("var(--danger-foreground)"),
|
|
76
|
+
borderColor: parser("var(--danger-hover)"),
|
|
77
|
+
backgroundColor: parser("var(--danger-DEFAULT)"),
|
|
78
|
+
},
|
|
79
|
+
inactive: {
|
|
80
|
+
transition,
|
|
81
|
+
color: parser("var(--disabled)"),
|
|
82
|
+
borderColor: parser("var(--card-border)"),
|
|
83
|
+
backgroundColor: parser("var(--background)"),
|
|
84
|
+
},
|
|
85
|
+
active: {
|
|
86
|
+
transition,
|
|
87
|
+
color: parser("var(--primary-foreground)"),
|
|
88
|
+
borderColor: parser("var(--primary-DEFAULT)"),
|
|
89
|
+
backgroundColor: parser("var(--primary-DEFAULT)"),
|
|
90
|
+
},
|
|
91
|
+
complete: {
|
|
92
|
+
transition,
|
|
93
|
+
color: parser("var(--success-foreground)"),
|
|
94
|
+
borderColor: parser("var(--success-DEFAULT)"),
|
|
95
|
+
backgroundColor: parser("var(--success-DEFAULT)"),
|
|
96
|
+
},
|
|
97
|
+
}}>
|
|
98
|
+
<div className="flex items-center justify-center">
|
|
99
|
+
{innerStatus === "complete" ? (<CheckIcon className="size-6 text-primary-foreground"/>) : innerStatus === "error" ? (<ErrorIcon className="size-6 text-danger-foreground"/>) : (<Fragment>
|
|
100
|
+
<span>{step}</span>
|
|
101
|
+
</Fragment>)}
|
|
102
|
+
</div>
|
|
103
|
+
</motion.div>
|
|
104
|
+
<header className="flex flex-col items-start justify-start px-2">
|
|
105
|
+
<h3 className={`flex h-full items-center whitespace-nowrap font-normal ${titleClassName}`}>{title}</h3>
|
|
106
|
+
</header>
|
|
107
|
+
</motion.button>
|
|
108
|
+
</Fragment>);
|
|
109
|
+
};
|
|
110
|
+
export const Steps = (props) => {
|
|
111
|
+
const previousStepRef = useRef(props.currentStep);
|
|
112
|
+
const [previousStep, setPreviousStep] = useState(props.currentStep);
|
|
113
|
+
useEffect(() => {
|
|
114
|
+
previousStepRef.current = previousStep;
|
|
115
|
+
const timer = setTimeout(() => {
|
|
116
|
+
setPreviousStep(props.currentStep);
|
|
117
|
+
}, PROGRESS_BAR_DURATION * 1000);
|
|
118
|
+
return () => clearTimeout(timer);
|
|
119
|
+
}, [props.currentStep, previousStep]);
|
|
120
|
+
const contextValue = {
|
|
121
|
+
currentStep: props.currentStep,
|
|
122
|
+
previousStep: previousStepRef.current,
|
|
123
|
+
progressBarDuration: PROGRESS_BAR_DURATION,
|
|
124
|
+
steps: React.Children.count(props.children),
|
|
125
|
+
};
|
|
126
|
+
return (<StepContext.Provider value={contextValue}>
|
|
127
|
+
<div className="relative flex w-full flex-col items-start justify-center gap-4 lg:flex-row lg:items-center lg:justify-between">
|
|
128
|
+
{props.children}
|
|
129
|
+
</div>
|
|
130
|
+
</StepContext.Provider>);
|
|
131
|
+
};
|
|
@@ -19,6 +19,6 @@ export type TabProps = CommonTabProps & ({
|
|
|
19
19
|
label: string;
|
|
20
20
|
title: Omit<Label, string>;
|
|
21
21
|
});
|
|
22
|
-
export declare const Tab: (props: PropsWithChildren<TabProps>) => React.JSX.Element;
|
|
22
|
+
export declare const Tab: (props: PropsWithChildren<TabProps>) => React.JSX.Element | null;
|
|
23
23
|
export {};
|
|
24
24
|
//# sourceMappingURL=tabs.d.ts.map
|