doct-ui-auth-kit 1.0.14 → 1.0.15

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/pages.js CHANGED
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { L as e, a as n, M as g, b as s, O as o, c as t, R as p, d as L, S as r, e as P } from "./signup-page-ChXnxtSS.js";
2
+ import { L as e, a as n, M as g, b as s, O as o, c as t, R as p, d as L, S as r, e as P } from "./signup-page-LsYojX4-.js";
3
3
  export {
4
4
  e as LoginEntry,
5
5
  n as LoginEntryPage,
@@ -2,7 +2,7 @@
2
2
  import { jsx as m, jsxs as k, Fragment as $e } from "react/jsx-runtime";
3
3
  import { DoctButton as B, DoctTypography as R, DoctPhoneInput as Ze, DoctLabeledInput as Qe, DoctCircularProgress as ve, DoctOtpInput as et } from "docthub-core-components";
4
4
  import { MdArrowBack as tt, MdChevronRight as nt } from "react-icons/md";
5
- import q, { createContext as lt, useContext as it, useState as K, useEffect as te, useRef as le } from "react";
5
+ import Y, { createContext as lt, useContext as it, useState as K, useEffect as te, useRef as le } from "react";
6
6
  import { useFormContext as ne, Controller as de, useForm as ye, FormProvider as Ce } from "react-hook-form";
7
7
  import { z as j } from "zod";
8
8
  var ae = { exports: {} }, ge = {};
@@ -10,7 +10,7 @@ var Oe;
10
10
  function ot() {
11
11
  if (Oe) return ge;
12
12
  Oe = 1;
13
- var n = q.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;
13
+ var n = Y.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;
14
14
  return ge.c = function(e) {
15
15
  return n.H.useMemoCache(e);
16
16
  }, ge;
@@ -19,7 +19,7 @@ var pe = {};
19
19
  var Te;
20
20
  function rt() {
21
21
  return Te || (Te = 1, process.env.NODE_ENV !== "production" && (function() {
22
- var n = q.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;
22
+ var n = Y.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;
23
23
  pe.c = function(e) {
24
24
  var t = n.H;
25
25
  return t === null && console.error(
@@ -277,7 +277,7 @@ function St(n) {
277
277
  let a;
278
278
  return e[7] !== o || e[8] !== s ? (a = /* @__PURE__ */ m("footer", { className: o, children: s }), e[7] = o, e[8] = s, e[9] = a) : a = e[9], a;
279
279
  }
280
- const H = {
280
+ const q = {
281
281
  Root: ht,
282
282
  Header: gt,
283
283
  Main: Ct,
@@ -436,32 +436,32 @@ function ie(n) {
436
436
  e[7] !== w || e[8] !== r ? (L = () => r ? typeof r == "string" ? /* @__PURE__ */ m(R, { variant: "body1", align: w, className: "text-neutral-black", children: r }) : r : null, e[7] = w, e[8] = r, e[9] = L) : L = e[9];
437
437
  const M = L;
438
438
  let I;
439
- e[10] !== a ? (I = a && /* @__PURE__ */ m(H.Header, { children: a }), e[10] = a, e[11] = I) : I = e[11];
439
+ e[10] !== a ? (I = a && /* @__PURE__ */ m(q.Header, { children: a }), e[10] = a, e[11] = I) : I = e[11];
440
440
  let U;
441
441
  e[12] !== $ ? (U = $(), e[12] = $, e[13] = U) : U = e[13];
442
- let z;
443
- e[14] !== w || e[15] !== U ? (z = /* @__PURE__ */ m(H.Logo, { align: w, children: U }), e[14] = w, e[15] = U, e[16] = z) : z = e[16];
444
442
  let G;
445
- e[17] !== w || e[18] !== T || e[19] !== o ? (G = o && /* @__PURE__ */ m(H.Title, { align: w, children: T() }), e[17] = w, e[18] = T, e[19] = o, e[20] = G) : G = e[20];
443
+ e[14] !== w || e[15] !== U ? (G = /* @__PURE__ */ m(q.Logo, { align: w, children: U }), e[14] = w, e[15] = U, e[16] = G) : G = e[16];
446
444
  let V;
447
- e[21] !== w || e[22] !== r || e[23] !== M ? (V = r && /* @__PURE__ */ m(H.Description, { align: w, children: M() }), e[21] = w, e[22] = r, e[23] = M, e[24] = V) : V = e[24];
445
+ e[17] !== w || e[18] !== T || e[19] !== o ? (V = o && /* @__PURE__ */ m(q.Title, { align: w, children: T() }), e[17] = w, e[18] = T, e[19] = o, e[20] = V) : V = e[20];
446
+ let H;
447
+ e[21] !== w || e[22] !== r || e[23] !== M ? (H = r && /* @__PURE__ */ m(q.Description, { align: w, children: M() }), e[21] = w, e[22] = r, e[23] = M, e[24] = H) : H = e[24];
448
448
  let W;
449
- e[25] !== t ? (W = /* @__PURE__ */ m(H.Body, { children: t }), e[25] = t, e[26] = W) : W = e[26];
450
- let Y;
451
- e[27] !== z || e[28] !== G || e[29] !== V || e[30] !== W || e[31] !== E ? (Y = /* @__PURE__ */ k(H.Main, { sm: E, children: [
452
- z,
449
+ e[25] !== t ? (W = /* @__PURE__ */ m(q.Body, { children: t }), e[25] = t, e[26] = W) : W = e[26];
450
+ let z;
451
+ e[27] !== G || e[28] !== V || e[29] !== H || e[30] !== W || e[31] !== E ? (z = /* @__PURE__ */ k(q.Main, { sm: E, children: [
453
452
  G,
454
453
  V,
454
+ H,
455
455
  W
456
- ] }), e[27] = z, e[28] = G, e[29] = V, e[30] = W, e[31] = E, e[32] = Y) : Y = e[32];
456
+ ] }), e[27] = G, e[28] = V, e[29] = H, e[30] = W, e[31] = E, e[32] = z) : z = e[32];
457
457
  let J;
458
- e[33] !== s ? (J = s && /* @__PURE__ */ m(H.Footer, { children: s }), e[33] = s, e[34] = J) : J = e[34];
458
+ e[33] !== s ? (J = s && /* @__PURE__ */ m(q.Footer, { children: s }), e[33] = s, e[34] = J) : J = e[34];
459
459
  let oe;
460
- e[35] !== I || e[36] !== Y || e[37] !== J ? (oe = /* @__PURE__ */ k($e, { children: [
460
+ e[35] !== I || e[36] !== z || e[37] !== J ? (oe = /* @__PURE__ */ k($e, { children: [
461
461
  I,
462
- Y,
462
+ z,
463
463
  J
464
- ] }), e[35] = I, e[36] = Y, e[37] = J, e[38] = oe) : oe = e[38];
464
+ ] }), e[35] = I, e[36] = z, e[37] = J, e[38] = oe) : oe = e[38];
465
465
  const X = oe;
466
466
  if (C === "withSlider") {
467
467
  let Q;
@@ -469,7 +469,7 @@ function ie(n) {
469
469
  className: y
470
470
  }, e[39] = y, e[40] = Q) : Q = e[40];
471
471
  let ee;
472
- e[41] !== X || e[42] !== x || e[43] !== O ? (ee = /* @__PURE__ */ m(H.Root, { variant: O, maxWidth: x, className: "bg-transparent", children: X }), e[41] = X, e[42] = x, e[43] = O, e[44] = ee) : ee = e[44];
472
+ e[41] !== X || e[42] !== x || e[43] !== O ? (ee = /* @__PURE__ */ m(q.Root, { variant: O, maxWidth: x, className: "bg-transparent", children: X }), e[41] = X, e[42] = x, e[43] = O, e[44] = ee) : ee = e[44];
473
473
  let se;
474
474
  return e[45] !== S || e[46] !== N || e[47] !== f || e[48] !== Q || e[49] !== ee ? (se = /* @__PURE__ */ m(wt, { sliderImages: N, sliderAutoPlayInterval: S, sliderTitles: f, ...Q, children: ee }), e[45] = S, e[46] = N, e[47] = f, e[48] = Q, e[49] = ee, e[50] = se) : se = e[50], se;
475
475
  }
@@ -478,7 +478,7 @@ function ie(n) {
478
478
  className: y
479
479
  }, e[51] = y, e[52] = Z) : Z = e[52];
480
480
  let re;
481
- return e[53] !== X || e[54] !== x || e[55] !== O || e[56] !== Z ? (re = /* @__PURE__ */ m(H.Root, { variant: O, maxWidth: x, ...Z, children: X }), e[53] = X, e[54] = x, e[55] = O, e[56] = Z, e[57] = re) : re = e[57], re;
481
+ return e[53] !== X || e[54] !== x || e[55] !== O || e[56] !== Z ? (re = /* @__PURE__ */ m(q.Root, { variant: O, maxWidth: x, ...Z, children: X }), e[53] = X, e[54] = x, e[55] = O, e[56] = Z, e[57] = re) : re = e[57], re;
482
482
  }
483
483
  function _t(n) {
484
484
  return {
@@ -900,7 +900,7 @@ var qe = {
900
900
  className: void 0,
901
901
  style: void 0,
902
902
  attr: void 0
903
- }, ke = q.createContext && /* @__PURE__ */ q.createContext(qe), Vt = ["attr", "size", "title"];
903
+ }, ke = Y.createContext && /* @__PURE__ */ Y.createContext(qe), Vt = ["attr", "size", "title"];
904
904
  function Ht(n, e) {
905
905
  if (n == null) return {};
906
906
  var t = qt(n, e), l, i;
@@ -970,12 +970,12 @@ function Jt(n, e) {
970
970
  return (e === "string" ? String : Number)(n);
971
971
  }
972
972
  function Ye(n) {
973
- return n && n.map((e, t) => /* @__PURE__ */ q.createElement(e.tag, he({
973
+ return n && n.map((e, t) => /* @__PURE__ */ Y.createElement(e.tag, he({
974
974
  key: t
975
975
  }, e.attr), Ye(e.child)));
976
976
  }
977
977
  function Ke(n) {
978
- return (e) => /* @__PURE__ */ q.createElement(Xt, me({
978
+ return (e) => /* @__PURE__ */ Y.createElement(Xt, me({
979
979
  attr: he({}, n.attr)
980
980
  }, e), Ye(n.child));
981
981
  }
@@ -986,7 +986,7 @@ function Xt(n) {
986
986
  size: i,
987
987
  title: o
988
988
  } = n, r = Ht(n, Vt), s = i || t.size || "1em", a;
989
- return t.className && (a = t.className), n.className && (a = (a ? a + " " : "") + n.className), /* @__PURE__ */ q.createElement("svg", me({
989
+ return t.className && (a = t.className), n.className && (a = (a ? a + " " : "") + n.className), /* @__PURE__ */ Y.createElement("svg", me({
990
990
  stroke: "currentColor",
991
991
  fill: "currentColor",
992
992
  strokeWidth: "0"
@@ -998,9 +998,9 @@ function Xt(n) {
998
998
  height: s,
999
999
  width: s,
1000
1000
  xmlns: "http://www.w3.org/2000/svg"
1001
- }), o && /* @__PURE__ */ q.createElement("title", null, o), n.children);
1001
+ }), o && /* @__PURE__ */ Y.createElement("title", null, o), n.children);
1002
1002
  };
1003
- return ke !== void 0 ? /* @__PURE__ */ q.createElement(ke.Consumer, null, (t) => e(t)) : e(qe);
1003
+ return ke !== void 0 ? /* @__PURE__ */ Y.createElement(ke.Consumer, null, (t) => e(t)) : e(qe);
1004
1004
  }
1005
1005
  function Zt(n) {
1006
1006
  return Ke({ attr: { viewBox: "0 0 384 512" }, child: [{ tag: "path", attr: { d: "M318.7 268.7c-.2-36.7 16.4-64.4 50-84.8-18.8-26.9-47.2-41.7-84.7-44.6-35.5-2.8-74.3 20.7-88.5 20.7-15 0-49.4-19.7-76.4-19.7C63.3 141.2 4 184.8 4 273.5q0 39.3 14.4 81.2c12.8 36.7 59 126.7 107.2 125.2 25.2-.6 43-17.9 75.8-17.9 31.8 0 48.3 17.9 76.4 17.9 48.6-.7 90.4-82.5 102.6-119.3-65.2-30.7-61.7-90-61.7-91.9zm-56.6-164.2c27.3-32.4 24.8-61.9 24-72.5-24.1 1.4-52 16.4-67.9 34.9-17.5 19.8-27.8 44.3-25.6 71.9 26.1 2 49.9-11.4 69.5-34.3z" }, child: [] }] })(n);
@@ -1097,26 +1097,27 @@ function rn(n) {
1097
1097
  e[4] !== f ? (N = () => {
1098
1098
  if (f <= 0)
1099
1099
  return;
1100
- const z = setInterval(() => {
1100
+ const G = setInterval(() => {
1101
1101
  p(an);
1102
1102
  }, 1e3);
1103
- return () => clearInterval(z);
1103
+ return () => clearInterval(G);
1104
1104
  }, S = [f], e[4] = f, e[5] = N, e[6] = S) : (N = e[5], S = e[6]), te(N, S);
1105
1105
  let x;
1106
- e[7] !== C || e[8] !== s || e[9] !== l || e[10] !== r || e[11] !== o || e[12] !== a ? (x = async (z) => {
1107
- const G = He.safeParse(z);
1108
- if (!G.success) {
1109
- const W = G.error.issues[0]?.message ?? "Invalid OTP";
1106
+ e[7] !== C || e[8] !== s || e[9] !== l || e[10] !== r || e[11] !== o || e[12] !== a ? (x = async (G) => {
1107
+ C.clearErrors("otp");
1108
+ const V = He.safeParse(G);
1109
+ if (!V.success) {
1110
+ const W = V.error.issues[0]?.message ?? "Invalid OTP";
1110
1111
  C.setError("otp", {
1111
1112
  message: W
1112
1113
  });
1113
1114
  return;
1114
1115
  }
1115
- const V = G.data.otp.join("");
1116
+ const H = V.data.otp.join("");
1116
1117
  if (a) {
1117
1118
  u(!0);
1118
1119
  try {
1119
- const W = await a(V);
1120
+ const W = await a(H);
1120
1121
  if (W !== !0) {
1121
1122
  C.setError("otp", {
1122
1123
  type: "validate",
@@ -1131,16 +1132,20 @@ function rn(n) {
1131
1132
  o || u(!1);
1132
1133
  }
1133
1134
  if (o) {
1134
- u(!0), o(V).then(() => {
1135
+ u(!0), o(H).then(() => {
1135
1136
  r?.();
1136
1137
  }).catch((W) => {
1137
- s?.(W);
1138
+ const z = W?.message;
1139
+ C.setError("otp", {
1140
+ type: "submit",
1141
+ message: typeof z == "string" && z.length > 0 ? z : "OTP verification failed"
1142
+ }), s?.(W);
1138
1143
  }).finally(() => {
1139
1144
  u(!1);
1140
1145
  });
1141
1146
  return;
1142
1147
  }
1143
- l?.(V);
1148
+ l?.(H);
1144
1149
  }, e[7] = C, e[8] = s, e[9] = l, e[10] = r, e[11] = o, e[12] = a, e[13] = x) : x = e[13];
1145
1150
  const A = x;
1146
1151
  let w;
@@ -1666,7 +1671,7 @@ export {
1666
1671
  On as d,
1667
1672
  Tn as e,
1668
1673
  _ as f,
1669
- H as g,
1674
+ q as g,
1670
1675
  _t as h,
1671
1676
  Tt as i,
1672
1677
  Be as j,
@@ -104,7 +104,13 @@ export interface AuthFlowActions {
104
104
  email?: string;
105
105
  countryCode?: string;
106
106
  }) => void;
107
- verifyOtp: (otp: string) => void;
107
+ /**
108
+ * Verifies the OTP against the auth API. Resolves on success (after the
109
+ * reducer has been advanced) and rejects with an `AuthError` whose
110
+ * `message` carries the API's failure reason — callers can surface it
111
+ * as a field-level error.
112
+ */
113
+ verifyOtp: (otp: string) => Promise<void>;
108
114
  resendOtp: () => void;
109
115
  providerCallback: (params: {
110
116
  provider: 'google' | 'apple';
package/package.json CHANGED
@@ -1,113 +1,110 @@
1
- {
2
- "name": "doct-ui-auth-kit",
3
- "version": "1.0.14",
4
- "description": "Composable React auth SDK – layouts, login/signup/OTP pages, SSO provider, and auth flow hooks for Docthub",
5
- "type": "module",
6
- "main": "./dist/index.js",
7
- "module": "./dist/index.js",
8
- "types": "./dist/index.d.ts",
9
- "files": [
10
- "dist",
11
- "README.md"
12
- ],
13
- "keywords": [
14
- "react",
15
- "auth",
16
- "sdk",
17
- "docthub",
18
- "login",
19
- "signup",
20
- "sso",
21
- "otp"
22
- ],
23
- "license": "UNLICENSED",
24
- "repository": {
25
- "type": "git",
26
- "url": "https://github.com/docthub/doct-ui-auth-kit"
27
- },
28
- "scripts": {
29
- "dev": "vite",
30
- "build": "vite build && tsc --build tsconfig.build.json --force && tsc-alias -p tsconfig.build.json",
31
- "prepublishOnly": "npm run build",
32
- "lint": "biome lint .",
33
- "preview": "vite preview",
34
- "format": "biome format --write .",
35
- "lint:biome": "biome lint .",
36
- "check": "biome check .",
37
- "check:fix": "biome check --write .",
38
- "type-check": "tsc --noEmit",
39
- "prepare": "husky",
40
- "storybook": "storybook dev -p 6006",
41
- "build-storybook": "storybook build"
42
- },
43
- "exports": {
44
- ".": {
45
- "types": "./dist/index.d.ts",
46
- "import": "./dist/index.js"
47
- },
48
- "./style.css": "./dist/doct-ui-auth-kit.css",
49
- "./pages": {
50
- "types": "./dist/pages/index.d.ts",
51
- "import": "./dist/pages.js"
52
- }
53
- },
54
- "peerDependencies": {
55
- "docthub-core-components": "2.99.0",
56
- "react": "^19.0.0",
57
- "react-dom": "^19.0.0",
58
- "react-hook-form": "^7.50.0",
59
- "react-icons": "^5.5.0",
60
- "zod": "^4.0.0"
61
- },
62
- "dependencies": {
63
- "clsx": "^2.1.1",
64
- "dayjs": "^1.11.19",
65
- "docthub-core-components": "2.99.0",
66
- "react": "^19.0.0",
67
- "react-dom": "^19.0.0",
68
- "react-hook-form": "^7.50.0",
69
- "react-icons": "^5.5.0",
70
- "react-phone-number-input": "^3.4.14",
71
- "react-router-dom": "^7.13.0",
72
- "zod": "^4.0.0"
73
- },
74
- "devDependencies": {
75
- "@biomejs/biome": "^2.3.14",
76
- "@chromatic-com/storybook": "^5.0.0",
77
- "@eslint/js": "^9.39.1",
78
- "@storybook/addon-a11y": "^10.2.6",
79
- "@storybook/addon-docs": "^10.2.6",
80
- "@storybook/addon-onboarding": "^10.2.6",
81
- "@storybook/addon-vitest": "^10.2.6",
82
- "@storybook/react-vite": "^10.2.6",
83
- "@types/node": "^24.10.1",
84
- "@types/react": "^19.2.5",
85
- "@types/react-dom": "^19.2.3",
86
- "@vitejs/plugin-react": "^5.1.1",
87
- "@vitest/browser-playwright": "^4.0.18",
88
- "@vitest/coverage-v8": "^4.0.18",
89
- "autoprefixer": "^10.4.24",
90
- "babel-plugin-react-compiler": "^1.0.0",
91
- "eslint": "^9.39.1",
92
- "eslint-plugin-react-hooks": "^7.0.1",
93
- "eslint-plugin-react-refresh": "^0.4.24",
94
- "glob": "^13.0.1",
95
- "globals": "^16.5.0",
96
- "husky": "^9.1.7",
97
- "lint-staged": "^16.2.7",
98
- "playwright": "^1.58.1",
99
- "postcss": "^8.5.6",
100
- "react": "^19.2.0",
101
- "react-dom": "^19.2.0",
102
- "storybook": "^10.2.6",
103
- "tailwind-merge": "^3.0.1",
104
- "tailwindcss": "^3.4.16",
105
- "tailwindcss-animate": "^1.0.7",
106
- "tsc-alias": "^1.8.17",
107
- "typescript": "~5.6.2",
108
- "typescript-eslint": "^8.46.4",
109
- "vite": "^7.2.4",
110
- "vite-plugin-dts": "^4.5.0",
111
- "vitest": "^4.0.18"
112
- }
113
- }
1
+ {
2
+ "name": "doct-ui-auth-kit",
3
+ "version": "1.0.15",
4
+ "description": "Composable React auth SDK – layouts, login/signup/OTP pages, SSO provider, and auth flow hooks for Docthub",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "files": ["dist", "README.md"],
10
+ "keywords": [
11
+ "react",
12
+ "auth",
13
+ "sdk",
14
+ "docthub",
15
+ "login",
16
+ "signup",
17
+ "sso",
18
+ "otp"
19
+ ],
20
+ "license": "UNLICENSED",
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "https://github.com/docthub/doct-ui-auth-kit"
24
+ },
25
+ "scripts": {
26
+ "dev": "vite",
27
+ "build": "vite build && tsc --build tsconfig.build.json --force && tsc-alias -p tsconfig.build.json",
28
+ "prepublishOnly": "npm run build",
29
+ "lint": "biome lint .",
30
+ "preview": "vite preview",
31
+ "format": "biome format --write .",
32
+ "lint:biome": "biome lint .",
33
+ "check": "biome check .",
34
+ "check:fix": "biome check --write .",
35
+ "type-check": "tsc --noEmit",
36
+ "prepare": "husky",
37
+ "storybook": "storybook dev -p 6006",
38
+ "build-storybook": "storybook build"
39
+ },
40
+ "exports": {
41
+ ".": {
42
+ "types": "./dist/index.d.ts",
43
+ "import": "./dist/index.js"
44
+ },
45
+ "./style.css": "./dist/doct-ui-auth-kit.css",
46
+ "./pages": {
47
+ "types": "./dist/pages/index.d.ts",
48
+ "import": "./dist/pages.js"
49
+ }
50
+ },
51
+ "peerDependencies": {
52
+ "docthub-core-components": "2.99.0",
53
+ "react": "^19.0.0",
54
+ "react-dom": "^19.0.0",
55
+ "react-hook-form": "^7.50.0",
56
+ "react-icons": "^5.5.0",
57
+ "zod": "^4.0.0"
58
+ },
59
+ "dependencies": {
60
+ "clsx": "^2.1.1",
61
+ "dayjs": "^1.11.19",
62
+ "docthub-core-components": "2.99.0",
63
+ "react": "^19.0.0",
64
+ "react-dom": "^19.0.0",
65
+ "react-hook-form": "^7.50.0",
66
+ "react-icons": "^5.5.0",
67
+ "react-phone-number-input": "^3.4.14",
68
+ "react-router-dom": "^7.13.0",
69
+ "zod": "^4.0.0"
70
+ },
71
+ "devDependencies": {
72
+ "@biomejs/biome": "^2.3.14",
73
+ "@chromatic-com/storybook": "^5.0.0",
74
+ "@eslint/js": "^9.39.1",
75
+ "@storybook/addon-a11y": "^10.2.6",
76
+ "@storybook/addon-docs": "^10.2.6",
77
+ "@storybook/addon-onboarding": "^10.2.6",
78
+ "@storybook/addon-vitest": "^10.2.6",
79
+ "@storybook/react-vite": "^10.2.6",
80
+ "@types/node": "^24.10.1",
81
+ "@types/react": "^19.2.5",
82
+ "@types/react-dom": "^19.2.3",
83
+ "@vitejs/plugin-react": "^5.1.1",
84
+ "@vitest/browser-playwright": "^4.0.18",
85
+ "@vitest/coverage-v8": "^4.0.18",
86
+ "autoprefixer": "^10.4.24",
87
+ "babel-plugin-react-compiler": "^1.0.0",
88
+ "eslint": "^9.39.1",
89
+ "eslint-plugin-react-hooks": "^7.0.1",
90
+ "eslint-plugin-react-refresh": "^0.4.24",
91
+ "glob": "^13.0.1",
92
+ "globals": "^16.5.0",
93
+ "husky": "^9.1.7",
94
+ "lint-staged": "^16.2.7",
95
+ "playwright": "^1.58.1",
96
+ "postcss": "^8.5.6",
97
+ "react": "^19.2.0",
98
+ "react-dom": "^19.2.0",
99
+ "storybook": "^10.2.6",
100
+ "tailwind-merge": "^3.0.1",
101
+ "tailwindcss": "^3.4.16",
102
+ "tailwindcss-animate": "^1.0.7",
103
+ "tsc-alias": "^1.8.17",
104
+ "typescript": "~5.6.2",
105
+ "typescript-eslint": "^8.46.4",
106
+ "vite": "^7.2.4",
107
+ "vite-plugin-dts": "^4.5.0",
108
+ "vitest": "^4.0.18"
109
+ }
110
+ }