@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.
- package/dist/cjs/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-D2eRb2-S.css → PasskeyAuthMenu-mMygL3xX.css} +137 -47
- package/dist/cjs/react/components/PasskeyAuthMenu/PasskeyAuthMenu-mMygL3xX.css.map +1 -0
- package/dist/cjs/react/components/PasskeyAuthMenu/client.js +2 -3
- package/dist/cjs/react/components/PasskeyAuthMenu/client.js.map +1 -1
- package/dist/cjs/react/components/PasskeyAuthMenu/controller/mode.js +7 -2
- package/dist/cjs/react/components/PasskeyAuthMenu/controller/mode.js.map +1 -1
- package/dist/cjs/react/components/PasskeyAuthMenu/controller/usePasskeyAuthMenuController.js +4 -1
- package/dist/cjs/react/components/PasskeyAuthMenu/controller/usePasskeyAuthMenuController.js.map +1 -1
- package/dist/cjs/react/components/PasskeyAuthMenu/hydrationContext.js +20 -0
- package/dist/cjs/react/components/PasskeyAuthMenu/hydrationContext.js.map +1 -0
- package/dist/cjs/react/components/PasskeyAuthMenu/passkeyAuthMenuCompat.js +1 -1
- package/dist/cjs/react/components/PasskeyAuthMenu/shell.js +64 -30
- package/dist/cjs/react/components/PasskeyAuthMenu/shell.js.map +1 -1
- package/dist/cjs/react/components/PasskeyAuthMenu/skeleton.js +155 -101
- package/dist/cjs/react/components/PasskeyAuthMenu/skeleton.js.map +1 -1
- package/dist/cjs/react/components/PasskeyAuthMenu/ui/ContentSwitcher.js +5 -1
- package/dist/cjs/react/components/PasskeyAuthMenu/ui/ContentSwitcher.js.map +1 -1
- package/dist/cjs/react/index.js +2 -2
- package/dist/esm/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-qTHAv58Z.css → PasskeyAuthMenu-BihXvuII.css} +137 -47
- package/dist/esm/react/components/PasskeyAuthMenu/PasskeyAuthMenu-BihXvuII.css.map +1 -0
- package/dist/esm/react/components/PasskeyAuthMenu/client.js +2 -3
- package/dist/esm/react/components/PasskeyAuthMenu/client.js.map +1 -1
- package/dist/esm/react/components/PasskeyAuthMenu/controller/mode.js +7 -3
- package/dist/esm/react/components/PasskeyAuthMenu/controller/mode.js.map +1 -1
- package/dist/esm/react/components/PasskeyAuthMenu/controller/usePasskeyAuthMenuController.js +4 -1
- package/dist/esm/react/components/PasskeyAuthMenu/controller/usePasskeyAuthMenuController.js.map +1 -1
- package/dist/esm/react/components/PasskeyAuthMenu/hydrationContext.js +17 -0
- package/dist/esm/react/components/PasskeyAuthMenu/hydrationContext.js.map +1 -0
- package/dist/esm/react/components/PasskeyAuthMenu/passkeyAuthMenuCompat.js +1 -1
- package/dist/esm/react/components/PasskeyAuthMenu/shell.js +64 -30
- package/dist/esm/react/components/PasskeyAuthMenu/shell.js.map +1 -1
- package/dist/esm/react/components/PasskeyAuthMenu/skeleton.js +155 -101
- package/dist/esm/react/components/PasskeyAuthMenu/skeleton.js.map +1 -1
- package/dist/esm/react/components/PasskeyAuthMenu/ui/ContentSwitcher.js +5 -1
- package/dist/esm/react/components/PasskeyAuthMenu/ui/ContentSwitcher.js.map +1 -1
- package/dist/esm/react/index.js +2 -2
- package/dist/esm/react/styles/styles.css +136 -46
- package/dist/esm/wasm_vrf_worker/pkg/wasm_vrf_worker_bg.wasm +0 -0
- package/dist/types/src/react/components/PasskeyAuthMenu/client.d.ts +0 -1
- package/dist/types/src/react/components/PasskeyAuthMenu/client.d.ts.map +1 -1
- package/dist/types/src/react/components/PasskeyAuthMenu/controller/mode.d.ts +6 -1
- package/dist/types/src/react/components/PasskeyAuthMenu/controller/mode.d.ts.map +1 -1
- package/dist/types/src/react/components/PasskeyAuthMenu/controller/usePasskeyAuthMenuController.d.ts.map +1 -1
- package/dist/types/src/react/components/PasskeyAuthMenu/hydrationContext.d.ts +10 -0
- package/dist/types/src/react/components/PasskeyAuthMenu/hydrationContext.d.ts.map +1 -0
- package/dist/types/src/react/components/PasskeyAuthMenu/shell.d.ts +2 -1
- package/dist/types/src/react/components/PasskeyAuthMenu/shell.d.ts.map +1 -1
- package/dist/types/src/react/components/PasskeyAuthMenu/skeleton.d.ts +5 -1
- package/dist/types/src/react/components/PasskeyAuthMenu/skeleton.d.ts.map +1 -1
- package/dist/types/src/react/components/PasskeyAuthMenu/ui/ContentSwitcher.d.ts.map +1 -1
- package/dist/workers/offline-export-sw.js +156 -1
- package/dist/workers/wasm_vrf_worker_bg.wasm +0 -0
- package/dist/workers/web3authn-signer.worker.js +1360 -2
- package/dist/workers/web3authn-vrf.worker.js +2857 -2
- package/package.json +4 -2
- package/dist/cjs/react/components/PasskeyAuthMenu/PasskeyAuthMenu-D2eRb2-S.css.map +0 -1
- 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 './
|
|
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:
|
|
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
|
|
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"}
|
package/dist/cjs/react/index.js
CHANGED
|
@@ -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
|
-
/*
|
|
8
|
+
/* CSS sentinel (used by tests/diagnostics to confirm stylesheet is applied) */
|
|
4
9
|
--w3a-pam2-css-ready: 1;
|
|
5
|
-
position: relative;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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
|
|
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;
|
|
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
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
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;
|
|
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
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
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
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
403
|
-
.w3a-arrow-btn.is-enabled:focus-visible .stripe-arrow
|
|
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
|
|
408
|
-
.w3a-arrow-btn.is-enabled:focus-visible .stripe-arrow
|
|
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 {
|
|
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
|
-
|
|
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 {
|
|
703
|
-
|
|
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
|
-
|
|
708
|
-
|
|
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) {
|
|
722
|
-
|
|
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% {
|
|
727
|
-
|
|
728
|
-
|
|
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 {
|
|
733
|
-
|
|
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-
|
|
1101
|
+
/*# sourceMappingURL=PasskeyAuthMenu-BihXvuII.css.map*/
|