@tatchi-xyz/sdk 0.32.1 → 0.32.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/cjs/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-D2eRb2-S.css → PasskeyAuthMenu-mMygL3xX.css} +137 -47
  2. package/dist/cjs/react/components/PasskeyAuthMenu/PasskeyAuthMenu-mMygL3xX.css.map +1 -0
  3. package/dist/cjs/react/components/PasskeyAuthMenu/client.js +2 -3
  4. package/dist/cjs/react/components/PasskeyAuthMenu/client.js.map +1 -1
  5. package/dist/cjs/react/components/PasskeyAuthMenu/controller/mode.js +7 -2
  6. package/dist/cjs/react/components/PasskeyAuthMenu/controller/mode.js.map +1 -1
  7. package/dist/cjs/react/components/PasskeyAuthMenu/controller/usePasskeyAuthMenuController.js +4 -1
  8. package/dist/cjs/react/components/PasskeyAuthMenu/controller/usePasskeyAuthMenuController.js.map +1 -1
  9. package/dist/cjs/react/components/PasskeyAuthMenu/hydrationContext.js +20 -0
  10. package/dist/cjs/react/components/PasskeyAuthMenu/hydrationContext.js.map +1 -0
  11. package/dist/cjs/react/components/PasskeyAuthMenu/passkeyAuthMenuCompat.js +1 -1
  12. package/dist/cjs/react/components/PasskeyAuthMenu/shell.js +64 -30
  13. package/dist/cjs/react/components/PasskeyAuthMenu/shell.js.map +1 -1
  14. package/dist/cjs/react/components/PasskeyAuthMenu/skeleton.js +155 -101
  15. package/dist/cjs/react/components/PasskeyAuthMenu/skeleton.js.map +1 -1
  16. package/dist/cjs/react/components/PasskeyAuthMenu/ui/ContentSwitcher.js +5 -1
  17. package/dist/cjs/react/components/PasskeyAuthMenu/ui/ContentSwitcher.js.map +1 -1
  18. package/dist/cjs/react/index.js +2 -2
  19. package/dist/esm/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-qTHAv58Z.css → PasskeyAuthMenu-BihXvuII.css} +137 -47
  20. package/dist/esm/react/components/PasskeyAuthMenu/PasskeyAuthMenu-BihXvuII.css.map +1 -0
  21. package/dist/esm/react/components/PasskeyAuthMenu/client.js +2 -3
  22. package/dist/esm/react/components/PasskeyAuthMenu/client.js.map +1 -1
  23. package/dist/esm/react/components/PasskeyAuthMenu/controller/mode.js +7 -3
  24. package/dist/esm/react/components/PasskeyAuthMenu/controller/mode.js.map +1 -1
  25. package/dist/esm/react/components/PasskeyAuthMenu/controller/usePasskeyAuthMenuController.js +4 -1
  26. package/dist/esm/react/components/PasskeyAuthMenu/controller/usePasskeyAuthMenuController.js.map +1 -1
  27. package/dist/esm/react/components/PasskeyAuthMenu/hydrationContext.js +17 -0
  28. package/dist/esm/react/components/PasskeyAuthMenu/hydrationContext.js.map +1 -0
  29. package/dist/esm/react/components/PasskeyAuthMenu/passkeyAuthMenuCompat.js +1 -1
  30. package/dist/esm/react/components/PasskeyAuthMenu/shell.js +64 -30
  31. package/dist/esm/react/components/PasskeyAuthMenu/shell.js.map +1 -1
  32. package/dist/esm/react/components/PasskeyAuthMenu/skeleton.js +155 -101
  33. package/dist/esm/react/components/PasskeyAuthMenu/skeleton.js.map +1 -1
  34. package/dist/esm/react/components/PasskeyAuthMenu/ui/ContentSwitcher.js +5 -1
  35. package/dist/esm/react/components/PasskeyAuthMenu/ui/ContentSwitcher.js.map +1 -1
  36. package/dist/esm/react/index.js +2 -2
  37. package/dist/esm/react/styles/styles.css +136 -46
  38. package/dist/esm/wasm_vrf_worker/pkg/wasm_vrf_worker_bg.wasm +0 -0
  39. package/dist/types/src/react/components/PasskeyAuthMenu/client.d.ts +0 -1
  40. package/dist/types/src/react/components/PasskeyAuthMenu/client.d.ts.map +1 -1
  41. package/dist/types/src/react/components/PasskeyAuthMenu/controller/mode.d.ts +6 -1
  42. package/dist/types/src/react/components/PasskeyAuthMenu/controller/mode.d.ts.map +1 -1
  43. package/dist/types/src/react/components/PasskeyAuthMenu/controller/usePasskeyAuthMenuController.d.ts.map +1 -1
  44. package/dist/types/src/react/components/PasskeyAuthMenu/hydrationContext.d.ts +10 -0
  45. package/dist/types/src/react/components/PasskeyAuthMenu/hydrationContext.d.ts.map +1 -0
  46. package/dist/types/src/react/components/PasskeyAuthMenu/shell.d.ts +2 -1
  47. package/dist/types/src/react/components/PasskeyAuthMenu/shell.d.ts.map +1 -1
  48. package/dist/types/src/react/components/PasskeyAuthMenu/skeleton.d.ts +5 -1
  49. package/dist/types/src/react/components/PasskeyAuthMenu/skeleton.d.ts.map +1 -1
  50. package/dist/types/src/react/components/PasskeyAuthMenu/ui/ContentSwitcher.d.ts.map +1 -1
  51. package/dist/workers/offline-export-sw.js +156 -1
  52. package/dist/workers/wasm_vrf_worker_bg.wasm +0 -0
  53. package/dist/workers/web3authn-signer.worker.js +1360 -2
  54. package/dist/workers/web3authn-vrf.worker.js +2857 -2
  55. package/package.json +4 -2
  56. package/dist/cjs/react/components/PasskeyAuthMenu/PasskeyAuthMenu-D2eRb2-S.css.map +0 -1
  57. package/dist/esm/react/components/PasskeyAuthMenu/PasskeyAuthMenu-qTHAv58Z.css.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"skeleton.js","names":["React","PasskeyAuthMenuSkeleton: React.FC<PasskeyAuthMenuSkeletonProps>","useTheme","PasskeyAuthMenuThemeScope"],"sources":["../../../../../src/react/components/PasskeyAuthMenu/skeleton.tsx"],"sourcesContent":["import React from 'react';\nimport './PasskeyAuthMenu.css';\nimport { PasskeyAuthMenuThemeScope } from './themeScope';\nimport { useTheme } from '../theme';\n\nexport interface PasskeyAuthMenuSkeletonProps {\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport const PasskeyAuthMenuSkeletonInner = React.forwardRef<\n HTMLDivElement,\n PasskeyAuthMenuSkeletonProps\n>(({ className, style }, ref) => {\n return (\n <div\n ref={ref}\n className={`w3a-signup-menu-root w3a-skeleton${className ? ` ${className}` : ''}`}\n style={style}\n >\n <div className=\"w3a-header\">\n <div\n className=\"w3a-skeleton-block w3a-title-skeleton\"\n style={{ width: '60%', height: '24px', marginBottom: '8px' }}\n />\n <div\n className=\"w3a-skeleton-block w3a-subtitle-skeleton\"\n style={{ width: '80%', height: '16px' }}\n />\n </div>\n\n <div className=\"w3a-passkey-row\">\n <div className=\"w3a-input-pill w3a-skeleton-input\">\n <div\n className=\"w3a-skeleton-block\"\n style={{ width: '40%', height: '18px', marginLeft: '12px' }}\n />\n </div>\n </div>\n\n <div className=\"w3a-segmented-root\">\n <div className=\"w3a-seg-track\">\n <div className=\"w3a-seg-button\">Register</div>\n <div className=\"w3a-seg-button\">Login</div>\n <div className=\"w3a-seg-button\">Sync</div>\n </div>\n </div>\n\n <div className=\"w3a-seg-help-row\">\n <div\n className=\"w3a-skeleton-block\"\n style={{ width: '50%', height: '14px', margin: '0 auto' }}\n />\n </div>\n\n <div className=\"w3a-scan-device-row\">\n <div className=\"w3a-section-divider\">\n <div className=\"w3a-section-divider-text\">Already have an account?</div>\n </div>\n <div className=\"w3a-secondary-actions\">\n <button className=\"w3a-link-device-btn\" disabled>\n <div\n className=\"w3a-skeleton-block\"\n style={{\n width: '18px',\n height: '18px',\n marginRight: '8px',\n borderRadius: '4px',\n }}\n />\n Scan and Link Device\n </button>\n <button className=\"w3a-link-device-btn\" disabled>\n <div\n className=\"w3a-skeleton-block\"\n style={{\n width: '18px',\n height: '18px',\n marginRight: '8px',\n borderRadius: '9999px',\n }}\n />\n Recover Account with Email\n </button>\n </div>\n </div>\n </div>\n );\n});\nPasskeyAuthMenuSkeletonInner.displayName = 'PasskeyAuthMenuSkeletonInner';\n\nexport const PasskeyAuthMenuSkeleton: React.FC<PasskeyAuthMenuSkeletonProps> = (props) => {\n const { theme } = useTheme();\n return (\n <PasskeyAuthMenuThemeScope theme={theme}>\n <PasskeyAuthMenuSkeletonInner {...props} />\n </PasskeyAuthMenuThemeScope>\n );\n};\n\nexport default PasskeyAuthMenuSkeleton;\n"],"mappings":";;;;;;;;;;;AAUA,MAAa,+BAA+BA,cAAM,YAG/C,EAAE,WAAW,SAAS,QAAQ;AAC/B,QACE,4CAAC;EACM;EACL,WAAW,oCAAoC,YAAY,IAAI,cAAc;EACtE;;GAEP,4CAAC;IAAI,WAAU;eACb,2CAAC;KACC,WAAU;KACV,OAAO;MAAE,OAAO;MAAO,QAAQ;MAAQ,cAAc;;QAEvD,2CAAC;KACC,WAAU;KACV,OAAO;MAAE,OAAO;MAAO,QAAQ;;;;GAInC,2CAAC;IAAI,WAAU;cACb,2CAAC;KAAI,WAAU;eACb,2CAAC;MACC,WAAU;MACV,OAAO;OAAE,OAAO;OAAO,QAAQ;OAAQ,YAAY;;;;;GAKzD,2CAAC;IAAI,WAAU;cACb,4CAAC;KAAI,WAAU;;MACb,2CAAC;OAAI,WAAU;iBAAiB;;MAChC,2CAAC;OAAI,WAAU;iBAAiB;;MAChC,2CAAC;OAAI,WAAU;iBAAiB;;;;;GAIpC,2CAAC;IAAI,WAAU;cACb,2CAAC;KACC,WAAU;KACV,OAAO;MAAE,OAAO;MAAO,QAAQ;MAAQ,QAAQ;;;;GAInD,4CAAC;IAAI,WAAU;eACb,2CAAC;KAAI,WAAU;eACb,2CAAC;MAAI,WAAU;gBAA2B;;QAE5C,4CAAC;KAAI,WAAU;gBACb,4CAAC;MAAO,WAAU;MAAsB;iBACtC,2CAAC;OACC,WAAU;OACV,OAAO;QACL,OAAO;QACP,QAAQ;QACR,aAAa;QACb,cAAc;;UAEhB;SAGJ,4CAAC;MAAO,WAAU;MAAsB;iBACtC,2CAAC;OACC,WAAU;OACV,OAAO;QACL,OAAO;QACP,QAAQ;QACR,aAAa;QACb,cAAc;;UAEhB;;;;;;;AAQd,6BAA6B,cAAc;AAE3C,MAAaC,2BAAmE,UAAU;CACxF,MAAM,EAAE,UAAUC;AAClB,QACE,2CAACC;EAAiC;YAChC,2CAAC,gCAA6B,GAAI;;;AAKxC,uBAAe"}
1
+ {"version":3,"file":"skeleton.js","names":["React","AuthMenuMode","getModeTitle","ArrowLeftIcon","QRCodeIcon","MailIcon","PasskeyAuthMenuSkeleton: React.FC<PasskeyAuthMenuSkeletonProps>","useTheme","PasskeyAuthMenuThemeScope"],"sources":["../../../../../src/react/components/PasskeyAuthMenu/skeleton.tsx"],"sourcesContent":["import React from 'react';\nimport { ArrowLeftIcon, MailIcon } from './ui/icons';\nimport QRCodeIcon from '../QRCodeIcon';\nimport { PasskeyAuthMenuThemeScope } from './themeScope';\nimport { useTheme } from '../theme';\nimport { getModeTitle } from './controller/mode';\nimport { AuthMenuMode, type AuthMenuHeadings } from './types';\n\nexport interface PasskeyAuthMenuSkeletonProps {\n className?: string;\n style?: React.CSSProperties;\n /** Best-effort to match the hydrated UI default tab. */\n defaultMode?: AuthMenuMode;\n /** Best-effort to match the hydrated UI headings. */\n headings?: AuthMenuHeadings;\n}\n\nexport const PasskeyAuthMenuSkeletonInner = React.forwardRef<\n HTMLDivElement,\n PasskeyAuthMenuSkeletonProps\n>(({ className, style, defaultMode, headings }, ref) => {\n const mode = typeof defaultMode === 'number' ? defaultMode : AuthMenuMode.Register;\n const title = getModeTitle(mode, headings ?? null);\n const placeholder =\n mode === AuthMenuMode.Register\n ? 'Pick a username'\n : mode === AuthMenuMode.Sync\n ? 'Leave blank to discover accounts'\n : 'Enter your username';\n const segHelpText =\n mode === AuthMenuMode.Login\n ? 'Sign in with your passkey'\n : mode === AuthMenuMode.Sync\n ? 'Sync account (iCloud/Chrome sync)'\n : 'Create a new account';\n const segActiveWidth = 'calc((100% - 18px) / 3)';\n const segActiveX =\n mode === AuthMenuMode.Login\n ? `calc(5px + ${segActiveWidth} + 4px)`\n : mode === AuthMenuMode.Sync\n ? `calc(5px + ${segActiveWidth} + 4px + ${segActiveWidth} + 4px)`\n : '5px';\n\n return (\n <div\n ref={ref}\n className={`w3a-signup-menu-root w3a-skeleton${className ? ` ${className}` : ''}`}\n style={style}\n data-mode={mode}\n data-waiting=\"false\"\n data-scan-device=\"false\"\n data-email-recovery=\"false\"\n >\n <div className=\"w3a-content-switcher\">\n <button aria-label=\"Back\" type=\"button\" className=\"w3a-back-button\" disabled>\n <ArrowLeftIcon size={18} strokeWidth={2.25} style={{ display: 'block' }} />\n </button>\n\n <div className=\"w3a-content-area\">\n <div className=\"w3a-content-sizer\">\n <div className=\"w3a-signin-menu\">\n <div className=\"w3a-header\">\n <div>\n <div className=\"w3a-title\">{title.title}</div>\n <div className=\"w3a-subhead\">{title.subtitle}</div>\n </div>\n </div>\n\n <div className=\"w3a-passkey-row\">\n <div className=\"w3a-input-pill\">\n <div className=\"w3a-input-wrap\">\n <input\n type=\"text\"\n name=\"passkey\"\n disabled\n placeholder={placeholder}\n className=\"w3a-input\"\n aria-disabled=\"true\"\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n spellCheck={false}\n inputMode=\"text\"\n style={{ pointerEvents: 'none' }}\n />\n </div>\n </div>\n <div style={{ position: 'relative', display: 'inline-block' }}>\n <button aria-label=\"Continue\" type=\"button\" className=\"w3a-arrow-btn no-transition\" disabled />\n </div>\n </div>\n\n <div className=\"w3a-seg\">\n <div\n className=\"w3a-seg-active\"\n style={{\n width: segActiveWidth,\n transform: `translateX(${segActiveX})`,\n opacity: 0.9,\n background: 'var(--w3a-passkey-auth-menu2-seg-active-bg)',\n }}\n />\n <div className=\"w3a-seg-grid\">\n <button\n type=\"button\"\n aria-pressed={mode === AuthMenuMode.Register}\n className={`w3a-seg-btn${mode === AuthMenuMode.Register ? ' is-active' : ''} register`}\n disabled\n >\n Register\n </button>\n <button\n type=\"button\"\n aria-pressed={mode === AuthMenuMode.Login}\n className={`w3a-seg-btn${mode === AuthMenuMode.Login ? ' is-active' : ''} login`}\n disabled\n >\n Login\n </button>\n <button\n type=\"button\"\n aria-pressed={mode === AuthMenuMode.Sync}\n className={`w3a-seg-btn${mode === AuthMenuMode.Sync ? ' is-active' : ''} sync`}\n disabled\n >\n Sync\n </button>\n </div>\n </div>\n\n <div className=\"w3a-seg-help-row\">\n <div className=\"w3a-seg-help\" aria-live=\"polite\">\n {segHelpText}\n </div>\n </div>\n\n <div className=\"w3a-scan-device-row\">\n <div className=\"w3a-section-divider\">\n <span className=\"w3a-section-divider-text\">Already have an account?</span>\n </div>\n <div className=\"w3a-secondary-actions\">\n <button className=\"w3a-link-device-btn\" disabled>\n <QRCodeIcon width={18} height={18} strokeWidth={2} />\n Scan and Link Device\n </button>\n <button className=\"w3a-link-device-btn\" disabled>\n <MailIcon size={18} strokeWidth={2} style={{ display: 'block' }} />\n Recover Account with Email\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n});\nPasskeyAuthMenuSkeletonInner.displayName = 'PasskeyAuthMenuSkeletonInner';\n\nexport const PasskeyAuthMenuSkeleton: React.FC<PasskeyAuthMenuSkeletonProps> = (props) => {\n const { theme } = useTheme();\n return (\n <PasskeyAuthMenuThemeScope theme={theme}>\n <PasskeyAuthMenuSkeletonInner {...props} />\n </PasskeyAuthMenuThemeScope>\n );\n};\n\nexport default PasskeyAuthMenuSkeleton;\n"],"mappings":";;;;;;;;;;;;;;;AAiBA,MAAa,+BAA+BA,cAAM,YAG/C,EAAE,WAAW,OAAO,aAAa,YAAY,QAAQ;CACtD,MAAM,OAAO,OAAO,gBAAgB,WAAW,cAAcC,mCAAa;CAC1E,MAAM,QAAQC,0BAAa,MAAM,YAAY;CAC7C,MAAM,cACJ,SAASD,mCAAa,WAClB,oBACA,SAASA,mCAAa,OACpB,qCACA;CACR,MAAM,cACJ,SAASA,mCAAa,QAClB,8BACA,SAASA,mCAAa,OACpB,sCACA;CACR,MAAM,iBAAiB;CACvB,MAAM,aACJ,SAASA,mCAAa,QAClB,cAAc,eAAe,WAC7B,SAASA,mCAAa,OACpB,cAAc,eAAe,WAAW,eAAe,WACvD;AAER,QACE,2CAAC;EACM;EACL,WAAW,oCAAoC,YAAY,IAAI,cAAc;EACtE;EACP,aAAW;EACX,gBAAa;EACb,oBAAiB;EACjB,uBAAoB;YAEpB,4CAAC;GAAI,WAAU;cACb,2CAAC;IAAO,cAAW;IAAO,MAAK;IAAS,WAAU;IAAkB;cAClE,2CAACE;KAAc,MAAM;KAAI,aAAa;KAAM,OAAO,EAAE,SAAS;;OAGhE,2CAAC;IAAI,WAAU;cACb,2CAAC;KAAI,WAAU;eACb,4CAAC;MAAI,WAAU;;OACb,2CAAC;QAAI,WAAU;kBACb,4CAAC,oBACC,2CAAC;SAAI,WAAU;mBAAa,MAAM;YAClC,2CAAC;SAAI,WAAU;mBAAe,MAAM;;;OAIxC,4CAAC;QAAI,WAAU;mBACb,2CAAC;SAAI,WAAU;mBACb,2CAAC;UAAI,WAAU;oBACb,2CAAC;WACC,MAAK;WACL,MAAK;WACL;WACa;WACb,WAAU;WACV,iBAAc;WACd,gBAAe;WACf,aAAY;WACZ,YAAY;WACZ,WAAU;WACV,OAAO,EAAE,eAAe;;;YAI9B,2CAAC;SAAI,OAAO;UAAE,UAAU;UAAY,SAAS;;mBAC3C,2CAAC;UAAO,cAAW;UAAW,MAAK;UAAS,WAAU;UAA8B;;;;OAIxF,4CAAC;QAAI,WAAU;mBACb,2CAAC;SACC,WAAU;SACV,OAAO;UACL,OAAO;UACP,WAAW,cAAc,WAAW;UACpC,SAAS;UACT,YAAY;;YAGhB,4CAAC;SAAI,WAAU;;UACb,2CAAC;WACC,MAAK;WACL,gBAAc,SAASF,mCAAa;WACpC,WAAW,cAAc,SAASA,mCAAa,WAAW,eAAe,GAAG;WAC5E;qBACD;;UAGD,2CAAC;WACC,MAAK;WACL,gBAAc,SAASA,mCAAa;WACpC,WAAW,cAAc,SAASA,mCAAa,QAAQ,eAAe,GAAG;WACzE;qBACD;;UAGD,2CAAC;WACC,MAAK;WACL,gBAAc,SAASA,mCAAa;WACpC,WAAW,cAAc,SAASA,mCAAa,OAAO,eAAe,GAAG;WACxE;qBACD;;;;;OAML,2CAAC;QAAI,WAAU;kBACb,2CAAC;SAAI,WAAU;SAAe,aAAU;mBACrC;;;OAIL,4CAAC;QAAI,WAAU;mBACb,2CAAC;SAAI,WAAU;mBACb,2CAAC;UAAK,WAAU;oBAA2B;;YAE7C,4CAAC;SAAI,WAAU;oBACb,4CAAC;UAAO,WAAU;UAAsB;qBACtC,2CAACG;WAAW,OAAO;WAAI,QAAQ;WAAI,aAAa;cAAK;aAGvD,4CAAC;UAAO,WAAU;UAAsB;qBACtC,2CAACC;WAAS,MAAM;WAAI,aAAa;WAAG,OAAO,EAAE,SAAS;cAAa;;;;;;;;;;;AAYvF,6BAA6B,cAAc;AAE3C,MAAaC,2BAAmE,UAAU;CACxF,MAAM,EAAE,UAAUC;AAClB,QACE,2CAACC;EAAiC;YAChC,2CAAC,gCAA6B,GAAI;;;AAKxC,uBAAe"}
@@ -9,6 +9,10 @@ const ContentSwitcher = ({ waiting, waitingText = "Waiting for Passkey…", wait
9
9
  const switcherRef = react.default.useRef(null);
10
10
  const contentAreaRef = react.default.useRef(null);
11
11
  const sizerRef = react.default.useRef(null);
12
+ const isInitialMount = react.default.useRef(true);
13
+ react.default.useEffect(() => {
14
+ isInitialMount.current = false;
15
+ }, []);
12
16
  const prefersReducedMotion = react.default.useMemo(() => {
13
17
  if (typeof window === "undefined" || !("matchMedia" in window)) return false;
14
18
  return window.matchMedia("(prefers-reduced-motion: reduce)").matches;
@@ -94,7 +98,7 @@ const ContentSwitcher = ({ waiting, waitingText = "Waiting for Passkey…", wait
94
98
  children: emailRecoveryElement
95
99
  }),
96
100
  !waiting && !showScanDevice && !showEmailRecovery && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
97
- className: "w3a-signin-menu",
101
+ className: `w3a-signin-menu${isInitialMount.current ? " w3a-no-animation" : ""}`,
98
102
  children
99
103
  })
100
104
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"ContentSwitcher.js","names":["ContentSwitcher: React.FC<ContentSwitcherProps>","React"],"sources":["../../../../../../src/react/components/PasskeyAuthMenu/ui/ContentSwitcher.tsx"],"sourcesContent":["import React from 'react';\n\nexport interface ContentSwitcherProps {\n waiting: boolean;\n waitingText?: string;\n waitingSubtext?: string;\n waitingSDKEventsText?: string;\n showScanDevice?: boolean;\n showQRCodeElement?: React.ReactNode;\n showEmailRecovery?: boolean;\n emailRecoveryElement?: React.ReactNode;\n children: React.ReactNode;\n backButton?: React.ReactNode;\n}\n\nexport const ContentSwitcher: React.FC<ContentSwitcherProps> = ({\n waiting,\n waitingText = 'Waiting for Passkey…',\n waitingSubtext = '',\n waitingSDKEventsText = '',\n showScanDevice = false,\n showQRCodeElement,\n showEmailRecovery = false,\n emailRecoveryElement,\n children,\n backButton,\n}) => {\n // Animate height of the switcher as content changes\n const switcherRef = React.useRef<HTMLDivElement | null>(null);\n const contentAreaRef = React.useRef<HTMLDivElement | null>(null);\n const sizerRef = React.useRef<HTMLDivElement | null>(null);\n\n // Track whether user prefers reduced motion\n const prefersReducedMotion = React.useMemo(() => {\n if (typeof window === 'undefined' || !('matchMedia' in window)) return false;\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n }, []);\n\n // Helper to read current content height and apply to the switcher\n const syncHeight = React.useCallback(() => {\n const wrap = switcherRef.current;\n const sizer = sizerRef.current;\n if (!wrap || !sizer) return;\n // Use scrollHeight to capture intrinsic content size regardless of flex context\n const next = sizer.scrollHeight;\n if (prefersReducedMotion) {\n // Apply without animation\n wrap.style.transition = 'none';\n wrap.style.height = `${next}px`;\n // Force reflow then restore transition so future changes can animate\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n wrap.offsetHeight;\n wrap.style.transition = '';\n return;\n }\n // Normal path: let CSS transition handle the interpolation\n wrap.style.height = `${next}px`;\n }, [prefersReducedMotion]);\n\n // Observe size changes of the content area\n React.useLayoutEffect(() => {\n const area = contentAreaRef.current;\n const sizer = sizerRef.current;\n if (!area || !sizer) return;\n\n // Initial sync after mount/update\n syncHeight();\n\n // ResizeObserver to capture dynamic content changes (e.g., QR render)\n const ro = new ResizeObserver(() => {\n // Use rAF to coalesce layout reads/writes with rendering\n requestAnimationFrame(syncHeight);\n });\n ro.observe(sizer);\n\n // Re-sync after fonts load (text metrics can change)\n const fonts = document?.fonts;\n if (fonts?.ready) {\n fonts.ready.then(() => syncHeight()).catch(() => {});\n }\n\n // Also re-sync on window resize\n const onResize = () => syncHeight();\n window.addEventListener('resize', onResize);\n\n return () => {\n ro.disconnect();\n window.removeEventListener('resize', onResize);\n };\n }, [syncHeight, waiting, showScanDevice, showEmailRecovery, children, emailRecoveryElement]);\n\n return (\n <div ref={switcherRef} className=\"w3a-content-switcher\">\n {/* Back button - absolutely positioned overlay */}\n {backButton}\n\n {/* Content areas - conditionally rendered with smooth transitions */}\n <div ref={contentAreaRef} className=\"w3a-content-area\">\n <div ref={sizerRef} className=\"w3a-content-sizer\">\n {waiting && (\n <div className=\"w3a-waiting\">\n <div className=\"w3a-waiting-message\">\n <div className=\"w3a-waiting-text\">{waitingText}</div>\n {waitingSubtext.trim().length > 0 && (\n <div className=\"w3a-waiting-subtext\">{waitingSubtext}</div>\n )}\n {waitingSDKEventsText.trim().length > 0 && (\n <div className=\"w3a-waiting-sdk-events\">{waitingSDKEventsText}</div>\n )}\n </div>\n <div aria-label=\"Loading\" className=\"w3a-spinner\" />\n </div>\n )}\n\n {showScanDevice && <div className=\"w3a-scan-device-content\">{showQRCodeElement}</div>}\n\n {showEmailRecovery && <div className=\"w3a-email-recovery-content\">{emailRecoveryElement}</div>}\n\n {!waiting && !showScanDevice && !showEmailRecovery && (\n <div className=\"w3a-signin-menu\">{children}</div>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default ContentSwitcher;\n"],"mappings":";;;;;;;AAeA,MAAaA,mBAAmD,EAC9D,SACA,cAAc,wBACd,iBAAiB,IACjB,uBAAuB,IACvB,iBAAiB,OACjB,mBACA,oBAAoB,OACpB,sBACA,UACA,iBACI;CAEJ,MAAM,cAAcC,cAAM,OAA8B;CACxD,MAAM,iBAAiBA,cAAM,OAA8B;CAC3D,MAAM,WAAWA,cAAM,OAA8B;CAGrD,MAAM,uBAAuBA,cAAM,cAAc;AAC/C,MAAI,OAAO,WAAW,eAAe,EAAE,gBAAgB,QAAS,QAAO;AACvE,SAAO,OAAO,WAAW,oCAAoC;IAC5D;CAGH,MAAM,aAAaA,cAAM,kBAAkB;EACzC,MAAM,OAAO,YAAY;EACzB,MAAM,QAAQ,SAAS;AACvB,MAAI,CAAC,QAAQ,CAAC,MAAO;EAErB,MAAM,OAAO,MAAM;AACnB,MAAI,sBAAsB;AAExB,QAAK,MAAM,aAAa;AACxB,QAAK,MAAM,SAAS,GAAG,KAAK;AAG5B,QAAK;AACL,QAAK,MAAM,aAAa;AACxB;;AAGF,OAAK,MAAM,SAAS,GAAG,KAAK;IAC3B,CAAC;AAGJ,eAAM,sBAAsB;EAC1B,MAAM,OAAO,eAAe;EAC5B,MAAM,QAAQ,SAAS;AACvB,MAAI,CAAC,QAAQ,CAAC,MAAO;AAGrB;EAGA,MAAM,KAAK,IAAI,qBAAqB;AAElC,yBAAsB;;AAExB,KAAG,QAAQ;EAGX,MAAM,QAAQ,UAAU;AACxB,MAAI,OAAO,MACT,OAAM,MAAM,WAAW,cAAc,YAAY;EAInD,MAAM,iBAAiB;AACvB,SAAO,iBAAiB,UAAU;AAElC,eAAa;AACX,MAAG;AACH,UAAO,oBAAoB,UAAU;;IAEtC;EAAC;EAAY;EAAS;EAAgB;EAAmB;EAAU;;AAEtE,QACE,4CAAC;EAAI,KAAK;EAAa,WAAU;aAE9B,YAGD,2CAAC;GAAI,KAAK;GAAgB,WAAU;aAClC,4CAAC;IAAI,KAAK;IAAU,WAAU;;KAC3B,WACC,4CAAC;MAAI,WAAU;iBACb,4CAAC;OAAI,WAAU;;QACb,2CAAC;SAAI,WAAU;mBAAoB;;QAClC,eAAe,OAAO,SAAS,KAC9B,2CAAC;SAAI,WAAU;mBAAuB;;QAEvC,qBAAqB,OAAO,SAAS,KACpC,2CAAC;SAAI,WAAU;mBAA0B;;;UAG7C,2CAAC;OAAI,cAAW;OAAU,WAAU;;;KAIvC,kBAAkB,2CAAC;MAAI,WAAU;gBAA2B;;KAE5D,qBAAqB,2CAAC;MAAI,WAAU;gBAA8B;;KAElE,CAAC,WAAW,CAAC,kBAAkB,CAAC,qBAC/B,2CAAC;MAAI,WAAU;MAAmB"}
1
+ {"version":3,"file":"ContentSwitcher.js","names":["ContentSwitcher: React.FC<ContentSwitcherProps>","React"],"sources":["../../../../../../src/react/components/PasskeyAuthMenu/ui/ContentSwitcher.tsx"],"sourcesContent":["import React from 'react';\n\nexport interface ContentSwitcherProps {\n waiting: boolean;\n waitingText?: string;\n waitingSubtext?: string;\n waitingSDKEventsText?: string;\n showScanDevice?: boolean;\n showQRCodeElement?: React.ReactNode;\n showEmailRecovery?: boolean;\n emailRecoveryElement?: React.ReactNode;\n children: React.ReactNode;\n backButton?: React.ReactNode;\n}\n\nexport const ContentSwitcher: React.FC<ContentSwitcherProps> = ({\n waiting,\n waitingText = 'Waiting for Passkey…',\n waitingSubtext = '',\n waitingSDKEventsText = '',\n showScanDevice = false,\n showQRCodeElement,\n showEmailRecovery = false,\n emailRecoveryElement,\n children,\n backButton,\n}) => {\n // Animate height of the switcher as content changes\n const switcherRef = React.useRef<HTMLDivElement | null>(null);\n const contentAreaRef = React.useRef<HTMLDivElement | null>(null);\n const sizerRef = React.useRef<HTMLDivElement | null>(null);\n const isInitialMount = React.useRef(true);\n\n React.useEffect(() => {\n isInitialMount.current = false;\n }, []);\n\n // Track whether user prefers reduced motion\n const prefersReducedMotion = React.useMemo(() => {\n if (typeof window === 'undefined' || !('matchMedia' in window)) return false;\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n }, []);\n\n // Helper to read current content height and apply to the switcher\n const syncHeight = React.useCallback(() => {\n const wrap = switcherRef.current;\n const sizer = sizerRef.current;\n if (!wrap || !sizer) return;\n // Use scrollHeight to capture intrinsic content size regardless of flex context\n const next = sizer.scrollHeight;\n if (prefersReducedMotion) {\n // Apply without animation\n wrap.style.transition = 'none';\n wrap.style.height = `${next}px`;\n // Force reflow then restore transition so future changes can animate\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n wrap.offsetHeight;\n wrap.style.transition = '';\n return;\n }\n // Normal path: let CSS transition handle the interpolation\n wrap.style.height = `${next}px`;\n }, [prefersReducedMotion]);\n\n // Observe size changes of the content area\n React.useLayoutEffect(() => {\n const area = contentAreaRef.current;\n const sizer = sizerRef.current;\n if (!area || !sizer) return;\n\n // Initial sync after mount/update\n syncHeight();\n\n // ResizeObserver to capture dynamic content changes (e.g., QR render)\n const ro = new ResizeObserver(() => {\n // Use rAF to coalesce layout reads/writes with rendering\n requestAnimationFrame(syncHeight);\n });\n ro.observe(sizer);\n\n // Re-sync after fonts load (text metrics can change)\n const fonts = document?.fonts;\n if (fonts?.ready) {\n fonts.ready.then(() => syncHeight()).catch(() => { });\n }\n\n // Also re-sync on window resize\n const onResize = () => syncHeight();\n window.addEventListener('resize', onResize);\n\n return () => {\n ro.disconnect();\n window.removeEventListener('resize', onResize);\n };\n }, [syncHeight, waiting, showScanDevice, showEmailRecovery, children, emailRecoveryElement]);\n\n return (\n <div ref={switcherRef} className=\"w3a-content-switcher\">\n {/* Back button - absolutely positioned overlay */}\n {backButton}\n\n {/* Content areas - conditionally rendered with smooth transitions */}\n <div ref={contentAreaRef} className=\"w3a-content-area\">\n <div ref={sizerRef} className=\"w3a-content-sizer\">\n {waiting && (\n <div className=\"w3a-waiting\">\n <div className=\"w3a-waiting-message\">\n <div className=\"w3a-waiting-text\">{waitingText}</div>\n {waitingSubtext.trim().length > 0 && (\n <div className=\"w3a-waiting-subtext\">{waitingSubtext}</div>\n )}\n {waitingSDKEventsText.trim().length > 0 && (\n <div className=\"w3a-waiting-sdk-events\">{waitingSDKEventsText}</div>\n )}\n </div>\n <div aria-label=\"Loading\" className=\"w3a-spinner\" />\n </div>\n )}\n\n {showScanDevice && <div className=\"w3a-scan-device-content\">{showQRCodeElement}</div>}\n\n {showEmailRecovery && <div className=\"w3a-email-recovery-content\">{emailRecoveryElement}</div>}\n\n {!waiting && !showScanDevice && !showEmailRecovery && (\n <div className={`w3a-signin-menu${isInitialMount.current ? ' w3a-no-animation' : ''}`}>\n {children}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default ContentSwitcher;\n"],"mappings":";;;;;;;AAeA,MAAaA,mBAAmD,EAC9D,SACA,cAAc,wBACd,iBAAiB,IACjB,uBAAuB,IACvB,iBAAiB,OACjB,mBACA,oBAAoB,OACpB,sBACA,UACA,iBACI;CAEJ,MAAM,cAAcC,cAAM,OAA8B;CACxD,MAAM,iBAAiBA,cAAM,OAA8B;CAC3D,MAAM,WAAWA,cAAM,OAA8B;CACrD,MAAM,iBAAiBA,cAAM,OAAO;AAEpC,eAAM,gBAAgB;AACpB,iBAAe,UAAU;IACxB;CAGH,MAAM,uBAAuBA,cAAM,cAAc;AAC/C,MAAI,OAAO,WAAW,eAAe,EAAE,gBAAgB,QAAS,QAAO;AACvE,SAAO,OAAO,WAAW,oCAAoC;IAC5D;CAGH,MAAM,aAAaA,cAAM,kBAAkB;EACzC,MAAM,OAAO,YAAY;EACzB,MAAM,QAAQ,SAAS;AACvB,MAAI,CAAC,QAAQ,CAAC,MAAO;EAErB,MAAM,OAAO,MAAM;AACnB,MAAI,sBAAsB;AAExB,QAAK,MAAM,aAAa;AACxB,QAAK,MAAM,SAAS,GAAG,KAAK;AAG5B,QAAK;AACL,QAAK,MAAM,aAAa;AACxB;;AAGF,OAAK,MAAM,SAAS,GAAG,KAAK;IAC3B,CAAC;AAGJ,eAAM,sBAAsB;EAC1B,MAAM,OAAO,eAAe;EAC5B,MAAM,QAAQ,SAAS;AACvB,MAAI,CAAC,QAAQ,CAAC,MAAO;AAGrB;EAGA,MAAM,KAAK,IAAI,qBAAqB;AAElC,yBAAsB;;AAExB,KAAG,QAAQ;EAGX,MAAM,QAAQ,UAAU;AACxB,MAAI,OAAO,MACT,OAAM,MAAM,WAAW,cAAc,YAAY;EAInD,MAAM,iBAAiB;AACvB,SAAO,iBAAiB,UAAU;AAElC,eAAa;AACX,MAAG;AACH,UAAO,oBAAoB,UAAU;;IAEtC;EAAC;EAAY;EAAS;EAAgB;EAAmB;EAAU;;AAEtE,QACE,4CAAC;EAAI,KAAK;EAAa,WAAU;aAE9B,YAGD,2CAAC;GAAI,KAAK;GAAgB,WAAU;aAClC,4CAAC;IAAI,KAAK;IAAU,WAAU;;KAC3B,WACC,4CAAC;MAAI,WAAU;iBACb,4CAAC;OAAI,WAAU;;QACb,2CAAC;SAAI,WAAU;mBAAoB;;QAClC,eAAe,OAAO,SAAS,KAC9B,2CAAC;SAAI,WAAU;mBAAuB;;QAEvC,qBAAqB,OAAO,SAAS,KACpC,2CAAC;SAAI,WAAU;mBAA0B;;;UAG7C,2CAAC;OAAI,cAAW;OAAU,WAAU;;;KAIvC,kBAAkB,2CAAC;MAAI,WAAU;gBAA2B;;KAE5D,qBAAqB,2CAAC;MAAI,WAAU;gBAA8B;;KAElE,CAAC,WAAW,CAAC,kBAAkB,CAAC,qBAC/B,2CAAC;MAAI,WAAW,kBAAkB,eAAe,UAAU,sBAAsB;MAC9E"}
@@ -19,11 +19,11 @@ const require_types = require('./components/AccountMenuButton/types.js');
19
19
  const require_QRCodeScanner = require('./components/QRCodeScanner.js');
20
20
  const require_index$2 = require('./components/AccountMenuButton/index.js');
21
21
  const require_ShowQRCode = require('./components/ShowQRCode2.js');
22
+ const require_QRCodeIcon = require('./components/QRCodeIcon.js');
23
+ const require_authMenuTypes = require('./components/PasskeyAuthMenu/authMenuTypes.js');
22
24
  const require_skeleton = require('./components/PasskeyAuthMenu/skeleton.js');
23
25
  const require_preload = require('./components/PasskeyAuthMenu/preload.js');
24
26
  const require_shell = require('./components/PasskeyAuthMenu/shell.js');
25
- const require_authMenuTypes = require('./components/PasskeyAuthMenu/authMenuTypes.js');
26
- const require_QRCodeIcon = require('./components/QRCodeIcon.js');
27
27
  const require_client = require('./components/PasskeyAuthMenu/client.js');
28
28
 
29
29
  exports.AccountMenuButton = require_index$2.AccountMenuButton;
@@ -1,8 +1,14 @@
1
1
  /* Root container */
2
+ .w3a-no-animation {
3
+ animation: none !important;
4
+ transition: none !important;
5
+ }
6
+
2
7
  .w3a-signup-menu-root {
3
- /* JS sentinel used to avoid FOUC when CSS is still loading */
8
+ /* CSS sentinel (used by tests/diagnostics to confirm stylesheet is applied) */
4
9
  --w3a-pam2-css-ready: 1;
5
- position: relative; /* relative position to anchor back button */
10
+ position: relative;
11
+ /* relative position to anchor back button */
6
12
  width: min(100dvw, 420px);
7
13
  max-width: 100dvw;
8
14
  min-width: 330px;
@@ -44,15 +50,18 @@
44
50
  pointer-events: none;
45
51
  filter: blur(0.2px);
46
52
  }
53
+
47
54
  .w3a-back-button.is-visible {
48
55
  opacity: 1;
49
56
  pointer-events: auto;
50
57
  filter: none;
51
58
  }
59
+
52
60
  .w3a-back-button:hover {
53
61
  transform: scale(1.02);
54
62
  background: var(--w3a-colors-surface);
55
63
  }
64
+
56
65
  .w3a-back-button:active {
57
66
  transform: scale(0.96);
58
67
  }
@@ -140,7 +149,8 @@
140
149
  .w3a-content-switcher {
141
150
  display: flex;
142
151
  flex-direction: column;
143
- overflow: hidden; /* ensure smooth height animations without spillover */
152
+ overflow: hidden;
153
+ /* ensure smooth height animations without spillover */
144
154
  transition: height 260ms cubic-bezier(0.2, 0.8, 0.2, 1);
145
155
  will-change: height;
146
156
  }
@@ -152,7 +162,6 @@
152
162
  flex: 0 1 auto;
153
163
  display: flex;
154
164
  flex-direction: column;
155
- animation: fade-in 240ms ease-out;
156
165
  transition: height 260ms cubic-bezier(0.2, 0.8, 0.2, 1);
157
166
  }
158
167
 
@@ -170,7 +179,6 @@
170
179
  gap: 0px;
171
180
  min-height: 250px;
172
181
  width: 100%;
173
- animation: content-enter 240ms ease-in-out;
174
182
  }
175
183
 
176
184
  @keyframes content-enter {
@@ -178,6 +186,7 @@
178
186
  opacity: 0;
179
187
  transform: scale(0.98) translateY(6px);
180
188
  }
189
+
181
190
  to {
182
191
  opacity: 1;
183
192
  transform: scale(1) translateY(0);
@@ -188,6 +197,7 @@
188
197
  from {
189
198
  opacity: 0;
190
199
  }
200
+
191
201
  to {
192
202
  opacity: 1;
193
203
  }
@@ -199,6 +209,7 @@
199
209
  gap: 8px;
200
210
  margin-bottom: var(--w3a-spacing-sm);
201
211
  }
212
+
202
213
  .w3a-social-btn {
203
214
  height: 48px;
204
215
  flex: 1 1 0;
@@ -214,13 +225,16 @@
214
225
  /* no shadow requested */
215
226
  box-shadow: none;
216
227
  }
228
+
217
229
  .w3a-social-btn svg {
218
230
  color: var(--w3a-colors-textSecondary, #64748b);
219
231
  }
232
+
220
233
  .w3a-social-btn:hover {
221
234
  background: var(--w3a-colors-surface2);
222
235
  box-shadow: var(--w3a-shadows-sm);
223
236
  }
237
+
224
238
  .w3a-social-btn:hover svg {
225
239
  color: var(--w3a-colors-textPrimary, #1e293b);
226
240
  }
@@ -248,6 +262,7 @@
248
262
  overflow-x: hidden;
249
263
  transition: border-radius 150ms ease-in-out;
250
264
  }
265
+
251
266
  .w3a-input-pill.is-enabled {
252
267
  border-radius: 2rem 0.25rem 0.25rem 2rem;
253
268
  transition: border-radius 150ms ease-in-out;
@@ -259,8 +274,10 @@
259
274
  height: 32px;
260
275
  display: flex;
261
276
  align-items: center;
262
- min-width: 0; /* allow input to shrink inside flex container without clipping */
277
+ min-width: 0;
278
+ /* allow input to shrink inside flex container without clipping */
263
279
  }
280
+
264
281
  .w3a-input {
265
282
  width: 100%;
266
283
  height: 32px;
@@ -270,7 +287,8 @@
270
287
  color: var(--w3a-colors-textPrimary);
271
288
  font-size: 16px;
272
289
  padding: 0;
273
- min-width: 0; /* prevent overflow clipping in flex layouts */
290
+ min-width: 0;
291
+ /* prevent overflow clipping in flex layouts */
274
292
  }
275
293
 
276
294
  /* Absolute status message anchored to bottom-right of the input area */
@@ -289,15 +307,18 @@
289
307
  font-size: 16px;
290
308
  white-space: nowrap;
291
309
  pointer-events: none;
292
- visibility: hidden; /* React enables once measured */
310
+ visibility: hidden;
311
+ /* React enables once measured */
293
312
  will-change: left;
294
313
  transition: left 32ms ease;
295
314
  }
315
+
296
316
  .w3a-postfix.is-existing {
297
317
  color: var(--w3a-colors-success);
298
318
  }
319
+
299
320
  /* On focus, keep postfix subtle for readability */
300
- .w3a-input:focus ~ .w3a-postfix {
321
+ .w3a-input:focus~.w3a-postfix {
301
322
  color: var(--w3a-colors-textMuted);
302
323
  }
303
324
 
@@ -305,7 +326,8 @@
305
326
  display: flex;
306
327
  align-items: center;
307
328
  justify-content: center;
308
- width: 0; /* hidden footprint by default */
329
+ width: 0;
330
+ /* hidden footprint by default */
309
331
  padding: 0;
310
332
  background: transparent;
311
333
  border: 0;
@@ -321,13 +343,15 @@
321
343
  border: 6px solid var(--w3a-colors-colorBackground, #fff);
322
344
  height: 64px;
323
345
  transition: transform 150ms ease,
324
- background-color 150ms ease,
325
- border-radius 150ms ease,
326
- opacity 150ms ease,
327
- width 150ms ease-in-out;
346
+ background-color 150ms ease,
347
+ border-radius 150ms ease,
348
+ opacity 150ms ease,
349
+ width 150ms ease-in-out;
328
350
  }
351
+
329
352
  .w3a-arrow-btn.is-enabled {
330
- width: 100px; /* expand when enabled */
353
+ width: 100px;
354
+ /* expand when enabled */
331
355
  /* Prefer themed primary; fall back to legacy then a sane default */
332
356
  background: var(--w3a-colors-primary, #2563eb);
333
357
  border-radius: 2rem;
@@ -336,36 +360,42 @@
336
360
  visibility: visible;
337
361
  pointer-events: auto;
338
362
  transition: transform 150ms ease,
339
- background-color 150ms ease,
340
- border-radius 150ms ease,
341
- opacity 150ms ease,
342
- width 150ms ease-in-out;
363
+ background-color 150ms ease,
364
+ border-radius 150ms ease,
365
+ opacity 150ms ease,
366
+ width 150ms ease-in-out;
343
367
  }
368
+
344
369
  .w3a-arrow-btn.no-transition,
345
370
  .w3a-arrow-btn.no-transition.is-enabled {
346
371
  transition: none;
347
372
  }
373
+
348
374
  .w3a-arrow-btn .w3a-arrow-icon {
349
375
  color: #fff;
350
376
  }
377
+
351
378
  .w3a-arrow-btn.is-enabled:hover {
352
379
  /* transform: scale(1.02); */
353
380
  background: var(--w3a-colors-primaryHover, #1d4ed8);
354
381
  }
382
+
355
383
  .w3a-arrow-btn.is-enabled:active {
356
384
  transform: scale(0.96);
357
385
  }
386
+
358
387
  .w3a-arrow-btn:disabled {
359
388
  width: 0;
360
389
  cursor: not-allowed;
361
390
  opacity: 0.5;
362
391
  background: var(--w3a-colors-borderSecondary);
363
392
  transition: transform 150ms ease,
364
- background-color 150ms ease,
365
- border-radius 150ms ease,
366
- opacity 150ms ease,
367
- width 150ms ease-in-out;
393
+ background-color 150ms ease,
394
+ border-radius 150ms ease,
395
+ opacity 150ms ease,
396
+ width 150ms ease-in-out;
368
397
  }
398
+
369
399
  .w3a-arrow-btn .w3a-arrow-label {
370
400
  margin-left: 8px;
371
401
  font-weight: 600;
@@ -379,7 +409,7 @@
379
409
  justify-content: center;
380
410
  }
381
411
 
382
- .w3a-arrow-btn .stripe-arrow > .HoverArrow {
412
+ .w3a-arrow-btn .stripe-arrow>.HoverArrow {
383
413
  position: relative;
384
414
  margin-top: 0.1rem;
385
415
  margin-left: 8px;
@@ -389,23 +419,23 @@
389
419
  }
390
420
 
391
421
  /* Horizontal line: fades in on hover of the button */
392
- .w3a-arrow-btn .stripe-arrow > .HoverArrow .HoverArrow__linePath {
422
+ .w3a-arrow-btn .stripe-arrow>.HoverArrow .HoverArrow__linePath {
393
423
  opacity: 0;
394
424
  transition: opacity 120ms cubic-bezier(0.215, 0.61, 0.355, 1);
395
425
  }
396
426
 
397
427
  /* Chevron: nudges right and slightly scales on hover */
398
- .w3a-arrow-btn .stripe-arrow > .HoverArrow .HoverArrow__tipPath {
428
+ .w3a-arrow-btn .stripe-arrow>.HoverArrow .HoverArrow__tipPath {
399
429
  transition: transform 120ms cubic-bezier(0.215, 0.61, 0.355, 1);
400
430
  }
401
431
 
402
- .w3a-arrow-btn.is-enabled:hover .stripe-arrow > .HoverArrow .HoverArrow__linePath,
403
- .w3a-arrow-btn.is-enabled:focus-visible .stripe-arrow > .HoverArrow .HoverArrow__linePath {
432
+ .w3a-arrow-btn.is-enabled:hover .stripe-arrow>.HoverArrow .HoverArrow__linePath,
433
+ .w3a-arrow-btn.is-enabled:focus-visible .stripe-arrow>.HoverArrow .HoverArrow__linePath {
404
434
  opacity: 1;
405
435
  }
406
436
 
407
- .w3a-arrow-btn.is-enabled:hover .stripe-arrow > .HoverArrow .HoverArrow__tipPath,
408
- .w3a-arrow-btn.is-enabled:focus-visible .stripe-arrow > .HoverArrow .HoverArrow__tipPath {
437
+ .w3a-arrow-btn.is-enabled:hover .stripe-arrow>.HoverArrow .HoverArrow__tipPath,
438
+ .w3a-arrow-btn.is-enabled:focus-visible .stripe-arrow>.HoverArrow .HoverArrow__tipPath {
409
439
  transform: translateX(3px);
410
440
  }
411
441
 
@@ -419,6 +449,7 @@
419
449
  background: var(--w3a-colors-surface2);
420
450
  border-radius: var(--w3a-border-radius-xl);
421
451
  }
452
+
422
453
  .w3a-seg-active {
423
454
  position: absolute;
424
455
  top: 5px;
@@ -432,6 +463,7 @@
432
463
  will-change: transform, width;
433
464
  pointer-events: none;
434
465
  }
466
+
435
467
  .w3a-seg-grid {
436
468
  display: flex;
437
469
  gap: 4px;
@@ -439,6 +471,7 @@
439
471
  position: relative;
440
472
  z-index: 1;
441
473
  }
474
+
442
475
  .w3a-seg-btn {
443
476
  flex: 1 1 0;
444
477
  min-width: 0;
@@ -462,15 +495,19 @@
462
495
  padding: 0 14px;
463
496
  font-size: clamp(13px, 3.6vw, 15px);
464
497
  }
498
+
465
499
  .w3a-seg-btn:hover {
466
500
  transform: scale(1.02);
467
501
  }
502
+
468
503
  .w3a-seg-btn:active {
469
504
  transform: scale(0.98);
470
505
  }
506
+
471
507
  .w3a-seg-btn.is-active {
472
508
  color: var(--w3a-colors-textPrimary);
473
509
  }
510
+
474
511
  .w3a-seg-btn:focus-visible {
475
512
  box-shadow: 0 0 0 2px color-mix(in srgb, var(--w3a-colors-focus), transparent 60%);
476
513
  }
@@ -484,7 +521,9 @@
484
521
  }
485
522
 
486
523
  @supports (width: 1dvw) {
487
- .w3a-signup-menu-root { max-width: calc(100dvw - 0.25rem); }
524
+ .w3a-signup-menu-root {
525
+ max-width: calc(100dvw - 0.25rem);
526
+ }
488
527
  }
489
528
 
490
529
  .w3a-title {
@@ -550,19 +589,26 @@
550
589
  animation-delay: var(--w3a-waiting-delay, 0ms);
551
590
  animation-fill-mode: both;
552
591
  }
592
+
553
593
  .w3a-waiting-message {
554
594
  display: flex;
555
595
  flex-direction: column;
556
596
  align-items: center;
557
597
  gap: 6px;
558
598
  }
559
- .w3a-waiting-text { font-size: 18px; font-weight: 600; }
599
+
600
+ .w3a-waiting-text {
601
+ font-size: 18px;
602
+ font-weight: 600;
603
+ }
604
+
560
605
  .w3a-waiting-subtext {
561
606
  font-size: 12px;
562
607
  font-weight: 500;
563
608
  line-height: 1.35;
564
609
  color: color-mix(in srgb, var(--w3a-colors-textSecondary), var(--w3a-colors-textPrimary) 25%);
565
610
  }
611
+
566
612
  .w3a-waiting-sdk-events {
567
613
  font-size: 11px;
568
614
  font-weight: 500;
@@ -570,11 +616,12 @@
570
616
  white-space: pre-wrap;
571
617
  color: color-mix(in srgb, var(--w3a-colors-textSecondary), var(--w3a-colors-textPrimary) 15%);
572
618
  }
619
+
573
620
  .w3a-spinner {
574
621
  width: 36px;
575
622
  height: 36px;
576
623
  border-radius: 999px;
577
- border: 3px solid rgba(255,255,255,0.15);
624
+ border: 3px solid rgba(255, 255, 255, 0.15);
578
625
  border-top-color: var(--w3a-colors-primary);
579
626
  animation: w3a-spin 0.9s linear infinite;
580
627
  }
@@ -593,6 +640,7 @@
593
640
  width: 100%;
594
641
  overflow: hidden;
595
642
  animation: content-enter 240ms ease-out;
643
+ animation-fill-mode: both;
596
644
  }
597
645
 
598
646
  /* Ensure QR code content stays within bounds */
@@ -619,6 +667,7 @@
619
667
  align-items: center;
620
668
  justify-content: flex-end;
621
669
  }
670
+
622
671
  .w3a-status-message {
623
672
  font-size: 11px;
624
673
  font-weight: 500;
@@ -655,12 +704,14 @@
655
704
  margin: 6px 2px 6px;
656
705
  font-weight: 600;
657
706
  }
707
+
658
708
  .w3a-seg-help {
659
709
  font-size: 12px;
660
710
  color: color-mix(in srgb, var(--w3a-colors-textSecondary), var(--w3a-colors-textPrimary) 25%);
661
711
  margin: 0;
662
712
  margin-left: 0.75rem;
663
713
  }
714
+
664
715
  .w3a-seg-help-row {
665
716
  display: flex;
666
717
  align-items: center;
@@ -668,6 +719,7 @@
668
719
  gap: 12px;
669
720
  margin-top: 8px;
670
721
  }
722
+
671
723
  /* Tooltip for account existence status */
672
724
  .w3a-input-wrap .w3a-tooltip {
673
725
  position: absolute;
@@ -683,15 +735,18 @@
683
735
  transition: opacity 180ms ease, transform 200ms ease;
684
736
  z-index: 2;
685
737
  }
738
+
686
739
  .w3a-input-wrap .w3a-tooltip.is-visible {
687
740
  opacity: 0.8;
688
741
  transform: translateX(0px) scale(1);
689
742
  }
743
+
690
744
  .w3a-input-wrap .w3a-tooltip.is-error {
691
745
  color: var(--w3a-colors-error);
692
746
  background: var(--w3a-colors-colorBackground);
693
747
  /* background: color-mix(in srgb, var(--w3a-colors-error), transparent 90%); */
694
748
  }
749
+
695
750
  .w3a-input-wrap .w3a-tooltip.is-success {
696
751
  color: var(--w3a-colors-blue400);
697
752
  background: var(--w3a-colors-colorBackground);
@@ -699,13 +754,26 @@
699
754
  }
700
755
 
701
756
  @keyframes w3a-spin {
702
- from { transform: rotate(0deg); }
703
- to { transform: rotate(360deg); }
757
+ from {
758
+ transform: rotate(0deg);
759
+ }
760
+
761
+ to {
762
+ transform: rotate(360deg);
763
+ }
704
764
  }
705
765
 
706
766
  @keyframes w3a-ellipsis-dot {
707
- 0%, 80%, 100% { opacity: 0; }
708
- 40% { opacity: 1; }
767
+
768
+ 0%,
769
+ 80%,
770
+ 100% {
771
+ opacity: 0;
772
+ }
773
+
774
+ 40% {
775
+ opacity: 1;
776
+ }
709
777
  }
710
778
 
711
779
  .w3a-ellipsis {
@@ -718,24 +786,45 @@
718
786
  animation: w3a-ellipsis-dot 1.2s infinite;
719
787
  }
720
788
 
721
- .w3a-ellipsis-dot:nth-child(2) { animation-delay: 0.15s; }
722
- .w3a-ellipsis-dot:nth-child(3) { animation-delay: 0.3s; }
789
+ .w3a-ellipsis-dot:nth-child(2) {
790
+ animation-delay: 0.15s;
791
+ }
792
+
793
+ .w3a-ellipsis-dot:nth-child(3) {
794
+ animation-delay: 0.3s;
795
+ }
723
796
 
724
797
  /* Pop/bounce-in animation (kept for legacy classes) */
725
798
  @keyframes w3a-input-msg-pop {
726
- 0% { opacity: 0; transform: translateY(8px) scale(0.98); }
727
- 60% { opacity: 1; transform: translateY(-2px) scale(1.02); }
728
- 100% { opacity: 1; transform: translateY(0) scale(1); }
799
+ 0% {
800
+ opacity: 0;
801
+ transform: translateY(8px) scale(0.98);
802
+ }
803
+
804
+ 60% {
805
+ opacity: 1;
806
+ transform: translateY(-2px) scale(1.02);
807
+ }
808
+
809
+ 100% {
810
+ opacity: 1;
811
+ transform: translateY(0) scale(1);
812
+ }
729
813
  }
730
814
 
731
815
  @media (prefers-reduced-motion: reduce) {
732
- .w3a-input-msg.is-error { animation: none; }
733
- .w3a-ellipsis-dot { animation: none; opacity: 1; }
816
+ .w3a-input-msg.is-error {
817
+ animation: none;
818
+ }
819
+
820
+ .w3a-ellipsis-dot {
821
+ animation: none;
822
+ opacity: 1;
823
+ }
734
824
  }
735
825
 
736
826
  /* Button System */
737
- .w3a-scan-device-row {
738
- }
827
+ .w3a-scan-device-row {}
739
828
 
740
829
  .w3a-secondary-actions {
741
830
  display: flex;
@@ -814,6 +903,7 @@
814
903
  gap: 12px;
815
904
  min-height: 260px;
816
905
  animation: content-enter 240ms ease-out;
906
+ animation-fill-mode: both;
817
907
  }
818
908
 
819
909
  .w3a-email-recovery-title {
@@ -1008,4 +1098,4 @@
1008
1098
  }
1009
1099
 
1010
1100
 
1011
- /*# sourceMappingURL=PasskeyAuthMenu-qTHAv58Z.css.map*/
1101
+ /*# sourceMappingURL=PasskeyAuthMenu-BihXvuII.css.map*/