azirid-react 0.7.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
- import { createContext, forwardRef, useMemo, useCallback, useContext, useEffect, useState, useRef } from 'react';
1
+ import { createContext, forwardRef, useMemo, useCallback, useState, useContext, useEffect, useRef } from 'react';
2
2
  import { useForm } from 'react-hook-form';
3
3
  import { zodResolver } from '@hookform/resolvers/zod';
4
4
  import { z } from 'zod';
5
5
  import { clsx } from 'clsx';
6
6
  import { twMerge } from 'tailwind-merge';
7
- import { QueryClient, QueryClientProvider, useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
7
+ import { QueryClient, useMutation, QueryClientProvider, useQuery, useQueryClient } from '@tanstack/react-query';
8
8
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
9
9
  import { cva } from 'class-variance-authority';
10
10
  import { Slot } from 'radix-ui';
@@ -57,6 +57,32 @@ var socialLoginSchema = z.object({
57
57
  acceptedTosVersion: z.string().optional(),
58
58
  acceptedPrivacyVersion: z.string().optional()
59
59
  });
60
+ function createForgotPasswordSchema(v) {
61
+ return z.object({
62
+ email: z.string({ required_error: v.emailRequired }).min(1, v.emailRequired).email(v.emailInvalid)
63
+ });
64
+ }
65
+ var forgotPasswordSchema = z.object({
66
+ email: z.string({ required_error: "El correo es requerido" }).min(1, "El correo es requerido").email("Correo electr\xF3nico inv\xE1lido")
67
+ });
68
+ function createResetPasswordConfirmSchema(v) {
69
+ return z.object({
70
+ token: z.string({ required_error: v.tokenRequired }).min(1, v.tokenRequired),
71
+ newPassword: z.string({ required_error: v.newPasswordRequired }).min(10, v.passwordMinLength),
72
+ confirmPassword: z.string({ required_error: v.confirmPasswordRequired }).min(1, v.confirmPasswordRequired)
73
+ }).refine((data) => data.newPassword === data.confirmPassword, {
74
+ message: v.passwordsMismatch,
75
+ path: ["confirmPassword"]
76
+ });
77
+ }
78
+ var resetPasswordConfirmSchema = z.object({
79
+ token: z.string({ required_error: "El token es requerido" }).min(1, "El token es requerido"),
80
+ newPassword: z.string({ required_error: "La nueva contrase\xF1a es requerida" }).min(10, "La contrase\xF1a debe tener al menos 10 caracteres"),
81
+ confirmPassword: z.string({ required_error: "Confirma tu contrase\xF1a" }).min(1, "Confirma tu contrase\xF1a")
82
+ }).refine((data) => data.newPassword === data.confirmPassword, {
83
+ message: "Las contrase\xF1as no coinciden",
84
+ path: ["confirmPassword"]
85
+ });
60
86
  var passkeyRegisterStartSchema = z.object({
61
87
  deviceName: z.string().optional()
62
88
  });
@@ -94,6 +120,8 @@ var SUFFIXES = {
94
120
  submitTransferProof: "billing/transfer-proof",
95
121
  transferProofs: "billing/transfer-proofs",
96
122
  payphoneConfirm: "billing/payphone/confirm",
123
+ passwordResetRequest: "password/reset/request",
124
+ passwordResetConfirm: "password/reset/confirm",
97
125
  referralMe: "referrals/me",
98
126
  referralStats: "referrals/stats",
99
127
  userTenants: "tenants"
@@ -373,6 +401,14 @@ var es = {
373
401
  cancel: "Cancelar",
374
402
  processing: "Procesando..."
375
403
  },
404
+ navigation: {
405
+ noAccountText: "\xBFNo tienes cuenta?",
406
+ signUpLink: "Reg\xEDstrate",
407
+ hasAccountText: "\xBFYa tienes cuenta?",
408
+ signInLink: "Inicia sesi\xF3n",
409
+ forgotPassword: "\xBFOlvidaste tu contrase\xF1a?",
410
+ backToLogin: "Volver a iniciar sesi\xF3n"
411
+ },
376
412
  validation: {
377
413
  emailRequired: "El correo es requerido",
378
414
  emailInvalid: "Correo electr\xF3nico inv\xE1lido",
@@ -451,6 +487,14 @@ var en = {
451
487
  cancel: "Cancel",
452
488
  processing: "Processing..."
453
489
  },
490
+ navigation: {
491
+ noAccountText: "Don't have an account?",
492
+ signUpLink: "Sign up",
493
+ hasAccountText: "Already have an account?",
494
+ signInLink: "Sign in",
495
+ forgotPassword: "Forgot your password?",
496
+ backToLogin: "Back to sign in"
497
+ },
454
498
  validation: {
455
499
  emailRequired: "Email is required",
456
500
  emailInvalid: "Invalid email address",
@@ -479,6 +523,7 @@ function resolveMessages(locale = "es", overrides) {
479
523
  signup: { ...base.signup, ...overrides.signup },
480
524
  forgotPassword: { ...base.forgotPassword, ...overrides.forgotPassword },
481
525
  resetPassword: { ...base.resetPassword, ...overrides.resetPassword },
526
+ navigation: { ...base.navigation, ...overrides.navigation },
482
527
  social: { ...base.social, ...overrides.social },
483
528
  passwordToggle: { ...base.passwordToggle, ...overrides.passwordToggle },
484
529
  securedBy: overrides.securedBy ?? base.securedBy,
@@ -489,7 +534,7 @@ function resolveMessages(locale = "es", overrides) {
489
534
 
490
535
  // src/styles/generated.ts
491
536
  var css = `/*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */
492
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){[data-azirid] *,[data-azirid] :before,[data-azirid] :after,[data-azirid] ::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-content:""}}[data-azirid]{--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-blue-500:oklch(62.3% .214 259.815);--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-medium:500;--leading-snug:1.375;--radius-md:calc(var(--aa-radius) - 2px);--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--aa-font-sans,ui-sans-serif, system-ui, sans-serif);--default-mono-font-family:var(--font-mono)}.\\@container\\/card-header{container:card-header/inline-size}.collapse{visibility:collapse}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.start{inset-inline-start:var(--spacing)}.z-10{z-index:10}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mr-2{margin-right:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.h-4{height:calc(var(--spacing) * 4)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.w-4{width:calc(var(--spacing) * 4)}.w-auto{width:auto}.w-full{width:100%}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:calc(var(--spacing) * 0)}.shrink-0{flex-shrink:0}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.auto-rows-min{grid-auto-rows:min-content}.flex-col{flex-direction:column}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.self-center{align-self:center}.self-start{align-self:flex-start}.justify-self-end{justify-self:flex-end}.overflow-hidden{overflow:hidden}.rounded-\\[min\\(var\\(--radius-md\\)\\,10px\\)\\]{border-radius:min(var(--radius-md), 10px)}.rounded-\\[min\\(var\\(--radius-md\\)\\,12px\\)\\]{border-radius:min(var(--radius-md), 12px)}.rounded-lg{border-radius:var(--aa-radius)}.rounded-md{border-radius:calc(var(--aa-radius) - 2px)}.rounded-xl{border-radius:calc(var(--aa-radius) + 4px)}.rounded-t-xl{border-top-left-radius:calc(var(--aa-radius) + 4px);border-top-right-radius:calc(var(--aa-radius) + 4px)}.rounded-b-xl{border-bottom-right-radius:calc(var(--aa-radius) + 4px);border-bottom-left-radius:calc(var(--aa-radius) + 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-border{border-color:var(--aa-border)}.border-destructive,.border-destructive\\/50{border-color:var(--aa-destructive)}@supports (color:color-mix(in lab, red, red)){.border-destructive\\/50{border-color:color-mix(in oklab, var(--aa-destructive) 50%, transparent)}}.border-input{border-color:var(--aa-input)}.border-transparent{border-color:#0000}.bg-background{background-color:var(--aa-background)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-border{background-color:var(--aa-border)}.bg-card{background-color:var(--aa-card)}.bg-destructive,.bg-destructive\\/10{background-color:var(--aa-destructive)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\\/10{background-color:color-mix(in oklab, var(--aa-destructive) 10%, transparent)}}.bg-muted,.bg-muted\\/50{background-color:var(--aa-muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\\/50{background-color:color-mix(in oklab, var(--aa-muted) 50%, transparent)}}.bg-primary{background-color:var(--aa-primary)}.bg-secondary{background-color:var(--aa-secondary)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-clip-padding{background-clip:padding-box}.p-4{padding:calc(var(--spacing) * 4)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\[0\\.8rem\\]{font-size:.8rem}.leading-none{--tw-leading:1;line-height:1}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.whitespace-nowrap{white-space:nowrap}.text-card-foreground{color:var(--aa-card-foreground)}.text-destructive{color:var(--aa-destructive)}.text-muted-foreground{color:var(--aa-muted-foreground)}.text-primary{color:var(--aa-primary)}.text-primary-foreground{color:var(--aa-primary-foreground)}.text-secondary-foreground{color:var(--aa-secondary-foreground)}.uppercase{text-transform:uppercase}.underline-offset-4{text-underline-offset:4px}.opacity-25{opacity:.25}.opacity-75{opacity:.75}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-foreground,.ring-foreground\\/10{--tw-ring-color:var(--aa-foreground)}@supports (color:color-mix(in lab, red, red)){.ring-foreground\\/10{--tw-ring-color:color-mix(in oklab, var(--aa-foreground) 10%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.group-data-\\[disabled\\=true\\]\\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.group-data-\\[disabled\\=true\\]\\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5}.group-data-\\[size\\=sm\\]\\/card\\:p-3:is(:where(.group\\/card)[data-size=sm] *){padding:calc(var(--spacing) * 3)}.group-data-\\[size\\=sm\\]\\/card\\:px-3:is(:where(.group\\/card)[data-size=sm] *){padding-inline:calc(var(--spacing) * 3)}.group-data-\\[size\\=sm\\]\\/card\\:text-sm:is(:where(.group\\/card)[data-size=sm] *){font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.peer-disabled\\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.file\\:inline-flex::file-selector-button{display:inline-flex}.file\\:h-6::file-selector-button{height:calc(var(--spacing) * 6)}.file\\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\\:bg-transparent::file-selector-button{background-color:#0000}.file\\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\\:text-foreground::file-selector-button{color:var(--aa-foreground)}.placeholder\\:text-muted-foreground::placeholder{color:var(--aa-muted-foreground)}.after\\:absolute:after{content:var(--tw-content);position:absolute}.after\\:inset-0:after{content:var(--tw-content);inset:calc(var(--spacing) * 0)}.after\\:top-1\\/2:after{content:var(--tw-content);top:50%}.after\\:z-0:after{content:var(--tw-content);z-index:0}.after\\:flex:after{content:var(--tw-content);display:flex}.after\\:items-center:after{content:var(--tw-content);align-items:center}.after\\:border-t:after{content:var(--tw-content);border-top-style:var(--tw-border-style);border-top-width:1px}.after\\:border-border:after{content:var(--tw-content);border-color:var(--aa-border)}@media (hover:hover){.hover\\:bg-destructive\\/20:hover{background-color:var(--aa-destructive)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-destructive\\/20:hover{background-color:color-mix(in oklab, var(--aa-destructive) 20%, transparent)}}.hover\\:bg-muted:hover{background-color:var(--aa-muted)}.hover\\:bg-secondary\\/80:hover{background-color:var(--aa-secondary)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-secondary\\/80:hover{background-color:color-mix(in oklab, var(--aa-secondary) 80%, transparent)}}.hover\\:text-foreground:hover{color:var(--aa-foreground)}.hover\\:underline:hover{text-decoration-line:underline}}.focus-visible\\:border-destructive\\/40:focus-visible{border-color:var(--aa-destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\\:border-destructive\\/40:focus-visible{border-color:color-mix(in oklab, var(--aa-destructive) 40%, transparent)}}.focus-visible\\:border-ring:focus-visible{border-color:var(--aa-ring)}.focus-visible\\:ring-3:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:var(--aa-destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--aa-destructive) 20%, transparent)}}.focus-visible\\:ring-ring\\/50:focus-visible{--tw-ring-color:var(--aa-ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\\:ring-ring\\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--aa-ring) 50%, transparent)}}.disabled\\:pointer-events-none:disabled{pointer-events:none}.disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:bg-input\\/50:disabled{background-color:var(--aa-input)}@supports (color:color-mix(in lab, red, red)){.disabled\\:bg-input\\/50:disabled{background-color:color-mix(in oklab, var(--aa-input) 50%, transparent)}}.disabled\\:opacity-50:disabled{opacity:.5}:where([data-slot=button-group]) .in-data-\\[slot\\=button-group\\]\\:rounded-lg{border-radius:var(--aa-radius)}.has-data-\\[icon\\=inline-end\\]\\:pr-1\\.5:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 1.5)}.has-data-\\[icon\\=inline-end\\]\\:pr-2:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 2)}.has-data-\\[icon\\=inline-end\\]\\:pr-3:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 3)}.has-data-\\[icon\\=inline-start\\]\\:pl-1\\.5:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 1.5)}.has-data-\\[icon\\=inline-start\\]\\:pl-2:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 2)}.has-data-\\[icon\\=inline-start\\]\\:pl-3:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 3)}.has-data-\\[slot\\=card-action\\]\\:grid-cols-\\[1fr_auto\\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.has-data-\\[slot\\=card-description\\]\\:grid-rows-\\[auto_auto\\]:has([data-slot=card-description]){grid-template-rows:auto auto}.has-data-\\[slot\\=card-footer\\]\\:pb-0:has([data-slot=card-footer]){padding-bottom:calc(var(--spacing) * 0)}.has-\\[\\>img\\:first-child\\]\\:pt-0:has(>img:first-child){padding-top:calc(var(--spacing) * 0)}.aria-expanded\\:bg-muted[aria-expanded=true]{background-color:var(--aa-muted)}.aria-expanded\\:bg-secondary[aria-expanded=true]{background-color:var(--aa-secondary)}.aria-expanded\\:text-foreground[aria-expanded=true]{color:var(--aa-foreground)}.aria-expanded\\:text-secondary-foreground[aria-expanded=true]{color:var(--aa-secondary-foreground)}.aria-invalid\\:border-destructive[aria-invalid=true]{border-color:var(--aa-destructive)}.aria-invalid\\:ring-3[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.aria-invalid\\:ring-destructive\\/20[aria-invalid=true]{--tw-ring-color:var(--aa-destructive)}@supports (color:color-mix(in lab, red, red)){.aria-invalid\\:ring-destructive\\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--aa-destructive) 20%, transparent)}}.data-horizontal\\:h-px[data-horizontal]{height:1px}.data-horizontal\\:w-full[data-horizontal]{width:100%}.data-vertical\\:w-px[data-vertical]{width:1px}.data-vertical\\:self-stretch[data-vertical]{align-self:stretch}.data-\\[size\\=sm\\]\\:gap-3[data-size=sm]{gap:calc(var(--spacing) * 3)}.data-\\[size\\=sm\\]\\:py-3[data-size=sm]{padding-block:calc(var(--spacing) * 3)}.data-\\[size\\=sm\\]\\:has-data-\\[slot\\=card-footer\\]\\:pb-0[data-size=sm]:has([data-slot=card-footer]){padding-bottom:calc(var(--spacing) * 0)}@media (min-width:48rem){.md\\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.dark\\:border-input:is(.dark *){border-color:var(--aa-input)}.dark\\:bg-destructive\\/20:is(.dark *){background-color:var(--aa-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\\:bg-destructive\\/20:is(.dark *){background-color:color-mix(in oklab, var(--aa-destructive) 20%, transparent)}}.dark\\:bg-input\\/30:is(.dark *){background-color:var(--aa-input)}@supports (color:color-mix(in lab, red, red)){.dark\\:bg-input\\/30:is(.dark *){background-color:color-mix(in oklab, var(--aa-input) 30%, transparent)}}@media (hover:hover){.dark\\:hover\\:bg-destructive\\/30:is(.dark *):hover{background-color:var(--aa-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\\:hover\\:bg-destructive\\/30:is(.dark *):hover{background-color:color-mix(in oklab, var(--aa-destructive) 30%, transparent)}}.dark\\:hover\\:bg-input\\/50:is(.dark *):hover{background-color:var(--aa-input)}@supports (color:color-mix(in lab, red, red)){.dark\\:hover\\:bg-input\\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--aa-input) 50%, transparent)}}.dark\\:hover\\:bg-muted\\/50:is(.dark *):hover{background-color:var(--aa-muted)}@supports (color:color-mix(in lab, red, red)){.dark\\:hover\\:bg-muted\\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--aa-muted) 50%, transparent)}}}.dark\\:focus-visible\\:ring-destructive\\/40:is(.dark *):focus-visible{--tw-ring-color:var(--aa-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\\:focus-visible\\:ring-destructive\\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--aa-destructive) 40%, transparent)}}.dark\\:disabled\\:bg-input\\/80:is(.dark *):disabled{background-color:var(--aa-input)}@supports (color:color-mix(in lab, red, red)){.dark\\:disabled\\:bg-input\\/80:is(.dark *):disabled{background-color:color-mix(in oklab, var(--aa-input) 80%, transparent)}}.dark\\:aria-invalid\\:border-destructive\\/50:is(.dark *)[aria-invalid=true]{border-color:var(--aa-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\\:aria-invalid\\:border-destructive\\/50:is(.dark *)[aria-invalid=true]{border-color:color-mix(in oklab, var(--aa-destructive) 50%, transparent)}}.dark\\:aria-invalid\\:ring-destructive\\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--aa-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\\:aria-invalid\\:ring-destructive\\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--aa-destructive) 40%, transparent)}}.\\[\\&_a\\]\\:underline a{text-decoration-line:underline}.\\[\\&_a\\]\\:underline-offset-4 a{text-underline-offset:4px}@media (hover:hover){.\\[\\&_a\\]\\:hover\\:text-primary a:hover{color:var(--aa-primary)}}.\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-3\\.5 svg:not([class*=size-]){width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\\[\\.border-b\\]\\:pb-4.border-b{padding-bottom:calc(var(--spacing) * 4)}.group-data-\\[size\\=sm\\]\\/card\\:\\[\\.border-b\\]\\:pb-3:is(:where(.group\\/card)[data-size=sm] *).border-b{padding-bottom:calc(var(--spacing) * 3)}@media (hover:hover){.\\[a\\]\\:hover\\:bg-primary\\/80:is(a):hover{background-color:var(--aa-primary)}@supports (color:color-mix(in lab, red, red)){.\\[a\\]\\:hover\\:bg-primary\\/80:is(a):hover{background-color:color-mix(in oklab, var(--aa-primary) 80%, transparent)}}}:is(.\\*\\:\\[img\\:first-child\\]\\:rounded-t-xl>*):is(img:first-child){border-top-left-radius:calc(var(--aa-radius) + 4px);border-top-right-radius:calc(var(--aa-radius) + 4px)}:is(.\\*\\:\\[img\\:last-child\\]\\:rounded-b-xl>*):is(img:last-child){border-bottom-right-radius:calc(var(--aa-radius) + 4px);border-bottom-left-radius:calc(var(--aa-radius) + 4px)}[data-azirid]{--aa-radius:.625rem;--aa-background:oklch(100% 0 0);--aa-foreground:oklch(14.5% 0 0);--aa-card:oklch(100% 0 0);--aa-card-foreground:oklch(14.5% 0 0);--aa-popover:oklch(100% 0 0);--aa-popover-foreground:oklch(14.5% 0 0);--aa-primary:oklch(20.5% 0 0);--aa-primary-foreground:oklch(98.5% 0 0);--aa-secondary:oklch(97% 0 0);--aa-secondary-foreground:oklch(20.5% 0 0);--aa-muted:oklch(97% 0 0);--aa-muted-foreground:oklch(55.6% 0 0);--aa-accent:oklch(97% 0 0);--aa-accent-foreground:oklch(20.5% 0 0);--aa-destructive:oklch(57.7% .245 27.325);--aa-border:oklch(92.2% 0 0);--aa-input:oklch(92.2% 0 0);--aa-ring:oklch(70.8% 0 0);--aa-font-sans:ui-sans-serif, system-ui, sans-serif}@layer base{[data-azirid]{font-family:var(--aa-font-sans);color:var(--aa-foreground);background-color:var(--aa-background);-webkit-text-size-adjust:100%;tab-size:4;-webkit-font-smoothing:antialiased;line-height:1.5}[data-azirid] *,[data-azirid] :before,[data-azirid] :after{box-sizing:border-box;border:0 solid;border-color:var(--aa-border);margin:0;padding:0}[data-azirid] hr{height:0;color:inherit;border-top-width:1px}[data-azirid] h1,[data-azirid] h2,[data-azirid] h3,[data-azirid] h4,[data-azirid] h5,[data-azirid] h6{font-size:inherit;font-weight:inherit}[data-azirid] a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}[data-azirid] b,[data-azirid] strong{font-weight:bolder}[data-azirid] code,[data-azirid] kbd,[data-azirid] samp,[data-azirid] pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}[data-azirid] small{font-size:80%}[data-azirid] table{text-indent:0;border-color:inherit;border-collapse:collapse}[data-azirid] button,[data-azirid] input,[data-azirid] optgroup,[data-azirid] select,[data-azirid] textarea{font-feature-settings:inherit;font-variation-settings:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}[data-azirid] button,[data-azirid] select{text-transform:none}[data-azirid] button,[data-azirid] input[type=button],[data-azirid] input[type=reset],[data-azirid] input[type=submit]{-webkit-appearance:button;background-color:#0000;background-image:none}[data-azirid] :-moz-focusring{outline:auto}[data-azirid] ::-moz-focus-inner{border-style:none;padding:0}[data-azirid] :-moz-ui-invalid{box-shadow:none}[data-azirid] progress{vertical-align:baseline}[data-azirid] ::-webkit-inner-spin-button{height:auto}[data-azirid] ::-webkit-outer-spin-button{height:auto}[data-azirid] [type=search]{-webkit-appearance:textfield;outline-offset:-2px}[data-azirid] ::-webkit-search-decoration{-webkit-appearance:none}[data-azirid] ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}[data-azirid] summary{display:list-item}[data-azirid] ol,[data-azirid] ul,[data-azirid] menu{margin:0;padding:0;list-style:none}[data-azirid] textarea{resize:vertical}[data-azirid] ::placeholder{opacity:1;color:currentColor}@supports (color:color-mix(in lab, red, red)){[data-azirid] ::placeholder{color:color-mix(in oklch, currentColor 50%, transparent)}}[data-azirid] img,[data-azirid] svg,[data-azirid] video,[data-azirid] canvas,[data-azirid] audio,[data-azirid] iframe,[data-azirid] embed,[data-azirid] object{vertical-align:middle;display:block}[data-azirid] img,[data-azirid] video{max-width:100%;height:auto}[data-azirid] [hidden]:not([hidden=until-found]){display:none}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}`;
537
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){[data-azirid] *,[data-azirid] :before,[data-azirid] :after,[data-azirid] ::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-content:""}}[data-azirid]{--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-green-50:oklch(98.2% .018 155.826);--color-green-200:oklch(92.5% .084 155.995);--color-green-800:oklch(44.8% .119 151.328);--color-green-950:oklch(26.6% .065 152.934);--color-blue-500:oklch(62.3% .214 259.815);--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-medium:500;--leading-snug:1.375;--radius-md:calc(var(--aa-radius) - 2px);--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--aa-font-sans,ui-sans-serif, system-ui, sans-serif);--default-mono-font-family:var(--font-mono)}.\\@container\\/card-header{container:card-header/inline-size}.collapse{visibility:collapse}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.start{inset-inline-start:var(--spacing)}.z-10{z-index:10}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mr-2{margin-right:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.h-4{height:calc(var(--spacing) * 4)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.w-4{width:calc(var(--spacing) * 4)}.w-auto{width:auto}.w-full{width:100%}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:calc(var(--spacing) * 0)}.shrink-0{flex-shrink:0}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.auto-rows-min{grid-auto-rows:min-content}.flex-col{flex-direction:column}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.self-center{align-self:center}.self-start{align-self:flex-start}.justify-self-end{justify-self:flex-end}.overflow-hidden{overflow:hidden}.rounded-\\[min\\(var\\(--radius-md\\)\\,10px\\)\\]{border-radius:min(var(--radius-md), 10px)}.rounded-\\[min\\(var\\(--radius-md\\)\\,12px\\)\\]{border-radius:min(var(--radius-md), 12px)}.rounded-lg{border-radius:var(--aa-radius)}.rounded-md{border-radius:calc(var(--aa-radius) - 2px)}.rounded-xl{border-radius:calc(var(--aa-radius) + 4px)}.rounded-t-xl{border-top-left-radius:calc(var(--aa-radius) + 4px);border-top-right-radius:calc(var(--aa-radius) + 4px)}.rounded-b-xl{border-bottom-right-radius:calc(var(--aa-radius) + 4px);border-bottom-left-radius:calc(var(--aa-radius) + 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-border{border-color:var(--aa-border)}.border-destructive,.border-destructive\\/50{border-color:var(--aa-destructive)}@supports (color:color-mix(in lab, red, red)){.border-destructive\\/50{border-color:color-mix(in oklab, var(--aa-destructive) 50%, transparent)}}.border-green-200{border-color:var(--color-green-200)}.border-input{border-color:var(--aa-input)}.border-transparent{border-color:#0000}.bg-background{background-color:var(--aa-background)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-border{background-color:var(--aa-border)}.bg-card{background-color:var(--aa-card)}.bg-destructive,.bg-destructive\\/10{background-color:var(--aa-destructive)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\\/10{background-color:color-mix(in oklab, var(--aa-destructive) 10%, transparent)}}.bg-green-50{background-color:var(--color-green-50)}.bg-muted,.bg-muted\\/50{background-color:var(--aa-muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\\/50{background-color:color-mix(in oklab, var(--aa-muted) 50%, transparent)}}.bg-primary{background-color:var(--aa-primary)}.bg-secondary{background-color:var(--aa-secondary)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-clip-padding{background-clip:padding-box}.p-4{padding:calc(var(--spacing) * 4)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\[0\\.8rem\\]{font-size:.8rem}.leading-none{--tw-leading:1;line-height:1}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.whitespace-nowrap{white-space:nowrap}.text-card-foreground{color:var(--aa-card-foreground)}.text-destructive{color:var(--aa-destructive)}.text-green-800{color:var(--color-green-800)}.text-muted-foreground{color:var(--aa-muted-foreground)}.text-primary{color:var(--aa-primary)}.text-primary-foreground{color:var(--aa-primary-foreground)}.text-secondary-foreground{color:var(--aa-secondary-foreground)}.uppercase{text-transform:uppercase}.underline-offset-4{text-underline-offset:4px}.opacity-25{opacity:.25}.opacity-75{opacity:.75}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-foreground,.ring-foreground\\/10{--tw-ring-color:var(--aa-foreground)}@supports (color:color-mix(in lab, red, red)){.ring-foreground\\/10{--tw-ring-color:color-mix(in oklab, var(--aa-foreground) 10%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.group-data-\\[disabled\\=true\\]\\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.group-data-\\[disabled\\=true\\]\\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5}.group-data-\\[size\\=sm\\]\\/card\\:p-3:is(:where(.group\\/card)[data-size=sm] *){padding:calc(var(--spacing) * 3)}.group-data-\\[size\\=sm\\]\\/card\\:px-3:is(:where(.group\\/card)[data-size=sm] *){padding-inline:calc(var(--spacing) * 3)}.group-data-\\[size\\=sm\\]\\/card\\:text-sm:is(:where(.group\\/card)[data-size=sm] *){font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.peer-disabled\\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.file\\:inline-flex::file-selector-button{display:inline-flex}.file\\:h-6::file-selector-button{height:calc(var(--spacing) * 6)}.file\\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\\:bg-transparent::file-selector-button{background-color:#0000}.file\\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\\:text-foreground::file-selector-button{color:var(--aa-foreground)}.placeholder\\:text-muted-foreground::placeholder{color:var(--aa-muted-foreground)}.after\\:absolute:after{content:var(--tw-content);position:absolute}.after\\:inset-0:after{content:var(--tw-content);inset:calc(var(--spacing) * 0)}.after\\:top-1\\/2:after{content:var(--tw-content);top:50%}.after\\:z-0:after{content:var(--tw-content);z-index:0}.after\\:flex:after{content:var(--tw-content);display:flex}.after\\:items-center:after{content:var(--tw-content);align-items:center}.after\\:border-t:after{content:var(--tw-content);border-top-style:var(--tw-border-style);border-top-width:1px}.after\\:border-border:after{content:var(--tw-content);border-color:var(--aa-border)}@media (hover:hover){.hover\\:bg-destructive\\/20:hover{background-color:var(--aa-destructive)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-destructive\\/20:hover{background-color:color-mix(in oklab, var(--aa-destructive) 20%, transparent)}}.hover\\:bg-muted:hover{background-color:var(--aa-muted)}.hover\\:bg-secondary\\/80:hover{background-color:var(--aa-secondary)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-secondary\\/80:hover{background-color:color-mix(in oklab, var(--aa-secondary) 80%, transparent)}}.hover\\:text-foreground:hover{color:var(--aa-foreground)}.hover\\:underline:hover{text-decoration-line:underline}}.focus-visible\\:border-destructive\\/40:focus-visible{border-color:var(--aa-destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\\:border-destructive\\/40:focus-visible{border-color:color-mix(in oklab, var(--aa-destructive) 40%, transparent)}}.focus-visible\\:border-ring:focus-visible{border-color:var(--aa-ring)}.focus-visible\\:ring-3:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:var(--aa-destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--aa-destructive) 20%, transparent)}}.focus-visible\\:ring-ring\\/50:focus-visible{--tw-ring-color:var(--aa-ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\\:ring-ring\\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--aa-ring) 50%, transparent)}}.disabled\\:pointer-events-none:disabled{pointer-events:none}.disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:bg-input\\/50:disabled{background-color:var(--aa-input)}@supports (color:color-mix(in lab, red, red)){.disabled\\:bg-input\\/50:disabled{background-color:color-mix(in oklab, var(--aa-input) 50%, transparent)}}.disabled\\:opacity-50:disabled{opacity:.5}:where([data-slot=button-group]) .in-data-\\[slot\\=button-group\\]\\:rounded-lg{border-radius:var(--aa-radius)}.has-data-\\[icon\\=inline-end\\]\\:pr-1\\.5:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 1.5)}.has-data-\\[icon\\=inline-end\\]\\:pr-2:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 2)}.has-data-\\[icon\\=inline-end\\]\\:pr-3:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 3)}.has-data-\\[icon\\=inline-start\\]\\:pl-1\\.5:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 1.5)}.has-data-\\[icon\\=inline-start\\]\\:pl-2:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 2)}.has-data-\\[icon\\=inline-start\\]\\:pl-3:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 3)}.has-data-\\[slot\\=card-action\\]\\:grid-cols-\\[1fr_auto\\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.has-data-\\[slot\\=card-description\\]\\:grid-rows-\\[auto_auto\\]:has([data-slot=card-description]){grid-template-rows:auto auto}.has-data-\\[slot\\=card-footer\\]\\:pb-0:has([data-slot=card-footer]){padding-bottom:calc(var(--spacing) * 0)}.has-\\[\\>img\\:first-child\\]\\:pt-0:has(>img:first-child){padding-top:calc(var(--spacing) * 0)}.aria-expanded\\:bg-muted[aria-expanded=true]{background-color:var(--aa-muted)}.aria-expanded\\:bg-secondary[aria-expanded=true]{background-color:var(--aa-secondary)}.aria-expanded\\:text-foreground[aria-expanded=true]{color:var(--aa-foreground)}.aria-expanded\\:text-secondary-foreground[aria-expanded=true]{color:var(--aa-secondary-foreground)}.aria-invalid\\:border-destructive[aria-invalid=true]{border-color:var(--aa-destructive)}.aria-invalid\\:ring-3[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.aria-invalid\\:ring-destructive\\/20[aria-invalid=true]{--tw-ring-color:var(--aa-destructive)}@supports (color:color-mix(in lab, red, red)){.aria-invalid\\:ring-destructive\\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--aa-destructive) 20%, transparent)}}.data-horizontal\\:h-px[data-horizontal]{height:1px}.data-horizontal\\:w-full[data-horizontal]{width:100%}.data-vertical\\:w-px[data-vertical]{width:1px}.data-vertical\\:self-stretch[data-vertical]{align-self:stretch}.data-\\[size\\=sm\\]\\:gap-3[data-size=sm]{gap:calc(var(--spacing) * 3)}.data-\\[size\\=sm\\]\\:py-3[data-size=sm]{padding-block:calc(var(--spacing) * 3)}.data-\\[size\\=sm\\]\\:has-data-\\[slot\\=card-footer\\]\\:pb-0[data-size=sm]:has([data-slot=card-footer]){padding-bottom:calc(var(--spacing) * 0)}@media (min-width:48rem){.md\\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.dark\\:border-green-800:is(.dark *){border-color:var(--color-green-800)}.dark\\:border-input:is(.dark *){border-color:var(--aa-input)}.dark\\:bg-destructive\\/20:is(.dark *){background-color:var(--aa-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\\:bg-destructive\\/20:is(.dark *){background-color:color-mix(in oklab, var(--aa-destructive) 20%, transparent)}}.dark\\:bg-green-950:is(.dark *){background-color:var(--color-green-950)}.dark\\:bg-input\\/30:is(.dark *){background-color:var(--aa-input)}@supports (color:color-mix(in lab, red, red)){.dark\\:bg-input\\/30:is(.dark *){background-color:color-mix(in oklab, var(--aa-input) 30%, transparent)}}.dark\\:text-green-200:is(.dark *){color:var(--color-green-200)}@media (hover:hover){.dark\\:hover\\:bg-destructive\\/30:is(.dark *):hover{background-color:var(--aa-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\\:hover\\:bg-destructive\\/30:is(.dark *):hover{background-color:color-mix(in oklab, var(--aa-destructive) 30%, transparent)}}.dark\\:hover\\:bg-input\\/50:is(.dark *):hover{background-color:var(--aa-input)}@supports (color:color-mix(in lab, red, red)){.dark\\:hover\\:bg-input\\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--aa-input) 50%, transparent)}}.dark\\:hover\\:bg-muted\\/50:is(.dark *):hover{background-color:var(--aa-muted)}@supports (color:color-mix(in lab, red, red)){.dark\\:hover\\:bg-muted\\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--aa-muted) 50%, transparent)}}}.dark\\:focus-visible\\:ring-destructive\\/40:is(.dark *):focus-visible{--tw-ring-color:var(--aa-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\\:focus-visible\\:ring-destructive\\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--aa-destructive) 40%, transparent)}}.dark\\:disabled\\:bg-input\\/80:is(.dark *):disabled{background-color:var(--aa-input)}@supports (color:color-mix(in lab, red, red)){.dark\\:disabled\\:bg-input\\/80:is(.dark *):disabled{background-color:color-mix(in oklab, var(--aa-input) 80%, transparent)}}.dark\\:aria-invalid\\:border-destructive\\/50:is(.dark *)[aria-invalid=true]{border-color:var(--aa-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\\:aria-invalid\\:border-destructive\\/50:is(.dark *)[aria-invalid=true]{border-color:color-mix(in oklab, var(--aa-destructive) 50%, transparent)}}.dark\\:aria-invalid\\:ring-destructive\\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--aa-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\\:aria-invalid\\:ring-destructive\\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--aa-destructive) 40%, transparent)}}.\\[\\&_a\\]\\:underline a{text-decoration-line:underline}.\\[\\&_a\\]\\:underline-offset-4 a{text-underline-offset:4px}@media (hover:hover){.\\[\\&_a\\]\\:hover\\:text-primary a:hover{color:var(--aa-primary)}}.\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-3\\.5 svg:not([class*=size-]){width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\\[\\.border-b\\]\\:pb-4.border-b{padding-bottom:calc(var(--spacing) * 4)}.group-data-\\[size\\=sm\\]\\/card\\:\\[\\.border-b\\]\\:pb-3:is(:where(.group\\/card)[data-size=sm] *).border-b{padding-bottom:calc(var(--spacing) * 3)}@media (hover:hover){.\\[a\\]\\:hover\\:bg-primary\\/80:is(a):hover{background-color:var(--aa-primary)}@supports (color:color-mix(in lab, red, red)){.\\[a\\]\\:hover\\:bg-primary\\/80:is(a):hover{background-color:color-mix(in oklab, var(--aa-primary) 80%, transparent)}}}:is(.\\*\\:\\[img\\:first-child\\]\\:rounded-t-xl>*):is(img:first-child){border-top-left-radius:calc(var(--aa-radius) + 4px);border-top-right-radius:calc(var(--aa-radius) + 4px)}:is(.\\*\\:\\[img\\:last-child\\]\\:rounded-b-xl>*):is(img:last-child){border-bottom-right-radius:calc(var(--aa-radius) + 4px);border-bottom-left-radius:calc(var(--aa-radius) + 4px)}[data-azirid]{--aa-radius:.625rem;--aa-background:oklch(100% 0 0);--aa-foreground:oklch(14.5% 0 0);--aa-card:oklch(100% 0 0);--aa-card-foreground:oklch(14.5% 0 0);--aa-popover:oklch(100% 0 0);--aa-popover-foreground:oklch(14.5% 0 0);--aa-primary:oklch(20.5% 0 0);--aa-primary-foreground:oklch(98.5% 0 0);--aa-secondary:oklch(97% 0 0);--aa-secondary-foreground:oklch(20.5% 0 0);--aa-muted:oklch(97% 0 0);--aa-muted-foreground:oklch(55.6% 0 0);--aa-accent:oklch(97% 0 0);--aa-accent-foreground:oklch(20.5% 0 0);--aa-destructive:oklch(57.7% .245 27.325);--aa-border:oklch(92.2% 0 0);--aa-input:oklch(92.2% 0 0);--aa-ring:oklch(70.8% 0 0);--aa-font-sans:ui-sans-serif, system-ui, sans-serif}@layer base{[data-azirid]{font-family:var(--aa-font-sans);color:var(--aa-foreground);background-color:var(--aa-background);-webkit-text-size-adjust:100%;tab-size:4;-webkit-font-smoothing:antialiased;line-height:1.5}[data-azirid] *,[data-azirid] :before,[data-azirid] :after{box-sizing:border-box;border:0 solid;border-color:var(--aa-border);margin:0;padding:0}[data-azirid] hr{height:0;color:inherit;border-top-width:1px}[data-azirid] h1,[data-azirid] h2,[data-azirid] h3,[data-azirid] h4,[data-azirid] h5,[data-azirid] h6{font-size:inherit;font-weight:inherit}[data-azirid] a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}[data-azirid] b,[data-azirid] strong{font-weight:bolder}[data-azirid] code,[data-azirid] kbd,[data-azirid] samp,[data-azirid] pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}[data-azirid] small{font-size:80%}[data-azirid] table{text-indent:0;border-color:inherit;border-collapse:collapse}[data-azirid] button,[data-azirid] input,[data-azirid] optgroup,[data-azirid] select,[data-azirid] textarea{font-feature-settings:inherit;font-variation-settings:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}[data-azirid] button,[data-azirid] select{text-transform:none}[data-azirid] button,[data-azirid] input[type=button],[data-azirid] input[type=reset],[data-azirid] input[type=submit]{-webkit-appearance:button;background-color:#0000;background-image:none}[data-azirid] :-moz-focusring{outline:auto}[data-azirid] ::-moz-focus-inner{border-style:none;padding:0}[data-azirid] :-moz-ui-invalid{box-shadow:none}[data-azirid] progress{vertical-align:baseline}[data-azirid] ::-webkit-inner-spin-button{height:auto}[data-azirid] ::-webkit-outer-spin-button{height:auto}[data-azirid] [type=search]{-webkit-appearance:textfield;outline-offset:-2px}[data-azirid] ::-webkit-search-decoration{-webkit-appearance:none}[data-azirid] ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}[data-azirid] summary{display:list-item}[data-azirid] ol,[data-azirid] ul,[data-azirid] menu{margin:0;padding:0;list-style:none}[data-azirid] textarea{resize:vertical}[data-azirid] ::placeholder{opacity:1;color:currentColor}@supports (color:color-mix(in lab, red, red)){[data-azirid] ::placeholder{color:color-mix(in oklch, currentColor 50%, transparent)}}[data-azirid] img,[data-azirid] svg,[data-azirid] video,[data-azirid] canvas,[data-azirid] audio,[data-azirid] iframe,[data-azirid] embed,[data-azirid] object{vertical-align:middle;display:block}[data-azirid] img,[data-azirid] video{max-width:100%;height:auto}[data-azirid] [hidden]:not([hidden=until-found]){display:none}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}`;
493
538
 
494
539
  // src/utils/inject-styles.ts
495
540
  var STYLE_ID = "azirid-access-styles";
@@ -511,6 +556,86 @@ function removeStyles() {
511
556
  document.getElementById(STYLE_ID)?.remove();
512
557
  injected = false;
513
558
  }
559
+ function useAuthMutations(deps) {
560
+ const {
561
+ client,
562
+ props,
563
+ setUser,
564
+ setError,
565
+ updateAccessToken,
566
+ saveSessionTokens,
567
+ normalizeToken,
568
+ withAppContext,
569
+ clearSession
570
+ } = deps;
571
+ const queryClient = useQueryClient();
572
+ const loginMutation = useMutation({
573
+ mutationFn: (data) => client.post(client.paths.login, withAppContext(data)),
574
+ onSuccess: (data) => {
575
+ setUser(data.user);
576
+ updateAccessToken(normalizeToken(data));
577
+ saveSessionTokens(data);
578
+ setError(null);
579
+ props.onLoginSuccess?.(data);
580
+ },
581
+ onError: (err) => {
582
+ setError(err.message);
583
+ props.onError?.(err.message);
584
+ }
585
+ });
586
+ const signupMutation = useMutation({
587
+ mutationFn: (data) => {
588
+ const { confirmPassword: _, ...payload } = data;
589
+ return client.post(client.paths.signup, withAppContext({ ...payload }));
590
+ },
591
+ onSuccess: (data) => {
592
+ setUser(data.user);
593
+ updateAccessToken(normalizeToken(data));
594
+ saveSessionTokens(data);
595
+ setError(null);
596
+ props.onSignupSuccess?.(data);
597
+ },
598
+ onError: (err) => {
599
+ setError(err.message);
600
+ props.onError?.(err.message);
601
+ }
602
+ });
603
+ const logoutMutation = useMutation({
604
+ mutationFn: () => client.post(client.paths.logout),
605
+ onSettled: () => {
606
+ clearSession();
607
+ setError(null);
608
+ queryClient.clear();
609
+ props.onLogoutSuccess?.();
610
+ }
611
+ });
612
+ const refreshFn = useCallback(async () => {
613
+ try {
614
+ await client.refreshSession();
615
+ updateAccessToken(client.getAccessToken());
616
+ } catch (err) {
617
+ clearSession();
618
+ queryClient.clear();
619
+ props.onSessionExpired?.();
620
+ throw err;
621
+ }
622
+ }, [client, queryClient, props, updateAccessToken, clearSession]);
623
+ const switchTenantFn = useCallback(
624
+ async (tenantId) => {
625
+ await client.refreshSession({ tenantId });
626
+ updateAccessToken(client.getAccessToken());
627
+ await queryClient.invalidateQueries({ queryKey: ["azirid-access"] });
628
+ },
629
+ [client, queryClient, updateAccessToken]
630
+ );
631
+ return {
632
+ loginMutation,
633
+ signupMutation,
634
+ logoutMutation,
635
+ refreshFn,
636
+ switchTenantFn
637
+ };
638
+ }
514
639
  var AziridContext = createContext(null);
515
640
  AziridContext.displayName = "AziridContext";
516
641
  var ClientContext = createContext(null);
@@ -543,7 +668,6 @@ function AziridProviderInner({
543
668
  client,
544
669
  props
545
670
  }) {
546
- const queryClient = useQueryClient();
547
671
  const [user, setUser] = useState(null);
548
672
  const [accessToken, setAccessToken] = useState(null);
549
673
  const [error, setError] = useState(null);
@@ -681,65 +805,23 @@ function AziridProviderInner({
681
805
  (data) => data.at ?? data.accessToken,
682
806
  []
683
807
  );
684
- const loginMutation = useMutation({
685
- mutationFn: (data) => client.post(client.paths.login, withAppContext(data)),
686
- onSuccess: (data) => {
687
- setUser(data.user);
688
- updateAccessToken(normalizeToken(data));
689
- saveSessionTokens(data);
690
- setError(null);
691
- props.onLoginSuccess?.(data);
692
- },
693
- onError: (err) => {
694
- setError(err.message);
695
- props.onError?.(err.message);
696
- }
697
- });
698
- const signupMutation = useMutation({
699
- mutationFn: (data) => {
700
- const { confirmPassword: _, ...payload } = data;
701
- return client.post(client.paths.signup, withAppContext({ ...payload }));
702
- },
703
- onSuccess: (data) => {
704
- setUser(data.user);
705
- updateAccessToken(normalizeToken(data));
706
- saveSessionTokens(data);
707
- setError(null);
708
- props.onSignupSuccess?.(data);
709
- },
710
- onError: (err) => {
711
- setError(err.message);
712
- props.onError?.(err.message);
713
- }
714
- });
715
- const logoutMutation = useMutation({
716
- mutationFn: () => client.post(client.paths.logout),
717
- onSettled: () => {
718
- clearSession();
719
- setError(null);
720
- queryClient.clear();
721
- props.onLogoutSuccess?.();
722
- }
808
+ const {
809
+ loginMutation,
810
+ signupMutation,
811
+ logoutMutation,
812
+ refreshFn,
813
+ switchTenantFn
814
+ } = useAuthMutations({
815
+ client,
816
+ props,
817
+ setUser,
818
+ setError,
819
+ updateAccessToken,
820
+ saveSessionTokens,
821
+ normalizeToken,
822
+ withAppContext,
823
+ clearSession
723
824
  });
724
- const refreshFn = useCallback(async () => {
725
- try {
726
- await client.refreshSession();
727
- updateAccessToken(client.getAccessToken());
728
- } catch (err) {
729
- clearSession();
730
- queryClient.clear();
731
- props.onSessionExpired?.();
732
- throw err;
733
- }
734
- }, [client, queryClient, props, updateAccessToken, clearSession]);
735
- const switchTenantFn = useCallback(
736
- async (tenantId) => {
737
- await client.refreshSession({ tenantId });
738
- updateAccessToken(client.getAccessToken());
739
- await queryClient.invalidateQueries({ queryKey: ["azirid-access"] });
740
- },
741
- [client, queryClient, updateAccessToken]
742
- );
743
825
  const login = useCallback(
744
826
  (data) => loginMutation.mutate(data),
745
827
  [loginMutation]
@@ -1364,127 +1446,539 @@ var SignupForm = forwardRef(
1364
1446
  }
1365
1447
  );
1366
1448
  SignupForm.displayName = "SignupForm";
1367
- function useReferral() {
1449
+ function usePasswordReset(options) {
1368
1450
  const client = useAccessClient();
1369
- const query = useQuery({
1370
- queryKey: ["azirid-access", "referral", "me"],
1371
- queryFn: () => client.get(client.paths.referralMe),
1372
- enabled: !!client.getAccessToken()
1451
+ const request = useMutation({
1452
+ mutationKey: ["azirid-access", "password-reset", "request"],
1453
+ mutationFn: (data) => client.post(client.paths.passwordResetRequest, data),
1454
+ onSuccess: () => options?.onRequestSuccess?.(),
1455
+ onError: options?.onError
1373
1456
  });
1374
- const copyToClipboard = useCallback(async () => {
1375
- if (query.data?.referralUrl) {
1376
- await navigator.clipboard.writeText(query.data.referralUrl);
1377
- return true;
1378
- }
1379
- return false;
1380
- }, [query.data?.referralUrl]);
1381
- return useMemo(
1382
- () => ({ ...query, copyToClipboard }),
1383
- [query, copyToClipboard]
1384
- );
1457
+ const confirm = useMutation({
1458
+ mutationKey: ["azirid-access", "password-reset", "confirm"],
1459
+ mutationFn: (data) => client.post(client.paths.passwordResetConfirm, data),
1460
+ onSuccess: () => options?.onConfirmSuccess?.(),
1461
+ onError: options?.onError
1462
+ });
1463
+ return { request, confirm };
1385
1464
  }
1386
- var styles = {
1387
- card: {
1388
- border: "1px solid #e5e7eb",
1389
- borderRadius: "12px",
1390
- padding: "24px",
1391
- backgroundColor: "#ffffff",
1392
- fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif'
1393
- },
1394
- title: {
1395
- margin: "0 0 4px 0",
1396
- fontSize: "18px",
1397
- fontWeight: 600,
1398
- color: "#111827"
1399
- },
1400
- description: {
1401
- margin: "0 0 16px 0",
1402
- fontSize: "14px",
1403
- color: "#6b7280"
1404
- },
1405
- codeContainer: {
1406
- display: "flex",
1407
- alignItems: "center",
1408
- gap: "8px",
1409
- marginBottom: "16px"
1410
- },
1411
- codeInput: {
1412
- flex: 1,
1413
- padding: "10px 12px",
1414
- border: "1px solid #d1d5db",
1415
- borderRadius: "8px",
1416
- backgroundColor: "#f9fafb",
1417
- fontSize: "14px",
1418
- fontFamily: "monospace",
1419
- color: "#374151",
1420
- outline: "none"
1421
- },
1422
- copyButton: {
1423
- padding: "10px 16px",
1424
- border: "1px solid #d1d5db",
1425
- borderRadius: "8px",
1426
- backgroundColor: "#ffffff",
1427
- fontSize: "14px",
1428
- fontWeight: 500,
1429
- color: "#374151",
1430
- cursor: "pointer",
1431
- whiteSpace: "nowrap",
1432
- transition: "background-color 0.15s"
1433
- },
1434
- copyButtonCopied: {
1435
- backgroundColor: "#ecfdf5",
1436
- borderColor: "#a7f3d0",
1437
- color: "#065f46"
1438
- },
1439
- statsRow: {
1440
- display: "flex",
1441
- gap: "24px"
1442
- },
1443
- stat: {
1444
- display: "flex",
1445
- flexDirection: "column",
1446
- gap: "2px"
1447
- },
1448
- statValue: {
1449
- fontSize: "20px",
1450
- fontWeight: 600,
1451
- color: "#111827"
1452
- },
1453
- statLabel: {
1454
- fontSize: "12px",
1455
- color: "#6b7280"
1456
- },
1457
- skeleton: {
1458
- backgroundColor: "#f3f4f6",
1459
- borderRadius: "8px",
1460
- animation: "pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite"
1461
- },
1462
- emptyMessage: {
1463
- fontSize: "14px",
1464
- color: "#9ca3af",
1465
- textAlign: "center",
1466
- padding: "12px 0"
1467
- }
1468
- };
1469
- function ReferralCard({
1470
- className,
1471
- style,
1472
- title = "Refer a Friend",
1473
- description = "Share your referral link and earn rewards for every friend who signs up."
1474
- }) {
1475
- const { data, isLoading } = useReferral();
1476
- const [copied, setCopied] = useState(false);
1477
- const handleCopy = useCallback(async () => {
1478
- if (!data?.referralUrl) return;
1479
- try {
1480
- await navigator.clipboard.writeText(data.referralUrl);
1481
- setCopied(true);
1482
- setTimeout(() => setCopied(false), 2e3);
1483
- } catch {
1484
- }
1485
- }, [data?.referralUrl]);
1486
- if (isLoading) {
1487
- return /* @__PURE__ */ jsxs("div", { className, style: { ...styles.card, ...style }, children: [
1465
+ var ForgotPasswordForm = forwardRef(
1466
+ ({
1467
+ onSubmit: onSubmitProp,
1468
+ schema: schemaProp,
1469
+ isLoading: externalLoading,
1470
+ error: externalError,
1471
+ className,
1472
+ style,
1473
+ title: titleProp,
1474
+ description: descriptionProp,
1475
+ logo: logoProp,
1476
+ submitText: submitTextProp,
1477
+ footer,
1478
+ defaultValues
1479
+ }, ref) => {
1480
+ const msg = useMessages();
1481
+ const branding = useBranding();
1482
+ const [success, setSuccess] = useState(false);
1483
+ const [hookError, setHookError] = useState(null);
1484
+ const title = titleProp ?? msg.forgotPassword.title;
1485
+ const description = descriptionProp ?? msg.forgotPassword.description;
1486
+ const submitText = submitTextProp ?? msg.forgotPassword.submit;
1487
+ const logo = logoProp !== void 0 ? logoProp : branding?.logoUrl ? /* @__PURE__ */ jsx("img", { src: branding.logoUrl, alt: branding.displayName ?? "", className: "h-10 w-auto" }) : null;
1488
+ const schema = useMemo(
1489
+ () => schemaProp ?? createForgotPasswordSchema(msg.validation),
1490
+ [schemaProp, msg.validation]
1491
+ );
1492
+ let passwordReset = null;
1493
+ try {
1494
+ passwordReset = usePasswordReset({
1495
+ onRequestSuccess: () => setSuccess(true),
1496
+ onError: (err) => setHookError(err.message)
1497
+ });
1498
+ } catch {
1499
+ }
1500
+ const {
1501
+ register,
1502
+ handleSubmit,
1503
+ formState: { errors, isSubmitting }
1504
+ } = useForm({
1505
+ resolver: zodResolver(schema),
1506
+ defaultValues: { email: "", ...defaultValues }
1507
+ });
1508
+ const onSubmit = useCallback(
1509
+ async (values) => {
1510
+ setHookError(null);
1511
+ if (onSubmitProp) {
1512
+ await onSubmitProp(values);
1513
+ } else if (passwordReset) {
1514
+ passwordReset.request.mutate(values);
1515
+ }
1516
+ },
1517
+ [onSubmitProp, passwordReset]
1518
+ );
1519
+ const loading = externalLoading ?? passwordReset?.request.isPending ?? isSubmitting;
1520
+ const error = externalError ?? hookError;
1521
+ const wrapperStyle = useMemo(() => {
1522
+ if (!branding?.primaryColor) return style ?? {};
1523
+ return {
1524
+ ...style,
1525
+ "--aa-primary": branding.primaryColor,
1526
+ "--aa-primary-foreground": "#fff"
1527
+ };
1528
+ }, [style, branding?.primaryColor]);
1529
+ return /* @__PURE__ */ jsxs("div", { "data-azirid": true, className: cn("flex flex-col gap-6", className), style: wrapperStyle, children: [
1530
+ logo && /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2 self-center font-medium", children: logo }),
1531
+ /* @__PURE__ */ jsxs(Card, { children: [
1532
+ /* @__PURE__ */ jsxs(CardHeader, { className: "text-center", children: [
1533
+ title && /* @__PURE__ */ jsx(CardTitle, { className: "text-xl", children: title }),
1534
+ description && /* @__PURE__ */ jsx(CardDescription, { children: description })
1535
+ ] }),
1536
+ /* @__PURE__ */ jsx(CardContent, { children: success ? /* @__PURE__ */ jsx("div", { className: "rounded-md border border-green-200 bg-green-50 px-4 py-3 text-center text-sm text-green-800 dark:border-green-800 dark:bg-green-950 dark:text-green-200", children: msg.forgotPassword.successMessage }) : /* @__PURE__ */ jsx("form", { ref, onSubmit: handleSubmit(onSubmit), noValidate: true, children: /* @__PURE__ */ jsxs(FieldGroup, { children: [
1537
+ error && /* @__PURE__ */ jsx(
1538
+ "div",
1539
+ {
1540
+ role: "alert",
1541
+ className: "border-destructive/50 bg-destructive/10 text-destructive rounded-md border px-4 py-3 text-sm",
1542
+ children: error
1543
+ }
1544
+ ),
1545
+ /* @__PURE__ */ jsxs(Field, { children: [
1546
+ /* @__PURE__ */ jsx(FieldLabel, { htmlFor: "aa-forgot-email", children: msg.forgotPassword.emailLabel }),
1547
+ /* @__PURE__ */ jsx(
1548
+ Input,
1549
+ {
1550
+ id: "aa-forgot-email",
1551
+ type: "email",
1552
+ autoComplete: "email",
1553
+ placeholder: msg.forgotPassword.emailPlaceholder,
1554
+ disabled: loading,
1555
+ "aria-invalid": !!errors.email,
1556
+ "aria-describedby": errors.email ? "aa-forgot-email-err" : void 0,
1557
+ ...register("email")
1558
+ }
1559
+ ),
1560
+ errors.email && /* @__PURE__ */ jsx("p", { id: "aa-forgot-email-err", className: "text-destructive text-xs", children: errors.email.message })
1561
+ ] }),
1562
+ /* @__PURE__ */ jsxs(Field, { children: [
1563
+ /* @__PURE__ */ jsxs(Button, { type: "submit", disabled: loading, className: "w-full", children: [
1564
+ loading && /* @__PURE__ */ jsxs(
1565
+ "svg",
1566
+ {
1567
+ className: "mr-2 h-4 w-4 animate-spin",
1568
+ xmlns: "http://www.w3.org/2000/svg",
1569
+ fill: "none",
1570
+ viewBox: "0 0 24 24",
1571
+ "aria-hidden": "true",
1572
+ children: [
1573
+ /* @__PURE__ */ jsx(
1574
+ "circle",
1575
+ {
1576
+ className: "opacity-25",
1577
+ cx: "12",
1578
+ cy: "12",
1579
+ r: "10",
1580
+ stroke: "currentColor",
1581
+ strokeWidth: "4"
1582
+ }
1583
+ ),
1584
+ /* @__PURE__ */ jsx(
1585
+ "path",
1586
+ {
1587
+ className: "opacity-75",
1588
+ fill: "currentColor",
1589
+ d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"
1590
+ }
1591
+ )
1592
+ ]
1593
+ }
1594
+ ),
1595
+ submitText
1596
+ ] }),
1597
+ footer && /* @__PURE__ */ jsx(FieldDescription, { className: "text-center", children: footer })
1598
+ ] })
1599
+ ] }) }) })
1600
+ ] })
1601
+ ] });
1602
+ }
1603
+ );
1604
+ ForgotPasswordForm.displayName = "ForgotPasswordForm";
1605
+ var ResetPasswordForm = forwardRef(
1606
+ ({
1607
+ token,
1608
+ onSubmit: onSubmitProp,
1609
+ schema: schemaProp,
1610
+ isLoading: externalLoading,
1611
+ error: externalError,
1612
+ className,
1613
+ style,
1614
+ title: titleProp,
1615
+ description: descriptionProp,
1616
+ logo: logoProp,
1617
+ submitText: submitTextProp,
1618
+ footer,
1619
+ onSuccess
1620
+ }, ref) => {
1621
+ const msg = useMessages();
1622
+ const branding = useBranding();
1623
+ const [hookError, setHookError] = useState(null);
1624
+ const title = titleProp ?? msg.resetPassword.title;
1625
+ const description = descriptionProp ?? msg.resetPassword.description;
1626
+ const submitText = submitTextProp ?? msg.resetPassword.submit;
1627
+ const logo = logoProp !== void 0 ? logoProp : branding?.logoUrl ? /* @__PURE__ */ jsx("img", { src: branding.logoUrl, alt: branding.displayName ?? "", className: "h-10 w-auto" }) : null;
1628
+ const schema = useMemo(
1629
+ () => schemaProp ?? createResetPasswordConfirmSchema(msg.validation),
1630
+ [schemaProp, msg.validation]
1631
+ );
1632
+ let passwordReset = null;
1633
+ try {
1634
+ passwordReset = usePasswordReset({
1635
+ onConfirmSuccess: () => onSuccess?.(),
1636
+ onError: (err) => setHookError(err.message)
1637
+ });
1638
+ } catch {
1639
+ }
1640
+ const {
1641
+ register,
1642
+ handleSubmit,
1643
+ formState: { errors, isSubmitting }
1644
+ } = useForm({
1645
+ resolver: zodResolver(schema),
1646
+ defaultValues: { token, newPassword: "", confirmPassword: "" }
1647
+ });
1648
+ const onSubmit = useCallback(
1649
+ async (values) => {
1650
+ setHookError(null);
1651
+ if (onSubmitProp) {
1652
+ await onSubmitProp({ token: values.token, newPassword: values.newPassword });
1653
+ } else if (passwordReset) {
1654
+ passwordReset.confirm.mutate({
1655
+ token: values.token,
1656
+ newPassword: values.newPassword
1657
+ });
1658
+ }
1659
+ },
1660
+ [onSubmitProp, passwordReset]
1661
+ );
1662
+ const loading = externalLoading ?? passwordReset?.confirm.isPending ?? isSubmitting;
1663
+ const error = externalError ?? hookError;
1664
+ const wrapperStyle = useMemo(() => {
1665
+ if (!branding?.primaryColor) return style ?? {};
1666
+ return {
1667
+ ...style,
1668
+ "--aa-primary": branding.primaryColor,
1669
+ "--aa-primary-foreground": "#fff"
1670
+ };
1671
+ }, [style, branding?.primaryColor]);
1672
+ return /* @__PURE__ */ jsxs("div", { "data-azirid": true, className: cn("flex flex-col gap-6", className), style: wrapperStyle, children: [
1673
+ logo && /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2 self-center font-medium", children: logo }),
1674
+ /* @__PURE__ */ jsxs(Card, { children: [
1675
+ /* @__PURE__ */ jsxs(CardHeader, { className: "text-center", children: [
1676
+ title && /* @__PURE__ */ jsx(CardTitle, { className: "text-xl", children: title }),
1677
+ description && /* @__PURE__ */ jsx(CardDescription, { children: description })
1678
+ ] }),
1679
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsxs("form", { ref, onSubmit: handleSubmit(onSubmit), noValidate: true, children: [
1680
+ /* @__PURE__ */ jsx("input", { type: "hidden", ...register("token") }),
1681
+ /* @__PURE__ */ jsxs(FieldGroup, { children: [
1682
+ error && /* @__PURE__ */ jsx(
1683
+ "div",
1684
+ {
1685
+ role: "alert",
1686
+ className: "border-destructive/50 bg-destructive/10 text-destructive rounded-md border px-4 py-3 text-sm",
1687
+ children: error
1688
+ }
1689
+ ),
1690
+ /* @__PURE__ */ jsxs(Field, { children: [
1691
+ /* @__PURE__ */ jsx(FieldLabel, { htmlFor: "aa-reset-new-password", children: msg.resetPassword.newPasswordLabel }),
1692
+ /* @__PURE__ */ jsx(
1693
+ Input,
1694
+ {
1695
+ id: "aa-reset-new-password",
1696
+ type: "password",
1697
+ autoComplete: "new-password",
1698
+ placeholder: msg.resetPassword.newPasswordPlaceholder,
1699
+ disabled: loading,
1700
+ "aria-invalid": !!errors.newPassword,
1701
+ "aria-describedby": errors.newPassword ? "aa-reset-newpass-err" : void 0,
1702
+ ...register("newPassword")
1703
+ }
1704
+ ),
1705
+ errors.newPassword && /* @__PURE__ */ jsx("p", { id: "aa-reset-newpass-err", className: "text-destructive text-xs", children: errors.newPassword.message })
1706
+ ] }),
1707
+ /* @__PURE__ */ jsxs(Field, { children: [
1708
+ /* @__PURE__ */ jsx(FieldLabel, { htmlFor: "aa-reset-confirm-password", children: msg.resetPassword.confirmPasswordLabel }),
1709
+ /* @__PURE__ */ jsx(
1710
+ Input,
1711
+ {
1712
+ id: "aa-reset-confirm-password",
1713
+ type: "password",
1714
+ autoComplete: "new-password",
1715
+ placeholder: msg.resetPassword.confirmPasswordPlaceholder,
1716
+ disabled: loading,
1717
+ "aria-invalid": !!errors.confirmPassword,
1718
+ "aria-describedby": errors.confirmPassword ? "aa-reset-confirmpass-err" : void 0,
1719
+ ...register("confirmPassword")
1720
+ }
1721
+ ),
1722
+ errors.confirmPassword && /* @__PURE__ */ jsx("p", { id: "aa-reset-confirmpass-err", className: "text-destructive text-xs", children: errors.confirmPassword.message })
1723
+ ] }),
1724
+ /* @__PURE__ */ jsxs(Field, { children: [
1725
+ /* @__PURE__ */ jsxs(Button, { type: "submit", disabled: loading, className: "w-full", children: [
1726
+ loading && /* @__PURE__ */ jsxs(
1727
+ "svg",
1728
+ {
1729
+ className: "mr-2 h-4 w-4 animate-spin",
1730
+ xmlns: "http://www.w3.org/2000/svg",
1731
+ fill: "none",
1732
+ viewBox: "0 0 24 24",
1733
+ "aria-hidden": "true",
1734
+ children: [
1735
+ /* @__PURE__ */ jsx(
1736
+ "circle",
1737
+ {
1738
+ className: "opacity-25",
1739
+ cx: "12",
1740
+ cy: "12",
1741
+ r: "10",
1742
+ stroke: "currentColor",
1743
+ strokeWidth: "4"
1744
+ }
1745
+ ),
1746
+ /* @__PURE__ */ jsx(
1747
+ "path",
1748
+ {
1749
+ className: "opacity-75",
1750
+ fill: "currentColor",
1751
+ d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"
1752
+ }
1753
+ )
1754
+ ]
1755
+ }
1756
+ ),
1757
+ submitText
1758
+ ] }),
1759
+ footer && /* @__PURE__ */ jsx(FieldDescription, { className: "text-center", children: footer })
1760
+ ] })
1761
+ ] })
1762
+ ] }) })
1763
+ ] })
1764
+ ] });
1765
+ }
1766
+ );
1767
+ ResetPasswordForm.displayName = "ResetPasswordForm";
1768
+ function AuthForm({
1769
+ view: controlledView,
1770
+ onViewChange,
1771
+ defaultView = "login",
1772
+ className,
1773
+ style,
1774
+ logo,
1775
+ showSocialButtons,
1776
+ hideNavigation,
1777
+ resetToken,
1778
+ defaultValues,
1779
+ loginProps,
1780
+ signupProps,
1781
+ forgotPasswordProps,
1782
+ resetPasswordProps
1783
+ }) {
1784
+ const [internalView, setInternalView] = useState(defaultView);
1785
+ const msg = useMessages();
1786
+ const currentView = controlledView ?? internalView;
1787
+ const navigate = useCallback(
1788
+ (target) => {
1789
+ if (onViewChange) {
1790
+ onViewChange(target);
1791
+ } else {
1792
+ setInternalView(target);
1793
+ }
1794
+ },
1795
+ [onViewChange]
1796
+ );
1797
+ const navLink = (text, target) => /* @__PURE__ */ jsx(
1798
+ "button",
1799
+ {
1800
+ type: "button",
1801
+ onClick: () => navigate(target),
1802
+ className: "text-primary font-medium underline-offset-4 hover:underline",
1803
+ children: text
1804
+ }
1805
+ );
1806
+ const sharedProps = { className, style, logo };
1807
+ switch (currentView) {
1808
+ case "login":
1809
+ return /* @__PURE__ */ jsx(
1810
+ LoginForm,
1811
+ {
1812
+ ...sharedProps,
1813
+ showSocialButtons,
1814
+ defaultValues,
1815
+ ...loginProps,
1816
+ forgotPassword: hideNavigation ? void 0 : navLink(msg.navigation.forgotPassword, "forgot-password"),
1817
+ footer: hideNavigation ? void 0 : /* @__PURE__ */ jsxs("span", { children: [
1818
+ msg.navigation.noAccountText,
1819
+ " ",
1820
+ navLink(msg.navigation.signUpLink, "signup")
1821
+ ] })
1822
+ }
1823
+ );
1824
+ case "signup":
1825
+ return /* @__PURE__ */ jsx(
1826
+ SignupForm,
1827
+ {
1828
+ ...sharedProps,
1829
+ showSocialButtons,
1830
+ ...signupProps,
1831
+ footer: hideNavigation ? void 0 : /* @__PURE__ */ jsxs("span", { children: [
1832
+ msg.navigation.hasAccountText,
1833
+ " ",
1834
+ navLink(msg.navigation.signInLink, "login")
1835
+ ] })
1836
+ }
1837
+ );
1838
+ case "forgot-password":
1839
+ return /* @__PURE__ */ jsx(
1840
+ ForgotPasswordForm,
1841
+ {
1842
+ ...sharedProps,
1843
+ defaultValues: defaultValues ? { email: defaultValues.email } : void 0,
1844
+ ...forgotPasswordProps,
1845
+ footer: hideNavigation ? void 0 : /* @__PURE__ */ jsx("span", { children: navLink(msg.navigation.backToLogin, "login") })
1846
+ }
1847
+ );
1848
+ case "reset-password":
1849
+ return /* @__PURE__ */ jsx(
1850
+ ResetPasswordForm,
1851
+ {
1852
+ ...sharedProps,
1853
+ token: resetToken ?? "",
1854
+ ...resetPasswordProps,
1855
+ footer: hideNavigation ? void 0 : /* @__PURE__ */ jsx("span", { children: navLink(msg.navigation.backToLogin, "login") })
1856
+ }
1857
+ );
1858
+ }
1859
+ }
1860
+ AuthForm.displayName = "AuthForm";
1861
+ function useReferral() {
1862
+ const client = useAccessClient();
1863
+ const query = useQuery({
1864
+ queryKey: ["azirid-access", "referral", "me"],
1865
+ queryFn: () => client.get(client.paths.referralMe),
1866
+ enabled: !!client.getAccessToken()
1867
+ });
1868
+ const copyToClipboard = useCallback(async () => {
1869
+ if (query.data?.referralUrl) {
1870
+ await navigator.clipboard.writeText(query.data.referralUrl);
1871
+ return true;
1872
+ }
1873
+ return false;
1874
+ }, [query.data?.referralUrl]);
1875
+ return useMemo(
1876
+ () => ({ ...query, copyToClipboard }),
1877
+ [query, copyToClipboard]
1878
+ );
1879
+ }
1880
+ var styles = {
1881
+ card: {
1882
+ border: "1px solid #e5e7eb",
1883
+ borderRadius: "12px",
1884
+ padding: "24px",
1885
+ backgroundColor: "#ffffff",
1886
+ fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif'
1887
+ },
1888
+ title: {
1889
+ margin: "0 0 4px 0",
1890
+ fontSize: "18px",
1891
+ fontWeight: 600,
1892
+ color: "#111827"
1893
+ },
1894
+ description: {
1895
+ margin: "0 0 16px 0",
1896
+ fontSize: "14px",
1897
+ color: "#6b7280"
1898
+ },
1899
+ codeContainer: {
1900
+ display: "flex",
1901
+ alignItems: "center",
1902
+ gap: "8px",
1903
+ marginBottom: "16px"
1904
+ },
1905
+ codeInput: {
1906
+ flex: 1,
1907
+ padding: "10px 12px",
1908
+ border: "1px solid #d1d5db",
1909
+ borderRadius: "8px",
1910
+ backgroundColor: "#f9fafb",
1911
+ fontSize: "14px",
1912
+ fontFamily: "monospace",
1913
+ color: "#374151",
1914
+ outline: "none"
1915
+ },
1916
+ copyButton: {
1917
+ padding: "10px 16px",
1918
+ border: "1px solid #d1d5db",
1919
+ borderRadius: "8px",
1920
+ backgroundColor: "#ffffff",
1921
+ fontSize: "14px",
1922
+ fontWeight: 500,
1923
+ color: "#374151",
1924
+ cursor: "pointer",
1925
+ whiteSpace: "nowrap",
1926
+ transition: "background-color 0.15s"
1927
+ },
1928
+ copyButtonCopied: {
1929
+ backgroundColor: "#ecfdf5",
1930
+ borderColor: "#a7f3d0",
1931
+ color: "#065f46"
1932
+ },
1933
+ statsRow: {
1934
+ display: "flex",
1935
+ gap: "24px"
1936
+ },
1937
+ stat: {
1938
+ display: "flex",
1939
+ flexDirection: "column",
1940
+ gap: "2px"
1941
+ },
1942
+ statValue: {
1943
+ fontSize: "20px",
1944
+ fontWeight: 600,
1945
+ color: "#111827"
1946
+ },
1947
+ statLabel: {
1948
+ fontSize: "12px",
1949
+ color: "#6b7280"
1950
+ },
1951
+ skeleton: {
1952
+ backgroundColor: "#f3f4f6",
1953
+ borderRadius: "8px",
1954
+ animation: "pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite"
1955
+ },
1956
+ emptyMessage: {
1957
+ fontSize: "14px",
1958
+ color: "#9ca3af",
1959
+ textAlign: "center",
1960
+ padding: "12px 0"
1961
+ }
1962
+ };
1963
+ function ReferralCard({
1964
+ className,
1965
+ style,
1966
+ title = "Refer a Friend",
1967
+ description = "Share your referral link and earn rewards for every friend who signs up."
1968
+ }) {
1969
+ const { data, isLoading } = useReferral();
1970
+ const [copied, setCopied] = useState(false);
1971
+ const handleCopy = useCallback(async () => {
1972
+ if (!data?.referralUrl) return;
1973
+ try {
1974
+ await navigator.clipboard.writeText(data.referralUrl);
1975
+ setCopied(true);
1976
+ setTimeout(() => setCopied(false), 2e3);
1977
+ } catch {
1978
+ }
1979
+ }, [data?.referralUrl]);
1980
+ if (isLoading) {
1981
+ return /* @__PURE__ */ jsxs("div", { className, style: { ...styles.card, ...style }, children: [
1488
1982
  /* @__PURE__ */ jsx("div", { style: { ...styles.skeleton, height: "20px", width: "140px", marginBottom: "8px" } }),
1489
1983
  /* @__PURE__ */ jsx("div", { style: { ...styles.skeleton, height: "14px", width: "260px", marginBottom: "16px" } }),
1490
1984
  /* @__PURE__ */ jsx("div", { style: { ...styles.skeleton, height: "42px", width: "100%", marginBottom: "16px" } }),
@@ -1714,6 +2208,20 @@ function ReferralStats({ className, style }) {
1714
2208
  ] });
1715
2209
  }
1716
2210
  ReferralStats.displayName = "ReferralStats";
2211
+
2212
+ // ../shared/dist/index.js
2213
+ function formatAmount(amount, currency) {
2214
+ try {
2215
+ return new Intl.NumberFormat(void 0, {
2216
+ style: "currency",
2217
+ currency,
2218
+ minimumFractionDigits: 0,
2219
+ maximumFractionDigits: 2
2220
+ }).format(amount / 100);
2221
+ } catch {
2222
+ return `${currency} ${(amount / 100).toFixed(2)}`;
2223
+ }
2224
+ }
1717
2225
  function usePlans() {
1718
2226
  const client = useAccessClient();
1719
2227
  return useQuery({
@@ -1879,30 +2387,42 @@ var cancelStyle = {
1879
2387
  cursor: "pointer",
1880
2388
  fontFamily: "inherit"
1881
2389
  };
2390
+ var styles3 = {
2391
+ featuresList: {
2392
+ listStyle: "none",
2393
+ padding: 0,
2394
+ margin: "0 0 24px 0",
2395
+ flex: 1
2396
+ },
2397
+ featureItem: {
2398
+ display: "flex",
2399
+ alignItems: "center",
2400
+ gap: "8px",
2401
+ padding: "6px 0",
2402
+ fontSize: "14px",
2403
+ color: "#374151"
2404
+ },
2405
+ checkmark: {
2406
+ color: "#10b981",
2407
+ fontSize: "16px",
2408
+ fontWeight: 700,
2409
+ flexShrink: 0
2410
+ }
2411
+ };
2412
+ function PricingFeatureList({ features }) {
2413
+ if (!features || features.length === 0) return null;
2414
+ return /* @__PURE__ */ jsx("ul", { style: styles3.featuresList, children: features.map((feature, i) => /* @__PURE__ */ jsxs("li", { style: styles3.featureItem, children: [
2415
+ /* @__PURE__ */ jsx("span", { style: styles3.checkmark, "aria-hidden": "true", children: "\u2713" }),
2416
+ feature
2417
+ ] }, i)) });
2418
+ }
2419
+ PricingFeatureList.displayName = "PricingFeatureList";
1882
2420
  var intervalLabels = {
1883
2421
  MONTHLY: "/mo",
1884
2422
  YEARLY: "/yr",
1885
2423
  ONE_TIME: ""
1886
2424
  };
1887
- function formatAmount(amount, currency) {
1888
- try {
1889
- return new Intl.NumberFormat(void 0, {
1890
- style: "currency",
1891
- currency,
1892
- minimumFractionDigits: 0,
1893
- maximumFractionDigits: 2
1894
- }).format(amount / 100);
1895
- } catch {
1896
- return `${currency} ${(amount / 100).toFixed(2)}`;
1897
- }
1898
- }
1899
- var styles3 = {
1900
- grid: (columns) => ({
1901
- display: "grid",
1902
- gridTemplateColumns: `repeat(${columns}, 1fr)`,
1903
- gap: "24px",
1904
- fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif'
1905
- }),
2425
+ var styles4 = {
1906
2426
  card: (isCurrentPlan) => ({
1907
2427
  border: isCurrentPlan ? "2px solid #6366f1" : "1px solid #e5e7eb",
1908
2428
  borderRadius: "12px",
@@ -1953,26 +2473,6 @@ var styles3 = {
1953
2473
  fontSize: "16px",
1954
2474
  color: "#6b7280"
1955
2475
  },
1956
- featuresList: {
1957
- listStyle: "none",
1958
- padding: 0,
1959
- margin: "0 0 24px 0",
1960
- flex: 1
1961
- },
1962
- featureItem: {
1963
- display: "flex",
1964
- alignItems: "center",
1965
- gap: "8px",
1966
- padding: "6px 0",
1967
- fontSize: "14px",
1968
- color: "#374151"
1969
- },
1970
- checkmark: {
1971
- color: "#10b981",
1972
- fontSize: "16px",
1973
- fontWeight: 700,
1974
- flexShrink: 0
1975
- },
1976
2476
  selectButton: (isCurrentPlan) => ({
1977
2477
  width: "100%",
1978
2478
  padding: "12px 24px",
@@ -1984,11 +2484,46 @@ var styles3 = {
1984
2484
  fontWeight: 600,
1985
2485
  cursor: isCurrentPlan ? "default" : "pointer",
1986
2486
  transition: "background-color 0.15s"
2487
+ })
2488
+ };
2489
+ function PricingCard({
2490
+ plan,
2491
+ isCurrentPlan,
2492
+ isCheckoutPending,
2493
+ onSelect
2494
+ }) {
2495
+ return /* @__PURE__ */ jsxs("div", { style: styles4.card(isCurrentPlan), children: [
2496
+ isCurrentPlan && /* @__PURE__ */ jsx("span", { style: styles4.currentBadge, children: "Current Plan" }),
2497
+ /* @__PURE__ */ jsx("h3", { style: styles4.planName, children: plan.name }),
2498
+ plan.description && /* @__PURE__ */ jsx("p", { style: styles4.planDescription, children: plan.description }),
2499
+ /* @__PURE__ */ jsxs("div", { style: styles4.priceRow, children: [
2500
+ /* @__PURE__ */ jsx("span", { style: styles4.priceAmount, children: formatAmount(plan.amount, plan.currency) }),
2501
+ /* @__PURE__ */ jsx("span", { style: styles4.priceInterval, children: intervalLabels[plan.interval] })
2502
+ ] }),
2503
+ plan.features && plan.features.length > 0 && /* @__PURE__ */ jsx(PricingFeatureList, { features: plan.features }),
2504
+ /* @__PURE__ */ jsx(
2505
+ "button",
2506
+ {
2507
+ type: "button",
2508
+ onClick: () => onSelect(plan),
2509
+ disabled: isCurrentPlan || isCheckoutPending,
2510
+ style: {
2511
+ ...styles4.selectButton(isCurrentPlan),
2512
+ ...isCheckoutPending && !isCurrentPlan ? { opacity: 0.6 } : {}
2513
+ },
2514
+ children: isCurrentPlan ? "Current Plan" : "Subscribe"
2515
+ }
2516
+ )
2517
+ ] });
2518
+ }
2519
+ PricingCard.displayName = "PricingCard";
2520
+ var styles5 = {
2521
+ grid: (columns) => ({
2522
+ display: "grid",
2523
+ gridTemplateColumns: `repeat(${columns}, 1fr)`,
2524
+ gap: "24px",
2525
+ fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif'
1987
2526
  }),
1988
- skeleton: {
1989
- backgroundColor: "#f3f4f6",
1990
- borderRadius: "12px"
1991
- },
1992
2527
  skeletonCard: {
1993
2528
  border: "1px solid #e5e7eb",
1994
2529
  borderRadius: "12px",
@@ -2090,8 +2625,8 @@ function ProviderSelectModal({
2090
2625
  onSelect,
2091
2626
  onClose
2092
2627
  }) {
2093
- return /* @__PURE__ */ jsx("div", { style: styles3.overlay, onClick: onClose, children: /* @__PURE__ */ jsxs("div", { style: styles3.modal, onClick: (e) => e.stopPropagation(), children: [
2094
- /* @__PURE__ */ jsx("h2", { style: styles3.modalTitle, children: "Select payment method" }),
2628
+ return /* @__PURE__ */ jsx("div", { style: styles5.overlay, onClick: onClose, children: /* @__PURE__ */ jsxs("div", { style: styles5.modal, onClick: (e) => e.stopPropagation(), children: [
2629
+ /* @__PURE__ */ jsx("h2", { style: styles5.modalTitle, children: "Select payment method" }),
2095
2630
  /* @__PURE__ */ jsx("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: providers.map((p) => /* @__PURE__ */ jsxs(
2096
2631
  "button",
2097
2632
  {
@@ -2119,17 +2654,22 @@ function ProviderSelectModal({
2119
2654
  },
2120
2655
  p.provider
2121
2656
  )) }),
2122
- /* @__PURE__ */ jsx("button", { type: "button", style: styles3.closeButton, onClick: onClose, children: "Cancel" })
2657
+ /* @__PURE__ */ jsx("button", { type: "button", style: styles5.closeButton, onClick: onClose, children: "Cancel" })
2123
2658
  ] }) });
2124
2659
  }
2660
+ var intervalLabels2 = {
2661
+ MONTHLY: "/mo",
2662
+ YEARLY: "/yr",
2663
+ ONE_TIME: ""
2664
+ };
2125
2665
  function TransferModal({
2126
2666
  data,
2127
2667
  onClose
2128
2668
  }) {
2129
2669
  const bankDetails = data.bankDetails;
2130
- return /* @__PURE__ */ jsx("div", { style: styles3.overlay, onClick: onClose, children: /* @__PURE__ */ jsxs("div", { style: styles3.modal, onClick: (e) => e.stopPropagation(), children: [
2131
- /* @__PURE__ */ jsx("h2", { style: styles3.modalTitle, children: "Manual Transfer" }),
2132
- /* @__PURE__ */ jsxs("p", { style: styles3.modalSubtitle, children: [
2670
+ return /* @__PURE__ */ jsx("div", { style: styles5.overlay, onClick: onClose, children: /* @__PURE__ */ jsxs("div", { style: styles5.modal, onClick: (e) => e.stopPropagation(), children: [
2671
+ /* @__PURE__ */ jsx("h2", { style: styles5.modalTitle, children: "Manual Transfer" }),
2672
+ /* @__PURE__ */ jsxs("p", { style: styles5.modalSubtitle, children: [
2133
2673
  "Transfer the amount below to subscribe to",
2134
2674
  " ",
2135
2675
  /* @__PURE__ */ jsx("strong", { children: data.plan?.name })
@@ -2146,7 +2686,7 @@ function TransferModal({
2146
2686
  },
2147
2687
  children: [
2148
2688
  /* @__PURE__ */ jsx("div", { style: { fontSize: "32px", fontWeight: 700, color: "#111827" }, children: data.plan ? formatAmount(data.plan.amount, data.plan.currency) : "" }),
2149
- /* @__PURE__ */ jsx("div", { style: { fontSize: "14px", color: "#6b7280" }, children: data.plan?.interval ? intervalLabels[data.plan.interval] ?? "" : "" })
2689
+ /* @__PURE__ */ jsx("div", { style: { fontSize: "14px", color: "#6b7280" }, children: data.plan?.interval ? intervalLabels2[data.plan.interval] ?? "" : "" })
2150
2690
  ]
2151
2691
  }
2152
2692
  ),
@@ -2163,12 +2703,12 @@ function TransferModal({
2163
2703
  children: "Bank Details"
2164
2704
  }
2165
2705
  ),
2166
- Object.entries(bankDetails).filter(([, v]) => v).map(([key, value]) => /* @__PURE__ */ jsxs("div", { style: styles3.bankDetailRow, children: [
2167
- /* @__PURE__ */ jsx("span", { style: styles3.bankDetailLabel, children: key.replace(/([A-Z])/g, " $1").replace(/^./, (s) => s.toUpperCase()) }),
2168
- /* @__PURE__ */ jsx("span", { style: styles3.bankDetailValue, children: value })
2706
+ Object.entries(bankDetails).filter(([, v]) => v).map(([key, value]) => /* @__PURE__ */ jsxs("div", { style: styles5.bankDetailRow, children: [
2707
+ /* @__PURE__ */ jsx("span", { style: styles5.bankDetailLabel, children: key.replace(/([A-Z])/g, " $1").replace(/^./, (s) => s.toUpperCase()) }),
2708
+ /* @__PURE__ */ jsx("span", { style: styles5.bankDetailValue, children: value })
2169
2709
  ] }, key))
2170
2710
  ] }),
2171
- data.transferInstructions && /* @__PURE__ */ jsx("div", { style: styles3.instructions, children: data.transferInstructions }),
2711
+ data.transferInstructions && /* @__PURE__ */ jsx("div", { style: styles5.instructions, children: data.transferInstructions }),
2172
2712
  /* @__PURE__ */ jsx(
2173
2713
  "p",
2174
2714
  {
@@ -2180,7 +2720,7 @@ function TransferModal({
2180
2720
  children: "After completing the transfer, submit your proof of payment. Your subscription will be activated once the transfer is verified."
2181
2721
  }
2182
2722
  ),
2183
- /* @__PURE__ */ jsx("button", { type: "button", style: styles3.closeButton, onClick: onClose, children: "Close" })
2723
+ /* @__PURE__ */ jsx("button", { type: "button", style: styles5.closeButton, onClick: onClose, children: "Close" })
2184
2724
  ] }) });
2185
2725
  }
2186
2726
  function PricingTable({
@@ -2231,12 +2771,12 @@ function PricingTable({
2231
2771
  checkout({ planId: plan.id, provider, successUrl, cancelUrl });
2232
2772
  };
2233
2773
  if (plansLoading) {
2234
- return /* @__PURE__ */ jsx("div", { className, style: { ...styles3.grid(columns), ...style }, children: Array.from({ length: columns }).map((_, i) => /* @__PURE__ */ jsxs("div", { style: styles3.skeletonCard, children: [
2774
+ return /* @__PURE__ */ jsx("div", { className, style: { ...styles5.grid(columns), ...style }, children: Array.from({ length: columns }).map((_, i) => /* @__PURE__ */ jsxs("div", { style: styles5.skeletonCard, children: [
2235
2775
  /* @__PURE__ */ jsx(
2236
2776
  "div",
2237
2777
  {
2238
2778
  style: {
2239
- ...styles3.skeletonLine,
2779
+ ...styles5.skeletonLine,
2240
2780
  width: "60%",
2241
2781
  height: "20px"
2242
2782
  }
@@ -2246,7 +2786,7 @@ function PricingTable({
2246
2786
  "div",
2247
2787
  {
2248
2788
  style: {
2249
- ...styles3.skeletonLine,
2789
+ ...styles5.skeletonLine,
2250
2790
  width: "80%",
2251
2791
  height: "14px"
2252
2792
  }
@@ -2256,7 +2796,7 @@ function PricingTable({
2256
2796
  "div",
2257
2797
  {
2258
2798
  style: {
2259
- ...styles3.skeletonLine,
2799
+ ...styles5.skeletonLine,
2260
2800
  width: "40%",
2261
2801
  height: "36px",
2262
2802
  marginTop: "8px"
@@ -2267,7 +2807,7 @@ function PricingTable({
2267
2807
  "div",
2268
2808
  {
2269
2809
  style: {
2270
- ...styles3.skeletonLine,
2810
+ ...styles5.skeletonLine,
2271
2811
  width: "90%",
2272
2812
  height: "14px"
2273
2813
  }
@@ -2278,7 +2818,7 @@ function PricingTable({
2278
2818
  "div",
2279
2819
  {
2280
2820
  style: {
2281
- ...styles3.skeletonLine,
2821
+ ...styles5.skeletonLine,
2282
2822
  width: "100%",
2283
2823
  height: "44px",
2284
2824
  marginTop: "16px"
@@ -2293,35 +2833,19 @@ function PricingTable({
2293
2833
  "div",
2294
2834
  {
2295
2835
  className,
2296
- style: { ...styles3.grid(columns), ...style },
2836
+ style: { ...styles5.grid(columns), ...style },
2297
2837
  children: sortedPlans.map((plan) => {
2298
2838
  const isCurrentPlan = subscription?.planId === plan.id && subscription.status === "ACTIVE";
2299
- return /* @__PURE__ */ jsxs("div", { style: styles3.card(isCurrentPlan), children: [
2300
- isCurrentPlan && /* @__PURE__ */ jsx("span", { style: styles3.currentBadge, children: "Current Plan" }),
2301
- /* @__PURE__ */ jsx("h3", { style: styles3.planName, children: plan.name }),
2302
- plan.description && /* @__PURE__ */ jsx("p", { style: styles3.planDescription, children: plan.description }),
2303
- /* @__PURE__ */ jsxs("div", { style: styles3.priceRow, children: [
2304
- /* @__PURE__ */ jsx("span", { style: styles3.priceAmount, children: formatAmount(plan.amount, plan.currency) }),
2305
- /* @__PURE__ */ jsx("span", { style: styles3.priceInterval, children: intervalLabels[plan.interval] })
2306
- ] }),
2307
- plan.features && plan.features.length > 0 && /* @__PURE__ */ jsx("ul", { style: styles3.featuresList, children: plan.features.map((feature, i) => /* @__PURE__ */ jsxs("li", { style: styles3.featureItem, children: [
2308
- /* @__PURE__ */ jsx("span", { style: styles3.checkmark, "aria-hidden": "true", children: "\u2713" }),
2309
- feature
2310
- ] }, i)) }),
2311
- /* @__PURE__ */ jsx(
2312
- "button",
2313
- {
2314
- type: "button",
2315
- onClick: () => handleSelect(plan),
2316
- disabled: isCurrentPlan || checkoutPending,
2317
- style: {
2318
- ...styles3.selectButton(isCurrentPlan),
2319
- ...checkoutPending && !isCurrentPlan ? { opacity: 0.6 } : {}
2320
- },
2321
- children: isCurrentPlan ? "Current Plan" : "Subscribe"
2322
- }
2323
- )
2324
- ] }, plan.id);
2839
+ return /* @__PURE__ */ jsx(
2840
+ PricingCard,
2841
+ {
2842
+ plan,
2843
+ isCurrentPlan,
2844
+ isCheckoutPending: checkoutPending,
2845
+ onSelect: handleSelect
2846
+ },
2847
+ plan.id
2848
+ );
2325
2849
  })
2326
2850
  }
2327
2851
  ),
@@ -2388,145 +2912,81 @@ function CheckoutButton({
2388
2912
  },
2389
2913
  disabled: isPending,
2390
2914
  onClick: () => checkout({ planId, successUrl, cancelUrl }),
2391
- children: isPending ? "Loading..." : children ?? "Subscribe"
2392
- }
2393
- );
2394
- }
2395
- CheckoutButton.displayName = "CheckoutButton";
2396
- var PROVIDER_LABELS2 = {
2397
- STRIPE: { en: "Credit/Debit Card", es: "Tarjeta de cr\xE9dito/d\xE9bito" },
2398
- PAYPAL: { en: "PayPal", es: "PayPal" },
2399
- PAYPHONE: { en: "Payphone", es: "Payphone" },
2400
- NUVEI: { en: "Nuvei", es: "Nuvei" },
2401
- MANUAL_TRANSFER: { en: "Bank Transfer", es: "Transferencia bancaria" }
2402
- };
2403
- var PROVIDER_ICONS2 = {
2404
- STRIPE: "\u{1F4B3}",
2405
- PAYPAL: "\u{1F17F}\uFE0F",
2406
- PAYPHONE: "\u{1F4F1}",
2407
- NUVEI: "\u{1F4B3}",
2408
- MANUAL_TRANSFER: "\u{1F3E6}"
2409
- };
2410
- function formatAmount2(amount, currency) {
2411
- try {
2412
- return new Intl.NumberFormat(void 0, {
2413
- style: "currency",
2414
- currency,
2415
- minimumFractionDigits: 0,
2416
- maximumFractionDigits: 2
2417
- }).format(amount / 100);
2418
- } catch {
2419
- return `${currency} ${(amount / 100).toFixed(2)}`;
2420
- }
2421
- }
2422
- function PayButton({
2423
- planId,
2424
- intentId,
2425
- successUrl,
2426
- cancelUrl,
2427
- className,
2428
- style,
2429
- children,
2430
- disabled,
2431
- onSuccess,
2432
- onError,
2433
- onProviderSelect
2434
- }) {
2435
- const messages = useMessages();
2436
- const billing = messages?.billing;
2437
- const [showProviderModal, setShowProviderModal] = useState(false);
2438
- const [showTransferModal, setShowTransferModal] = useState(false);
2439
- const [transferData, setTransferData] = useState(null);
2440
- const [payphoneData, setPayphoneData] = useState(null);
2441
- const { data: providers, isLoading: providersLoading } = usePaymentProviders();
2442
- const { checkout, isPending } = useCheckout({
2443
- redirectOnSuccess: true,
2444
- onSuccess: (data) => {
2445
- if (data.provider === "MANUAL_TRANSFER") {
2446
- setTransferData(data);
2447
- setShowTransferModal(true);
2448
- setShowProviderModal(false);
2449
- } else if (data.provider === "PAYPHONE" && data.widgetConfig) {
2450
- setPayphoneData(data);
2451
- setShowProviderModal(false);
2452
- }
2453
- onSuccess?.(data);
2454
- },
2455
- onError
2456
- });
2457
- const handleClick = () => {
2458
- if (!providers || providers.length === 0) return;
2459
- if (providers.length === 1) {
2460
- doCheckout(providers[0].provider);
2461
- } else {
2462
- setShowProviderModal(true);
2463
- }
2464
- };
2465
- const doCheckout = (provider) => {
2466
- onProviderSelect?.(provider);
2467
- checkout({
2468
- planId,
2469
- intentId,
2470
- provider,
2471
- successUrl,
2472
- cancelUrl
2473
- });
2474
- };
2475
- const isDisabled = disabled || isPending || providersLoading || !planId && !intentId;
2476
- return /* @__PURE__ */ jsxs(Fragment, { children: [
2477
- /* @__PURE__ */ jsx(
2478
- "button",
2479
- {
2480
- type: "button",
2481
- className,
2482
- style: {
2483
- padding: "10px 24px",
2484
- fontSize: "14px",
2485
- fontWeight: 600,
2486
- color: "#fff",
2487
- backgroundColor: isDisabled ? "#9ca3af" : "#111827",
2488
- border: "none",
2489
- borderRadius: "8px",
2490
- cursor: isDisabled ? "not-allowed" : "pointer",
2491
- fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
2492
- ...style
2493
- },
2494
- onClick: handleClick,
2495
- disabled: isDisabled,
2496
- children: isPending ? billing?.processing ?? "Processing..." : children ?? (billing?.pay ?? "Pay")
2497
- }
2498
- ),
2499
- showProviderModal && providers && providers.length > 1 && /* @__PURE__ */ jsx(
2500
- ProviderModal,
2501
- {
2502
- providers,
2503
- isPending,
2504
- onSelect: doCheckout,
2505
- onClose: () => setShowProviderModal(false),
2506
- labels: billing
2507
- }
2508
- ),
2509
- showTransferModal && transferData && /* @__PURE__ */ jsx(
2510
- TransferModal2,
2511
- {
2512
- data: transferData,
2513
- onClose: () => {
2514
- setShowTransferModal(false);
2515
- setTransferData(null);
2516
- },
2517
- labels: billing
2518
- }
2519
- ),
2520
- payphoneData?.widgetConfig && /* @__PURE__ */ jsx(
2521
- PayphoneModal,
2522
- {
2523
- config: payphoneData.widgetConfig,
2524
- successUrl,
2525
- onClose: () => setPayphoneData(null)
2526
- }
2527
- )
2528
- ] });
2915
+ children: isPending ? "Loading..." : children ?? "Subscribe"
2916
+ }
2917
+ );
2529
2918
  }
2919
+ CheckoutButton.displayName = "CheckoutButton";
2920
+ var PROVIDER_LABELS2 = {
2921
+ STRIPE: { en: "Credit/Debit Card", es: "Tarjeta de cr\xE9dito/d\xE9bito" },
2922
+ PAYPAL: { en: "PayPal", es: "PayPal" },
2923
+ PAYPHONE: { en: "Payphone", es: "Payphone" },
2924
+ NUVEI: { en: "Nuvei", es: "Nuvei" },
2925
+ MANUAL_TRANSFER: { en: "Bank Transfer", es: "Transferencia bancaria" }
2926
+ };
2927
+ var PROVIDER_ICONS2 = {
2928
+ STRIPE: "\u{1F4B3}",
2929
+ PAYPAL: "\u{1F17F}\uFE0F",
2930
+ PAYPHONE: "\u{1F4F1}",
2931
+ NUVEI: "\u{1F4B3}",
2932
+ MANUAL_TRANSFER: "\u{1F3E6}"
2933
+ };
2934
+ var modalStyles = {
2935
+ overlay: {
2936
+ position: "fixed",
2937
+ inset: 0,
2938
+ backgroundColor: "rgba(0,0,0,0.5)",
2939
+ display: "flex",
2940
+ alignItems: "center",
2941
+ justifyContent: "center",
2942
+ zIndex: 9999,
2943
+ fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'
2944
+ },
2945
+ card: {
2946
+ backgroundColor: "#fff",
2947
+ borderRadius: "12px",
2948
+ padding: "24px",
2949
+ maxWidth: "420px",
2950
+ width: "90%",
2951
+ boxShadow: "0 25px 50px -12px rgba(0,0,0,0.25)"
2952
+ },
2953
+ title: {
2954
+ fontSize: "18px",
2955
+ fontWeight: 700,
2956
+ color: "#111827",
2957
+ margin: "0 0 20px 0",
2958
+ textAlign: "center"
2959
+ },
2960
+ providerButton: {
2961
+ display: "flex",
2962
+ alignItems: "center",
2963
+ width: "100%",
2964
+ padding: "12px 16px",
2965
+ border: "1px solid #e5e7eb",
2966
+ borderRadius: "8px",
2967
+ backgroundColor: "#fff",
2968
+ cursor: "pointer",
2969
+ fontSize: "14px",
2970
+ fontWeight: 500,
2971
+ color: "#111827",
2972
+ transition: "background-color 0.15s",
2973
+ fontFamily: "inherit"
2974
+ },
2975
+ cancelButton: {
2976
+ display: "block",
2977
+ width: "100%",
2978
+ marginTop: "16px",
2979
+ padding: "10px",
2980
+ border: "none",
2981
+ borderRadius: "8px",
2982
+ backgroundColor: "#f3f4f6",
2983
+ color: "#6b7280",
2984
+ fontSize: "14px",
2985
+ fontWeight: 500,
2986
+ cursor: "pointer",
2987
+ fontFamily: "inherit"
2988
+ }
2989
+ };
2530
2990
  function ProviderModal({
2531
2991
  providers,
2532
2992
  isPending,
@@ -2564,7 +3024,7 @@ function TransferModal2({
2564
3024
  const bankDetails = data.bankDetails;
2565
3025
  const plan = data.plan;
2566
3026
  const intent = data.intent;
2567
- const displayAmount = plan ? formatAmount2(plan.amount, plan.currency) : intent ? formatAmount2(intent.amount, intent.currency) : "";
3027
+ const displayAmount = plan ? formatAmount(plan.amount, plan.currency) : intent ? formatAmount(intent.amount, intent.currency) : "";
2568
3028
  return /* @__PURE__ */ jsx("div", { style: modalStyles.overlay, onClick: onClose, children: /* @__PURE__ */ jsxs("div", { style: modalStyles.card, onClick: (e) => e.stopPropagation(), children: [
2569
3029
  /* @__PURE__ */ jsx("h2", { style: modalStyles.title, children: labels?.bankTransfer ?? "Bank Transfer" }),
2570
3030
  displayAmount && /* @__PURE__ */ jsxs(
@@ -2644,62 +3104,114 @@ function TransferModal2({
2644
3104
  /* @__PURE__ */ jsx("button", { type: "button", style: modalStyles.cancelButton, onClick: onClose, children: "Close" })
2645
3105
  ] }) });
2646
3106
  }
2647
- var modalStyles = {
2648
- overlay: {
2649
- position: "fixed",
2650
- inset: 0,
2651
- backgroundColor: "rgba(0,0,0,0.5)",
2652
- display: "flex",
2653
- alignItems: "center",
2654
- justifyContent: "center",
2655
- zIndex: 9999,
2656
- fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'
2657
- },
2658
- card: {
2659
- backgroundColor: "#fff",
2660
- borderRadius: "12px",
2661
- padding: "24px",
2662
- maxWidth: "420px",
2663
- width: "90%",
2664
- boxShadow: "0 25px 50px -12px rgba(0,0,0,0.25)"
2665
- },
2666
- title: {
2667
- fontSize: "18px",
2668
- fontWeight: 700,
2669
- color: "#111827",
2670
- margin: "0 0 20px 0",
2671
- textAlign: "center"
2672
- },
2673
- providerButton: {
2674
- display: "flex",
2675
- alignItems: "center",
2676
- width: "100%",
2677
- padding: "12px 16px",
2678
- border: "1px solid #e5e7eb",
2679
- borderRadius: "8px",
2680
- backgroundColor: "#fff",
2681
- cursor: "pointer",
2682
- fontSize: "14px",
2683
- fontWeight: 500,
2684
- color: "#111827",
2685
- transition: "background-color 0.15s",
2686
- fontFamily: "inherit"
2687
- },
2688
- cancelButton: {
2689
- display: "block",
2690
- width: "100%",
2691
- marginTop: "16px",
2692
- padding: "10px",
2693
- border: "none",
2694
- borderRadius: "8px",
2695
- backgroundColor: "#f3f4f6",
2696
- color: "#6b7280",
2697
- fontSize: "14px",
2698
- fontWeight: 500,
2699
- cursor: "pointer",
2700
- fontFamily: "inherit"
2701
- }
2702
- };
3107
+ function PayButton({
3108
+ planId,
3109
+ intentId,
3110
+ successUrl,
3111
+ cancelUrl,
3112
+ className,
3113
+ style,
3114
+ children,
3115
+ disabled,
3116
+ onSuccess,
3117
+ onError,
3118
+ onProviderSelect
3119
+ }) {
3120
+ const messages = useMessages();
3121
+ const billing = messages?.billing;
3122
+ const [showProviderModal, setShowProviderModal] = useState(false);
3123
+ const [showTransferModal, setShowTransferModal] = useState(false);
3124
+ const [transferData, setTransferData] = useState(null);
3125
+ const [payphoneData, setPayphoneData] = useState(null);
3126
+ const { data: providers, isLoading: providersLoading } = usePaymentProviders();
3127
+ const { checkout, isPending } = useCheckout({
3128
+ redirectOnSuccess: true,
3129
+ onSuccess: (data) => {
3130
+ if (data.provider === "MANUAL_TRANSFER") {
3131
+ setTransferData(data);
3132
+ setShowTransferModal(true);
3133
+ setShowProviderModal(false);
3134
+ } else if (data.provider === "PAYPHONE" && data.widgetConfig) {
3135
+ setPayphoneData(data);
3136
+ setShowProviderModal(false);
3137
+ }
3138
+ onSuccess?.(data);
3139
+ },
3140
+ onError
3141
+ });
3142
+ const handleClick = () => {
3143
+ if (!providers || providers.length === 0) return;
3144
+ if (providers.length === 1) {
3145
+ doCheckout(providers[0].provider);
3146
+ } else {
3147
+ setShowProviderModal(true);
3148
+ }
3149
+ };
3150
+ const doCheckout = (provider) => {
3151
+ onProviderSelect?.(provider);
3152
+ checkout({
3153
+ planId,
3154
+ intentId,
3155
+ provider,
3156
+ successUrl,
3157
+ cancelUrl
3158
+ });
3159
+ };
3160
+ const isDisabled = disabled || isPending || providersLoading || !planId && !intentId;
3161
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
3162
+ /* @__PURE__ */ jsx(
3163
+ "button",
3164
+ {
3165
+ type: "button",
3166
+ className,
3167
+ style: {
3168
+ padding: "10px 24px",
3169
+ fontSize: "14px",
3170
+ fontWeight: 600,
3171
+ color: "#fff",
3172
+ backgroundColor: isDisabled ? "#9ca3af" : "#111827",
3173
+ border: "none",
3174
+ borderRadius: "8px",
3175
+ cursor: isDisabled ? "not-allowed" : "pointer",
3176
+ fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
3177
+ ...style
3178
+ },
3179
+ onClick: handleClick,
3180
+ disabled: isDisabled,
3181
+ children: isPending ? billing?.processing ?? "Processing..." : children ?? (billing?.pay ?? "Pay")
3182
+ }
3183
+ ),
3184
+ showProviderModal && providers && providers.length > 1 && /* @__PURE__ */ jsx(
3185
+ ProviderModal,
3186
+ {
3187
+ providers,
3188
+ isPending,
3189
+ onSelect: doCheckout,
3190
+ onClose: () => setShowProviderModal(false),
3191
+ labels: billing
3192
+ }
3193
+ ),
3194
+ showTransferModal && transferData && /* @__PURE__ */ jsx(
3195
+ TransferModal2,
3196
+ {
3197
+ data: transferData,
3198
+ onClose: () => {
3199
+ setShowTransferModal(false);
3200
+ setTransferData(null);
3201
+ },
3202
+ labels: billing
3203
+ }
3204
+ ),
3205
+ payphoneData?.widgetConfig && /* @__PURE__ */ jsx(
3206
+ PayphoneModal,
3207
+ {
3208
+ config: payphoneData.widgetConfig,
3209
+ successUrl,
3210
+ onClose: () => setPayphoneData(null)
3211
+ }
3212
+ )
3213
+ ] });
3214
+ }
2703
3215
  function usePayphoneConfirm(options) {
2704
3216
  const client = useAccessClient();
2705
3217
  return useMutation({
@@ -2765,7 +3277,7 @@ var statusConfig = {
2765
3277
  UNPAID: { bg: "#fee2e2", color: "#991b1b", label: "Unpaid" },
2766
3278
  INCOMPLETE: { bg: "#f3f4f6", color: "#6b7280", label: "Incomplete" }
2767
3279
  };
2768
- var styles4 = {
3280
+ var styles6 = {
2769
3281
  badge: {
2770
3282
  display: "inline-flex",
2771
3283
  alignItems: "center",
@@ -2794,7 +3306,7 @@ var styles4 = {
2794
3306
  function SubscriptionBadge({ className, style }) {
2795
3307
  const { data: subscription, isLoading } = useSubscription();
2796
3308
  if (isLoading) {
2797
- return /* @__PURE__ */ jsx("span", { className, style: { ...styles4.skeleton, ...style } });
3309
+ return /* @__PURE__ */ jsx("span", { className, style: { ...styles6.skeleton, ...style } });
2798
3310
  }
2799
3311
  if (!subscription) {
2800
3312
  return /* @__PURE__ */ jsx(
@@ -2802,7 +3314,7 @@ function SubscriptionBadge({ className, style }) {
2802
3314
  {
2803
3315
  className,
2804
3316
  style: {
2805
- ...styles4.badge,
3317
+ ...styles6.badge,
2806
3318
  backgroundColor: "#f3f4f6",
2807
3319
  color: "#6b7280",
2808
3320
  ...style
@@ -2817,13 +3329,13 @@ function SubscriptionBadge({ className, style }) {
2817
3329
  {
2818
3330
  className,
2819
3331
  style: {
2820
- ...styles4.badge,
3332
+ ...styles6.badge,
2821
3333
  backgroundColor: config.bg,
2822
3334
  color: config.color,
2823
3335
  ...style
2824
3336
  },
2825
3337
  children: [
2826
- /* @__PURE__ */ jsx("span", { style: styles4.dot(config.color), "aria-hidden": "true" }),
3338
+ /* @__PURE__ */ jsx("span", { style: styles6.dot(config.color), "aria-hidden": "true" }),
2827
3339
  subscription.plan.name,
2828
3340
  " \xB7 ",
2829
3341
  config.label
@@ -2857,19 +3369,7 @@ function formatDate2(dateStr) {
2857
3369
  return dateStr;
2858
3370
  }
2859
3371
  }
2860
- function formatAmount3(amount, currency) {
2861
- try {
2862
- return new Intl.NumberFormat(void 0, {
2863
- style: "currency",
2864
- currency,
2865
- minimumFractionDigits: 0,
2866
- maximumFractionDigits: 2
2867
- }).format(amount / 100);
2868
- } catch {
2869
- return `${currency} ${(amount / 100).toFixed(2)}`;
2870
- }
2871
- }
2872
- var styles5 = {
3372
+ var styles7 = {
2873
3373
  container: {
2874
3374
  border: "1px solid #e5e7eb",
2875
3375
  borderRadius: "12px",
@@ -2938,41 +3438,41 @@ var styles5 = {
2938
3438
  function InvoiceList({ className, style }) {
2939
3439
  const { data: invoices, isLoading } = useInvoices();
2940
3440
  if (isLoading) {
2941
- return /* @__PURE__ */ jsxs("div", { className, style: { ...styles5.container, ...style }, children: [
2942
- /* @__PURE__ */ jsx("div", { style: styles5.header, children: /* @__PURE__ */ jsx("div", { style: { ...styles5.skeleton, width: "100px", height: "18px" } }) }),
3441
+ return /* @__PURE__ */ jsxs("div", { className, style: { ...styles7.container, ...style }, children: [
3442
+ /* @__PURE__ */ jsx("div", { style: styles7.header, children: /* @__PURE__ */ jsx("div", { style: { ...styles7.skeleton, width: "100px", height: "18px" } }) }),
2943
3443
  /* @__PURE__ */ jsx("div", { style: { padding: "24px" }, children: [1, 2, 3].map((i) => /* @__PURE__ */ jsx(
2944
3444
  "div",
2945
3445
  {
2946
- style: { ...styles5.skeleton, width: "100%", height: "16px", marginBottom: "16px" }
3446
+ style: { ...styles7.skeleton, width: "100%", height: "16px", marginBottom: "16px" }
2947
3447
  },
2948
3448
  i
2949
3449
  )) })
2950
3450
  ] });
2951
3451
  }
2952
- return /* @__PURE__ */ jsxs("div", { className, style: { ...styles5.container, ...style }, children: [
2953
- /* @__PURE__ */ jsx("div", { style: styles5.header, children: /* @__PURE__ */ jsx("h3", { style: styles5.title, children: "Invoices" }) }),
2954
- /* @__PURE__ */ jsxs("table", { style: styles5.table, children: [
3452
+ return /* @__PURE__ */ jsxs("div", { className, style: { ...styles7.container, ...style }, children: [
3453
+ /* @__PURE__ */ jsx("div", { style: styles7.header, children: /* @__PURE__ */ jsx("h3", { style: styles7.title, children: "Invoices" }) }),
3454
+ /* @__PURE__ */ jsxs("table", { style: styles7.table, children: [
2955
3455
  /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
2956
- /* @__PURE__ */ jsx("th", { style: styles5.th, children: "Date" }),
2957
- /* @__PURE__ */ jsx("th", { style: styles5.th, children: "Amount" }),
2958
- /* @__PURE__ */ jsx("th", { style: styles5.th, children: "Status" }),
2959
- /* @__PURE__ */ jsx("th", { style: styles5.th, children: "Invoice" })
3456
+ /* @__PURE__ */ jsx("th", { style: styles7.th, children: "Date" }),
3457
+ /* @__PURE__ */ jsx("th", { style: styles7.th, children: "Amount" }),
3458
+ /* @__PURE__ */ jsx("th", { style: styles7.th, children: "Status" }),
3459
+ /* @__PURE__ */ jsx("th", { style: styles7.th, children: "Invoice" })
2960
3460
  ] }) }),
2961
3461
  /* @__PURE__ */ jsxs("tbody", { children: [
2962
- (!invoices || invoices.length === 0) && /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: 4, style: styles5.emptyRow, children: "No invoices yet." }) }),
3462
+ (!invoices || invoices.length === 0) && /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: 4, style: styles7.emptyRow, children: "No invoices yet." }) }),
2963
3463
  invoices?.map((invoice) => {
2964
3464
  const sc = statusColors2[invoice.status];
2965
3465
  return /* @__PURE__ */ jsxs("tr", { children: [
2966
- /* @__PURE__ */ jsx("td", { style: styles5.td, children: formatDate2(invoice.createdAt) }),
2967
- /* @__PURE__ */ jsx("td", { style: styles5.td, children: formatAmount3(invoice.amount, invoice.currency) }),
2968
- /* @__PURE__ */ jsx("td", { style: styles5.td, children: /* @__PURE__ */ jsx("span", { style: styles5.badge(sc.bg, sc.color), children: invoice.status }) }),
2969
- /* @__PURE__ */ jsx("td", { style: styles5.td, children: invoice.invoiceUrl ? /* @__PURE__ */ jsx(
3466
+ /* @__PURE__ */ jsx("td", { style: styles7.td, children: formatDate2(invoice.createdAt) }),
3467
+ /* @__PURE__ */ jsx("td", { style: styles7.td, children: formatAmount(invoice.amount, invoice.currency) }),
3468
+ /* @__PURE__ */ jsx("td", { style: styles7.td, children: /* @__PURE__ */ jsx("span", { style: styles7.badge(sc.bg, sc.color), children: invoice.status }) }),
3469
+ /* @__PURE__ */ jsx("td", { style: styles7.td, children: invoice.invoiceUrl ? /* @__PURE__ */ jsx(
2970
3470
  "a",
2971
3471
  {
2972
3472
  href: invoice.invoiceUrl,
2973
3473
  target: "_blank",
2974
3474
  rel: "noopener noreferrer",
2975
- style: styles5.link,
3475
+ style: styles7.link,
2976
3476
  children: "View"
2977
3477
  }
2978
3478
  ) : /* @__PURE__ */ jsx("span", { style: { color: "#d1d5db" }, children: "\u2014" }) })
@@ -3255,6 +3755,17 @@ function useSwitchTenant() {
3255
3755
  };
3256
3756
  return { switchTenant };
3257
3757
  }
3758
+ function createMutationHook(config) {
3759
+ return function useGeneratedMutation(options) {
3760
+ const client = useAccessClient();
3761
+ return useMutation({
3762
+ mutationKey: config.mutationKey,
3763
+ mutationFn: (input) => config.mutationFn(client, input),
3764
+ onSuccess: options?.onSuccess,
3765
+ onError: options?.onError
3766
+ });
3767
+ };
3768
+ }
3258
3769
  function zodToFieldErrors(zodError) {
3259
3770
  return zodError.issues.map((issue) => ({
3260
3771
  field: issue.path.join("."),
@@ -3311,8 +3822,8 @@ function usePasswordToggle() {
3311
3822
  }
3312
3823
 
3313
3824
  // src/index.ts
3314
- var SDK_VERSION = "0.7.0";
3825
+ var SDK_VERSION = "0.9.0";
3315
3826
 
3316
- export { AziridProvider, BASE_PATHS, CheckoutButton, InvoiceList, LoginForm, PATHS, PayButton, PayphoneCallback, PricingTable, ReferralCard, ReferralStats, SDK_VERSION, SignupForm, SubscriptionBadge, buildPaths, changePasswordSchema, cn, createAccessClient, createLoginSchema, createSignupSchema, en, es, isAuthError, loginSchema, magicLinkRequestSchema, magicLinkVerifySchema, passkeyRegisterStartSchema, removeStyles, resolveMessages, signupSchema, socialLoginSchema, useAccessClient, useAzirid, useBootstrap, useBranding, useChangePassword, useCheckout, useFormState, useInvoices, useLogin, useLogout, useMagicLink, useMessages, usePasskeys, usePasswordToggle, usePaymentProviders, usePayphoneConfirm, usePlans, useReferral, useReferralStats, useRefresh, useSession, useSignup, useSocialLogin, useSubmitTransferProof, useSubscription, useSwitchTenant, useTenantMembers, useTenants, useTransferProofs };
3827
+ export { AuthForm, AziridProvider, BASE_PATHS, CheckoutButton, ForgotPasswordForm, InvoiceList, LoginForm, PATHS, PayButton, PayphoneCallback, PricingTable, ReferralCard, ReferralStats, ResetPasswordForm, SDK_VERSION, SignupForm, SubscriptionBadge, buildPaths, changePasswordSchema, cn, createAccessClient, createForgotPasswordSchema, createLoginSchema, createMutationHook, createResetPasswordConfirmSchema, createSignupSchema, en, es, forgotPasswordSchema, isAuthError, loginSchema, magicLinkRequestSchema, magicLinkVerifySchema, passkeyRegisterStartSchema, removeStyles, resetPasswordConfirmSchema, resolveMessages, signupSchema, socialLoginSchema, useAccessClient, useAzirid, useBootstrap, useBranding, useChangePassword, useCheckout, useFormState, useInvoices, useLogin, useLogout, useMagicLink, useMessages, usePasskeys, usePasswordReset, usePasswordToggle, usePaymentProviders, usePayphoneConfirm, usePlans, useReferral, useReferralStats, useRefresh, useSession, useSignup, useSocialLogin, useSubmitTransferProof, useSubscription, useSwitchTenant, useTenantMembers, useTenants, useTransferProofs };
3317
3828
  //# sourceMappingURL=index.js.map
3318
3829
  //# sourceMappingURL=index.js.map