@seedgrid/fe-components 2026.3.19 → 2026.3.26

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 (172) hide show
  1. package/dist/buttons/SgFloatActionButton.d.ts.map +1 -1
  2. package/dist/buttons/SgFloatActionButton.js +5 -26
  3. package/dist/buttons/SgSplitButton.d.ts.map +1 -1
  4. package/dist/buttons/SgSplitButton.js +3 -1
  5. package/dist/buttons/fab-helpers.d.ts +6 -0
  6. package/dist/buttons/fab-helpers.d.ts.map +1 -0
  7. package/dist/buttons/fab-helpers.js +29 -0
  8. package/dist/commons/SgAvatar.d.ts.map +1 -1
  9. package/dist/commons/SgAvatar.js +6 -3
  10. package/dist/commons/SgBadge.d.ts.map +1 -1
  11. package/dist/commons/SgBadge.js +5 -2
  12. package/dist/commons/SgToast.d.ts.map +1 -1
  13. package/dist/commons/SgToast.js +3 -1
  14. package/dist/commons/SgToaster.d.ts.map +1 -1
  15. package/dist/commons/SgToaster.js +3 -1
  16. package/dist/environment/SgEnvironmentProvider.d.ts.map +1 -1
  17. package/dist/environment/SgEnvironmentProvider.js +10 -15
  18. package/dist/environment/persistent-state.d.ts +22 -0
  19. package/dist/environment/persistent-state.d.ts.map +1 -0
  20. package/dist/environment/persistent-state.js +33 -0
  21. package/dist/gadgets/calendar/SgCalendar.d.ts.map +1 -1
  22. package/dist/gadgets/calendar/SgCalendar.js +5 -23
  23. package/dist/gadgets/clock/SgClock.d.ts.map +1 -1
  24. package/dist/gadgets/clock/SgClock.js +12 -10
  25. package/dist/gadgets/clock/themes/SgClockThemePicker.d.ts +2 -1
  26. package/dist/gadgets/clock/themes/SgClockThemePicker.d.ts.map +1 -1
  27. package/dist/gadgets/clock/themes/SgClockThemePicker.js +23 -28
  28. package/dist/gadgets/clock/themes/search.d.ts +9 -0
  29. package/dist/gadgets/clock/themes/search.d.ts.map +1 -0
  30. package/dist/gadgets/clock/themes/search.js +15 -0
  31. package/dist/gadgets/gauge/SgLinearGauge.d.ts.map +1 -1
  32. package/dist/gadgets/gauge/SgLinearGauge.js +39 -28
  33. package/dist/gadgets/gauge/SgRadialGauge.d.ts.map +1 -1
  34. package/dist/gadgets/gauge/SgRadialGauge.js +44 -37
  35. package/dist/gadgets/gauge/math.d.ts +90 -0
  36. package/dist/gadgets/gauge/math.d.ts.map +1 -0
  37. package/dist/gadgets/gauge/math.js +81 -0
  38. package/dist/gadgets/qr-code/SgQRCode.d.ts.map +1 -1
  39. package/dist/gadgets/qr-code/SgQRCode.js +3 -1
  40. package/dist/i18n/en-US.d.ts.map +1 -1
  41. package/dist/i18n/en-US.js +97 -1
  42. package/dist/i18n/es.d.ts.map +1 -1
  43. package/dist/i18n/es.js +153 -57
  44. package/dist/i18n/fr.d.ts +3 -0
  45. package/dist/i18n/fr.d.ts.map +1 -0
  46. package/dist/i18n/fr.js +206 -0
  47. package/dist/i18n/index.d.ts +5 -1
  48. package/dist/i18n/index.d.ts.map +1 -1
  49. package/dist/i18n/index.js +50 -14
  50. package/dist/i18n/pt-BR.d.ts.map +1 -1
  51. package/dist/i18n/pt-BR.js +97 -1
  52. package/dist/i18n/pt-PT.d.ts.map +1 -1
  53. package/dist/i18n/pt-PT.js +97 -1
  54. package/dist/index.d.ts +12 -2
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +10 -2
  57. package/dist/inputs/SgAutocomplete.d.ts +1 -1
  58. package/dist/inputs/SgAutocomplete.d.ts.map +1 -1
  59. package/dist/inputs/SgAutocomplete.js +7 -4
  60. package/dist/inputs/SgCheckboxGroup.d.ts +2 -6
  61. package/dist/inputs/SgCheckboxGroup.d.ts.map +1 -1
  62. package/dist/inputs/SgCheckboxGroup.js +6 -6
  63. package/dist/inputs/SgCombobox.d.ts.map +1 -1
  64. package/dist/inputs/SgCombobox.js +11 -2
  65. package/dist/inputs/SgInputBirthDate.d.ts.map +1 -1
  66. package/dist/inputs/SgInputBirthDate.js +6 -1
  67. package/dist/inputs/SgInputCNPJ.d.ts +3 -1
  68. package/dist/inputs/SgInputCNPJ.d.ts.map +1 -1
  69. package/dist/inputs/SgInputCNPJ.js +4 -3
  70. package/dist/inputs/SgInputCPF.d.ts +3 -1
  71. package/dist/inputs/SgInputCPF.d.ts.map +1 -1
  72. package/dist/inputs/SgInputCPF.js +8 -3
  73. package/dist/inputs/SgInputCPFCNPJ.d.ts +3 -1
  74. package/dist/inputs/SgInputCPFCNPJ.d.ts.map +1 -1
  75. package/dist/inputs/SgInputCPFCNPJ.js +8 -3
  76. package/dist/inputs/SgInputCurrency.d.ts +3 -7
  77. package/dist/inputs/SgInputCurrency.d.ts.map +1 -1
  78. package/dist/inputs/SgInputCurrency.js +5 -2
  79. package/dist/inputs/SgInputDate.d.ts.map +1 -1
  80. package/dist/inputs/SgInputDate.js +6 -1
  81. package/dist/inputs/SgInputEmail.d.ts.map +1 -1
  82. package/dist/inputs/SgInputEmail.js +1 -1
  83. package/dist/inputs/SgInputNumber.d.ts +3 -7
  84. package/dist/inputs/SgInputNumber.d.ts.map +1 -1
  85. package/dist/inputs/SgInputNumber.js +5 -2
  86. package/dist/inputs/SgInputOTP.d.ts +5 -12
  87. package/dist/inputs/SgInputOTP.d.ts.map +1 -1
  88. package/dist/inputs/SgInputOTP.js +7 -4
  89. package/dist/inputs/SgInputPassword.d.ts.map +1 -1
  90. package/dist/inputs/SgInputPassword.js +1 -1
  91. package/dist/inputs/SgInputPhone.d.ts +3 -1
  92. package/dist/inputs/SgInputPhone.d.ts.map +1 -1
  93. package/dist/inputs/SgInputPhone.js +2 -1
  94. package/dist/inputs/SgInputPostalCode.d.ts.map +1 -1
  95. package/dist/inputs/SgInputPostalCode.js +2 -1
  96. package/dist/inputs/SgInputSelect.d.ts +4 -2
  97. package/dist/inputs/SgInputSelect.d.ts.map +1 -1
  98. package/dist/inputs/SgInputSelect.js +38 -3
  99. package/dist/inputs/SgInputText.d.ts +3 -7
  100. package/dist/inputs/SgInputText.d.ts.map +1 -1
  101. package/dist/inputs/SgInputText.js +5 -2
  102. package/dist/inputs/SgInputTextArea.d.ts +4 -2
  103. package/dist/inputs/SgInputTextArea.d.ts.map +1 -1
  104. package/dist/inputs/SgInputTextArea.js +37 -2
  105. package/dist/inputs/SgOrderList.d.ts +3 -1
  106. package/dist/inputs/SgOrderList.d.ts.map +1 -1
  107. package/dist/inputs/SgOrderList.js +19 -3
  108. package/dist/inputs/SgPickList.d.ts +3 -1
  109. package/dist/inputs/SgPickList.d.ts.map +1 -1
  110. package/dist/inputs/SgPickList.js +20 -4
  111. package/dist/inputs/SgRadioGroup.d.ts +2 -6
  112. package/dist/inputs/SgRadioGroup.d.ts.map +1 -1
  113. package/dist/inputs/SgRadioGroup.js +6 -6
  114. package/dist/inputs/SgRating.d.ts +2 -10
  115. package/dist/inputs/SgRating.d.ts.map +1 -1
  116. package/dist/inputs/SgRating.js +6 -3
  117. package/dist/inputs/SgSlider.d.ts +8 -2
  118. package/dist/inputs/SgSlider.d.ts.map +1 -1
  119. package/dist/inputs/SgSlider.js +62 -10
  120. package/dist/inputs/SgStepperInput.d.ts +8 -2
  121. package/dist/inputs/SgStepperInput.d.ts.map +1 -1
  122. package/dist/inputs/SgStepperInput.js +62 -8
  123. package/dist/inputs/SgTextEditor.d.ts +3 -1
  124. package/dist/inputs/SgTextEditor.d.ts.map +1 -1
  125. package/dist/inputs/SgTextEditor.js +24 -11
  126. package/dist/inputs/SgToggleSwitch.d.ts +3 -7
  127. package/dist/inputs/SgToggleSwitch.d.ts.map +1 -1
  128. package/dist/inputs/SgToggleSwitch.js +6 -3
  129. package/dist/layout/SgBreadcrumb.d.ts.map +1 -1
  130. package/dist/layout/SgBreadcrumb.js +7 -3
  131. package/dist/layout/SgCard.d.ts.map +1 -1
  132. package/dist/layout/SgCard.js +3 -1
  133. package/dist/layout/SgCarousel.d.ts.map +1 -1
  134. package/dist/layout/SgCarousel.js +3 -1
  135. package/dist/layout/SgExpandablePanel.d.ts.map +1 -1
  136. package/dist/layout/SgExpandablePanel.js +3 -1
  137. package/dist/layout/SgMenu.d.ts.map +1 -1
  138. package/dist/layout/SgMenu.js +173 -297
  139. package/dist/layout/SgPageControl.d.ts.map +1 -1
  140. package/dist/layout/SgPageControl.js +7 -3
  141. package/dist/layout/SgToolBar.d.ts.map +1 -1
  142. package/dist/layout/SgToolBar.js +19 -55
  143. package/dist/layout/SgTreeView.d.ts.map +1 -1
  144. package/dist/layout/SgTreeView.js +7 -3
  145. package/dist/layout/drag-position.d.ts +7 -0
  146. package/dist/layout/drag-position.d.ts.map +1 -0
  147. package/dist/layout/drag-position.js +30 -0
  148. package/dist/layout/menu-logic.d.ts +187 -0
  149. package/dist/layout/menu-logic.d.ts.map +1 -0
  150. package/dist/layout/menu-logic.js +349 -0
  151. package/dist/layout/toolbar-logic.d.ts +26 -0
  152. package/dist/layout/toolbar-logic.d.ts.map +1 -0
  153. package/dist/layout/toolbar-logic.js +38 -0
  154. package/dist/menus/SgDockMenu.d.ts.map +1 -1
  155. package/dist/menus/SgDockMenu.js +44 -120
  156. package/dist/menus/dock-menu-logic.d.ts +50 -0
  157. package/dist/menus/dock-menu-logic.d.ts.map +1 -0
  158. package/dist/menus/dock-menu-logic.js +113 -0
  159. package/dist/overlay/SgDialog.d.ts.map +1 -1
  160. package/dist/overlay/SgDialog.js +4 -2
  161. package/dist/overlay/SgPopup.d.ts.map +1 -1
  162. package/dist/overlay/SgPopup.js +4 -1
  163. package/dist/rhf.d.ts +8 -3
  164. package/dist/rhf.d.ts.map +1 -1
  165. package/dist/rhf.js +18 -1
  166. package/dist/sandbox.cjs +60 -60
  167. package/dist/wizard/SgWizard.d.ts.map +1 -1
  168. package/dist/wizard/SgWizard.js +20 -32
  169. package/dist/wizard/logic.d.ts +9 -0
  170. package/dist/wizard/logic.d.ts.map +1 -0
  171. package/dist/wizard/logic.js +20 -0
  172. package/package.json +78 -76
@@ -1 +1 @@
1
- {"version":3,"file":"SgWizard.d.ts","sourceRoot":"","sources":["../../src/wizard/SgWizard.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B,CAAC;AAEF,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,2CAEpD;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;AAE5D,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7D,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/D,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B,CAAC;AA+EF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,2CAwI5C"}
1
+ {"version":3,"file":"SgWizard.d.ts","sourceRoot":"","sources":["../../src/wizard/SgWizard.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B,CAAC;AAEF,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,2CAEpD;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;AAE5D,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7D,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/D,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B,CAAC;AAiFF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,2CA+H5C"}
@@ -2,17 +2,18 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import React from "react";
4
4
  import { t, useComponentsI18n } from "../i18n";
5
+ import { canProceedWizardAction, clampWizardStep } from "./logic";
5
6
  export function SgWizardPage(props) {
6
7
  return _jsx("div", { className: props.className, style: props.style, children: props.children });
7
8
  }
8
9
  function CheckIcon({ className }) {
9
10
  return (_jsx("svg", { className: className, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: "M20 6 9 17l-5-5" }) }));
10
11
  }
11
- function StepperBar({ pages, currentStep, mode }) {
12
- return (_jsx("nav", { "aria-label": "Progress", className: "mb-8", children: _jsx("ol", { className: "flex items-center", children: pages.map((page, i) => {
12
+ function StepperBar({ i18n, pages, currentStep, mode }) {
13
+ return (_jsx("nav", { "aria-label": t(i18n, "components.wizard.progress"), className: "mb-8", children: _jsx("ol", { className: "flex items-center", children: pages.map((page, i) => {
13
14
  const isCompleted = i < currentStep;
14
15
  const isCurrent = i === currentStep;
15
- const title = page.props.title ?? `Step ${i + 1}`;
16
+ const title = page.props.title ?? t(i18n, "components.wizard.step", { step: i + 1 });
16
17
  const icon = page.props.icon;
17
18
  const isLast = i === pages.length - 1;
18
19
  return (_jsxs("li", { className: `flex items-center ${isLast ? "" : "flex-1"}`, children: [_jsxs("div", { className: "flex flex-col items-center", children: [_jsx("div", { className: `flex items-center justify-center rounded-full border-2 transition-colors duration-200 ${isCompleted
@@ -26,10 +27,7 @@ export function SgWizard(props) {
26
27
  const i18n = useComponentsI18n();
27
28
  const pages = React.Children.toArray(props.children).filter((child) => React.isValidElement(child) && child.type === SgWizardPage);
28
29
  const stepper = props.stepper ?? "none";
29
- const [step, setStep] = React.useState(() => {
30
- const idx = props.initialStep ?? 0;
31
- return Math.min(Math.max(idx, 0), Math.max(pages.length - 1, 0));
32
- });
30
+ const [step, setStep] = React.useState(() => clampWizardStep(props.initialStep, pages.length));
33
31
  const [isFinishing, setIsFinishing] = React.useState(false);
34
32
  const [isValidating, setIsValidating] = React.useState(false);
35
33
  const pageRef = React.useRef(null);
@@ -64,19 +62,14 @@ export function SgWizard(props) {
64
62
  return;
65
63
  setIsValidating(true);
66
64
  try {
67
- const pageValid = await validateCurrentPage();
68
- if (!pageValid)
65
+ const ok = await canProceedWizardAction({
66
+ validateCurrentPage,
67
+ validateStep: props.validateStep,
68
+ beforeAction: props.onBeforeNext,
69
+ step
70
+ });
71
+ if (!ok)
69
72
  return;
70
- if (props.validateStep) {
71
- const ok = await props.validateStep(step);
72
- if (!ok)
73
- return;
74
- }
75
- if (props.onBeforeNext) {
76
- const ok = await props.onBeforeNext(step);
77
- if (!ok)
78
- return;
79
- }
80
73
  setStep((prev) => Math.min(prev + 1, pages.length - 1));
81
74
  }
82
75
  finally {
@@ -95,19 +88,14 @@ export function SgWizard(props) {
95
88
  return;
96
89
  setIsValidating(true);
97
90
  try {
98
- const pageValid = await validateCurrentPage();
99
- if (!pageValid)
91
+ const ok = await canProceedWizardAction({
92
+ validateCurrentPage,
93
+ validateStep: props.validateStep,
94
+ beforeAction: props.onBeforeFinish,
95
+ step
96
+ });
97
+ if (!ok)
100
98
  return;
101
- if (props.validateStep) {
102
- const ok = await props.validateStep(step);
103
- if (!ok)
104
- return;
105
- }
106
- if (props.onBeforeFinish) {
107
- const ok = await props.onBeforeFinish(step);
108
- if (!ok)
109
- return;
110
- }
111
99
  }
112
100
  finally {
113
101
  setIsValidating(false);
@@ -120,5 +108,5 @@ export function SgWizard(props) {
120
108
  setIsFinishing(false);
121
109
  }
122
110
  };
123
- return (_jsxs("div", { className: props.className, style: props.style, children: [stepper !== "none" ? (_jsx(StepperBar, { pages: pages, currentStep: step, mode: stepper })) : null, _jsx("div", { ref: pageRef, children: pages[step] }), _jsxs("div", { className: "mt-6 flex flex-wrap items-center justify-between gap-3", children: [_jsx("div", { children: !isFirst ? (_jsx("button", { type: "button", onClick: goPrevious, className: "inline-flex h-10 items-center justify-center rounded-full border border-border px-5 text-sm font-semibold text-foreground/80 transition hover:bg-muted/60", children: labels.previous })) : null }), _jsx("div", { className: "flex items-center gap-3", children: !isLast ? (_jsx("button", { type: "button", onClick: goNext, disabled: isValidating, className: "inline-flex h-10 items-center justify-center rounded-full bg-[hsl(var(--primary))] px-5 text-sm font-semibold text-white shadow-lg shadow-[hsl(var(--primary)/0.35)] transition hover:brightness-95 disabled:cursor-not-allowed disabled:opacity-60", children: labels.next })) : (_jsx("button", { type: "button", onClick: handleFinish, disabled: isFinishing || isValidating, className: "inline-flex h-10 items-center justify-center rounded-full bg-[hsl(var(--primary))] px-5 text-sm font-semibold text-white shadow-lg shadow-[hsl(var(--primary)/0.35)] transition hover:brightness-95 disabled:cursor-not-allowed disabled:opacity-60", children: labels.finish })) })] })] }));
111
+ return (_jsxs("div", { className: props.className, style: props.style, children: [stepper !== "none" ? (_jsx(StepperBar, { pages: pages, currentStep: step, mode: stepper, i18n: i18n })) : null, _jsx("div", { ref: pageRef, children: pages[step] }), _jsxs("div", { className: "mt-6 flex flex-wrap items-center justify-between gap-3", children: [_jsx("div", { children: !isFirst ? (_jsx("button", { type: "button", onClick: goPrevious, className: "inline-flex h-10 items-center justify-center rounded-full border border-border px-5 text-sm font-semibold text-foreground/80 transition hover:bg-muted/60", children: labels.previous })) : null }), _jsx("div", { className: "flex items-center gap-3", children: !isLast ? (_jsx("button", { type: "button", onClick: goNext, disabled: isValidating, className: "inline-flex h-10 items-center justify-center rounded-full bg-[hsl(var(--primary))] px-5 text-sm font-semibold text-white shadow-lg shadow-[hsl(var(--primary)/0.35)] transition hover:brightness-95 disabled:cursor-not-allowed disabled:opacity-60", children: labels.next })) : (_jsx("button", { type: "button", onClick: handleFinish, disabled: isFinishing || isValidating, className: "inline-flex h-10 items-center justify-center rounded-full bg-[hsl(var(--primary))] px-5 text-sm font-semibold text-white shadow-lg shadow-[hsl(var(--primary)/0.35)] transition hover:brightness-95 disabled:cursor-not-allowed disabled:opacity-60", children: labels.finish })) })] })] }));
124
112
  }
@@ -0,0 +1,9 @@
1
+ export declare function clampWizardStep(initialStep: number | undefined, pageCount: number): number;
2
+ export type WizardGuardRunner = {
3
+ validateCurrentPage: () => boolean | Promise<boolean>;
4
+ validateStep?: (index: number) => boolean | Promise<boolean>;
5
+ beforeAction?: (index: number) => boolean | Promise<boolean>;
6
+ step: number;
7
+ };
8
+ export declare function canProceedWizardAction(runner: WizardGuardRunner): Promise<boolean>;
9
+ //# sourceMappingURL=logic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logic.d.ts","sourceRoot":"","sources":["../../src/wizard/logic.ts"],"names":[],"mappings":"AAAA,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAG1F;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,mBAAmB,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtD,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7D,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7D,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAexF"}
@@ -0,0 +1,20 @@
1
+ export function clampWizardStep(initialStep, pageCount) {
2
+ const step = initialStep ?? 0;
3
+ return Math.min(Math.max(step, 0), Math.max(pageCount - 1, 0));
4
+ }
5
+ export async function canProceedWizardAction(runner) {
6
+ const pageValid = await runner.validateCurrentPage();
7
+ if (!pageValid)
8
+ return false;
9
+ if (runner.validateStep) {
10
+ const stepValid = await runner.validateStep(runner.step);
11
+ if (!stepValid)
12
+ return false;
13
+ }
14
+ if (runner.beforeAction) {
15
+ const allowed = await runner.beforeAction(runner.step);
16
+ if (!allowed)
17
+ return false;
18
+ }
19
+ return true;
20
+ }
package/package.json CHANGED
@@ -1,78 +1,80 @@
1
1
  {
2
- "name": "@seedgrid/fe-components",
3
- "version": "2026.3.19",
4
- "license": "MIT",
5
- "type": "module",
6
- "repository": {
7
- "type": "git",
8
- "url": "git+https://github.com/SeedGrid/seedgrid-fe-components.git",
9
- "directory": "packages/seedgrid-fe-components"
10
- },
11
- "homepage": "https://github.com/SeedGrid/seedgrid-fe-components/tree/main/packages/seedgrid-fe-components",
12
- "bugs": {
13
- "url": "https://github.com/SeedGrid/seedgrid-fe-components/issues"
14
- },
15
- "main": "dist/index.js",
16
- "types": "dist/index.d.ts",
17
- "exports": {
18
- ".": {
19
- "types": "./dist/index.d.ts",
20
- "default": "./dist/index.js"
21
- }
22
- },
23
- "sideEffects": false,
24
- "files": [
25
- "dist"
26
- ],
27
- "scripts": {
28
- "clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
29
- "build": "pnpm run clean && tsc -p tsconfig.json && pnpm run build:sandbox",
30
- "build:sandbox": "tsup --config tsup.sandbox.config.ts",
31
- "dev": "tsc -p tsconfig.json --watch --preserveWatchOutput",
32
- "typecheck": "tsc -p tsconfig.json --noEmit"
33
- },
34
- "peerDependencies": {
35
- "@tiptap/core": "^2.9.1",
36
- "@tiptap/extension-color": "^2.9.1",
37
- "@tiptap/extension-font-family": "^2.9.1",
38
- "@tiptap/extension-highlight": "^2.9.1",
39
- "@tiptap/extension-image": "^2.9.1",
40
- "@tiptap/extension-link": "^2.9.1",
41
- "@tiptap/pm": "^2.9.1",
42
- "@tiptap/extension-subscript": "^2.9.1",
43
- "@tiptap/extension-superscript": "^2.9.1",
44
- "@tiptap/extension-text-align": "^2.9.1",
45
- "@tiptap/extension-text-style": "^2.9.1",
46
- "@tiptap/extension-underline": "^2.9.1",
47
- "@tiptap/react": "^2.9.1",
48
- "@tiptap/starter-kit": "^2.9.1",
49
- "lucide-react": "^0.468.0",
50
- "react": "^18.2.0 || ^19.0.0",
51
- "react-hook-form": "^7.0.0"
52
- },
53
- "devDependencies": {
54
- "tsup": "^8.4.0",
55
- "@tiptap/core": "^2.9.1",
56
- "@tiptap/extension-color": "^2.9.1",
57
- "@tiptap/extension-font-family": "^2.9.1",
58
- "@tiptap/extension-highlight": "^2.9.1",
59
- "@tiptap/extension-image": "^2.9.1",
60
- "@tiptap/extension-link": "^2.9.1",
61
- "@tiptap/pm": "^2.9.1",
62
- "@tiptap/extension-subscript": "^2.9.1",
63
- "@tiptap/extension-superscript": "^2.9.1",
64
- "@tiptap/extension-text-align": "^2.9.1",
65
- "@tiptap/extension-text-style": "^2.9.1",
66
- "@tiptap/extension-underline": "^2.9.1",
67
- "@tiptap/react": "^2.9.1",
68
- "@tiptap/starter-kit": "^2.9.1",
69
- "lucide-react": "^0.468.0",
70
- "react": "19.0.0",
71
- "react-dom": "19.0.0",
72
- "react-hook-form": "^7.0.0"
73
- },
74
- "dependencies": {
75
- "@pqina/flip": "^1.8.4",
76
- "qrcode.react": "^4.2.0"
2
+ "name": "@seedgrid/fe-components",
3
+ "version": "2026.3.26",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/SeedGrid/seedgrid-fe-components.git",
9
+ "directory": "packages/seedgrid-fe-components"
10
+ },
11
+ "homepage": "https://github.com/SeedGrid/seedgrid-fe-components/tree/main/packages/seedgrid-fe-components",
12
+ "bugs": {
13
+ "url": "https://github.com/SeedGrid/seedgrid-fe-components/issues"
14
+ },
15
+ "main": "dist/index.js",
16
+ "types": "dist/index.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "default": "./dist/index.js"
77
21
  }
78
- }
22
+ },
23
+ "sideEffects": false,
24
+ "files": [
25
+ "dist"
26
+ ],
27
+ "peerDependencies": {
28
+ "@tiptap/core": "^2.9.1",
29
+ "@tiptap/extension-color": "^2.9.1",
30
+ "@tiptap/extension-font-family": "^2.9.1",
31
+ "@tiptap/extension-highlight": "^2.9.1",
32
+ "@tiptap/extension-image": "^2.9.1",
33
+ "@tiptap/extension-link": "^2.9.1",
34
+ "@tiptap/extension-subscript": "^2.9.1",
35
+ "@tiptap/extension-superscript": "^2.9.1",
36
+ "@tiptap/extension-text-align": "^2.9.1",
37
+ "@tiptap/extension-text-style": "^2.9.1",
38
+ "@tiptap/extension-underline": "^2.9.1",
39
+ "@tiptap/pm": "^2.9.1",
40
+ "@tiptap/react": "^2.9.1",
41
+ "@tiptap/starter-kit": "^2.9.1",
42
+ "lucide-react": "^0.468.0",
43
+ "react": "^18.2.0 || ^19.0.0",
44
+ "react-hook-form": "^7.0.0"
45
+ },
46
+ "devDependencies": {
47
+ "@tiptap/core": "^2.9.1",
48
+ "@tiptap/extension-color": "^2.9.1",
49
+ "@tiptap/extension-font-family": "^2.9.1",
50
+ "@tiptap/extension-highlight": "^2.9.1",
51
+ "@tiptap/extension-image": "^2.9.1",
52
+ "@tiptap/extension-link": "^2.9.1",
53
+ "@tiptap/extension-subscript": "^2.9.1",
54
+ "@tiptap/extension-superscript": "^2.9.1",
55
+ "@tiptap/extension-text-align": "^2.9.1",
56
+ "@tiptap/extension-text-style": "^2.9.1",
57
+ "@tiptap/extension-underline": "^2.9.1",
58
+ "@tiptap/pm": "^2.9.1",
59
+ "@tiptap/react": "^2.9.1",
60
+ "@tiptap/starter-kit": "^2.9.1",
61
+ "jsdom": "^29.0.1",
62
+ "lucide-react": "^0.468.0",
63
+ "react": "19.0.0",
64
+ "react-dom": "19.0.0",
65
+ "react-hook-form": "^7.0.0",
66
+ "tsup": "^8.4.0"
67
+ },
68
+ "dependencies": {
69
+ "@pqina/flip": "^1.8.4",
70
+ "qrcode.react": "^4.2.0"
71
+ },
72
+ "scripts": {
73
+ "clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
74
+ "build": "pnpm run clean && tsc -p tsconfig.json && pnpm run build:sandbox",
75
+ "build:sandbox": "tsup --config tsup.sandbox.config.ts",
76
+ "dev": "tsc -p tsconfig.json --watch --preserveWatchOutput",
77
+ "typecheck": "tsc -p tsconfig.json --noEmit",
78
+ "test": "pnpm run build && node --test tests/i18n.test.mjs tests/rhf.test.mjs tests/rhf-components-contract.test.mjs tests/i18n-components-contract.test.mjs tests/providers-hooks.test.mjs tests/providers-hooks-dom.test.mjs tests/commons.test.mjs tests/overlay.test.mjs tests/overlay-dom.test.mjs tests/buttons-menus.test.mjs tests/buttons-menus-dom.test.mjs tests/menu-logic.test.mjs tests/inputs-i18n.test.mjs tests/gadgets.test.mjs tests/gadgets-dom.test.mjs tests/gauge-math.test.mjs tests/clock-theme-picker.test.mjs tests/wizard.test.mjs tests/wizard-logic.test.mjs tests/utils.test.mjs"
79
+ }
80
+ }