@ecohouse/ui 0.1.2 → 0.1.4

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 (74) hide show
  1. package/dist/index.cjs +1734 -155
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +287 -13
  4. package/dist/index.d.ts +287 -13
  5. package/dist/index.js +1720 -159
  6. package/dist/index.js.map +1 -1
  7. package/package.json +1 -1
  8. package/src/components/Avatar/Avatar.stories.tsx +133 -0
  9. package/src/components/Avatar/Avatar.tsx +389 -0
  10. package/src/components/Avatar/index.ts +2 -0
  11. package/src/components/Button/Button.tsx +106 -88
  12. package/src/components/Checkbox/Checkbox.stories.tsx +112 -0
  13. package/src/components/Checkbox/Checkbox.tsx +150 -0
  14. package/src/components/Checkbox/index.ts +2 -0
  15. package/src/components/Input/Input.stories.tsx +11 -40
  16. package/src/components/Input/Input.tsx +58 -54
  17. package/src/components/Input/index.ts +1 -1
  18. package/src/components/Select/Select.stories.tsx +196 -0
  19. package/src/components/Select/Select.tsx +851 -0
  20. package/src/components/Select/index.ts +2 -0
  21. package/src/components/Textarea/Textarea.stories.tsx +71 -0
  22. package/src/components/Textarea/Textarea.tsx +241 -0
  23. package/src/components/Textarea/index.ts +2 -0
  24. package/src/components/Toggle/Toggle.stories.tsx +100 -0
  25. package/src/components/Toggle/Toggle.tsx +176 -0
  26. package/src/components/Toggle/index.ts +2 -0
  27. package/src/components/index.ts +16 -1
  28. package/src/icons/Calendar/CalendarIcon.tsx +21 -0
  29. package/src/icons/Calendar/CalendarIcon.web.tsx +27 -0
  30. package/src/icons/Calendar/calendarPath.ts +3 -0
  31. package/src/icons/Calendar/index.ts +1 -0
  32. package/src/icons/Check/CheckIcon.tsx +26 -0
  33. package/src/icons/Check/CheckIcon.web.tsx +32 -0
  34. package/src/icons/Check/checkPath.ts +2 -0
  35. package/src/icons/Check/index.ts +1 -0
  36. package/src/icons/ChevronDown/ChevronDownIcon.tsx +30 -0
  37. package/src/icons/ChevronDown/ChevronDownIcon.web.tsx +36 -0
  38. package/src/icons/ChevronDown/chevronDownPath.ts +2 -0
  39. package/src/icons/ChevronDown/index.ts +1 -0
  40. package/src/icons/Heart/HeartIcon.tsx +23 -0
  41. package/src/icons/Heart/HeartIcon.web.tsx +29 -0
  42. package/src/icons/Heart/heartPath.ts +3 -0
  43. package/src/icons/Heart/index.ts +1 -0
  44. package/src/icons/HelpCircle/HelpCircleIcon.tsx +25 -0
  45. package/src/icons/HelpCircle/HelpCircleIcon.web.tsx +31 -0
  46. package/src/icons/HelpCircle/helpCirclePath.ts +3 -0
  47. package/src/icons/HelpCircle/index.ts +1 -0
  48. package/src/icons/LayoutGrid/LayoutGridIcon.tsx +25 -0
  49. package/src/icons/LayoutGrid/LayoutGridIcon.web.tsx +31 -0
  50. package/src/icons/LayoutGrid/index.ts +1 -0
  51. package/src/icons/LayoutGrid/layoutGridPath.ts +3 -0
  52. package/src/icons/LogOut/LogOutIcon.tsx +21 -0
  53. package/src/icons/LogOut/LogOutIcon.web.tsx +27 -0
  54. package/src/icons/LogOut/index.ts +1 -0
  55. package/src/icons/LogOut/logOutPath.ts +3 -0
  56. package/src/icons/Search/SearchIcon.tsx +37 -0
  57. package/src/icons/Search/SearchIcon.web.tsx +43 -0
  58. package/src/icons/Search/index.ts +1 -0
  59. package/src/icons/Search/searchPath.ts +5 -0
  60. package/src/icons/Settings/SettingsIcon.tsx +21 -0
  61. package/src/icons/Settings/SettingsIcon.web.tsx +27 -0
  62. package/src/icons/Settings/index.ts +1 -0
  63. package/src/icons/Settings/settingsPath.ts +3 -0
  64. package/src/icons/Video/VideoIcon.tsx +24 -0
  65. package/src/icons/Video/VideoIcon.web.tsx +30 -0
  66. package/src/icons/Video/index.ts +1 -0
  67. package/src/icons/Video/videoPath.ts +5 -0
  68. package/src/icons/index.ts +10 -0
  69. package/src/icons/registry.ts +24 -3
  70. package/src/index.ts +31 -3
  71. package/src/theme/colors.ts +1 -0
  72. package/src/theme/index.ts +8 -1
  73. package/src/theme/typography.ts +77 -2
  74. package/src/utils/mergeRefs.ts +20 -0
package/dist/index.cjs CHANGED
@@ -9,7 +9,7 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
9
 
10
10
  var Svg__default = /*#__PURE__*/_interopDefault(Svg);
11
11
 
12
- // src/components/Button/Button.tsx
12
+ // src/components/Avatar/Avatar.tsx
13
13
 
14
14
  // src/icons/ArrowRight/arrowRightPath.ts
15
15
  var ARROW_RIGHT_PATH = "M4.16667 10H15.8333M15.8333 10L10 4.16667M15.8333 10L10 15.8333";
@@ -41,6 +41,7 @@ var colors = {
41
41
  lightGrey: "#B7B7B7",
42
42
  primaryMuted: "#B464360F",
43
43
  redMuted: "#A63E3E0F",
44
+ redHover: "#A63E3E33",
44
45
  grey0: grey["0"],
45
46
  grey50: grey["0.5"],
46
47
  grey100: grey["1"],
@@ -83,9 +84,32 @@ var inputTypography = {
83
84
  fontFamily: fonts.sans,
84
85
  fontSize: 12,
85
86
  fontWeight: "500",
86
- lineHeight: 16,
87
+ lineHeight: 12,
88
+ letterSpacing: 0.36
89
+ },
90
+ field: {
91
+ fontFamily: fonts.sans,
92
+ fontSize: 14,
93
+ fontWeight: "400",
94
+ lineHeight: 19,
87
95
  letterSpacing: 0
88
96
  },
97
+ hint: {
98
+ fontFamily: fonts.sans,
99
+ fontSize: 12,
100
+ fontWeight: "400",
101
+ lineHeight: 12,
102
+ letterSpacing: 0.36
103
+ }
104
+ };
105
+ var selectTypography = {
106
+ label: {
107
+ fontFamily: fonts.sans,
108
+ fontSize: 12,
109
+ fontWeight: "500",
110
+ lineHeight: 12,
111
+ letterSpacing: 0.36
112
+ },
89
113
  field: {
90
114
  fontFamily: fonts.sans,
91
115
  fontSize: 14,
@@ -97,8 +121,54 @@ var inputTypography = {
97
121
  fontFamily: fonts.sans,
98
122
  fontSize: 12,
99
123
  fontWeight: "400",
100
- lineHeight: 16,
124
+ lineHeight: 12,
125
+ letterSpacing: 0.36
126
+ }
127
+ };
128
+ var avatarTypography = {
129
+ name: {
130
+ fontFamily: fonts.sans,
131
+ fontSize: 14,
132
+ fontWeight: "600",
133
+ lineHeight: 14,
134
+ letterSpacing: 0
135
+ },
136
+ email: {
137
+ fontFamily: fonts.sans,
138
+ fontSize: 12,
139
+ fontWeight: "400",
140
+ lineHeight: 12,
141
+ letterSpacing: 0
142
+ },
143
+ menuItem: {
144
+ fontFamily: fonts.sans,
145
+ fontSize: 12,
146
+ fontWeight: "600",
147
+ lineHeight: 12,
148
+ letterSpacing: 0
149
+ }
150
+ };
151
+ var textareaTypography = {
152
+ label: {
153
+ fontFamily: fonts.sans,
154
+ fontSize: 12,
155
+ fontWeight: "500",
156
+ lineHeight: 12,
157
+ letterSpacing: 0.36
158
+ },
159
+ field: {
160
+ fontFamily: fonts.sans,
161
+ fontSize: 14,
162
+ fontWeight: "400",
163
+ lineHeight: 19,
101
164
  letterSpacing: 0
165
+ },
166
+ hint: {
167
+ fontFamily: fonts.sans,
168
+ fontSize: 12,
169
+ fontWeight: "400",
170
+ lineHeight: 12,
171
+ letterSpacing: 0.36
102
172
  }
103
173
  };
104
174
  function ArrowRightIcon({
@@ -163,6 +233,21 @@ function BuildingIcon({ size = 20, color = colors.primary, strokeWidth = 2 }) {
163
233
  ) });
164
234
  }
165
235
 
236
+ // src/icons/Calendar/calendarPath.ts
237
+ var CALENDAR_PATH = "M14 6.66668H2M14 8.33334V5.86668C14 4.74657 14 4.18652 13.782 3.7587C13.5903 3.38237 13.2843 3.07641 12.908 2.88466C12.4802 2.66668 11.9201 2.66668 10.8 2.66668H5.2C4.0799 2.66668 3.51984 2.66668 3.09202 2.88466C2.71569 3.07641 2.40973 3.38237 2.21799 3.7587C2 4.18652 2 4.74657 2 5.86668V11.4667C2 12.5868 2 13.1468 2.21799 13.5747C2.40973 13.951 2.71569 14.2569 3.09202 14.4487C3.51984 14.6667 4.0799 14.6667 5.2 14.6667H8M10.6667 1.33334V4.00001M5.33333 1.33334V4.00001M9.66667 12.6667L11 14L14 11";
238
+ function CalendarIcon({ size = 20, color = colors.primary, strokeWidth = 1.5 }) {
239
+ return /* @__PURE__ */ jsxRuntime.jsx(Svg__default.default, { width: size, height: size, viewBox: "0 0 16 16", fill: "none", children: /* @__PURE__ */ jsxRuntime.jsx(
240
+ Svg.Path,
241
+ {
242
+ d: CALENDAR_PATH,
243
+ stroke: color,
244
+ strokeWidth,
245
+ strokeLinecap: "round",
246
+ strokeLinejoin: "round"
247
+ }
248
+ ) });
249
+ }
250
+
166
251
  // src/icons/Camera/cameraPath.ts
167
252
  var CAMERA_PATH = "M9.48898 7H6.2002C5.08009 7 4.51962 7 4.0918 7.21799C3.71547 7.40973 3.40973 7.71547 3.21799 8.0918C3 8.51962 3 9.08009 3 10.2002V15.8002C3 16.9203 3 17.4796 3.21799 17.9074C3.40973 18.2837 3.71547 18.5905 4.0918 18.7822C4.5192 19 5.07899 19 6.19691 19H17.8031C18.921 19 19.48 19 19.9074 18.7822C20.2837 18.5905 20.5905 18.2837 20.7822 17.9074C21 17.48 21 16.921 21 15.8031V10.1969C21 9.07899 21 8.5192 20.7822 8.0918C20.5905 7.71547 20.2837 7.40973 19.9074 7.21799C19.4796 7 18.9203 7 17.8002 7H14.5108M9.48898 7H9.55078M9.48898 7C9.50151 7.00001 9.51468 7 9.52857 7L9.55078 7M9.48898 7C9.38286 6.99995 9.32339 6.99941 9.27637 6.99414C8.68878 6.92835 8.28578 6.36908 8.40918 5.79084C8.42066 5.73703 8.44336 5.66894 8.4883 5.53412L8.49023 5.52841C8.54156 5.37443 8.56723 5.29743 8.59558 5.22949C8.88586 4.53389 9.54322 4.06083 10.2949 4.00541C10.3683 4 10.449 4 10.6113 4H13.3886C13.5509 4 13.6322 4 13.7057 4.00541C14.4574 4.06083 15.114 4.53389 15.4043 5.22949C15.4326 5.29743 15.4584 5.37434 15.5098 5.52832C15.556 5.66699 15.5791 5.73636 15.5908 5.79093C15.7142 6.36917 15.3118 6.92835 14.7242 6.99414C14.6772 6.99941 14.6171 6.99995 14.5108 7M9.55078 7H14.449M14.449 7H14.5108M14.449 7L14.4712 7C14.4851 7 14.4983 7.00001 14.5108 7M12 16C10.3431 16 9 14.6569 9 13C9 11.3431 10.3431 10 12 10C13.6569 10 15 11.3431 15 13C15 14.6569 13.6569 16 12 16Z";
168
253
  function CameraIcon({ size = 24, color = colors.primary, strokeWidth = 2 }) {
@@ -178,6 +263,21 @@ function CameraIcon({ size = 24, color = colors.primary, strokeWidth = 2 }) {
178
263
  ) });
179
264
  }
180
265
 
266
+ // src/icons/Check/checkPath.ts
267
+ var CHECK_PATH = "M4.16669 10.8333L7.50002 14.1667L15.8334 5.83334";
268
+ function CheckIcon({ size = 20, color = colors.primary, strokeWidth = 2 }) {
269
+ return /* @__PURE__ */ jsxRuntime.jsx(Svg__default.default, { width: size, height: size, viewBox: "0 0 20 20", fill: "none", children: /* @__PURE__ */ jsxRuntime.jsx(
270
+ Svg.Path,
271
+ {
272
+ d: CHECK_PATH,
273
+ stroke: color,
274
+ strokeWidth,
275
+ strokeLinecap: "round",
276
+ strokeLinejoin: "round"
277
+ }
278
+ ) });
279
+ }
280
+
181
281
  // src/icons/CheckBadge/checkBadgePath.ts
182
282
  var CHECK_BADGE_PATH = "M12.5 8.33317L9.16663 11.6665L7.49996 9.99984M11.0384 2.88233L12.0558 3.74941C12.3122 3.96786 12.6305 4.09992 12.9662 4.12671L14.2987 4.23291C15.0822 4.29543 15.7045 4.91733 15.767 5.70077L15.8729 7.03353C15.8997 7.36925 16.0322 7.68799 16.2507 7.94433L17.1174 8.96152C17.6272 9.5597 17.6272 10.4396 17.1175 11.0378L16.2508 12.0551C16.0323 12.3115 15.9 12.6303 15.8732 12.9661L15.7666 14.2986C15.704 15.082 15.0827 15.7043 14.2993 15.7668L12.9663 15.8732C12.6305 15.9 12.312 16.0317 12.0556 16.2502L11.0384 17.1173C10.4402 17.627 9.55973 17.6271 8.96155 17.1174L7.9443 16.2502C7.68796 16.0318 7.36938 15.8998 7.03365 15.8731L5.70064 15.7668C4.9172 15.7043 4.29588 15.0822 4.23336 14.2987L4.12675 12.9661C4.09996 12.6304 3.96759 12.3118 3.74915 12.0555L2.88245 11.0378C2.37268 10.4397 2.37244 9.56002 2.88221 8.96184L3.74969 7.94418C3.96814 7.68784 4.09923 7.36926 4.12602 7.03353L4.23263 5.70093C4.29515 4.91749 4.91826 4.29535 5.70171 4.23283L7.03324 4.12663C7.36897 4.09984 7.68771 3.96788 7.94404 3.74943L8.96164 2.88233C9.55982 2.37256 10.4402 2.37256 11.0384 2.88233Z";
183
283
  function CheckBadgeIcon({ size = 20, color = colors.primary, strokeWidth = 2 }) {
@@ -193,6 +293,25 @@ function CheckBadgeIcon({ size = 20, color = colors.primary, strokeWidth = 2 })
193
293
  ) });
194
294
  }
195
295
 
296
+ // src/icons/ChevronDown/chevronDownPath.ts
297
+ var CHEVRON_DOWN_PATH = "M5 7.5L10 12.5L15 7.5";
298
+ function ChevronDownIcon({
299
+ size = 20,
300
+ color = colors.primary,
301
+ strokeWidth = 2
302
+ }) {
303
+ return /* @__PURE__ */ jsxRuntime.jsx(Svg__default.default, { width: size, height: size, viewBox: "0 0 20 20", fill: "none", children: /* @__PURE__ */ jsxRuntime.jsx(
304
+ Svg.Path,
305
+ {
306
+ d: CHEVRON_DOWN_PATH,
307
+ stroke: color,
308
+ strokeWidth,
309
+ strokeLinecap: "round",
310
+ strokeLinejoin: "round"
311
+ }
312
+ ) });
313
+ }
314
+
196
315
  // src/icons/Clock/clockPath.ts
197
316
  var CLOCK_PATH = "M12 7V12H17M12 21C7.02944 21 3 16.9706 3 12C3 7.02944 7.02944 3 12 3C16.9706 3 21 7.02944 21 12C21 16.9706 16.9706 21 12 21Z";
198
317
  function ClockIcon({ size = 24, color = colors.primary, strokeWidth = 2 }) {
@@ -214,6 +333,42 @@ function FacebookIcon({ size = 20, color = colors.white }) {
214
333
  return /* @__PURE__ */ jsxRuntime.jsx(Svg__default.default, { width: size, height: size, viewBox: "0 0 20 20", fill: "none", children: /* @__PURE__ */ jsxRuntime.jsx(Svg.Path, { d: FACEBOOK_PATH, fill: color }) });
215
334
  }
216
335
 
336
+ // src/icons/Heart/heartPath.ts
337
+ var HEART_PATH = "M7.99547 3.42388C6.66257 1.8656 4.43987 1.44643 2.76984 2.87334C1.0998 4.30026 0.864686 6.68598 2.17617 8.3736C3.26659 9.77674 6.56656 12.7361 7.64811 13.6939C7.76911 13.801 7.82961 13.8546 7.90018 13.8757C7.96178 13.8941 8.02917 13.8941 8.09077 13.8757C8.16134 13.8546 8.22184 13.801 8.34284 13.6939C9.42439 12.7361 12.7244 9.77674 13.8148 8.3736C15.1263 6.68598 14.9199 4.28525 13.2211 2.87334C11.5224 1.46144 9.32838 1.8656 7.99547 3.42388Z";
338
+ function HeartIcon({ size = 20, color = colors.primary, strokeWidth = 1.5 }) {
339
+ return /* @__PURE__ */ jsxRuntime.jsx(Svg__default.default, { width: size, height: size, viewBox: "0 0 16 16", fill: "none", children: /* @__PURE__ */ jsxRuntime.jsx(
340
+ Svg.Path,
341
+ {
342
+ d: HEART_PATH,
343
+ stroke: color,
344
+ strokeWidth,
345
+ strokeLinecap: "round",
346
+ strokeLinejoin: "round",
347
+ fillRule: "evenodd",
348
+ clipRule: "evenodd"
349
+ }
350
+ ) });
351
+ }
352
+
353
+ // src/icons/HelpCircle/helpCirclePath.ts
354
+ var HELP_CIRCLE_PATH = "M6.99971 6.00149C7.11717 5.66757 7.34902 5.386 7.6542 5.20665C7.95937 5.0273 8.31817 4.96174 8.66705 5.02158C9.01593 5.08142 9.33238 5.2628 9.56034 5.5336C9.7883 5.8044 9.91306 6.14714 9.91254 6.50112C9.91254 7.50037 8.41365 8 8.41365 8M8.43298 10H8.43964M8.33304 13.3333C11.4627 13.3333 13.9997 10.7963 13.9997 7.66667C13.9997 4.53705 11.4627 2 8.33304 2C5.20343 2 2.66638 4.53705 2.66638 7.66667C2.66638 8.3 2.77027 8.90906 2.96196 9.47774C3.03409 9.69175 3.07016 9.79875 3.07666 9.88095C3.08309 9.96213 3.07823 10.019 3.05814 10.098C3.03781 10.1779 2.99291 10.261 2.9031 10.4272L1.81267 12.4456C1.65713 12.7335 1.57936 12.8774 1.59676 12.9885C1.61192 13.0853 1.66887 13.1705 1.75249 13.2215C1.84849 13.2801 2.01124 13.2632 2.33674 13.2296L5.75075 12.8767C5.85414 12.866 5.90583 12.8606 5.95295 12.8624C5.99929 12.8642 6.03201 12.8686 6.0772 12.879C6.12315 12.8896 6.18092 12.9118 6.29648 12.9564C6.92851 13.1999 7.61519 13.3333 8.33304 13.3333Z";
355
+ function HelpCircleIcon({
356
+ size = 20,
357
+ color = colors.primary,
358
+ strokeWidth = 1.5
359
+ }) {
360
+ return /* @__PURE__ */ jsxRuntime.jsx(Svg__default.default, { width: size, height: size, viewBox: "0 0 16 16", fill: "none", children: /* @__PURE__ */ jsxRuntime.jsx(
361
+ Svg.Path,
362
+ {
363
+ d: HELP_CIRCLE_PATH,
364
+ stroke: color,
365
+ strokeWidth,
366
+ strokeLinecap: "round",
367
+ strokeLinejoin: "round"
368
+ }
369
+ ) });
370
+ }
371
+
217
372
  // src/icons/Home/homePath.ts
218
373
  var HOME_PATH = "M1.66675 16.6667H3.33341M3.33341 16.6667H8.33341M3.33341 16.6667V9.54352C3.33341 9.09823 3.33341 8.87548 3.38756 8.66828C3.43554 8.48466 3.51491 8.31089 3.6215 8.15387C3.74178 7.97668 3.90895 7.82974 4.24406 7.53652L8.24538 4.03537C8.86662 3.49178 9.17726 3.21997 9.5271 3.11652C9.83559 3.02529 10.1644 3.02529 10.4729 3.11652C10.823 3.22005 11.1341 3.49212 11.7563 4.03652L15.7563 7.53652C16.0914 7.82974 16.2586 7.97668 16.3789 8.15387C16.4855 8.31089 16.5642 8.48466 16.6122 8.66828C16.6664 8.87548 16.6667 9.09824 16.6667 9.54352V16.6667M8.33341 16.6667H11.6667M8.33341 16.6667V13.3334C8.33341 12.4129 9.07961 11.6667 10.0001 11.6667C10.9206 11.6667 11.6667 12.4129 11.6667 13.3334V16.6667M11.6667 16.6667H16.6667M16.6667 16.6667H18.3334";
219
374
  function HomeIcon({ size = 20, color = colors.primary, strokeWidth = 2 }) {
@@ -250,12 +405,46 @@ function KeyIcon({ size = 20, color = colors.primary, strokeWidth = 2 }) {
250
405
  ) });
251
406
  }
252
407
 
408
+ // src/icons/LayoutGrid/layoutGridPath.ts
409
+ var LAYOUT_GRID_PATH = "M4.33333 4.33333H4.34M11.6667 4.33333H11.6733M4.33333 11.6667H4.34M8.66667 8.66667H8.67333M11.6667 11.6667H11.6733M11.3333 14H14V11.3333M9.33333 11V14M14 9.33333H11M10.4 6.66667H12.9333C13.3067 6.66667 13.4934 6.66667 13.636 6.594C13.7614 6.53009 13.8634 6.4281 13.9273 6.30266C14 6.16005 14 5.97337 14 5.6V3.06667C14 2.6933 14 2.50661 13.9273 2.36401C13.8634 2.23856 13.7614 2.13658 13.636 2.07266C13.4934 2 13.3067 2 12.9333 2H10.4C10.0266 2 9.83995 2 9.69734 2.07266C9.5719 2.13658 9.46991 2.23856 9.406 2.36401C9.33333 2.50661 9.33333 2.6933 9.33333 3.06667V5.6C9.33333 5.97337 9.33333 6.16005 9.406 6.30266C9.46991 6.4281 9.5719 6.53009 9.69734 6.594C9.83995 6.66667 10.0266 6.66667 10.4 6.66667ZM3.06667 6.66667H5.6C5.97337 6.66667 6.16005 6.66667 6.30266 6.594C6.4281 6.53009 6.53009 6.4281 6.594 6.30266C6.66667 6.16005 6.66667 5.97337 6.66667 5.6V3.06667C6.66667 2.6933 6.66667 2.50661 6.594 2.36401C6.53009 2.23856 6.4281 2.13658 6.30266 2.07266C6.16005 2 5.97337 2 5.6 2H3.06667C2.6933 2 2.50661 2 2.36401 2.07266C2.23856 2.13658 2.13658 2.23856 2.07266 2.36401C2 2.50661 2 2.6933 2 3.06667V5.6C2 5.97337 2 6.16005 2.07266 6.30266C2.13658 6.4281 2.23856 6.53009 2.36401 6.594C2.50661 6.66667 2.6933 6.66667 3.06667 6.66667ZM3.06667 14H5.6C5.97337 14 6.16005 14 6.30266 13.9273C6.4281 13.8634 6.53009 13.7614 6.594 13.636C6.66667 13.4934 6.66667 13.3067 6.66667 12.9333V10.4C6.66667 10.0266 6.66667 9.83995 6.594 9.69734C6.53009 9.5719 6.4281 9.46991 6.30266 9.406C6.16005 9.33333 5.97337 9.33333 5.6 9.33333H3.06667C2.6933 9.33333 2.50661 9.33333 2.36401 9.406C2.23856 9.46991 2.13658 9.5719 2.07266 9.69734C2 9.83995 2 10.0266 2 10.4V12.9333C2 13.3067 2 13.4934 2.07266 13.636C2.13658 13.7614 2.23856 13.8634 2.36401 13.9273C2.50661 14 2.6933 14 3.06667 14Z";
410
+ function LayoutGridIcon({
411
+ size = 20,
412
+ color = colors.primary,
413
+ strokeWidth = 1.5
414
+ }) {
415
+ return /* @__PURE__ */ jsxRuntime.jsx(Svg__default.default, { width: size, height: size, viewBox: "0 0 16 16", fill: "none", children: /* @__PURE__ */ jsxRuntime.jsx(
416
+ Svg.Path,
417
+ {
418
+ d: LAYOUT_GRID_PATH,
419
+ stroke: color,
420
+ strokeWidth,
421
+ strokeLinecap: "round",
422
+ strokeLinejoin: "round"
423
+ }
424
+ ) });
425
+ }
426
+
253
427
  // src/icons/LinkedIn/linkedinPath.ts
254
428
  var LINKEDIN_PATH = "M15.8333 2.50098C16.2754 2.50098 16.6993 2.67657 17.0118 2.98913C17.3244 3.30169 17.5 3.72562 17.5 4.16764V15.8343C17.5 16.2763 17.3244 16.7003 17.0118 17.0128C16.6993 17.3254 16.2754 17.501 15.8333 17.501H4.16667C3.72464 17.501 3.30072 17.3254 2.98816 17.0128C2.67559 16.7003 2.5 16.2763 2.5 15.8343V4.16764C2.5 3.72562 2.67559 3.30169 2.98816 2.98913C3.30072 2.67657 3.72464 2.50098 4.16667 2.50098H15.8333ZM15.4167 15.4176V11.001C15.4167 10.2805 15.1304 9.58948 14.621 9.08C14.1115 8.57053 13.4205 8.28431 12.7 8.28431C11.9917 8.28431 11.1667 8.71764 10.7667 9.36764V8.44264H8.44167V15.4176H10.7667V11.3093C10.7667 10.6676 11.2833 10.1426 11.925 10.1426C12.2344 10.1426 12.5312 10.2656 12.75 10.4844C12.9687 10.7031 13.0917 10.9999 13.0917 11.3093V15.4176H15.4167ZM5.73333 7.13431C6.10464 7.13431 6.46073 6.98681 6.72328 6.72426C6.98583 6.46171 7.13333 6.10561 7.13333 5.73431C7.13333 4.95931 6.50833 4.32598 5.73333 4.32598C5.35982 4.32598 5.0016 4.47435 4.73749 4.73847C4.47338 5.00258 4.325 5.3608 4.325 5.73431C4.325 6.50931 4.95833 7.13431 5.73333 7.13431ZM6.89167 15.4176V8.44264H4.58333V15.4176H6.89167Z";
255
429
  function LinkedInIcon({ size = 20, color = colors.white }) {
256
430
  return /* @__PURE__ */ jsxRuntime.jsx(Svg__default.default, { width: size, height: size, viewBox: "0 0 20 20", fill: "none", children: /* @__PURE__ */ jsxRuntime.jsx(Svg.Path, { d: LINKEDIN_PATH, fill: color }) });
257
431
  }
258
432
 
433
+ // src/icons/LogOut/logOutPath.ts
434
+ var LOG_OUT_PATH = "M10.6667 4.66667L14 8L10.6667 11.3333M14 8H6M8 11.3333C8 11.5304 8 11.6289 7.99268 11.7143C7.91655 12.6013 7.26324 13.3312 6.39002 13.5049C6.30602 13.5216 6.20801 13.5324 6.01223 13.5542L5.3313 13.6299C4.30832 13.7435 3.7968 13.8004 3.39044 13.6703C2.84862 13.4969 2.40628 13.101 2.17412 12.5817C2 12.1921 2 11.6775 2 10.6482V5.3518C2 4.32251 2 3.80787 2.17412 3.41835C2.40628 2.89899 2.84862 2.50307 3.39044 2.32969C3.79681 2.19965 4.3083 2.25648 5.33129 2.37015L6.01223 2.44581C6.20808 2.46757 6.306 2.47845 6.39002 2.49515C7.26324 2.66877 7.91655 3.39869 7.99268 4.28574C8 4.37109 8 4.46962 8 4.66667";
435
+ function LogOutIcon({ size = 20, color = colors.red, strokeWidth = 1.5 }) {
436
+ return /* @__PURE__ */ jsxRuntime.jsx(Svg__default.default, { width: size, height: size, viewBox: "0 0 16 16", fill: "none", children: /* @__PURE__ */ jsxRuntime.jsx(
437
+ Svg.Path,
438
+ {
439
+ d: LOG_OUT_PATH,
440
+ stroke: color,
441
+ strokeWidth,
442
+ strokeLinecap: "round",
443
+ strokeLinejoin: "round"
444
+ }
445
+ ) });
446
+ }
447
+
259
448
  // src/icons/Mail/mailPath.ts
260
449
  var MAIL_PATH = "M3.33333 4.99984L8.42303 8.84339L8.42473 8.8448C8.98987 9.25924 9.27261 9.46658 9.5823 9.54668C9.85602 9.61748 10.1438 9.61748 10.4175 9.54668C10.7274 9.46651 11.011 9.25856 11.5771 8.84339C11.5771 8.84339 14.8417 6.33812 16.6667 4.99984M2.5 13.1667V6.83333C2.5 5.89991 2.5 5.43285 2.68166 5.07633C2.84144 4.76273 3.09623 4.50795 3.40983 4.34816C3.76635 4.1665 4.23341 4.1665 5.16683 4.1665H14.8335C15.7669 4.1665 16.233 4.1665 16.5895 4.34816C16.9031 4.50795 17.1587 4.76273 17.3185 5.07633C17.5 5.43251 17.5 5.899 17.5 6.8306V13.1695C17.5 14.1011 17.5 14.5669 17.3185 14.9231C17.1587 15.2367 16.9031 15.4919 16.5895 15.6517C16.2333 15.8332 15.7675 15.8332 14.8359 15.8332H5.16409C4.23249 15.8332 3.766 15.8332 3.40983 15.6517C3.09623 15.4919 2.84144 15.2367 2.68166 14.9231C2.5 14.5666 2.5 14.1001 2.5 13.1667Z";
261
450
  function MailIcon({ size = 20, color = colors.primary, strokeWidth = 2 }) {
@@ -301,6 +490,53 @@ function PhoneIcon({ size = 20, color = colors.primary, strokeWidth = 2 }) {
301
490
  ) });
302
491
  }
303
492
 
493
+ // src/icons/Search/searchPath.ts
494
+ var SEARCH_CIRCLE_PATH = "M9.16667 15.8333C12.8486 15.8333 15.8333 12.8486 15.8333 9.16667C15.8333 5.48477 12.8486 2.5 9.16667 2.5C5.48477 2.5 2.5 5.48477 2.5 9.16667C2.5 12.8486 5.48477 15.8333 9.16667 15.8333Z";
495
+ var SEARCH_HANDLE_PATH = "M17.5 17.5L13.875 13.875";
496
+ function SearchIcon({
497
+ size = 20,
498
+ color = colors.primary,
499
+ strokeWidth = 2
500
+ }) {
501
+ return /* @__PURE__ */ jsxRuntime.jsxs(Svg__default.default, { width: size, height: size, viewBox: "0 0 20 20", fill: "none", children: [
502
+ /* @__PURE__ */ jsxRuntime.jsx(
503
+ Svg.Path,
504
+ {
505
+ d: SEARCH_CIRCLE_PATH,
506
+ stroke: color,
507
+ strokeWidth,
508
+ strokeLinecap: "round",
509
+ strokeLinejoin: "round"
510
+ }
511
+ ),
512
+ /* @__PURE__ */ jsxRuntime.jsx(
513
+ Svg.Path,
514
+ {
515
+ d: SEARCH_HANDLE_PATH,
516
+ stroke: color,
517
+ strokeWidth,
518
+ strokeLinecap: "round",
519
+ strokeLinejoin: "round"
520
+ }
521
+ )
522
+ ] });
523
+ }
524
+
525
+ // src/icons/Settings/settingsPath.ts
526
+ var SETTINGS_PATH = "M8.00004 10C9.10461 10 10 9.10457 10 8C10 6.89543 9.10461 6 8.00004 6C6.89547 6 6.00004 6.89543 6.00004 8C6.00004 9.10457 6.89547 10 8.00004 10Z M12.4849 9.81818C12.4042 10.001 12.3801 10.2038 12.4158 10.4004C12.4514 10.597 12.5452 10.7784 12.6849 10.9212L12.7213 10.9576C12.834 11.0702 12.9234 11.2038 12.9844 11.351C13.0454 11.4981 13.0768 11.6559 13.0768 11.8152C13.0768 11.9744 13.0454 12.1322 12.9844 12.2793C12.9234 12.4265 12.834 12.5602 12.7213 12.6727C12.6087 12.7854 12.475 12.8748 12.3278 12.9358C12.1807 12.9968 12.023 13.0282 11.8637 13.0282C11.7044 13.0282 11.5467 12.9968 11.3995 12.9358C11.2524 12.8748 11.1187 12.7854 11.0061 12.6727L10.9697 12.6364C10.8269 12.4966 10.6455 12.4029 10.4489 12.3673C10.2523 12.3316 10.0495 12.3557 9.86671 12.4364C9.68745 12.5132 9.53458 12.6408 9.42689 12.8034C9.31921 12.966 9.26142 13.1565 9.26065 13.3515V13.4545C9.26065 13.776 9.13294 14.0843 8.90562 14.3116C8.67831 14.539 8.37 14.6667 8.04853 14.6667C7.72705 14.6667 7.41874 14.539 7.19143 14.3116C6.96411 14.0843 6.8364 13.776 6.8364 13.4545V13.4C6.83171 13.1994 6.76678 13.0048 6.65005 12.8416C6.53331 12.6784 6.37018 12.5541 6.18186 12.4848C5.99906 12.4042 5.79629 12.3801 5.59968 12.4158C5.40308 12.4514 5.22166 12.5451 5.07883 12.6849L5.04246 12.7212C4.92989 12.8339 4.79621 12.9233 4.64906 12.9843C4.50191 13.0453 4.34418 13.0767 4.18489 13.0767C4.0256 13.0767 3.86787 13.0453 3.72072 12.9843C3.57357 12.9233 3.43989 12.8339 3.32731 12.7212C3.21461 12.6086 3.12521 12.475 3.06421 12.3278C3.00321 12.1807 2.97181 12.0229 2.97181 11.8636C2.97181 11.7043 3.00321 11.5466 3.06421 11.3995C3.12521 11.2523 3.21461 11.1186 3.32731 11.0061L3.36368 10.9697C3.5034 10.8269 3.59712 10.6454 3.63277 10.4488C3.66842 10.2522 3.64435 10.0495 3.56368 9.86667C3.48685 9.68741 3.35929 9.53454 3.19669 9.42686C3.03409 9.31917 2.84355 9.26139 2.64853 9.26061H2.5455C2.22402 9.26061 1.91571 9.1329 1.6884 8.90559C1.46108 8.67827 1.33337 8.36996 1.33337 8.04849C1.33337 7.72701 1.46108 7.4187 1.6884 7.19139C1.91571 6.96407 2.22402 6.83637 2.5455 6.83637H2.60004C2.80064 6.83167 2.9952 6.76674 3.1584 6.65001C3.32161 6.53328 3.44593 6.37014 3.51519 6.18182C3.59587 5.99902 3.61993 5.79625 3.58429 5.59965C3.54864 5.40304 3.45491 5.22163 3.31519 5.07879L3.27883 5.04243C3.16613 4.92985 3.07672 4.79617 3.01573 4.64902C2.95473 4.50187 2.92333 4.34414 2.92333 4.18485C2.92333 4.02556 2.95473 3.86783 3.01573 3.72068C3.07672 3.57353 3.16613 3.43985 3.27883 3.32728C3.3914 3.21458 3.52509 3.12517 3.67223 3.06417C3.81938 3.00317 3.97711 2.97178 4.1364 2.97178C4.2957 2.97178 4.45343 3.00317 4.60057 3.06417C4.74772 3.12517 4.88141 3.21458 4.99398 3.32728L5.03034 3.36364C5.17318 3.50336 5.3546 3.59708 5.5512 3.63273C5.7478 3.66838 5.95058 3.64431 6.13337 3.56364H6.18186C6.36111 3.48681 6.51399 3.35925 6.62167 3.19665C6.72935 3.03405 6.78714 2.84351 6.78792 2.64849V2.54546C6.78792 2.22398 6.91562 1.91567 7.14294 1.68836C7.37026 1.46104 7.67857 1.33334 8.00004 1.33334C8.32151 1.33334 8.62982 1.46104 8.85714 1.68836C9.08446 1.91567 9.21216 2.22398 9.21216 2.54546V2.6C9.21294 2.79502 9.27073 2.98556 9.37841 3.14816C9.48609 3.31076 9.63897 3.43833 9.81822 3.51515C10.001 3.59583 10.2038 3.6199 10.4004 3.58425C10.597 3.5486 10.7784 3.45487 10.9213 3.31515L10.9576 3.27879C11.0702 3.16609 11.2039 3.07669 11.351 3.01569C11.4982 2.95469 11.6559 2.92329 11.8152 2.92329C11.9745 2.92329 12.1322 2.95469 12.2794 3.01569C12.4265 3.07669 12.5602 3.16609 12.6728 3.27879C12.7855 3.39136 12.8749 3.52505 12.9359 3.6722C12.9969 3.81935 13.0283 3.97707 13.0283 4.13637C13.0283 4.29566 12.9969 4.45339 12.9359 4.60054C12.8749 4.74769 12.7855 4.88137 12.6728 4.99394L12.6364 5.03031C12.4967 5.17314 12.403 5.35456 12.3673 5.55116C12.3317 5.74776 12.3557 5.95054 12.4364 6.13334V6.18182C12.5132 6.36107 12.6408 6.51395 12.8034 6.62163C12.966 6.72932 13.1565 6.7871 13.3516 6.78788H13.4546C13.7761 6.78788 14.0844 6.91559 14.3117 7.1429C14.539 7.37022 14.6667 7.67853 14.6667 8C14.6667 8.32148 14.539 8.62978 14.3117 8.8571C14.0844 9.08442 13.7761 9.21212 13.4546 9.21212H13.4C13.205 9.2129 13.0145 9.27069 12.8519 9.37837C12.6893 9.48605 12.5617 9.63893 12.4849 9.81818Z";
527
+ function SettingsIcon({ size = 20, color = colors.primary, strokeWidth = 1.5 }) {
528
+ return /* @__PURE__ */ jsxRuntime.jsx(Svg__default.default, { width: size, height: size, viewBox: "0 0 16 16", fill: "none", children: /* @__PURE__ */ jsxRuntime.jsx(
529
+ Svg.Path,
530
+ {
531
+ d: SETTINGS_PATH,
532
+ stroke: color,
533
+ strokeWidth,
534
+ strokeLinecap: "round",
535
+ strokeLinejoin: "round"
536
+ }
537
+ ) });
538
+ }
539
+
304
540
  // src/icons/Show/showPath.ts
305
541
  var SHOW_PATH = "M1.66669 10C1.66669 10 4.16669 4.16667 10 4.16667C15.8334 4.16667 18.3334 10 18.3334 10C18.3334 10 15.8334 15.8333 10 15.8333C4.16669 15.8333 1.66669 10 1.66669 10Z";
306
542
  var SHOW_PUPIL_PATH = "M10 12.5C11.3807 12.5 12.5 11.3807 12.5 10C12.5 8.61929 11.3807 7.5 10 7.5C8.61929 7.5 7.5 8.61929 7.5 10C7.5 11.3807 8.61929 12.5 10 12.5Z";
@@ -344,33 +580,63 @@ function UserIcon({ size = 20, color = colors.primary, strokeWidth = 2 }) {
344
580
  ) });
345
581
  }
346
582
 
583
+ // src/icons/Video/videoPath.ts
584
+ var VIDEO_PATHS = [
585
+ "M14.6667 5.95424C14.6667 5.55036 14.6667 5.34843 14.5868 5.25492C14.5175 5.17378 14.4136 5.13072 14.3072 5.13909C14.1846 5.14874 14.0418 5.29153 13.7563 5.57712L11.3334 7.99999L13.7563 10.4229C14.0418 10.7085 14.1846 10.8512 14.3072 10.8609C14.4136 10.8693 14.5175 10.8262 14.5868 10.7451C14.6667 10.6516 14.6667 10.4496 14.6667 10.0457V5.95424Z",
586
+ "M1.33337 6.53333C1.33337 5.41322 1.33337 4.85317 1.55136 4.42535C1.74311 4.04902 2.04907 3.74306 2.42539 3.55132C2.85322 3.33333 3.41327 3.33333 4.53337 3.33333H8.13337C9.25348 3.33333 9.81353 3.33333 10.2414 3.55132C10.6177 3.74306 10.9236 4.04902 11.1154 4.42535C11.3334 4.85317 11.3334 5.41322 11.3334 6.53333V9.46666C11.3334 10.5868 11.3334 11.1468 11.1154 11.5746C10.9236 11.951 10.6177 12.2569 10.2414 12.4487C9.81353 12.6667 9.25348 12.6667 8.13337 12.6667H4.53337C3.41327 12.6667 2.85322 12.6667 2.42539 12.4487C2.04907 12.2569 1.74311 11.951 1.55136 11.5746C1.33337 11.1468 1.33337 10.5868 1.33337 9.46666V6.53333Z"
587
+ ];
588
+ function VideoIcon({ size = 20, color = colors.primary, strokeWidth = 1.5 }) {
589
+ return /* @__PURE__ */ jsxRuntime.jsx(Svg__default.default, { width: size, height: size, viewBox: "0 0 16 16", fill: "none", children: VIDEO_PATHS.map((path) => /* @__PURE__ */ jsxRuntime.jsx(
590
+ Svg.Path,
591
+ {
592
+ d: path,
593
+ stroke: color,
594
+ strokeWidth,
595
+ strokeLinecap: "round",
596
+ strokeLinejoin: "round"
597
+ },
598
+ path
599
+ )) });
600
+ }
601
+
347
602
  // src/icons/registry.ts
348
603
  var icons = {
349
604
  arrowRight: ArrowRightIcon,
350
605
  bag: BagIcon,
351
606
  bell: BellIcon,
352
607
  building: BuildingIcon,
608
+ calendar: CalendarIcon,
353
609
  camera: CameraIcon,
610
+ check: CheckIcon,
354
611
  checkBadge: CheckBadgeIcon,
612
+ chevronDown: ChevronDownIcon,
355
613
  clock: ClockIcon,
356
614
  facebook: FacebookIcon,
615
+ heart: HeartIcon,
616
+ helpCircle: HelpCircleIcon,
357
617
  home: HomeIcon,
358
618
  instagram: InstagramIcon,
359
619
  key: KeyIcon,
620
+ layoutGrid: LayoutGridIcon,
360
621
  linkedin: LinkedInIcon,
622
+ logOut: LogOutIcon,
361
623
  mail: MailIcon,
362
624
  navigate: NavigateIcon,
363
625
  phone: PhoneIcon,
626
+ search: SearchIcon,
627
+ settings: SettingsIcon,
364
628
  show: ShowIcon,
365
- user: UserIcon
629
+ user: UserIcon,
630
+ video: VideoIcon
366
631
  };
367
632
  var iconNames = Object.keys(icons);
368
633
  var iconGroups = {
369
- navigation: ["arrowRight", "home", "navigate"],
370
- actions: ["show", "bell", "camera", "key", "checkBadge"],
371
- objects: ["bag", "building", "clock", "user"],
634
+ navigation: ["arrowRight", "chevronDown", "home", "navigate"],
635
+ actions: ["show", "bell", "camera", "key", "check", "checkBadge", "search", "calendar", "heart"],
636
+ objects: ["bag", "building", "clock", "user", "video"],
372
637
  communication: ["mail", "phone"],
373
- social: ["facebook", "instagram", "linkedin"]
638
+ social: ["facebook", "instagram", "linkedin"],
639
+ interface: ["layoutGrid", "settings", "helpCircle", "logOut"]
374
640
  };
375
641
  var iconGroupNames = Object.keys(iconGroups);
376
642
  function getIconsByGroup(group) {
@@ -380,6 +646,18 @@ function Icon({ name, ...props }) {
380
646
  const Component = icons[name];
381
647
  return /* @__PURE__ */ jsxRuntime.jsx(Component, { ...props });
382
648
  }
649
+
650
+ // src/utils/mergeRefs.ts
651
+ function mergeRefs(internalRef, forwardedRef) {
652
+ return (node) => {
653
+ internalRef.current = node;
654
+ if (typeof forwardedRef === "function") {
655
+ forwardedRef(node);
656
+ } else if (forwardedRef) {
657
+ forwardedRef.current = node;
658
+ }
659
+ };
660
+ }
383
661
  function hasClassList(node) {
384
662
  return typeof node === "object" && node !== null && "classList" in node && typeof node.classList?.add === "function";
385
663
  }
@@ -420,129 +698,399 @@ function useApplyWebClassName(ref, className, enabled = true) {
420
698
  };
421
699
  }, [ref, className, enabled]);
422
700
  }
423
- var variantConfig = {
424
- primary: {
425
- backgroundColor: colors.primary,
426
- textColor: colors.white,
427
- iconBadgeBackgroundColor: colors.white,
428
- iconColor: colors.primary
429
- },
430
- secondary: {
431
- backgroundColor: colors.grey500,
432
- textColor: colors.white,
433
- iconBadgeBackgroundColor: colors.grey600,
434
- iconColor: colors.white
435
- }
436
- };
437
- var sizeConfig = {
438
- lg: {
439
- minHeight: 44,
440
- borderRadius: 40,
441
- paddingVertical: 4,
442
- paddingLeft: 20,
443
- paddingRightWithIcon: 4,
444
- paddingRight: 20,
445
- gap: 20,
446
- text: buttonTypography.lg,
447
- iconContainerSize: 36,
448
- iconSize: 20
449
- },
450
- sm: {
451
- minHeight: 32,
452
- borderRadius: 40,
453
- paddingVertical: 6,
454
- paddingLeft: 12,
455
- paddingRightWithIcon: 4,
456
- paddingRight: 12,
457
- gap: 12,
458
- text: buttonTypography.sm,
459
- iconContainerSize: 20,
460
- iconSize: 12
461
- }
462
- };
463
- function Button({
464
- title,
465
- children,
701
+ var IMAGE_SIZE = 48;
702
+ var CONTAINER_RADIUS = 71;
703
+ var CHEVRON_SIZE = 20;
704
+ var FALLBACK_ICON_SIZE = 20;
705
+ var MENU_RADIUS = 16;
706
+ var MENU_ITEM_RADIUS = 12;
707
+ var MENU_ITEM_ICON_SIZE = 16;
708
+ var Avatar = react.forwardRef(function Avatar2({
709
+ name,
710
+ email,
711
+ imageUrl,
466
712
  onPress,
467
713
  disabled = false,
468
- variant = "primary",
469
- size = "lg",
470
- showIcon = false,
471
- icon,
714
+ showChevron = true,
715
+ menuItems,
716
+ open: openProp,
717
+ defaultOpen = false,
718
+ onOpenChange,
719
+ menuWidth,
472
720
  style,
473
- textStyle,
474
721
  className,
475
- textClassName
476
- }) {
722
+ accessibilityLabel,
723
+ hitSlop = 8,
724
+ ...rest
725
+ }, forwardedRef) {
726
+ const wrapperRef = react.useRef(null);
477
727
  const containerRef = react.useRef(null);
478
- const textRef = react.useRef(null);
479
- const preset = variantConfig[variant];
480
- const metrics = sizeConfig[size];
481
- const label = typeof children !== "undefined" ? children : title;
482
- const hasCustomChildren = typeof children !== "undefined";
483
- const customIcon = icon != null && typeof icon !== "boolean" ? icon : void 0;
484
- const hasIcon = showIcon || icon === true || customIcon != null;
485
- const resolvedContainerClassName = className?.trim() || void 0;
486
- useApplyWebClassName(containerRef, resolvedContainerClassName);
487
- useApplyWebClassName(textRef, textClassName);
488
- const iconNode = customIcon ?? /* @__PURE__ */ jsxRuntime.jsx(ArrowRightIcon, { size: metrics.iconSize, color: preset.iconColor });
489
- const containerStyle = [
490
- styles.base,
491
- {
492
- minHeight: metrics.minHeight,
493
- borderRadius: metrics.borderRadius,
494
- backgroundColor: preset.backgroundColor,
495
- paddingTop: metrics.paddingVertical,
496
- paddingBottom: metrics.paddingVertical,
497
- paddingLeft: metrics.paddingLeft,
498
- paddingRight: hasIcon ? metrics.paddingRightWithIcon : metrics.paddingRight,
499
- gap: hasIcon ? metrics.gap : 0
728
+ const setContainerRef = react.useMemo(() => mergeRefs(containerRef, forwardedRef), [forwardedRef]);
729
+ const [imageFailed, setImageFailed] = react.useState(false);
730
+ const [hoveredKey, setHoveredKey] = react.useState(null);
731
+ const hasMenu = Boolean(menuItems && menuItems.length > 0);
732
+ const isInteractive = onPress != null || hasMenu;
733
+ const isOpenControlled = typeof openProp === "boolean";
734
+ const [uncontrolledOpen, setUncontrolledOpen] = react.useState(defaultOpen);
735
+ const isOpen = hasMenu && (isOpenControlled ? openProp : uncontrolledOpen);
736
+ useApplyWebClassName(containerRef, className);
737
+ const setOpen = react.useCallback(
738
+ (next) => {
739
+ if (!isOpenControlled) setUncontrolledOpen(next);
740
+ onOpenChange?.(next);
741
+ if (!next) setHoveredKey(null);
500
742
  },
501
- disabled && styles.disabled,
502
- style
503
- ];
504
- const labelStyle = [
505
- styles.label,
506
- metrics.text,
507
- { color: preset.textColor },
508
- reactNative.Platform.OS === "android" ? styles.labelAndroid : null,
509
- !hasIcon && styles.labelCentered,
510
- textStyle
511
- ];
512
- return /* @__PURE__ */ jsxRuntime.jsxs(
513
- reactNative.TouchableOpacity,
514
- {
515
- ref: containerRef,
516
- style: containerStyle,
517
- onPress,
518
- disabled,
519
- activeOpacity: 0.7,
520
- accessibilityRole: "button",
521
- accessibilityState: { disabled },
522
- children: [
523
- hasCustomChildren ? children : /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { ref: textRef, style: labelStyle, children: label }),
524
- hasIcon ? /* @__PURE__ */ jsxRuntime.jsx(
525
- reactNative.View,
526
- {
527
- style: [
528
- styles.iconContainer,
529
- {
530
- width: metrics.iconContainerSize,
531
- height: metrics.iconContainerSize,
532
- borderRadius: metrics.iconContainerSize / 2,
533
- backgroundColor: preset.iconBadgeBackgroundColor
534
- }
535
- ],
536
- children: iconNode
537
- }
538
- ) : null
539
- ]
540
- }
743
+ [isOpenControlled, onOpenChange]
541
744
  );
542
- }
543
- var styles = reactNative.StyleSheet.create({
544
- base: {
545
- flexDirection: "row",
745
+ const focusTrigger = react.useCallback(() => {
746
+ const node = containerRef.current;
747
+ node?.focus?.();
748
+ }, []);
749
+ const closeAndFocusTrigger = react.useCallback(() => {
750
+ setOpen(false);
751
+ focusTrigger();
752
+ }, [focusTrigger, setOpen]);
753
+ const handlePress = (event) => {
754
+ onPress?.(event);
755
+ if (hasMenu) setOpen(!isOpen);
756
+ };
757
+ const handleItemPress = react.useCallback(
758
+ (item) => {
759
+ if (item.disabled) return;
760
+ item.onPress();
761
+ closeAndFocusTrigger();
762
+ },
763
+ [closeAndFocusTrigger]
764
+ );
765
+ react.useEffect(() => {
766
+ if (reactNative.Platform.OS !== "web" || !isOpen) return;
767
+ const handlePointerDown = (event) => {
768
+ const wrapper = wrapperRef.current;
769
+ const target = event.target;
770
+ if (wrapper?.contains && target instanceof Node && !wrapper.contains(target)) {
771
+ setOpen(false);
772
+ }
773
+ };
774
+ document.addEventListener("mousedown", handlePointerDown);
775
+ document.addEventListener("touchstart", handlePointerDown);
776
+ return () => {
777
+ document.removeEventListener("mousedown", handlePointerDown);
778
+ document.removeEventListener("touchstart", handlePointerDown);
779
+ };
780
+ }, [isOpen, setOpen]);
781
+ react.useEffect(() => {
782
+ if (reactNative.Platform.OS !== "web" || !isOpen) return;
783
+ const handleKeyDown = (event) => {
784
+ if (event.key === "Escape") {
785
+ event.preventDefault();
786
+ closeAndFocusTrigger();
787
+ }
788
+ };
789
+ document.addEventListener("keydown", handleKeyDown);
790
+ return () => document.removeEventListener("keydown", handleKeyDown);
791
+ }, [isOpen, closeAndFocusTrigger]);
792
+ const hasImage = Boolean(imageUrl) && !imageFailed;
793
+ const resolvedAccessibilityLabel = accessibilityLabel ?? [name, email].filter(Boolean).join(", ");
794
+ return /* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { ref: wrapperRef, style: [styles.wrapper, isOpen && styles.wrapperOpen], children: [
795
+ /* @__PURE__ */ jsxRuntime.jsxs(
796
+ reactNative.Pressable,
797
+ {
798
+ ...rest,
799
+ ref: setContainerRef,
800
+ onPress: handlePress,
801
+ disabled: disabled || !isInteractive,
802
+ hitSlop: isInteractive ? hitSlop : void 0,
803
+ accessibilityRole: isInteractive ? "button" : void 0,
804
+ accessibilityLabel: resolvedAccessibilityLabel,
805
+ accessibilityState: isInteractive ? { disabled, expanded: hasMenu ? isOpen : void 0 } : void 0,
806
+ style: [styles.root, disabled && styles.disabled, style],
807
+ children: [
808
+ /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: styles.imageWrap, children: hasImage ? /* @__PURE__ */ jsxRuntime.jsx(
809
+ reactNative.Image,
810
+ {
811
+ source: { uri: imageUrl ?? void 0 },
812
+ style: styles.image,
813
+ onError: () => setImageFailed(true)
814
+ }
815
+ ) : /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: styles.imageFallback, children: /* @__PURE__ */ jsxRuntime.jsx(UserIcon, { size: FALLBACK_ICON_SIZE, color: colors.primary }) }) }),
816
+ /* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: styles.textColumn, children: [
817
+ /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.name, numberOfLines: 1, children: name }),
818
+ email ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.email, numberOfLines: 1, children: email }) : null
819
+ ] }),
820
+ showChevron ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: [styles.chevronSlot, isOpen && styles.chevronOpen], children: /* @__PURE__ */ jsxRuntime.jsx(ChevronDownIcon, { size: CHEVRON_SIZE, color: isOpen ? colors.primary : colors.grey100 }) }) : null
821
+ ]
822
+ }
823
+ ),
824
+ hasMenu && isOpen ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: [styles.menu, menuWidth != null && { right: void 0, width: menuWidth }], children: menuItems.map((item) => {
825
+ const itemKey = item.key ?? item.label;
826
+ const isHovered = hoveredKey === itemKey;
827
+ const backgroundColor = isHovered ? item.hoverColor ?? colors.grey600 : item.backgroundColor ?? "transparent";
828
+ return /* @__PURE__ */ jsxRuntime.jsxs(
829
+ reactNative.Pressable,
830
+ {
831
+ onPress: () => handleItemPress(item),
832
+ disabled: item.disabled,
833
+ onHoverIn: () => setHoveredKey(itemKey),
834
+ onHoverOut: () => setHoveredKey((current) => current === itemKey ? null : current),
835
+ onPressIn: () => setHoveredKey(itemKey),
836
+ onPressOut: () => setHoveredKey((current) => current === itemKey ? null : current),
837
+ accessibilityRole: "menuitem",
838
+ accessibilityState: { disabled: item.disabled },
839
+ style: [
840
+ styles.menuItem,
841
+ { backgroundColor },
842
+ item.disabled && styles.menuItemDisabled
843
+ ],
844
+ children: [
845
+ item.icon ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: styles.menuItemIcon, children: item.icon }) : null,
846
+ /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.menuItemLabel, numberOfLines: 1, children: item.label })
847
+ ]
848
+ },
849
+ itemKey
850
+ );
851
+ }) }) : null
852
+ ] });
853
+ });
854
+ var styles = reactNative.StyleSheet.create({
855
+ wrapper: {
856
+ position: "relative",
857
+ alignSelf: "flex-start"
858
+ },
859
+ wrapperOpen: {
860
+ zIndex: 20
861
+ },
862
+ root: {
863
+ flexDirection: "row",
864
+ alignItems: "center",
865
+ alignSelf: "flex-start",
866
+ gap: 12,
867
+ paddingTop: 4,
868
+ paddingBottom: 4,
869
+ paddingLeft: 4,
870
+ paddingRight: 12,
871
+ borderRadius: CONTAINER_RADIUS,
872
+ backgroundColor: colors.grey700
873
+ },
874
+ disabled: {
875
+ opacity: 0.6
876
+ },
877
+ imageWrap: {
878
+ width: IMAGE_SIZE,
879
+ height: IMAGE_SIZE,
880
+ borderRadius: IMAGE_SIZE / 2,
881
+ overflow: "hidden",
882
+ flexShrink: 0
883
+ },
884
+ image: {
885
+ width: IMAGE_SIZE,
886
+ height: IMAGE_SIZE
887
+ },
888
+ imageFallback: {
889
+ width: IMAGE_SIZE,
890
+ height: IMAGE_SIZE,
891
+ alignItems: "center",
892
+ justifyContent: "center",
893
+ backgroundColor: colors.grey600
894
+ },
895
+ textColumn: {
896
+ minWidth: 0,
897
+ flexShrink: 1,
898
+ gap: 3
899
+ },
900
+ name: {
901
+ ...avatarTypography.name,
902
+ color: colors.white
903
+ },
904
+ email: {
905
+ ...avatarTypography.email,
906
+ color: colors.grey0
907
+ },
908
+ chevronSlot: {
909
+ width: CHEVRON_SIZE,
910
+ height: CHEVRON_SIZE,
911
+ alignItems: "center",
912
+ justifyContent: "center",
913
+ flexShrink: 0
914
+ },
915
+ chevronOpen: {
916
+ transform: [{ rotate: "180deg" }]
917
+ },
918
+ menu: {
919
+ position: "absolute",
920
+ top: "100%",
921
+ left: 0,
922
+ right: 0,
923
+ marginTop: 8,
924
+ zIndex: 10,
925
+ borderRadius: MENU_RADIUS,
926
+ padding: 8,
927
+ gap: 8,
928
+ backgroundColor: colors.grey700,
929
+ ...reactNative.Platform.select({
930
+ web: {
931
+ boxShadow: `0 8px 24px ${colors.black}73`
932
+ },
933
+ default: {
934
+ elevation: 8
935
+ }
936
+ })
937
+ },
938
+ menuItem: {
939
+ minHeight: 40,
940
+ borderRadius: MENU_ITEM_RADIUS,
941
+ paddingVertical: 12,
942
+ paddingHorizontal: 12,
943
+ flexDirection: "row",
944
+ alignItems: "center",
945
+ gap: 8
946
+ },
947
+ menuItemDisabled: {
948
+ opacity: 0.5
949
+ },
950
+ menuItemIcon: {
951
+ width: MENU_ITEM_ICON_SIZE,
952
+ height: MENU_ITEM_ICON_SIZE,
953
+ alignItems: "center",
954
+ justifyContent: "center",
955
+ flexShrink: 0
956
+ },
957
+ menuItemLabel: {
958
+ ...avatarTypography.menuItem,
959
+ color: colors.white,
960
+ flex: 1
961
+ }
962
+ });
963
+ var variantConfig = {
964
+ primary: {
965
+ backgroundColor: colors.primary,
966
+ textColor: colors.white,
967
+ iconBadgeBackgroundColor: colors.white,
968
+ iconColor: colors.primary
969
+ },
970
+ secondary: {
971
+ backgroundColor: colors.grey500,
972
+ textColor: colors.white,
973
+ iconBadgeBackgroundColor: colors.grey600,
974
+ iconColor: colors.white
975
+ }
976
+ };
977
+ var sizeConfig = {
978
+ lg: {
979
+ minHeight: 44,
980
+ borderRadius: 40,
981
+ paddingVertical: 4,
982
+ paddingLeft: 20,
983
+ paddingRightWithIcon: 4,
984
+ paddingRight: 20,
985
+ gap: 20,
986
+ text: buttonTypography.lg,
987
+ iconContainerSize: 36,
988
+ iconSize: 20
989
+ },
990
+ sm: {
991
+ minHeight: 32,
992
+ borderRadius: 40,
993
+ paddingVertical: 6,
994
+ paddingLeft: 12,
995
+ paddingRightWithIcon: 4,
996
+ paddingRight: 12,
997
+ gap: 12,
998
+ text: buttonTypography.sm,
999
+ iconContainerSize: 20,
1000
+ iconSize: 12
1001
+ }
1002
+ };
1003
+ var Button = react.forwardRef(
1004
+ function Button2({
1005
+ title,
1006
+ children,
1007
+ onPress,
1008
+ disabled = false,
1009
+ variant = "primary",
1010
+ size = "lg",
1011
+ showIcon = false,
1012
+ icon,
1013
+ style,
1014
+ textStyle,
1015
+ className,
1016
+ textClassName,
1017
+ accessibilityLabel,
1018
+ ...rest
1019
+ }, forwardedRef) {
1020
+ const containerRef = react.useRef(null);
1021
+ const textRef = react.useRef(null);
1022
+ const preset = variantConfig[variant];
1023
+ const metrics = sizeConfig[size];
1024
+ const label = typeof children !== "undefined" ? children : title;
1025
+ const hasCustomChildren = typeof children !== "undefined";
1026
+ const customIcon = icon != null && typeof icon !== "boolean" ? icon : void 0;
1027
+ const hasIcon = showIcon || icon === true || customIcon != null;
1028
+ const resolvedContainerClassName = className?.trim() || void 0;
1029
+ const resolvedAccessibilityLabel = accessibilityLabel ?? (typeof label === "string" ? label : void 0);
1030
+ const setContainerRef = react.useMemo(() => mergeRefs(containerRef, forwardedRef), [forwardedRef]);
1031
+ useApplyWebClassName(containerRef, resolvedContainerClassName);
1032
+ useApplyWebClassName(textRef, textClassName);
1033
+ const iconNode = customIcon ?? /* @__PURE__ */ jsxRuntime.jsx(ArrowRightIcon, { size: metrics.iconSize, color: preset.iconColor });
1034
+ const containerStyle = [
1035
+ styles2.base,
1036
+ {
1037
+ minHeight: metrics.minHeight,
1038
+ borderRadius: metrics.borderRadius,
1039
+ backgroundColor: preset.backgroundColor,
1040
+ paddingTop: metrics.paddingVertical,
1041
+ paddingBottom: metrics.paddingVertical,
1042
+ paddingLeft: metrics.paddingLeft,
1043
+ paddingRight: hasIcon ? metrics.paddingRightWithIcon : metrics.paddingRight,
1044
+ gap: hasIcon ? metrics.gap : 0
1045
+ },
1046
+ disabled && styles2.disabled,
1047
+ style
1048
+ ];
1049
+ const labelStyle = [
1050
+ styles2.label,
1051
+ metrics.text,
1052
+ { color: preset.textColor },
1053
+ reactNative.Platform.OS === "android" ? styles2.labelAndroid : null,
1054
+ !hasIcon && styles2.labelCentered,
1055
+ textStyle
1056
+ ];
1057
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1058
+ reactNative.TouchableOpacity,
1059
+ {
1060
+ ...rest,
1061
+ ref: setContainerRef,
1062
+ style: containerStyle,
1063
+ onPress,
1064
+ disabled,
1065
+ activeOpacity: 0.7,
1066
+ accessibilityRole: "button",
1067
+ accessibilityLabel: resolvedAccessibilityLabel,
1068
+ accessibilityState: { disabled },
1069
+ children: [
1070
+ hasCustomChildren ? children : /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { ref: textRef, style: labelStyle, children: label }),
1071
+ hasIcon ? /* @__PURE__ */ jsxRuntime.jsx(
1072
+ reactNative.View,
1073
+ {
1074
+ style: [
1075
+ styles2.iconContainer,
1076
+ {
1077
+ width: metrics.iconContainerSize,
1078
+ height: metrics.iconContainerSize,
1079
+ borderRadius: metrics.iconContainerSize / 2,
1080
+ backgroundColor: preset.iconBadgeBackgroundColor
1081
+ }
1082
+ ],
1083
+ children: iconNode
1084
+ }
1085
+ ) : null
1086
+ ]
1087
+ }
1088
+ );
1089
+ }
1090
+ );
1091
+ var styles2 = reactNative.StyleSheet.create({
1092
+ base: {
1093
+ flexDirection: "row",
546
1094
  alignItems: "center",
547
1095
  alignSelf: "flex-start",
548
1096
  borderWidth: 0
@@ -563,6 +1111,105 @@ var styles = reactNative.StyleSheet.create({
563
1111
  flexShrink: 0
564
1112
  }
565
1113
  });
1114
+ var BOX_SIZE = 20;
1115
+ var BOX_RADIUS = 6;
1116
+ var CHECK_SIZE = 12;
1117
+ var CHECK_STROKE = 2.5;
1118
+ var variantChrome = {
1119
+ default: {
1120
+ backgroundColor: colors.dark,
1121
+ borderColor: colors.grey700
1122
+ },
1123
+ light: {
1124
+ backgroundColor: colors.grey700,
1125
+ borderColor: colors.grey500
1126
+ }
1127
+ };
1128
+ var Checkbox = react.forwardRef(function Checkbox2({
1129
+ value,
1130
+ defaultValue = false,
1131
+ onValueChange,
1132
+ disabled = false,
1133
+ variant = "default",
1134
+ label,
1135
+ children,
1136
+ style,
1137
+ labelStyle,
1138
+ className,
1139
+ hitSlop = 8,
1140
+ accessibilityLabel,
1141
+ ...rest
1142
+ }, forwardedRef) {
1143
+ const containerRef = react.useRef(null);
1144
+ const isControlled = typeof value === "boolean";
1145
+ const [uncontrolledValue, setUncontrolledValue] = react.useState(defaultValue);
1146
+ const isActive = isControlled ? value : uncontrolledValue;
1147
+ const chrome = variantChrome[variant];
1148
+ const labelContent = children ?? label;
1149
+ const resolvedAccessibilityLabel = accessibilityLabel ?? (typeof labelContent === "string" ? labelContent : void 0);
1150
+ const setContainerRef = react.useMemo(() => mergeRefs(containerRef, forwardedRef), [forwardedRef]);
1151
+ useApplyWebClassName(containerRef, className);
1152
+ const handlePress = () => {
1153
+ if (disabled) return;
1154
+ const next = !isActive;
1155
+ if (!isControlled) setUncontrolledValue(next);
1156
+ onValueChange?.(next);
1157
+ };
1158
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1159
+ reactNative.Pressable,
1160
+ {
1161
+ ...rest,
1162
+ ref: setContainerRef,
1163
+ onPress: handlePress,
1164
+ disabled,
1165
+ hitSlop,
1166
+ accessibilityRole: "checkbox",
1167
+ accessibilityLabel: resolvedAccessibilityLabel,
1168
+ accessibilityState: { checked: isActive, disabled },
1169
+ style: [styles3.root, disabled && styles3.disabled, style],
1170
+ children: [
1171
+ /* @__PURE__ */ jsxRuntime.jsx(
1172
+ reactNative.View,
1173
+ {
1174
+ style: [
1175
+ styles3.box,
1176
+ {
1177
+ backgroundColor: chrome.backgroundColor,
1178
+ borderColor: chrome.borderColor
1179
+ }
1180
+ ],
1181
+ children: isActive ? /* @__PURE__ */ jsxRuntime.jsx(CheckIcon, { size: CHECK_SIZE, color: colors.primary, strokeWidth: CHECK_STROKE }) : null
1182
+ }
1183
+ ),
1184
+ labelContent != null && labelContent !== false ? typeof labelContent === "string" || typeof labelContent === "number" ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: [styles3.label, labelStyle], children: labelContent }) : labelContent : null
1185
+ ]
1186
+ }
1187
+ );
1188
+ });
1189
+ var styles3 = reactNative.StyleSheet.create({
1190
+ root: {
1191
+ flexDirection: "row",
1192
+ alignItems: "center",
1193
+ alignSelf: "flex-start",
1194
+ gap: 10
1195
+ },
1196
+ disabled: {
1197
+ opacity: 0.5
1198
+ },
1199
+ box: {
1200
+ width: BOX_SIZE,
1201
+ height: BOX_SIZE,
1202
+ borderRadius: BOX_RADIUS,
1203
+ borderWidth: 1,
1204
+ alignItems: "center",
1205
+ justifyContent: "center",
1206
+ flexShrink: 0
1207
+ },
1208
+ label: {
1209
+ ...inputTypography.field,
1210
+ color: colors.white
1211
+ }
1212
+ });
566
1213
  var DEFAULT_WIDTH = 308;
567
1214
  var sizeConfig2 = {
568
1215
  lg: {
@@ -584,14 +1231,12 @@ var sizeConfig2 = {
584
1231
  text: inputTypography.hint
585
1232
  }
586
1233
  };
587
- function resolveState({
588
- state,
1234
+ function resolveVisualState({
589
1235
  disabled,
590
1236
  error,
591
1237
  focused,
592
1238
  hasValue
593
1239
  }) {
594
- if (state) return state;
595
1240
  if (disabled) return "disabled";
596
1241
  if (error) return "error";
597
1242
  if (focused) return "active";
@@ -643,13 +1288,12 @@ function chromeFor(state) {
643
1288
  return base;
644
1289
  }
645
1290
  }
646
- function Input({
1291
+ var Input = react.forwardRef(function Input2({
647
1292
  label = "Label",
648
1293
  showLabel = true,
649
1294
  hint = "Hint",
650
1295
  showHint = true,
651
1296
  placeholder = "placeholder",
652
- state: stateProp,
653
1297
  size = "lg",
654
1298
  disabled = false,
655
1299
  error = false,
@@ -663,43 +1307,40 @@ function Input({
663
1307
  rightIcon,
664
1308
  showRightIcon = false,
665
1309
  onRightIconPress,
1310
+ rightIconAccessibilityLabel,
666
1311
  style,
667
1312
  fieldStyle,
668
1313
  inputStyle,
669
1314
  className,
670
1315
  inputClassName,
1316
+ accessibilityLabel,
671
1317
  ...textInputProps
672
- }) {
1318
+ }, forwardedRef) {
673
1319
  const rootRef = react.useRef(null);
674
1320
  const inputRef = react.useRef(null);
1321
+ const setInputRef = react.useMemo(() => mergeRefs(inputRef, forwardedRef), [forwardedRef]);
675
1322
  const [focused, setFocused] = react.useState(false);
676
1323
  const [uncontrolledValue, setUncontrolledValue] = react.useState(defaultValue ?? "");
677
1324
  const metrics = sizeConfig2[size];
678
1325
  const isControlled = typeof value === "string";
679
1326
  const currentValue = isControlled ? value : uncontrolledValue;
680
1327
  const hasValue = currentValue.length > 0;
681
- const resolvedState = resolveState({
682
- state: stateProp,
683
- disabled,
684
- error,
685
- focused,
686
- hasValue
687
- });
688
- const chrome = chromeFor(resolvedState);
689
- const isDisabled = resolvedState === "disabled" || disabled;
1328
+ const visualState = resolveVisualState({ disabled, error, focused, hasValue });
1329
+ const chrome = chromeFor(visualState);
1330
+ const resolvedAccessibilityLabel = accessibilityLabel ?? (showLabel ? void 0 : label);
690
1331
  const hasLeftIcon = showLeftIcon || leftIcon != null;
691
1332
  const hasRightIcon = showRightIcon || rightIcon != null;
692
1333
  const leftIconNode = leftIcon ?? /* @__PURE__ */ jsxRuntime.jsx(UserIcon, { size: metrics.iconSize, color: chrome.leftIconColor });
693
1334
  const rightIconNode = rightIcon ?? /* @__PURE__ */ jsxRuntime.jsx(ShowIcon, { size: metrics.iconSize, color: chrome.rightIconColor });
694
1335
  useApplyWebClassName(rootRef, className);
695
1336
  useApplyWebClassName(inputRef, inputClassName);
696
- return /* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { ref: rootRef, style: [styles2.root, isDisabled && styles2.disabled, style], children: [
697
- showLabel && label ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: [styles2.label, { color: chrome.labelColor }], children: label }) : null,
1337
+ return /* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { ref: rootRef, style: [styles4.root, disabled && styles4.disabled, style], children: [
1338
+ showLabel && label ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: [styles4.label, { color: chrome.labelColor }], children: label }) : null,
698
1339
  /* @__PURE__ */ jsxRuntime.jsxs(
699
1340
  reactNative.View,
700
1341
  {
701
1342
  style: [
702
- styles2.field,
1343
+ styles4.field,
703
1344
  {
704
1345
  height: metrics.height,
705
1346
  borderRadius: metrics.borderRadius,
@@ -714,15 +1355,15 @@ function Input({
714
1355
  fieldStyle
715
1356
  ],
716
1357
  children: [
717
- hasLeftIcon ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: [styles2.iconSlot, { width: metrics.iconSize, height: metrics.iconSize }], children: leftIconNode }) : null,
1358
+ hasLeftIcon ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: [styles4.iconSlot, { width: metrics.iconSize, height: metrics.iconSize }], children: leftIconNode }) : null,
718
1359
  /* @__PURE__ */ jsxRuntime.jsx(
719
1360
  reactNative.TextInput,
720
1361
  {
721
- ref: inputRef,
1362
+ ref: setInputRef,
722
1363
  ...textInputProps,
723
1364
  value: isControlled ? value : void 0,
724
1365
  defaultValue: isControlled ? void 0 : defaultValue,
725
- editable: !isDisabled,
1366
+ editable: !disabled,
726
1367
  placeholder,
727
1368
  placeholderTextColor: chrome.placeholderColor,
728
1369
  onChangeText: (text) => {
@@ -738,34 +1379,36 @@ function Input({
738
1379
  onBlur?.(event);
739
1380
  },
740
1381
  style: [
741
- styles2.input,
1382
+ styles4.input,
742
1383
  metrics.text,
743
1384
  { color: chrome.textColor },
744
- reactNative.Platform.OS === "web" ? styles2.inputWeb : null,
745
- reactNative.Platform.OS === "android" ? styles2.inputAndroid : null,
1385
+ reactNative.Platform.OS === "web" ? styles4.inputWeb : null,
1386
+ reactNative.Platform.OS === "android" ? styles4.inputAndroid : null,
746
1387
  inputStyle
747
1388
  ],
748
- accessibilityState: { disabled: isDisabled }
1389
+ accessibilityLabel: resolvedAccessibilityLabel,
1390
+ accessibilityState: { disabled }
749
1391
  }
750
1392
  ),
751
1393
  hasRightIcon ? onRightIconPress ? /* @__PURE__ */ jsxRuntime.jsx(
752
1394
  reactNative.TouchableOpacity,
753
1395
  {
754
1396
  onPress: onRightIconPress,
755
- disabled: isDisabled,
756
- style: [styles2.iconSlot, { width: metrics.iconSize, height: metrics.iconSize }],
1397
+ disabled,
1398
+ style: [styles4.iconSlot, { width: metrics.iconSize, height: metrics.iconSize }],
757
1399
  accessibilityRole: "button",
1400
+ accessibilityLabel: rightIconAccessibilityLabel,
758
1401
  hitSlop: 8,
759
1402
  children: rightIconNode
760
1403
  }
761
- ) : /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: [styles2.iconSlot, { width: metrics.iconSize, height: metrics.iconSize }], children: rightIconNode }) : null
1404
+ ) : /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: [styles4.iconSlot, { width: metrics.iconSize, height: metrics.iconSize }], children: rightIconNode }) : null
762
1405
  ]
763
1406
  }
764
1407
  ),
765
- showHint && hint ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: [styles2.hint, { color: chrome.hintColor }], children: hint }) : null
1408
+ showHint && hint ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: [styles4.hint, { color: chrome.hintColor }], children: hint }) : null
766
1409
  ] });
767
- }
768
- var styles2 = reactNative.StyleSheet.create({
1410
+ });
1411
+ var styles4 = reactNative.StyleSheet.create({
769
1412
  root: {
770
1413
  width: DEFAULT_WIDTH,
771
1414
  gap: 8,
@@ -802,27 +1445,961 @@ var styles2 = reactNative.StyleSheet.create({
802
1445
  ...inputTypography.hint
803
1446
  }
804
1447
  });
1448
+ var DEFAULT_WIDTH2 = 308;
1449
+ var TRIGGER_HEIGHT = 44;
1450
+ var TRIGGER_RADIUS = 60;
1451
+ var MENU_RADIUS2 = 24;
1452
+ var MENU_MAX_LIST_HEIGHT = 248;
1453
+ var ITEM_RADIUS = 12;
1454
+ var ICON_SIZE = 20;
1455
+ var CHIP_GAP = 6;
1456
+ var FALLBACK_ELLIPSIS_WIDTH = 20;
1457
+ function itemBackground(state) {
1458
+ switch (state) {
1459
+ case "hover":
1460
+ return colors.grey600;
1461
+ case "selected":
1462
+ return colors.primaryMuted;
1463
+ default:
1464
+ return "transparent";
1465
+ }
1466
+ }
1467
+ function toArray(value) {
1468
+ if (value == null || value === "") return [];
1469
+ return Array.isArray(value) ? value : [value];
1470
+ }
1471
+ function resolveVisibleOptions(options, containerWidth, chipWidths, ellipsisWidth) {
1472
+ if (options.length === 0) return { visible: [], hasOverflow: false };
1473
+ if (containerWidth <= 0) return { visible: options.slice(0, 1), hasOverflow: options.length > 1 };
1474
+ const visible = [];
1475
+ let used = 0;
1476
+ for (let index = 0; index < options.length; index += 1) {
1477
+ const option = options[index];
1478
+ const chipWidth = chipWidths[option.value];
1479
+ if (chipWidth == null) {
1480
+ if (visible.length === 0) visible.push(option);
1481
+ break;
1482
+ }
1483
+ const remainingAfter = options.length - index - 1;
1484
+ const gap = visible.length > 0 ? CHIP_GAP : 0;
1485
+ const reserve = remainingAfter > 0 ? CHIP_GAP + ellipsisWidth : 0;
1486
+ const nextUsed = used + gap + chipWidth;
1487
+ if (visible.length > 0 && nextUsed + reserve > containerWidth) {
1488
+ return { visible, hasOverflow: true };
1489
+ }
1490
+ visible.push(option);
1491
+ used = nextUsed;
1492
+ }
1493
+ return { visible, hasOverflow: visible.length < options.length };
1494
+ }
1495
+ function MultiValueChips({ options, disabled, onRemove }) {
1496
+ const [containerWidth, setContainerWidth] = react.useState(0);
1497
+ const [chipWidths, setChipWidths] = react.useState({});
1498
+ const [ellipsisWidth, setEllipsisWidth] = react.useState(FALLBACK_ELLIPSIS_WIDTH);
1499
+ react.useEffect(() => {
1500
+ setChipWidths((current) => {
1501
+ const validValues = new Set(options.map((option) => option.value));
1502
+ const keys = Object.keys(current);
1503
+ if (keys.every((key) => validValues.has(key))) return current;
1504
+ const next = {};
1505
+ for (const key of keys) {
1506
+ if (validValues.has(key)) next[key] = current[key];
1507
+ }
1508
+ return next;
1509
+ });
1510
+ }, [options]);
1511
+ const { visible, hasOverflow } = react.useMemo(
1512
+ () => resolveVisibleOptions(options, containerWidth, chipWidths, ellipsisWidth),
1513
+ [chipWidths, containerWidth, ellipsisWidth, options]
1514
+ );
1515
+ const handleContainerLayout = (event) => {
1516
+ const next = Math.floor(event.nativeEvent.layout.width);
1517
+ setContainerWidth((current) => current === next ? current : next);
1518
+ };
1519
+ const handleChipLayout = (value, event) => {
1520
+ const next = Math.ceil(event.nativeEvent.layout.width);
1521
+ setChipWidths((current) => current[value] === next ? current : { ...current, [value]: next });
1522
+ };
1523
+ const handleEllipsisLayout = (event) => {
1524
+ const next = Math.ceil(event.nativeEvent.layout.width);
1525
+ setEllipsisWidth((current) => current === next ? current : next);
1526
+ };
1527
+ return /* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: styles5.multiValueRoot, children: [
1528
+ /* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { pointerEvents: "none", style: styles5.measureRow, children: [
1529
+ options.map((option) => /* @__PURE__ */ jsxRuntime.jsxs(
1530
+ reactNative.View,
1531
+ {
1532
+ style: styles5.chip,
1533
+ onLayout: (event) => handleChipLayout(option.value, event),
1534
+ children: [
1535
+ /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles5.chipLabel, numberOfLines: 1, children: option.label }),
1536
+ /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles5.chipRemove, children: "\xD7" })
1537
+ ]
1538
+ },
1539
+ `measure-${option.value}`
1540
+ )),
1541
+ /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: styles5.ellipsis, onLayout: handleEllipsisLayout, children: /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles5.ellipsisText, children: "..." }) })
1542
+ ] }),
1543
+ /* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: styles5.chipsRow, onLayout: handleContainerLayout, children: [
1544
+ visible.map((option) => /* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: styles5.chip, children: [
1545
+ /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles5.chipLabel, numberOfLines: 1, children: option.label }),
1546
+ /* @__PURE__ */ jsxRuntime.jsx(
1547
+ reactNative.Pressable,
1548
+ {
1549
+ onPress: (event) => {
1550
+ event?.stopPropagation?.();
1551
+ onRemove(option.value);
1552
+ },
1553
+ disabled,
1554
+ hitSlop: 6,
1555
+ accessibilityRole: "button",
1556
+ accessibilityLabel: `Remove ${option.label}`,
1557
+ children: /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles5.chipRemove, children: "\xD7" })
1558
+ }
1559
+ )
1560
+ ] }, option.value)),
1561
+ hasOverflow ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: styles5.ellipsis, children: /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles5.ellipsisText, children: "..." }) }) : null
1562
+ ] })
1563
+ ] });
1564
+ }
1565
+ var Select = react.forwardRef(
1566
+ function Select2(props, forwardedRef) {
1567
+ const {
1568
+ label = "Label",
1569
+ showLabel = true,
1570
+ hint,
1571
+ showHint = false,
1572
+ placeholder = "placeholder",
1573
+ options,
1574
+ open: openProp,
1575
+ defaultOpen = false,
1576
+ onOpenChange,
1577
+ disabled = false,
1578
+ error = false,
1579
+ leftIcon,
1580
+ showLeftIcon = true,
1581
+ showSearch = true,
1582
+ searchPlaceholder = "Search...",
1583
+ onSearchChange,
1584
+ loading = false,
1585
+ emptyText = "No results",
1586
+ style,
1587
+ className,
1588
+ accessibilityLabel,
1589
+ // Pulled out only to keep them off `rest` (which is spread onto the root View);
1590
+ // the real values are read from `props` directly below to preserve discriminated typing.
1591
+ multiple: _multiple,
1592
+ value: _value,
1593
+ defaultValue: _defaultValue,
1594
+ onValueChange: _onValueChange,
1595
+ ...rest
1596
+ } = props;
1597
+ const multiple = props.multiple === true;
1598
+ const valueProp = props.value;
1599
+ const rootRef = react.useRef(null);
1600
+ const triggerRef = react.useRef(null);
1601
+ const searchInputRef = react.useRef(null);
1602
+ const setRootRef = react.useMemo(() => mergeRefs(rootRef, forwardedRef), [forwardedRef]);
1603
+ const isOpenControlled = typeof openProp === "boolean";
1604
+ const isValueControlled = valueProp !== void 0;
1605
+ const [uncontrolledSingle, setUncontrolledSingle] = react.useState(
1606
+ !multiple ? props.defaultValue ?? "" : ""
1607
+ );
1608
+ const [uncontrolledMultiple, setUncontrolledMultiple] = react.useState(
1609
+ multiple ? props.defaultValue ?? [] : []
1610
+ );
1611
+ const [uncontrolledOpen, setUncontrolledOpen] = react.useState(defaultOpen);
1612
+ const [searchQuery, setSearchQuery] = react.useState("");
1613
+ const [hoveredValue, setHoveredValue] = react.useState(null);
1614
+ const selectedValues = react.useMemo(() => {
1615
+ const current = isValueControlled ? valueProp : multiple ? uncontrolledMultiple : uncontrolledSingle;
1616
+ return toArray(current);
1617
+ }, [isValueControlled, multiple, valueProp, uncontrolledMultiple, uncontrolledSingle]);
1618
+ const isOpen = isOpenControlled ? openProp : uncontrolledOpen;
1619
+ const selectedOptions = react.useMemo(
1620
+ () => selectedValues.map((value) => options.find((option) => option.value === value)).filter((option) => option != null),
1621
+ [options, selectedValues]
1622
+ );
1623
+ const hasValue = selectedOptions.length > 0;
1624
+ const isExternalSearch = onSearchChange != null;
1625
+ const filteredOptions = react.useMemo(() => {
1626
+ if (isExternalSearch) return options;
1627
+ const query = searchQuery.trim().toLowerCase();
1628
+ if (!query) return options;
1629
+ return options.filter((option) => option.label.toLowerCase().includes(query));
1630
+ }, [isExternalSearch, options, searchQuery]);
1631
+ useApplyWebClassName(rootRef, className);
1632
+ const setOpen = react.useCallback(
1633
+ (next) => {
1634
+ if (!isOpenControlled) setUncontrolledOpen(next);
1635
+ onOpenChange?.(next);
1636
+ if (next) {
1637
+ setHoveredValue(selectedValues[0] ?? null);
1638
+ } else {
1639
+ setSearchQuery("");
1640
+ setHoveredValue(null);
1641
+ onSearchChange?.("");
1642
+ }
1643
+ },
1644
+ [isOpenControlled, onOpenChange, onSearchChange, selectedValues]
1645
+ );
1646
+ const handleSearchChange = (text) => {
1647
+ setSearchQuery(text);
1648
+ onSearchChange?.(text);
1649
+ };
1650
+ react.useEffect(() => {
1651
+ if (reactNative.Platform.OS !== "web" || !isOpen) return;
1652
+ const handlePointerDown = (event) => {
1653
+ const root = rootRef.current;
1654
+ const target = event.target;
1655
+ if (root?.contains && target instanceof Node && !root.contains(target)) {
1656
+ setOpen(false);
1657
+ }
1658
+ };
1659
+ document.addEventListener("mousedown", handlePointerDown);
1660
+ document.addEventListener("touchstart", handlePointerDown);
1661
+ return () => {
1662
+ document.removeEventListener("mousedown", handlePointerDown);
1663
+ document.removeEventListener("touchstart", handlePointerDown);
1664
+ };
1665
+ }, [isOpen, setOpen]);
1666
+ const commitValues = react.useCallback(
1667
+ (nextValues) => {
1668
+ if (multiple) {
1669
+ if (!isValueControlled) setUncontrolledMultiple(nextValues);
1670
+ props.onValueChange?.(nextValues);
1671
+ return;
1672
+ }
1673
+ const nextValue = nextValues[0] ?? "";
1674
+ if (!isValueControlled) setUncontrolledSingle(nextValue);
1675
+ props.onValueChange?.(nextValue);
1676
+ },
1677
+ [isValueControlled, multiple, props]
1678
+ );
1679
+ const handleTriggerPress = () => {
1680
+ if (disabled) return;
1681
+ setOpen(!isOpen);
1682
+ };
1683
+ const handleSelect = react.useCallback(
1684
+ (optionValue) => {
1685
+ if (disabled) return;
1686
+ if (multiple) {
1687
+ const exists = selectedValues.includes(optionValue);
1688
+ const nextValues = exists ? selectedValues.filter((value) => value !== optionValue) : [...selectedValues, optionValue];
1689
+ commitValues(nextValues);
1690
+ return;
1691
+ }
1692
+ commitValues([optionValue]);
1693
+ setOpen(false);
1694
+ },
1695
+ [commitValues, disabled, multiple, selectedValues, setOpen]
1696
+ );
1697
+ const handleRemoveChip = (optionValue) => {
1698
+ if (disabled || !multiple) return;
1699
+ commitValues(selectedValues.filter((value) => value !== optionValue));
1700
+ };
1701
+ const focusTrigger = react.useCallback(() => {
1702
+ const node = triggerRef.current;
1703
+ node?.focus?.();
1704
+ }, []);
1705
+ const closeAndFocusTrigger = react.useCallback(() => {
1706
+ setOpen(false);
1707
+ focusTrigger();
1708
+ }, [focusTrigger, setOpen]);
1709
+ react.useEffect(() => {
1710
+ if (reactNative.Platform.OS !== "web") return;
1711
+ const isTriggerFocused = () => document.activeElement === triggerRef.current;
1712
+ const isSearchFocused = () => document.activeElement === searchInputRef.current;
1713
+ const handleKeyDown = (event) => {
1714
+ if (!isOpen) {
1715
+ if (!isTriggerFocused() || disabled) return;
1716
+ if (event.key === "ArrowDown" || event.key === "ArrowUp" || event.key === "Enter") {
1717
+ event.preventDefault();
1718
+ setOpen(true);
1719
+ }
1720
+ return;
1721
+ }
1722
+ if (event.key === "Escape") {
1723
+ event.preventDefault();
1724
+ closeAndFocusTrigger();
1725
+ return;
1726
+ }
1727
+ if (event.key === "ArrowDown" || event.key === "ArrowUp") {
1728
+ event.preventDefault();
1729
+ setHoveredValue((current) => {
1730
+ if (filteredOptions.length === 0) return current;
1731
+ const currentIndex = filteredOptions.findIndex((option) => option.value === current);
1732
+ const delta = event.key === "ArrowDown" ? 1 : -1;
1733
+ const nextIndex = currentIndex === -1 ? delta === 1 ? 0 : filteredOptions.length - 1 : Math.min(Math.max(currentIndex + delta, 0), filteredOptions.length - 1);
1734
+ return filteredOptions[nextIndex]?.value ?? current;
1735
+ });
1736
+ return;
1737
+ }
1738
+ if (isSearchFocused() && (event.key === "Home" || event.key === "End" || event.key === " ")) {
1739
+ return;
1740
+ }
1741
+ if (event.key === "Home" || event.key === "End") {
1742
+ if (filteredOptions.length === 0) return;
1743
+ event.preventDefault();
1744
+ setHoveredValue(
1745
+ event.key === "Home" ? filteredOptions[0].value : filteredOptions[filteredOptions.length - 1].value
1746
+ );
1747
+ return;
1748
+ }
1749
+ if (event.key === "Enter" || event.key === " ") {
1750
+ if (hoveredValue == null) return;
1751
+ event.preventDefault();
1752
+ handleSelect(hoveredValue);
1753
+ if (!multiple) focusTrigger();
1754
+ }
1755
+ };
1756
+ document.addEventListener("keydown", handleKeyDown);
1757
+ return () => document.removeEventListener("keydown", handleKeyDown);
1758
+ }, [
1759
+ isOpen,
1760
+ disabled,
1761
+ filteredOptions,
1762
+ hoveredValue,
1763
+ multiple,
1764
+ closeAndFocusTrigger,
1765
+ focusTrigger,
1766
+ handleSelect,
1767
+ setOpen
1768
+ ]);
1769
+ const leftIconNode = leftIcon ?? /* @__PURE__ */ jsxRuntime.jsx(
1770
+ UserIcon,
1771
+ {
1772
+ size: ICON_SIZE,
1773
+ color: error ? colors.red : isOpen ? colors.primary : colors.grey100
1774
+ }
1775
+ );
1776
+ const hasLeftIcon = showLeftIcon || leftIcon != null;
1777
+ const triggerBorderColor = error ? colors.redMuted : isOpen ? colors.primaryMuted : colors.grey700;
1778
+ const triggerTextColor = hasValue ? error ? colors.red : colors.white : error ? colors.red : colors.grey100;
1779
+ const labelColor = error ? colors.red : colors.white;
1780
+ const hintColor = error ? colors.red : colors.grey100;
1781
+ const singleLabel = selectedOptions[0]?.label ?? placeholder;
1782
+ const resolvedAccessibilityLabel = accessibilityLabel ?? (typeof label === "string" ? label : void 0);
1783
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1784
+ reactNative.View,
1785
+ {
1786
+ ...rest,
1787
+ ref: setRootRef,
1788
+ style: [styles5.root, isOpen && styles5.rootOpen, disabled && styles5.disabled, style],
1789
+ accessibilityState: { disabled, expanded: isOpen },
1790
+ children: [
1791
+ showLabel && label ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: [styles5.label, { color: labelColor }], children: label }) : null,
1792
+ /* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: [styles5.triggerWrap, isOpen && styles5.triggerWrapOpen], children: [
1793
+ /* @__PURE__ */ jsxRuntime.jsxs(
1794
+ reactNative.Pressable,
1795
+ {
1796
+ ref: triggerRef,
1797
+ onPress: handleTriggerPress,
1798
+ disabled,
1799
+ accessibilityRole: "combobox",
1800
+ accessibilityLabel: resolvedAccessibilityLabel,
1801
+ accessibilityState: { disabled, expanded: isOpen },
1802
+ style: [
1803
+ styles5.trigger,
1804
+ {
1805
+ borderColor: triggerBorderColor,
1806
+ backgroundColor: colors.grey700
1807
+ }
1808
+ ],
1809
+ children: [
1810
+ hasLeftIcon ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: styles5.iconSlot, children: leftIconNode }) : null,
1811
+ /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: styles5.triggerContent, children: multiple && hasValue ? /* @__PURE__ */ jsxRuntime.jsx(
1812
+ MultiValueChips,
1813
+ {
1814
+ options: selectedOptions,
1815
+ disabled,
1816
+ onRemove: handleRemoveChip
1817
+ }
1818
+ ) : /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: [styles5.triggerText, { color: triggerTextColor }], numberOfLines: 1, children: multiple ? placeholder : singleLabel }) }),
1819
+ /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: [styles5.iconSlot, isOpen && styles5.chevronOpen], children: /* @__PURE__ */ jsxRuntime.jsx(ChevronDownIcon, { size: ICON_SIZE, color: isOpen ? colors.primary : colors.grey100 }) })
1820
+ ]
1821
+ }
1822
+ ),
1823
+ isOpen ? /* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: styles5.menu, children: [
1824
+ showSearch ? /* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: styles5.searchField, children: [
1825
+ /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: styles5.iconSlot, children: /* @__PURE__ */ jsxRuntime.jsx(SearchIcon, { size: ICON_SIZE, color: colors.grey100 }) }),
1826
+ /* @__PURE__ */ jsxRuntime.jsx(
1827
+ reactNative.TextInput,
1828
+ {
1829
+ ref: searchInputRef,
1830
+ value: searchQuery,
1831
+ onChangeText: handleSearchChange,
1832
+ editable: !disabled,
1833
+ placeholder: searchPlaceholder,
1834
+ placeholderTextColor: colors.grey100,
1835
+ style: [
1836
+ styles5.searchInput,
1837
+ reactNative.Platform.OS === "web" ? styles5.searchInputWeb : null,
1838
+ reactNative.Platform.OS === "android" ? styles5.searchInputAndroid : null
1839
+ ],
1840
+ accessibilityLabel: searchPlaceholder
1841
+ }
1842
+ )
1843
+ ] }) : null,
1844
+ /* @__PURE__ */ jsxRuntime.jsxs(
1845
+ reactNative.ScrollView,
1846
+ {
1847
+ style: styles5.optionList,
1848
+ contentContainerStyle: styles5.optionListContent,
1849
+ keyboardShouldPersistTaps: "handled",
1850
+ showsVerticalScrollIndicator: false,
1851
+ children: [
1852
+ loading ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: styles5.statusRow, children: /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles5.statusText, children: "Loading..." }) }) : filteredOptions.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: styles5.statusRow, children: /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles5.statusText, children: emptyText }) }) : null,
1853
+ !loading && filteredOptions.map((option) => {
1854
+ const isSelected = selectedValues.includes(option.value);
1855
+ const isHovered = hoveredValue === option.value;
1856
+ const visualState = isSelected ? "selected" : isHovered ? "hover" : "default";
1857
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1858
+ reactNative.Pressable,
1859
+ {
1860
+ onPress: () => handleSelect(option.value),
1861
+ disabled,
1862
+ onHoverIn: () => setHoveredValue(option.value),
1863
+ onHoverOut: () => setHoveredValue((current) => current === option.value ? null : current),
1864
+ onPressIn: () => setHoveredValue(option.value),
1865
+ onPressOut: () => setHoveredValue((current) => current === option.value ? null : current),
1866
+ accessibilityRole: multiple ? "checkbox" : "button",
1867
+ accessibilityState: { selected: isSelected, checked: isSelected, disabled },
1868
+ style: [
1869
+ styles5.item,
1870
+ {
1871
+ backgroundColor: itemBackground(visualState)
1872
+ }
1873
+ ],
1874
+ children: [
1875
+ multiple ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { pointerEvents: "none", style: styles5.itemCheckbox, children: /* @__PURE__ */ jsxRuntime.jsx(Checkbox, { value: isSelected, variant: "light" }) }) : null,
1876
+ /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles5.itemLabel, numberOfLines: 1, children: option.label })
1877
+ ]
1878
+ },
1879
+ option.value
1880
+ );
1881
+ })
1882
+ ]
1883
+ }
1884
+ )
1885
+ ] }) : null
1886
+ ] }),
1887
+ showHint && hint ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: [styles5.hint, { color: hintColor }], children: hint }) : null
1888
+ ]
1889
+ }
1890
+ );
1891
+ }
1892
+ );
1893
+ var styles5 = reactNative.StyleSheet.create({
1894
+ root: {
1895
+ width: DEFAULT_WIDTH2,
1896
+ gap: 8,
1897
+ alignSelf: "flex-start"
1898
+ },
1899
+ rootOpen: {
1900
+ zIndex: 30
1901
+ },
1902
+ disabled: {
1903
+ opacity: 0.6
1904
+ },
1905
+ label: {
1906
+ ...selectTypography.label
1907
+ },
1908
+ triggerWrap: {
1909
+ position: "relative",
1910
+ zIndex: 1
1911
+ },
1912
+ triggerWrapOpen: {
1913
+ zIndex: 20
1914
+ },
1915
+ trigger: {
1916
+ height: TRIGGER_HEIGHT,
1917
+ borderRadius: TRIGGER_RADIUS,
1918
+ borderWidth: 1,
1919
+ paddingVertical: 12,
1920
+ paddingHorizontal: 16,
1921
+ flexDirection: "row",
1922
+ alignItems: "center",
1923
+ gap: 10,
1924
+ overflow: "hidden"
1925
+ },
1926
+ triggerContent: {
1927
+ flex: 1,
1928
+ justifyContent: "center",
1929
+ minWidth: 0,
1930
+ overflow: "hidden"
1931
+ },
1932
+ triggerText: {
1933
+ ...selectTypography.field
1934
+ },
1935
+ multiValueRoot: {
1936
+ width: "100%",
1937
+ position: "relative"
1938
+ },
1939
+ measureRow: {
1940
+ position: "absolute",
1941
+ left: 0,
1942
+ top: 0,
1943
+ flexDirection: "row",
1944
+ opacity: 0,
1945
+ zIndex: -1
1946
+ },
1947
+ chipsRow: {
1948
+ flexDirection: "row",
1949
+ alignItems: "center",
1950
+ gap: CHIP_GAP,
1951
+ overflow: "hidden"
1952
+ },
1953
+ chip: {
1954
+ flexDirection: "row",
1955
+ alignItems: "center",
1956
+ gap: 4,
1957
+ paddingVertical: 2,
1958
+ paddingHorizontal: 8,
1959
+ borderRadius: 999,
1960
+ backgroundColor: colors.grey600,
1961
+ flexShrink: 0
1962
+ },
1963
+ chipLabel: {
1964
+ ...selectTypography.hint,
1965
+ color: colors.white,
1966
+ maxWidth: 120
1967
+ },
1968
+ chipRemove: {
1969
+ color: colors.grey100,
1970
+ fontSize: 14,
1971
+ lineHeight: 14
1972
+ },
1973
+ ellipsis: {
1974
+ flexShrink: 0,
1975
+ paddingHorizontal: 2
1976
+ },
1977
+ ellipsisText: {
1978
+ ...selectTypography.field,
1979
+ color: colors.white,
1980
+ lineHeight: 16
1981
+ },
1982
+ iconSlot: {
1983
+ width: ICON_SIZE,
1984
+ height: ICON_SIZE,
1985
+ alignItems: "center",
1986
+ justifyContent: "center",
1987
+ flexShrink: 0
1988
+ },
1989
+ chevronOpen: {
1990
+ transform: [{ rotate: "180deg" }]
1991
+ },
1992
+ menu: {
1993
+ position: "absolute",
1994
+ top: "100%",
1995
+ left: 0,
1996
+ right: 0,
1997
+ marginTop: 8,
1998
+ zIndex: 10,
1999
+ borderRadius: MENU_RADIUS2,
2000
+ padding: 12,
2001
+ gap: 8,
2002
+ backgroundColor: colors.grey700,
2003
+ ...reactNative.Platform.select({
2004
+ web: {
2005
+ boxShadow: `0 8px 24px ${colors.black}73`
2006
+ },
2007
+ default: {
2008
+ elevation: 8
2009
+ }
2010
+ })
2011
+ },
2012
+ optionList: {
2013
+ maxHeight: MENU_MAX_LIST_HEIGHT
2014
+ },
2015
+ optionListContent: {
2016
+ gap: 8
2017
+ },
2018
+ statusRow: {
2019
+ minHeight: 43,
2020
+ padding: 12,
2021
+ justifyContent: "center"
2022
+ },
2023
+ statusText: {
2024
+ ...selectTypography.field,
2025
+ color: colors.grey100
2026
+ },
2027
+ searchField: {
2028
+ height: 40,
2029
+ borderRadius: ITEM_RADIUS,
2030
+ paddingHorizontal: 12,
2031
+ flexDirection: "row",
2032
+ alignItems: "center",
2033
+ gap: 8,
2034
+ backgroundColor: colors.grey800
2035
+ },
2036
+ searchInput: {
2037
+ ...selectTypography.field,
2038
+ flex: 1,
2039
+ color: colors.white,
2040
+ paddingVertical: 0,
2041
+ margin: 0
2042
+ },
2043
+ searchInputWeb: {
2044
+ outlineStyle: "none"
2045
+ },
2046
+ searchInputAndroid: {
2047
+ includeFontPadding: false
2048
+ },
2049
+ item: {
2050
+ minHeight: 43,
2051
+ borderRadius: ITEM_RADIUS,
2052
+ padding: 12,
2053
+ flexDirection: "row",
2054
+ alignItems: "center",
2055
+ gap: 8
2056
+ },
2057
+ itemCheckbox: {
2058
+ flexShrink: 0
2059
+ },
2060
+ itemLabel: {
2061
+ ...selectTypography.field,
2062
+ color: colors.white,
2063
+ flex: 1
2064
+ },
2065
+ hint: {
2066
+ ...selectTypography.hint
2067
+ }
2068
+ });
2069
+ var DEFAULT_WIDTH3 = 308;
2070
+ var FIELD_HEIGHT = 100;
2071
+ var FIELD_RADIUS = 16;
2072
+ var FIELD_PADDING_VERTICAL = 12;
2073
+ var FIELD_PADDING_HORIZONTAL = 16;
2074
+ function resolveVisualState2({
2075
+ disabled,
2076
+ error,
2077
+ focused,
2078
+ hasValue
2079
+ }) {
2080
+ if (disabled) return "disabled";
2081
+ if (error) return "error";
2082
+ if (focused) return "active";
2083
+ if (hasValue) return "filled";
2084
+ return "default";
2085
+ }
2086
+ function chromeFor2(state) {
2087
+ const base = {
2088
+ borderColor: colors.grey700,
2089
+ backgroundColor: colors.grey700,
2090
+ textColor: colors.white,
2091
+ placeholderColor: colors.grey100,
2092
+ labelColor: colors.white,
2093
+ hintColor: colors.grey100
2094
+ };
2095
+ switch (state) {
2096
+ case "active":
2097
+ return {
2098
+ ...base,
2099
+ borderColor: colors.primaryMuted
2100
+ };
2101
+ case "error":
2102
+ return {
2103
+ ...base,
2104
+ borderColor: colors.redMuted,
2105
+ textColor: colors.red,
2106
+ placeholderColor: colors.red,
2107
+ labelColor: colors.red,
2108
+ hintColor: colors.red
2109
+ };
2110
+ case "filled":
2111
+ return base;
2112
+ case "disabled":
2113
+ return {
2114
+ ...base,
2115
+ textColor: colors.grey0
2116
+ };
2117
+ default:
2118
+ return base;
2119
+ }
2120
+ }
2121
+ var Textarea = react.forwardRef(function Textarea2({
2122
+ label = "Label",
2123
+ showLabel = true,
2124
+ hint = "Hint",
2125
+ showHint = true,
2126
+ placeholder = "placeholder",
2127
+ disabled = false,
2128
+ error = false,
2129
+ value,
2130
+ defaultValue,
2131
+ onChangeText,
2132
+ onFocus,
2133
+ onBlur,
2134
+ style,
2135
+ fieldStyle,
2136
+ inputStyle,
2137
+ className,
2138
+ inputClassName,
2139
+ accessibilityLabel,
2140
+ ...textInputProps
2141
+ }, forwardedRef) {
2142
+ const rootRef = react.useRef(null);
2143
+ const inputRef = react.useRef(null);
2144
+ const setInputRef = react.useMemo(() => mergeRefs(inputRef, forwardedRef), [forwardedRef]);
2145
+ const [focused, setFocused] = react.useState(false);
2146
+ const [uncontrolledValue, setUncontrolledValue] = react.useState(defaultValue ?? "");
2147
+ const isControlled = typeof value === "string";
2148
+ const currentValue = isControlled ? value : uncontrolledValue;
2149
+ const hasValue = currentValue.length > 0;
2150
+ const visualState = resolveVisualState2({ disabled, error, focused, hasValue });
2151
+ const chrome = chromeFor2(visualState);
2152
+ const resolvedAccessibilityLabel = accessibilityLabel ?? (showLabel ? void 0 : label);
2153
+ useApplyWebClassName(rootRef, className);
2154
+ useApplyWebClassName(inputRef, inputClassName);
2155
+ return /* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { ref: rootRef, style: [styles6.root, disabled && styles6.disabled, style], children: [
2156
+ showLabel && label ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: [styles6.label, { color: chrome.labelColor }], children: label }) : null,
2157
+ /* @__PURE__ */ jsxRuntime.jsx(
2158
+ reactNative.View,
2159
+ {
2160
+ style: [
2161
+ styles6.field,
2162
+ {
2163
+ borderColor: chrome.borderColor,
2164
+ backgroundColor: chrome.backgroundColor
2165
+ },
2166
+ fieldStyle
2167
+ ],
2168
+ children: /* @__PURE__ */ jsxRuntime.jsx(
2169
+ reactNative.TextInput,
2170
+ {
2171
+ ref: setInputRef,
2172
+ ...textInputProps,
2173
+ multiline: true,
2174
+ textAlignVertical: "top",
2175
+ value: isControlled ? value : void 0,
2176
+ defaultValue: isControlled ? void 0 : defaultValue,
2177
+ editable: !disabled,
2178
+ placeholder,
2179
+ placeholderTextColor: chrome.placeholderColor,
2180
+ onChangeText: (text) => {
2181
+ if (!isControlled) setUncontrolledValue(text);
2182
+ onChangeText?.(text);
2183
+ },
2184
+ onFocus: (event) => {
2185
+ setFocused(true);
2186
+ onFocus?.(event);
2187
+ },
2188
+ onBlur: (event) => {
2189
+ setFocused(false);
2190
+ onBlur?.(event);
2191
+ },
2192
+ style: [
2193
+ styles6.input,
2194
+ textareaTypography.field,
2195
+ { color: chrome.textColor },
2196
+ reactNative.Platform.OS === "web" ? styles6.inputWeb : null,
2197
+ reactNative.Platform.OS === "android" ? styles6.inputAndroid : null,
2198
+ inputStyle
2199
+ ],
2200
+ accessibilityLabel: resolvedAccessibilityLabel,
2201
+ accessibilityState: { disabled }
2202
+ }
2203
+ )
2204
+ }
2205
+ ),
2206
+ showHint && hint ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: [styles6.hint, { color: chrome.hintColor }], children: hint }) : null
2207
+ ] });
2208
+ });
2209
+ var styles6 = reactNative.StyleSheet.create({
2210
+ root: {
2211
+ width: DEFAULT_WIDTH3,
2212
+ gap: 8,
2213
+ alignSelf: "flex-start"
2214
+ },
2215
+ disabled: {
2216
+ opacity: 0.6
2217
+ },
2218
+ label: {
2219
+ ...textareaTypography.label
2220
+ },
2221
+ field: {
2222
+ height: FIELD_HEIGHT,
2223
+ borderRadius: FIELD_RADIUS,
2224
+ borderWidth: 1,
2225
+ paddingTop: FIELD_PADDING_VERTICAL,
2226
+ paddingBottom: FIELD_PADDING_VERTICAL,
2227
+ paddingLeft: FIELD_PADDING_HORIZONTAL,
2228
+ paddingRight: FIELD_PADDING_HORIZONTAL
2229
+ },
2230
+ input: {
2231
+ flex: 1,
2232
+ paddingVertical: 0,
2233
+ margin: 0
2234
+ },
2235
+ inputWeb: {
2236
+ outlineStyle: "none",
2237
+ resize: "none"
2238
+ },
2239
+ inputAndroid: {
2240
+ includeFontPadding: false
2241
+ },
2242
+ hint: {
2243
+ ...textareaTypography.hint
2244
+ }
2245
+ });
2246
+ var TRACK_WIDTH = 44;
2247
+ var TRACK_HEIGHT = 24;
2248
+ var TRACK_RADIUS = 43;
2249
+ var TRACK_PADDING = 4;
2250
+ var THUMB_SIZE = TRACK_HEIGHT - TRACK_PADDING * 2;
2251
+ var THUMB_TRAVEL = TRACK_WIDTH - TRACK_PADDING * 2 - THUMB_SIZE;
2252
+ var ANIMATION_DURATION = 300;
2253
+ var Toggle = react.forwardRef(function Toggle2({
2254
+ value,
2255
+ defaultValue = false,
2256
+ onValueChange,
2257
+ disabled = false,
2258
+ label,
2259
+ children,
2260
+ accessibilityLabel,
2261
+ style,
2262
+ labelStyle,
2263
+ className,
2264
+ hitSlop = 10,
2265
+ ...rest
2266
+ }, forwardedRef) {
2267
+ const containerRef = react.useRef(null);
2268
+ const isControlled = typeof value === "boolean";
2269
+ const [uncontrolledValue, setUncontrolledValue] = react.useState(defaultValue);
2270
+ const isActive = isControlled ? value : uncontrolledValue;
2271
+ const labelContent = children ?? label;
2272
+ const resolvedAccessibilityLabel = accessibilityLabel ?? (typeof labelContent === "string" ? labelContent : void 0);
2273
+ const setContainerRef = react.useMemo(() => mergeRefs(containerRef, forwardedRef), [forwardedRef]);
2274
+ const progress = react.useRef(new reactNative.Animated.Value(isActive ? 1 : 0)).current;
2275
+ useApplyWebClassName(containerRef, className);
2276
+ react.useEffect(() => {
2277
+ reactNative.Animated.timing(progress, {
2278
+ toValue: isActive ? 1 : 0,
2279
+ duration: ANIMATION_DURATION,
2280
+ easing: reactNative.Easing.out(reactNative.Easing.ease),
2281
+ useNativeDriver: false
2282
+ }).start();
2283
+ }, [isActive, progress]);
2284
+ const handlePress = () => {
2285
+ if (disabled) return;
2286
+ const next = !isActive;
2287
+ if (!isControlled) setUncontrolledValue(next);
2288
+ onValueChange?.(next);
2289
+ };
2290
+ const trackBackgroundColor = progress.interpolate({
2291
+ inputRange: [0, 1],
2292
+ outputRange: [colors.grey700, colors.primary]
2293
+ });
2294
+ const thumbTranslateX = progress.interpolate({
2295
+ inputRange: [0, 1],
2296
+ outputRange: [0, THUMB_TRAVEL]
2297
+ });
2298
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2299
+ reactNative.Pressable,
2300
+ {
2301
+ ...rest,
2302
+ ref: setContainerRef,
2303
+ onPress: handlePress,
2304
+ disabled,
2305
+ hitSlop,
2306
+ accessibilityRole: "switch",
2307
+ accessibilityLabel: resolvedAccessibilityLabel,
2308
+ accessibilityState: { checked: isActive, disabled },
2309
+ style: [styles7.pressable, disabled && styles7.disabled, style],
2310
+ children: [
2311
+ /* @__PURE__ */ jsxRuntime.jsx(
2312
+ reactNative.Animated.View,
2313
+ {
2314
+ style: [
2315
+ styles7.track,
2316
+ {
2317
+ backgroundColor: trackBackgroundColor
2318
+ }
2319
+ ],
2320
+ children: /* @__PURE__ */ jsxRuntime.jsx(
2321
+ reactNative.Animated.View,
2322
+ {
2323
+ style: [
2324
+ styles7.thumb,
2325
+ {
2326
+ transform: [{ translateX: thumbTranslateX }]
2327
+ }
2328
+ ]
2329
+ }
2330
+ )
2331
+ }
2332
+ ),
2333
+ labelContent != null && labelContent !== false ? typeof labelContent === "string" || typeof labelContent === "number" ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: [styles7.label, labelStyle], children: labelContent }) : labelContent : null
2334
+ ]
2335
+ }
2336
+ );
2337
+ });
2338
+ var styles7 = reactNative.StyleSheet.create({
2339
+ pressable: {
2340
+ flexDirection: "row",
2341
+ alignItems: "center",
2342
+ alignSelf: "flex-start",
2343
+ gap: 10
2344
+ },
2345
+ disabled: {
2346
+ opacity: 0.6
2347
+ },
2348
+ track: {
2349
+ width: TRACK_WIDTH,
2350
+ height: TRACK_HEIGHT,
2351
+ borderRadius: TRACK_RADIUS,
2352
+ padding: TRACK_PADDING,
2353
+ justifyContent: "center"
2354
+ },
2355
+ thumb: {
2356
+ width: THUMB_SIZE,
2357
+ height: THUMB_SIZE,
2358
+ borderRadius: THUMB_SIZE / 2,
2359
+ backgroundColor: colors.white
2360
+ },
2361
+ label: {
2362
+ ...inputTypography.field,
2363
+ color: colors.white
2364
+ }
2365
+ });
805
2366
 
806
2367
  exports.ArrowRightIcon = ArrowRightIcon;
2368
+ exports.Avatar = Avatar;
807
2369
  exports.BagIcon = BagIcon;
808
2370
  exports.BellIcon = BellIcon;
809
2371
  exports.BuildingIcon = BuildingIcon;
810
2372
  exports.Button = Button;
2373
+ exports.CalendarIcon = CalendarIcon;
811
2374
  exports.CameraIcon = CameraIcon;
812
2375
  exports.CheckBadgeIcon = CheckBadgeIcon;
2376
+ exports.CheckIcon = CheckIcon;
2377
+ exports.Checkbox = Checkbox;
2378
+ exports.ChevronDownIcon = ChevronDownIcon;
813
2379
  exports.ClockIcon = ClockIcon;
814
2380
  exports.FacebookIcon = FacebookIcon;
2381
+ exports.HeartIcon = HeartIcon;
2382
+ exports.HelpCircleIcon = HelpCircleIcon;
815
2383
  exports.HomeIcon = HomeIcon;
816
2384
  exports.Icon = Icon;
817
2385
  exports.Input = Input;
818
2386
  exports.InstagramIcon = InstagramIcon;
819
2387
  exports.KeyIcon = KeyIcon;
2388
+ exports.LayoutGridIcon = LayoutGridIcon;
820
2389
  exports.LinkedInIcon = LinkedInIcon;
2390
+ exports.LogOutIcon = LogOutIcon;
821
2391
  exports.MailIcon = MailIcon;
822
2392
  exports.NavigateIcon = NavigateIcon;
823
2393
  exports.PhoneIcon = PhoneIcon;
2394
+ exports.SearchIcon = SearchIcon;
2395
+ exports.Select = Select;
2396
+ exports.SettingsIcon = SettingsIcon;
824
2397
  exports.ShowIcon = ShowIcon;
2398
+ exports.Textarea = Textarea;
2399
+ exports.Toggle = Toggle;
825
2400
  exports.UserIcon = UserIcon;
2401
+ exports.VideoIcon = VideoIcon;
2402
+ exports.avatarTypography = avatarTypography;
826
2403
  exports.buttonTypography = buttonTypography;
827
2404
  exports.colors = colors;
828
2405
  exports.fonts = fonts;
@@ -833,5 +2410,7 @@ exports.iconGroups = iconGroups;
833
2410
  exports.iconNames = iconNames;
834
2411
  exports.icons = icons;
835
2412
  exports.inputTypography = inputTypography;
2413
+ exports.selectTypography = selectTypography;
2414
+ exports.textareaTypography = textareaTypography;
836
2415
  //# sourceMappingURL=index.cjs.map
837
2416
  //# sourceMappingURL=index.cjs.map