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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/dist/components/conversation/Conversation.d.ts +18 -0
  2. package/dist/components/conversation/Conversation.d.ts.map +1 -0
  3. package/dist/components/conversation/Conversation.test.d.ts +2 -0
  4. package/dist/components/conversation/Conversation.test.d.ts.map +1 -0
  5. package/dist/components/multi-select/MultiSelect.d.ts +9 -0
  6. package/dist/components/multi-select/MultiSelect.d.ts.map +1 -1
  7. package/dist/components/multi-select/MultiSelect.test.d.ts +2 -0
  8. package/dist/components/multi-select/MultiSelect.test.d.ts.map +1 -0
  9. package/dist/index.cjs +19 -11
  10. package/dist/index.d.ts +2 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +13 -12
  13. package/dist/index26.js +10 -2
  14. package/dist/index26.js.map +1 -1
  15. package/dist/index27.cjs +13 -1
  16. package/dist/index27.cjs.map +1 -1
  17. package/dist/index27.js +74 -37
  18. package/dist/index27.js.map +1 -1
  19. package/dist/index28.cjs +74 -37
  20. package/dist/index28.cjs.map +1 -1
  21. package/dist/index53.js +26 -16
  22. package/dist/index53.js.map +1 -1
  23. package/dist/index54.cjs +37 -20
  24. package/dist/index54.cjs.map +1 -1
  25. package/dist/index54.js +57 -23
  26. package/dist/index54.js.map +1 -1
  27. package/dist/index55.cjs +63 -24
  28. package/dist/index55.cjs.map +1 -1
  29. package/dist/index55.js +16 -16
  30. package/dist/index55.js.map +1 -1
  31. package/dist/index56.cjs +19 -20
  32. package/dist/index56.cjs.map +1 -1
  33. package/dist/index56.js +24 -21
  34. package/dist/index56.js.map +1 -1
  35. package/dist/index57.cjs +25 -22
  36. package/dist/index57.cjs.map +1 -1
  37. package/dist/index57.js +17 -10
  38. package/dist/index57.js.map +1 -1
  39. package/dist/index58.cjs +23 -11
  40. package/dist/index58.cjs.map +1 -1
  41. package/dist/index58.js +25 -14
  42. package/dist/index58.js.map +1 -1
  43. package/dist/index59.cjs +25 -13
  44. package/dist/index59.cjs.map +1 -1
  45. package/dist/index59.js +10 -11
  46. package/dist/index59.js.map +1 -1
  47. package/dist/index60.cjs +11 -13
  48. package/dist/index60.cjs.map +1 -1
  49. package/dist/index60.js +13 -16
  50. package/dist/index60.js.map +1 -1
  51. package/dist/index61.cjs +13 -16
  52. package/dist/index61.cjs.map +1 -1
  53. package/dist/index61.js +10 -8
  54. package/dist/index61.js.map +1 -1
  55. package/dist/index62.cjs +11 -10
  56. package/dist/index62.cjs.map +1 -1
  57. package/dist/index62.js +15 -87
  58. package/dist/index62.js.map +1 -1
  59. package/dist/index63.cjs +15 -89
  60. package/dist/index63.cjs.map +1 -1
  61. package/dist/index63.js +9 -21
  62. package/dist/index63.js.map +1 -1
  63. package/dist/index64.cjs +12 -30
  64. package/dist/index64.cjs.map +1 -1
  65. package/dist/index64.js +89 -43
  66. package/dist/index64.js.map +1 -1
  67. package/dist/index65.cjs +88 -42
  68. package/dist/index65.cjs.map +1 -1
  69. package/dist/index65.js +14 -50
  70. package/dist/index65.js.map +1 -1
  71. package/dist/index66.cjs +15 -69
  72. package/dist/index66.cjs.map +1 -1
  73. package/dist/index66.js +25 -414
  74. package/dist/index66.js.map +1 -1
  75. package/dist/index67.cjs +25 -416
  76. package/dist/index67.cjs.map +1 -1
  77. package/dist/index67.js +56 -58
  78. package/dist/index67.js.map +1 -1
  79. package/dist/index68.cjs +82 -85
  80. package/dist/index68.cjs.map +1 -1
  81. package/dist/index68.js +419 -226
  82. package/dist/index68.js.map +1 -1
  83. package/dist/index69.cjs +420 -225
  84. package/dist/index69.cjs.map +1 -1
  85. package/dist/index69.js +58 -42
  86. package/dist/index69.js.map +1 -1
  87. package/dist/index70.cjs +85 -61
  88. package/dist/index70.cjs.map +1 -1
  89. package/dist/index70.js +236 -76
  90. package/dist/index70.js.map +1 -1
  91. package/dist/index71.cjs +235 -75
  92. package/dist/index71.cjs.map +1 -1
  93. package/dist/index71.js +42 -20
  94. package/dist/index71.js.map +1 -1
  95. package/dist/index72.cjs +60 -27
  96. package/dist/index72.cjs.map +1 -1
  97. package/dist/index72.js +73 -88
  98. package/dist/index72.js.map +1 -1
  99. package/dist/index73.cjs +73 -90
  100. package/dist/index73.cjs.map +1 -1
  101. package/dist/index73.js +17 -15
  102. package/dist/index73.js.map +1 -1
  103. package/dist/index74.cjs +22 -19
  104. package/dist/index74.cjs.map +1 -1
  105. package/dist/index74.js +85 -143
  106. package/dist/index74.js.map +1 -1
  107. package/dist/index75.cjs +87 -143
  108. package/dist/index75.cjs.map +1 -1
  109. package/dist/index75.js +23 -0
  110. package/dist/index75.js.map +1 -0
  111. package/dist/index76.cjs +31 -0
  112. package/dist/index76.cjs.map +1 -0
  113. package/dist/index76.js +159 -0
  114. package/dist/index76.js.map +1 -0
  115. package/dist/index77.cjs +161 -0
  116. package/dist/index77.cjs.map +1 -0
  117. package/dist/style.css +150 -0
  118. package/package.json +1 -1
package/dist/index66.js CHANGED
@@ -1,439 +1,50 @@
1
1
  import { cx } from "./index3.js";
2
- import auth_pages_module_default from "./index65.js";
2
+ import auth_card_module_default from "./index65.js";
3
3
  import * as React from "react";
4
4
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
- //#region src/components/auth-pages/AuthPages.tsx
6
- function EyeIcon({ open }) {
7
- if (open) return /* @__PURE__ */ jsxs("svg", {
8
- viewBox: "0 0 24 24",
9
- fill: "none",
10
- "aria-hidden": "true",
11
- className: auth_pages_module_default.eyeIcon,
12
- children: [/* @__PURE__ */ jsx("path", {
13
- d: "M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z",
14
- stroke: "currentColor",
15
- strokeWidth: "2"
16
- }), /* @__PURE__ */ jsx("circle", {
17
- cx: "12",
18
- cy: "12",
19
- r: "3",
20
- stroke: "currentColor",
21
- strokeWidth: "2"
22
- })]
23
- });
24
- return /* @__PURE__ */ jsxs("svg", {
25
- viewBox: "0 0 24 24",
26
- fill: "none",
27
- "aria-hidden": "true",
28
- className: auth_pages_module_default.eyeIcon,
29
- children: [
30
- /* @__PURE__ */ jsx("path", {
31
- d: "M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94",
32
- stroke: "currentColor",
33
- strokeWidth: "2"
34
- }),
35
- /* @__PURE__ */ jsx("path", {
36
- d: "M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19",
37
- stroke: "currentColor",
38
- strokeWidth: "2"
39
- }),
40
- /* @__PURE__ */ jsx("line", {
41
- x1: "1",
42
- y1: "1",
43
- x2: "23",
44
- y2: "23",
45
- stroke: "currentColor",
46
- strokeWidth: "2"
47
- })
48
- ]
49
- });
50
- }
51
- function Field({ label, id, children, error }) {
52
- return /* @__PURE__ */ jsxs("div", {
53
- className: auth_pages_module_default.field,
54
- children: [
55
- /* @__PURE__ */ jsx("label", {
56
- htmlFor: id,
57
- className: auth_pages_module_default.label,
58
- children: label
59
- }),
60
- children,
61
- error && /* @__PURE__ */ jsx("span", {
62
- className: auth_pages_module_default.error,
63
- children: error
64
- })
65
- ]
66
- });
67
- }
68
- function PasswordField({ id, label, placeholder, value, onChange, error }) {
69
- const [show, setShow] = React.useState(false);
70
- const toggleRef = React.useRef(null);
71
- return /* @__PURE__ */ jsx(Field, {
72
- label: label ?? "Password",
73
- id,
74
- error,
75
- children: /* @__PURE__ */ jsxs("div", {
76
- className: auth_pages_module_default.passwordWrapper,
77
- children: [/* @__PURE__ */ jsx("input", {
78
- id,
79
- type: show ? "text" : "password",
80
- placeholder,
81
- value,
82
- onChange,
83
- className: auth_pages_module_default.input
84
- }), /* @__PURE__ */ jsx("button", {
85
- ref: toggleRef,
86
- type: "button",
87
- onClick: () => setShow((s) => !s),
88
- className: auth_pages_module_default.toggle,
89
- "aria-label": show ? "Hide password" : "Show password",
90
- children: /* @__PURE__ */ jsx(EyeIcon, { open: show })
91
- })]
92
- })
93
- });
94
- }
95
- function CheckboxRow({ label, linkText, linkHref, checked, onChange }) {
96
- if (!label) return null;
97
- return /* @__PURE__ */ jsxs("div", {
98
- className: auth_pages_module_default.checkboxRow,
99
- children: [/* @__PURE__ */ jsxs("label", {
100
- className: auth_pages_module_default.checkboxLabel,
101
- children: [/* @__PURE__ */ jsx("input", {
102
- type: "checkbox",
103
- className: auth_pages_module_default.checkbox,
104
- checked,
105
- onChange: (e) => onChange?.(e.target.checked)
106
- }), /* @__PURE__ */ jsx("span", { children: label })]
107
- }), linkHref && /* @__PURE__ */ jsx("a", {
108
- href: linkHref,
109
- className: auth_pages_module_default.forgotLink,
110
- children: linkText
111
- })]
112
- });
113
- }
114
- function SignInPage({ title = "Sign in", subtitle, footer, onSubmit, loading = false, brand, className, emailPlaceholder = "Email address", passwordPlaceholder = "Password", rememberLabel = "Remember me", forgotLinkText = "Forgot password?", forgotLinkHref }) {
115
- const id = React.useId();
116
- const [email, setEmail] = React.useState("");
117
- const [password, setPassword] = React.useState("");
118
- const [rememberMe, setRememberMe] = React.useState(false);
119
- const [errors, setErrors] = React.useState({});
120
- const [submitted, setSubmitted] = React.useState(false);
121
- const validate = () => {
122
- const newErrors = {};
123
- if (!email.trim()) newErrors.email = "Email is required";
124
- else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) newErrors.email = "Enter a valid email";
125
- if (!password) newErrors.password = "Password is required";
126
- setErrors(newErrors);
127
- return Object.keys(newErrors).length === 0;
128
- };
129
- const handleSubmit = (e) => {
130
- e.preventDefault();
131
- setSubmitted(true);
132
- if (!validate()) return;
133
- onSubmit?.({
134
- email,
135
- password,
136
- rememberMe
137
- });
138
- };
5
+ //#region src/components/auth-card/AuthCard.tsx
6
+ /**
7
+ * AuthCard — a centered card layout for auth pages.
8
+ *
9
+ * - Centered vertically and horizontally on screen
10
+ * - Brand → title → subtitle → form → divider → footer
11
+ * - No auth logic — just the visual template
12
+ */
13
+ var AuthCard = React.forwardRef(({ title, subtitle, children, footer, brand, className }, ref) => {
139
14
  return /* @__PURE__ */ jsx("div", {
140
- className: cx(auth_pages_module_default.authLayout, className),
15
+ className: cx(auth_card_module_default.authLayout, className),
16
+ ref,
141
17
  children: /* @__PURE__ */ jsxs("div", {
142
- className: auth_pages_module_default.authCard,
18
+ className: auth_card_module_default.authCard,
143
19
  children: [
144
20
  brand && /* @__PURE__ */ jsx("div", {
145
- className: auth_pages_module_default.authBrand,
21
+ className: auth_card_module_default.authBrand,
146
22
  children: brand
147
23
  }),
148
24
  /* @__PURE__ */ jsxs("div", {
149
- className: auth_pages_module_default.authHeader,
25
+ className: auth_card_module_default.authHeader,
150
26
  children: [/* @__PURE__ */ jsx("h1", {
151
- className: auth_pages_module_default.authTitle,
27
+ className: auth_card_module_default.authTitle,
152
28
  children: title
153
29
  }), subtitle && /* @__PURE__ */ jsx("p", {
154
- className: auth_pages_module_default.authSubtitle,
30
+ className: auth_card_module_default.authSubtitle,
155
31
  children: subtitle
156
32
  })]
157
33
  }),
158
- /* @__PURE__ */ jsxs("form", {
159
- onSubmit: handleSubmit,
160
- className: auth_pages_module_default.authForm,
161
- children: [
162
- /* @__PURE__ */ jsx(Field, {
163
- label: emailPlaceholder,
164
- id: id + "-email",
165
- error: submitted ? errors.email : void 0,
166
- children: /* @__PURE__ */ jsx("input", {
167
- id: id + "-email",
168
- type: "email",
169
- placeholder: "you@example.com",
170
- value: email,
171
- onChange: (e) => setEmail(e.target.value),
172
- className: auth_pages_module_default.input,
173
- autoComplete: "email",
174
- autoFocus: true
175
- })
176
- }),
177
- /* @__PURE__ */ jsx(PasswordField, {
178
- label: passwordPlaceholder,
179
- id: id + "-password",
180
- placeholder: passwordPlaceholder,
181
- value: password,
182
- onChange: (e) => {
183
- setPassword(e.target.value);
184
- if (submitted) setSubmitted(false);
185
- },
186
- error: submitted ? errors.password : void 0
187
- }),
188
- /* @__PURE__ */ jsx(CheckboxRow, {
189
- label: rememberLabel,
190
- linkText: forgotLinkText,
191
- linkHref: forgotLinkHref,
192
- checked: rememberMe,
193
- onChange: (c) => {
194
- setRememberMe(c);
195
- if (submitted) setSubmitted(false);
196
- }
197
- }),
198
- /* @__PURE__ */ jsx("button", {
199
- type: "submit",
200
- disabled: loading,
201
- className: auth_pages_module_default.submitButton,
202
- children: loading ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", { className: auth_pages_module_default.spinner }), "Signing in..."] }) : "Sign in"
203
- })
204
- ]
205
- }),
206
- footer && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("hr", { className: auth_pages_module_default.divider }), /* @__PURE__ */ jsx("p", {
207
- className: auth_pages_module_default.authFooter,
208
- children: footer
209
- })] })
210
- ]
211
- })
212
- });
213
- }
214
- function SignUpPage({ title = "Create an account", subtitle, footer, onSubmit, loading = false, brand, className, emailPlaceholder = "Email address", passwordPlaceholder = "Password", confirmPasswordPlaceholder = "Confirm password", checkboxLabel, checkboxLinkText, checkboxLinkHref }) {
215
- const id = React.useId();
216
- const [email, setEmail] = React.useState("");
217
- const [password, setPassword] = React.useState("");
218
- const [confirmPassword, setConfirmPassword] = React.useState("");
219
- const [agreed, setAgreed] = React.useState(false);
220
- const [errors, setErrors] = React.useState({});
221
- const [submitted, setSubmitted] = React.useState(false);
222
- const validate = () => {
223
- const newErrors = {};
224
- if (!email.trim()) newErrors.email = "Email is required";
225
- else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) newErrors.email = "Enter a valid email";
226
- if (!password) newErrors.password = "Password is required";
227
- else if (password.length < 8) newErrors.password = "At least 8 characters";
228
- if (password !== confirmPassword) newErrors.confirmPassword = "Passwords do not match";
229
- if (!agreed) newErrors.agreed = "You must agree to continue";
230
- setErrors(newErrors);
231
- return Object.keys(newErrors).length === 0;
232
- };
233
- const handleSubmit = (e) => {
234
- e.preventDefault();
235
- setSubmitted(true);
236
- if (!validate()) return;
237
- onSubmit?.({
238
- email,
239
- password,
240
- agreed
241
- });
242
- };
243
- return /* @__PURE__ */ jsx("div", {
244
- className: cx(auth_pages_module_default.authLayout, className),
245
- children: /* @__PURE__ */ jsxs("div", {
246
- className: auth_pages_module_default.authCard,
247
- children: [
248
- brand && /* @__PURE__ */ jsx("div", {
249
- className: auth_pages_module_default.authBrand,
250
- children: brand
251
- }),
252
- /* @__PURE__ */ jsxs("div", {
253
- className: auth_pages_module_default.authHeader,
254
- children: [/* @__PURE__ */ jsx("h1", {
255
- className: auth_pages_module_default.authTitle,
256
- children: title
257
- }), subtitle && /* @__PURE__ */ jsx("p", {
258
- className: auth_pages_module_default.authSubtitle,
259
- children: subtitle
260
- })]
261
- }),
262
- /* @__PURE__ */ jsxs("form", {
263
- onSubmit: handleSubmit,
264
- className: auth_pages_module_default.authForm,
265
- children: [
266
- /* @__PURE__ */ jsx(Field, {
267
- label: emailPlaceholder,
268
- id: id + "-email",
269
- error: submitted ? errors.email : void 0,
270
- children: /* @__PURE__ */ jsx("input", {
271
- id: id + "-email",
272
- type: "email",
273
- placeholder: "you@example.com",
274
- value: email,
275
- onChange: (e) => {
276
- setEmail(e.target.value);
277
- if (submitted) setSubmitted(false);
278
- },
279
- className: auth_pages_module_default.input,
280
- autoComplete: "email",
281
- autoFocus: true
282
- })
283
- }),
284
- /* @__PURE__ */ jsx(PasswordField, {
285
- label: passwordPlaceholder,
286
- id: id + "-password",
287
- placeholder: passwordPlaceholder,
288
- value: password,
289
- onChange: (e) => {
290
- setPassword(e.target.value);
291
- if (submitted) setSubmitted(false);
292
- },
293
- error: submitted ? errors.password : void 0
294
- }),
295
- /* @__PURE__ */ jsx(PasswordField, {
296
- label: confirmPasswordPlaceholder,
297
- id: id + "-confirm",
298
- placeholder: confirmPasswordPlaceholder,
299
- value: confirmPassword,
300
- onChange: (e) => {
301
- setConfirmPassword(e.target.value);
302
- if (submitted) setSubmitted(false);
303
- },
304
- error: submitted ? errors.confirmPassword : void 0
305
- }),
306
- checkboxLabel && /* @__PURE__ */ jsx("div", {
307
- className: auth_pages_module_default.checkboxRow,
308
- children: /* @__PURE__ */ jsxs("label", {
309
- className: auth_pages_module_default.checkboxLabel,
310
- children: [/* @__PURE__ */ jsx("input", {
311
- id: id + "-agreed",
312
- type: "checkbox",
313
- checked: agreed,
314
- onChange: (e) => {
315
- setAgreed(e.target.checked);
316
- if (submitted) setSubmitted(false);
317
- },
318
- className: auth_pages_module_default.checkbox
319
- }), /* @__PURE__ */ jsx("span", { children: checkboxLinkText ? /* @__PURE__ */ jsxs(Fragment, { children: [
320
- "I agree to the",
321
- " ",
322
- /* @__PURE__ */ jsx("a", {
323
- href: checkboxLinkHref,
324
- className: auth_pages_module_default.checkboxLink,
325
- children: checkboxLinkText
326
- })
327
- ] }) : checkboxLabel })]
328
- })
329
- }),
330
- submitted && errors.agreed && /* @__PURE__ */ jsx("span", {
331
- className: auth_pages_module_default.error,
332
- children: errors.agreed
333
- }),
334
- /* @__PURE__ */ jsx("button", {
335
- type: "submit",
336
- disabled: loading,
337
- className: auth_pages_module_default.submitButton,
338
- children: loading ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", { className: auth_pages_module_default.spinner }), "Creating account..."] }) : "Create account"
339
- })
340
- ]
341
- }),
342
- footer && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("hr", { className: auth_pages_module_default.divider }), /* @__PURE__ */ jsx("p", {
343
- className: auth_pages_module_default.authFooter,
344
- children: footer
345
- })] })
346
- ]
347
- })
348
- });
349
- }
350
- function ForgotPasswordPage({ title = "Reset password", subtitle = "Enter your email and we'll send a reset link", footer, onSubmit, loading = false, brand, className, emailPlaceholder = "Email address", buttonText = "Send reset link", backLinkText = "Back to sign in", backLinkHref = "/signin" }) {
351
- const id = React.useId();
352
- const [email, setEmail] = React.useState("");
353
- const [error, setError] = React.useState("");
354
- const [sent, setSent] = React.useState(false);
355
- const handleSubmit = (e) => {
356
- e.preventDefault();
357
- if (!email.trim()) {
358
- setError("Email is required");
359
- return;
360
- }
361
- if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
362
- setError("Enter a valid email");
363
- return;
364
- }
365
- onSubmit?.({ email });
366
- setSent(true);
367
- };
368
- return /* @__PURE__ */ jsx("div", {
369
- className: cx(auth_pages_module_default.authLayout, className),
370
- children: /* @__PURE__ */ jsxs("div", {
371
- className: auth_pages_module_default.authCard,
372
- children: [
373
- brand && /* @__PURE__ */ jsx("div", {
374
- className: auth_pages_module_default.authBrand,
375
- children: brand
376
- }),
377
- /* @__PURE__ */ jsxs("div", {
378
- className: auth_pages_module_default.authHeader,
379
- children: [/* @__PURE__ */ jsx("h1", {
380
- className: auth_pages_module_default.authTitle,
381
- children: title
382
- }), subtitle && /* @__PURE__ */ jsx("p", {
383
- className: auth_pages_module_default.authSubtitle,
384
- children: subtitle
385
- })]
386
- }),
387
- sent ? /* @__PURE__ */ jsxs("div", {
388
- className: auth_pages_module_default.sentMessage,
389
- children: [/* @__PURE__ */ jsxs("p", {
390
- className: auth_pages_module_default.sentText,
391
- children: [
392
- "If an account exists for ",
393
- /* @__PURE__ */ jsx("strong", { children: email }),
394
- ", you'll receive a reset link shortly."
395
- ]
396
- }), /* @__PURE__ */ jsx("a", {
397
- href: backLinkHref,
398
- className: auth_pages_module_default.backLink,
399
- children: backLinkText
400
- })]
401
- }) : /* @__PURE__ */ jsxs("form", {
402
- onSubmit: handleSubmit,
403
- className: auth_pages_module_default.authForm,
404
- children: [/* @__PURE__ */ jsx(Field, {
405
- label: emailPlaceholder,
406
- id: id + "-email",
407
- error,
408
- children: /* @__PURE__ */ jsx("input", {
409
- id: id + "-email",
410
- type: "email",
411
- placeholder: "you@example.com",
412
- value: email,
413
- onChange: (e) => {
414
- setEmail(e.target.value);
415
- setError("");
416
- },
417
- className: auth_pages_module_default.input,
418
- autoComplete: "email",
419
- autoFocus: true
420
- })
421
- }), /* @__PURE__ */ jsx("button", {
422
- type: "submit",
423
- disabled: loading,
424
- className: auth_pages_module_default.submitButton,
425
- children: loading ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", { className: auth_pages_module_default.spinner }), "Sending..."] }) : buttonText
426
- })]
34
+ /* @__PURE__ */ jsx("div", {
35
+ className: auth_card_module_default.authBody,
36
+ children
427
37
  }),
428
- footer && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("hr", { className: auth_pages_module_default.divider }), /* @__PURE__ */ jsx("p", {
429
- className: auth_pages_module_default.authFooter,
38
+ footer && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("hr", { className: auth_card_module_default.divider }), /* @__PURE__ */ jsx("p", {
39
+ className: auth_card_module_default.authFooter,
430
40
  children: footer
431
41
  })] })
432
42
  ]
433
43
  })
434
44
  });
435
- }
45
+ });
46
+ AuthCard.displayName = "AuthCard";
436
47
  //#endregion
437
- export { ForgotPasswordPage, SignInPage, SignUpPage };
48
+ export { AuthCard };
438
49
 
439
50
  //# sourceMappingURL=index66.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index66.js","names":[],"sources":["../src/components/auth-pages/AuthPages.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport styles from \"./auth-pages.module.css\";\n\n// ── Eye icon (show/hide password) ──\nfunction EyeIcon({ open }: { open: boolean }) {\n if (open) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" className={styles.eyeIcon}>\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" stroke=\"currentColor\" strokeWidth=\"2\" />\n </svg>\n );\n }\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" className={styles.eyeIcon}>\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" stroke=\"currentColor\" strokeWidth=\"2\" />\n </svg>\n );\n}\n\n// ── Internal reusable field ──\ninterface FieldProps {\n label: string;\n id: string;\n children: React.ReactNode;\n error?: string;\n}\n\nfunction Field({ label, id, children, error }: FieldProps) {\n return (\n <div className={styles.field}>\n <label htmlFor={id} className={styles.label}>\n {label}\n </label>\n {children}\n {error && <span className={styles.error}>{error}</span>}\n </div>\n );\n}\n\n// ── Password input with visibility toggle ──\ninterface PasswordFieldProps {\n id: string;\n label?: string;\n placeholder?: string;\n value?: string;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n error?: string;\n}\n\nfunction PasswordField({ id, label, placeholder, value, onChange, error }: PasswordFieldProps) {\n const [show, setShow] = React.useState(false);\n const toggleRef = React.useRef<HTMLButtonElement>(null);\n\n return (\n <Field label={label ?? \"Password\"} id={id} error={error}>\n <div className={styles.passwordWrapper}>\n <input\n id={id}\n type={show ? \"text\" : \"password\"}\n placeholder={placeholder}\n value={value}\n onChange={onChange}\n className={styles.input}\n />\n <button\n ref={toggleRef}\n type=\"button\"\n onClick={() => setShow((s) => !s)}\n className={styles.toggle}\n aria-label={show ? \"Hide password\" : \"Show password\"}\n >\n <EyeIcon open={show} />\n </button>\n </div>\n </Field>\n );\n}\n\n// ── Checkbox row ──\ninterface CheckboxRowProps {\n label?: string;\n linkText: string;\n linkHref?: string;\n}\n\ninterface CheckboxRowPropsExtended extends CheckboxRowProps {\n checked?: boolean;\n onChange?: (checked: boolean) => void;\n}\n\nfunction CheckboxRow({ label, linkText, linkHref, checked, onChange }: CheckboxRowPropsExtended) {\n if (!label) return null;\n return (\n <div className={styles.checkboxRow}>\n <label className={styles.checkboxLabel}>\n <input\n type=\"checkbox\"\n className={styles.checkbox}\n checked={checked}\n onChange={(e) => onChange?.(e.target.checked)}\n />\n <span>{label}</span>\n </label>\n {linkHref && (\n <a href={linkHref} className={styles.forgotLink}>\n {linkText}\n </a>\n )}\n </div>\n );\n}\n\n// ── Shared props ──\ninterface BaseAuthPageProps {\n /** Page title */\n title: string;\n /** Page subtitle */\n subtitle?: string;\n /** Footer content (e.g., \"No account? Sign up\") */\n footer?: React.ReactNode;\n /** Called with form data on valid submit */\n onSubmit?: (data: Record<string, string | boolean>) => void;\n /** Loading state for the submit button */\n loading?: boolean;\n /** Optional brand/logo element */\n brand?: React.ReactNode;\n /** Extra class for the outer wrapper */\n className?: string;\n}\n\n// ── Sign In Page ──\nexport interface SignInPageProps extends BaseAuthPageProps {\n /** Email placeholder (default \"Email address\") */\n emailPlaceholder?: string;\n /** Password placeholder (default \"Password\") */\n passwordPlaceholder?: string;\n /** \"Remember me\" checkbox label */\n rememberLabel?: string;\n /** \"Forgot password\" link text */\n forgotLinkText?: string;\n /** \"Forgot password\" link href */\n forgotLinkHref?: string;\n}\n\nexport function SignInPage({\n title = \"Sign in\",\n subtitle,\n footer,\n onSubmit,\n loading = false,\n brand,\n className,\n emailPlaceholder = \"Email address\",\n passwordPlaceholder = \"Password\",\n rememberLabel = \"Remember me\",\n forgotLinkText = \"Forgot password?\",\n forgotLinkHref,\n}: SignInPageProps) {\n const id = React.useId();\n const [email, setEmail] = React.useState(\"\");\n const [password, setPassword] = React.useState(\"\");\n const [rememberMe, setRememberMe] = React.useState(false);\n const [errors, setErrors] = React.useState<Record<string, string>>({});\n const [submitted, setSubmitted] = React.useState(false);\n\n const validate = (): boolean => {\n const newErrors: Record<string, string> = {};\n if (!email.trim()) newErrors.email = \"Email is required\";\n else if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) newErrors.email = \"Enter a valid email\";\n if (!password) newErrors.password = \"Password is required\";\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n setSubmitted(true);\n if (!validate()) return;\n onSubmit?.({ email, password, rememberMe });\n };\n\n return (\n <div className={cx(styles.authLayout, className)}>\n <div className={styles.authCard}>\n {brand && <div className={styles.authBrand}>{brand}</div>}\n <div className={styles.authHeader}>\n <h1 className={styles.authTitle}>{title}</h1>\n {subtitle && <p className={styles.authSubtitle}>{subtitle}</p>}\n </div>\n <form onSubmit={handleSubmit} className={styles.authForm}>\n <Field label={emailPlaceholder} id={id + \"-email\"} error={submitted ? errors.email : undefined}>\n <input\n id={id + \"-email\"}\n type=\"email\"\n placeholder=\"you@example.com\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n className={styles.input}\n autoComplete=\"email\"\n autoFocus\n />\n </Field>\n <PasswordField\n label={passwordPlaceholder}\n id={id + \"-password\"}\n placeholder={passwordPlaceholder}\n value={password}\n onChange={(e) => { setPassword(e.target.value); if (submitted) setSubmitted(false); }}\n error={submitted ? errors.password : undefined}\n />\n <CheckboxRow\n label={rememberLabel}\n linkText={forgotLinkText}\n linkHref={forgotLinkHref}\n checked={rememberMe}\n onChange={(c) => { setRememberMe(c); if (submitted) setSubmitted(false); }}\n />\n <button\n type=\"submit\"\n disabled={loading}\n className={styles.submitButton}\n >\n {loading ? (\n <>\n <span className={styles.spinner} />\n Signing in...\n </>\n ) : (\n \"Sign in\"\n )}\n </button>\n </form>\n {footer && (\n <>\n <hr className={styles.divider} />\n <p className={styles.authFooter}>{footer}</p>\n </>\n )}\n </div>\n </div>\n );\n}\n\n// ── Sign Up Page ──\nexport interface SignUpPageProps extends BaseAuthPageProps {\n /** Email placeholder */\n emailPlaceholder?: string;\n /** Password placeholder */\n passwordPlaceholder?: string;\n /** Confirm password placeholder */\n confirmPasswordPlaceholder?: string;\n /** Checkbox label (e.g., \"I agree to the Terms of Service\") */\n checkboxLabel?: string;\n /** Checkbox href */\n checkboxLinkText?: string;\n /** Checkbox href */\n checkboxLinkHref?: string;\n}\n\nexport function SignUpPage({\n title = \"Create an account\",\n subtitle,\n footer,\n onSubmit,\n loading = false,\n brand,\n className,\n emailPlaceholder = \"Email address\",\n passwordPlaceholder = \"Password\",\n confirmPasswordPlaceholder = \"Confirm password\",\n checkboxLabel,\n checkboxLinkText,\n checkboxLinkHref,\n}: SignUpPageProps) {\n const id = React.useId();\n const [email, setEmail] = React.useState(\"\");\n const [password, setPassword] = React.useState(\"\");\n const [confirmPassword, setConfirmPassword] = React.useState(\"\");\n const [agreed, setAgreed] = React.useState(false);\n const [errors, setErrors] = React.useState<Record<string, string>>({});\n const [submitted, setSubmitted] = React.useState(false);\n\n const validate = (): boolean => {\n const newErrors: Record<string, string> = {};\n if (!email.trim()) newErrors.email = \"Email is required\";\n else if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) newErrors.email = \"Enter a valid email\";\n if (!password) newErrors.password = \"Password is required\";\n else if (password.length < 8) newErrors.password = \"At least 8 characters\";\n if (password !== confirmPassword) newErrors.confirmPassword = \"Passwords do not match\";\n if (!agreed) newErrors.agreed = \"You must agree to continue\";\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n setSubmitted(true);\n if (!validate()) return;\n onSubmit?.({ email, password, agreed });\n };\n\n return (\n <div className={cx(styles.authLayout, className)}>\n <div className={styles.authCard}>\n {brand && <div className={styles.authBrand}>{brand}</div>}\n <div className={styles.authHeader}>\n <h1 className={styles.authTitle}>{title}</h1>\n {subtitle && <p className={styles.authSubtitle}>{subtitle}</p>}\n </div>\n <form onSubmit={handleSubmit} className={styles.authForm}>\n <Field label={emailPlaceholder} id={id + \"-email\"} error={submitted ? errors.email : undefined}>\n <input\n id={id + \"-email\"}\n type=\"email\"\n placeholder=\"you@example.com\"\n value={email}\n onChange={(e) => { setEmail(e.target.value); if (submitted) setSubmitted(false); }}\n className={styles.input}\n autoComplete=\"email\"\n autoFocus\n />\n </Field>\n <PasswordField\n label={passwordPlaceholder}\n id={id + \"-password\"}\n placeholder={passwordPlaceholder}\n value={password}\n onChange={(e) => { setPassword(e.target.value); if (submitted) setSubmitted(false); }}\n error={submitted ? errors.password : undefined}\n />\n <PasswordField\n label={confirmPasswordPlaceholder}\n id={id + \"-confirm\"}\n placeholder={confirmPasswordPlaceholder}\n value={confirmPassword}\n onChange={(e) => { setConfirmPassword(e.target.value); if (submitted) setSubmitted(false); }}\n error={submitted ? errors.confirmPassword : undefined}\n />\n {checkboxLabel && (\n <div className={styles.checkboxRow}>\n <label className={styles.checkboxLabel}>\n <input\n id={id + \"-agreed\"}\n type=\"checkbox\"\n checked={agreed}\n onChange={(e) => { setAgreed(e.target.checked); if (submitted) setSubmitted(false); }}\n className={styles.checkbox}\n />\n <span>\n {checkboxLinkText ? (\n <>\n I agree to the{\" \"}\n <a href={checkboxLinkHref} className={styles.checkboxLink}>\n {checkboxLinkText}\n </a>\n </>\n ) : (\n checkboxLabel\n )}\n </span>\n </label>\n </div>\n )}\n {submitted && errors.agreed && <span className={styles.error}>{errors.agreed}</span>}\n <button\n type=\"submit\"\n disabled={loading}\n className={styles.submitButton}\n >\n {loading ? (\n <>\n <span className={styles.spinner} />\n Creating account...\n </>\n ) : (\n \"Create account\"\n )}\n </button>\n </form>\n {footer && (\n <>\n <hr className={styles.divider} />\n <p className={styles.authFooter}>{footer}</p>\n </>\n )}\n </div>\n </div>\n );\n}\n\n// ── Forgot Password Page ──\nexport interface ForgotPasswordPageProps extends BaseAuthPageProps {\n /** Email placeholder */\n emailPlaceholder?: string;\n /** Button text */\n buttonText?: string;\n /** Back to sign in link text */\n backLinkText?: string;\n /** Back to sign in link href */\n backLinkHref?: string;\n}\n\nexport function ForgotPasswordPage({\n title = \"Reset password\",\n subtitle = \"Enter your email and we'll send a reset link\",\n footer,\n onSubmit,\n loading = false,\n brand,\n className,\n emailPlaceholder = \"Email address\",\n buttonText = \"Send reset link\",\n backLinkText = \"Back to sign in\",\n backLinkHref = \"/signin\",\n}: ForgotPasswordPageProps) {\n const id = React.useId();\n const [email, setEmail] = React.useState(\"\");\n const [error, setError] = React.useState(\"\");\n const [sent, setSent] = React.useState(false);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (!email.trim()) { setError(\"Email is required\"); return; }\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) { setError(\"Enter a valid email\"); return; }\n onSubmit?.({ email });\n setSent(true);\n };\n\n return (\n <div className={cx(styles.authLayout, className)}>\n <div className={styles.authCard}>\n {brand && <div className={styles.authBrand}>{brand}</div>}\n <div className={styles.authHeader}>\n <h1 className={styles.authTitle}>{title}</h1>\n {subtitle && <p className={styles.authSubtitle}>{subtitle}</p>}\n </div>\n {sent ? (\n <div className={styles.sentMessage}>\n <p className={styles.sentText}>\n If an account exists for <strong>{email}</strong>, you'll receive a reset link shortly.\n </p>\n <a href={backLinkHref} className={styles.backLink}>\n {backLinkText}\n </a>\n </div>\n ) : (\n <form onSubmit={handleSubmit} className={styles.authForm}>\n <Field label={emailPlaceholder} id={id + \"-email\"} error={error}>\n <input\n id={id + \"-email\"}\n type=\"email\"\n placeholder=\"you@example.com\"\n value={email}\n onChange={(e) => { setEmail(e.target.value); setError(\"\"); }}\n className={styles.input}\n autoComplete=\"email\"\n autoFocus\n />\n </Field>\n <button\n type=\"submit\"\n disabled={loading}\n className={styles.submitButton}\n >\n {loading ? (\n <>\n <span className={styles.spinner} />\n Sending...\n </>\n ) : (\n buttonText\n )}\n </button>\n </form>\n )}\n {footer && (\n <>\n <hr className={styles.divider} />\n <p className={styles.authFooter}>{footer}</p>\n </>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index66.js","names":[],"sources":["../src/components/auth-card/AuthCard.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cx } from \"../../utils/cx\";\nimport styles from \"./auth-card.module.css\";\n\nexport interface AuthCardProps {\n /** Title displayed at the top of the card. */\n title: React.ReactNode;\n /** Subtitle displayed below the title. */\n subtitle?: React.ReactNode;\n /** Primary form content rendered in the card body. */\n children: React.ReactNode;\n /** Footer links rendered below the divider (e.g., \"No account? Sign up\"). */\n footer?: React.ReactNode;\n /** Optional brand/logo element rendered above the title. */\n brand?: React.ReactNode;\n /** Additional class name for the outer wrapper. */\n className?: string;\n}\n\n/**\n * AuthCard — a centered card layout for auth pages.\n *\n * - Centered vertically and horizontally on screen\n * - Brand → title → subtitle → form → divider → footer\n * - No auth logic — just the visual template\n */\nexport const AuthCard = React.forwardRef<HTMLDivElement, AuthCardProps>(\n ({ title, subtitle, children, footer, brand, className }, ref) => {\n return (\n <div className={cx(styles.authLayout, className)} ref={ref}>\n <div className={styles.authCard}>\n {brand && <div className={styles.authBrand}>{brand}</div>}\n <div className={styles.authHeader}>\n <h1 className={styles.authTitle}>{title}</h1>\n {subtitle && <p className={styles.authSubtitle}>{subtitle}</p>}\n </div>\n <div className={styles.authBody}>{children}</div>\n {footer && (\n <>\n <hr className={styles.divider} />\n <p className={styles.authFooter}>{footer}</p>\n </>\n )}\n </div>\n </div>\n );\n },\n);\n\nAuthCard.displayName = \"AuthCard\";\n"],"mappings":";;;;;;;;;;;;AA0BA,IAAa,WAAW,MAAM,YAC3B,EAAE,OAAO,UAAU,UAAU,QAAQ,OAAO,aAAa,QAAQ;CAChE,OACE,oBAAC,OAAD;EAAK,WAAW,GAAG,yBAAO,YAAY,SAAS;EAAQ;YACrD,qBAAC,OAAD;GAAK,WAAW,yBAAO;aAAvB;IACG,SAAS,oBAAC,OAAD;KAAK,WAAW,yBAAO;eAAY;IAAW,CAAA;IACxD,qBAAC,OAAD;KAAK,WAAW,yBAAO;eAAvB,CACE,oBAAC,MAAD;MAAI,WAAW,yBAAO;gBAAY;KAAU,CAAA,GAC3C,YAAY,oBAAC,KAAD;MAAG,WAAW,yBAAO;gBAAe;KAAY,CAAA,CAC1D;;IACL,oBAAC,OAAD;KAAK,WAAW,yBAAO;KAAW;IAAc,CAAA;IAC/C,UACC,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,MAAD,EAAI,WAAW,yBAAO,QAAU,CAAA,GAChC,oBAAC,KAAD;KAAG,WAAW,yBAAO;eAAa;IAAU,CAAA,CAC5C,EAAA,CAAA;GAED;;CACF,CAAA;AAET,CACF;AAEA,SAAS,cAAc"}