@tomny-dev/uzi 0.6.3 → 0.7.0-pr.78.214.1.87d1ede

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 (118) hide show
  1. package/dist/components/conversation/Conversation.d.ts +18 -0
  2. package/dist/components/conversation/Conversation.d.ts.map +1 -0
  3. package/dist/components/conversation/Conversation.test.d.ts +2 -0
  4. package/dist/components/conversation/Conversation.test.d.ts.map +1 -0
  5. package/dist/components/multi-select/MultiSelect.d.ts +9 -0
  6. package/dist/components/multi-select/MultiSelect.d.ts.map +1 -1
  7. package/dist/components/multi-select/MultiSelect.test.d.ts +2 -0
  8. package/dist/components/multi-select/MultiSelect.test.d.ts.map +1 -0
  9. package/dist/index.cjs +19 -11
  10. package/dist/index.d.ts +2 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +13 -12
  13. package/dist/index26.js +10 -2
  14. package/dist/index26.js.map +1 -1
  15. package/dist/index27.cjs +13 -1
  16. package/dist/index27.cjs.map +1 -1
  17. package/dist/index27.js +74 -37
  18. package/dist/index27.js.map +1 -1
  19. package/dist/index28.cjs +74 -37
  20. package/dist/index28.cjs.map +1 -1
  21. package/dist/index53.js +26 -16
  22. package/dist/index53.js.map +1 -1
  23. package/dist/index54.cjs +37 -20
  24. package/dist/index54.cjs.map +1 -1
  25. package/dist/index54.js +57 -23
  26. package/dist/index54.js.map +1 -1
  27. package/dist/index55.cjs +63 -24
  28. package/dist/index55.cjs.map +1 -1
  29. package/dist/index55.js +16 -16
  30. package/dist/index55.js.map +1 -1
  31. package/dist/index56.cjs +19 -20
  32. package/dist/index56.cjs.map +1 -1
  33. package/dist/index56.js +24 -21
  34. package/dist/index56.js.map +1 -1
  35. package/dist/index57.cjs +25 -22
  36. package/dist/index57.cjs.map +1 -1
  37. package/dist/index57.js +17 -10
  38. package/dist/index57.js.map +1 -1
  39. package/dist/index58.cjs +23 -11
  40. package/dist/index58.cjs.map +1 -1
  41. package/dist/index58.js +25 -14
  42. package/dist/index58.js.map +1 -1
  43. package/dist/index59.cjs +25 -13
  44. package/dist/index59.cjs.map +1 -1
  45. package/dist/index59.js +10 -11
  46. package/dist/index59.js.map +1 -1
  47. package/dist/index60.cjs +11 -13
  48. package/dist/index60.cjs.map +1 -1
  49. package/dist/index60.js +13 -16
  50. package/dist/index60.js.map +1 -1
  51. package/dist/index61.cjs +13 -16
  52. package/dist/index61.cjs.map +1 -1
  53. package/dist/index61.js +10 -8
  54. package/dist/index61.js.map +1 -1
  55. package/dist/index62.cjs +11 -10
  56. package/dist/index62.cjs.map +1 -1
  57. package/dist/index62.js +15 -87
  58. package/dist/index62.js.map +1 -1
  59. package/dist/index63.cjs +15 -89
  60. package/dist/index63.cjs.map +1 -1
  61. package/dist/index63.js +9 -21
  62. package/dist/index63.js.map +1 -1
  63. package/dist/index64.cjs +12 -30
  64. package/dist/index64.cjs.map +1 -1
  65. package/dist/index64.js +89 -43
  66. package/dist/index64.js.map +1 -1
  67. package/dist/index65.cjs +88 -42
  68. package/dist/index65.cjs.map +1 -1
  69. package/dist/index65.js +14 -50
  70. package/dist/index65.js.map +1 -1
  71. package/dist/index66.cjs +15 -69
  72. package/dist/index66.cjs.map +1 -1
  73. package/dist/index66.js +25 -414
  74. package/dist/index66.js.map +1 -1
  75. package/dist/index67.cjs +25 -416
  76. package/dist/index67.cjs.map +1 -1
  77. package/dist/index67.js +56 -58
  78. package/dist/index67.js.map +1 -1
  79. package/dist/index68.cjs +82 -85
  80. package/dist/index68.cjs.map +1 -1
  81. package/dist/index68.js +419 -226
  82. package/dist/index68.js.map +1 -1
  83. package/dist/index69.cjs +420 -225
  84. package/dist/index69.cjs.map +1 -1
  85. package/dist/index69.js +58 -42
  86. package/dist/index69.js.map +1 -1
  87. package/dist/index70.cjs +85 -61
  88. package/dist/index70.cjs.map +1 -1
  89. package/dist/index70.js +236 -76
  90. package/dist/index70.js.map +1 -1
  91. package/dist/index71.cjs +235 -75
  92. package/dist/index71.cjs.map +1 -1
  93. package/dist/index71.js +42 -20
  94. package/dist/index71.js.map +1 -1
  95. package/dist/index72.cjs +60 -27
  96. package/dist/index72.cjs.map +1 -1
  97. package/dist/index72.js +73 -88
  98. package/dist/index72.js.map +1 -1
  99. package/dist/index73.cjs +73 -90
  100. package/dist/index73.cjs.map +1 -1
  101. package/dist/index73.js +17 -15
  102. package/dist/index73.js.map +1 -1
  103. package/dist/index74.cjs +22 -19
  104. package/dist/index74.cjs.map +1 -1
  105. package/dist/index74.js +85 -143
  106. package/dist/index74.js.map +1 -1
  107. package/dist/index75.cjs +87 -143
  108. package/dist/index75.cjs.map +1 -1
  109. package/dist/index75.js +23 -0
  110. package/dist/index75.js.map +1 -0
  111. package/dist/index76.cjs +31 -0
  112. package/dist/index76.cjs.map +1 -0
  113. package/dist/index76.js +159 -0
  114. package/dist/index76.js.map +1 -0
  115. package/dist/index77.cjs +161 -0
  116. package/dist/index77.cjs.map +1 -0
  117. package/dist/style.css +150 -0
  118. package/package.json +1 -1
package/dist/index64.js CHANGED
@@ -1,50 +1,96 @@
1
+ "use client";
1
2
  import { cx } from "./index3.js";
2
- import auth_card_module_default from "./index63.js";
3
+ import segmented_toggle_module_default from "./index63.js";
3
4
  import * as React from "react";
4
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
- //#region src/components/auth-card/AuthCard.tsx
6
- /**
7
- * AuthCard — a centered card layout for auth pages.
8
- *
9
- * - Centered vertically and horizontally on screen
10
- * - Brand → title → subtitle → form → divider → footer
11
- * - No auth logic — just the visual template
12
- */
13
- var AuthCard = React.forwardRef(({ title, subtitle, children, footer, brand, className }, ref) => {
5
+ import { jsx } from "react/jsx-runtime";
6
+ //#region src/components/segmented-toggle/SegmentedToggle.tsx
7
+ function SegmentedToggle({ options, value, onChange, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, className }) {
8
+ const itemRefs = React.useRef([]);
9
+ const selectedIndex = options.findIndex((opt) => opt.value === value);
10
+ const fallbackIndex = options.findIndex((opt) => !opt.disabled);
11
+ let lastEnabledIndex = -1;
12
+ for (let index = options.length - 1; index >= 0; index -= 1) if (!options[index]?.disabled) {
13
+ lastEnabledIndex = index;
14
+ break;
15
+ }
16
+ const tabbableIndex = selectedIndex >= 0 && !options[selectedIndex]?.disabled ? selectedIndex : fallbackIndex;
17
+ const focusItem = (index) => {
18
+ itemRefs.current[index]?.focus();
19
+ };
20
+ const findEnabledIndex = (startIndex, direction) => {
21
+ if (options.length === 0) return -1;
22
+ let nextIndex = startIndex;
23
+ for (let i = 0; i < options.length; i += 1) {
24
+ nextIndex = (nextIndex + direction + options.length) % options.length;
25
+ if (!options[nextIndex]?.disabled) return nextIndex;
26
+ }
27
+ return startIndex;
28
+ };
29
+ const selectIndex = (index) => {
30
+ const nextOption = options[index];
31
+ if (!nextOption || nextOption.disabled || nextOption.value === value) return;
32
+ onChange(nextOption.value);
33
+ };
34
+ const handleKeyDown = (event, index) => {
35
+ switch (event.key) {
36
+ case "ArrowRight":
37
+ case "ArrowDown": {
38
+ event.preventDefault();
39
+ const nextIndex = findEnabledIndex(index, 1);
40
+ focusItem(nextIndex);
41
+ selectIndex(nextIndex);
42
+ break;
43
+ }
44
+ case "ArrowLeft":
45
+ case "ArrowUp": {
46
+ event.preventDefault();
47
+ const nextIndex = findEnabledIndex(index, -1);
48
+ focusItem(nextIndex);
49
+ selectIndex(nextIndex);
50
+ break;
51
+ }
52
+ case "Home":
53
+ event.preventDefault();
54
+ focusItem(fallbackIndex);
55
+ if (fallbackIndex >= 0) selectIndex(fallbackIndex);
56
+ break;
57
+ case "End":
58
+ event.preventDefault();
59
+ if (lastEnabledIndex >= 0) {
60
+ focusItem(lastEnabledIndex);
61
+ selectIndex(lastEnabledIndex);
62
+ }
63
+ break;
64
+ default: break;
65
+ }
66
+ };
14
67
  return /* @__PURE__ */ jsx("div", {
15
- className: cx(auth_card_module_default.authLayout, className),
16
- ref,
17
- children: /* @__PURE__ */ jsxs("div", {
18
- className: auth_card_module_default.authCard,
19
- children: [
20
- brand && /* @__PURE__ */ jsx("div", {
21
- className: auth_card_module_default.authBrand,
22
- children: brand
23
- }),
24
- /* @__PURE__ */ jsxs("div", {
25
- className: auth_card_module_default.authHeader,
26
- children: [/* @__PURE__ */ jsx("h1", {
27
- className: auth_card_module_default.authTitle,
28
- children: title
29
- }), subtitle && /* @__PURE__ */ jsx("p", {
30
- className: auth_card_module_default.authSubtitle,
31
- children: subtitle
32
- })]
33
- }),
34
- /* @__PURE__ */ jsx("div", {
35
- className: auth_card_module_default.authBody,
36
- children
37
- }),
38
- footer && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("hr", { className: auth_card_module_default.divider }), /* @__PURE__ */ jsx("p", {
39
- className: auth_card_module_default.authFooter,
40
- children: footer
41
- })] })
42
- ]
43
- })
68
+ className: cx(segmented_toggle_module_default.track, className),
69
+ role: "radiogroup",
70
+ "aria-label": ariaLabel,
71
+ "aria-labelledby": ariaLabelledBy,
72
+ children: options.map((opt, index) => /* @__PURE__ */ jsx("button", {
73
+ ref: (node) => {
74
+ itemRefs.current[index] = node;
75
+ },
76
+ type: "button",
77
+ role: "radio",
78
+ "aria-checked": opt.value === value,
79
+ disabled: opt.disabled,
80
+ tabIndex: opt.disabled ? -1 : index === tabbableIndex ? 0 : -1,
81
+ onClick: () => {
82
+ if (opt.value !== value) onChange(opt.value);
83
+ },
84
+ onKeyDown: (event) => handleKeyDown(event, index),
85
+ className: cx(segmented_toggle_module_default.option),
86
+ children: /* @__PURE__ */ jsx("span", {
87
+ className: segmented_toggle_module_default.label,
88
+ children: opt.label
89
+ })
90
+ }, opt.value))
44
91
  });
45
- });
46
- AuthCard.displayName = "AuthCard";
92
+ }
47
93
  //#endregion
48
- export { AuthCard };
94
+ export { SegmentedToggle };
49
95
 
50
96
  //# sourceMappingURL=index64.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index64.js","names":[],"sources":["../src/components/auth-card/AuthCard.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport styles from \"./auth-card.module.css\";\n\nexport interface AuthCardProps {\n /** Title displayed at the top of the card. */\n title: React.ReactNode;\n /** Subtitle displayed below the title. */\n subtitle?: React.ReactNode;\n /** Primary form content rendered in the card body. */\n children: React.ReactNode;\n /** Footer links rendered below the divider (e.g., \"No account? Sign up\"). */\n footer?: React.ReactNode;\n /** Optional brand/logo element rendered above the title. */\n brand?: React.ReactNode;\n /** Additional class name for the outer wrapper. */\n className?: string;\n}\n\n/**\n * AuthCard — a centered card layout for auth pages.\n *\n * - Centered vertically and horizontally on screen\n * - Brand → title → subtitle → form → divider → footer\n * - No auth logic — just the visual template\n */\nexport const AuthCard = React.forwardRef<HTMLDivElement, AuthCardProps>(\n ({ title, subtitle, children, footer, brand, className }, ref) => {\n return (\n <div className={cx(styles.authLayout, className)} ref={ref}>\n <div className={styles.authCard}>\n {brand && <div className={styles.authBrand}>{brand}</div>}\n <div className={styles.authHeader}>\n <h1 className={styles.authTitle}>{title}</h1>\n {subtitle && <p className={styles.authSubtitle}>{subtitle}</p>}\n </div>\n <div className={styles.authBody}>{children}</div>\n {footer && (\n <>\n <hr className={styles.divider} />\n <p className={styles.authFooter}>{footer}</p>\n </>\n )}\n </div>\n </div>\n );\n },\n);\n\nAuthCard.displayName = \"AuthCard\";\n"],"mappings":";;;;;;;;;;;;AA0BA,IAAa,WAAW,MAAM,YAC3B,EAAE,OAAO,UAAU,UAAU,QAAQ,OAAO,aAAa,QAAQ;CAChE,OACE,oBAAC,OAAD;EAAK,WAAW,GAAG,yBAAO,YAAY,SAAS;EAAQ;YACrD,qBAAC,OAAD;GAAK,WAAW,yBAAO;aAAvB;IACG,SAAS,oBAAC,OAAD;KAAK,WAAW,yBAAO;eAAY;IAAW,CAAA;IACxD,qBAAC,OAAD;KAAK,WAAW,yBAAO;eAAvB,CACE,oBAAC,MAAD;MAAI,WAAW,yBAAO;gBAAY;KAAU,CAAA,GAC3C,YAAY,oBAAC,KAAD;MAAG,WAAW,yBAAO;gBAAe;KAAY,CAAA,CAC1D;;IACL,oBAAC,OAAD;KAAK,WAAW,yBAAO;KAAW;IAAc,CAAA;IAC/C,UACC,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,MAAD,EAAI,WAAW,yBAAO,QAAU,CAAA,GAChC,oBAAC,KAAD;KAAG,WAAW,yBAAO;eAAa;IAAU,CAAA,CAC5C,EAAA,CAAA;GAED;;CACF,CAAA;AAET,CACF;AAEA,SAAS,cAAc"}
1
+ {"version":3,"file":"index64.js","names":[],"sources":["../src/components/segmented-toggle/SegmentedToggle.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport styles from \"./segmented-toggle.module.css\";\n\nexport type SegmentedToggleOption<T extends string = string> = {\n label: ReactNode;\n value: T;\n disabled?: boolean;\n};\n\nexport type SegmentedToggleProps<T extends string = string> = {\n options: SegmentedToggleOption<T>[];\n value: T;\n onChange: (value: T) => void;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n className?: string;\n};\n\nexport function SegmentedToggle<T extends string = string>({\n options,\n value,\n onChange,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n className,\n}: SegmentedToggleProps<T>) {\n const itemRefs = React.useRef<Array<HTMLButtonElement | null>>([]);\n const selectedIndex = options.findIndex((opt) => opt.value === value);\n const fallbackIndex = options.findIndex((opt) => !opt.disabled);\n let lastEnabledIndex = -1;\n for (let index = options.length - 1; index >= 0; index -= 1) {\n if (!options[index]?.disabled) {\n lastEnabledIndex = index;\n break;\n }\n }\n const tabbableIndex =\n selectedIndex >= 0 && !options[selectedIndex]?.disabled\n ? selectedIndex\n : fallbackIndex;\n\n const focusItem = (index: number) => {\n itemRefs.current[index]?.focus();\n };\n\n const findEnabledIndex = (\n startIndex: number,\n direction: 1 | -1,\n ): number => {\n if (options.length === 0) return -1;\n\n let nextIndex = startIndex;\n for (let i = 0; i < options.length; i += 1) {\n nextIndex = (nextIndex + direction + options.length) % options.length;\n if (!options[nextIndex]?.disabled) {\n return nextIndex;\n }\n }\n\n return startIndex;\n };\n\n const selectIndex = (index: number) => {\n const nextOption = options[index];\n if (!nextOption || nextOption.disabled || nextOption.value === value) {\n return;\n }\n onChange(nextOption.value);\n };\n\n const handleKeyDown = (\n event: React.KeyboardEvent<HTMLButtonElement>,\n index: number,\n ) => {\n switch (event.key) {\n case \"ArrowRight\":\n case \"ArrowDown\": {\n event.preventDefault();\n const nextIndex = findEnabledIndex(index, 1);\n focusItem(nextIndex);\n selectIndex(nextIndex);\n break;\n }\n case \"ArrowLeft\":\n case \"ArrowUp\": {\n event.preventDefault();\n const nextIndex = findEnabledIndex(index, -1);\n focusItem(nextIndex);\n selectIndex(nextIndex);\n break;\n }\n case \"Home\": {\n event.preventDefault();\n focusItem(fallbackIndex);\n if (fallbackIndex >= 0) {\n selectIndex(fallbackIndex);\n }\n break;\n }\n case \"End\": {\n event.preventDefault();\n if (lastEnabledIndex >= 0) {\n focusItem(lastEnabledIndex);\n selectIndex(lastEnabledIndex);\n }\n break;\n }\n default:\n break;\n }\n };\n\n return (\n <div\n className={cx(styles.track, className)}\n role=\"radiogroup\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n >\n {options.map((opt, index) => (\n <button\n key={opt.value}\n ref={(node) => {\n itemRefs.current[index] = node;\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={opt.value === value}\n disabled={opt.disabled}\n tabIndex={\n opt.disabled\n ? -1\n : index === tabbableIndex\n ? 0\n : -1\n }\n onClick={() => {\n if (opt.value !== value) {\n onChange(opt.value);\n }\n }}\n onKeyDown={(event) => handleKeyDown(event, index)}\n className={cx(styles.option)}\n >\n <span className={styles.label}>{opt.label}</span>\n </button>\n ))}\n </div>\n );\n}\n"],"mappings":";;;;;;AAsBA,SAAgB,gBAA2C,EACzD,SACA,OACA,UACA,cAAc,WACd,mBAAmB,gBACnB,aAC0B;CAC1B,MAAM,WAAW,MAAM,OAAwC,CAAC,CAAC;CACjE,MAAM,gBAAgB,QAAQ,WAAW,QAAQ,IAAI,UAAU,KAAK;CACpE,MAAM,gBAAgB,QAAQ,WAAW,QAAQ,CAAC,IAAI,QAAQ;CAC9D,IAAI,mBAAmB;CACvB,KAAK,IAAI,QAAQ,QAAQ,SAAS,GAAG,SAAS,GAAG,SAAS,GACxD,IAAI,CAAC,QAAQ,MAAM,EAAE,UAAU;EAC7B,mBAAmB;EACnB;CACF;CAEF,MAAM,gBACJ,iBAAiB,KAAK,CAAC,QAAQ,cAAc,EAAE,WAC3C,gBACA;CAEN,MAAM,aAAa,UAAkB;EACnC,SAAS,QAAQ,MAAM,EAAE,MAAM;CACjC;CAEA,MAAM,oBACJ,YACA,cACW;EACX,IAAI,QAAQ,WAAW,GAAG,OAAO;EAEjC,IAAI,YAAY;EAChB,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,GAAG;GAC1C,aAAa,YAAY,YAAY,QAAQ,UAAU,QAAQ;GAC/D,IAAI,CAAC,QAAQ,UAAU,EAAE,UACvB,OAAO;EAEX;EAEA,OAAO;CACT;CAEA,MAAM,eAAe,UAAkB;EACrC,MAAM,aAAa,QAAQ;EAC3B,IAAI,CAAC,cAAc,WAAW,YAAY,WAAW,UAAU,OAC7D;EAEF,SAAS,WAAW,KAAK;CAC3B;CAEA,MAAM,iBACJ,OACA,UACG;EACH,QAAQ,MAAM,KAAd;GACE,KAAK;GACL,KAAK,aAAa;IAChB,MAAM,eAAe;IACrB,MAAM,YAAY,iBAAiB,OAAO,CAAC;IAC3C,UAAU,SAAS;IACnB,YAAY,SAAS;IACrB;GACF;GACA,KAAK;GACL,KAAK,WAAW;IACd,MAAM,eAAe;IACrB,MAAM,YAAY,iBAAiB,OAAO,EAAE;IAC5C,UAAU,SAAS;IACnB,YAAY,SAAS;IACrB;GACF;GACA,KAAK;IACH,MAAM,eAAe;IACrB,UAAU,aAAa;IACvB,IAAI,iBAAiB,GACnB,YAAY,aAAa;IAE3B;GAEF,KAAK;IACH,MAAM,eAAe;IACrB,IAAI,oBAAoB,GAAG;KACzB,UAAU,gBAAgB;KAC1B,YAAY,gBAAgB;IAC9B;IACA;GAEF,SACE;EACJ;CACF;CAEA,OACE,oBAAC,OAAD;EACE,WAAW,GAAG,gCAAO,OAAO,SAAS;EACrC,MAAK;EACL,cAAY;EACZ,mBAAiB;YAEhB,QAAQ,KAAK,KAAK,UACjB,oBAAC,UAAD;GAEE,MAAM,SAAS;IACb,SAAS,QAAQ,SAAS;GAC5B;GACA,MAAK;GACL,MAAK;GACL,gBAAc,IAAI,UAAU;GAC5B,UAAU,IAAI;GACd,UACE,IAAI,WACA,KACA,UAAU,gBACR,IACA;GAER,eAAe;IACb,IAAI,IAAI,UAAU,OAChB,SAAS,IAAI,KAAK;GAEtB;GACA,YAAY,UAAU,cAAc,OAAO,KAAK;GAChD,WAAW,GAAG,gCAAO,MAAM;aAE3B,oBAAC,QAAD;IAAM,WAAW,gCAAO;cAAQ,IAAI;GAAY,CAAA;EAC1C,GAxBD,IAAI,KAwBH,CACT;CACE,CAAA;AAET"}
package/dist/index65.cjs CHANGED
@@ -1,52 +1,98 @@
1
+ "use client";
1
2
  const require_runtime = require("./index2.cjs");
2
3
  const require_cx = require("./index4.cjs");
3
- const require_auth_card_module = require("./index64.cjs");
4
+ const require_segmented_toggle_module = require("./index64.cjs");
4
5
  let react = require("react");
5
6
  react = require_runtime.__toESM(react, 1);
6
7
  let react_jsx_runtime = require("react/jsx-runtime");
7
- //#region src/components/auth-card/AuthCard.tsx
8
- /**
9
- * AuthCard — a centered card layout for auth pages.
10
- *
11
- * - Centered vertically and horizontally on screen
12
- * - Brand → title → subtitle → form → divider → footer
13
- * - No auth logic — just the visual template
14
- */
15
- var AuthCard = react.forwardRef(({ title, subtitle, children, footer, brand, className }, ref) => {
8
+ //#region src/components/segmented-toggle/SegmentedToggle.tsx
9
+ function SegmentedToggle({ options, value, onChange, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, className }) {
10
+ const itemRefs = react.useRef([]);
11
+ const selectedIndex = options.findIndex((opt) => opt.value === value);
12
+ const fallbackIndex = options.findIndex((opt) => !opt.disabled);
13
+ let lastEnabledIndex = -1;
14
+ for (let index = options.length - 1; index >= 0; index -= 1) if (!options[index]?.disabled) {
15
+ lastEnabledIndex = index;
16
+ break;
17
+ }
18
+ const tabbableIndex = selectedIndex >= 0 && !options[selectedIndex]?.disabled ? selectedIndex : fallbackIndex;
19
+ const focusItem = (index) => {
20
+ itemRefs.current[index]?.focus();
21
+ };
22
+ const findEnabledIndex = (startIndex, direction) => {
23
+ if (options.length === 0) return -1;
24
+ let nextIndex = startIndex;
25
+ for (let i = 0; i < options.length; i += 1) {
26
+ nextIndex = (nextIndex + direction + options.length) % options.length;
27
+ if (!options[nextIndex]?.disabled) return nextIndex;
28
+ }
29
+ return startIndex;
30
+ };
31
+ const selectIndex = (index) => {
32
+ const nextOption = options[index];
33
+ if (!nextOption || nextOption.disabled || nextOption.value === value) return;
34
+ onChange(nextOption.value);
35
+ };
36
+ const handleKeyDown = (event, index) => {
37
+ switch (event.key) {
38
+ case "ArrowRight":
39
+ case "ArrowDown": {
40
+ event.preventDefault();
41
+ const nextIndex = findEnabledIndex(index, 1);
42
+ focusItem(nextIndex);
43
+ selectIndex(nextIndex);
44
+ break;
45
+ }
46
+ case "ArrowLeft":
47
+ case "ArrowUp": {
48
+ event.preventDefault();
49
+ const nextIndex = findEnabledIndex(index, -1);
50
+ focusItem(nextIndex);
51
+ selectIndex(nextIndex);
52
+ break;
53
+ }
54
+ case "Home":
55
+ event.preventDefault();
56
+ focusItem(fallbackIndex);
57
+ if (fallbackIndex >= 0) selectIndex(fallbackIndex);
58
+ break;
59
+ case "End":
60
+ event.preventDefault();
61
+ if (lastEnabledIndex >= 0) {
62
+ focusItem(lastEnabledIndex);
63
+ selectIndex(lastEnabledIndex);
64
+ }
65
+ break;
66
+ default: break;
67
+ }
68
+ };
16
69
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
17
- className: require_cx.cx(require_auth_card_module.default.authLayout, className),
18
- ref,
19
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
20
- className: require_auth_card_module.default.authCard,
21
- children: [
22
- brand && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
23
- className: require_auth_card_module.default.authBrand,
24
- children: brand
25
- }),
26
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
27
- className: require_auth_card_module.default.authHeader,
28
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h1", {
29
- className: require_auth_card_module.default.authTitle,
30
- children: title
31
- }), subtitle && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
32
- className: require_auth_card_module.default.authSubtitle,
33
- children: subtitle
34
- })]
35
- }),
36
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
37
- className: require_auth_card_module.default.authBody,
38
- children
39
- }),
40
- footer && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("hr", { className: require_auth_card_module.default.divider }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
41
- className: require_auth_card_module.default.authFooter,
42
- children: footer
43
- })] })
44
- ]
45
- })
70
+ className: require_cx.cx(require_segmented_toggle_module.default.track, className),
71
+ role: "radiogroup",
72
+ "aria-label": ariaLabel,
73
+ "aria-labelledby": ariaLabelledBy,
74
+ children: options.map((opt, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
75
+ ref: (node) => {
76
+ itemRefs.current[index] = node;
77
+ },
78
+ type: "button",
79
+ role: "radio",
80
+ "aria-checked": opt.value === value,
81
+ disabled: opt.disabled,
82
+ tabIndex: opt.disabled ? -1 : index === tabbableIndex ? 0 : -1,
83
+ onClick: () => {
84
+ if (opt.value !== value) onChange(opt.value);
85
+ },
86
+ onKeyDown: (event) => handleKeyDown(event, index),
87
+ className: require_cx.cx(require_segmented_toggle_module.default.option),
88
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
89
+ className: require_segmented_toggle_module.default.label,
90
+ children: opt.label
91
+ })
92
+ }, opt.value))
46
93
  });
47
- });
48
- AuthCard.displayName = "AuthCard";
94
+ }
49
95
  //#endregion
50
- exports.AuthCard = AuthCard;
96
+ exports.SegmentedToggle = SegmentedToggle;
51
97
 
52
98
  //# sourceMappingURL=index65.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index65.cjs","names":[],"sources":["../src/components/auth-card/AuthCard.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport styles from \"./auth-card.module.css\";\n\nexport interface AuthCardProps {\n /** Title displayed at the top of the card. */\n title: React.ReactNode;\n /** Subtitle displayed below the title. */\n subtitle?: React.ReactNode;\n /** Primary form content rendered in the card body. */\n children: React.ReactNode;\n /** Footer links rendered below the divider (e.g., \"No account? Sign up\"). */\n footer?: React.ReactNode;\n /** Optional brand/logo element rendered above the title. */\n brand?: React.ReactNode;\n /** Additional class name for the outer wrapper. */\n className?: string;\n}\n\n/**\n * AuthCard — a centered card layout for auth pages.\n *\n * - Centered vertically and horizontally on screen\n * - Brand → title → subtitle → form → divider → footer\n * - No auth logic — just the visual template\n */\nexport const AuthCard = React.forwardRef<HTMLDivElement, AuthCardProps>(\n ({ title, subtitle, children, footer, brand, className }, ref) => {\n return (\n <div className={cx(styles.authLayout, className)} ref={ref}>\n <div className={styles.authCard}>\n {brand && <div className={styles.authBrand}>{brand}</div>}\n <div className={styles.authHeader}>\n <h1 className={styles.authTitle}>{title}</h1>\n {subtitle && <p className={styles.authSubtitle}>{subtitle}</p>}\n </div>\n <div className={styles.authBody}>{children}</div>\n {footer && (\n <>\n <hr className={styles.divider} />\n <p className={styles.authFooter}>{footer}</p>\n </>\n )}\n </div>\n </div>\n );\n },\n);\n\nAuthCard.displayName = \"AuthCard\";\n"],"mappings":";;;;;;;;;;;;;;AA0BA,IAAa,WAAW,MAAM,YAC3B,EAAE,OAAO,UAAU,UAAU,QAAQ,OAAO,aAAa,QAAQ;CAChE,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EAAK,WAAW,WAAA,GAAG,yBAAA,QAAO,YAAY,SAAS;EAAQ;YACrD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;GAAK,WAAW,yBAAA,QAAO;aAAvB;IACG,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,WAAW,yBAAA,QAAO;eAAY;IAAW,CAAA;IACxD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAW,yBAAA,QAAO;eAAvB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;MAAI,WAAW,yBAAA,QAAO;gBAAY;KAAU,CAAA,GAC3C,YAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAW,yBAAA,QAAO;gBAAe;KAAY,CAAA,CAC1D;;IACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,WAAW,yBAAA,QAAO;KAAW;IAAc,CAAA;IAC/C,UACC,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAI,WAAW,yBAAA,QAAO,QAAU,CAAA,GAChC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;KAAG,WAAW,yBAAA,QAAO;eAAa;IAAU,CAAA,CAC5C,EAAA,CAAA;GAED;;CACF,CAAA;AAET,CACF;AAEA,SAAS,cAAc"}
1
+ {"version":3,"file":"index65.cjs","names":[],"sources":["../src/components/segmented-toggle/SegmentedToggle.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport styles from \"./segmented-toggle.module.css\";\n\nexport type SegmentedToggleOption<T extends string = string> = {\n label: ReactNode;\n value: T;\n disabled?: boolean;\n};\n\nexport type SegmentedToggleProps<T extends string = string> = {\n options: SegmentedToggleOption<T>[];\n value: T;\n onChange: (value: T) => void;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n className?: string;\n};\n\nexport function SegmentedToggle<T extends string = string>({\n options,\n value,\n onChange,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n className,\n}: SegmentedToggleProps<T>) {\n const itemRefs = React.useRef<Array<HTMLButtonElement | null>>([]);\n const selectedIndex = options.findIndex((opt) => opt.value === value);\n const fallbackIndex = options.findIndex((opt) => !opt.disabled);\n let lastEnabledIndex = -1;\n for (let index = options.length - 1; index >= 0; index -= 1) {\n if (!options[index]?.disabled) {\n lastEnabledIndex = index;\n break;\n }\n }\n const tabbableIndex =\n selectedIndex >= 0 && !options[selectedIndex]?.disabled\n ? selectedIndex\n : fallbackIndex;\n\n const focusItem = (index: number) => {\n itemRefs.current[index]?.focus();\n };\n\n const findEnabledIndex = (\n startIndex: number,\n direction: 1 | -1,\n ): number => {\n if (options.length === 0) return -1;\n\n let nextIndex = startIndex;\n for (let i = 0; i < options.length; i += 1) {\n nextIndex = (nextIndex + direction + options.length) % options.length;\n if (!options[nextIndex]?.disabled) {\n return nextIndex;\n }\n }\n\n return startIndex;\n };\n\n const selectIndex = (index: number) => {\n const nextOption = options[index];\n if (!nextOption || nextOption.disabled || nextOption.value === value) {\n return;\n }\n onChange(nextOption.value);\n };\n\n const handleKeyDown = (\n event: React.KeyboardEvent<HTMLButtonElement>,\n index: number,\n ) => {\n switch (event.key) {\n case \"ArrowRight\":\n case \"ArrowDown\": {\n event.preventDefault();\n const nextIndex = findEnabledIndex(index, 1);\n focusItem(nextIndex);\n selectIndex(nextIndex);\n break;\n }\n case \"ArrowLeft\":\n case \"ArrowUp\": {\n event.preventDefault();\n const nextIndex = findEnabledIndex(index, -1);\n focusItem(nextIndex);\n selectIndex(nextIndex);\n break;\n }\n case \"Home\": {\n event.preventDefault();\n focusItem(fallbackIndex);\n if (fallbackIndex >= 0) {\n selectIndex(fallbackIndex);\n }\n break;\n }\n case \"End\": {\n event.preventDefault();\n if (lastEnabledIndex >= 0) {\n focusItem(lastEnabledIndex);\n selectIndex(lastEnabledIndex);\n }\n break;\n }\n default:\n break;\n }\n };\n\n return (\n <div\n className={cx(styles.track, className)}\n role=\"radiogroup\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n >\n {options.map((opt, index) => (\n <button\n key={opt.value}\n ref={(node) => {\n itemRefs.current[index] = node;\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={opt.value === value}\n disabled={opt.disabled}\n tabIndex={\n opt.disabled\n ? -1\n : index === tabbableIndex\n ? 0\n : -1\n }\n onClick={() => {\n if (opt.value !== value) {\n onChange(opt.value);\n }\n }}\n onKeyDown={(event) => handleKeyDown(event, index)}\n className={cx(styles.option)}\n >\n <span className={styles.label}>{opt.label}</span>\n </button>\n ))}\n </div>\n );\n}\n"],"mappings":";;;;;;;;AAsBA,SAAgB,gBAA2C,EACzD,SACA,OACA,UACA,cAAc,WACd,mBAAmB,gBACnB,aAC0B;CAC1B,MAAM,WAAW,MAAM,OAAwC,CAAC,CAAC;CACjE,MAAM,gBAAgB,QAAQ,WAAW,QAAQ,IAAI,UAAU,KAAK;CACpE,MAAM,gBAAgB,QAAQ,WAAW,QAAQ,CAAC,IAAI,QAAQ;CAC9D,IAAI,mBAAmB;CACvB,KAAK,IAAI,QAAQ,QAAQ,SAAS,GAAG,SAAS,GAAG,SAAS,GACxD,IAAI,CAAC,QAAQ,MAAM,EAAE,UAAU;EAC7B,mBAAmB;EACnB;CACF;CAEF,MAAM,gBACJ,iBAAiB,KAAK,CAAC,QAAQ,cAAc,EAAE,WAC3C,gBACA;CAEN,MAAM,aAAa,UAAkB;EACnC,SAAS,QAAQ,MAAM,EAAE,MAAM;CACjC;CAEA,MAAM,oBACJ,YACA,cACW;EACX,IAAI,QAAQ,WAAW,GAAG,OAAO;EAEjC,IAAI,YAAY;EAChB,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,GAAG;GAC1C,aAAa,YAAY,YAAY,QAAQ,UAAU,QAAQ;GAC/D,IAAI,CAAC,QAAQ,UAAU,EAAE,UACvB,OAAO;EAEX;EAEA,OAAO;CACT;CAEA,MAAM,eAAe,UAAkB;EACrC,MAAM,aAAa,QAAQ;EAC3B,IAAI,CAAC,cAAc,WAAW,YAAY,WAAW,UAAU,OAC7D;EAEF,SAAS,WAAW,KAAK;CAC3B;CAEA,MAAM,iBACJ,OACA,UACG;EACH,QAAQ,MAAM,KAAd;GACE,KAAK;GACL,KAAK,aAAa;IAChB,MAAM,eAAe;IACrB,MAAM,YAAY,iBAAiB,OAAO,CAAC;IAC3C,UAAU,SAAS;IACnB,YAAY,SAAS;IACrB;GACF;GACA,KAAK;GACL,KAAK,WAAW;IACd,MAAM,eAAe;IACrB,MAAM,YAAY,iBAAiB,OAAO,EAAE;IAC5C,UAAU,SAAS;IACnB,YAAY,SAAS;IACrB;GACF;GACA,KAAK;IACH,MAAM,eAAe;IACrB,UAAU,aAAa;IACvB,IAAI,iBAAiB,GACnB,YAAY,aAAa;IAE3B;GAEF,KAAK;IACH,MAAM,eAAe;IACrB,IAAI,oBAAoB,GAAG;KACzB,UAAU,gBAAgB;KAC1B,YAAY,gBAAgB;IAC9B;IACA;GAEF,SACE;EACJ;CACF;CAEA,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EACE,WAAW,WAAA,GAAG,gCAAA,QAAO,OAAO,SAAS;EACrC,MAAK;EACL,cAAY;EACZ,mBAAiB;YAEhB,QAAQ,KAAK,KAAK,UACjB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;GAEE,MAAM,SAAS;IACb,SAAS,QAAQ,SAAS;GAC5B;GACA,MAAK;GACL,MAAK;GACL,gBAAc,IAAI,UAAU;GAC5B,UAAU,IAAI;GACd,UACE,IAAI,WACA,KACA,UAAU,gBACR,IACA;GAER,eAAe;IACb,IAAI,IAAI,UAAU,OAChB,SAAS,IAAI,KAAK;GAEtB;GACA,YAAY,UAAU,cAAc,OAAO,KAAK;GAChD,WAAW,WAAA,GAAG,gCAAA,QAAO,MAAM;aAE3B,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;IAAM,WAAW,gCAAA,QAAO;cAAQ,IAAI;GAAY,CAAA;EAC1C,GAxBD,IAAI,KAwBH,CACT;CACE,CAAA;AAET"}
package/dist/index65.js CHANGED
@@ -1,61 +1,25 @@
1
- //#region src/components/auth-pages/auth-pages.module.css
2
- var authLayout = "uzi-auth-pages-module__authLayout__i-FlB";
3
- var authCard = "uzi-auth-pages-module__authCard__toOGS";
4
- var authBrand = "uzi-auth-pages-module__authBrand__7yOdw";
5
- var authHeader = "uzi-auth-pages-module__authHeader__V-wcl";
6
- var authTitle = "uzi-auth-pages-module__authTitle__1bgLI";
7
- var authSubtitle = "uzi-auth-pages-module__authSubtitle__sGXxg";
8
- var authForm = "uzi-auth-pages-module__authForm__4MucP";
9
- var field = "uzi-auth-pages-module__field__Ajl6w";
10
- var label = "uzi-auth-pages-module__label__MdsqJ";
11
- var input = "uzi-auth-pages-module__input__yijT9";
12
- var error = "uzi-auth-pages-module__error__7Mhyi";
13
- var passwordWrapper = "uzi-auth-pages-module__passwordWrapper__P0bez";
14
- var toggle = "uzi-auth-pages-module__toggle__T7HaZ";
15
- var eyeIcon = "uzi-auth-pages-module__eyeIcon__ab2Ts";
16
- var checkboxRow = "uzi-auth-pages-module__checkboxRow__Rq-84";
17
- var checkboxLabel = "uzi-auth-pages-module__checkboxLabel__poKs-";
18
- var checkbox = "uzi-auth-pages-module__checkbox__KOQQe";
19
- var forgotLink = "uzi-auth-pages-module__forgotLink__5q-vL";
20
- var checkboxLink = "uzi-auth-pages-module__checkboxLink__kAkKg";
21
- var submitButton = "uzi-auth-pages-module__submitButton__mlGxT";
22
- var spinner = "uzi-auth-pages-module__spinner__seK4F";
23
- var spin = "uzi-auth-pages-module__spin__hYpWH";
24
- var divider = "uzi-auth-pages-module__divider__Debmu";
25
- var authFooter = "uzi-auth-pages-module__authFooter__SEaGh";
26
- var sentMessage = "uzi-auth-pages-module__sentMessage__vLBoY";
27
- var sentText = "uzi-auth-pages-module__sentText__qyJkF";
28
- var backLink = "uzi-auth-pages-module__backLink__ezB3X";
29
- var auth_pages_module_default = {
1
+ //#region src/components/auth-card/auth-card.module.css
2
+ var authLayout = "uzi-auth-card-module__authLayout__GHr1j";
3
+ var authCard = "uzi-auth-card-module__authCard__ZYYit";
4
+ var authBrand = "uzi-auth-card-module__authBrand__ZCDVm";
5
+ var authHeader = "uzi-auth-card-module__authHeader__NB6UQ";
6
+ var authTitle = "uzi-auth-card-module__authTitle__VtHLn";
7
+ var authSubtitle = "uzi-auth-card-module__authSubtitle__ZupId";
8
+ var authBody = "uzi-auth-card-module__authBody__PTyaL";
9
+ var divider = "uzi-auth-card-module__divider__D8r12";
10
+ var authFooter = "uzi-auth-card-module__authFooter__C5s--";
11
+ var auth_card_module_default = {
30
12
  authLayout,
31
13
  authCard,
32
14
  authBrand,
33
15
  authHeader,
34
16
  authTitle,
35
17
  authSubtitle,
36
- authForm,
37
- field,
38
- label,
39
- input,
40
- error,
41
- passwordWrapper,
42
- toggle,
43
- eyeIcon,
44
- checkboxRow,
45
- checkboxLabel,
46
- checkbox,
47
- forgotLink,
48
- checkboxLink,
49
- submitButton,
50
- spinner,
51
- spin,
18
+ authBody,
52
19
  divider,
53
- authFooter,
54
- sentMessage,
55
- sentText,
56
- backLink
20
+ authFooter
57
21
  };
58
22
  //#endregion
59
- export { authBrand, authCard, authFooter, authForm, authHeader, authLayout, authSubtitle, authTitle, backLink, checkbox, checkboxLabel, checkboxLink, checkboxRow, auth_pages_module_default as default, divider, error, eyeIcon, field, forgotLink, input, label, passwordWrapper, sentMessage, sentText, spin, spinner, submitButton, toggle };
23
+ export { authBody, authBrand, authCard, authFooter, authHeader, authLayout, authSubtitle, authTitle, auth_card_module_default as default, divider };
60
24
 
61
25
  //# sourceMappingURL=index65.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index65.js","names":[],"sources":["../src/components/auth-pages/auth-pages.module.css"],"sourcesContent":["/* ── Layout ── */\n.authLayout {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n min-height: 100dvh;\n padding: 24px;\n background: var(--background);\n}\n\n.authCard {\n width: 100%;\n max-width: 400px;\n border-radius: var(--ts-card-radius, 12px);\n border: 1px solid var(--ts-card-border, var(--border));\n background: var(--ts-card-bg, var(--card));\n color: var(--ts-card-fg, var(--foreground));\n box-shadow: var(--ts-card-shadow, 0 16px 36px rgba(0, 0, 0, 0.28));\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.authBrand {\n display: flex;\n justify-content: center;\n margin-bottom: 4px;\n}\n\n.authBrand svg {\n width: 40px;\n height: 40px;\n color: var(--primary);\n}\n\n.authHeader {\n text-align: center;\n}\n\n.authTitle {\n font-size: 1.25rem;\n font-weight: 600;\n line-height: 1.4;\n margin: 0;\n color: var(--foreground);\n}\n\n.authSubtitle {\n font-size: 0.875rem;\n color: var(--muted-foreground);\n margin-top: 4px;\n margin-bottom: 0;\n line-height: 1.4;\n}\n\n/* ── Form ── */\n.authForm {\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n/* ── Field ── */\n.field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.label {\n font-size: 0.875rem;\n font-weight: 500;\n line-height: 1.2;\n color: var(--foreground);\n}\n\n.input {\n display: flex;\n width: 100%;\n min-height: 2.25rem;\n border-radius: 0.5rem;\n border: 1px solid var(--input);\n background: var(--background);\n color: var(--foreground);\n padding: 0.25rem 0.75rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n box-shadow: var(--ts-input-shadow, 0 1px 2px rgba(0, 0, 0, 0.04));\n transition: border-color 0.15s ease, background 0.15s ease;\n font-family: inherit;\n}\n\n.input::placeholder {\n color: var(--muted-foreground);\n}\n\n.input:focus-visible {\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n}\n\n.input:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* ── Error ── */\n.error {\n font-size: 0.8rem;\n color: var(--destructive);\n margin-top: 2px;\n}\n\n/* ── Password wrapper ── */\n.passwordWrapper {\n position: relative;\n}\n\n.passwordWrapper .input {\n padding-right: 2.5rem;\n}\n\n.toggle {\n position: absolute;\n right: 0.5rem;\n top: 50%;\n transform: translateY(-50%);\n background: none;\n border: none;\n padding: 0.25rem;\n cursor: pointer;\n color: var(--muted-foreground);\n border-radius: 4px;\n transition: color 0.15s, background 0.15s;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.toggle:hover {\n color: var(--foreground);\n background: var(--accent);\n}\n\n.toggle:focus-visible {\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n}\n\n.eyeIcon {\n width: 1.125rem;\n height: 1.125rem;\n}\n\n/* ── Checkbox row ── */\n.checkboxRow {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.checkboxLabel {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 0.875rem;\n color: var(--foreground);\n cursor: pointer;\n}\n\n.checkbox {\n width: 1rem;\n height: 1rem;\n accent-color: var(--primary);\n border-radius: 4px;\n cursor: pointer;\n}\n\n.checkbox:focus-visible {\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n}\n\n.forgotLink {\n font-size: 0.875rem;\n color: var(--primary);\n text-decoration: none;\n font-weight: 500;\n}\n\n.forgotLink:hover {\n text-decoration: underline;\n}\n\n.checkboxLink {\n color: var(--primary);\n text-decoration: none;\n font-weight: 500;\n}\n\n.checkboxLink:hover {\n text-decoration: underline;\n}\n\n/* ── Submit button ── */\n.submitButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n font-family: inherit;\n font-weight: 600;\n border-radius: 8px;\n border: 1px solid transparent;\n cursor: pointer;\n text-decoration: none;\n transition: opacity 0.15s, border-color 0.15s, color 0.15s, background 0.15s;\n white-space: nowrap;\n line-height: 1;\n font-size: 0.95rem;\n min-height: 2.25rem;\n padding: 10px 22px;\n background: var(--primary);\n color: var(--primary-foreground);\n}\n\n.submitButton:focus-visible {\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n}\n\n.submitButton:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n}\n\n.submitButton:hover:not(:disabled) {\n opacity: 0.88;\n}\n\n/* ── Spinner ── */\n.spinner {\n width: 1rem;\n height: 1rem;\n border: 2px solid rgba(255, 255, 255, 0.3);\n border-top-color: white;\n border-radius: 50%;\n animation: spin 0.6s linear infinite;\n}\n\n@keyframes spin {\n to { transform: rotate(360deg); }\n}\n\n/* ── Divider ── */\n.divider {\n border: none;\n border-top: 1px solid var(--border);\n margin: 0;\n}\n\n/* ── Footer ── */\n.authFooter {\n text-align: center;\n font-size: 0.875rem;\n color: var(--muted-foreground);\n margin: 0;\n}\n\n.authFooter a {\n color: var(--primary);\n text-decoration: none;\n font-weight: 500;\n}\n\n.authFooter a:hover {\n text-decoration: underline;\n}\n\n/* ── Sent state ── */\n.sentMessage {\n text-align: center;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.sentText {\n font-size: 0.875rem;\n color: var(--foreground);\n line-height: 1.5;\n}\n\n.sentText strong {\n font-weight: 600;\n}\n\n.backLink {\n font-size: 0.875rem;\n color: var(--primary);\n text-decoration: none;\n font-weight: 500;\n}\n\n.backLink:hover {\n text-decoration: underline;\n}\n"],"mappings":""}
1
+ {"version":3,"file":"index65.js","names":[],"sources":["../src/components/auth-card/auth-card.module.css"],"sourcesContent":[".authLayout {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n min-height: 100dvh;\n padding: 24px;\n background: var(--background);\n}\n\n.authCard {\n width: 100%;\n max-width: 400px;\n border-radius: var(--ts-card-radius, 12px);\n border: 1px solid var(--ts-card-border, var(--border));\n background: var(--ts-card-bg, var(--card));\n color: var(--ts-card-fg, var(--foreground));\n box-shadow: var(--ts-card-shadow, 0 16px 36px rgba(0, 0, 0, 0.28));\n padding: 24px;\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.authBrand {\n display: flex;\n justify-content: center;\n margin-bottom: 8px;\n}\n\n.authBrand svg {\n width: 40px;\n height: 40px;\n color: var(--primary);\n}\n\n.authHeader {\n text-align: center;\n}\n\n.authTitle {\n font-size: 1.25rem;\n font-weight: 600;\n line-height: 1.4;\n margin: 0;\n color: var(--foreground);\n}\n\n.authSubtitle {\n font-size: 0.875rem;\n color: var(--muted-foreground);\n margin-top: 8px;\n margin-bottom: 0;\n line-height: 1.4;\n}\n\n.authBody {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.divider {\n border: none;\n border-top: 1px solid var(--border);\n margin: 0;\n}\n\n.authFooter {\n text-align: center;\n font-size: 0.875rem;\n color: var(--muted-foreground);\n margin: 0;\n}\n\n.authFooter a {\n color: var(--primary);\n text-decoration: none;\n font-weight: 500;\n}\n\n.authFooter a:hover {\n text-decoration: underline;\n}\n"],"mappings":""}
package/dist/index66.cjs CHANGED
@@ -1,88 +1,34 @@
1
- //#region src/components/auth-pages/auth-pages.module.css
2
- var authLayout = "uzi-auth-pages-module__authLayout__i-FlB";
3
- var authCard = "uzi-auth-pages-module__authCard__toOGS";
4
- var authBrand = "uzi-auth-pages-module__authBrand__7yOdw";
5
- var authHeader = "uzi-auth-pages-module__authHeader__V-wcl";
6
- var authTitle = "uzi-auth-pages-module__authTitle__1bgLI";
7
- var authSubtitle = "uzi-auth-pages-module__authSubtitle__sGXxg";
8
- var authForm = "uzi-auth-pages-module__authForm__4MucP";
9
- var field = "uzi-auth-pages-module__field__Ajl6w";
10
- var label = "uzi-auth-pages-module__label__MdsqJ";
11
- var input = "uzi-auth-pages-module__input__yijT9";
12
- var error = "uzi-auth-pages-module__error__7Mhyi";
13
- var passwordWrapper = "uzi-auth-pages-module__passwordWrapper__P0bez";
14
- var toggle = "uzi-auth-pages-module__toggle__T7HaZ";
15
- var eyeIcon = "uzi-auth-pages-module__eyeIcon__ab2Ts";
16
- var checkboxRow = "uzi-auth-pages-module__checkboxRow__Rq-84";
17
- var checkboxLabel = "uzi-auth-pages-module__checkboxLabel__poKs-";
18
- var checkbox = "uzi-auth-pages-module__checkbox__KOQQe";
19
- var forgotLink = "uzi-auth-pages-module__forgotLink__5q-vL";
20
- var checkboxLink = "uzi-auth-pages-module__checkboxLink__kAkKg";
21
- var submitButton = "uzi-auth-pages-module__submitButton__mlGxT";
22
- var spinner = "uzi-auth-pages-module__spinner__seK4F";
23
- var spin = "uzi-auth-pages-module__spin__hYpWH";
24
- var divider = "uzi-auth-pages-module__divider__Debmu";
25
- var authFooter = "uzi-auth-pages-module__authFooter__SEaGh";
26
- var sentMessage = "uzi-auth-pages-module__sentMessage__vLBoY";
27
- var sentText = "uzi-auth-pages-module__sentText__qyJkF";
28
- var backLink = "uzi-auth-pages-module__backLink__ezB3X";
29
- var auth_pages_module_default = {
1
+ //#region src/components/auth-card/auth-card.module.css
2
+ var authLayout = "uzi-auth-card-module__authLayout__GHr1j";
3
+ var authCard = "uzi-auth-card-module__authCard__ZYYit";
4
+ var authBrand = "uzi-auth-card-module__authBrand__ZCDVm";
5
+ var authHeader = "uzi-auth-card-module__authHeader__NB6UQ";
6
+ var authTitle = "uzi-auth-card-module__authTitle__VtHLn";
7
+ var authSubtitle = "uzi-auth-card-module__authSubtitle__ZupId";
8
+ var authBody = "uzi-auth-card-module__authBody__PTyaL";
9
+ var divider = "uzi-auth-card-module__divider__D8r12";
10
+ var authFooter = "uzi-auth-card-module__authFooter__C5s--";
11
+ var auth_card_module_default = {
30
12
  authLayout,
31
13
  authCard,
32
14
  authBrand,
33
15
  authHeader,
34
16
  authTitle,
35
17
  authSubtitle,
36
- authForm,
37
- field,
38
- label,
39
- input,
40
- error,
41
- passwordWrapper,
42
- toggle,
43
- eyeIcon,
44
- checkboxRow,
45
- checkboxLabel,
46
- checkbox,
47
- forgotLink,
48
- checkboxLink,
49
- submitButton,
50
- spinner,
51
- spin,
18
+ authBody,
52
19
  divider,
53
- authFooter,
54
- sentMessage,
55
- sentText,
56
- backLink
20
+ authFooter
57
21
  };
58
22
  //#endregion
23
+ exports.authBody = authBody;
59
24
  exports.authBrand = authBrand;
60
25
  exports.authCard = authCard;
61
26
  exports.authFooter = authFooter;
62
- exports.authForm = authForm;
63
27
  exports.authHeader = authHeader;
64
28
  exports.authLayout = authLayout;
65
29
  exports.authSubtitle = authSubtitle;
66
30
  exports.authTitle = authTitle;
67
- exports.backLink = backLink;
68
- exports.checkbox = checkbox;
69
- exports.checkboxLabel = checkboxLabel;
70
- exports.checkboxLink = checkboxLink;
71
- exports.checkboxRow = checkboxRow;
72
- exports.default = auth_pages_module_default;
31
+ exports.default = auth_card_module_default;
73
32
  exports.divider = divider;
74
- exports.error = error;
75
- exports.eyeIcon = eyeIcon;
76
- exports.field = field;
77
- exports.forgotLink = forgotLink;
78
- exports.input = input;
79
- exports.label = label;
80
- exports.passwordWrapper = passwordWrapper;
81
- exports.sentMessage = sentMessage;
82
- exports.sentText = sentText;
83
- exports.spin = spin;
84
- exports.spinner = spinner;
85
- exports.submitButton = submitButton;
86
- exports.toggle = toggle;
87
33
 
88
34
  //# sourceMappingURL=index66.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index66.cjs","names":[],"sources":["../src/components/auth-pages/auth-pages.module.css"],"sourcesContent":["/* ── Layout ── */\n.authLayout {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n min-height: 100dvh;\n padding: 24px;\n background: var(--background);\n}\n\n.authCard {\n width: 100%;\n max-width: 400px;\n border-radius: var(--ts-card-radius, 12px);\n border: 1px solid var(--ts-card-border, var(--border));\n background: var(--ts-card-bg, var(--card));\n color: var(--ts-card-fg, var(--foreground));\n box-shadow: var(--ts-card-shadow, 0 16px 36px rgba(0, 0, 0, 0.28));\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.authBrand {\n display: flex;\n justify-content: center;\n margin-bottom: 4px;\n}\n\n.authBrand svg {\n width: 40px;\n height: 40px;\n color: var(--primary);\n}\n\n.authHeader {\n text-align: center;\n}\n\n.authTitle {\n font-size: 1.25rem;\n font-weight: 600;\n line-height: 1.4;\n margin: 0;\n color: var(--foreground);\n}\n\n.authSubtitle {\n font-size: 0.875rem;\n color: var(--muted-foreground);\n margin-top: 4px;\n margin-bottom: 0;\n line-height: 1.4;\n}\n\n/* ── Form ── */\n.authForm {\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n/* ── Field ── */\n.field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.label {\n font-size: 0.875rem;\n font-weight: 500;\n line-height: 1.2;\n color: var(--foreground);\n}\n\n.input {\n display: flex;\n width: 100%;\n min-height: 2.25rem;\n border-radius: 0.5rem;\n border: 1px solid var(--input);\n background: var(--background);\n color: var(--foreground);\n padding: 0.25rem 0.75rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n box-shadow: var(--ts-input-shadow, 0 1px 2px rgba(0, 0, 0, 0.04));\n transition: border-color 0.15s ease, background 0.15s ease;\n font-family: inherit;\n}\n\n.input::placeholder {\n color: var(--muted-foreground);\n}\n\n.input:focus-visible {\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n}\n\n.input:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* ── Error ── */\n.error {\n font-size: 0.8rem;\n color: var(--destructive);\n margin-top: 2px;\n}\n\n/* ── Password wrapper ── */\n.passwordWrapper {\n position: relative;\n}\n\n.passwordWrapper .input {\n padding-right: 2.5rem;\n}\n\n.toggle {\n position: absolute;\n right: 0.5rem;\n top: 50%;\n transform: translateY(-50%);\n background: none;\n border: none;\n padding: 0.25rem;\n cursor: pointer;\n color: var(--muted-foreground);\n border-radius: 4px;\n transition: color 0.15s, background 0.15s;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.toggle:hover {\n color: var(--foreground);\n background: var(--accent);\n}\n\n.toggle:focus-visible {\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n}\n\n.eyeIcon {\n width: 1.125rem;\n height: 1.125rem;\n}\n\n/* ── Checkbox row ── */\n.checkboxRow {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.checkboxLabel {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 0.875rem;\n color: var(--foreground);\n cursor: pointer;\n}\n\n.checkbox {\n width: 1rem;\n height: 1rem;\n accent-color: var(--primary);\n border-radius: 4px;\n cursor: pointer;\n}\n\n.checkbox:focus-visible {\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n}\n\n.forgotLink {\n font-size: 0.875rem;\n color: var(--primary);\n text-decoration: none;\n font-weight: 500;\n}\n\n.forgotLink:hover {\n text-decoration: underline;\n}\n\n.checkboxLink {\n color: var(--primary);\n text-decoration: none;\n font-weight: 500;\n}\n\n.checkboxLink:hover {\n text-decoration: underline;\n}\n\n/* ── Submit button ── */\n.submitButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n font-family: inherit;\n font-weight: 600;\n border-radius: 8px;\n border: 1px solid transparent;\n cursor: pointer;\n text-decoration: none;\n transition: opacity 0.15s, border-color 0.15s, color 0.15s, background 0.15s;\n white-space: nowrap;\n line-height: 1;\n font-size: 0.95rem;\n min-height: 2.25rem;\n padding: 10px 22px;\n background: var(--primary);\n color: var(--primary-foreground);\n}\n\n.submitButton:focus-visible {\n outline: var(--focus-ring);\n outline-offset: var(--focus-ring-offset);\n}\n\n.submitButton:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n}\n\n.submitButton:hover:not(:disabled) {\n opacity: 0.88;\n}\n\n/* ── Spinner ── */\n.spinner {\n width: 1rem;\n height: 1rem;\n border: 2px solid rgba(255, 255, 255, 0.3);\n border-top-color: white;\n border-radius: 50%;\n animation: spin 0.6s linear infinite;\n}\n\n@keyframes spin {\n to { transform: rotate(360deg); }\n}\n\n/* ── Divider ── */\n.divider {\n border: none;\n border-top: 1px solid var(--border);\n margin: 0;\n}\n\n/* ── Footer ── */\n.authFooter {\n text-align: center;\n font-size: 0.875rem;\n color: var(--muted-foreground);\n margin: 0;\n}\n\n.authFooter a {\n color: var(--primary);\n text-decoration: none;\n font-weight: 500;\n}\n\n.authFooter a:hover {\n text-decoration: underline;\n}\n\n/* ── Sent state ── */\n.sentMessage {\n text-align: center;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.sentText {\n font-size: 0.875rem;\n color: var(--foreground);\n line-height: 1.5;\n}\n\n.sentText strong {\n font-weight: 600;\n}\n\n.backLink {\n font-size: 0.875rem;\n color: var(--primary);\n text-decoration: none;\n font-weight: 500;\n}\n\n.backLink:hover {\n text-decoration: underline;\n}\n"],"mappings":""}
1
+ {"version":3,"file":"index66.cjs","names":[],"sources":["../src/components/auth-card/auth-card.module.css"],"sourcesContent":[".authLayout {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n min-height: 100dvh;\n padding: 24px;\n background: var(--background);\n}\n\n.authCard {\n width: 100%;\n max-width: 400px;\n border-radius: var(--ts-card-radius, 12px);\n border: 1px solid var(--ts-card-border, var(--border));\n background: var(--ts-card-bg, var(--card));\n color: var(--ts-card-fg, var(--foreground));\n box-shadow: var(--ts-card-shadow, 0 16px 36px rgba(0, 0, 0, 0.28));\n padding: 24px;\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.authBrand {\n display: flex;\n justify-content: center;\n margin-bottom: 8px;\n}\n\n.authBrand svg {\n width: 40px;\n height: 40px;\n color: var(--primary);\n}\n\n.authHeader {\n text-align: center;\n}\n\n.authTitle {\n font-size: 1.25rem;\n font-weight: 600;\n line-height: 1.4;\n margin: 0;\n color: var(--foreground);\n}\n\n.authSubtitle {\n font-size: 0.875rem;\n color: var(--muted-foreground);\n margin-top: 8px;\n margin-bottom: 0;\n line-height: 1.4;\n}\n\n.authBody {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.divider {\n border: none;\n border-top: 1px solid var(--border);\n margin: 0;\n}\n\n.authFooter {\n text-align: center;\n font-size: 0.875rem;\n color: var(--muted-foreground);\n margin: 0;\n}\n\n.authFooter a {\n color: var(--primary);\n text-decoration: none;\n font-weight: 500;\n}\n\n.authFooter a:hover {\n text-decoration: underline;\n}\n"],"mappings":""}