@octavius2929-personal/design-system 0.1.0 → 0.3.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/dist/index.cjs CHANGED
@@ -69,6 +69,7 @@ __export(index_exports, {
69
69
  text: () => text,
70
70
  theme: () => vars,
71
71
  themes: () => themes,
72
+ usePrevious: () => usePrevious,
72
73
  useTheme: () => useTheme,
73
74
  useToggle: () => useToggle
74
75
  });
@@ -80,19 +81,29 @@ var schemaNames = ["tinta"];
80
81
  var themes = { tinta: { light: "theme_themes_tinta_light__e3grur2v", dark: "theme_themes_tinta_dark__e3grur2w", sepia: "theme_themes_tinta_sepia__e3grur2x", contrast: "theme_themes_tinta_contrast__e3grur2y" } };
81
82
  var vars = { font: { display: "var(--font-display__e3grur0)", text: "var(--font-text__e3grur1)", mono: "var(--font-mono__e3grur2)", black: "var(--font-black__e3grur3)" }, text: { eyebrow: { size: "var(--text-eyebrow-size__e3grur4)", lineHeight: "var(--text-eyebrow-lineHeight__e3grur5)", weight: "var(--text-eyebrow-weight__e3grur6)", letterSpacing: "var(--text-eyebrow-letterSpacing__e3grur7)" }, display: { size: "var(--text-display-size__e3grur8)", lineHeight: "var(--text-display-lineHeight__e3grur9)", weight: "var(--text-display-weight__e3grura)", letterSpacing: "var(--text-display-letterSpacing__e3grurb)" }, h1: { size: "var(--text-h1-size__e3grurc)", lineHeight: "var(--text-h1-lineHeight__e3grurd)", weight: "var(--text-h1-weight__e3grure)", letterSpacing: "var(--text-h1-letterSpacing__e3grurf)" }, h2: { size: "var(--text-h2-size__e3grurg)", lineHeight: "var(--text-h2-lineHeight__e3grurh)", weight: "var(--text-h2-weight__e3gruri)", letterSpacing: "var(--text-h2-letterSpacing__e3grurj)" }, h3: { size: "var(--text-h3-size__e3grurk)", lineHeight: "var(--text-h3-lineHeight__e3grurl)", weight: "var(--text-h3-weight__e3grurm)", letterSpacing: "var(--text-h3-letterSpacing__e3grurn)" }, h4: { size: "var(--text-h4-size__e3gruro)", lineHeight: "var(--text-h4-lineHeight__e3grurp)", weight: "var(--text-h4-weight__e3grurq)", letterSpacing: "var(--text-h4-letterSpacing__e3grurr)" }, body: { size: "var(--text-body-size__e3grurs)", lineHeight: "var(--text-body-lineHeight__e3grurt)", weight: "var(--text-body-weight__e3gruru)", letterSpacing: "var(--text-body-letterSpacing__e3grurv)" }, lead: { size: "var(--text-lead-size__e3grurw)", lineHeight: "var(--text-lead-lineHeight__e3grurx)", weight: "var(--text-lead-weight__e3grury)", letterSpacing: "var(--text-lead-letterSpacing__e3grurz)" }, small: { size: "var(--text-small-size__e3grur10)", lineHeight: "var(--text-small-lineHeight__e3grur11)", weight: "var(--text-small-weight__e3grur12)", letterSpacing: "var(--text-small-letterSpacing__e3grur13)" }, caption: { size: "var(--text-caption-size__e3grur14)", lineHeight: "var(--text-caption-lineHeight__e3grur15)", weight: "var(--text-caption-weight__e3grur16)", letterSpacing: "var(--text-caption-letterSpacing__e3grur17)" } }, space: { none: "var(--space-none__e3grur18)", xs: "var(--space-xs__e3grur19)", sm: "var(--space-sm__e3grur1a)", md: "var(--space-md__e3grur1b)", lg: "var(--space-lg__e3grur1c)", xl: "var(--space-xl__e3grur1d)", "2xl": "var(--space-2xl__e3grur1e)", "3xl": "var(--space-3xl__e3grur1f)", "4xl": "var(--space-4xl__e3grur1g)", "5xl": "var(--space-5xl__e3grur1h)" }, radius: { none: "var(--radius-none__e3grur1i)", sm: "var(--radius-sm__e3grur1j)", md: "var(--radius-md__e3grur1k)", lg: "var(--radius-lg__e3grur1l)", base: "var(--radius-base__e3grur1m)", full: "var(--radius-full__e3grur1n)" }, border: { hair: "var(--border-hair__e3grur1o)", rule: "var(--border-rule__e3grur1p)", heavy: "var(--border-heavy__e3grur1q)" }, tracking: { tight: "var(--tracking-tight__e3grur1r)", normal: "var(--tracking-normal__e3grur1s)", wide: "var(--tracking-wide__e3grur1t)", wider: "var(--tracking-wider__e3grur1u)", widest: "var(--tracking-widest__e3grur1v)" }, leading: { tight: "var(--leading-tight__e3grur1w)", snug: "var(--leading-snug__e3grur1x)", normal: "var(--leading-normal__e3grur1y)", relaxed: "var(--leading-relaxed__e3grur1z)" }, weight: { light: "var(--weight-light__e3grur20)", regular: "var(--weight-regular__e3grur21)", medium: "var(--weight-medium__e3grur22)", semibold: "var(--weight-semibold__e3grur23)", bold: "var(--weight-bold__e3grur24)" }, dur: { fast: "var(--dur-fast__e3grur25)", base: "var(--dur-base__e3grur26)", slow: "var(--dur-slow__e3grur27)" }, ease: { ink: "var(--ease-ink__e3grur28)" }, shadow: { sm: "var(--shadow-sm__e3grur29)", md: "var(--shadow-md__e3grur2a)", lg: "var(--shadow-lg__e3grur2b)" }, color: { bg1: "var(--color-bg1__e3grur2c)", bg2: "var(--color-bg2__e3grur2d)", bg3: "var(--color-bg3__e3grur2e)", bgInset: "var(--color-bgInset__e3grur2f)", fg1: "var(--color-fg1__e3grur2g)", fg2: "var(--color-fg2__e3grur2h)", fg3: "var(--color-fg3__e3grur2i)", fgOnAccent: "var(--color-fgOnAccent__e3grur2j)", border1: "var(--color-border1__e3grur2k)", border2: "var(--color-border2__e3grur2l)", borderStrong: "var(--color-borderStrong__e3grur2m)", accent: "var(--color-accent__e3grur2n)", accentHover: "var(--color-accentHover__e3grur2o)", accentSoft: "var(--color-accentSoft__e3grur2p)", ok: "var(--color-ok__e3grur2q)", warn: "var(--color-warn__e3grur2r)", danger: "var(--color-danger__e3grur2s)", info: "var(--color-info__e3grur2t)", scrim: "var(--color-scrim__e3grur2u)" } };
82
83
 
83
- // src/hooks/use-toggle/index.ts
84
+ // src/hooks/use-previous/index.ts
84
85
  var import_react = require("react");
86
+ function usePrevious(value, initial) {
87
+ const ref = (0, import_react.useRef)(initial);
88
+ (0, import_react.useEffect)(() => {
89
+ ref.current = value;
90
+ }, [value]);
91
+ return ref.current;
92
+ }
93
+
94
+ // src/hooks/use-toggle/index.ts
95
+ var import_react2 = require("react");
85
96
  function useToggle(initial = false) {
86
- const [on, setOn] = (0, import_react.useState)(initial);
87
- const toggle = (0, import_react.useCallback)(() => setOn((value) => !value), []);
97
+ const [on, setOn] = (0, import_react2.useState)(initial);
98
+ const toggle = (0, import_react2.useCallback)(() => setOn((value) => !value), []);
88
99
  return [on, toggle, setOn];
89
100
  }
90
101
 
91
102
  // src/components/button/use-styles.ts
92
- var import_react3 = require("react");
103
+ var import_react4 = require("react");
93
104
 
94
105
  // src/theme/context/theme-context.tsx
95
- var import_react2 = require("react");
106
+ var import_react3 = require("react");
96
107
  var import_jsx_runtime = require("react/jsx-runtime");
97
108
  var noop = () => {
98
109
  };
@@ -104,15 +115,15 @@ var DEFAULT_VALUE = {
104
115
  setMode: noop,
105
116
  toggleMode: noop
106
117
  };
107
- var ThemeContext = (0, import_react2.createContext)(null);
118
+ var ThemeContext = (0, import_react3.createContext)(null);
108
119
  function ThemeProvider({
109
120
  children,
110
121
  defaultSchema = "tinta",
111
122
  defaultMode = "light"
112
123
  }) {
113
- const [schema, setSchema] = (0, import_react2.useState)(defaultSchema);
114
- const [mode, setMode] = (0, import_react2.useState)(defaultMode);
115
- const value = (0, import_react2.useMemo)(
124
+ const [schema, setSchema] = (0, import_react3.useState)(defaultSchema);
125
+ const [mode, setMode] = (0, import_react3.useState)(defaultMode);
126
+ const value = (0, import_react3.useMemo)(
116
127
  () => ({
117
128
  schema,
118
129
  mode,
@@ -126,7 +137,7 @@ function ThemeProvider({
126
137
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemeContext.Provider, { value, children });
127
138
  }
128
139
  function useTheme() {
129
- return (0, import_react2.useContext)(ThemeContext) ?? DEFAULT_VALUE;
140
+ return (0, import_react3.useContext)(ThemeContext) ?? DEFAULT_VALUE;
130
141
  }
131
142
 
132
143
  // src/components/button/use-styles.css.ts
@@ -147,7 +158,7 @@ function useStyles({
147
158
  className
148
159
  }) {
149
160
  const { themeClass } = useTheme();
150
- const container = (0, import_react3.useMemo)(
161
+ const container = (0, import_react4.useMemo)(
151
162
  () => [
152
163
  themeClass,
153
164
  root,
@@ -185,7 +196,7 @@ function Button({
185
196
  }
186
197
 
187
198
  // src/components/divider/use-styles.ts
188
- var import_react4 = require("react");
199
+ var import_react5 = require("react");
189
200
 
190
201
  // src/components/divider/use-styles.css.ts
191
202
  var horizontal = "use-styles_horizontal__1n7v7yj1";
@@ -198,7 +209,7 @@ var vertical = "use-styles_vertical__1n7v7yj2";
198
209
  // src/components/divider/use-styles.ts
199
210
  function useStyles2({ vertical: vertical2, hasLabel }) {
200
211
  const { themeClass } = useTheme();
201
- const root24 = (0, import_react4.useMemo)(
212
+ const root24 = (0, import_react5.useMemo)(
202
213
  () => [
203
214
  themeClass,
204
215
  root2,
@@ -225,7 +236,7 @@ function Divider({ vertical: vertical2, label: label7, ...rest }) {
225
236
  }
226
237
 
227
238
  // src/components/avatar/use-styles.ts
228
- var import_react5 = require("react");
239
+ var import_react6 = require("react");
229
240
 
230
241
  // src/components/avatar/use-styles.css.ts
231
242
  var root3 = "use-styles_root__1mn1rmu0";
@@ -239,7 +250,7 @@ function useStyles3({
239
250
  className
240
251
  }) {
241
252
  const { themeClass } = useTheme();
242
- const root24 = (0, import_react5.useMemo)(
253
+ const root24 = (0, import_react6.useMemo)(
243
254
  () => [
244
255
  themeClass,
245
256
  root3,
@@ -260,7 +271,7 @@ function Avatar({ size: size3, filled, className, children, ...rest }) {
260
271
  }
261
272
 
262
273
  // src/components/badge/use-styles.ts
263
- var import_react6 = require("react");
274
+ var import_react7 = require("react");
264
275
 
265
276
  // src/components/badge/use-styles.css.ts
266
277
  var dot = "use-styles_dot__1wpei6p1";
@@ -270,11 +281,11 @@ var tone2 = { ink: "use-styles_tone_ink__1wpei6p2", accent: "use-styles_tone_acc
270
281
  // src/components/badge/use-styles.ts
271
282
  function useStyles4({ tone: tone4 = "ink", className }) {
272
283
  const { themeClass } = useTheme();
273
- const root24 = (0, import_react6.useMemo)(
284
+ const root24 = (0, import_react7.useMemo)(
274
285
  () => [themeClass, root4, className].filter(Boolean).join(" "),
275
286
  [themeClass, className]
276
287
  );
277
- const dot3 = (0, import_react6.useMemo)(() => [dot, tone2[tone4]].join(" "), [tone4]);
288
+ const dot3 = (0, import_react7.useMemo)(() => [dot, tone2[tone4]].join(" "), [tone4]);
278
289
  return { root: root24, dot: dot3 };
279
290
  }
280
291
 
@@ -289,7 +300,7 @@ function Badge({ count, tone: tone4, className, children, ...rest }) {
289
300
  }
290
301
 
291
302
  // src/components/progress/use-styles.ts
292
- var import_react7 = require("react");
303
+ var import_react8 = require("react");
293
304
 
294
305
  // src/components/progress/use-styles.css.ts
295
306
  var bar = "use-styles_bar__kbop7v3";
@@ -305,7 +316,7 @@ function useStyles5({
305
316
  }) {
306
317
  const { themeClass } = useTheme();
307
318
  const indeterminate2 = value === void 0;
308
- return (0, import_react7.useMemo)(() => {
319
+ return (0, import_react8.useMemo)(() => {
309
320
  const root24 = (...classes) => [themeClass, ...classes, className].filter(Boolean).join(" ");
310
321
  if (variant2 === "circular") {
311
322
  return { track: "", bar: "", spinner: root24(spinner) };
@@ -383,7 +394,7 @@ function XIcon({ size: size3 = 20, strokeWidth = 1.75, ...rest }) {
383
394
  }
384
395
 
385
396
  // src/components/chip/use-styles.ts
386
- var import_react8 = require("react");
397
+ var import_react9 = require("react");
387
398
 
388
399
  // src/components/chip/use-styles.css.ts
389
400
  var clickable = "use-styles_clickable__1axilf44";
@@ -399,7 +410,7 @@ function useStyles6({
399
410
  clickable: clickable2
400
411
  }) {
401
412
  const { themeClass } = useTheme();
402
- const root24 = (0, import_react8.useMemo)(
413
+ const root24 = (0, import_react9.useMemo)(
403
414
  () => [
404
415
  themeClass,
405
416
  root5,
@@ -449,7 +460,7 @@ function CheckIcon({ size: size3 = 20, strokeWidth = 1.75, ...rest }) {
449
460
  }
450
461
 
451
462
  // src/components/checkbox/use-styles.ts
452
- var import_react9 = require("react");
463
+ var import_react10 = require("react");
453
464
 
454
465
  // src/components/checkbox/use-styles.css.ts
455
466
  var box = "use-styles_box__9zoga92";
@@ -462,11 +473,11 @@ var root6 = "use-styles_root__9zoga90";
462
473
  // src/components/checkbox/use-styles.ts
463
474
  function useStyles7({ checked, disabled: disabled3 }) {
464
475
  const { themeClass } = useTheme();
465
- const root24 = (0, import_react9.useMemo)(
476
+ const root24 = (0, import_react10.useMemo)(
466
477
  () => [themeClass, root6, disabled3 && disabled].filter(Boolean).join(" "),
467
478
  [themeClass, disabled3]
468
479
  );
469
- const box2 = (0, import_react9.useMemo)(
480
+ const box2 = (0, import_react10.useMemo)(
470
481
  () => [box, checked && boxChecked].filter(Boolean).join(" "),
471
482
  [checked]
472
483
  );
@@ -505,7 +516,7 @@ function Checkbox({
505
516
  }
506
517
 
507
518
  // src/components/radio/use-styles.ts
508
- var import_react10 = require("react");
519
+ var import_react11 = require("react");
509
520
 
510
521
  // src/components/radio/use-styles.css.ts
511
522
  var circle = "use-styles_circle__vy61b43";
@@ -521,7 +532,7 @@ function useStyles8({
521
532
  className
522
533
  }) {
523
534
  const { themeClass } = useTheme();
524
- const root24 = (0, import_react10.useMemo)(
535
+ const root24 = (0, import_react11.useMemo)(
525
536
  () => [themeClass, root7, disabled3 && disabled2, className].filter(Boolean).join(" "),
526
537
  [themeClass, disabled3, className]
527
538
  );
@@ -557,7 +568,7 @@ function Radio({ checked, onChange, label: label7, name, value, disabled: disabl
557
568
  }
558
569
 
559
570
  // src/components/switch/use-styles.ts
560
- var import_react11 = require("react");
571
+ var import_react12 = require("react");
561
572
 
562
573
  // src/components/switch/use-styles.css.ts
563
574
  var input3 = "use-styles_input__1r6kem71";
@@ -571,7 +582,7 @@ var trackChecked = "use-styles_trackChecked__1r6kem73";
571
582
  // src/components/switch/use-styles.ts
572
583
  function useStyles9({ checked }) {
573
584
  const { themeClass } = useTheme();
574
- return (0, import_react11.useMemo)(
585
+ return (0, import_react12.useMemo)(
575
586
  () => ({
576
587
  root: [themeClass, root8].filter(Boolean).join(" "),
577
588
  input: input3,
@@ -609,7 +620,7 @@ function Switch({ checked = false, onChange, label: label7, disabled: disabled3
609
620
  }
610
621
 
611
622
  // src/components/text-field/index.tsx
612
- var import_react13 = require("react");
623
+ var import_react14 = require("react");
613
624
 
614
625
  // src/components/icons/eye/index.tsx
615
626
  var import_jsx_runtime13 = require("react/jsx-runtime");
@@ -664,7 +675,7 @@ function EyeOffIcon({ size: size3 = 20, strokeWidth = 1.75, ...rest }) {
664
675
  }
665
676
 
666
677
  // src/components/text-field/use-styles.ts
667
- var import_react12 = require("react");
678
+ var import_react13 = require("react");
668
679
 
669
680
  // src/components/text-field/use-styles.css.ts
670
681
  var field = "use-styles_field__vat8gv3";
@@ -683,7 +694,7 @@ var startIcon = "use-styles_startIcon__vat8gva";
683
694
  // src/components/text-field/use-styles.ts
684
695
  function useStyles10({ error, hasStartIcon, hasReveal, className }) {
685
696
  const { themeClass } = useTheme();
686
- return (0, import_react12.useMemo)(() => {
697
+ return (0, import_react13.useMemo)(() => {
687
698
  const root24 = [themeClass, root9].filter(Boolean).join(" ");
688
699
  const labelText2 = [labelText, error && labelTextError].filter(Boolean).join(" ");
689
700
  const input6 = [
@@ -721,11 +732,11 @@ function TextField({
721
732
  id,
722
733
  ...rest
723
734
  }) {
724
- const [reveal, setReveal] = (0, import_react13.useState)(false);
735
+ const [reveal, setReveal] = (0, import_react14.useState)(false);
725
736
  const isPassword = type === "password";
726
737
  const hasReveal = isPassword;
727
738
  const effectiveType = isPassword ? reveal ? "text" : "password" : type;
728
- const autoId = (0, import_react13.useId)();
739
+ const autoId = (0, import_react14.useId)();
729
740
  const controlId = id ?? autoId;
730
741
  const classes = useStyles10({
731
742
  error,
@@ -783,7 +794,7 @@ function TextField({
783
794
  }
784
795
 
785
796
  // src/components/icon-button/use-styles.ts
786
- var import_react14 = require("react");
797
+ var import_react15 = require("react");
787
798
 
788
799
  // src/components/icon-button/use-styles.css.ts
789
800
  var accent = "use-styles_accent__18np0q02";
@@ -796,7 +807,7 @@ function useStyles11({
796
807
  tone: tone4 = "ink"
797
808
  }) {
798
809
  const { themeClass } = useTheme();
799
- const root24 = (0, import_react14.useMemo)(
810
+ const root24 = (0, import_react15.useMemo)(
800
811
  () => [themeClass, root10, tone4 === "accent" && accent, active2 && active].filter(Boolean).join(" "),
801
812
  [themeClass, active2, tone4]
802
813
  );
@@ -811,7 +822,7 @@ function IconButton({ icon: Icon, active: active2, tone: tone4, title, ...rest }
811
822
  }
812
823
 
813
824
  // src/components/card/use-styles.ts
814
- var import_react15 = require("react");
825
+ var import_react16 = require("react");
815
826
 
816
827
  // src/components/card/use-styles.css.ts
817
828
  var body = "use-styles_body__1fuvd022";
@@ -822,7 +833,7 @@ var root11 = "use-styles_root__1fuvd020";
822
833
  // src/components/card/use-styles.ts
823
834
  function useStyles12() {
824
835
  const { themeClass } = useTheme();
825
- const root24 = (0, import_react15.useMemo)(() => `${themeClass} ${root11}`, [themeClass]);
836
+ const root24 = (0, import_react16.useMemo)(() => `${themeClass} ${root11}`, [themeClass]);
826
837
  return { root: root24, header, body, footer };
827
838
  }
828
839
 
@@ -958,7 +969,7 @@ function TriangleAlertIcon({ size: size3 = 20, strokeWidth = 1.75, ...rest }) {
958
969
  }
959
970
 
960
971
  // src/components/alert/use-styles.ts
961
- var import_react16 = require("react");
972
+ var import_react17 = require("react");
962
973
 
963
974
  // src/components/alert/use-styles.css.ts
964
975
  var body2 = "use-styles_body__ivsh6u8";
@@ -974,7 +985,7 @@ function useStyles13({
974
985
  className
975
986
  }) {
976
987
  const { themeClass } = useTheme();
977
- const root24 = (0, import_react16.useMemo)(
988
+ const root24 = (0, import_react17.useMemo)(
978
989
  () => [themeClass, root12, severity[severity2], className].filter(Boolean).join(" "),
979
990
  [themeClass, severity2, className]
980
991
  );
@@ -1015,10 +1026,10 @@ function Alert({
1015
1026
  }
1016
1027
 
1017
1028
  // src/components/tooltip/index.tsx
1018
- var import_react18 = require("react");
1029
+ var import_react19 = require("react");
1019
1030
 
1020
1031
  // src/components/tooltip/use-styles.ts
1021
- var import_react17 = require("react");
1032
+ var import_react18 = require("react");
1022
1033
 
1023
1034
  // src/components/tooltip/use-styles.css.ts
1024
1035
  var bubble = "use-styles_bubble__h9kvh1";
@@ -1028,11 +1039,11 @@ var wrapper = "use-styles_wrapper__h9kvh0";
1028
1039
  // src/components/tooltip/use-styles.ts
1029
1040
  function useStyles14({ placement: placement2 = "top" }) {
1030
1041
  const { themeClass } = useTheme();
1031
- const wrapper4 = (0, import_react17.useMemo)(
1042
+ const wrapper4 = (0, import_react18.useMemo)(
1032
1043
  () => [themeClass, wrapper].filter(Boolean).join(" "),
1033
1044
  [themeClass]
1034
1045
  );
1035
- const bubble2 = (0, import_react17.useMemo)(
1046
+ const bubble2 = (0, import_react18.useMemo)(
1036
1047
  () => [bubble, placement[placement2]].filter(Boolean).join(" "),
1037
1048
  [placement2]
1038
1049
  );
@@ -1042,14 +1053,14 @@ function useStyles14({ placement: placement2 = "top" }) {
1042
1053
  // src/components/tooltip/index.tsx
1043
1054
  var import_jsx_runtime23 = require("react/jsx-runtime");
1044
1055
  function Tooltip({ label: label7, children, placement: placement2 }) {
1045
- const [open, setOpen] = (0, import_react18.useState)(false);
1046
- const tooltipId = (0, import_react18.useId)();
1056
+ const [open, setOpen] = (0, import_react19.useState)(false);
1057
+ const tooltipId = (0, import_react19.useId)();
1047
1058
  const { wrapper: wrapper4, bubble: bubble2 } = useStyles14({ placement: placement2 });
1048
1059
  const show = () => setOpen(true);
1049
1060
  const hide = () => setOpen(false);
1050
1061
  const previousDescribedBy = children.props["aria-describedby"];
1051
1062
  const describedBy = open ? [previousDescribedBy, tooltipId].filter(Boolean).join(" ") : previousDescribedBy;
1052
- const trigger2 = (0, import_react18.cloneElement)(children, { "aria-describedby": describedBy });
1063
+ const trigger2 = (0, import_react19.cloneElement)(children, { "aria-describedby": describedBy });
1053
1064
  return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("span", { className: wrapper4, onMouseEnter: show, onMouseLeave: hide, onFocus: show, onBlur: hide, children: [
1054
1065
  trigger2,
1055
1066
  open && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { id: tooltipId, role: "tooltip", className: bubble2, children: label7 })
@@ -1057,7 +1068,7 @@ function Tooltip({ label: label7, children, placement: placement2 }) {
1057
1068
  }
1058
1069
 
1059
1070
  // src/components/select/index.tsx
1060
- var import_react20 = require("react");
1071
+ var import_react21 = require("react");
1061
1072
 
1062
1073
  // src/components/icons/chevron-down/index.tsx
1063
1074
  var import_jsx_runtime24 = require("react/jsx-runtime");
@@ -1082,7 +1093,7 @@ function ChevronDownIcon({ size: size3 = 20, strokeWidth = 1.75, ...rest }) {
1082
1093
  }
1083
1094
 
1084
1095
  // src/components/select/use-styles.ts
1085
- var import_react19 = require("react");
1096
+ var import_react20 = require("react");
1086
1097
 
1087
1098
  // src/components/select/use-styles.css.ts
1088
1099
  var chevron = "use-styles_chevron__1w1czpb4";
@@ -1101,7 +1112,7 @@ function useStyles15({
1101
1112
  open = false
1102
1113
  }) {
1103
1114
  const { themeClass } = useTheme();
1104
- return (0, import_react19.useMemo)(() => {
1115
+ return (0, import_react20.useMemo)(() => {
1105
1116
  const chevron3 = [chevron, open && chevronOpen].filter(Boolean).join(" ");
1106
1117
  return {
1107
1118
  root: [themeClass, root13].filter(Boolean).join(" "),
@@ -1118,10 +1129,10 @@ function useStyles15({
1118
1129
  // src/components/select/index.tsx
1119
1130
  var import_jsx_runtime25 = require("react/jsx-runtime");
1120
1131
  function Select({ options, value, onChange, placeholder: placeholder2, label: label7, disabled: disabled3 }) {
1121
- const [open, setOpen] = (0, import_react20.useState)(false);
1122
- const [activeIndex, setActiveIndex] = (0, import_react20.useState)(0);
1123
- const rootRef = (0, import_react20.useRef)(null);
1124
- const baseId = (0, import_react20.useId)();
1132
+ const [open, setOpen] = (0, import_react21.useState)(false);
1133
+ const [activeIndex, setActiveIndex] = (0, import_react21.useState)(0);
1134
+ const rootRef = (0, import_react21.useRef)(null);
1135
+ const baseId = (0, import_react21.useId)();
1125
1136
  const labelId = `${baseId}-label`;
1126
1137
  const optionId = (index) => `${baseId}-option-${index}`;
1127
1138
  const {
@@ -1133,7 +1144,7 @@ function Select({ options, value, onChange, placeholder: placeholder2, label: la
1133
1144
  menu: menu2,
1134
1145
  optionClass
1135
1146
  } = useStyles15({ open });
1136
- (0, import_react20.useEffect)(() => {
1147
+ (0, import_react21.useEffect)(() => {
1137
1148
  if (!open) return;
1138
1149
  const onPointerDown = (event) => {
1139
1150
  if (rootRef.current && !rootRef.current.contains(event.target)) {
@@ -1244,7 +1255,7 @@ function Select({ options, value, onChange, placeholder: placeholder2, label: la
1244
1255
  }
1245
1256
 
1246
1257
  // src/components/slider/use-styles.ts
1247
- var import_react21 = require("react");
1258
+ var import_react22 = require("react");
1248
1259
 
1249
1260
  // src/components/slider/use-styles.css.ts
1250
1261
  var input5 = "use-styles_input__okw59n3";
@@ -1258,7 +1269,7 @@ var wrapper2 = "use-styles_wrapper__okw59n6";
1258
1269
  // src/components/slider/use-styles.ts
1259
1270
  function useStyles16() {
1260
1271
  const { themeClass } = useTheme();
1261
- return (0, import_react21.useMemo)(() => {
1272
+ return (0, import_react22.useMemo)(() => {
1262
1273
  const root24 = [themeClass, root14].filter(Boolean).join(" ");
1263
1274
  return {
1264
1275
  wrapper: wrapper2,
@@ -1314,10 +1325,10 @@ function Slider({
1314
1325
  }
1315
1326
 
1316
1327
  // src/components/accordion/index.tsx
1317
- var import_react23 = require("react");
1328
+ var import_react24 = require("react");
1318
1329
 
1319
1330
  // src/components/accordion/use-styles.ts
1320
- var import_react22 = require("react");
1331
+ var import_react23 = require("react");
1321
1332
 
1322
1333
  // src/components/accordion/use-styles.css.ts
1323
1334
  var chevron2 = "use-styles_chevron__1cjrdh93";
@@ -1330,7 +1341,7 @@ var root15 = "use-styles_root__1cjrdh90";
1330
1341
  // src/components/accordion/use-styles.ts
1331
1342
  function useStyles17({ className }) {
1332
1343
  const { themeClass } = useTheme();
1333
- return (0, import_react22.useMemo)(
1344
+ return (0, import_react23.useMemo)(
1334
1345
  () => ({
1335
1346
  root: [themeClass, root15, className].filter(Boolean).join(" "),
1336
1347
  item,
@@ -1350,7 +1361,7 @@ function Accordion({
1350
1361
  defaultOpen = [],
1351
1362
  className
1352
1363
  }) {
1353
- const [open, setOpen] = (0, import_react23.useState)(defaultOpen);
1364
+ const [open, setOpen] = (0, import_react24.useState)(defaultOpen);
1354
1365
  const { root: root24, item: item3, header: header3, chevronFor, panel: panel2 } = useStyles17({ className });
1355
1366
  const toggle = (id) => {
1356
1367
  setOpen((current2) => {
@@ -1385,7 +1396,7 @@ function Accordion({
1385
1396
  }
1386
1397
 
1387
1398
  // src/components/breadcrumbs/index.tsx
1388
- var import_react25 = require("react");
1399
+ var import_react26 = require("react");
1389
1400
 
1390
1401
  // src/components/icons/chevron-right/index.tsx
1391
1402
  var import_jsx_runtime28 = require("react/jsx-runtime");
@@ -1410,7 +1421,7 @@ function ChevronRightIcon({ size: size3 = 20, strokeWidth = 1.75, ...rest }) {
1410
1421
  }
1411
1422
 
1412
1423
  // src/components/breadcrumbs/use-styles.ts
1413
- var import_react24 = require("react");
1424
+ var import_react25 = require("react");
1414
1425
 
1415
1426
  // src/components/breadcrumbs/use-styles.css.ts
1416
1427
  var crumb = "use-styles_crumb__7u0du61";
@@ -1421,7 +1432,7 @@ var separator = "use-styles_separator__7u0du63";
1421
1432
  // src/components/breadcrumbs/use-styles.ts
1422
1433
  function useStyles18({ className }) {
1423
1434
  const { themeClass } = useTheme();
1424
- const root24 = (0, import_react24.useMemo)(
1435
+ const root24 = (0, import_react25.useMemo)(
1425
1436
  () => [themeClass, root16, className].filter(Boolean).join(" "),
1426
1437
  [themeClass, className]
1427
1438
  );
@@ -1435,7 +1446,7 @@ function Breadcrumbs({ items, className, ...rest }) {
1435
1446
  return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("nav", { "aria-label": "Breadcrumb", className: root24, ...rest, children: items.map((item3, index) => {
1436
1447
  const isLast = index === items.length - 1;
1437
1448
  const key = index;
1438
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_react25.Fragment, { children: [
1449
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_react26.Fragment, { children: [
1439
1450
  isLast ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: current2, "aria-current": "page", children: item3.label }) : item3.href ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("a", { className: crumb2, href: item3.href, children: item3.label }) : /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: crumb2, children: item3.label }),
1440
1451
  !isLast && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: separator2, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(ChevronRightIcon, { size: 14 }) })
1441
1452
  ] }, key);
@@ -1465,7 +1476,7 @@ function ChevronLeftIcon({ size: size3 = 20, strokeWidth = 1.75, ...rest }) {
1465
1476
  }
1466
1477
 
1467
1478
  // src/components/pagination/use-styles.ts
1468
- var import_react26 = require("react");
1479
+ var import_react27 = require("react");
1469
1480
 
1470
1481
  // src/components/pagination/use-styles.css.ts
1471
1482
  var ellipsis = "use-styles_ellipsis__1azgzoh3";
@@ -1477,7 +1488,7 @@ var root17 = "use-styles_root__1azgzoh0";
1477
1488
  // src/components/pagination/use-styles.ts
1478
1489
  function useStyles19() {
1479
1490
  const { themeClass } = useTheme();
1480
- return (0, import_react26.useMemo)(
1491
+ return (0, import_react27.useMemo)(
1481
1492
  () => ({
1482
1493
  root: [themeClass, root17].filter(Boolean).join(" "),
1483
1494
  pageBtnFor: (active2) => [pageBtn, active2 && pageActive].filter(Boolean).join(" "),
@@ -1552,10 +1563,10 @@ function Pagination({ count, page = 1, onChange, siblingCount = 1 }) {
1552
1563
  }
1553
1564
 
1554
1565
  // src/components/stepper/index.tsx
1555
- var import_react28 = require("react");
1566
+ var import_react29 = require("react");
1556
1567
 
1557
1568
  // src/components/stepper/use-styles.ts
1558
- var import_react27 = require("react");
1569
+ var import_react28 = require("react");
1559
1570
 
1560
1571
  // src/components/stepper/use-styles.css.ts
1561
1572
  var connector = "use-styles_connector__79pt4e7";
@@ -1570,7 +1581,7 @@ var step = "use-styles_step__79pt4e1";
1570
1581
  // src/components/stepper/use-styles.ts
1571
1582
  function useStyles20({ className }) {
1572
1583
  const { themeClass } = useTheme();
1573
- return (0, import_react27.useMemo)(() => {
1584
+ return (0, import_react28.useMemo)(() => {
1574
1585
  const root24 = [themeClass, root18, className].filter(Boolean).join(" ");
1575
1586
  const markerFor = (state) => [
1576
1587
  marker,
@@ -1591,7 +1602,7 @@ function Stepper({ steps, active: active2 = 0, className, ...rest }) {
1591
1602
  const isActive = state === "active";
1592
1603
  return (
1593
1604
  // biome-ignore lint/suspicious/noArrayIndexKey: steps are a static, ordered list with no stable id.
1594
- /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_react28.Fragment, { children: [
1605
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_react29.Fragment, { children: [
1595
1606
  /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: step2, "aria-current": isActive ? "step" : void 0, children: [
1596
1607
  /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: markerFor(state), children: state === "done" ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(CheckIcon, { size: 14 }) : index + 1 }),
1597
1608
  /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: labelFor(isActive), children: s.label })
@@ -1603,7 +1614,7 @@ function Stepper({ steps, active: active2 = 0, className, ...rest }) {
1603
1614
  }
1604
1615
 
1605
1616
  // src/components/tabs/use-styles.ts
1606
- var import_react29 = require("react");
1617
+ var import_react30 = require("react");
1607
1618
 
1608
1619
  // src/components/tabs/use-styles.css.ts
1609
1620
  var root19 = "use-styles_root__1l4m7t40";
@@ -1613,7 +1624,7 @@ var tabActive = "use-styles_tabActive__1l4m7t42";
1613
1624
  // src/components/tabs/use-styles.ts
1614
1625
  function useStyles21() {
1615
1626
  const { themeClass } = useTheme();
1616
- return (0, import_react29.useMemo)(() => {
1627
+ return (0, import_react30.useMemo)(() => {
1617
1628
  const root24 = [themeClass, root19].filter(Boolean).join(" ");
1618
1629
  const tabClass = (active2) => [tab, active2 && tabActive].filter(Boolean).join(" ");
1619
1630
  return { root: root24, tab, tabClass };
@@ -1642,10 +1653,10 @@ function Tabs({ items, value, onChange }) {
1642
1653
  }
1643
1654
 
1644
1655
  // src/components/menu/index.tsx
1645
- var import_react31 = require("react");
1656
+ var import_react32 = require("react");
1646
1657
 
1647
1658
  // src/components/menu/use-styles.ts
1648
- var import_react30 = require("react");
1659
+ var import_react31 = require("react");
1649
1660
 
1650
1661
  // src/components/menu/use-styles.css.ts
1651
1662
  var danger = "use-styles_danger__1uyxaj3";
@@ -1656,7 +1667,7 @@ var wrapper3 = "use-styles_wrapper__1uyxaj0";
1656
1667
  // src/components/menu/use-styles.ts
1657
1668
  function useStyles22() {
1658
1669
  const { themeClass } = useTheme();
1659
- return (0, import_react30.useMemo)(
1670
+ return (0, import_react31.useMemo)(
1660
1671
  () => ({
1661
1672
  wrapper: [themeClass, wrapper3].filter(Boolean).join(" "),
1662
1673
  list,
@@ -1675,10 +1686,10 @@ function assignRef(ref, value) {
1675
1686
  }
1676
1687
  function Menu({ trigger: trigger2, items }) {
1677
1688
  const { wrapper: wrapper4, list: list2, item: item3, dangerItem } = useStyles22();
1678
- const [open, setOpen] = (0, import_react31.useState)(false);
1679
- const rootRef = (0, import_react31.useRef)(null);
1680
- const listRef = (0, import_react31.useRef)(null);
1681
- const triggerRef = (0, import_react31.useRef)(null);
1689
+ const [open, setOpen] = (0, import_react32.useState)(false);
1690
+ const rootRef = (0, import_react32.useRef)(null);
1691
+ const listRef = (0, import_react32.useRef)(null);
1692
+ const triggerRef = (0, import_react32.useRef)(null);
1682
1693
  const getMenuItems = () => Array.from(listRef.current?.querySelectorAll('[role="menuitem"]') ?? []);
1683
1694
  const focusItemAt = (index) => {
1684
1695
  const menuItems = getMenuItems();
@@ -1690,7 +1701,7 @@ function Menu({ trigger: trigger2, items }) {
1690
1701
  setOpen(false);
1691
1702
  triggerRef.current?.focus();
1692
1703
  };
1693
- (0, import_react31.useEffect)(() => {
1704
+ (0, import_react32.useEffect)(() => {
1694
1705
  if (!open) return;
1695
1706
  listRef.current?.querySelector('[role="menuitem"]')?.focus();
1696
1707
  const onDocMouseDown = (event) => {
@@ -1746,7 +1757,7 @@ function Menu({ trigger: trigger2, items }) {
1746
1757
  triggerRef.current = node;
1747
1758
  assignRef(consumerRef, node);
1748
1759
  };
1749
- const clonedTrigger = (0, import_react31.cloneElement)(trigger2, {
1760
+ const clonedTrigger = (0, import_react32.cloneElement)(trigger2, {
1750
1761
  ref: mergedTriggerRef,
1751
1762
  "aria-haspopup": "menu",
1752
1763
  "aria-expanded": open,
@@ -1776,10 +1787,10 @@ function Menu({ trigger: trigger2, items }) {
1776
1787
  }
1777
1788
 
1778
1789
  // src/components/dialog/index.tsx
1779
- var import_react33 = require("react");
1790
+ var import_react34 = require("react");
1780
1791
 
1781
1792
  // src/components/dialog/use-styles.ts
1782
- var import_react32 = require("react");
1793
+ var import_react33 = require("react");
1783
1794
 
1784
1795
  // src/components/dialog/use-styles.css.ts
1785
1796
  var actions = "use-styles_actions__5tstu84";
@@ -1791,7 +1802,7 @@ var titleText2 = "use-styles_titleText__5tstu82";
1791
1802
  // src/components/dialog/use-styles.ts
1792
1803
  function useStyles23() {
1793
1804
  const { themeClass } = useTheme();
1794
- return (0, import_react32.useMemo)(
1805
+ return (0, import_react33.useMemo)(
1795
1806
  () => ({
1796
1807
  overlay: [themeClass, overlay].filter(Boolean).join(" "),
1797
1808
  surface,
@@ -1808,11 +1819,11 @@ var import_jsx_runtime35 = require("react/jsx-runtime");
1808
1819
  var FOCUSABLE = 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])';
1809
1820
  function Dialog({ open, onClose, title, actions: actions3, children }) {
1810
1821
  const { overlay: overlay2, surface: surface2, titleText: titleText3, body: body4, actions: actionsClass } = useStyles23();
1811
- const surfaceRef = (0, import_react33.useRef)(null);
1812
- const previouslyFocused = (0, import_react33.useRef)(null);
1813
- const generatedId = (0, import_react33.useId)();
1822
+ const surfaceRef = (0, import_react34.useRef)(null);
1823
+ const previouslyFocused = (0, import_react34.useRef)(null);
1824
+ const generatedId = (0, import_react34.useId)();
1814
1825
  const titleId = title != null ? generatedId : void 0;
1815
- (0, import_react33.useEffect)(() => {
1826
+ (0, import_react34.useEffect)(() => {
1816
1827
  if (!open) return;
1817
1828
  const onKeyDown = (event) => {
1818
1829
  if (event.key === "Escape") onClose();
@@ -1820,13 +1831,13 @@ function Dialog({ open, onClose, title, actions: actions3, children }) {
1820
1831
  document.addEventListener("keydown", onKeyDown);
1821
1832
  return () => document.removeEventListener("keydown", onKeyDown);
1822
1833
  }, [open, onClose]);
1823
- (0, import_react33.useEffect)(() => {
1834
+ (0, import_react34.useEffect)(() => {
1824
1835
  if (!open) return;
1825
1836
  previouslyFocused.current = document.activeElement;
1826
1837
  surfaceRef.current?.focus();
1827
1838
  return () => previouslyFocused.current?.focus?.();
1828
1839
  }, [open]);
1829
- (0, import_react33.useEffect)(() => {
1840
+ (0, import_react34.useEffect)(() => {
1830
1841
  if (!open) return;
1831
1842
  const previousOverflow = document.body.style.overflow;
1832
1843
  document.body.style.overflow = "hidden";
@@ -1885,7 +1896,7 @@ function Dialog({ open, onClose, title, actions: actions3, children }) {
1885
1896
  }
1886
1897
 
1887
1898
  // src/components/snackbar/use-styles.ts
1888
- var import_react34 = require("react");
1899
+ var import_react35 = require("react");
1889
1900
 
1890
1901
  // src/components/snackbar/use-styles.css.ts
1891
1902
  var closeBtn = "use-styles_closeBtn__ihzsep2";
@@ -1895,7 +1906,7 @@ var root20 = "use-styles_root__ihzsep0";
1895
1906
  // src/components/snackbar/use-styles.ts
1896
1907
  function useStyles24() {
1897
1908
  const { themeClass } = useTheme();
1898
- return (0, import_react34.useMemo)(
1909
+ return (0, import_react35.useMemo)(
1899
1910
  () => ({
1900
1911
  root: [themeClass, root20].filter(Boolean).join(" "),
1901
1912
  message,
@@ -1918,7 +1929,7 @@ function Snackbar({ open, message: message2, action, onClose }) {
1918
1929
  }
1919
1930
 
1920
1931
  // src/components/table/use-styles.ts
1921
- var import_react35 = require("react");
1932
+ var import_react36 = require("react");
1922
1933
 
1923
1934
  // src/components/table/use-styles.css.ts
1924
1935
  var alignRight = "use-styles_alignRight__1n2cz6i3";
@@ -1929,7 +1940,7 @@ var th = "use-styles_th__1n2cz6i1";
1929
1940
  // src/components/table/use-styles.ts
1930
1941
  function useStyles25({ className }) {
1931
1942
  const { themeClass } = useTheme();
1932
- const root24 = (0, import_react35.useMemo)(
1943
+ const root24 = (0, import_react36.useMemo)(
1933
1944
  () => [themeClass, root21, className].filter(Boolean).join(" "),
1934
1945
  [themeClass, className]
1935
1946
  );
@@ -1955,7 +1966,7 @@ function Table({
1955
1966
  }
1956
1967
 
1957
1968
  // src/components/app-bar/use-styles.ts
1958
- var import_react36 = require("react");
1969
+ var import_react37 = require("react");
1959
1970
 
1960
1971
  // src/components/app-bar/use-styles.css.ts
1961
1972
  var actions2 = "use-styles_actions__1h133nh2";
@@ -1965,7 +1976,7 @@ var root22 = "use-styles_root__1h133nh0";
1965
1976
  // src/components/app-bar/use-styles.ts
1966
1977
  function useStyles26({ className }) {
1967
1978
  const { themeClass } = useTheme();
1968
- const root24 = (0, import_react36.useMemo)(
1979
+ const root24 = (0, import_react37.useMemo)(
1969
1980
  () => [themeClass, root22, className].filter(Boolean).join(" "),
1970
1981
  [themeClass, className]
1971
1982
  );
@@ -1984,7 +1995,7 @@ function AppBar({ brand: brand2, actions: actions3, className, children, ...rest
1984
1995
  }
1985
1996
 
1986
1997
  // src/components/list-item/use-styles.ts
1987
- var import_react37 = require("react");
1998
+ var import_react38 = require("react");
1988
1999
 
1989
2000
  // src/components/list-item/use-styles.css.ts
1990
2001
  var content2 = "use-styles_content__kbreq13";
@@ -1996,7 +2007,7 @@ var trailing = "use-styles_trailing__kbreq14";
1996
2007
  // src/components/list-item/use-styles.ts
1997
2008
  function useStyles27({ selected: selected3, className }) {
1998
2009
  const { themeClass } = useTheme();
1999
- const root24 = (0, import_react37.useMemo)(
2010
+ const root24 = (0, import_react38.useMemo)(
2000
2011
  () => [themeClass, root23, selected3 && selected2, className].filter(Boolean).join(" "),
2001
2012
  [themeClass, selected3, className]
2002
2013
  );
@@ -2194,6 +2205,7 @@ var text = { eyebrow: "typography_text_eyebrow__1wmlzy0", display: "typography_t
2194
2205
  text,
2195
2206
  theme,
2196
2207
  themes,
2208
+ usePrevious,
2197
2209
  useTheme,
2198
2210
  useToggle
2199
2211
  });
package/dist/index.d.cts CHANGED
@@ -156,6 +156,9 @@ declare const themes: Record<SchemaName, Record<Mode, string>>;
156
156
  declare const schemaNames: readonly SchemaName[];
157
157
  declare const modeNames: readonly Mode[];
158
158
 
159
+ declare function usePrevious<T>(value: T, initial: T): T;
160
+ declare function usePrevious<T>(value: T, initial?: T): T | undefined;
161
+
159
162
  declare function useToggle(initial?: boolean): readonly [boolean, () => void, (value: boolean) => void];
160
163
 
161
164
  interface IconProps extends SVGProps<SVGSVGElement> {
@@ -509,4 +512,4 @@ interface ThemeProviderProps {
509
512
  declare function ThemeProvider({ children, defaultSchema, defaultMode, }: ThemeProviderProps): react.JSX.Element;
510
513
  declare function useTheme(): ThemeContextValue;
511
514
 
512
- export { Accordion, type AccordionItem, type AccordionProps, Alert, type AlertProps, type AlertSeverity, AppBar, type AppBarProps, Avatar, type AvatarProps, type AvatarSize, Badge, type BadgeProps, type BadgeTone, Breadcrumbs, type BreadcrumbsProps, Button, type ButtonProps, type ButtonSize, type ButtonTone, type ButtonVariant, Card, type CardProps, type CardSectionProps, CheckIcon, Checkbox, type CheckboxProps, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, Chip, type ChipProps, type ChipTone, CircleCheckIcon, CircleXIcon, type Crumb, Dialog, type DialogProps, Divider, type DividerProps, EyeIcon, EyeOffIcon, type Icon, IconButton, type IconButtonProps, type IconButtonTone, type IconProps, InfoIcon, ListItem, type ListItemProps, Menu, type MenuItemDef, type MenuProps, MinusIcon, type Mode, MoreHorizontalIcon, Pagination, type PaginationProps, PlusIcon, Progress, type ProgressProps, type ProgressVariant, Radio, type RadioProps, type SchemaName, SearchIcon, Select, type SelectOption, type SelectProps, Slider, type SliderProps, Snackbar, type SnackbarProps, type Step, Stepper, type StepperProps, Switch, type SwitchProps, type TabItem, Table, type TableColumn, type TableProps, Tabs, type TabsProps, TextField, type TextFieldProps, ThemeProvider, type ThemeProviderProps, Tooltip, type TooltipPlacement, type TooltipProps, TriangleAlertIcon, XIcon, modeNames, schemaNames, text, vars as theme, themes, useTheme, useToggle };
515
+ export { Accordion, type AccordionItem, type AccordionProps, Alert, type AlertProps, type AlertSeverity, AppBar, type AppBarProps, Avatar, type AvatarProps, type AvatarSize, Badge, type BadgeProps, type BadgeTone, Breadcrumbs, type BreadcrumbsProps, Button, type ButtonProps, type ButtonSize, type ButtonTone, type ButtonVariant, Card, type CardProps, type CardSectionProps, CheckIcon, Checkbox, type CheckboxProps, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, Chip, type ChipProps, type ChipTone, CircleCheckIcon, CircleXIcon, type Crumb, Dialog, type DialogProps, Divider, type DividerProps, EyeIcon, EyeOffIcon, type Icon, IconButton, type IconButtonProps, type IconButtonTone, type IconProps, InfoIcon, ListItem, type ListItemProps, Menu, type MenuItemDef, type MenuProps, MinusIcon, type Mode, MoreHorizontalIcon, Pagination, type PaginationProps, PlusIcon, Progress, type ProgressProps, type ProgressVariant, Radio, type RadioProps, type SchemaName, SearchIcon, Select, type SelectOption, type SelectProps, Slider, type SliderProps, Snackbar, type SnackbarProps, type Step, Stepper, type StepperProps, Switch, type SwitchProps, type TabItem, Table, type TableColumn, type TableProps, Tabs, type TabsProps, TextField, type TextFieldProps, ThemeProvider, type ThemeProviderProps, Tooltip, type TooltipPlacement, type TooltipProps, TriangleAlertIcon, XIcon, modeNames, schemaNames, text, vars as theme, themes, usePrevious, useTheme, useToggle };
package/dist/index.d.ts CHANGED
@@ -156,6 +156,9 @@ declare const themes: Record<SchemaName, Record<Mode, string>>;
156
156
  declare const schemaNames: readonly SchemaName[];
157
157
  declare const modeNames: readonly Mode[];
158
158
 
159
+ declare function usePrevious<T>(value: T, initial: T): T;
160
+ declare function usePrevious<T>(value: T, initial?: T): T | undefined;
161
+
159
162
  declare function useToggle(initial?: boolean): readonly [boolean, () => void, (value: boolean) => void];
160
163
 
161
164
  interface IconProps extends SVGProps<SVGSVGElement> {
@@ -509,4 +512,4 @@ interface ThemeProviderProps {
509
512
  declare function ThemeProvider({ children, defaultSchema, defaultMode, }: ThemeProviderProps): react.JSX.Element;
510
513
  declare function useTheme(): ThemeContextValue;
511
514
 
512
- export { Accordion, type AccordionItem, type AccordionProps, Alert, type AlertProps, type AlertSeverity, AppBar, type AppBarProps, Avatar, type AvatarProps, type AvatarSize, Badge, type BadgeProps, type BadgeTone, Breadcrumbs, type BreadcrumbsProps, Button, type ButtonProps, type ButtonSize, type ButtonTone, type ButtonVariant, Card, type CardProps, type CardSectionProps, CheckIcon, Checkbox, type CheckboxProps, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, Chip, type ChipProps, type ChipTone, CircleCheckIcon, CircleXIcon, type Crumb, Dialog, type DialogProps, Divider, type DividerProps, EyeIcon, EyeOffIcon, type Icon, IconButton, type IconButtonProps, type IconButtonTone, type IconProps, InfoIcon, ListItem, type ListItemProps, Menu, type MenuItemDef, type MenuProps, MinusIcon, type Mode, MoreHorizontalIcon, Pagination, type PaginationProps, PlusIcon, Progress, type ProgressProps, type ProgressVariant, Radio, type RadioProps, type SchemaName, SearchIcon, Select, type SelectOption, type SelectProps, Slider, type SliderProps, Snackbar, type SnackbarProps, type Step, Stepper, type StepperProps, Switch, type SwitchProps, type TabItem, Table, type TableColumn, type TableProps, Tabs, type TabsProps, TextField, type TextFieldProps, ThemeProvider, type ThemeProviderProps, Tooltip, type TooltipPlacement, type TooltipProps, TriangleAlertIcon, XIcon, modeNames, schemaNames, text, vars as theme, themes, useTheme, useToggle };
515
+ export { Accordion, type AccordionItem, type AccordionProps, Alert, type AlertProps, type AlertSeverity, AppBar, type AppBarProps, Avatar, type AvatarProps, type AvatarSize, Badge, type BadgeProps, type BadgeTone, Breadcrumbs, type BreadcrumbsProps, Button, type ButtonProps, type ButtonSize, type ButtonTone, type ButtonVariant, Card, type CardProps, type CardSectionProps, CheckIcon, Checkbox, type CheckboxProps, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, Chip, type ChipProps, type ChipTone, CircleCheckIcon, CircleXIcon, type Crumb, Dialog, type DialogProps, Divider, type DividerProps, EyeIcon, EyeOffIcon, type Icon, IconButton, type IconButtonProps, type IconButtonTone, type IconProps, InfoIcon, ListItem, type ListItemProps, Menu, type MenuItemDef, type MenuProps, MinusIcon, type Mode, MoreHorizontalIcon, Pagination, type PaginationProps, PlusIcon, Progress, type ProgressProps, type ProgressVariant, Radio, type RadioProps, type SchemaName, SearchIcon, Select, type SelectOption, type SelectProps, Slider, type SliderProps, Snackbar, type SnackbarProps, type Step, Stepper, type StepperProps, Switch, type SwitchProps, type TabItem, Table, type TableColumn, type TableProps, Tabs, type TabsProps, TextField, type TextFieldProps, ThemeProvider, type ThemeProviderProps, Tooltip, type TooltipPlacement, type TooltipProps, TriangleAlertIcon, XIcon, modeNames, schemaNames, text, vars as theme, themes, usePrevious, useTheme, useToggle };
package/dist/index.js CHANGED
@@ -4,6 +4,16 @@ var schemaNames = ["tinta"];
4
4
  var themes = { tinta: { light: "theme_themes_tinta_light__e3grur2v", dark: "theme_themes_tinta_dark__e3grur2w", sepia: "theme_themes_tinta_sepia__e3grur2x", contrast: "theme_themes_tinta_contrast__e3grur2y" } };
5
5
  var vars = { font: { display: "var(--font-display__e3grur0)", text: "var(--font-text__e3grur1)", mono: "var(--font-mono__e3grur2)", black: "var(--font-black__e3grur3)" }, text: { eyebrow: { size: "var(--text-eyebrow-size__e3grur4)", lineHeight: "var(--text-eyebrow-lineHeight__e3grur5)", weight: "var(--text-eyebrow-weight__e3grur6)", letterSpacing: "var(--text-eyebrow-letterSpacing__e3grur7)" }, display: { size: "var(--text-display-size__e3grur8)", lineHeight: "var(--text-display-lineHeight__e3grur9)", weight: "var(--text-display-weight__e3grura)", letterSpacing: "var(--text-display-letterSpacing__e3grurb)" }, h1: { size: "var(--text-h1-size__e3grurc)", lineHeight: "var(--text-h1-lineHeight__e3grurd)", weight: "var(--text-h1-weight__e3grure)", letterSpacing: "var(--text-h1-letterSpacing__e3grurf)" }, h2: { size: "var(--text-h2-size__e3grurg)", lineHeight: "var(--text-h2-lineHeight__e3grurh)", weight: "var(--text-h2-weight__e3gruri)", letterSpacing: "var(--text-h2-letterSpacing__e3grurj)" }, h3: { size: "var(--text-h3-size__e3grurk)", lineHeight: "var(--text-h3-lineHeight__e3grurl)", weight: "var(--text-h3-weight__e3grurm)", letterSpacing: "var(--text-h3-letterSpacing__e3grurn)" }, h4: { size: "var(--text-h4-size__e3gruro)", lineHeight: "var(--text-h4-lineHeight__e3grurp)", weight: "var(--text-h4-weight__e3grurq)", letterSpacing: "var(--text-h4-letterSpacing__e3grurr)" }, body: { size: "var(--text-body-size__e3grurs)", lineHeight: "var(--text-body-lineHeight__e3grurt)", weight: "var(--text-body-weight__e3gruru)", letterSpacing: "var(--text-body-letterSpacing__e3grurv)" }, lead: { size: "var(--text-lead-size__e3grurw)", lineHeight: "var(--text-lead-lineHeight__e3grurx)", weight: "var(--text-lead-weight__e3grury)", letterSpacing: "var(--text-lead-letterSpacing__e3grurz)" }, small: { size: "var(--text-small-size__e3grur10)", lineHeight: "var(--text-small-lineHeight__e3grur11)", weight: "var(--text-small-weight__e3grur12)", letterSpacing: "var(--text-small-letterSpacing__e3grur13)" }, caption: { size: "var(--text-caption-size__e3grur14)", lineHeight: "var(--text-caption-lineHeight__e3grur15)", weight: "var(--text-caption-weight__e3grur16)", letterSpacing: "var(--text-caption-letterSpacing__e3grur17)" } }, space: { none: "var(--space-none__e3grur18)", xs: "var(--space-xs__e3grur19)", sm: "var(--space-sm__e3grur1a)", md: "var(--space-md__e3grur1b)", lg: "var(--space-lg__e3grur1c)", xl: "var(--space-xl__e3grur1d)", "2xl": "var(--space-2xl__e3grur1e)", "3xl": "var(--space-3xl__e3grur1f)", "4xl": "var(--space-4xl__e3grur1g)", "5xl": "var(--space-5xl__e3grur1h)" }, radius: { none: "var(--radius-none__e3grur1i)", sm: "var(--radius-sm__e3grur1j)", md: "var(--radius-md__e3grur1k)", lg: "var(--radius-lg__e3grur1l)", base: "var(--radius-base__e3grur1m)", full: "var(--radius-full__e3grur1n)" }, border: { hair: "var(--border-hair__e3grur1o)", rule: "var(--border-rule__e3grur1p)", heavy: "var(--border-heavy__e3grur1q)" }, tracking: { tight: "var(--tracking-tight__e3grur1r)", normal: "var(--tracking-normal__e3grur1s)", wide: "var(--tracking-wide__e3grur1t)", wider: "var(--tracking-wider__e3grur1u)", widest: "var(--tracking-widest__e3grur1v)" }, leading: { tight: "var(--leading-tight__e3grur1w)", snug: "var(--leading-snug__e3grur1x)", normal: "var(--leading-normal__e3grur1y)", relaxed: "var(--leading-relaxed__e3grur1z)" }, weight: { light: "var(--weight-light__e3grur20)", regular: "var(--weight-regular__e3grur21)", medium: "var(--weight-medium__e3grur22)", semibold: "var(--weight-semibold__e3grur23)", bold: "var(--weight-bold__e3grur24)" }, dur: { fast: "var(--dur-fast__e3grur25)", base: "var(--dur-base__e3grur26)", slow: "var(--dur-slow__e3grur27)" }, ease: { ink: "var(--ease-ink__e3grur28)" }, shadow: { sm: "var(--shadow-sm__e3grur29)", md: "var(--shadow-md__e3grur2a)", lg: "var(--shadow-lg__e3grur2b)" }, color: { bg1: "var(--color-bg1__e3grur2c)", bg2: "var(--color-bg2__e3grur2d)", bg3: "var(--color-bg3__e3grur2e)", bgInset: "var(--color-bgInset__e3grur2f)", fg1: "var(--color-fg1__e3grur2g)", fg2: "var(--color-fg2__e3grur2h)", fg3: "var(--color-fg3__e3grur2i)", fgOnAccent: "var(--color-fgOnAccent__e3grur2j)", border1: "var(--color-border1__e3grur2k)", border2: "var(--color-border2__e3grur2l)", borderStrong: "var(--color-borderStrong__e3grur2m)", accent: "var(--color-accent__e3grur2n)", accentHover: "var(--color-accentHover__e3grur2o)", accentSoft: "var(--color-accentSoft__e3grur2p)", ok: "var(--color-ok__e3grur2q)", warn: "var(--color-warn__e3grur2r)", danger: "var(--color-danger__e3grur2s)", info: "var(--color-info__e3grur2t)", scrim: "var(--color-scrim__e3grur2u)" } };
6
6
 
7
+ // src/hooks/use-previous/index.ts
8
+ import { useEffect, useRef } from "react";
9
+ function usePrevious(value, initial) {
10
+ const ref = useRef(initial);
11
+ useEffect(() => {
12
+ ref.current = value;
13
+ }, [value]);
14
+ return ref.current;
15
+ }
16
+
7
17
  // src/hooks/use-toggle/index.ts
8
18
  import { useCallback, useState } from "react";
9
19
  function useToggle(initial = false) {
@@ -984,7 +994,7 @@ function Tooltip({ label: label7, children, placement: placement2 }) {
984
994
  }
985
995
 
986
996
  // src/components/select/index.tsx
987
- import { useEffect, useId as useId3, useRef, useState as useState5 } from "react";
997
+ import { useEffect as useEffect2, useId as useId3, useRef as useRef2, useState as useState5 } from "react";
988
998
 
989
999
  // src/components/icons/chevron-down/index.tsx
990
1000
  import { jsx as jsx24 } from "react/jsx-runtime";
@@ -1047,7 +1057,7 @@ import { jsx as jsx25, jsxs as jsxs18 } from "react/jsx-runtime";
1047
1057
  function Select({ options, value, onChange, placeholder: placeholder2, label: label7, disabled: disabled3 }) {
1048
1058
  const [open, setOpen] = useState5(false);
1049
1059
  const [activeIndex, setActiveIndex] = useState5(0);
1050
- const rootRef = useRef(null);
1060
+ const rootRef = useRef2(null);
1051
1061
  const baseId = useId3();
1052
1062
  const labelId = `${baseId}-label`;
1053
1063
  const optionId = (index) => `${baseId}-option-${index}`;
@@ -1060,7 +1070,7 @@ function Select({ options, value, onChange, placeholder: placeholder2, label: la
1060
1070
  menu: menu2,
1061
1071
  optionClass
1062
1072
  } = useStyles15({ open });
1063
- useEffect(() => {
1073
+ useEffect2(() => {
1064
1074
  if (!open) return;
1065
1075
  const onPointerDown = (event) => {
1066
1076
  if (rootRef.current && !rootRef.current.contains(event.target)) {
@@ -1571,8 +1581,8 @@ function Tabs({ items, value, onChange }) {
1571
1581
  // src/components/menu/index.tsx
1572
1582
  import {
1573
1583
  cloneElement as cloneElement2,
1574
- useEffect as useEffect2,
1575
- useRef as useRef2,
1584
+ useEffect as useEffect3,
1585
+ useRef as useRef3,
1576
1586
  useState as useState7
1577
1587
  } from "react";
1578
1588
 
@@ -1608,9 +1618,9 @@ function assignRef(ref, value) {
1608
1618
  function Menu({ trigger: trigger2, items }) {
1609
1619
  const { wrapper: wrapper4, list: list2, item: item3, dangerItem } = useStyles22();
1610
1620
  const [open, setOpen] = useState7(false);
1611
- const rootRef = useRef2(null);
1612
- const listRef = useRef2(null);
1613
- const triggerRef = useRef2(null);
1621
+ const rootRef = useRef3(null);
1622
+ const listRef = useRef3(null);
1623
+ const triggerRef = useRef3(null);
1614
1624
  const getMenuItems = () => Array.from(listRef.current?.querySelectorAll('[role="menuitem"]') ?? []);
1615
1625
  const focusItemAt = (index) => {
1616
1626
  const menuItems = getMenuItems();
@@ -1622,7 +1632,7 @@ function Menu({ trigger: trigger2, items }) {
1622
1632
  setOpen(false);
1623
1633
  triggerRef.current?.focus();
1624
1634
  };
1625
- useEffect2(() => {
1635
+ useEffect3(() => {
1626
1636
  if (!open) return;
1627
1637
  listRef.current?.querySelector('[role="menuitem"]')?.focus();
1628
1638
  const onDocMouseDown = (event) => {
@@ -1709,9 +1719,9 @@ function Menu({ trigger: trigger2, items }) {
1709
1719
 
1710
1720
  // src/components/dialog/index.tsx
1711
1721
  import {
1712
- useEffect as useEffect3,
1722
+ useEffect as useEffect4,
1713
1723
  useId as useId4,
1714
- useRef as useRef3
1724
+ useRef as useRef4
1715
1725
  } from "react";
1716
1726
 
1717
1727
  // src/components/dialog/use-styles.ts
@@ -1744,11 +1754,11 @@ import { jsx as jsx35, jsxs as jsxs25 } from "react/jsx-runtime";
1744
1754
  var FOCUSABLE = 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])';
1745
1755
  function Dialog({ open, onClose, title, actions: actions3, children }) {
1746
1756
  const { overlay: overlay2, surface: surface2, titleText: titleText3, body: body4, actions: actionsClass } = useStyles23();
1747
- const surfaceRef = useRef3(null);
1748
- const previouslyFocused = useRef3(null);
1757
+ const surfaceRef = useRef4(null);
1758
+ const previouslyFocused = useRef4(null);
1749
1759
  const generatedId = useId4();
1750
1760
  const titleId = title != null ? generatedId : void 0;
1751
- useEffect3(() => {
1761
+ useEffect4(() => {
1752
1762
  if (!open) return;
1753
1763
  const onKeyDown = (event) => {
1754
1764
  if (event.key === "Escape") onClose();
@@ -1756,13 +1766,13 @@ function Dialog({ open, onClose, title, actions: actions3, children }) {
1756
1766
  document.addEventListener("keydown", onKeyDown);
1757
1767
  return () => document.removeEventListener("keydown", onKeyDown);
1758
1768
  }, [open, onClose]);
1759
- useEffect3(() => {
1769
+ useEffect4(() => {
1760
1770
  if (!open) return;
1761
1771
  previouslyFocused.current = document.activeElement;
1762
1772
  surfaceRef.current?.focus();
1763
1773
  return () => previouslyFocused.current?.focus?.();
1764
1774
  }, [open]);
1765
- useEffect3(() => {
1775
+ useEffect4(() => {
1766
1776
  if (!open) return;
1767
1777
  const previousOverflow = document.body.style.overflow;
1768
1778
  document.body.style.overflow = "hidden";
@@ -2129,6 +2139,7 @@ export {
2129
2139
  text,
2130
2140
  vars as theme,
2131
2141
  themes,
2142
+ usePrevious,
2132
2143
  useTheme,
2133
2144
  useToggle
2134
2145
  };
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@octavius2929-personal/design-system",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "Librería de componentes React con estilos en TypeScript (vanilla-extract) y theming por schema × modo (light/dark/sepia/contrast).",
5
5
  "license": "MIT",
6
6
  "author": "justinoctavius <justinoctavio2001@gmail.com>",
7
7
  "repository": {
8
8
  "type": "git",
9
- "url": "git+https://github.com/justinoctavius/design-system.git"
9
+ "url": "git+https://github.com/proyectos-octavio/design-system.git"
10
10
  },
11
- "homepage": "https://github.com/justinoctavius/design-system#readme",
12
- "bugs": "https://github.com/justinoctavius/design-system/issues",
11
+ "homepage": "https://github.com/proyectos-octavio/design-system#readme",
12
+ "bugs": "https://github.com/proyectos-octavio/design-system/issues",
13
13
  "keywords": [
14
14
  "react",
15
15
  "components",
@@ -36,8 +36,13 @@
36
36
  },
37
37
  "./styles.css": "./dist/index.css"
38
38
  },
39
- "sideEffects": ["**/*.css", "**/*.css.ts"],
40
- "files": ["dist"],
39
+ "sideEffects": [
40
+ "**/*.css",
41
+ "**/*.css.ts"
42
+ ],
43
+ "files": [
44
+ "dist"
45
+ ],
41
46
  "publishConfig": {
42
47
  "access": "public"
43
48
  },
@@ -52,7 +57,7 @@
52
57
  "lint:fix": "biome check --write .",
53
58
  "storybook": "storybook dev -p 6006",
54
59
  "storybook:build": "storybook build",
55
- "prepublishOnly": "npm run lint && npm run typecheck && npm test && npm run build",
60
+ "prepublishOnly": "npm run typecheck && npm test && npm run build",
56
61
  "prepare": "husky"
57
62
  },
58
63
  "lint-staged": {
@@ -85,6 +90,7 @@
85
90
  "lint-staged": "^15.2.0",
86
91
  "react": "^18.3.0",
87
92
  "react-dom": "^18.3.0",
93
+ "semantic-release": "^24.0.0",
88
94
  "storybook": "^8.6.18",
89
95
  "tsup": "^8.0.0",
90
96
  "typescript": "^5.5.0",