@zentauri-ui/zentauri-components 1.5.22 → 1.5.31

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.
Files changed (77) hide show
  1. package/README.md +59 -2
  2. package/cli/registry.json +2 -0
  3. package/dist/chunk-7OHC4ERB.mjs +60 -0
  4. package/dist/chunk-7OHC4ERB.mjs.map +1 -0
  5. package/dist/{chunk-2VQJ6OIL.js → chunk-HPN7H5ZM.js} +2 -2
  6. package/dist/{chunk-2VQJ6OIL.js.map → chunk-HPN7H5ZM.js.map} +1 -1
  7. package/dist/chunk-JJDANNNL.mjs +71 -0
  8. package/dist/chunk-JJDANNNL.mjs.map +1 -0
  9. package/dist/chunk-KXUG4WVW.js +62 -0
  10. package/dist/chunk-KXUG4WVW.js.map +1 -0
  11. package/dist/chunk-MEJMX4QI.js +73 -0
  12. package/dist/chunk-MEJMX4QI.js.map +1 -0
  13. package/dist/chunk-N6B35KWW.mjs +3 -0
  14. package/dist/chunk-N6B35KWW.mjs.map +1 -0
  15. package/dist/{chunk-73VCO5TE.mjs → chunk-NWOE2TZN.mjs} +2 -2
  16. package/dist/{chunk-73VCO5TE.mjs.map → chunk-NWOE2TZN.mjs.map} +1 -1
  17. package/dist/chunk-RGOMHX4G.js +4 -0
  18. package/dist/chunk-RGOMHX4G.js.map +1 -0
  19. package/dist/hooks/useControllableState.js +3 -2
  20. package/dist/hooks/useControllableState.mjs +2 -1
  21. package/dist/hooks/useDisclosure.js +3 -2
  22. package/dist/hooks/useDisclosure.js.map +1 -1
  23. package/dist/hooks/useDisclosure.mjs +2 -1
  24. package/dist/hooks/useDisclosure.mjs.map +1 -1
  25. package/dist/hooks/useDynamicStepper/index.d.ts +2 -0
  26. package/dist/hooks/useDynamicStepper/index.d.ts.map +1 -0
  27. package/dist/hooks/useDynamicStepper/useDynamicStepper.d.ts +9 -0
  28. package/dist/hooks/useDynamicStepper/useDynamicStepper.d.ts.map +1 -0
  29. package/dist/hooks/useDynamicStepper.js +14 -0
  30. package/dist/hooks/useDynamicStepper.js.map +1 -0
  31. package/dist/hooks/useDynamicStepper.mjs +5 -0
  32. package/dist/hooks/useDynamicStepper.mjs.map +1 -0
  33. package/dist/ui/buttons.js +7 -55
  34. package/dist/ui/buttons.js.map +1 -1
  35. package/dist/ui/buttons.mjs +2 -58
  36. package/dist/ui/buttons.mjs.map +1 -1
  37. package/dist/ui/dynamic-stepper/dynamic-stepper.d.ts +6 -0
  38. package/dist/ui/dynamic-stepper/dynamic-stepper.d.ts.map +1 -0
  39. package/dist/ui/dynamic-stepper/index.d.ts +5 -0
  40. package/dist/ui/dynamic-stepper/index.d.ts.map +1 -0
  41. package/dist/ui/dynamic-stepper/types.d.ts +61 -0
  42. package/dist/ui/dynamic-stepper/types.d.ts.map +1 -0
  43. package/dist/ui/dynamic-stepper/variants.d.ts +21 -0
  44. package/dist/ui/dynamic-stepper/variants.d.ts.map +1 -0
  45. package/dist/ui/dynamic-stepper.js +312 -0
  46. package/dist/ui/dynamic-stepper.js.map +1 -0
  47. package/dist/ui/dynamic-stepper.mjs +305 -0
  48. package/dist/ui/dynamic-stepper.mjs.map +1 -0
  49. package/dist/ui/pagination/pagination.d.ts +5 -16
  50. package/dist/ui/pagination/pagination.d.ts.map +1 -1
  51. package/dist/ui/pagination/types.d.ts +2 -2
  52. package/dist/ui/pagination/types.d.ts.map +1 -1
  53. package/dist/ui/pagination.js +171 -180
  54. package/dist/ui/pagination.js.map +1 -1
  55. package/dist/ui/pagination.mjs +172 -181
  56. package/dist/ui/pagination.mjs.map +1 -1
  57. package/dist/ui/typography/blockquote-base.d.ts.map +1 -1
  58. package/dist/ui/typography/code-block-base.d.ts.map +1 -1
  59. package/dist/ui/typography/heading-base.d.ts.map +1 -1
  60. package/dist/ui/typography/inline-code-base.d.ts.map +1 -1
  61. package/dist/ui/typography.js.map +1 -1
  62. package/dist/ui/typography.mjs.map +1 -1
  63. package/package.json +1 -1
  64. package/src/hooks/useDynamicStepper/index.ts +3 -0
  65. package/src/hooks/useDynamicStepper/useDynamicStepper.test.ts +107 -0
  66. package/src/hooks/useDynamicStepper/useDynamicStepper.ts +91 -0
  67. package/src/ui/dynamic-stepper/dynamic-stepper.test.tsx +109 -0
  68. package/src/ui/dynamic-stepper/dynamic-stepper.tsx +173 -0
  69. package/src/ui/dynamic-stepper/index.ts +24 -0
  70. package/src/ui/dynamic-stepper/types.ts +85 -0
  71. package/src/ui/dynamic-stepper/variants.ts +238 -0
  72. package/src/ui/pagination/pagination.tsx +186 -197
  73. package/src/ui/pagination/types.ts +2 -2
  74. package/src/ui/typography/blockquote-base.tsx +0 -2
  75. package/src/ui/typography/code-block-base.tsx +0 -2
  76. package/src/ui/typography/heading-base.tsx +0 -2
  77. package/src/ui/typography/inline-code-base.tsx +0 -2
package/README.md CHANGED
@@ -54,6 +54,7 @@ Import static primitives from `@zentauri-ui/zentauri-components/ui/<subpath>` wh
54
54
  | Divider | `divider` | `divider/animated` |
55
55
  | Drawer | `drawer` | `drawer/animated` |
56
56
  | Dropdown | `dropdown` | — |
57
+ | Dynamic stepper | `dynamic-stepper` | — |
57
58
  | Empty state | `empty-state` | `empty-state/animated` |
58
59
  | File upload | `file-upload` | — |
59
60
  | Input | `inputs` | `inputs/animated` |
@@ -175,6 +176,60 @@ export function RevenueChart() {
175
176
  }
176
177
  ```
177
178
 
179
+ ## Dynamic Stepper
180
+
181
+ Import the UI from **`@zentauri-ui/zentauri-components/ui/dynamic-stepper`**. This entry is **static only** (no `/animated` subpath). It is separate from the compositional **Stepper** primitives under `ui/stepper` (for example `Stepper`, `StepperItem`, `StepperIndicator`).
182
+
183
+ **Component:** `DynamicStepper` — data-driven steps with Previous / Next controls backed by the **Button** component (`buttonAppearance`, `buttonSize`).
184
+
185
+ **Hook:** `useDynamicStepper` — `@zentauri-ui/zentauri-components/hooks/useDynamicStepper`. Holds a clamped 0-based active step, `goPrevious` / `goNext`, `canGoPrevious` / `canGoNext`, and controlled/uncontrolled wiring (`activeStep`, `defaultActiveStep`, `onActiveStepChange`, `onPrevious`, `onNext`). `DynamicStepper` uses this hook internally.
186
+
187
+ **Types (UI barrel):** `DynamicStepperProps`, `DynamicStepperStep`, `DynamicStepperOrientation`, `DynamicStepperButtonAppearance`, `DynamicStepperButtonSize`, `DynamicStepperIndicatorSize`, `DynamicStepperIndicatorToneAppearance`, `UseDynamicStepperParams`, `UseDynamicStepperResult`.
188
+
189
+ **Step items (`steps`):** optional `id`, `title`, `description`, `indicator` (defaults to a 1-based index).
190
+
191
+ **Indicator tones:** `indicatorCompleteAppearance`, `indicatorCurrentAppearance`, `indicatorUpcomingAppearance` — same keys as **Button** `appearance` except **`gradient-*`** values (defaults: `emerald`, `violet`, `outline`).
192
+
193
+ **Layout:** `orientation` (`horizontal` | `vertical`), `indicatorSize` (`sm` | `md` | `lg`).
194
+
195
+ **Stable targeting:** DOM **`id`** suffixes `-previous`, `-next`, `-mapper` (prefixed by React `useId`) and **`data-slot`** keys including `dynamic-stepper-previous`, `dynamic-stepper-next`, `dynamic-stepper-mapper`.
196
+
197
+ **CVA helpers:** `dynamicStepperRootVariants`, `dynamicStepperMapperVariants`, `dynamicStepperItemVariants`, `dynamicStepperIndicatorVariants`, `dynamicStepperIndicatorToneClass`.
198
+
199
+ ```tsx
200
+ import {
201
+ DynamicStepper,
202
+ type DynamicStepperStep,
203
+ } from "@zentauri-ui/zentauri-components/ui/dynamic-stepper";
204
+ import { useDynamicStepper } from "@zentauri-ui/zentauri-components/hooks/useDynamicStepper";
205
+
206
+ const steps: DynamicStepperStep[] = [
207
+ { id: "cart", title: "Cart", description: "Review items" },
208
+ { id: "pay", title: "Payment", description: "Enter details" },
209
+ ];
210
+
211
+ export function CheckoutFlow() {
212
+ return (
213
+ <DynamicStepper
214
+ steps={steps}
215
+ defaultActiveStep={0}
216
+ buttonAppearance="outline"
217
+ indicatorCompleteAppearance="sky"
218
+ indicatorCurrentAppearance="rose"
219
+ indicatorUpcomingAppearance="outline"
220
+ />
221
+ );
222
+ }
223
+
224
+ /** Headless-only example */
225
+ export function useWizardSteps(stepCount: number) {
226
+ return useDynamicStepper({
227
+ stepCount,
228
+ defaultActiveStep: 0,
229
+ });
230
+ }
231
+ ```
232
+
178
233
  ## React hooks
179
234
 
180
235
  Hooks live in `src/hooks/`. Each hook is a separate published entry under `@zentauri-ui/zentauri-components/hooks/<name>` (same pattern as UI areas). Types are exported where the implementation defines them (for example `UseDisclosureResult`, `PaginationPageItem`). For class-name merging and pagination helpers used alongside hooks, import from `@zentauri-ui/zentauri-components/hooks/utils`.
@@ -188,6 +243,7 @@ Hooks live in `src/hooks/`. Each hook is a separate published entry under `@zent
188
243
  | `useDebouncedValue` | `useDebouncedValue` | Debounced state from a value |
189
244
  | `useDisclosure` | `useDisclosure` | `UseDisclosureParams`, `UseDisclosureResult` |
190
245
  | `useDocumentTitle` | `useDocumentTitle` | `UseDocumentTitleParams` |
246
+ | `useDynamicStepper` | `useDynamicStepper` | `UseDynamicStepperParams`, `UseDynamicStepperResult` (types also on `ui/dynamic-stepper`) |
191
247
  | `useFocusManagement` | `useFocusManagement` | Focus trap / focus moves for overlays |
192
248
  | `useHover` | `useHover` | Pointer hover state |
193
249
  | `useInView` | `useInView` | `UseInViewParams` |
@@ -212,6 +268,7 @@ Hooks live in `src/hooks/`. Each hook is a separate published entry under `@zent
212
268
 
213
269
  ```tsx
214
270
  import { useDisclosure } from "@zentauri-ui/zentauri-components/hooks/useDisclosure";
271
+ import { useDynamicStepper } from "@zentauri-ui/zentauri-components/hooks/useDynamicStepper";
215
272
  import { useMediaQuery } from "@zentauri-ui/zentauri-components/hooks/useMediaQuery";
216
273
  import {
217
274
  buildPaginationItems,
@@ -220,7 +277,7 @@ import {
220
277
  import { cn } from "@zentauri-ui/zentauri-components/hooks/utils";
221
278
  ```
222
279
 
223
- Some UI packages re-export the hook that belongs to that component (for example `usePagination` from `@zentauri-ui/zentauri-components/ui/pagination`). Prefer `hooks/<name>` when you only need the hook without the UI primitives.
280
+ Some UI packages re-export the hook that belongs to that component (for example `usePagination` from `@zentauri-ui/zentauri-components/ui/pagination`). **`dynamic-stepper`** exports hook-related **types** only; import **`useDynamicStepper`** from `hooks/useDynamicStepper`. Prefer `hooks/<name>` when you only need the hook without the UI primitives.
224
281
 
225
282
  ## Installation
226
283
 
@@ -422,7 +479,7 @@ node node_modules/@zentauri-ui/zentauri-components/cli/index.mjs add hook useWin
422
479
  | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
423
480
  | `init` | Writes **`components.json`** in the current working directory (or `--cwd`) with default `aliases` and `resolvedPaths`. Refuses to overwrite an existing file. |
424
481
  | `add <names...>` | Walks up from `--cwd` (default `.`) to find `components.json`, then copies each resolved **UI** folder under `src/ui` or chart entry under `src/charts/<type>`, pulls in hooks those files depend on (including transitive hook imports), and creates **`lib/utils`** at `resolvedPaths.utils` from the package template if it is missing. |
425
- | `add hook <names...>` | Same config lookup; copies only **hook** folders listed under `registry.hooks` (from `hooksEntryNames` in `tsup.config.ts`), including transitive sibling-hook imports. Does not copy UI unless a hook’s imports require you to add a component separately (for example `usePagination` imports types from `ui/pagination`). |
482
+ | `add hook <names...>` | Same config lookup; copies only **hook** folders listed under `registry.hooks` (from `hooksEntryNames` in `tsup.config.ts`), including transitive sibling-hook imports. Does not copy UI unless a hook’s imports require you to add a component separately (for example `usePagination` imports types from `ui/pagination`; `useDynamicStepper` imports types from `ui/dynamic-stepper`). |
426
483
 
427
484
  Global flags: `-h` / `--help`, `-v` / `--version`, `--cwd <dir>` (relative to `process.cwd()`).
428
485
 
package/cli/registry.json CHANGED
@@ -17,6 +17,7 @@
17
17
  "divider",
18
18
  "drawer",
19
19
  "dropdown",
20
+ "dynamic-stepper",
20
21
  "empty-state",
21
22
  "file-upload",
22
23
  "inputs",
@@ -44,6 +45,7 @@
44
45
  "useDebouncedValue",
45
46
  "useDisclosure",
46
47
  "useDocumentTitle",
48
+ "useDynamicStepper",
47
49
  "useFocusManagement",
48
50
  "useHover",
49
51
  "useInView",
@@ -0,0 +1,60 @@
1
+ import { buttonVariants } from './chunk-5TV7EL3H.mjs';
2
+ import { cn } from './chunk-4D54YOL6.mjs';
3
+ import { jsx } from 'react/jsx-runtime';
4
+
5
+ var ButtonBase = (props) => {
6
+ if (props.as === "link") {
7
+ const {
8
+ className: className2,
9
+ appearance: appearance2,
10
+ size: size2,
11
+ children: children2,
12
+ ref: ref2,
13
+ href,
14
+ target,
15
+ ...rest2
16
+ } = props;
17
+ return /* @__PURE__ */ jsx(
18
+ "a",
19
+ {
20
+ ref: ref2,
21
+ href,
22
+ target,
23
+ rel: target === "_blank" ? "noopener noreferrer" : void 0,
24
+ "data-slot": "button",
25
+ className: cn(buttonVariants({ appearance: appearance2, size: size2 }), className2),
26
+ ...rest2,
27
+ children: children2
28
+ }
29
+ );
30
+ }
31
+ const {
32
+ className,
33
+ appearance,
34
+ size,
35
+ type = "button",
36
+ children,
37
+ ref,
38
+ ...rest
39
+ } = props;
40
+ return /* @__PURE__ */ jsx(
41
+ "button",
42
+ {
43
+ ref,
44
+ type,
45
+ "data-slot": "button",
46
+ className: cn(buttonVariants({ appearance, size }), className),
47
+ ...rest,
48
+ children
49
+ }
50
+ );
51
+ };
52
+ ButtonBase.displayName = "Button";
53
+ var Button = (props) => {
54
+ return /* @__PURE__ */ jsx(ButtonBase, { ...props });
55
+ };
56
+ Button.displayName = "Button";
57
+
58
+ export { Button };
59
+ //# sourceMappingURL=chunk-7OHC4ERB.mjs.map
60
+ //# sourceMappingURL=chunk-7OHC4ERB.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/buttons/button-base.tsx","../src/ui/buttons/button.tsx"],"names":["className","appearance","size","children","ref","rest","jsx"],"mappings":";;;;AAOO,IAAM,UAAA,GAAa,CAAC,KAAA,KAAuB;AAChD,EAAA,IAAI,KAAA,CAAM,OAAO,MAAA,EAAQ;AACvB,IAAA,MAAM;AAAA,MACJ,SAAA,EAAAA,UAAAA;AAAA,MACA,UAAA,EAAAC,WAAAA;AAAA,MACA,IAAA,EAAAC,KAAAA;AAAA,MACA,QAAA,EAAAC,SAAAA;AAAA,MACA,GAAA,EAAAC,IAAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAGC;AAAA,KACL,GAAI,KAAA;AAEJ,IAAA,uBACE,GAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAKD,IAAAA;AAAA,QACL,IAAA;AAAA,QACA,MAAA;AAAA,QACA,GAAA,EAAK,MAAA,KAAW,QAAA,GAAW,qBAAA,GAAwB,MAAA;AAAA,QACnD,WAAA,EAAU,QAAA;AAAA,QACV,SAAA,EAAW,EAAA,CAAG,cAAA,CAAe,EAAE,UAAA,EAAAH,aAAY,IAAA,EAAAC,KAAAA,EAAM,CAAA,EAAGF,UAAS,CAAA;AAAA,QAC5D,GAAGK,KAAAA;AAAA,QAEH,QAAA,EAAAF;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA,GAAO,QAAA;AAAA,IACP,QAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAG;AAAA,GACL,GAAI,KAAA;AAEJ,EAAA,uBACE,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA;AAAA,MACA,WAAA,EAAU,QAAA;AAAA,MACV,SAAA,EAAW,GAAG,cAAA,CAAe,EAAE,YAAY,IAAA,EAAM,GAAG,SAAS,CAAA;AAAA,MAC5D,GAAG,IAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ,CAAA;AAEA,UAAA,CAAW,WAAA,GAAc,QAAA;ACtDlB,IAAM,MAAA,GAAS,CAAC,KAAA,KAAuB;AAC5C,EAAA,uBAAOG,GAAAA,CAAC,UAAA,EAAA,EAAY,GAAG,KAAA,EAAO,CAAA;AAChC;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA","file":"chunk-7OHC4ERB.mjs","sourcesContent":["\"use client\";\n\nimport { cn } from \"../../lib/utils\";\n\nimport type { ButtonProps } from \"./types\";\nimport { buttonVariants } from \"./variants\";\n\nexport const ButtonBase = (props: ButtonProps) => {\n if (props.as === \"link\") {\n const {\n className,\n appearance,\n size,\n children,\n ref,\n href,\n target,\n ...rest\n } = props;\n\n return (\n <a\n ref={ref}\n href={href}\n target={target}\n rel={target === \"_blank\" ? \"noopener noreferrer\" : undefined}\n data-slot=\"button\"\n className={cn(buttonVariants({ appearance, size }), className)}\n {...rest}\n >\n {children}\n </a>\n );\n }\n\n const {\n className,\n appearance,\n size,\n type = \"button\",\n children,\n ref,\n ...rest\n } = props;\n\n return (\n <button\n ref={ref}\n type={type}\n data-slot=\"button\"\n className={cn(buttonVariants({ appearance, size }), className)}\n {...rest}\n >\n {children}\n </button>\n );\n};\n\nButtonBase.displayName = \"Button\";\n","// button.tsx — default static entry (no framer-motion)\nimport { ButtonBase } from \"./button-base\";\nimport type { ButtonProps } from \"./types\";\n\nexport const Button = (props: ButtonProps) => {\n return <ButtonBase {...props} />;\n};\n\nButton.displayName = \"Button\";\n"]}
@@ -27,5 +27,5 @@ function useControllableState({
27
27
  }
28
28
 
29
29
  exports.useControllableState = useControllableState;
30
- //# sourceMappingURL=chunk-2VQJ6OIL.js.map
31
- //# sourceMappingURL=chunk-2VQJ6OIL.js.map
30
+ //# sourceMappingURL=chunk-HPN7H5ZM.js.map
31
+ //# sourceMappingURL=chunk-HPN7H5ZM.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks/useControllableState/useControllableState.ts"],"names":["useState","useRef","useCallback"],"mappings":";;;;;AAwBO,SAAS,oBAAA,CAAwB;AAAA,EACtC,KAAA,EAAO,SAAA;AAAA,EACP,YAAA;AAAA,EACA;AACF,CAAA,EAA6E;AAC3E,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,YAAY,CAAA;AAC7D,EAAA,MAAM,eAAe,SAAA,KAAc,MAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,eAAe,SAAA,GAAY,YAAA;AACzC,EAAA,MAAM,WAAA,GAAcC,aAAO,QAAQ,CAAA;AACnC,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAEtB,EAAA,MAAM,QAAA,GAAWC,iBAAA;AAAA,IACf,CAAC,IAAA,KAA+B;AAC9B,MAAA,MAAM,WACJ,OAAO,IAAA,KAAS,UAAA,GAAc,IAAA,CAAwB,KAAK,CAAA,GAAI,IAAA;AACjE,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,eAAA,CAAgB,QAAQ,CAAA;AAAA,MAC1B;AACA,MAAA,WAAA,CAAY,UAAU,QAAQ,CAAA;AAAA,IAChC,CAAA;AAAA,IACA,CAAC,cAAc,KAAK;AAAA,GACtB;AAEA,EAAA,OAAO,CAAC,OAAO,QAAQ,CAAA;AACzB","file":"chunk-2VQJ6OIL.js","sourcesContent":["\"use client\";\n\nimport { useCallback, useRef, useState } from \"react\";\n\nexport type UseControllableStateParams<T> = {\n /** When defined, the hook is controlled and this value is returned as state. */\n value?: T;\n /** Initial / fallback value when uncontrolled (`value` is `undefined`). */\n defaultValue: T;\n /** Notified on every `setValue` with the resolved next value (controlled and uncontrolled). */\n onChange?: (next: T) => void;\n};\n\n/**\n * Implements the React “controlled vs uncontrolled” pattern as a single state tuple.\n *\n * - If `value` is `undefined`, internal state mirrors `defaultValue` and updates on `setValue`.\n * - If `value` is defined, returned state follows `value`; `setValue` still calls `onChange` so the parent can update.\n * - `setValue` accepts either the next value or an updater `(prev) => next` (updater uses the current `value` in controlled mode).\n *\n * @typeParam T - State value type.\n * @param params - `value`, `defaultValue`, and optional `onChange`.\n * @returns `[value, setValue]` compatible with `useState`-style usage.\n */\nexport function useControllableState<T>({\n value: valueProp,\n defaultValue,\n onChange,\n}: UseControllableStateParams<T>): [T, (next: T | ((prev: T) => T)) => void] {\n const [uncontrolled, setUncontrolled] = useState(defaultValue);\n const isControlled = valueProp !== undefined;\n const value = isControlled ? valueProp : uncontrolled;\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const setValue = useCallback(\n (next: T | ((prev: T) => T)) => {\n const resolved =\n typeof next === \"function\" ? (next as (prev: T) => T)(value) : next;\n if (!isControlled) {\n setUncontrolled(resolved);\n }\n onChangeRef.current?.(resolved);\n },\n [isControlled, value],\n );\n\n return [value, setValue];\n}\n"]}
1
+ {"version":3,"sources":["../src/hooks/useControllableState/useControllableState.ts"],"names":["useState","useRef","useCallback"],"mappings":";;;;;AAwBO,SAAS,oBAAA,CAAwB;AAAA,EACtC,KAAA,EAAO,SAAA;AAAA,EACP,YAAA;AAAA,EACA;AACF,CAAA,EAA6E;AAC3E,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,YAAY,CAAA;AAC7D,EAAA,MAAM,eAAe,SAAA,KAAc,MAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,eAAe,SAAA,GAAY,YAAA;AACzC,EAAA,MAAM,WAAA,GAAcC,aAAO,QAAQ,CAAA;AACnC,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAEtB,EAAA,MAAM,QAAA,GAAWC,iBAAA;AAAA,IACf,CAAC,IAAA,KAA+B;AAC9B,MAAA,MAAM,WACJ,OAAO,IAAA,KAAS,UAAA,GAAc,IAAA,CAAwB,KAAK,CAAA,GAAI,IAAA;AACjE,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,eAAA,CAAgB,QAAQ,CAAA;AAAA,MAC1B;AACA,MAAA,WAAA,CAAY,UAAU,QAAQ,CAAA;AAAA,IAChC,CAAA;AAAA,IACA,CAAC,cAAc,KAAK;AAAA,GACtB;AAEA,EAAA,OAAO,CAAC,OAAO,QAAQ,CAAA;AACzB","file":"chunk-HPN7H5ZM.js","sourcesContent":["\"use client\";\n\nimport { useCallback, useRef, useState } from \"react\";\n\nexport type UseControllableStateParams<T> = {\n /** When defined, the hook is controlled and this value is returned as state. */\n value?: T;\n /** Initial / fallback value when uncontrolled (`value` is `undefined`). */\n defaultValue: T;\n /** Notified on every `setValue` with the resolved next value (controlled and uncontrolled). */\n onChange?: (next: T) => void;\n};\n\n/**\n * Implements the React “controlled vs uncontrolled” pattern as a single state tuple.\n *\n * - If `value` is `undefined`, internal state mirrors `defaultValue` and updates on `setValue`.\n * - If `value` is defined, returned state follows `value`; `setValue` still calls `onChange` so the parent can update.\n * - `setValue` accepts either the next value or an updater `(prev) => next` (updater uses the current `value` in controlled mode).\n *\n * @typeParam T - State value type.\n * @param params - `value`, `defaultValue`, and optional `onChange`.\n * @returns `[value, setValue]` compatible with `useState`-style usage.\n */\nexport function useControllableState<T>({\n value: valueProp,\n defaultValue,\n onChange,\n}: UseControllableStateParams<T>): [T, (next: T | ((prev: T) => T)) => void] {\n const [uncontrolled, setUncontrolled] = useState(defaultValue);\n const isControlled = valueProp !== undefined;\n const value = isControlled ? valueProp : uncontrolled;\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const setValue = useCallback(\n (next: T | ((prev: T) => T)) => {\n const resolved =\n typeof next === \"function\" ? (next as (prev: T) => T)(value) : next;\n if (!isControlled) {\n setUncontrolled(resolved);\n }\n onChangeRef.current?.(resolved);\n },\n [isControlled, value],\n );\n\n return [value, setValue];\n}\n"]}
@@ -0,0 +1,71 @@
1
+ import { useControllableState } from './chunk-NWOE2TZN.mjs';
2
+ import { useMemo, useCallback } from 'react';
3
+
4
+ function clampDynamicStepperIndex(index, stepCount) {
5
+ if (stepCount <= 0) {
6
+ return 0;
7
+ }
8
+ return Math.min(Math.max(index, 0), stepCount - 1);
9
+ }
10
+ function useDynamicStepper({
11
+ stepCount,
12
+ activeStep: activeStepProp,
13
+ defaultActiveStep = 0,
14
+ onActiveStepChange,
15
+ onPrevious,
16
+ onNext
17
+ }) {
18
+ const [storedStep, setStoredStep] = useControllableState({
19
+ value: activeStepProp,
20
+ defaultValue: clampDynamicStepperIndex(defaultActiveStep, stepCount),
21
+ onChange: onActiveStepChange
22
+ });
23
+ const activeStep = useMemo(
24
+ () => clampDynamicStepperIndex(storedStep, stepCount),
25
+ [storedStep, stepCount]
26
+ );
27
+ const canGoPrevious = stepCount > 0 && activeStep > 0;
28
+ const canGoNext = stepCount > 0 && activeStep < stepCount - 1;
29
+ const setActiveStep = useCallback(
30
+ (next) => {
31
+ const resolved = typeof next === "function" ? next(activeStep) : next;
32
+ setStoredStep(clampDynamicStepperIndex(resolved, stepCount));
33
+ },
34
+ [activeStep, setStoredStep, stepCount]
35
+ );
36
+ const goPrevious = useCallback(() => {
37
+ if (!canGoPrevious) {
38
+ return;
39
+ }
40
+ const nextStep = clampDynamicStepperIndex(activeStep - 1, stepCount);
41
+ setStoredStep(nextStep);
42
+ onPrevious?.(nextStep);
43
+ }, [
44
+ activeStep,
45
+ canGoPrevious,
46
+ onPrevious,
47
+ setStoredStep,
48
+ stepCount
49
+ ]);
50
+ const goNext = useCallback(() => {
51
+ if (!canGoNext) {
52
+ return;
53
+ }
54
+ const nextStep = clampDynamicStepperIndex(activeStep + 1, stepCount);
55
+ setStoredStep(nextStep);
56
+ onNext?.(nextStep);
57
+ }, [activeStep, canGoNext, onNext, setStoredStep, stepCount]);
58
+ return {
59
+ activeStep,
60
+ setActiveStep,
61
+ goPrevious,
62
+ goNext,
63
+ canGoPrevious,
64
+ canGoNext,
65
+ stepCount
66
+ };
67
+ }
68
+
69
+ export { useDynamicStepper };
70
+ //# sourceMappingURL=chunk-JJDANNNL.mjs.map
71
+ //# sourceMappingURL=chunk-JJDANNNL.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useDynamicStepper/useDynamicStepper.ts"],"names":[],"mappings":";;;AAWA,SAAS,wBAAA,CAAyB,OAAe,SAAA,EAA2B;AAC1E,EAAA,IAAI,aAAa,CAAA,EAAG;AAClB,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA,CAAK,IAAI,IAAA,CAAK,GAAA,CAAI,OAAO,CAAC,CAAA,EAAG,YAAY,CAAC,CAAA;AACnD;AAQO,SAAS,iBAAA,CAAkB;AAAA,EAChC,SAAA;AAAA,EACA,UAAA,EAAY,cAAA;AAAA,EACZ,iBAAA,GAAoB,CAAA;AAAA,EACpB,kBAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAAqD;AACnD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,oBAAA,CAA6B;AAAA,IAC/D,KAAA,EAAO,cAAA;AAAA,IACP,YAAA,EAAc,wBAAA,CAAyB,iBAAA,EAAmB,SAAS,CAAA;AAAA,IACnE,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,OAAA;AAAA,IACjB,MAAM,wBAAA,CAAyB,UAAA,EAAY,SAAS,CAAA;AAAA,IACpD,CAAC,YAAY,SAAS;AAAA,GACxB;AAEA,EAAA,MAAM,aAAA,GAAgB,SAAA,GAAY,CAAA,IAAK,UAAA,GAAa,CAAA;AACpD,EAAA,MAAM,SAAA,GAAY,SAAA,GAAY,CAAA,IAAK,UAAA,GAAa,SAAA,GAAY,CAAA;AAE5D,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,CAAC,IAAA,KAA8C;AAC7C,MAAA,MAAM,WACJ,OAAO,IAAA,KAAS,UAAA,GACX,IAAA,CAAkC,UAAU,CAAA,GAC7C,IAAA;AACN,MAAA,aAAA,CAAc,wBAAA,CAAyB,QAAA,EAAU,SAAS,CAAC,CAAA;AAAA,IAC7D,CAAA;AAAA,IACA,CAAC,UAAA,EAAY,aAAA,EAAe,SAAS;AAAA,GACvC;AAEA,EAAA,MAAM,UAAA,GAAa,YAAY,MAAM;AACnC,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAW,wBAAA,CAAyB,UAAA,GAAa,CAAA,EAAG,SAAS,CAAA;AACnE,IAAA,aAAA,CAAc,QAAQ,CAAA;AACtB,IAAA,UAAA,GAAa,QAAQ,CAAA;AAAA,EACvB,CAAA,EAAG;AAAA,IACD,UAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,YAAY,MAAM;AAC/B,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAW,wBAAA,CAAyB,UAAA,GAAa,CAAA,EAAG,SAAS,CAAA;AACnE,IAAA,aAAA,CAAc,QAAQ,CAAA;AACtB,IAAA,MAAA,GAAS,QAAQ,CAAA;AAAA,EACnB,GAAG,CAAC,UAAA,EAAY,WAAW,MAAA,EAAQ,aAAA,EAAe,SAAS,CAAC,CAAA;AAE5D,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,MAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF","file":"chunk-JJDANNNL.mjs","sourcesContent":["\"use client\";\n\nimport { useCallback, useMemo } from \"react\";\n\nimport { useControllableState } from \"../useControllableState/useControllableState\";\n\nimport type {\n UseDynamicStepperParams,\n UseDynamicStepperResult,\n} from \"../../ui/dynamic-stepper/types\";\n\nfunction clampDynamicStepperIndex(index: number, stepCount: number): number {\n if (stepCount <= 0) {\n return 0;\n }\n return Math.min(Math.max(index, 0), stepCount - 1);\n}\n\n/**\n * Headless multi-step index with prev/next navigation.\n *\n * @param params.stepCount - Number of steps (0-based count semantics via indices).\n * @returns Active step, setter, navigation helpers, and boundary flags.\n */\nexport function useDynamicStepper({\n stepCount,\n activeStep: activeStepProp,\n defaultActiveStep = 0,\n onActiveStepChange,\n onPrevious,\n onNext,\n}: UseDynamicStepperParams): UseDynamicStepperResult {\n const [storedStep, setStoredStep] = useControllableState<number>({\n value: activeStepProp,\n defaultValue: clampDynamicStepperIndex(defaultActiveStep, stepCount),\n onChange: onActiveStepChange,\n });\n\n const activeStep = useMemo(\n () => clampDynamicStepperIndex(storedStep, stepCount),\n [storedStep, stepCount],\n );\n\n const canGoPrevious = stepCount > 0 && activeStep > 0;\n const canGoNext = stepCount > 0 && activeStep < stepCount - 1;\n\n const setActiveStep = useCallback(\n (next: number | ((prev: number) => number)) => {\n const resolved =\n typeof next === \"function\"\n ? (next as (prev: number) => number)(activeStep)\n : next;\n setStoredStep(clampDynamicStepperIndex(resolved, stepCount));\n },\n [activeStep, setStoredStep, stepCount],\n );\n\n const goPrevious = useCallback(() => {\n if (!canGoPrevious) {\n return;\n }\n const nextStep = clampDynamicStepperIndex(activeStep - 1, stepCount);\n setStoredStep(nextStep);\n onPrevious?.(nextStep);\n }, [\n activeStep,\n canGoPrevious,\n onPrevious,\n setStoredStep,\n stepCount,\n ]);\n\n const goNext = useCallback(() => {\n if (!canGoNext) {\n return;\n }\n const nextStep = clampDynamicStepperIndex(activeStep + 1, stepCount);\n setStoredStep(nextStep);\n onNext?.(nextStep);\n }, [activeStep, canGoNext, onNext, setStoredStep, stepCount]);\n\n return {\n activeStep,\n setActiveStep,\n goPrevious,\n goNext,\n canGoPrevious,\n canGoNext,\n stepCount,\n };\n}\n"]}
@@ -0,0 +1,62 @@
1
+ 'use strict';
2
+
3
+ var chunkOB4KJZK2_js = require('./chunk-OB4KJZK2.js');
4
+ var chunkZS5756ZC_js = require('./chunk-ZS5756ZC.js');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ var ButtonBase = (props) => {
8
+ if (props.as === "link") {
9
+ const {
10
+ className: className2,
11
+ appearance: appearance2,
12
+ size: size2,
13
+ children: children2,
14
+ ref: ref2,
15
+ href,
16
+ target,
17
+ ...rest2
18
+ } = props;
19
+ return /* @__PURE__ */ jsxRuntime.jsx(
20
+ "a",
21
+ {
22
+ ref: ref2,
23
+ href,
24
+ target,
25
+ rel: target === "_blank" ? "noopener noreferrer" : void 0,
26
+ "data-slot": "button",
27
+ className: chunkZS5756ZC_js.cn(chunkOB4KJZK2_js.buttonVariants({ appearance: appearance2, size: size2 }), className2),
28
+ ...rest2,
29
+ children: children2
30
+ }
31
+ );
32
+ }
33
+ const {
34
+ className,
35
+ appearance,
36
+ size,
37
+ type = "button",
38
+ children,
39
+ ref,
40
+ ...rest
41
+ } = props;
42
+ return /* @__PURE__ */ jsxRuntime.jsx(
43
+ "button",
44
+ {
45
+ ref,
46
+ type,
47
+ "data-slot": "button",
48
+ className: chunkZS5756ZC_js.cn(chunkOB4KJZK2_js.buttonVariants({ appearance, size }), className),
49
+ ...rest,
50
+ children
51
+ }
52
+ );
53
+ };
54
+ ButtonBase.displayName = "Button";
55
+ var Button = (props) => {
56
+ return /* @__PURE__ */ jsxRuntime.jsx(ButtonBase, { ...props });
57
+ };
58
+ Button.displayName = "Button";
59
+
60
+ exports.Button = Button;
61
+ //# sourceMappingURL=chunk-KXUG4WVW.js.map
62
+ //# sourceMappingURL=chunk-KXUG4WVW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/buttons/button-base.tsx","../src/ui/buttons/button.tsx"],"names":["className","appearance","size","children","ref","rest","jsx","cn","buttonVariants"],"mappings":";;;;;;AAOO,IAAM,UAAA,GAAa,CAAC,KAAA,KAAuB;AAChD,EAAA,IAAI,KAAA,CAAM,OAAO,MAAA,EAAQ;AACvB,IAAA,MAAM;AAAA,MACJ,SAAA,EAAAA,UAAAA;AAAA,MACA,UAAA,EAAAC,WAAAA;AAAA,MACA,IAAA,EAAAC,KAAAA;AAAA,MACA,QAAA,EAAAC,SAAAA;AAAA,MACA,GAAA,EAAAC,IAAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAGC;AAAA,KACL,GAAI,KAAA;AAEJ,IAAA,uBACEC,cAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAKF,IAAAA;AAAA,QACL,IAAA;AAAA,QACA,MAAA;AAAA,QACA,GAAA,EAAK,MAAA,KAAW,QAAA,GAAW,qBAAA,GAAwB,MAAA;AAAA,QACnD,WAAA,EAAU,QAAA;AAAA,QACV,SAAA,EAAWG,mBAAA,CAAGC,+BAAA,CAAe,EAAE,UAAA,EAAAP,aAAY,IAAA,EAAAC,KAAAA,EAAM,CAAA,EAAGF,UAAS,CAAA;AAAA,QAC5D,GAAGK,KAAAA;AAAA,QAEH,QAAA,EAAAF;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA,GAAO,QAAA;AAAA,IACP,QAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAG;AAAA,GACL,GAAI,KAAA;AAEJ,EAAA,uBACEG,cAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA;AAAA,MACA,WAAA,EAAU,QAAA;AAAA,MACV,SAAA,EAAWC,oBAAGC,+BAAA,CAAe,EAAE,YAAY,IAAA,EAAM,GAAG,SAAS,CAAA;AAAA,MAC5D,GAAG,IAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ,CAAA;AAEA,UAAA,CAAW,WAAA,GAAc,QAAA;ACtDlB,IAAM,MAAA,GAAS,CAAC,KAAA,KAAuB;AAC5C,EAAA,uBAAOF,cAAAA,CAAC,UAAA,EAAA,EAAY,GAAG,KAAA,EAAO,CAAA;AAChC;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA","file":"chunk-KXUG4WVW.js","sourcesContent":["\"use client\";\n\nimport { cn } from \"../../lib/utils\";\n\nimport type { ButtonProps } from \"./types\";\nimport { buttonVariants } from \"./variants\";\n\nexport const ButtonBase = (props: ButtonProps) => {\n if (props.as === \"link\") {\n const {\n className,\n appearance,\n size,\n children,\n ref,\n href,\n target,\n ...rest\n } = props;\n\n return (\n <a\n ref={ref}\n href={href}\n target={target}\n rel={target === \"_blank\" ? \"noopener noreferrer\" : undefined}\n data-slot=\"button\"\n className={cn(buttonVariants({ appearance, size }), className)}\n {...rest}\n >\n {children}\n </a>\n );\n }\n\n const {\n className,\n appearance,\n size,\n type = \"button\",\n children,\n ref,\n ...rest\n } = props;\n\n return (\n <button\n ref={ref}\n type={type}\n data-slot=\"button\"\n className={cn(buttonVariants({ appearance, size }), className)}\n {...rest}\n >\n {children}\n </button>\n );\n};\n\nButtonBase.displayName = \"Button\";\n","// button.tsx — default static entry (no framer-motion)\nimport { ButtonBase } from \"./button-base\";\nimport type { ButtonProps } from \"./types\";\n\nexport const Button = (props: ButtonProps) => {\n return <ButtonBase {...props} />;\n};\n\nButton.displayName = \"Button\";\n"]}
@@ -0,0 +1,73 @@
1
+ 'use strict';
2
+
3
+ var chunkHPN7H5ZM_js = require('./chunk-HPN7H5ZM.js');
4
+ var react = require('react');
5
+
6
+ function clampDynamicStepperIndex(index, stepCount) {
7
+ if (stepCount <= 0) {
8
+ return 0;
9
+ }
10
+ return Math.min(Math.max(index, 0), stepCount - 1);
11
+ }
12
+ function useDynamicStepper({
13
+ stepCount,
14
+ activeStep: activeStepProp,
15
+ defaultActiveStep = 0,
16
+ onActiveStepChange,
17
+ onPrevious,
18
+ onNext
19
+ }) {
20
+ const [storedStep, setStoredStep] = chunkHPN7H5ZM_js.useControllableState({
21
+ value: activeStepProp,
22
+ defaultValue: clampDynamicStepperIndex(defaultActiveStep, stepCount),
23
+ onChange: onActiveStepChange
24
+ });
25
+ const activeStep = react.useMemo(
26
+ () => clampDynamicStepperIndex(storedStep, stepCount),
27
+ [storedStep, stepCount]
28
+ );
29
+ const canGoPrevious = stepCount > 0 && activeStep > 0;
30
+ const canGoNext = stepCount > 0 && activeStep < stepCount - 1;
31
+ const setActiveStep = react.useCallback(
32
+ (next) => {
33
+ const resolved = typeof next === "function" ? next(activeStep) : next;
34
+ setStoredStep(clampDynamicStepperIndex(resolved, stepCount));
35
+ },
36
+ [activeStep, setStoredStep, stepCount]
37
+ );
38
+ const goPrevious = react.useCallback(() => {
39
+ if (!canGoPrevious) {
40
+ return;
41
+ }
42
+ const nextStep = clampDynamicStepperIndex(activeStep - 1, stepCount);
43
+ setStoredStep(nextStep);
44
+ onPrevious?.(nextStep);
45
+ }, [
46
+ activeStep,
47
+ canGoPrevious,
48
+ onPrevious,
49
+ setStoredStep,
50
+ stepCount
51
+ ]);
52
+ const goNext = react.useCallback(() => {
53
+ if (!canGoNext) {
54
+ return;
55
+ }
56
+ const nextStep = clampDynamicStepperIndex(activeStep + 1, stepCount);
57
+ setStoredStep(nextStep);
58
+ onNext?.(nextStep);
59
+ }, [activeStep, canGoNext, onNext, setStoredStep, stepCount]);
60
+ return {
61
+ activeStep,
62
+ setActiveStep,
63
+ goPrevious,
64
+ goNext,
65
+ canGoPrevious,
66
+ canGoNext,
67
+ stepCount
68
+ };
69
+ }
70
+
71
+ exports.useDynamicStepper = useDynamicStepper;
72
+ //# sourceMappingURL=chunk-MEJMX4QI.js.map
73
+ //# sourceMappingURL=chunk-MEJMX4QI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useDynamicStepper/useDynamicStepper.ts"],"names":["useControllableState","useMemo","useCallback"],"mappings":";;;;;AAWA,SAAS,wBAAA,CAAyB,OAAe,SAAA,EAA2B;AAC1E,EAAA,IAAI,aAAa,CAAA,EAAG;AAClB,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA,CAAK,IAAI,IAAA,CAAK,GAAA,CAAI,OAAO,CAAC,CAAA,EAAG,YAAY,CAAC,CAAA;AACnD;AAQO,SAAS,iBAAA,CAAkB;AAAA,EAChC,SAAA;AAAA,EACA,UAAA,EAAY,cAAA;AAAA,EACZ,iBAAA,GAAoB,CAAA;AAAA,EACpB,kBAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAAqD;AACnD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,qCAAA,CAA6B;AAAA,IAC/D,KAAA,EAAO,cAAA;AAAA,IACP,YAAA,EAAc,wBAAA,CAAyB,iBAAA,EAAmB,SAAS,CAAA;AAAA,IACnE,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,UAAA,GAAaC,aAAA;AAAA,IACjB,MAAM,wBAAA,CAAyB,UAAA,EAAY,SAAS,CAAA;AAAA,IACpD,CAAC,YAAY,SAAS;AAAA,GACxB;AAEA,EAAA,MAAM,aAAA,GAAgB,SAAA,GAAY,CAAA,IAAK,UAAA,GAAa,CAAA;AACpD,EAAA,MAAM,SAAA,GAAY,SAAA,GAAY,CAAA,IAAK,UAAA,GAAa,SAAA,GAAY,CAAA;AAE5D,EAAA,MAAM,aAAA,GAAgBC,iBAAA;AAAA,IACpB,CAAC,IAAA,KAA8C;AAC7C,MAAA,MAAM,WACJ,OAAO,IAAA,KAAS,UAAA,GACX,IAAA,CAAkC,UAAU,CAAA,GAC7C,IAAA;AACN,MAAA,aAAA,CAAc,wBAAA,CAAyB,QAAA,EAAU,SAAS,CAAC,CAAA;AAAA,IAC7D,CAAA;AAAA,IACA,CAAC,UAAA,EAAY,aAAA,EAAe,SAAS;AAAA,GACvC;AAEA,EAAA,MAAM,UAAA,GAAaA,kBAAY,MAAM;AACnC,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAW,wBAAA,CAAyB,UAAA,GAAa,CAAA,EAAG,SAAS,CAAA;AACnE,IAAA,aAAA,CAAc,QAAQ,CAAA;AACtB,IAAA,UAAA,GAAa,QAAQ,CAAA;AAAA,EACvB,CAAA,EAAG;AAAA,IACD,UAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,MAAA,GAASA,kBAAY,MAAM;AAC/B,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAW,wBAAA,CAAyB,UAAA,GAAa,CAAA,EAAG,SAAS,CAAA;AACnE,IAAA,aAAA,CAAc,QAAQ,CAAA;AACtB,IAAA,MAAA,GAAS,QAAQ,CAAA;AAAA,EACnB,GAAG,CAAC,UAAA,EAAY,WAAW,MAAA,EAAQ,aAAA,EAAe,SAAS,CAAC,CAAA;AAE5D,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,MAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF","file":"chunk-MEJMX4QI.js","sourcesContent":["\"use client\";\n\nimport { useCallback, useMemo } from \"react\";\n\nimport { useControllableState } from \"../useControllableState/useControllableState\";\n\nimport type {\n UseDynamicStepperParams,\n UseDynamicStepperResult,\n} from \"../../ui/dynamic-stepper/types\";\n\nfunction clampDynamicStepperIndex(index: number, stepCount: number): number {\n if (stepCount <= 0) {\n return 0;\n }\n return Math.min(Math.max(index, 0), stepCount - 1);\n}\n\n/**\n * Headless multi-step index with prev/next navigation.\n *\n * @param params.stepCount - Number of steps (0-based count semantics via indices).\n * @returns Active step, setter, navigation helpers, and boundary flags.\n */\nexport function useDynamicStepper({\n stepCount,\n activeStep: activeStepProp,\n defaultActiveStep = 0,\n onActiveStepChange,\n onPrevious,\n onNext,\n}: UseDynamicStepperParams): UseDynamicStepperResult {\n const [storedStep, setStoredStep] = useControllableState<number>({\n value: activeStepProp,\n defaultValue: clampDynamicStepperIndex(defaultActiveStep, stepCount),\n onChange: onActiveStepChange,\n });\n\n const activeStep = useMemo(\n () => clampDynamicStepperIndex(storedStep, stepCount),\n [storedStep, stepCount],\n );\n\n const canGoPrevious = stepCount > 0 && activeStep > 0;\n const canGoNext = stepCount > 0 && activeStep < stepCount - 1;\n\n const setActiveStep = useCallback(\n (next: number | ((prev: number) => number)) => {\n const resolved =\n typeof next === \"function\"\n ? (next as (prev: number) => number)(activeStep)\n : next;\n setStoredStep(clampDynamicStepperIndex(resolved, stepCount));\n },\n [activeStep, setStoredStep, stepCount],\n );\n\n const goPrevious = useCallback(() => {\n if (!canGoPrevious) {\n return;\n }\n const nextStep = clampDynamicStepperIndex(activeStep - 1, stepCount);\n setStoredStep(nextStep);\n onPrevious?.(nextStep);\n }, [\n activeStep,\n canGoPrevious,\n onPrevious,\n setStoredStep,\n stepCount,\n ]);\n\n const goNext = useCallback(() => {\n if (!canGoNext) {\n return;\n }\n const nextStep = clampDynamicStepperIndex(activeStep + 1, stepCount);\n setStoredStep(nextStep);\n onNext?.(nextStep);\n }, [activeStep, canGoNext, onNext, setStoredStep, stepCount]);\n\n return {\n activeStep,\n setActiveStep,\n goPrevious,\n goNext,\n canGoPrevious,\n canGoNext,\n stepCount,\n };\n}\n"]}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-N6B35KWW.mjs.map
3
+ //# sourceMappingURL=chunk-N6B35KWW.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-N6B35KWW.mjs"}
@@ -25,5 +25,5 @@ function useControllableState({
25
25
  }
26
26
 
27
27
  export { useControllableState };
28
- //# sourceMappingURL=chunk-73VCO5TE.mjs.map
29
- //# sourceMappingURL=chunk-73VCO5TE.mjs.map
28
+ //# sourceMappingURL=chunk-NWOE2TZN.mjs.map
29
+ //# sourceMappingURL=chunk-NWOE2TZN.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks/useControllableState/useControllableState.ts"],"names":[],"mappings":";;;AAwBO,SAAS,oBAAA,CAAwB;AAAA,EACtC,KAAA,EAAO,SAAA;AAAA,EACP,YAAA;AAAA,EACA;AACF,CAAA,EAA6E;AAC3E,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,YAAY,CAAA;AAC7D,EAAA,MAAM,eAAe,SAAA,KAAc,MAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,eAAe,SAAA,GAAY,YAAA;AACzC,EAAA,MAAM,WAAA,GAAc,OAAO,QAAQ,CAAA;AACnC,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAEtB,EAAA,MAAM,QAAA,GAAW,WAAA;AAAA,IACf,CAAC,IAAA,KAA+B;AAC9B,MAAA,MAAM,WACJ,OAAO,IAAA,KAAS,UAAA,GAAc,IAAA,CAAwB,KAAK,CAAA,GAAI,IAAA;AACjE,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,eAAA,CAAgB,QAAQ,CAAA;AAAA,MAC1B;AACA,MAAA,WAAA,CAAY,UAAU,QAAQ,CAAA;AAAA,IAChC,CAAA;AAAA,IACA,CAAC,cAAc,KAAK;AAAA,GACtB;AAEA,EAAA,OAAO,CAAC,OAAO,QAAQ,CAAA;AACzB","file":"chunk-73VCO5TE.mjs","sourcesContent":["\"use client\";\n\nimport { useCallback, useRef, useState } from \"react\";\n\nexport type UseControllableStateParams<T> = {\n /** When defined, the hook is controlled and this value is returned as state. */\n value?: T;\n /** Initial / fallback value when uncontrolled (`value` is `undefined`). */\n defaultValue: T;\n /** Notified on every `setValue` with the resolved next value (controlled and uncontrolled). */\n onChange?: (next: T) => void;\n};\n\n/**\n * Implements the React “controlled vs uncontrolled” pattern as a single state tuple.\n *\n * - If `value` is `undefined`, internal state mirrors `defaultValue` and updates on `setValue`.\n * - If `value` is defined, returned state follows `value`; `setValue` still calls `onChange` so the parent can update.\n * - `setValue` accepts either the next value or an updater `(prev) => next` (updater uses the current `value` in controlled mode).\n *\n * @typeParam T - State value type.\n * @param params - `value`, `defaultValue`, and optional `onChange`.\n * @returns `[value, setValue]` compatible with `useState`-style usage.\n */\nexport function useControllableState<T>({\n value: valueProp,\n defaultValue,\n onChange,\n}: UseControllableStateParams<T>): [T, (next: T | ((prev: T) => T)) => void] {\n const [uncontrolled, setUncontrolled] = useState(defaultValue);\n const isControlled = valueProp !== undefined;\n const value = isControlled ? valueProp : uncontrolled;\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const setValue = useCallback(\n (next: T | ((prev: T) => T)) => {\n const resolved =\n typeof next === \"function\" ? (next as (prev: T) => T)(value) : next;\n if (!isControlled) {\n setUncontrolled(resolved);\n }\n onChangeRef.current?.(resolved);\n },\n [isControlled, value],\n );\n\n return [value, setValue];\n}\n"]}
1
+ {"version":3,"sources":["../src/hooks/useControllableState/useControllableState.ts"],"names":[],"mappings":";;;AAwBO,SAAS,oBAAA,CAAwB;AAAA,EACtC,KAAA,EAAO,SAAA;AAAA,EACP,YAAA;AAAA,EACA;AACF,CAAA,EAA6E;AAC3E,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,YAAY,CAAA;AAC7D,EAAA,MAAM,eAAe,SAAA,KAAc,MAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,eAAe,SAAA,GAAY,YAAA;AACzC,EAAA,MAAM,WAAA,GAAc,OAAO,QAAQ,CAAA;AACnC,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAEtB,EAAA,MAAM,QAAA,GAAW,WAAA;AAAA,IACf,CAAC,IAAA,KAA+B;AAC9B,MAAA,MAAM,WACJ,OAAO,IAAA,KAAS,UAAA,GAAc,IAAA,CAAwB,KAAK,CAAA,GAAI,IAAA;AACjE,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,eAAA,CAAgB,QAAQ,CAAA;AAAA,MAC1B;AACA,MAAA,WAAA,CAAY,UAAU,QAAQ,CAAA;AAAA,IAChC,CAAA;AAAA,IACA,CAAC,cAAc,KAAK;AAAA,GACtB;AAEA,EAAA,OAAO,CAAC,OAAO,QAAQ,CAAA;AACzB","file":"chunk-NWOE2TZN.mjs","sourcesContent":["\"use client\";\n\nimport { useCallback, useRef, useState } from \"react\";\n\nexport type UseControllableStateParams<T> = {\n /** When defined, the hook is controlled and this value is returned as state. */\n value?: T;\n /** Initial / fallback value when uncontrolled (`value` is `undefined`). */\n defaultValue: T;\n /** Notified on every `setValue` with the resolved next value (controlled and uncontrolled). */\n onChange?: (next: T) => void;\n};\n\n/**\n * Implements the React “controlled vs uncontrolled” pattern as a single state tuple.\n *\n * - If `value` is `undefined`, internal state mirrors `defaultValue` and updates on `setValue`.\n * - If `value` is defined, returned state follows `value`; `setValue` still calls `onChange` so the parent can update.\n * - `setValue` accepts either the next value or an updater `(prev) => next` (updater uses the current `value` in controlled mode).\n *\n * @typeParam T - State value type.\n * @param params - `value`, `defaultValue`, and optional `onChange`.\n * @returns `[value, setValue]` compatible with `useState`-style usage.\n */\nexport function useControllableState<T>({\n value: valueProp,\n defaultValue,\n onChange,\n}: UseControllableStateParams<T>): [T, (next: T | ((prev: T) => T)) => void] {\n const [uncontrolled, setUncontrolled] = useState(defaultValue);\n const isControlled = valueProp !== undefined;\n const value = isControlled ? valueProp : uncontrolled;\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const setValue = useCallback(\n (next: T | ((prev: T) => T)) => {\n const resolved =\n typeof next === \"function\" ? (next as (prev: T) => T)(value) : next;\n if (!isControlled) {\n setUncontrolled(resolved);\n }\n onChangeRef.current?.(resolved);\n },\n [isControlled, value],\n );\n\n return [value, setValue];\n}\n"]}
@@ -0,0 +1,4 @@
1
+ 'use strict';
2
+
3
+ //# sourceMappingURL=chunk-RGOMHX4G.js.map
4
+ //# sourceMappingURL=chunk-RGOMHX4G.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-RGOMHX4G.js"}
@@ -1,13 +1,14 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunk2VQJ6OIL_js = require('../chunk-2VQJ6OIL.js');
4
+ require('../chunk-RGOMHX4G.js');
5
+ var chunkHPN7H5ZM_js = require('../chunk-HPN7H5ZM.js');
5
6
 
6
7
 
7
8
 
8
9
  Object.defineProperty(exports, "useControllableState", {
9
10
  enumerable: true,
10
- get: function () { return chunk2VQJ6OIL_js.useControllableState; }
11
+ get: function () { return chunkHPN7H5ZM_js.useControllableState; }
11
12
  });
12
13
  //# sourceMappingURL=useControllableState.js.map
13
14
  //# sourceMappingURL=useControllableState.js.map
@@ -1,4 +1,5 @@
1
1
  "use client";
2
- export { useControllableState } from '../chunk-73VCO5TE.mjs';
2
+ import '../chunk-N6B35KWW.mjs';
3
+ export { useControllableState } from '../chunk-NWOE2TZN.mjs';
3
4
  //# sourceMappingURL=useControllableState.mjs.map
4
5
  //# sourceMappingURL=useControllableState.mjs.map
@@ -1,7 +1,8 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunk2VQJ6OIL_js = require('../chunk-2VQJ6OIL.js');
4
+ require('../chunk-RGOMHX4G.js');
5
+ var chunkHPN7H5ZM_js = require('../chunk-HPN7H5ZM.js');
5
6
  var react = require('react');
6
7
 
7
8
  function useDisclosure({
@@ -9,7 +10,7 @@ function useDisclosure({
9
10
  defaultOpen = false,
10
11
  onOpenChange
11
12
  } = {}) {
12
- const [isOpen, setOpenState] = chunk2VQJ6OIL_js.useControllableState({
13
+ const [isOpen, setOpenState] = chunkHPN7H5ZM_js.useControllableState({
13
14
  value: openProp,
14
15
  defaultValue: defaultOpen,
15
16
  onChange: onOpenChange
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/useDisclosure/useDisclosure.ts"],"names":["useControllableState","useCallback","open"],"mappings":";;;;;AA8BO,SAAS,aAAA,CAAc;AAAA,EAC5B,IAAA,EAAM,QAAA;AAAA,EACN,WAAA,GAAc,KAAA;AAAA,EACd;AACF,CAAA,GAAyB,EAAC,EAAwB;AAChD,EAAA,MAAM,CAAC,MAAA,EAAQ,YAAY,CAAA,GAAIA,qCAAA,CAAqB;AAAA,IAClD,KAAA,EAAO,QAAA;AAAA,IACP,YAAA,EAAc,WAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,OAAA,GAAUC,iBAAA;AAAA,IACd,CAACC,KAAAA,KAAkB;AACjB,MAAA,YAAA,CAAaA,KAAI,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,IAAA,GAAOD,kBAAY,MAAM;AAC7B,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,KAAA,GAAQA,kBAAY,MAAM;AAC9B,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,MAAA,GAASA,kBAAY,MAAM;AAC/B,IAAA,YAAA,CAAa,CAAC,MAAM,CAAA;AAAA,EACtB,CAAA,EAAG,CAAC,MAAA,EAAQ,YAAY,CAAC,CAAA;AAEzB,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,QAAQ,OAAA,EAAQ;AAChD","file":"useDisclosure.js","sourcesContent":["\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { useControllableState } from \"../useControllableState\";\n\nexport type UseDisclosureParams = {\n /** Controlled open flag; omit for uncontrolled usage with `defaultOpen`. */\n open?: boolean;\n /** Initial open state when uncontrolled. */\n defaultOpen?: boolean;\n /** Fired whenever open state changes from user-driven `setOpen` / `open` / `close` / `toggle`. */\n onOpenChange?: (open: boolean) => void;\n};\n\nexport type UseDisclosureResult = {\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n setOpen: (open: boolean) => void;\n};\n\n/**\n * Boolean open/close state for overlays (dialogs, menus, collapsible regions) with optional control from the parent.\n * Built on {@link useControllableState}; semantics match common headless UI libraries.\n *\n * @param params - Optional `open`, `defaultOpen`, and `onOpenChange`.\n * @returns Helpers `open`, `close`, `toggle`, `setOpen`, and the current `isOpen` flag.\n */\nexport function useDisclosure({\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n}: UseDisclosureParams = {}): UseDisclosureResult {\n const [isOpen, setOpenState] = useControllableState({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n\n const setOpen = useCallback(\n (open: boolean) => {\n setOpenState(open);\n },\n [setOpenState],\n );\n\n const open = useCallback(() => {\n setOpenState(true);\n }, [setOpenState]);\n\n const close = useCallback(() => {\n setOpenState(false);\n }, [setOpenState]);\n\n const toggle = useCallback(() => {\n setOpenState(!isOpen);\n }, [isOpen, setOpenState]);\n\n return { isOpen, open, close, toggle, setOpen };\n}\n"]}
1
+ {"version":3,"sources":["../../src/hooks/useDisclosure/useDisclosure.ts"],"names":["useControllableState","useCallback","open"],"mappings":";;;;;;AA8BO,SAAS,aAAA,CAAc;AAAA,EAC5B,IAAA,EAAM,QAAA;AAAA,EACN,WAAA,GAAc,KAAA;AAAA,EACd;AACF,CAAA,GAAyB,EAAC,EAAwB;AAChD,EAAA,MAAM,CAAC,MAAA,EAAQ,YAAY,CAAA,GAAIA,qCAAA,CAAqB;AAAA,IAClD,KAAA,EAAO,QAAA;AAAA,IACP,YAAA,EAAc,WAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,OAAA,GAAUC,iBAAA;AAAA,IACd,CAACC,KAAAA,KAAkB;AACjB,MAAA,YAAA,CAAaA,KAAI,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,IAAA,GAAOD,kBAAY,MAAM;AAC7B,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,KAAA,GAAQA,kBAAY,MAAM;AAC9B,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,MAAA,GAASA,kBAAY,MAAM;AAC/B,IAAA,YAAA,CAAa,CAAC,MAAM,CAAA;AAAA,EACtB,CAAA,EAAG,CAAC,MAAA,EAAQ,YAAY,CAAC,CAAA;AAEzB,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,QAAQ,OAAA,EAAQ;AAChD","file":"useDisclosure.js","sourcesContent":["\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { useControllableState } from \"../useControllableState\";\n\nexport type UseDisclosureParams = {\n /** Controlled open flag; omit for uncontrolled usage with `defaultOpen`. */\n open?: boolean;\n /** Initial open state when uncontrolled. */\n defaultOpen?: boolean;\n /** Fired whenever open state changes from user-driven `setOpen` / `open` / `close` / `toggle`. */\n onOpenChange?: (open: boolean) => void;\n};\n\nexport type UseDisclosureResult = {\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n setOpen: (open: boolean) => void;\n};\n\n/**\n * Boolean open/close state for overlays (dialogs, menus, collapsible regions) with optional control from the parent.\n * Built on {@link useControllableState}; semantics match common headless UI libraries.\n *\n * @param params - Optional `open`, `defaultOpen`, and `onOpenChange`.\n * @returns Helpers `open`, `close`, `toggle`, `setOpen`, and the current `isOpen` flag.\n */\nexport function useDisclosure({\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n}: UseDisclosureParams = {}): UseDisclosureResult {\n const [isOpen, setOpenState] = useControllableState({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n\n const setOpen = useCallback(\n (open: boolean) => {\n setOpenState(open);\n },\n [setOpenState],\n );\n\n const open = useCallback(() => {\n setOpenState(true);\n }, [setOpenState]);\n\n const close = useCallback(() => {\n setOpenState(false);\n }, [setOpenState]);\n\n const toggle = useCallback(() => {\n setOpenState(!isOpen);\n }, [isOpen, setOpenState]);\n\n return { isOpen, open, close, toggle, setOpen };\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  "use client";
2
- import { useControllableState } from '../chunk-73VCO5TE.mjs';
2
+ import '../chunk-N6B35KWW.mjs';
3
+ import { useControllableState } from '../chunk-NWOE2TZN.mjs';
3
4
  import { useCallback } from 'react';
4
5
 
5
6
  function useDisclosure({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/useDisclosure/useDisclosure.ts"],"names":["open"],"mappings":";;;AA8BO,SAAS,aAAA,CAAc;AAAA,EAC5B,IAAA,EAAM,QAAA;AAAA,EACN,WAAA,GAAc,KAAA;AAAA,EACd;AACF,CAAA,GAAyB,EAAC,EAAwB;AAChD,EAAA,MAAM,CAAC,MAAA,EAAQ,YAAY,CAAA,GAAI,oBAAA,CAAqB;AAAA,IAClD,KAAA,EAAO,QAAA;AAAA,IACP,YAAA,EAAc,WAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,OAAA,GAAU,WAAA;AAAA,IACd,CAACA,KAAAA,KAAkB;AACjB,MAAA,YAAA,CAAaA,KAAI,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,IAAA,GAAO,YAAY,MAAM;AAC7B,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,MAAA,GAAS,YAAY,MAAM;AAC/B,IAAA,YAAA,CAAa,CAAC,MAAM,CAAA;AAAA,EACtB,CAAA,EAAG,CAAC,MAAA,EAAQ,YAAY,CAAC,CAAA;AAEzB,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,QAAQ,OAAA,EAAQ;AAChD","file":"useDisclosure.mjs","sourcesContent":["\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { useControllableState } from \"../useControllableState\";\n\nexport type UseDisclosureParams = {\n /** Controlled open flag; omit for uncontrolled usage with `defaultOpen`. */\n open?: boolean;\n /** Initial open state when uncontrolled. */\n defaultOpen?: boolean;\n /** Fired whenever open state changes from user-driven `setOpen` / `open` / `close` / `toggle`. */\n onOpenChange?: (open: boolean) => void;\n};\n\nexport type UseDisclosureResult = {\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n setOpen: (open: boolean) => void;\n};\n\n/**\n * Boolean open/close state for overlays (dialogs, menus, collapsible regions) with optional control from the parent.\n * Built on {@link useControllableState}; semantics match common headless UI libraries.\n *\n * @param params - Optional `open`, `defaultOpen`, and `onOpenChange`.\n * @returns Helpers `open`, `close`, `toggle`, `setOpen`, and the current `isOpen` flag.\n */\nexport function useDisclosure({\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n}: UseDisclosureParams = {}): UseDisclosureResult {\n const [isOpen, setOpenState] = useControllableState({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n\n const setOpen = useCallback(\n (open: boolean) => {\n setOpenState(open);\n },\n [setOpenState],\n );\n\n const open = useCallback(() => {\n setOpenState(true);\n }, [setOpenState]);\n\n const close = useCallback(() => {\n setOpenState(false);\n }, [setOpenState]);\n\n const toggle = useCallback(() => {\n setOpenState(!isOpen);\n }, [isOpen, setOpenState]);\n\n return { isOpen, open, close, toggle, setOpen };\n}\n"]}
1
+ {"version":3,"sources":["../../src/hooks/useDisclosure/useDisclosure.ts"],"names":["open"],"mappings":";;;;AA8BO,SAAS,aAAA,CAAc;AAAA,EAC5B,IAAA,EAAM,QAAA;AAAA,EACN,WAAA,GAAc,KAAA;AAAA,EACd;AACF,CAAA,GAAyB,EAAC,EAAwB;AAChD,EAAA,MAAM,CAAC,MAAA,EAAQ,YAAY,CAAA,GAAI,oBAAA,CAAqB;AAAA,IAClD,KAAA,EAAO,QAAA;AAAA,IACP,YAAA,EAAc,WAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,OAAA,GAAU,WAAA;AAAA,IACd,CAACA,KAAAA,KAAkB;AACjB,MAAA,YAAA,CAAaA,KAAI,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,IAAA,GAAO,YAAY,MAAM;AAC7B,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,MAAA,GAAS,YAAY,MAAM;AAC/B,IAAA,YAAA,CAAa,CAAC,MAAM,CAAA;AAAA,EACtB,CAAA,EAAG,CAAC,MAAA,EAAQ,YAAY,CAAC,CAAA;AAEzB,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,QAAQ,OAAA,EAAQ;AAChD","file":"useDisclosure.mjs","sourcesContent":["\"use client\";\n\nimport { useCallback } from \"react\";\n\nimport { useControllableState } from \"../useControllableState\";\n\nexport type UseDisclosureParams = {\n /** Controlled open flag; omit for uncontrolled usage with `defaultOpen`. */\n open?: boolean;\n /** Initial open state when uncontrolled. */\n defaultOpen?: boolean;\n /** Fired whenever open state changes from user-driven `setOpen` / `open` / `close` / `toggle`. */\n onOpenChange?: (open: boolean) => void;\n};\n\nexport type UseDisclosureResult = {\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n setOpen: (open: boolean) => void;\n};\n\n/**\n * Boolean open/close state for overlays (dialogs, menus, collapsible regions) with optional control from the parent.\n * Built on {@link useControllableState}; semantics match common headless UI libraries.\n *\n * @param params - Optional `open`, `defaultOpen`, and `onOpenChange`.\n * @returns Helpers `open`, `close`, `toggle`, `setOpen`, and the current `isOpen` flag.\n */\nexport function useDisclosure({\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n}: UseDisclosureParams = {}): UseDisclosureResult {\n const [isOpen, setOpenState] = useControllableState({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n\n const setOpen = useCallback(\n (open: boolean) => {\n setOpenState(open);\n },\n [setOpenState],\n );\n\n const open = useCallback(() => {\n setOpenState(true);\n }, [setOpenState]);\n\n const close = useCallback(() => {\n setOpenState(false);\n }, [setOpenState]);\n\n const toggle = useCallback(() => {\n setOpenState(!isOpen);\n }, [isOpen, setOpenState]);\n\n return { isOpen, open, close, toggle, setOpen };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export { useDynamicStepper, } from "./useDynamicStepper";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/useDynamicStepper/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,GAClB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { UseDynamicStepperParams, UseDynamicStepperResult } from "../../ui/dynamic-stepper/types";
2
+ /**
3
+ * Headless multi-step index with prev/next navigation.
4
+ *
5
+ * @param params.stepCount - Number of steps (0-based count semantics via indices).
6
+ * @returns Active step, setter, navigation helpers, and boundary flags.
7
+ */
8
+ export declare function useDynamicStepper({ stepCount, activeStep: activeStepProp, defaultActiveStep, onActiveStepChange, onPrevious, onNext, }: UseDynamicStepperParams): UseDynamicStepperResult;
9
+ //# sourceMappingURL=useDynamicStepper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDynamicStepper.d.ts","sourceRoot":"","sources":["../../../src/hooks/useDynamicStepper/useDynamicStepper.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,gCAAgC,CAAC;AASxC;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,SAAS,EACT,UAAU,EAAE,cAAc,EAC1B,iBAAqB,EACrB,kBAAkB,EAClB,UAAU,EACV,MAAM,GACP,EAAE,uBAAuB,GAAG,uBAAuB,CA2DnD"}
@@ -0,0 +1,14 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunkMEJMX4QI_js = require('../chunk-MEJMX4QI.js');
5
+ require('../chunk-HPN7H5ZM.js');
6
+
7
+
8
+
9
+ Object.defineProperty(exports, "useDynamicStepper", {
10
+ enumerable: true,
11
+ get: function () { return chunkMEJMX4QI_js.useDynamicStepper; }
12
+ });
13
+ //# sourceMappingURL=useDynamicStepper.js.map
14
+ //# sourceMappingURL=useDynamicStepper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"useDynamicStepper.js"}
@@ -0,0 +1,5 @@
1
+ "use client";
2
+ export { useDynamicStepper } from '../chunk-JJDANNNL.mjs';
3
+ import '../chunk-NWOE2TZN.mjs';
4
+ //# sourceMappingURL=useDynamicStepper.mjs.map
5
+ //# sourceMappingURL=useDynamicStepper.mjs.map