@giddaa-housing/ui 0.1.0 → 1.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/README.md +18 -6
- package/css/base.css +37 -0
- package/css/components.css +135 -0
- package/css/generated/shared.css +1 -0
- package/css/giddaa.css +402 -0
- package/css/preset.css +77 -0
- package/css/styles.css +2 -0
- package/css/theme.css +255 -0
- package/dist/accordion.d.ts +9 -10
- package/dist/accordion.js +41 -117
- package/dist/activity-timeline.d.ts +29 -0
- package/dist/activity-timeline.js +97 -0
- package/dist/alert.d.ts +8 -9
- package/dist/alert.js +53 -141
- package/dist/auth-layout.d.ts +23 -0
- package/dist/auth-layout.js +153 -0
- package/dist/avatar.d.ts +6 -6
- package/dist/avatar.js +40 -142
- package/dist/badge.d.ts +12 -13
- package/dist/badge.js +66 -114
- package/dist/bar-chart.d.ts +136 -114
- package/dist/bar-chart.js +244 -297
- package/dist/breadcrumb.d.ts +5 -5
- package/dist/breadcrumb.js +56 -148
- package/dist/bullet-chart.d.ts +33 -33
- package/dist/bullet-chart.js +123 -183
- package/dist/button-BZIeyUw6.d.ts +17 -0
- package/dist/button-group.d.ts +13 -16
- package/dist/button-group.js +38 -163
- package/dist/button.d.ts +2 -19
- package/dist/button.js +90 -142
- package/dist/calendar.d.ts +6 -6
- package/dist/calendar.js +134 -288
- package/dist/card.d.ts +14 -16
- package/dist/card.js +58 -174
- package/dist/carousel.d.ts +34 -35
- package/dist/carousel.js +319 -378
- package/dist/chart.d.ts +58 -59
- package/dist/chart.js +350 -466
- package/dist/checkbox.d.ts +10 -12
- package/dist/checkbox.js +84 -84
- package/dist/cn-BI_4DMBf.js +23 -0
- package/dist/collapsible.d.ts +7 -8
- package/dist/collapsible.js +23 -77
- package/dist/combobox.d.ts +10 -10
- package/dist/combobox.js +220 -696
- package/dist/cta.d.ts +64 -0
- package/dist/cta.js +192 -0
- package/dist/currency-selector.d.ts +41 -0
- package/dist/currency-selector.js +114 -0
- package/dist/data-table.d.ts +164 -0
- package/dist/data-table.js +673 -0
- package/dist/date-picker.d.ts +27 -20
- package/dist/date-picker.js +122 -520
- package/dist/details-card.d.ts +19 -0
- package/dist/details-card.js +118 -0
- package/dist/dialog.d.ts +13 -14
- package/dist/dialog.js +117 -320
- package/dist/dropdown-menu.d.ts +14 -14
- package/dist/dropdown-menu.js +170 -365
- package/dist/dropzone.d.ts +55 -55
- package/dist/dropzone.js +328 -467
- package/dist/editorial-card.d.ts +27 -0
- package/dist/editorial-card.js +144 -0
- package/dist/empty-state.d.ts +8 -9
- package/dist/empty-state.js +48 -135
- package/dist/field.d.ts +23 -25
- package/dist/field.js +111 -327
- package/dist/filter.d.ts +118 -0
- package/dist/filter.js +775 -0
- package/dist/footer.d.ts +40 -0
- package/dist/footer.js +227 -0
- package/dist/funnel-chart.d.ts +38 -41
- package/dist/funnel-chart.js +168 -563
- package/dist/gallery-indicator.d.ts +17 -0
- package/dist/gallery-indicator.js +75 -0
- package/dist/heatmap-chart.d.ts +95 -0
- package/dist/heatmap-chart.js +197 -0
- package/dist/infotip.d.ts +10 -0
- package/dist/infotip.js +40 -0
- package/dist/input-CfoEJ8A6.d.ts +12 -0
- package/dist/input-group.d.ts +16 -19
- package/dist/input-group.js +92 -372
- package/dist/input-size-context-C-SFx9sx.d.ts +10 -0
- package/dist/input-size-context.d.ts +2 -11
- package/dist/input-size-context.js +14 -20
- package/dist/input.d.ts +2 -13
- package/dist/input.js +23 -79
- package/dist/item.d.ts +7 -8
- package/dist/item.js +22 -89
- package/dist/kpi-card.d.ts +18 -20
- package/dist/kpi-card.js +84 -232
- package/dist/label.d.ts +6 -6
- package/dist/label.js +39 -66
- package/dist/line-chart.d.ts +88 -89
- package/dist/line-chart.js +143 -262
- package/dist/logo.d.ts +4 -4
- package/dist/logo.js +87 -141
- package/dist/map-indicator.d.ts +13 -0
- package/dist/map-indicator.js +83 -0
- package/dist/match.d.ts +15 -0
- package/dist/match.js +68 -0
- package/dist/media-gallery-hero.d.ts +58 -0
- package/dist/media-gallery-hero.js +201 -0
- package/dist/media-player.d.ts +60 -0
- package/dist/media-player.js +919 -0
- package/dist/multi-step-form.d.ts +56 -0
- package/dist/multi-step-form.js +342 -0
- package/dist/number-input.d.ts +34 -34
- package/dist/number-input.js +62 -413
- package/dist/page-header.d.ts +10 -11
- package/dist/page-header.js +34 -107
- package/dist/pagination.d.ts +17 -20
- package/dist/pagination.js +132 -341
- package/dist/password-input.d.ts +5 -12
- package/dist/password-input.js +32 -354
- package/dist/phone-input.d.ts +19 -19
- package/dist/phone-input.js +232 -561
- package/dist/photo-gallery.d.ts +20 -20
- package/dist/photo-gallery.js +314 -746
- package/dist/picker-lzgmsNfG.js +32 -0
- package/dist/pie-chart.d.ts +60 -60
- package/dist/pie-chart.js +141 -184
- package/dist/popover.d.ts +9 -9
- package/dist/popover.js +60 -156
- package/dist/price-tag.d.ts +34 -0
- package/dist/price-tag.js +118 -0
- package/dist/progress.d.ts +18 -16
- package/dist/progress.js +156 -300
- package/dist/property-listing-card.d.ts +29 -0
- package/dist/property-listing-card.js +117 -0
- package/dist/radar-chart.d.ts +108 -0
- package/dist/radar-chart.js +172 -0
- package/dist/radio-group.d.ts +11 -13
- package/dist/radio-group.js +47 -96
- package/dist/review-block.d.ts +18 -0
- package/dist/review-block.js +154 -0
- package/dist/rich-text-editor.d.ts +30 -14
- package/dist/rich-text-editor.js +594 -979
- package/dist/scatter-chart.d.ts +140 -0
- package/dist/scatter-chart.js +248 -0
- package/dist/search-input.d.ts +8 -15
- package/dist/search-input.js +58 -408
- package/dist/select.d.ts +8 -8
- package/dist/select.js +131 -291
- package/dist/separator.d.ts +8 -9
- package/dist/separator.js +31 -70
- package/dist/sheet.d.ts +11 -11
- package/dist/sheet.js +84 -262
- package/dist/sidebar.d.ts +32 -37
- package/dist/sidebar.js +380 -1055
- package/dist/size-context-D4mYvcg8.d.ts +10 -0
- package/dist/size-context.d.ts +2 -11
- package/dist/size-context.js +14 -18
- package/dist/skeleton.d.ts +4 -5
- package/dist/skeleton.js +9 -45
- package/dist/slider.d.ts +27 -0
- package/dist/slider.js +81 -0
- package/dist/sparkline.d.ts +43 -46
- package/dist/sparkline.js +223 -561
- package/dist/stepper.d.ts +23 -24
- package/dist/stepper.js +149 -276
- package/dist/styles.css +9995 -2
- package/dist/switch.d.ts +10 -12
- package/dist/switch.js +49 -106
- package/dist/table-card.d.ts +35 -0
- package/dist/table-card.js +125 -0
- package/dist/table.d.ts +18 -14
- package/dist/table.js +114 -182
- package/dist/tabs.d.ts +23 -15
- package/dist/tabs.js +62 -149
- package/dist/tag.d.ts +22 -23
- package/dist/tag.js +104 -156
- package/dist/testimonial-block.d.ts +33 -0
- package/dist/testimonial-block.js +208 -0
- package/dist/textarea-IS_D8pXf.d.ts +11 -0
- package/dist/textarea.d.ts +2 -12
- package/dist/textarea.js +20 -74
- package/dist/time-picker.d.ts +11 -11
- package/dist/time-picker.js +247 -464
- package/dist/toast.d.ts +16 -18
- package/dist/toast.js +154 -310
- package/dist/tooltip.d.ts +9 -10
- package/dist/tooltip.js +33 -91
- package/dist/tree-map.d.ts +54 -57
- package/dist/tree-map.js +231 -646
- package/dist/use-uncontrolled-CLfM1XbB.js +21 -0
- package/dist/waterfall-chart.d.ts +126 -0
- package/dist/waterfall-chart.js +480 -0
- package/package.json +123 -34
- package/dist/accordion.js.map +0 -1
- package/dist/alert.js.map +0 -1
- package/dist/avatar.js.map +0 -1
- package/dist/badge.js.map +0 -1
- package/dist/bar-chart.js.map +0 -1
- package/dist/base.css +0 -32
- package/dist/breadcrumb.js.map +0 -1
- package/dist/bullet-chart.js.map +0 -1
- package/dist/button-group.js.map +0 -1
- package/dist/button.js.map +0 -1
- package/dist/calendar.js.map +0 -1
- package/dist/card.js.map +0 -1
- package/dist/carousel.js.map +0 -1
- package/dist/chart.js.map +0 -1
- package/dist/checkbox.js.map +0 -1
- package/dist/collapsible.js.map +0 -1
- package/dist/combobox.js.map +0 -1
- package/dist/date-picker.js.map +0 -1
- package/dist/dialog.js.map +0 -1
- package/dist/dropdown-menu.js.map +0 -1
- package/dist/dropzone.js.map +0 -1
- package/dist/empty-state.js.map +0 -1
- package/dist/field.js.map +0 -1
- package/dist/files/red-hat-display-latin-300-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-300-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-300-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-300-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-400-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-400-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-400-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-400-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-500-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-500-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-500-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-500-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-600-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-600-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-600-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-600-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-700-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-700-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-700-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-700-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-800-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-800-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-800-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-800-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-900-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-900-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-900-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-900-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-300-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-300-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-300-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-300-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-400-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-400-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-400-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-400-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-500-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-500-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-500-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-500-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-600-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-600-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-600-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-600-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-700-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-700-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-700-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-700-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-800-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-800-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-800-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-800-normal.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-900-italic.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-900-italic.woff2 +0 -0
- package/dist/files/red-hat-display-latin-ext-900-normal.woff +0 -0
- package/dist/files/red-hat-display-latin-ext-900-normal.woff2 +0 -0
- package/dist/funnel-chart.js.map +0 -1
- package/dist/index.d.ts +0 -87
- package/dist/index.js +0 -10448
- package/dist/index.js.map +0 -1
- package/dist/input-group.js.map +0 -1
- package/dist/input-size-context.js.map +0 -1
- package/dist/input.js.map +0 -1
- package/dist/item.js.map +0 -1
- package/dist/kpi-card.js.map +0 -1
- package/dist/label.js.map +0 -1
- package/dist/line-chart.js.map +0 -1
- package/dist/logo.js.map +0 -1
- package/dist/number-input.js.map +0 -1
- package/dist/page-header.js.map +0 -1
- package/dist/pagination.js.map +0 -1
- package/dist/password-input.js.map +0 -1
- package/dist/phone-input.js.map +0 -1
- package/dist/photo-gallery.js.map +0 -1
- package/dist/pie-chart.js.map +0 -1
- package/dist/popover.js.map +0 -1
- package/dist/progress.js.map +0 -1
- package/dist/radio-group.js.map +0 -1
- package/dist/red-hat-display.css +0 -2
- package/dist/rich-text-editor.js.map +0 -1
- package/dist/search-input.js.map +0 -1
- package/dist/select.js.map +0 -1
- package/dist/separator.js.map +0 -1
- package/dist/sheet.js.map +0 -1
- package/dist/sidebar.js.map +0 -1
- package/dist/size-context.js.map +0 -1
- package/dist/skeleton.js.map +0 -1
- package/dist/sparkline.js.map +0 -1
- package/dist/stepper.js.map +0 -1
- package/dist/switch.js.map +0 -1
- package/dist/tab-list.d.ts +0 -38
- package/dist/tab-list.js +0 -394
- package/dist/tab-list.js.map +0 -1
- package/dist/table.js.map +0 -1
- package/dist/tabs.js.map +0 -1
- package/dist/tag.js.map +0 -1
- package/dist/textarea.js.map +0 -1
- package/dist/theme/giddaa.css +0 -2
- package/dist/time-picker.js.map +0 -1
- package/dist/toast.js.map +0 -1
- package/dist/tooltip.js.map +0 -1
- package/dist/tree-map.js.map +0 -1
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
//#region src/multi-step-form.d.ts
|
|
3
|
+
type MultiStepFormDirection = "next" | "prev" | "jump";
|
|
4
|
+
type MultiStepFormStep<TValue extends string = string, TFields extends readonly string[] = readonly string[]> = {
|
|
5
|
+
value: TValue;
|
|
6
|
+
title: React.ReactNode;
|
|
7
|
+
description?: React.ReactNode;
|
|
8
|
+
fields?: TFields;
|
|
9
|
+
};
|
|
10
|
+
type MultiStepFormValue<TStep extends MultiStepFormStep> = TStep["value"];
|
|
11
|
+
type MultiStepFormValidate<TStep extends MultiStepFormStep> = (value: MultiStepFormValue<TStep>, direction: MultiStepFormDirection, targetValue: MultiStepFormValue<TStep>) => boolean | Promise<boolean>;
|
|
12
|
+
type MultiStepFormContextValue<TStep extends MultiStepFormStep> = {
|
|
13
|
+
steps: readonly TStep[];
|
|
14
|
+
value: MultiStepFormValue<TStep>;
|
|
15
|
+
currentStep: TStep;
|
|
16
|
+
currentIndex: number;
|
|
17
|
+
nextStep?: TStep;
|
|
18
|
+
previousStep?: TStep;
|
|
19
|
+
isFirstStep: boolean;
|
|
20
|
+
isLastStep: boolean;
|
|
21
|
+
isValidating: boolean;
|
|
22
|
+
goTo: (value: MultiStepFormValue<TStep>) => Promise<boolean>;
|
|
23
|
+
next: () => Promise<boolean>;
|
|
24
|
+
previous: () => Promise<boolean>;
|
|
25
|
+
};
|
|
26
|
+
type MultiStepFormProps<TStep extends MultiStepFormStep> = Omit<React.ComponentProps<"div">, "defaultValue" | "onChange"> & {
|
|
27
|
+
steps: readonly TStep[];
|
|
28
|
+
value?: MultiStepFormValue<TStep>;
|
|
29
|
+
defaultValue?: MultiStepFormValue<TStep>;
|
|
30
|
+
onValueChange?: (value: MultiStepFormValue<TStep>, step: TStep, meta: {
|
|
31
|
+
direction: MultiStepFormDirection;
|
|
32
|
+
previousValue: MultiStepFormValue<TStep>;
|
|
33
|
+
}) => void;
|
|
34
|
+
onValidate?: MultiStepFormValidate<TStep>;
|
|
35
|
+
};
|
|
36
|
+
type MultiStepFormIndicatorProps = React.ComponentProps<"div"> & {
|
|
37
|
+
type?: "stepper" | "progress";
|
|
38
|
+
progressValue?: number;
|
|
39
|
+
showNextLabel?: boolean;
|
|
40
|
+
currentStepAction?: React.ReactNode;
|
|
41
|
+
};
|
|
42
|
+
type MultiStepFormContentProps<TStep extends MultiStepFormStep> = React.ComponentProps<"div"> & {
|
|
43
|
+
value: MultiStepFormValue<TStep>;
|
|
44
|
+
forceMount?: boolean;
|
|
45
|
+
};
|
|
46
|
+
type MultiStepFormNavigationButtonProps = Omit<React.ComponentProps<"button">, "type"> & {
|
|
47
|
+
type?: "button" | "submit" | "reset";
|
|
48
|
+
};
|
|
49
|
+
declare function useMultiStepForm<TStep extends MultiStepFormStep = MultiStepFormStep>(): MultiStepFormContextValue<TStep>;
|
|
50
|
+
declare function MultiStepForm<TStep extends MultiStepFormStep>({ steps, value, defaultValue, onValueChange, onValidate, className, children, ...props }: MultiStepFormProps<TStep>): React.JSX.Element;
|
|
51
|
+
declare function MultiStepFormIndicator({ type, progressValue, showNextLabel, currentStepAction, className, ...props }: MultiStepFormIndicatorProps): React.JSX.Element;
|
|
52
|
+
declare function MultiStepFormContent<TStep extends MultiStepFormStep>({ value, forceMount, className, ...props }: MultiStepFormContentProps<TStep>): React.JSX.Element | null;
|
|
53
|
+
declare function MultiStepFormPrevious({ type, disabled, onClick, className, ...props }: MultiStepFormNavigationButtonProps): React.JSX.Element;
|
|
54
|
+
declare function MultiStepFormNext({ type, disabled, onClick, className, ...props }: MultiStepFormNavigationButtonProps): React.JSX.Element;
|
|
55
|
+
//#endregion
|
|
56
|
+
export { MultiStepForm, MultiStepFormContent, type MultiStepFormDirection, MultiStepFormIndicator, MultiStepFormNext, MultiStepFormPrevious, type MultiStepFormProps, type MultiStepFormStep, type MultiStepFormValidate, useMultiStepForm };
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { t as cn } from "./cn-BI_4DMBf.js";
|
|
3
|
+
import { t as useUncontrolled } from "./use-uncontrolled-CLfM1XbB.js";
|
|
4
|
+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "./select.js";
|
|
5
|
+
import { Progress, ProgressIndicator, ProgressTrack } from "./progress.js";
|
|
6
|
+
import { CheckIcon } from "lucide-react";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
import * as React from "react";
|
|
9
|
+
//#region src/multi-step-form.tsx
|
|
10
|
+
const MultiStepFormContext = React.createContext(null);
|
|
11
|
+
function useMultiStepForm() {
|
|
12
|
+
const context = React.useContext(MultiStepFormContext);
|
|
13
|
+
if (!context) throw new Error("MultiStepForm parts must be used within a <MultiStepForm />");
|
|
14
|
+
return context;
|
|
15
|
+
}
|
|
16
|
+
function getStepIndex(steps, value) {
|
|
17
|
+
return steps.findIndex((step) => step.value === value);
|
|
18
|
+
}
|
|
19
|
+
function getDirection(currentIndex, targetIndex) {
|
|
20
|
+
if (targetIndex > currentIndex) return "next";
|
|
21
|
+
if (targetIndex < currentIndex) return "prev";
|
|
22
|
+
return "jump";
|
|
23
|
+
}
|
|
24
|
+
function getProgressValue(currentIndex, totalSteps) {
|
|
25
|
+
if (totalSteps <= 0) return 0;
|
|
26
|
+
return Math.round((currentIndex + 1) / totalSteps * 100);
|
|
27
|
+
}
|
|
28
|
+
function getStepsToValidate(steps, currentIndex, targetIndex) {
|
|
29
|
+
if (targetIndex <= currentIndex) return [];
|
|
30
|
+
if (targetIndex === currentIndex + 1) return steps.slice(currentIndex, currentIndex + 1);
|
|
31
|
+
return steps.slice(0, targetIndex);
|
|
32
|
+
}
|
|
33
|
+
function MultiStepForm({ steps, value, defaultValue, onValueChange, onValidate, className, children, ...props }) {
|
|
34
|
+
const fallbackValue = steps[0]?.value;
|
|
35
|
+
const [currentValue, setCurrentValue] = useUncontrolled({
|
|
36
|
+
value,
|
|
37
|
+
defaultValue,
|
|
38
|
+
finalValue: fallbackValue,
|
|
39
|
+
onChange: (nextValue, ...payload) => {
|
|
40
|
+
const [step, meta] = payload;
|
|
41
|
+
onValueChange?.(nextValue, step, meta);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
const [isValidating, setIsValidating] = React.useState(false);
|
|
45
|
+
const resolvedIndex = getStepIndex(steps, currentValue);
|
|
46
|
+
const currentIndex = resolvedIndex >= 0 ? resolvedIndex : 0;
|
|
47
|
+
const currentStep = steps[currentIndex];
|
|
48
|
+
const previousStep = steps[currentIndex - 1];
|
|
49
|
+
const nextStep = steps[currentIndex + 1];
|
|
50
|
+
const isFirstStep = currentIndex <= 0;
|
|
51
|
+
const isLastStep = currentIndex >= steps.length - 1;
|
|
52
|
+
const goTo = async (targetValue) => {
|
|
53
|
+
if (!currentStep) return false;
|
|
54
|
+
const targetIndex = getStepIndex(steps, targetValue);
|
|
55
|
+
if (targetIndex < 0) return false;
|
|
56
|
+
const direction = getDirection(currentIndex, targetIndex);
|
|
57
|
+
if (direction === "jump") return true;
|
|
58
|
+
setIsValidating(true);
|
|
59
|
+
try {
|
|
60
|
+
const stepsToValidate = getStepsToValidate(steps, currentIndex, targetIndex);
|
|
61
|
+
for (const step of stepsToValidate) if (!(await onValidate?.(step.value, direction, targetValue) ?? true)) return false;
|
|
62
|
+
const targetStep = steps[targetIndex];
|
|
63
|
+
if (!targetStep) return false;
|
|
64
|
+
setCurrentValue(targetValue, targetStep, {
|
|
65
|
+
direction,
|
|
66
|
+
previousValue: currentStep.value
|
|
67
|
+
});
|
|
68
|
+
return true;
|
|
69
|
+
} finally {
|
|
70
|
+
setIsValidating(false);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
const next = () => {
|
|
74
|
+
if (!nextStep) return Promise.resolve(false);
|
|
75
|
+
return goTo(nextStep.value);
|
|
76
|
+
};
|
|
77
|
+
const previous = () => {
|
|
78
|
+
if (!previousStep) return Promise.resolve(false);
|
|
79
|
+
return goTo(previousStep.value);
|
|
80
|
+
};
|
|
81
|
+
const contextValue = {
|
|
82
|
+
steps,
|
|
83
|
+
value: currentStep?.value ?? currentValue,
|
|
84
|
+
currentStep,
|
|
85
|
+
currentIndex,
|
|
86
|
+
nextStep,
|
|
87
|
+
previousStep,
|
|
88
|
+
isFirstStep,
|
|
89
|
+
isLastStep,
|
|
90
|
+
isValidating,
|
|
91
|
+
goTo,
|
|
92
|
+
next,
|
|
93
|
+
previous
|
|
94
|
+
};
|
|
95
|
+
return /* @__PURE__ */ jsx(MultiStepFormContext.Provider, {
|
|
96
|
+
value: contextValue,
|
|
97
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
98
|
+
"data-slot": "multi-step-form",
|
|
99
|
+
className: cn("flex flex-col gap-6", className),
|
|
100
|
+
...props,
|
|
101
|
+
children
|
|
102
|
+
})
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
function MultiStepFormIndicator({ type = "stepper", progressValue, showNextLabel = true, currentStepAction, className, ...props }) {
|
|
106
|
+
const { steps, currentIndex, nextStep, goTo, isValidating } = useMultiStepForm();
|
|
107
|
+
const stepNumber = currentIndex + 1;
|
|
108
|
+
const totalSteps = steps.length;
|
|
109
|
+
const resolvedProgress = progressValue ?? getProgressValue(currentIndex, totalSteps);
|
|
110
|
+
if (type === "progress") return /* @__PURE__ */ jsxs("div", {
|
|
111
|
+
"data-slot": "multi-step-form-indicator",
|
|
112
|
+
"data-type": "progress",
|
|
113
|
+
className: cn("flex w-full flex-col gap-2.5", className),
|
|
114
|
+
...props,
|
|
115
|
+
children: [
|
|
116
|
+
/* @__PURE__ */ jsxs("div", {
|
|
117
|
+
className: "flex items-start justify-between gap-4",
|
|
118
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
119
|
+
className: "flex min-w-0 flex-col gap-1.5",
|
|
120
|
+
children: [/* @__PURE__ */ jsxs("p", {
|
|
121
|
+
className: "text-gdt-sm text-fg-caption-placeholder",
|
|
122
|
+
children: [
|
|
123
|
+
"Step ",
|
|
124
|
+
stepNumber,
|
|
125
|
+
" of ",
|
|
126
|
+
totalSteps
|
|
127
|
+
]
|
|
128
|
+
}), /* @__PURE__ */ jsx(MultiStepFormStepSelect, {
|
|
129
|
+
trigger: "title",
|
|
130
|
+
currentStepAction
|
|
131
|
+
})]
|
|
132
|
+
}), /* @__PURE__ */ jsxs("p", {
|
|
133
|
+
className: "shrink-0 text-gdt-md font-extrabold text-status-info md:text-gdt-lg",
|
|
134
|
+
children: [resolvedProgress, "%"]
|
|
135
|
+
})]
|
|
136
|
+
}),
|
|
137
|
+
/* @__PURE__ */ jsx(Progress, {
|
|
138
|
+
value: resolvedProgress,
|
|
139
|
+
"aria-label": "Step progress",
|
|
140
|
+
children: /* @__PURE__ */ jsx(ProgressTrack, {
|
|
141
|
+
className: "h-2 bg-line",
|
|
142
|
+
children: /* @__PURE__ */ jsx(ProgressIndicator, { className: "bg-action-primary" })
|
|
143
|
+
})
|
|
144
|
+
}),
|
|
145
|
+
showNextLabel && nextStep ? /* @__PURE__ */ jsxs("p", {
|
|
146
|
+
className: "text-gdt-xs text-fg-caption-placeholder",
|
|
147
|
+
children: ["Next: ", nextStep.title]
|
|
148
|
+
}) : null
|
|
149
|
+
]
|
|
150
|
+
});
|
|
151
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
152
|
+
"data-slot": "multi-step-form-indicator",
|
|
153
|
+
"data-type": "stepper",
|
|
154
|
+
className: cn("w-full", className),
|
|
155
|
+
...props,
|
|
156
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
157
|
+
className: "hidden w-full md:grid",
|
|
158
|
+
style: { gridTemplateColumns: `repeat(${totalSteps}, minmax(0, 1fr))` },
|
|
159
|
+
children: steps.map((step, index) => {
|
|
160
|
+
const state = index < currentIndex ? "complete" : index === currentIndex ? "active" : "upcoming";
|
|
161
|
+
const leftComplete = index > 0 && index <= currentIndex;
|
|
162
|
+
const rightComplete = index < currentIndex;
|
|
163
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
164
|
+
"data-state": state,
|
|
165
|
+
className: "group/multi-step-form-step min-w-0",
|
|
166
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
167
|
+
className: "flex items-center",
|
|
168
|
+
children: [
|
|
169
|
+
/* @__PURE__ */ jsx("span", {
|
|
170
|
+
"aria-hidden": "true",
|
|
171
|
+
className: cn("h-0.5 flex-1 rounded-full bg-line", index === 0 && "bg-transparent", leftComplete && "bg-status-success")
|
|
172
|
+
}),
|
|
173
|
+
/* @__PURE__ */ jsx("button", {
|
|
174
|
+
type: "button",
|
|
175
|
+
"aria-current": state === "active" ? "step" : void 0,
|
|
176
|
+
disabled: isValidating,
|
|
177
|
+
className: cn("flex size-10 shrink-0 items-center justify-center rounded-full border text-gdt-sm font-bold transition-[background-color,border-color,color,box-shadow] focus-visible:border-line-focus focus-visible:shadow-[0_0_0_2px_var(--color-line-focus)] focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50", state === "complete" && "border-status-success bg-status-success text-fg-on-brand", state === "active" && "border-status-info bg-status-info text-fg-on-brand", state === "upcoming" && "border-line bg-canvas text-fg-caption-placeholder hover:border-line-strong hover:text-fg-primary"),
|
|
178
|
+
onClick: () => {
|
|
179
|
+
goTo(step.value);
|
|
180
|
+
},
|
|
181
|
+
children: state === "complete" ? /* @__PURE__ */ jsx(CheckIcon, {
|
|
182
|
+
className: "size-4.5",
|
|
183
|
+
strokeWidth: 2.5
|
|
184
|
+
}) : index + 1
|
|
185
|
+
}),
|
|
186
|
+
/* @__PURE__ */ jsx("span", {
|
|
187
|
+
"aria-hidden": "true",
|
|
188
|
+
className: cn("h-0.5 flex-1 rounded-full bg-line", index === totalSteps - 1 && "bg-transparent", rightComplete && "bg-status-success")
|
|
189
|
+
})
|
|
190
|
+
]
|
|
191
|
+
}), /* @__PURE__ */ jsxs("button", {
|
|
192
|
+
type: "button",
|
|
193
|
+
disabled: isValidating,
|
|
194
|
+
className: cn("mx-auto mt-3 flex max-w-full flex-col items-center gap-1 px-2 text-center transition-colors hover:text-fg-primary disabled:pointer-events-none disabled:opacity-50", state === "complete" && "text-fg-primary", state === "active" && "text-status-info"),
|
|
195
|
+
onClick: () => {
|
|
196
|
+
goTo(step.value);
|
|
197
|
+
},
|
|
198
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
199
|
+
className: "max-w-full truncate text-gdt-sm font-semibold",
|
|
200
|
+
children: step.title
|
|
201
|
+
}), step.description ? /* @__PURE__ */ jsx("span", {
|
|
202
|
+
className: "max-w-full truncate text-gdt-xs font-normal text-fg-caption-placeholder",
|
|
203
|
+
children: step.description
|
|
204
|
+
}) : null]
|
|
205
|
+
})]
|
|
206
|
+
}, step.value);
|
|
207
|
+
})
|
|
208
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
209
|
+
className: "flex flex-col gap-4 md:hidden",
|
|
210
|
+
children: [/* @__PURE__ */ jsx(MultiStepFormStepSelect, {
|
|
211
|
+
trigger: "card",
|
|
212
|
+
currentStepAction
|
|
213
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
214
|
+
className: "flex gap-1.5",
|
|
215
|
+
"aria-hidden": "true",
|
|
216
|
+
children: steps.map((step, index) => /* @__PURE__ */ jsx("span", { className: cn("h-1 flex-1 rounded-full bg-line transition-colors", index < currentIndex && "bg-status-success", index === currentIndex && "bg-status-info") }, step.value))
|
|
217
|
+
})]
|
|
218
|
+
})]
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
function MultiStepFormStepSelect({ trigger, currentStepAction }) {
|
|
222
|
+
const { steps, value, currentIndex, currentStep, goTo, isValidating } = useMultiStepForm();
|
|
223
|
+
const stepNumber = currentIndex + 1;
|
|
224
|
+
const totalSteps = steps.length;
|
|
225
|
+
return /* @__PURE__ */ jsxs(Select, {
|
|
226
|
+
value,
|
|
227
|
+
onValueChange: (nextValue) => {
|
|
228
|
+
if (typeof nextValue === "string") goTo(nextValue);
|
|
229
|
+
},
|
|
230
|
+
size: "md",
|
|
231
|
+
children: [/* @__PURE__ */ jsxs(SelectTrigger, {
|
|
232
|
+
unstyled: true,
|
|
233
|
+
disabled: isValidating,
|
|
234
|
+
className: cn("group/multi-step-form-select-trigger flex min-w-0 items-center justify-between gap-3 text-left outline-none transition-[border-color,box-shadow,color] focus-visible:border-line-focus focus-visible:shadow-[0_0_0_2px_var(--color-line-focus)] disabled:pointer-events-none disabled:opacity-50 [&_svg]:size-4 [&_svg]:text-line-strong", trigger === "card" && "w-full rounded-xl border border-line bg-canvas px-4 py-3 shadow-sm", trigger === "title" && "w-fit max-w-full rounded-md text-fg-primary hover:text-fg-brand"),
|
|
235
|
+
children: [trigger === "card" ? /* @__PURE__ */ jsxs("div", {
|
|
236
|
+
className: "min-w-0",
|
|
237
|
+
children: [
|
|
238
|
+
/* @__PURE__ */ jsxs("p", {
|
|
239
|
+
className: "text-gdt-xs text-fg-caption-placeholder",
|
|
240
|
+
children: [
|
|
241
|
+
"Step ",
|
|
242
|
+
stepNumber,
|
|
243
|
+
" of ",
|
|
244
|
+
totalSteps
|
|
245
|
+
]
|
|
246
|
+
}),
|
|
247
|
+
/* @__PURE__ */ jsx("p", {
|
|
248
|
+
className: "mt-1 truncate text-gdt-sm font-bold text-fg-primary",
|
|
249
|
+
children: currentStep.title
|
|
250
|
+
}),
|
|
251
|
+
currentStep.description ? /* @__PURE__ */ jsx("p", {
|
|
252
|
+
className: "mt-0.5 truncate text-gdt-xs text-fg-secondary",
|
|
253
|
+
children: currentStep.description
|
|
254
|
+
}) : null
|
|
255
|
+
]
|
|
256
|
+
}) : /* @__PURE__ */ jsxs("div", {
|
|
257
|
+
className: "flex min-w-0 flex-col gap-0.5",
|
|
258
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
259
|
+
className: "flex min-w-0 items-center gap-2",
|
|
260
|
+
children: [/* @__PURE__ */ jsx("p", {
|
|
261
|
+
className: "truncate text-gdt-md font-bold md:text-gdt-lg",
|
|
262
|
+
children: currentStep.title
|
|
263
|
+
}), currentStepAction]
|
|
264
|
+
}), currentStep.description ? /* @__PURE__ */ jsx("p", {
|
|
265
|
+
className: "truncate text-gdt-xs text-fg-secondary",
|
|
266
|
+
children: currentStep.description
|
|
267
|
+
}) : null]
|
|
268
|
+
}), /* @__PURE__ */ jsx(SelectValue, { className: "sr-only" })]
|
|
269
|
+
}), /* @__PURE__ */ jsx(SelectContent, {
|
|
270
|
+
align: "start",
|
|
271
|
+
alignItemWithTrigger: true,
|
|
272
|
+
className: "min-w-56",
|
|
273
|
+
children: steps.map((step, index) => /* @__PURE__ */ jsx(SelectItem, {
|
|
274
|
+
value: step.value,
|
|
275
|
+
children: /* @__PURE__ */ jsxs("span", {
|
|
276
|
+
className: "flex min-w-0 flex-col",
|
|
277
|
+
children: [
|
|
278
|
+
/* @__PURE__ */ jsxs("span", {
|
|
279
|
+
className: "text-gdt-xs text-fg-caption-placeholder",
|
|
280
|
+
children: [
|
|
281
|
+
"Step ",
|
|
282
|
+
index + 1,
|
|
283
|
+
" of ",
|
|
284
|
+
totalSteps
|
|
285
|
+
]
|
|
286
|
+
}),
|
|
287
|
+
/* @__PURE__ */ jsx("span", {
|
|
288
|
+
className: "truncate",
|
|
289
|
+
children: step.title
|
|
290
|
+
}),
|
|
291
|
+
step.description ? /* @__PURE__ */ jsx("span", {
|
|
292
|
+
className: "truncate text-gdt-xs text-fg-secondary",
|
|
293
|
+
children: step.description
|
|
294
|
+
}) : null
|
|
295
|
+
]
|
|
296
|
+
})
|
|
297
|
+
}, step.value))
|
|
298
|
+
})]
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
function MultiStepFormContent({ value, forceMount = false, className, ...props }) {
|
|
302
|
+
const { value: currentValue } = useMultiStepForm();
|
|
303
|
+
const isActive = currentValue === value;
|
|
304
|
+
if (!forceMount && !isActive) return null;
|
|
305
|
+
return /* @__PURE__ */ jsx("div", {
|
|
306
|
+
"data-slot": "multi-step-form-content",
|
|
307
|
+
"data-state": isActive ? "active" : "inactive",
|
|
308
|
+
hidden: !isActive,
|
|
309
|
+
className: cn("min-w-0", className),
|
|
310
|
+
...props
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
function MultiStepFormPrevious({ type = "button", disabled, onClick, className, ...props }) {
|
|
314
|
+
const { previous, isFirstStep, isValidating } = useMultiStepForm();
|
|
315
|
+
return /* @__PURE__ */ jsx("button", {
|
|
316
|
+
"data-slot": "multi-step-form-previous",
|
|
317
|
+
type,
|
|
318
|
+
disabled: disabled || isFirstStep || isValidating,
|
|
319
|
+
className: cn("inline-flex h-10 items-center justify-center rounded-full border border-line-strong px-4.5 text-gdt-sm font-bold text-fg-primary transition-colors hover:bg-surface disabled:pointer-events-none disabled:opacity-50", className),
|
|
320
|
+
onClick: (event) => {
|
|
321
|
+
onClick?.(event);
|
|
322
|
+
if (!event.defaultPrevented) previous();
|
|
323
|
+
},
|
|
324
|
+
...props
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
function MultiStepFormNext({ type = "button", disabled, onClick, className, ...props }) {
|
|
328
|
+
const { next, isLastStep, isValidating } = useMultiStepForm();
|
|
329
|
+
return /* @__PURE__ */ jsx("button", {
|
|
330
|
+
"data-slot": "multi-step-form-next",
|
|
331
|
+
type,
|
|
332
|
+
disabled: disabled || isLastStep || isValidating,
|
|
333
|
+
className: cn("inline-flex h-10 items-center justify-center rounded-full bg-action-primary px-4.5 text-gdt-sm font-bold text-fg-on-brand transition-colors hover:bg-action-primary-hover disabled:pointer-events-none disabled:opacity-50", className),
|
|
334
|
+
onClick: (event) => {
|
|
335
|
+
onClick?.(event);
|
|
336
|
+
if (!event.defaultPrevented) next();
|
|
337
|
+
},
|
|
338
|
+
...props
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
//#endregion
|
|
342
|
+
export { MultiStepForm, MultiStepFormContent, MultiStepFormIndicator, MultiStepFormNext, MultiStepFormPrevious, useMultiStepForm };
|
package/dist/number-input.d.ts
CHANGED
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import * as React from
|
|
3
|
-
import {
|
|
4
|
-
|
|
1
|
+
import { t as ComponentSize } from "./size-context-D4mYvcg8.js";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { NumberFieldRootProps } from "@base-ui/react/number-field";
|
|
4
|
+
//#region src/number-input.d.ts
|
|
5
5
|
declare const numberInputFormatPresets: {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
6
|
+
compact: {
|
|
7
|
+
compactDisplay: "short";
|
|
8
|
+
notation: "compact";
|
|
9
|
+
};
|
|
10
|
+
currencyNgn: {
|
|
11
|
+
currency: string;
|
|
12
|
+
currencyDisplay: "narrowSymbol";
|
|
13
|
+
style: "currency";
|
|
14
|
+
};
|
|
15
|
+
decimal: {
|
|
16
|
+
useGrouping: true;
|
|
17
|
+
};
|
|
18
|
+
integer: {
|
|
19
|
+
maximumFractionDigits: number;
|
|
20
|
+
useGrouping: true;
|
|
21
|
+
};
|
|
22
|
+
percent: {
|
|
23
|
+
style: "percent";
|
|
24
|
+
};
|
|
25
|
+
plain: {
|
|
26
|
+
useGrouping: false;
|
|
27
|
+
};
|
|
28
28
|
};
|
|
29
29
|
type NumberInputFormatPreset = keyof typeof numberInputFormatPresets;
|
|
30
30
|
type NumberInputProps = Omit<NumberFieldRootProps, "format"> & {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
31
|
+
children?: React.ReactNode;
|
|
32
|
+
format?: Intl.NumberFormatOptions;
|
|
33
|
+
formatPreset?: NumberInputFormatPreset;
|
|
34
|
+
placeholder?: string;
|
|
35
|
+
size?: ComponentSize;
|
|
36
|
+
thousandSeparator?: boolean;
|
|
37
37
|
};
|
|
38
38
|
declare function NumberInput({ children, format, formatPreset, placeholder, size, thousandSeparator, ...props }: NumberInputProps): React.JSX.Element;
|
|
39
39
|
declare function NumberInputControl(): React.JSX.Element;
|
|
40
|
-
|
|
41
|
-
export { NumberInput, NumberInputControl, type NumberInputFormatPreset, numberInputFormatPresets };
|
|
40
|
+
//#endregion
|
|
41
|
+
export { NumberInput, NumberInputControl, type NumberInputFormatPreset, numberInputFormatPresets };
|