{
  "version": 3,
  "sources": ["../../src/web/pages/projects/components/settings/Header.tsx", "../../src/web/pages/projects/components/settings/Header.styles.ts", "../../src/web/pages/projects/components/settings/SettingsModalError.styles.ts", "../../src/web/pages/projects/components/settings/SettingsModalError.tsx", "../../src/web/pages/projects/components/settings/account/Passkeys.tsx", "../../src/web/pages/projects/components/settings/account/Passkeys.styles.ts", "../../src/web/pages/projects/components/settings/account/Profile.tsx", "../../src/web/pages/projects/components/settings/AvatarUpload.tsx", "../../src/web/pages/projects/components/settings/AvatarUpload.styles.ts", "../../src/web/pages/projects/components/settings/AvatarUploadFormInput.tsx", "../../src/web/pages/projects/components/settings/BigAvatarLayout.tsx", "../../src/web/pages/projects/components/settings/SettingsInput.styles.ts", "../../src/web/pages/projects/components/settings/SettingsInput.tsx", "../../src/web/pages/projects/components/settings/account/Profile.styles.ts", "../../src/web/pages/projects/components/settings/account/Sessions.tsx", "../../src/web/pages/projects/components/settings/account/Sessions.styles.ts"],
  "sourcesContent": ["import { Button, IconClose, SegmentedControl, SegmentedControlItem, Stack } from \"@framerjs/fresco\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport React from \"react\"\nimport * as styles from \"./Header.styles.ts\"\nimport { header as headerStyles } from \"./SettingsModal.styles.ts\"\n\nexport enum SettingsView {\n\tAccount = \"account\",\n\tWorkspace = \"workspace\",\n\tOrganization = \"organization\",\n}\ninterface Props {\n\tactiveView: SettingsView\n\tonSetActive: (active: SettingsView) => void\n\tonDismissModal: () => void\n\thasOrganization: boolean\n\thasWorkspace: boolean\n}\n\nexport const Header = React.memo(function Header({\n\tactiveView,\n\tonSetActive,\n\tonDismissModal,\n\thasOrganization,\n\thasWorkspace,\n}: Props) {\n\treturn (\n\t\t<Stack direction=\"row\" alignItems=\"center\" justifyContent=\"space-between\" padding=\"0 20px\" className={headerStyles}>\n\t\t\t<div className={styles.title}>{Dictionary.Settings}</div>\n\n\t\t\t{hasWorkspace && (\n\t\t\t\t<SegmentedControl unsaturated>\n\t\t\t\t\t<SegmentedControlItem\n\t\t\t\t\t\tkey={SettingsView.Account}\n\t\t\t\t\t\ttitle={Dictionary.Account}\n\t\t\t\t\t\tselected={activeView === SettingsView.Account}\n\t\t\t\t\t\tidentifier={SettingsView.Account}\n\t\t\t\t\t\tonSelect={onSetActive}\n\t\t\t\t\t\tclassName={styles.segmentedControlItem}\n\t\t\t\t\t/>\n\t\t\t\t\t<SegmentedControlItem\n\t\t\t\t\t\tkey={SettingsView.Workspace}\n\t\t\t\t\t\ttitle={Dictionary.Workspace}\n\t\t\t\t\t\tselected={activeView === SettingsView.Workspace}\n\t\t\t\t\t\tidentifier={SettingsView.Workspace}\n\t\t\t\t\t\tonSelect={onSetActive}\n\t\t\t\t\t\tclassName={styles.segmentedControlItem}\n\t\t\t\t\t/>\n\t\t\t\t\t{hasOrganization && (\n\t\t\t\t\t\t<SegmentedControlItem\n\t\t\t\t\t\t\tkey={SettingsView.Organization}\n\t\t\t\t\t\t\ttitle={Dictionary.Organization}\n\t\t\t\t\t\t\tselected={activeView === SettingsView.Organization}\n\t\t\t\t\t\t\tidentifier={SettingsView.Organization}\n\t\t\t\t\t\t\tonSelect={onSetActive}\n\t\t\t\t\t\t\tclassName={styles.segmentedControlItem}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</SegmentedControl>\n\t\t\t)}\n\t\t\t<Button title=\"Close\" variant=\"clean\" onClick={onDismissModal} className={styles.closeButton}>\n\t\t\t\t<IconClose />\n\t\t\t</Button>\n\t\t</Stack>\n\t)\n})\n", "import \"Header.styles_13md6jz.wyw.css\"; export const title = \"title_t5q5jqg\";\nexport const segmentedControlItem = \"segmentedControlItem_sh0mh2f\";\nexport const closeButton = \"closeButton_c8khz4i\";", "import \"SettingsModalError.styles_h1fgf.wyw.css\"; export const errorContainer = \"errorContainer_e1o8lfxn\";", "import { Button, ErrorState, IconErrorStateWarning, Stack, Translatable as T } from \"@framerjs/fresco\"\nimport * as styles from \"./SettingsModalError.styles.ts\"\n\ninterface Props {\n\tonReload: () => void\n}\nexport function SettingsModalError({ onReload }: Props) {\n\treturn (\n\t\t<Stack alignItems=\"center\" justifyContent=\"center\" gap={0} className={styles.errorContainer}>\n\t\t\t<ErrorState\n\t\t\t\tdescription={\n\t\t\t\t\t<>\n\t\t\t\t\t\t<T>We were unable to fetch your data.</T>\n\t\t\t\t\t\t<br />\n\t\t\t\t\t\t<T>Please check your internet connection and try again.</T>\n\t\t\t\t\t</>\n\t\t\t\t}\n\t\t\t\tinline\n\t\t\t\ticon={IconErrorStateWarning}\n\t\t\t\tbutton={<Button variant=\"primary\" onClick={onReload} title=\"Reload\" />}\n\t\t\t/>\n\t\t</Stack>\n\t)\n}\n", "import { Button, CheckBox, EmptyState, InputWrapper, Stack, Translatable as T, TextInput } from \"@framerjs/fresco\"\nimport { colors } from \"@framerjs/fresco/tokens\"\nimport { getLogger } from \"@framerjs/shared\"\nimport { WebAuthnError, type WebAuthnErrorCode, startRegistration } from \"@simplewebauthn/browser\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { useLocalStorageState } from \"document/components/chrome/debugbar/useLocalStorageState.tsx\"\nimport { RelativeTime } from \"document/components/chrome/siteSettings/RelativeTime.tsx\"\nimport React, { useCallback, useRef, useState } from \"react\"\nimport { useRecordEffect } from \"utils/useRecordEffect.ts\"\nimport type { Passkey } from \"web/lib/AccountSettings.ts\"\nimport { apiFetcher } from \"web/lib/apiFetcher.ts\"\nimport { HAS_PASSKEY_STORAGE_KEY, browserSupportsPasskeys } from \"web/lib/passkeys.ts\"\nimport { toast } from \"web/lib/toaster.ts\"\nimport { AccountSettingsPages } from \"web/lib/tracker.ts\"\nimport { useDarkMode } from \"web/lib/useDarkMode.ts\"\nimport { ConfirmationModalContext } from \"../team/utils/useConfirmationModal.ts\"\nimport * as styles from \"./Passkeys.styles.ts\"\n\nconst log = getLogger(\"passkeys\")\n\ninterface RegistrationErrorInfo {\n\tprimaryText: string\n\tsecondaryText: string\n\tshouldReport: boolean\n}\n\nfunction getRegistrationErrorInfo(err: unknown): RegistrationErrorInfo {\n\tconst code: WebAuthnErrorCode | undefined = err instanceof WebAuthnError ? err.code : undefined\n\n\tswitch (code) {\n\t\tcase \"ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED\":\n\t\t\treturn {\n\t\t\t\tprimaryText: \"Passkey already registered\",\n\t\t\t\tsecondaryText: \"to your account.\",\n\t\t\t\tshouldReport: false,\n\t\t\t}\n\t\tcase \"ERROR_CEREMONY_ABORTED\":\n\t\tcase \"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY\":\n\t\t\treturn {\n\t\t\t\tprimaryText: \"Passkey registration canceled,\",\n\t\t\t\tsecondaryText: \"please try again.\",\n\t\t\t\tshouldReport: false,\n\t\t\t}\n\t\tdefault:\n\t\t\treturn {\n\t\t\t\tprimaryText: \"Failed to register passkey,\",\n\t\t\t\tsecondaryText: \"please try again.\",\n\t\t\t\tshouldReport: true,\n\t\t\t}\n\t}\n}\n\nfunction DefaultPasskeyIcon({ padded = false }: { padded?: boolean }) {\n\treturn (\n\t\t<svg\n\t\t\tviewBox={padded ? \"0 0 30 30\" : \"6 6 18 18\"}\n\t\t\twidth=\"100%\"\n\t\t\theight=\"100%\"\n\t\t\tfill=\"none\"\n\t\t\taria-hidden=\"true\"\n\t\t\ttabIndex={-1}\n\t\t>\n\t\t\t<path\n\t\t\t\td=\"M21.26 8.74a5.93 5.93 0 0 0-9.82 6.02l-4.1 4.1c-.22.21-.34.52-.34.83v2.13c0 .65.53 1.18 1.19 1.18h2.37a.6.6 0 0 0 .59-.6v-1.18h1.18a.6.6 0 0 0 .6-.59v-1.18h1.18a.6.6 0 0 0 .42-.18l.7-.7c.6.19 1.22.28 1.84.28h.01a5.93 5.93 0 0 0 4.18-10.11Zm-2.7 3.9a1.19 1.19 0 1 1 0-2.38 1.19 1.19 0 0 1 0 2.37Z\"\n\t\t\t\tfill=\"currentColor\"\n\t\t\t/>\n\t\t</svg>\n\t)\n}\n\nfunction PasskeyIcon({ passkey, isDarkMode }: { passkey: Passkey; isDarkMode: boolean }) {\n\tconst iconSrc = isDarkMode ? passkey.iconDark : passkey.iconLight\n\treturn (\n\t\t<div className={styles.passkeyIcon}>\n\t\t\t{iconSrc ? (\n\t\t\t\t<img src={iconSrc} alt=\"\" className={styles.passkeyIconImg} decoding=\"async\" />\n\t\t\t) : (\n\t\t\t\t<DefaultPasskeyIcon padded={false} />\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\ninterface Props {\n\tpasskeys: Passkey[]\n\tonUpdate: () => Promise<void>\n\temailLoginDisabled?: boolean\n\tonEmailLoginDisabledChange?: (disabled: boolean) => Promise<void>\n}\n\nconst page = AccountSettingsPages.passkeys\n\nexport function Passkeys({ passkeys, onUpdate, emailLoginDisabled, onEmailLoginDisabledChange }: Props) {\n\tconst { showConfirmationModal, updateConfirmationModal } = React.useContext(ConfirmationModalContext)\n\tconst { isDarkMode } = useDarkMode()\n\tconst passkeyNameRef = useRef(\"\")\n\tconst [supportsPasskeys, setSupportsPasskeys] = useState(false)\n\tconst [isSsoEnabled, setIsSsoEnabled] = useState(false)\n\tconst [, setHasPasskey] = useLocalStorageState(HAS_PASSKEY_STORAGE_KEY, false)\n\n\tReact.useEffect(() => {\n\t\tvoid browserSupportsPasskeys.then(setSupportsPasskeys)\n\t}, [])\n\n\tReact.useEffect(() => {\n\t\tconst controller = new AbortController()\n\t\tapiFetcher\n\t\t\t.get(\"/auth/teams/domain\", undefined, controller.signal)\n\t\t\t.then((response: { isSsoEnabled?: boolean }) => {\n\t\t\t\tif (response.isSsoEnabled) {\n\t\t\t\t\tsetIsSsoEnabled(true)\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(() => {})\n\t\treturn () => controller.abort()\n\t}, [])\n\n\tuseRecordEffect(\"ui_impression\", { page })\n\n\tconst onPasskeyNameChange = useCallback(\n\t\t(value: string) => {\n\t\t\tpasskeyNameRef.current = value\n\t\t\tupdateConfirmationModal({ confirmButtonEnabled: value.trim().length > 0 })\n\t\t},\n\t\t[updateConfirmationModal],\n\t)\n\n\tconst registerPasskey = useCallback(async () => {\n\t\ttry {\n\t\t\tconst options = await apiFetcher.get(`/auth/passkeys/registration`)\n\t\t\tconst attestation = await startRegistration({ optionsJSON: options })\n\t\t\tconst register = await apiFetcher.post(`/auth/passkeys/registration`, attestation)\n\t\t\tif (!register.verified) {\n\t\t\t\ttoast({\n\t\t\t\t\tkey: \"passkey-registration\",\n\t\t\t\t\ttype: \"add\",\n\t\t\t\t\tvariant: \"error\",\n\t\t\t\t\tprimaryText: \"Passkey registration\",\n\t\t\t\t\tsecondaryText: \"could not be verified.\",\n\t\t\t\t\ticon: \"error\",\n\t\t\t\t\tduration: 5000,\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\t\t\tsetHasPasskey(true)\n\t\t\tawait onUpdate()\n\t\t} catch (err) {\n\t\t\tconst errorInfo = getRegistrationErrorInfo(err)\n\t\t\tif (errorInfo.shouldReport) {\n\t\t\t\tlog.reportError(err)\n\t\t\t}\n\t\t\ttoast({\n\t\t\t\tkey: \"passkey-registration\",\n\t\t\t\ttype: \"add\",\n\t\t\t\tvariant: \"error\",\n\t\t\t\tprimaryText: errorInfo.primaryText,\n\t\t\t\tsecondaryText: errorInfo.secondaryText,\n\t\t\t\ticon: \"error\",\n\t\t\t\tduration: 5000,\n\t\t\t})\n\t\t}\n\t}, [onUpdate, setHasPasskey])\n\n\tconst onEditPasskey = useCallback(\n\t\t(passkey: Passkey) => {\n\t\t\tpasskeyNameRef.current = passkey.name\n\t\t\tshowConfirmationModal({\n\t\t\t\ttitle: \"Rename Passkey\",\n\t\t\t\tdescription: <span className={styles.modalDescription}>Choose a new name for this passkey.</span>,\n\t\t\t\tchildren: (\n\t\t\t\t\t<InputWrapper>\n\t\t\t\t\t\t<TextInput\n\t\t\t\t\t\t\tplaceholder=\"e.g. MacBook Pro, YubiKey\"\n\t\t\t\t\t\t\tvalue={passkey.name}\n\t\t\t\t\t\t\tonChange={onPasskeyNameChange}\n\t\t\t\t\t\t\tconstantChange\n\t\t\t\t\t\t/>\n\t\t\t\t\t</InputWrapper>\n\t\t\t\t),\n\t\t\t\tconfirmLabel: Dictionary.Save,\n\t\t\t\tcancelLabel: Dictionary.Cancel,\n\t\t\t\tconfirmButtonEnabled: true,\n\t\t\t\tonConfirm: async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst name = passkeyNameRef.current.trim()\n\t\t\t\t\t\tawait apiFetcher.patch(`/auth/passkeys/${encodeURIComponent(passkey.id)}`, { name })\n\t\t\t\t\t\tawait onUpdate()\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tlog.reportError(error)\n\t\t\t\t\t\ttoast({\n\t\t\t\t\t\t\tkey: \"passkey-rename\",\n\t\t\t\t\t\t\ttype: \"add\",\n\t\t\t\t\t\t\tvariant: \"error\",\n\t\t\t\t\t\t\tprimaryText: \"Failed to rename\",\n\t\t\t\t\t\t\tsecondaryText: \"passkey. Please try again.\",\n\t\t\t\t\t\t\ticon: \"error\",\n\t\t\t\t\t\t\tduration: 5000,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t})\n\t\t},\n\t\t[showConfirmationModal, onPasskeyNameChange, onUpdate],\n\t)\n\n\tconst onRemovePasskey = useCallback(\n\t\t(passkey: Passkey) => {\n\t\t\tconst isLastPasskey = passkeys.length === 1\n\t\t\tshowConfirmationModal({\n\t\t\t\ttitle: \"Remove Passkey\",\n\t\t\t\tdescription: (\n\t\t\t\t\t<span className={styles.modalDescription}>\n\t\t\t\t\t\tAre you sure you want to remove <strong>{passkey.name}</strong>? You will no longer be able to sign in with\n\t\t\t\t\t\tit.\n\t\t\t\t\t</span>\n\t\t\t\t),\n\t\t\t\tvariant: \"destructive\",\n\t\t\t\tconfirmLabel: Dictionary.Remove,\n\t\t\t\tcancelLabel: Dictionary.Cancel,\n\t\t\t\tonConfirm: async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait apiFetcher.delete(`/auth/passkeys/${encodeURIComponent(passkey.id)}`)\n\t\t\t\t\t\tif (isLastPasskey) setHasPasskey(false)\n\t\t\t\t\t\tawait onUpdate()\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tlog.reportError(error)\n\t\t\t\t\t\ttoast({\n\t\t\t\t\t\t\tkey: \"passkey-remove\",\n\t\t\t\t\t\t\ttype: \"add\",\n\t\t\t\t\t\t\tvariant: \"error\",\n\t\t\t\t\t\t\tprimaryText: \"Failed to remove\",\n\t\t\t\t\t\t\tsecondaryText: \"passkey. Please try again.\",\n\t\t\t\t\t\t\ticon: \"error\",\n\t\t\t\t\t\t\tduration: 5000,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t})\n\t\t},\n\t\t[showConfirmationModal, onUpdate, passkeys.length, setHasPasskey],\n\t)\n\n\tconst handleEmailLoginDisabledChange = useCallback(\n\t\tasync (checked: boolean) => {\n\t\t\ttry {\n\t\t\t\tawait onEmailLoginDisabledChange?.(checked)\n\t\t\t} catch (err) {\n\t\t\t\tlog.reportError(err)\n\t\t\t\ttoast({\n\t\t\t\t\tkey: \"passkey-email-login-preference\",\n\t\t\t\t\ttype: \"add\",\n\t\t\t\t\tvariant: \"error\",\n\t\t\t\t\tprimaryText: \"Failed to update preference\",\n\t\t\t\t\tsecondaryText: \"Please try again.\",\n\t\t\t\t\ticon: \"error\",\n\t\t\t\t\tduration: 5000,\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\t[onEmailLoginDisabledChange],\n\t)\n\n\tconst addPasskeyButton = (\n\t\t<Button\n\t\t\tvariant=\"primary\"\n\t\t\ttitle={supportsPasskeys ? \"\" : \"Not supported by current browser\"}\n\t\t\tenabled={supportsPasskeys}\n\t\t\tonClick={registerPasskey}\n\t\t>\n\t\t\t<T>Add Passkey</T>\n\t\t</Button>\n\t)\n\n\tconst ssoWarning = isSsoEnabled ? (\n\t\t<div className={styles.ssoWarning}>\n\t\t\t<T>Passkeys cannot be used to log in when SSO is required</T>\n\t\t</div>\n\t) : null\n\n\tif (passkeys.length === 0) {\n\t\treturn (\n\t\t\t<Stack padding={30} gap={30} className={styles.container}>\n\t\t\t\t{ssoWarning}\n\t\t\t\t<div className={styles.emptyState}>\n\t\t\t\t\t<EmptyState\n\t\t\t\t\t\ticon={() => <DefaultPasskeyIcon padded />}\n\t\t\t\t\t\ticonLarge\n\t\t\t\t\t\ticonColor={colors.tint}\n\t\t\t\t\t\ticonBackgroundColor={colors.tintDimmed}\n\t\t\t\t\t\tfullWidthButton={false}\n\t\t\t\t\t\tbody={\n\t\t\t\t\t\t\t<span className={styles.emptyStateBody}>\n\t\t\t\t\t\t\t\t<T>Passkeys can be used as a highly&nbsp;secure and fast login alternative to magic&nbsp;links.</T>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmaxBodyWidth={200}\n\t\t\t\t\t\tbutton={addPasskeyButton}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</Stack>\n\t\t)\n\t}\n\n\treturn (\n\t\t<Stack padding={30} gap={30} className={styles.container}>\n\t\t\t{ssoWarning}\n\t\t\t{passkeys.map(passkey => (\n\t\t\t\t<Stack alignItems=\"center\" gap={10} direction=\"row\" className={styles.row} key={passkey.id}>\n\t\t\t\t\t<PasskeyIcon passkey={passkey} isDarkMode={isDarkMode} />\n\t\t\t\t\t<Stack gap={2} className={styles.description}>\n\t\t\t\t\t\t<div className={styles.title}>{passkey.name}</div>\n\t\t\t\t\t\t<div className={styles.label}>\n\t\t\t\t\t\t\t{passkey.lastUsedAt ? (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\tLast used <RelativeTime timestamp={passkey.lastUsedAt} />\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\"Never used\"\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</Stack>\n\t\t\t\t\t<Button className={styles.editButton} onClick={() => onEditPasskey(passkey)}>\n\t\t\t\t\t\t<T>Edit</T>\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tclassName={styles.removeButton}\n\t\t\t\t\t\tvariant=\"destructiveSecondary\"\n\t\t\t\t\t\tonClick={() => onRemovePasskey(passkey)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<T>Remove</T>\n\t\t\t\t\t</Button>\n\t\t\t\t</Stack>\n\t\t\t))}\n\t\t\t<Stack direction=\"row\" justifyContent=\"space-between\" alignItems=\"center\" className={styles.addButtonContainer}>\n\t\t\t\t{passkeys.length > 0 && onEmailLoginDisabledChange ? (\n\t\t\t\t\t<Stack direction=\"row\" alignItems=\"center\" gap={10}>\n\t\t\t\t\t\t<CheckBox\n\t\t\t\t\t\t\tid=\"passkeys-disable-email-login\"\n\t\t\t\t\t\t\tvalue={emailLoginDisabled ?? false}\n\t\t\t\t\t\t\tonChange={handleEmailLoginDisabledChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<label htmlFor=\"passkeys-disable-email-login\" className={styles.emailLoginLabel}>\n\t\t\t\t\t\t\t<T>Disable login with magic links</T>\n\t\t\t\t\t\t</label>\n\t\t\t\t\t</Stack>\n\t\t\t\t) : (\n\t\t\t\t\t<div />\n\t\t\t\t)}\n\t\t\t\t{addPasskeyButton}\n\t\t\t</Stack>\n\t\t</Stack>\n\t)\n}\n", "import \"Passkeys.styles_1oy8v88.wyw.css\"; export const container = \"container_c1hj1b7l\";\nexport const row = \"row_rsowpf\";\nexport const passkeyIcon = \"passkeyIcon_phfvcnm\";\nexport const passkeyIconImg = \"passkeyIconImg_pcf2fwe\";\nexport const description = \"description_d1d68f2d\";\nexport const title = \"title_t5i2g11\";\nexport const label = \"label_l17h5o6d\";\nexport const editButton = \"editButton_e1uni10v\";\nexport const removeButton = \"removeButton_rmryywp\";\nexport const addButtonContainer = \"addButtonContainer_a8l4kug\";\nexport const emailLoginLabel = \"emailLoginLabel_e1e4ng27\";\nexport const emptyState = \"emptyState_e6e1upv\";\nexport const emptyStateBody = \"emptyStateBody_e19adogt\";\nexport const modalDescription = \"modalDescription_m1l1h0go\";\nexport const ssoWarning = \"ssoWarning_sxbfvwx\";", "import { ApiError, openNewTab } from \"@framerjs/app-shared\"\nimport { Button, InputWrapper, Spacer, Stack, Translatable as T, TextInput } from \"@framerjs/fresco\"\nimport { colors } from \"@framerjs/fresco/tokens\"\nimport { getLogger } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport React, { useEffect, useState } from \"react\"\nimport { contactSupportURL } from \"utils/staticURLs.ts\"\nimport { useRecordEffect } from \"utils/useRecordEffect.ts\"\nimport { accessTokenRefresher } from \"web/lib/accessTokenRefresherWeb.ts\"\nimport { apiFetcher } from \"web/lib/apiFetcher.ts\"\nimport { toast } from \"web/lib/toaster.ts\"\nimport { signOut } from \"web/pages/projects/lib/signOut.ts\"\nimport type { Profile as AccountProfile, ProfileUpdate } from \"../../../../../lib/AccountSettings.ts\"\nimport { isValidEmail } from \"../../../../../lib/isValidEmail.ts\"\nimport { AccountSettingsPages } from \"../../../../../lib/tracker.ts\"\nimport { useDebounce } from \"../../../../../lib/useDebounce.ts\"\nimport { AvatarUpload } from \"../AvatarUpload.tsx\"\nimport { SettingsInput, SettingsLabel } from \"../SettingsInput.tsx\"\nimport { ConfirmationModalContext } from \"../team/utils/useConfirmationModal.ts\"\nimport * as styles from \"./Profile.styles.ts\"\n\nconst log = getLogger(\"app\")\n\ninterface Props {\n\tprofile: AccountProfile\n\tupdateProfile(update: ProfileUpdate): Promise<void>\n\tonAvatarUpload: (options: { avatar: File }) => void\n\tbigAvatar?: boolean\n}\n\nfunction isValidName(name: string) {\n\treturn name.trim() !== \"\"\n}\nconst page = AccountSettingsPages.profile\n\nexport function Profile({ profile, updateProfile, onAvatarUpload, bigAvatar }: Props) {\n\tuseRecordEffect(\"ui_impression\", { page })\n\n\tconst [firstName, setFirstName] = useState(profile.firstName)\n\tconst [lastName, setLastName] = useState(profile.lastName)\n\tconst [email, setEmail] = useState(profile.email)\n\tconst { showConfirmationModal, updateConfirmationModal } = React.useContext(ConfirmationModalContext)\n\tconst [showSuccessIndicator, setShowSuccessIndicator] = useState({\n\t\tfirstName: false,\n\t\tlastName: false,\n\t\temail: false,\n\t})\n\tconst [showUpdateFailed, setShowUpdateFailed] = useState({\n\t\tfirstName: false,\n\t\tlastName: false,\n\t\temail: false,\n\t})\n\tconst [showEmailPending, setShowEmailPending] = useState<boolean>(!!profile.pendingEmail)\n\n\tconst values: { firstName: string; lastName: string; email: string } = React.useMemo(\n\t\t() => ({ firstName, lastName, email }),\n\t\t[firstName, lastName, email],\n\t)\n\tconst changes = useDebounce(values, 1000)\n\n\tconst handleAvatarUpload = (avatar: File) => onAvatarUpload({ avatar })\n\n\tuseEffect(() => {\n\t\tif (!isValidEmail(changes.email) || !isValidName(changes.firstName) || !isValidName(changes.lastName)) return\n\n\t\tconst emailShouldUpdate =\n\t\t\tprofile.canUpdateEmail && profile.email !== changes.email && profile.pendingEmail !== changes.email\n\t\tconst firstNameShouldUpdate = profile.firstName !== changes.firstName\n\t\tconst lastNameShouldUpdate = profile.lastName !== changes.lastName\n\t\tif (!emailShouldUpdate && !firstNameShouldUpdate && !lastNameShouldUpdate) return\n\n\t\tupdateProfile({\n\t\t\tfirstName: changes.firstName,\n\t\t\tlastName: changes.lastName,\n\t\t\temail: emailShouldUpdate ? changes.email : undefined,\n\t\t})\n\t\t\t.then(() => {\n\t\t\t\tsetShowSuccessIndicator({\n\t\t\t\t\tfirstName: firstNameShouldUpdate,\n\t\t\t\t\tlastName: lastNameShouldUpdate,\n\t\t\t\t\temail: emailShouldUpdate,\n\t\t\t\t})\n\t\t\t\tsetShowUpdateFailed({\n\t\t\t\t\tfirstName: false,\n\t\t\t\t\tlastName: false,\n\t\t\t\t\temail: false,\n\t\t\t\t})\n\t\t\t\tif (emailShouldUpdate) {\n\t\t\t\t\tsetShowEmailPending(true)\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tsetShowUpdateFailed({\n\t\t\t\t\tfirstName: firstNameShouldUpdate,\n\t\t\t\t\tlastName: lastNameShouldUpdate,\n\t\t\t\t\temail: emailShouldUpdate,\n\t\t\t\t})\n\t\t\t})\n\t}, [changes, updateProfile, profile])\n\n\tuseEffect(() => {\n\t\tif (!showSuccessIndicator) return\n\t\tconst hideSuccessIndicator = setTimeout(\n\t\t\t() => setShowSuccessIndicator({ firstName: false, lastName: false, email: false }),\n\t\t\t3000,\n\t\t)\n\t\treturn () => {\n\t\t\tclearTimeout(hideSuccessIndicator)\n\t\t}\n\t}, [showSuccessIndicator, setShowSuccessIndicator])\n\n\tconst onDeleteAccountEmailChange = React.useCallback(\n\t\t(field: string) => {\n\t\t\tupdateConfirmationModal({ confirmButtonEnabled: field === email })\n\t\t},\n\t\t[updateConfirmationModal, email],\n\t)\n\n\tconst deleteAccount = async () => {\n\t\tconst onConfirm = async () => {\n\t\t\ttry {\n\t\t\t\tawait apiFetcher.delete(\"/account/profile\")\n\t\t\t\tsignOut(accessTokenRefresher)\n\t\t\t} catch (err) {\n\t\t\t\tif (err instanceof ApiError && err.status === 409) {\n\t\t\t\t\ttoast({\n\t\t\t\t\t\tkey: \"delete-account\",\n\t\t\t\t\t\ttype: \"add\",\n\t\t\t\t\t\tvariant: \"warning\",\n\t\t\t\t\t\tprimaryText: \"Can\u2019t delete account\",\n\t\t\t\t\t\tsecondaryText: \"with a subscription.\",\n\t\t\t\t\t\ticon: \"error\",\n\t\t\t\t\t\tduration: 5000,\n\t\t\t\t\t})\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tlog.reportError(err)\n\t\t\t\ttoast({\n\t\t\t\t\tkey: \"delete-account\",\n\t\t\t\t\ttype: \"add\",\n\t\t\t\t\tvariant: \"error\",\n\t\t\t\t\tprimaryText: \"Can\u2019t delete\",\n\t\t\t\t\tsecondaryText: \"account due to an error.\",\n\t\t\t\t\ticon: \"error\",\n\t\t\t\t\tduration: 5000,\n\t\t\t\t\taction: {\n\t\t\t\t\t\ttitle: \"Contact Support\",\n\t\t\t\t\t\tonClick: () => openNewTab(contactSupportURL),\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tshowConfirmationModal({\n\t\t\ttitle: \"Delete Account\",\n\t\t\tdescription:\n\t\t\t\t\"Deleting your account will remove your teams, projects, and account. Enter your email to confirm deletion. You\u2019ll be signed out of your account immediately.\",\n\t\t\tchildren: (\n\t\t\t\t<InputWrapper>\n\t\t\t\t\t<TextInput placeholder=\"Enter your email\" value=\"\" onChange={onDeleteAccountEmailChange} constantChange />\n\t\t\t\t</InputWrapper>\n\t\t\t),\n\t\t\tvariant: \"destructive\",\n\t\t\tcancelLabel: Dictionary.Cancel,\n\t\t\tconfirmLabel: Dictionary.Delete,\n\t\t\tconfirmButtonEnabled: false,\n\t\t\tonConfirm,\n\t\t})\n\t}\n\n\treturn (\n\t\t<Stack padding={30} className={styles.fullHeight}>\n\t\t\t<Stack gap={30} className={styles.fullHeight}>\n\t\t\t\t<Stack gap={15} alignItems=\"center\">\n\t\t\t\t\t{!bigAvatar && <SettingsLabel>Avatar</SettingsLabel>}\n\t\t\t\t\t<AvatarUpload\n\t\t\t\t\t\tonUpload={handleAvatarUpload}\n\t\t\t\t\t\tavatar={profile.avatar}\n\t\t\t\t\t\tcolor={colors.tint}\n\t\t\t\t\t\ttext={`${profile.firstName[0]}${profile.lastName[0]}`}\n\t\t\t\t\t\tbigAvatar\n\t\t\t\t\t/>\n\t\t\t\t</Stack>\n\t\t\t\t<Stack justifyContent=\"space-between\" className={styles.fullHeight} gap={0}>\n\t\t\t\t\t<Stack direction=\"column\" justifyContent=\"stretch\" alignItems=\"stretch\" gap={20}>\n\t\t\t\t\t\t<Stack className={styles.namesContainer}>\n\t\t\t\t\t\t\t<SettingsInput\n\t\t\t\t\t\t\t\tshowSuccessIndicator={showSuccessIndicator.firstName}\n\t\t\t\t\t\t\t\tplaceholder=\"Jane\"\n\t\t\t\t\t\t\t\tname=\"firstName\"\n\t\t\t\t\t\t\t\tlabel=\"First Name\"\n\t\t\t\t\t\t\t\tvalue={firstName}\n\t\t\t\t\t\t\t\tonChange={setFirstName}\n\t\t\t\t\t\t\t\terror={errorMessage(\"first name\", isValidName(firstName), showUpdateFailed.firstName)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<SettingsInput\n\t\t\t\t\t\t\t\tshowSuccessIndicator={showSuccessIndicator.lastName}\n\t\t\t\t\t\t\t\tplaceholder=\"Doe\"\n\t\t\t\t\t\t\t\tname=\"lastName\"\n\t\t\t\t\t\t\t\tlabel=\"Last Name\"\n\t\t\t\t\t\t\t\tvalue={lastName}\n\t\t\t\t\t\t\t\tonChange={setLastName}\n\t\t\t\t\t\t\t\terror={errorMessage(\"last name\", isValidName(lastName), showUpdateFailed.lastName)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t<Stack direction=\"column\" justifyContent=\"stretch\" alignItems=\"stretch\" gap={10}>\n\t\t\t\t\t\t\t<SettingsInput\n\t\t\t\t\t\t\t\tshowSuccessIndicator={showSuccessIndicator.email}\n\t\t\t\t\t\t\t\tenabled={profile.canUpdateEmail}\n\t\t\t\t\t\t\t\tplaceholder=\"name@example.com\"\n\t\t\t\t\t\t\t\tname=\"email\"\n\t\t\t\t\t\t\t\tlabel={Dictionary.Email}\n\t\t\t\t\t\t\t\tvalue={email}\n\t\t\t\t\t\t\t\tonChange={setEmail}\n\t\t\t\t\t\t\t\terror={errorMessage(\"email\", isValidEmail(email), showUpdateFailed.email)}\n\t\t\t\t\t\t\t\thelperText={<EmailDescription />}\n\t\t\t\t\t\t\t\thelperPosition=\"bottom\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{showEmailPending && (\n\t\t\t\t\t\t\t\t<div className={styles.emailSuccessIndicator}>Verification sent to {profile.pendingEmail}.</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t</Stack>\n\t\t\t\t\t<Spacer flex />\n\t\t\t\t\t<Stack direction=\"row\" justifyContent=\"space-between\">\n\t\t\t\t\t\t<Button className={styles.profileButtons} onClick={() => signOut(accessTokenRefresher)}>\n\t\t\t\t\t\t\t<T>Sign Out</T>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button className={styles.profileButtons} onClick={deleteAccount}>\n\t\t\t\t\t\t\t<T>Delete Account</T>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</Stack>\n\t\t\t\t</Stack>\n\t\t\t</Stack>\n\t\t</Stack>\n\t)\n}\n\nfunction errorMessage(fieldName: string, isValid: boolean, updateFailed: boolean): string | undefined {\n\tif (!isValid) {\n\t\treturn `Please enter a valid ${fieldName}`\n\t} else if (updateFailed) {\n\t\treturn `Changes to ${fieldName} could not be saved.`\n\t}\n}\n\nfunction EmailDescription() {\n\treturn (\n\t\t<>\n\t\t\t<T>This email address is associated with your Framer account.</T>\n\t\t\t<br />\n\t\t\t<T>To update your billing email, go to Workspace Settings \u2192 Plans.</T>\n\t\t</>\n\t)\n}\n", "import { Avatar, Button, IconDashboardModalCamera, Spinner, Stack, Translatable as T, Text } from \"@framerjs/fresco\"\nimport { fonts } from \"@framerjs/fresco/tokens\"\nimport type React from \"react\"\nimport { useCallback, useRef, useState } from \"react\"\nimport { toast } from \"web/lib/toaster.ts\"\nimport { generateResizedImage, getImageFromFile } from \"../../../../lib/files.ts\"\nimport * as styles from \"./AvatarUpload.styles.ts\"\nimport { AvatarUploadFormInput } from \"./AvatarUploadFormInput.tsx\"\nimport { BigAvatarLayout } from \"./BigAvatarLayout.tsx\"\n\ninterface Props {\n\tavatar?: string | null\n\ttext?: React.ReactNode\n\tcolor?: string\n\tcanEdit?: boolean\n\tonUpload: (avatar: File) => void\n\tbigAvatar?: boolean\n}\n\nconst avatarUploadFailedToastKey = \"avatar-upload-failed\"\nconst baseInputKey = \"avatar-upload\"\n\nexport function AvatarUpload({ avatar, text, color, canEdit = true, onUpload, bigAvatar }: Props) {\n\tconst [inputKey, setInputKey] = useState<string>(`${baseInputKey}-${Math.random()}`)\n\tconst [currentAvatar, setCurrentAvatar] = useState<string | undefined>(avatar || undefined)\n\tconst [avatarIsUploading, setAvatarIsUploading] = useState(false)\n\tconst avatarInputRef = useRef<HTMLInputElement>(null)\n\n\tconst removeAvatar = useCallback(() => {\n\t\tsetCurrentAvatar(undefined)\n\t}, [setCurrentAvatar])\n\n\tfunction handleAvatarUpload() {\n\t\tif (!avatarInputRef.current) return\n\t\ttoast({ key: avatarUploadFailedToastKey, type: \"remove\" })\n\t\tavatarInputRef.current.click()\n\t}\n\n\tasync function handleAvatarChange(event: React.ChangeEvent<HTMLInputElement>) {\n\t\tconst files = event.currentTarget.files\n\t\tif (!files) return\n\n\t\tconst file = files[0]\n\t\tif (!file || !file.type.match(/^image/u)) {\n\t\t\t// No image selected.\n\t\t\treturn\n\t\t}\n\n\t\tsetAvatarIsUploading(true)\n\n\t\tconst image = await getImageFromFile(file)\n\t\tconst resizedImage = await generateResizedImage(image)\n\t\tconst uploadedAvatar: File = resizedImage ? new File([resizedImage], \"avatar.png\", { type: \"image/png\" }) : file\n\n\t\ttry {\n\t\t\tawait onUpload(uploadedAvatar)\n\t\t\tsetCurrentAvatar(URL.createObjectURL(uploadedAvatar))\n\t\t} catch {\n\t\t\t// Force re-render, essentially clearing the file input, in order to\n\t\t\t// trigger this onChange event again\n\t\t\tsetInputKey(`${baseInputKey}-${Math.random()}`)\n\t\t\ttoast({\n\t\t\t\tkey: \"avatar-upload-failed\",\n\t\t\t\ttype: \"add\",\n\t\t\t\tvariant: \"error\",\n\t\t\t\ticon: \"error\",\n\t\t\t\tprimaryText: \"Failed to upload avatar.\",\n\t\t\t\tsecondaryText: \"Please retry.\",\n\t\t\t})\n\t\t}\n\t\tsetAvatarIsUploading(false)\n\t}\n\n\tconst renderBigAvatar = () => {\n\t\tif (currentAvatar === undefined) {\n\t\t\treturn (\n\t\t\t\t<Stack direction=\"row\" gap={10}>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tclassName={styles.iconCameraContainer}\n\t\t\t\t\t\tonClick={handleAvatarUpload}\n\t\t\t\t\t\tenabled={canEdit && !avatarIsUploading}\n\t\t\t\t\t>\n\t\t\t\t\t\t{avatarIsUploading ? <Spinner /> : <IconDashboardModalCamera />}\n\t\t\t\t\t\t<AvatarUploadFormInput\n\t\t\t\t\t\t\tinputKey={inputKey}\n\t\t\t\t\t\t\tavatarInputRef={avatarInputRef}\n\t\t\t\t\t\t\tcanEdit={canEdit}\n\t\t\t\t\t\t\thandleAvatarChange={handleAvatarChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Button>\n\t\t\t\t</Stack>\n\t\t\t)\n\t\t}\n\n\t\treturn <BigAvatarLayout currentAvatar={currentAvatar} text={text} color={color} onClick={removeAvatar} />\n\t}\n\n\tconst renderRegularAvatar = () => {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<Text size={fonts.size.base} lineHeight={1.2} className={styles.description}>\n\t\t\t\t\tMin. 200x200px, .PNG or .JPEG\n\t\t\t\t</Text>\n\t\t\t\t<Stack direction=\"row\" gap={10}>\n\t\t\t\t\t<Avatar src={currentAvatar} text={text} color={color} />\n\t\t\t\t\t<AvatarUploadFormInput\n\t\t\t\t\t\tinputKey={inputKey}\n\t\t\t\t\t\tavatarInputRef={avatarInputRef}\n\t\t\t\t\t\tcanEdit={canEdit}\n\t\t\t\t\t\thandleAvatarChange={handleAvatarChange}\n\t\t\t\t\t/>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\tonClick={handleAvatarUpload}\n\t\t\t\t\t\tenabled={canEdit && !avatarIsUploading}\n\t\t\t\t\t\tclassName={styles.avatarUploadButton}\n\t\t\t\t\t>\n\t\t\t\t\t\t{avatarIsUploading ? <Spinner /> : avatar ? <T>Change Image</T> : <T>Upload Image</T>}\n\t\t\t\t\t</Button>\n\t\t\t\t</Stack>\n\t\t\t</>\n\t\t)\n\t}\n\n\treturn bigAvatar ? renderBigAvatar() : renderRegularAvatar()\n}\n", "import \"AvatarUpload.styles_1rku5pr.wyw.css\"; export const avatarInputForm = \"avatarInputForm_aet88vi\";\nexport const description = \"description_d1qvfs77\";\nexport const avatarUploadButton = \"avatarUploadButton_a1vydnql\";\nexport const avatarContainer = \"avatarContainer_a1093ndc\";\nexport const buttonCancel = \"buttonCancel_bwy7q15\";\nexport const iconCameraContainer = \"iconCameraContainer_i1kh8j2i\";", "import type { ChangeEvent } from \"react\"\nimport type React from \"react\"\nimport * as styles from \"./AvatarUpload.styles.ts\"\n\ninterface Props {\n\tinputKey: string\n\tavatarInputRef: React.RefObject<HTMLInputElement>\n\tcanEdit: boolean\n\thandleAvatarChange: (event: ChangeEvent<HTMLInputElement>) => Promise<void>\n}\n\nexport const AvatarUploadFormInput = ({ inputKey, handleAvatarChange, avatarInputRef, canEdit }: Props) => {\n\treturn (\n\t\t<form className={styles.avatarInputForm}>\n\t\t\t<input\n\t\t\t\tkey={inputKey}\n\t\t\t\tdisabled={!canEdit}\n\t\t\t\tname=\"avatar\"\n\t\t\t\tid=\"avatar\"\n\t\t\t\tonChange={handleAvatarChange}\n\t\t\t\tref={avatarInputRef}\n\t\t\t\ttype=\"file\"\n\t\t\t\taccept=\"image/png, image/jpeg, image/gif\"\n\t\t\t/>\n\t\t</form>\n\t)\n}\n", "import { Avatar, Button, IconDashboardModalRemoveAvatar, Stack } from \"@framerjs/fresco\"\nimport React from \"react\"\nimport * as styles from \"./AvatarUpload.styles.ts\"\n\ninterface Props {\n\tcurrentAvatar: string | undefined\n\ttext?: React.ReactNode\n\tcolor?: string\n\tonClick: React.MouseEventHandler\n}\nexport const BigAvatarLayout: React.FC<Props> = React.memo(({ currentAvatar, text, color, onClick }) => {\n\treturn (\n\t\t<Stack direction=\"row\" gap={10}>\n\t\t\t<div className={styles.avatarContainer}>\n\t\t\t\t<Avatar src={currentAvatar} text={text} color={color} size=\"large\" />\n\t\t\t\t<Button className={styles.buttonCancel} onClick={onClick}>\n\t\t\t\t\t<IconDashboardModalRemoveAvatar />\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</Stack>\n\t)\n})\n", "import \"SettingsInput.styles_1g9kr8m.wyw.css\"; export const inputContainer = \"inputContainer_i7w2cxr\";\nexport const input = \"input_izz6931\";\nexport const label = \"label_lwrzmtq\";\nexport const successIndicator = \"successIndicator_s5kc7se\";\nexport const helperText = \"helperText_h1gkqf6v\";", "import {\n\tIconCheckmark,\n\tInputWrapper,\n\tInputWrapperError,\n\tStack,\n\tTranslatable as T,\n\tText,\n\tTextInput,\n} from \"@framerjs/fresco\"\nimport { fonts } from \"@framerjs/fresco/tokens\"\nimport { cx } from \"@linaria/core\"\nimport type React from \"react\"\nimport * as styles from \"./SettingsInput.styles.ts\"\n\ninterface InputProps {\n\thelperText?: React.ReactNode\n\terror: string | undefined\n\tenabled?: boolean\n\tlabel: string\n\tname: string\n\tplaceholder: string\n\tshowSuccessIndicator?: boolean\n\tvalue: string\n\tonChange: (value: string) => void\n\thelperPosition?: \"top\" | \"bottom\"\n}\n\nexport function SettingsLabel({ className, htmlFor, ...rest }: React.LabelHTMLAttributes<HTMLLabelElement>) {\n\treturn (\n\t\t<Text size={fonts.size.base} lineHeight={1.2} className={cx(styles.label, className)}>\n\t\t\t{/* biome-ignore lint/a11y/noLabelWithoutControl: Biome doesn\u2019t understand that the {...rest} spread includes accessible text */}\n\t\t\t<label htmlFor={htmlFor} {...rest} />\n\t\t</Text>\n\t)\n}\n\nexport function SettingsInput({\n\thelperText,\n\terror,\n\tenabled = true,\n\tlabel,\n\tname,\n\tplaceholder,\n\tshowSuccessIndicator,\n\tvalue,\n\tonChange,\n\thelperPosition = \"top\",\n}: InputProps) {\n\treturn (\n\t\t<Stack gap={10} className={styles.inputContainer}>\n\t\t\t<SettingsLabel htmlFor={name}>\n\t\t\t\t<T>{label}</T>\n\t\t\t</SettingsLabel>\n\t\t\t{helperText && helperPosition === \"top\" && (\n\t\t\t\t<Text lineHeight={1.5} size={fonts.size.base} className={styles.helperText}>\n\t\t\t\t\t{helperText}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t\t<Stack gap={helperText && helperPosition === \"bottom\" ? 13 : 6}>\n\t\t\t\t<InputWrapper hasError={!!error} large className={styles.input}>\n\t\t\t\t\t<TextInput\n\t\t\t\t\t\tenabled={enabled}\n\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\tname={name}\n\t\t\t\t\t\tid={name}\n\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\tconstantChange\n\t\t\t\t\t\tonChange={onChange}\n\t\t\t\t\t/>\n\t\t\t\t\t{showSuccessIndicator && (\n\t\t\t\t\t\t<div className={styles.successIndicator}>\n\t\t\t\t\t\t\t<IconCheckmark />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</InputWrapper>\n\t\t\t\t{helperText && helperPosition === \"bottom\" && (\n\t\t\t\t\t<Text lineHeight={1.5} size={fonts.size.base} className={styles.helperText}>\n\t\t\t\t\t\t{helperText}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t\t<InputWrapperError visible={!!error}>{error}</InputWrapperError>\n\t\t\t</Stack>\n\t\t</Stack>\n\t)\n}\n", "import \"Profile.styles_11a08dj.wyw.css\"; export const emailSuccessIndicator = \"emailSuccessIndicator_eyfi95i\";\nexport const profileButtons = \"profileButtons_p1rtf2ba\";\nexport const namesContainer = \"namesContainer_nmwnkoj\";\nexport const fullHeight = \"fullHeight_fwvfp3m\";", "import {\n\tButton,\n\tIconChrome,\n\tIconEdge,\n\tIconFirefox,\n\tIconMacOS,\n\tIconSafari,\n\tIconUnknownClient,\n\tStack,\n\tTranslatable as T,\n} from \"@framerjs/fresco\"\nimport { cx } from \"@linaria/core\"\nimport type React from \"react\"\nimport { useMemo } from \"react\"\nimport { useRecordEffect } from \"utils/useRecordEffect.ts\"\nimport type { Session } from \"../../../../../lib/AccountSettings.ts\"\nimport { AccountSettingsPages, UIInteraction, record } from \"../../../../../lib/tracker.ts\"\nimport * as styles from \"./Sessions.styles.ts\"\n\ninterface Props {\n\tsessions: Session[]\n\tendSession: (sessionId: string) => void\n}\n\n// Map session clients to names\nconst mapClientToName = (session: Session): string => {\n\tconst { client } = session\n\n\tif (!client) return \"Unknown Client\"\n\n\tconst os = client.os === \"Mac OS\" ? \"Mac\" : client.os\n\n\tswitch (client.type) {\n\t\tcase \"FramerWeb\":\n\t\t\treturn client.browser\n\t\tcase \"FramerDesktop\":\n\t\t\treturn `Framer for ${os}`\n\t\tcase \"FramerX\":\n\t\tcase \"FramerXBeta\":\n\t\tcase \"FramerXAlpha\":\n\t\tcase \"FramerXOmega\":\n\t\t\treturn \"Legacy Desktop\"\n\t\tdefault:\n\t\t\treturn \"Unknown Client\"\n\t}\n}\n\nconst mapClientToIcon = (session: Session): React.ReactNode => {\n\tconst { client } = session\n\n\tswitch (client?.browser) {\n\t\tcase \"Chrome\":\n\t\t\treturn <IconChrome />\n\t\tcase \"Firefox\":\n\t\t\treturn <IconFirefox />\n\t\tcase \"Safari\":\n\t\t\treturn <IconSafari />\n\t\tcase \"Edge\":\n\t\t\treturn <IconEdge />\n\t\tdefault:\n\t\t\tif (client?.os) return <IconMacOS />\n\t\t\treturn <IconUnknownClient />\n\t}\n}\nconst location = (session: Session) => {\n\tif (session.isCurrentSession) return \"Current session\"\n\treturn session.location && session.location.city !== \"\"\n\t\t? `Last seen near ${session.location.city}`\n\t\t: \"Unknown location\"\n}\n\nconst page = AccountSettingsPages.sessions\n\nexport function Sessions({ sessions, endSession }: Props) {\n\tuseRecordEffect(\"ui_impression\", { page })\n\n\tfunction handleClick(sessionId: string) {\n\t\trecord(\"ui_interaction\", { page, id: UIInteraction.endSession })\n\t\tendSession(sessionId)\n\t}\n\n\t// Move current session to top\n\tconst orderedSessions = useMemo(() => {\n\t\tconst currentSession = sessions.find(s => s.isCurrentSession)\n\t\tif (!currentSession) {\n\t\t\treturn sessions\n\t\t}\n\t\tconst sessionsExcludingCurrentSession = sessions.filter(session => !session.isCurrentSession)\n\t\treturn [currentSession, ...sessionsExcludingCurrentSession]\n\t}, [sessions])\n\n\treturn (\n\t\t<Stack padding=\"30px 30px 0\" gap={30} className={styles.sessionsContainer}>\n\t\t\t{orderedSessions.map(session => (\n\t\t\t\t<Stack alignItems=\"center\" gap={15} direction=\"row\" className={styles.sessionRow} key={session.id}>\n\t\t\t\t\t<div className={session.isCurrentSession ? styles.currentSessionIcon : styles.defaultIcon}>\n\t\t\t\t\t\t{mapClientToIcon(session)}\n\t\t\t\t\t</div>\n\t\t\t\t\t<Stack gap={2} className={styles.sessionDescription}>\n\t\t\t\t\t\t<div className={styles.sessionTitle}>{mapClientToName(session)}</div>\n\t\t\t\t\t\t<div className={cx(styles.sessionLocation, session.isCurrentSession && styles.currentSessionLocation)}>\n\t\t\t\t\t\t\t{location(session)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</Stack>\n\t\t\t\t\t{!session.isCurrentSession && (\n\t\t\t\t\t\t<Button className={styles.signOutButton} onClick={() => handleClick(session.id)}>\n\t\t\t\t\t\t\t<T>Sign Out</T>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t))}\n\t\t</Stack>\n\t)\n}\n", "import \"Sessions.styles_tyz5yu.wyw.css\"; export const sessionsContainer = \"sessionsContainer_s1p8vq7s\";\nexport const sessionRow = \"sessionRow_slghl07\";\nexport const sessionDescription = \"sessionDescription_s1c7ztjb\";\nexport const sessionTitle = \"sessionTitle_s665to1\";\nexport const sessionLocation = \"sessionLocation_s14zas1w\";\nexport const currentSessionLocation = \"currentSessionLocation_c131du9o\";\nexport const signOutButton = \"signOutButton_s6m39r2\";\nexport const currentSessionIcon = \"currentSessionIcon_c1ejq5df\";\nexport const defaultIcon = \"defaultIcon_d1fkbnxr\";"],
  "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,mBAAkB;;;ACF6B,IAAM,QAAQ;AACtD,IAAM,uBAAuB;AAC7B,IAAM,cAAc;;;AD0BxB;AATI,IAAM,SAAS,aAAAA,QAAM,KAAK,SAASC,QAAO;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAAU;AACT,SACC,6CAAC,SAAM,WAAU,OAAM,YAAW,UAAS,gBAAe,iBAAgB,SAAQ,UAAS,WAAW,QACrG;AAAA,gDAAC,SAAI,WAAkB,OAAQ,qCAAoB;AAAA,IAElD,gBACA,6CAAC,oBAAiB,aAAW,MAC5B;AAAA;AAAA,QAAC;AAAA;AAAA,UAEA;AAAA,UACA,UAAU,eAAe;AAAA,UACzB,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAkB;AAAA;AAAA,QALb;AAAA,MAMN;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UAEA;AAAA,UACA,UAAU,eAAe;AAAA,UACzB,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAkB;AAAA;AAAA,QALb;AAAA,MAMN;AAAA,MACC,mBACA;AAAA,QAAC;AAAA;AAAA,UAEA;AAAA,UACA,UAAU,eAAe;AAAA,UACzB,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAkB;AAAA;AAAA,QALb;AAAA,MAMN;AAAA,OAEF;AAAA,IAED,4CAAC,UAAO,OAAM,SAAQ,SAAQ,SAAQ,SAAS,gBAAgB,WAAkB,aAChF,sDAAC,aAAU,GACZ;AAAA,KACD;AAEF,CAAC;;;AEjEwD,IAAM,iBAAiB;;;ACW3E,IAAAC,sBAAA;AALE,SAAS,mBAAmB,EAAE,SAAS,GAAU;AACvD,SACC,6CAAC,SAAM,YAAW,UAAS,gBAAe,UAAS,KAAK,GAAG,WAAkB,gBAC5E;AAAA,IAAC;AAAA;AAAA,MACA,aACC,8EACC;AAAA,qDAAC,gBAAE,gDAAkC;AAAA,QACrC,6CAAC,QAAG;AAAA,QACJ,6CAAC,gBAAE,kEAAoD;AAAA,SACxD;AAAA,MAED,QAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ,6CAAC,UAAO,SAAQ,WAAU,SAAS,UAAU,OAAM,UAAS;AAAA;AAAA,EACrE,GACD;AAEF;;;AChBA,IAAAC,gBAAqD;;;ACPJ,IAAM,YAAY;AAC5D,IAAM,MAAM;AACZ,IAAM,cAAc;AACpB,IAAM,iBAAiB;AACvB,IAAM,cAAc;AACpB,IAAMC,SAAQ;AACd,IAAM,QAAQ;AACd,IAAM,aAAa;AACnB,IAAM,eAAe;AACrB,IAAM,qBAAqB;AAC3B,IAAM,kBAAkB;AACxB,IAAM,aAAa;AACnB,IAAM,iBAAiB;AACvB,IAAM,mBAAmB;AACzB,IAAM,aAAa;;;ADgDvB,IAAAC,sBAAA;AA5CH,IAAM,MAAM,UAAU,UAAU;AAQhC,SAAS,yBAAyB,KAAqC;AACtE,QAAM,OAAsC,eAAe,gBAAgB,IAAI,OAAO;AAEtF,UAAQ,MAAM;AAAA,IACb,KAAK;AACJ,aAAO;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,cAAc;AAAA,MACf;AAAA,IACD,KAAK;AAAA,IACL,KAAK;AACJ,aAAO;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,cAAc;AAAA,MACf;AAAA,IACD;AACC,aAAO;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,cAAc;AAAA,MACf;AAAA,EACF;AACD;AAEA,SAAS,mBAAmB,EAAE,SAAS,MAAM,GAAyB;AACrE,SACC;AAAA,IAAC;AAAA;AAAA,MACA,SAAS,SAAS,cAAc;AAAA,MAChC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,MAAK;AAAA,MACL,eAAY;AAAA,MACZ,UAAU;AAAA,MAEV;AAAA,QAAC;AAAA;AAAA,UACA,GAAE;AAAA,UACF,MAAK;AAAA;AAAA,MACN;AAAA;AAAA,EACD;AAEF;AAEA,SAAS,YAAY,EAAE,SAAS,WAAW,GAA8C;AACxF,QAAM,UAAU,aAAa,QAAQ,WAAW,QAAQ;AACxD,SACC,6CAAC,SAAI,WAAkB,aACrB,oBACA,6CAAC,SAAI,KAAK,SAAS,KAAI,IAAG,WAAkB,gBAAgB,UAAS,SAAQ,IAE7E,6CAAC,sBAAmB,QAAQ,OAAO,GAErC;AAEF;AASA,IAAM;AAEC,SAAS,SAAS,EAAE,UAAU,UAAU,oBAAoB,2BAA2B,GAAU;AACvG,QAAM,EAAE,uBAAuB,wBAAwB,IAAI,cAAAC,QAAM,WAAW,wBAAwB;AACpG,QAAM,EAAE,WAAW,IAAI,YAAY;AACnC,QAAM,qBAAiB,sBAAO,EAAE;AAChC,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,wBAAS,KAAK;AAC9D,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAS,KAAK;AACtD,QAAM,CAAC,EAAE,aAAa,IAAI,qBAAqB,yBAAyB,KAAK;AAE7E,gBAAAA,QAAM,UAAU,MAAM;AACrB,SAAK,wBAAwB,KAAK,mBAAmB;AAAA,EACtD,GAAG,CAAC,CAAC;AAEL,gBAAAA,QAAM,UAAU,MAAM;AACrB,UAAM,aAAa,IAAI,gBAAgB;AACvC,eACE,IAAI,sBAAsB,QAAW,WAAW,MAAM,EACtD,KAAK,CAAC,aAAyC;AAC/C,UAAI,SAAS,cAAc;AAC1B,wBAAgB,IAAI;AAAA,MACrB;AAAA,IACD,CAAC,EACA,MAAM,MAAM;AAAA,IAAC,CAAC;AAChB,WAAO,MAAM,WAAW,MAAM;AAAA,EAC/B,GAAG,CAAC,CAAC;AAEL,kBAAgB,iBAAiB,EAAE,KAAK,CAAC;AAEzC,QAAM,0BAAsB;AAAA,IAC3B,CAAC,UAAkB;AAClB,qBAAe,UAAU;AACzB,8BAAwB,EAAE,sBAAsB,MAAM,KAAK,EAAE,SAAS,EAAE,CAAC;AAAA,IAC1E;AAAA,IACA,CAAC,uBAAuB;AAAA,EACzB;AAEA,QAAM,sBAAkB,2BAAY,YAAY;AAC/C,QAAI;AACH,YAAM,UAAU,MAAM,WAAW,IAAI,6BAA6B;AAClE,YAAM,cAAc,MAAM,kBAAkB,EAAE,aAAa,QAAQ,CAAC;AACpE,YAAM,WAAW,MAAM,WAAW,KAAK,+BAA+B,WAAW;AACjF,UAAI,CAAC,SAAS,UAAU;AACvB,cAAM;AAAA,UACL,KAAK;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,aAAa;AAAA,UACb,eAAe;AAAA,UACf,MAAM;AAAA,UACN,UAAU;AAAA,QACX,CAAC;AACD;AAAA,MACD;AACA,oBAAc,IAAI;AAClB,YAAM,SAAS;AAAA,IAChB,SAAS,KAAK;AACb,YAAM,YAAY,yBAAyB,GAAG;AAC9C,UAAI,UAAU,cAAc;AAC3B,YAAI,YAAY,GAAG;AAAA,MACpB;AACA,YAAM;AAAA,QACL,KAAK;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aAAa,UAAU;AAAA,QACvB,eAAe,UAAU;AAAA,QACzB,MAAM;AAAA,QACN,UAAU;AAAA,MACX,CAAC;AAAA,IACF;AAAA,EACD,GAAG,CAAC,UAAU,aAAa,CAAC;AAE5B,QAAM,oBAAgB;AAAA,IACrB,CAAC,YAAqB;AACrB,qBAAe,UAAU,QAAQ;AACjC,4BAAsB;AAAA,QACrB,OAAO;AAAA,QACP,aAAa,6CAAC,UAAK,WAAkB,kBAAkB,iDAAmC;AAAA,QAC1F,UACC,6CAAC,gBACA;AAAA,UAAC;AAAA;AAAA,YACA,aAAY;AAAA,YACZ,OAAO,QAAQ;AAAA,YACf,UAAU;AAAA,YACV,gBAAc;AAAA;AAAA,QACf,GACD;AAAA,QAED;AAAA,QACA;AAAA,QACA,sBAAsB;AAAA,QACtB,WAAW,YAAY;AACtB,cAAI;AACH,kBAAM,OAAO,eAAe,QAAQ,KAAK;AACzC,kBAAM,WAAW,MAAM,kBAAkB,mBAAmB,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC;AACnF,kBAAM,SAAS;AAAA,UAChB,SAAS,OAAO;AACf,gBAAI,YAAY,KAAK;AACrB,kBAAM;AAAA,cACL,KAAK;AAAA,cACL,MAAM;AAAA,cACN,SAAS;AAAA,cACT,aAAa;AAAA,cACb,eAAe;AAAA,cACf,MAAM;AAAA,cACN,UAAU;AAAA,YACX,CAAC;AAAA,UACF;AAAA,QACD;AAAA,MACD,CAAC;AAAA,IACF;AAAA,IACA,CAAC,uBAAuB,qBAAqB,QAAQ;AAAA,EACtD;AAEA,QAAM,sBAAkB;AAAA,IACvB,CAAC,YAAqB;AACrB,YAAM,gBAAgB,SAAS,WAAW;AAC1C,4BAAsB;AAAA,QACrB,OAAO;AAAA,QACP,aACC,8CAAC,UAAK,WAAkB,kBAAkB;AAAA;AAAA,UACT,6CAAC,YAAQ,kBAAQ,MAAK;AAAA,UAAS;AAAA,WAEhE;AAAA,QAED,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,WAAW,YAAY;AACtB,cAAI;AACH,kBAAM,WAAW,OAAO,kBAAkB,mBAAmB,QAAQ,EAAE,CAAC,EAAE;AAC1E,gBAAI,cAAe,eAAc,KAAK;AACtC,kBAAM,SAAS;AAAA,UAChB,SAAS,OAAO;AACf,gBAAI,YAAY,KAAK;AACrB,kBAAM;AAAA,cACL,KAAK;AAAA,cACL,MAAM;AAAA,cACN,SAAS;AAAA,cACT,aAAa;AAAA,cACb,eAAe;AAAA,cACf,MAAM;AAAA,cACN,UAAU;AAAA,YACX,CAAC;AAAA,UACF;AAAA,QACD;AAAA,MACD,CAAC;AAAA,IACF;AAAA,IACA,CAAC,uBAAuB,UAAU,SAAS,QAAQ,aAAa;AAAA,EACjE;AAEA,QAAM,qCAAiC;AAAA,IACtC,OAAO,YAAqB;AAC3B,UAAI;AACH,cAAM,6BAA6B,OAAO;AAAA,MAC3C,SAAS,KAAK;AACb,YAAI,YAAY,GAAG;AACnB,cAAM;AAAA,UACL,KAAK;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,aAAa;AAAA,UACb,eAAe;AAAA,UACf,MAAM;AAAA,UACN,UAAU;AAAA,QACX,CAAC;AAAA,MACF;AAAA,IACD;AAAA,IACA,CAAC,0BAA0B;AAAA,EAC5B;AAEA,QAAM,mBACL;AAAA,IAAC;AAAA;AAAA,MACA,SAAQ;AAAA,MACR,OAAO,mBAAmB,KAAK;AAAA,MAC/B,SAAS;AAAA,MACT,SAAS;AAAA,MAET,uDAAC,gBAAE,yBAAW;AAAA;AAAA,EACf;AAGD,QAAMC,cAAa,eAClB,6CAAC,SAAI,WAAkB,YACtB,uDAAC,gBAAE,oEAAsD,GAC1D,IACG;AAEJ,MAAI,SAAS,WAAW,GAAG;AAC1B,WACC,8CAAC,SAAM,SAAS,IAAI,KAAK,IAAI,WAAkB,WAC7C;AAAA,MAAAA;AAAA,MACD,6CAAC,SAAI,WAAkB,YACtB;AAAA,QAAC;AAAA;AAAA,UACA,MAAM,MAAM,6CAAC,sBAAmB,QAAM,MAAC;AAAA,UACvC,WAAS;AAAA,UACT,WAAW,OAAO;AAAA,UAClB,qBAAqB,OAAO;AAAA,UAC5B,iBAAiB;AAAA,UACjB,MACC,6CAAC,UAAK,WAAkB,gBACvB,uDAAC,gBAAE,sGAA4F,GAChG;AAAA,UAED,cAAc;AAAA,UACd,QAAQ;AAAA;AAAA,MACT,GACD;AAAA,OACD;AAAA,EAEF;AAEA,SACC,8CAAC,SAAM,SAAS,IAAI,KAAK,IAAI,WAAkB,WAC7C;AAAA,IAAAA;AAAA,IACA,SAAS,IAAI,aACb,8CAAC,SAAM,YAAW,UAAS,KAAK,IAAI,WAAU,OAAM,WAAkB,KACrE;AAAA,mDAAC,eAAY,SAAkB,YAAwB;AAAA,MACvD,8CAAC,SAAM,KAAK,GAAG,WAAkB,aAChC;AAAA,qDAAC,SAAI,WAAkBC,QAAQ,kBAAQ,MAAK;AAAA,QAC5C,6CAAC,SAAI,WAAkB,OACrB,kBAAQ,aACR,8EAAE;AAAA;AAAA,UACS,6CAAC,gBAAa,WAAW,QAAQ,YAAY;AAAA,WACxD,IAEA,cAEF;AAAA,SACD;AAAA,MACA,6CAAC,UAAO,WAAkB,YAAY,SAAS,MAAM,cAAc,OAAO,GACzE,uDAAC,gBAAE,kBAAI,GACR;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACA,WAAkB;AAAA,UAClB,SAAQ;AAAA,UACR,SAAS,MAAM,gBAAgB,OAAO;AAAA,UAEtC,uDAAC,gBAAE,oBAAM;AAAA;AAAA,MACV;AAAA,SAvB+E,QAAQ,EAwBxF,CACA;AAAA,IACD,8CAAC,SAAM,WAAU,OAAM,gBAAe,iBAAgB,YAAW,UAAS,WAAkB,oBAC1F;AAAA,eAAS,SAAS,KAAK,6BACvB,8CAAC,SAAM,WAAU,OAAM,YAAW,UAAS,KAAK,IAC/C;AAAA;AAAA,UAAC;AAAA;AAAA,YACA,IAAG;AAAA,YACH,OAAO,sBAAsB;AAAA,YAC7B,UAAU;AAAA;AAAA,QACX;AAAA,QACA,6CAAC,WAAM,SAAQ,gCAA+B,WAAkB,iBAC/D,uDAAC,gBAAE,4CAA8B,GAClC;AAAA,SACD,IAEA,6CAAC,SAAI;AAAA,MAEL;AAAA,OACF;AAAA,KACD;AAEF;;;AE3VA,IAAAC,gBAA2C;;;ACF3C,IAAAC,gBAA8C;;;ACHO,IAAM,kBAAkB;AACtE,IAAMC,eAAc;AACpB,IAAM,qBAAqB;AAC3B,IAAM,kBAAkB;AACxB,IAAM,eAAe;AACrB,IAAM,sBAAsB;;;ACShC,IAAAC,sBAAA;AAHI,IAAM,wBAAwB,CAAC,EAAE,UAAU,oBAAoB,gBAAgB,QAAQ,MAAa;AAC1G,SACC,6CAAC,UAAK,WAAkB,iBACvB;AAAA,IAAC;AAAA;AAAA,MAEA,UAAU,CAAC;AAAA,MACX,MAAK;AAAA,MACL,IAAG;AAAA,MACH,UAAU;AAAA,MACV,KAAK;AAAA,MACL,MAAK;AAAA,MACL,QAAO;AAAA;AAAA,IAPF;AAAA,EAQN,GACD;AAEF;;;ACzBA,IAAAC,gBAAkB;AAYf,IAAAC,sBAAA;AAHI,IAAM,kBAAmC,cAAAC,QAAM,KAAK,CAAC,EAAE,eAAe,MAAM,OAAO,QAAQ,MAAM;AACvG,SACC,6CAAC,SAAM,WAAU,OAAM,KAAK,IAC3B,wDAAC,SAAI,WAAkB,iBACtB;AAAA,iDAAC,UAAO,KAAK,eAAe,MAAY,OAAc,MAAK,SAAQ;AAAA,IACnE,6CAAC,UAAO,WAAkB,cAAc,SACvC,uDAAC,kCAA+B,GACjC;AAAA,KACD,GACD;AAEF,CAAC;;;AHwDI,IAAAC,sBAAA;AA1DL,IAAM,6BAA6B;AACnC,IAAM,eAAe;AAEd,SAAS,aAAa,EAAE,QAAQ,MAAM,OAAO,UAAU,MAAM,UAAU,UAAU,GAAU;AACjG,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAiB,GAAG,YAAY,IAAI,KAAK,OAAO,CAAC,EAAE;AACnF,QAAM,CAAC,eAAe,gBAAgB,QAAI,wBAA6B,UAAU,MAAS;AAC1F,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,wBAAS,KAAK;AAChE,QAAM,qBAAiB,sBAAyB,IAAI;AAEpD,QAAM,mBAAe,2BAAY,MAAM;AACtC,qBAAiB,MAAS;AAAA,EAC3B,GAAG,CAAC,gBAAgB,CAAC;AAErB,WAAS,qBAAqB;AAC7B,QAAI,CAAC,eAAe,QAAS;AAC7B,UAAM,EAAE,KAAK,4BAA4B,MAAM,SAAS,CAAC;AACzD,mBAAe,QAAQ,MAAM;AAAA,EAC9B;AAEA,iBAAe,mBAAmB,OAA4C;AAC7E,UAAM,QAAQ,MAAM,cAAc;AAClC,QAAI,CAAC,MAAO;AAEZ,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,MAAM,SAAS,GAAG;AAEzC;AAAA,IACD;AAEA,yBAAqB,IAAI;AAEzB,UAAM,QAAQ,MAAM,iBAAiB,IAAI;AACzC,UAAM,eAAe,MAAM,qBAAqB,KAAK;AACrD,UAAM,iBAAuB,eAAe,IAAI,KAAK,CAAC,YAAY,GAAG,cAAc,EAAE,MAAM,YAAY,CAAC,IAAI;AAE5G,QAAI;AACH,YAAM,SAAS,cAAc;AAC7B,uBAAiB,IAAI,gBAAgB,cAAc,CAAC;AAAA,IACrD,QAAQ;AAGP,kBAAY,GAAG,YAAY,IAAI,KAAK,OAAO,CAAC,EAAE;AAC9C,YAAM;AAAA,QACL,KAAK;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,MAChB,CAAC;AAAA,IACF;AACA,yBAAqB,KAAK;AAAA,EAC3B;AAEA,QAAM,kBAAkB,MAAM;AAC7B,QAAI,kBAAkB,QAAW;AAChC,aACC,6CAAC,SAAM,WAAU,OAAM,KAAK,IAC3B;AAAA,QAAC;AAAA;AAAA,UACA,WAAkB;AAAA,UAClB,SAAS;AAAA,UACT,SAAS,WAAW,CAAC;AAAA,UAEpB;AAAA,gCAAoB,6CAAC,WAAQ,IAAK,6CAAC,4BAAyB;AAAA,YAC7D;AAAA,cAAC;AAAA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA;AAAA,YACD;AAAA;AAAA;AAAA,MACD,GACD;AAAA,IAEF;AAEA,WAAO,6CAAC,mBAAgB,eAA8B,MAAY,OAAc,SAAS,cAAc;AAAA,EACxG;AAEA,QAAM,sBAAsB,MAAM;AACjC,WACC,8EACC;AAAA,mDAAC,QAAK,MAAM,MAAM,KAAK,MAAM,YAAY,KAAK,WAAkBC,cAAa,2CAE7E;AAAA,MACA,8CAAC,SAAM,WAAU,OAAM,KAAK,IAC3B;AAAA,qDAAC,UAAO,KAAK,eAAe,MAAY,OAAc;AAAA,QACtD;AAAA,UAAC;AAAA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACA,SAAQ;AAAA,YACR,SAAS;AAAA,YACT,SAAS,WAAW,CAAC;AAAA,YACrB,WAAkB;AAAA,YAEjB,8BAAoB,6CAAC,WAAQ,IAAK,SAAS,6CAAC,gBAAE,0BAAY,IAAO,6CAAC,gBAAE,0BAAY;AAAA;AAAA,QAClF;AAAA,SACD;AAAA,OACD;AAAA,EAEF;AAEA,SAAO,YAAY,gBAAgB,IAAI,oBAAoB;AAC5D;;;AI7HsD,IAAM,iBAAiB;AACtE,IAAM,QAAQ;AACd,IAAMC,SAAQ;AACd,IAAM,mBAAmB;AACzB,IAAM,aAAa;;;AC2BvB,IAAAC,sBAAA;AAJI,SAAS,cAAc,EAAE,WAAW,SAAS,GAAG,KAAK,GAAgD;AAC3G,SACC,6CAAC,QAAK,MAAM,MAAM,KAAK,MAAM,YAAY,KAAK,WAAW,WAAUC,QAAO,SAAS,GAElF,uDAAC,WAAM,SAAmB,GAAG,MAAM,GACpC;AAEF;AAEO,SAAS,cAAc;AAAA,EAC7B,YAAAC;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,OAAAD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AAClB,GAAe;AACd,SACC,8CAAC,SAAM,KAAK,IAAI,WAAkB,gBACjC;AAAA,iDAAC,iBAAc,SAAS,MACvB,uDAAC,gBAAG,UAAAA,QAAM,GACX;AAAA,IACCC,eAAc,mBAAmB,SACjC,6CAAC,QAAK,YAAY,KAAK,MAAM,MAAM,KAAK,MAAM,WAAkB,YAC9D,UAAAA,aACF;AAAA,IAED,8CAAC,SAAM,KAAKA,eAAc,mBAAmB,WAAW,KAAK,GAC5D;AAAA,oDAAC,gBAAa,UAAU,CAAC,CAAC,OAAO,OAAK,MAAC,WAAkB,OACxD;AAAA;AAAA,UAAC;AAAA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,IAAI;AAAA,YACJ;AAAA,YACA,gBAAc;AAAA,YACd;AAAA;AAAA,QACD;AAAA,QACC,wBACA,6CAAC,SAAI,WAAkB,kBACtB,uDAAC,iBAAc,GAChB;AAAA,SAEF;AAAA,MACCA,eAAc,mBAAmB,YACjC,6CAAC,QAAK,YAAY,KAAK,MAAM,MAAM,KAAK,MAAM,WAAkB,YAC9D,UAAAA,aACF;AAAA,MAED,6CAAC,qBAAkB,SAAS,CAAC,CAAC,OAAQ,iBAAM;AAAA,OAC7C;AAAA,KACD;AAEF;;;ACpFgD,IAAM,wBAAwB;AACvE,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AACvB,IAAM,aAAa;;;AP4JrB,IAAAC,sBAAA;AA1IL,IAAMC,OAAM,UAAU,KAAK;AAS3B,SAAS,YAAY,MAAc;AAClC,SAAO,KAAK,KAAK,MAAM;AACxB;AACA,IAAMC;AAEC,SAAS,QAAQ,EAAE,SAAS,eAAe,gBAAgB,UAAU,GAAU;AACrF,kBAAgB,iBAAiB,EAAE,MAAAA,MAAK,CAAC;AAEzC,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,QAAQ,SAAS;AAC5D,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAS,QAAQ,QAAQ;AACzD,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAS,QAAQ,KAAK;AAChD,QAAM,EAAE,uBAAuB,wBAAwB,IAAI,cAAAC,QAAM,WAAW,wBAAwB;AACpG,QAAM,CAAC,sBAAsB,uBAAuB,QAAI,wBAAS;AAAA,IAChE,WAAW;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,EACR,CAAC;AACD,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,wBAAS;AAAA,IACxD,WAAW;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,EACR,CAAC;AACD,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,wBAAkB,CAAC,CAAC,QAAQ,YAAY;AAExF,QAAM,SAAiE,cAAAA,QAAM;AAAA,IAC5E,OAAO,EAAE,WAAW,UAAU,MAAM;AAAA,IACpC,CAAC,WAAW,UAAU,KAAK;AAAA,EAC5B;AACA,QAAM,UAAU,YAAY,QAAQ,GAAI;AAExC,QAAM,qBAAqB,CAAC,WAAiB,eAAe,EAAE,OAAO,CAAC;AAEtE,+BAAU,MAAM;AACf,QAAI,CAAC,aAAa,QAAQ,KAAK,KAAK,CAAC,YAAY,QAAQ,SAAS,KAAK,CAAC,YAAY,QAAQ,QAAQ,EAAG;AAEvG,UAAM,oBACL,QAAQ,kBAAkB,QAAQ,UAAU,QAAQ,SAAS,QAAQ,iBAAiB,QAAQ;AAC/F,UAAM,wBAAwB,QAAQ,cAAc,QAAQ;AAC5D,UAAM,uBAAuB,QAAQ,aAAa,QAAQ;AAC1D,QAAI,CAAC,qBAAqB,CAAC,yBAAyB,CAAC,qBAAsB;AAE3E,kBAAc;AAAA,MACb,WAAW,QAAQ;AAAA,MACnB,UAAU,QAAQ;AAAA,MAClB,OAAO,oBAAoB,QAAQ,QAAQ;AAAA,IAC5C,CAAC,EACC,KAAK,MAAM;AACX,8BAAwB;AAAA,QACvB,WAAW;AAAA,QACX,UAAU;AAAA,QACV,OAAO;AAAA,MACR,CAAC;AACD,0BAAoB;AAAA,QACnB,WAAW;AAAA,QACX,UAAU;AAAA,QACV,OAAO;AAAA,MACR,CAAC;AACD,UAAI,mBAAmB;AACtB,4BAAoB,IAAI;AAAA,MACzB;AAAA,IACD,CAAC,EACA,MAAM,MAAM;AACZ,0BAAoB;AAAA,QACnB,WAAW;AAAA,QACX,UAAU;AAAA,QACV,OAAO;AAAA,MACR,CAAC;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,SAAS,eAAe,OAAO,CAAC;AAEpC,+BAAU,MAAM;AACf,QAAI,CAAC,qBAAsB;AAC3B,UAAM,uBAAuB;AAAA,MAC5B,MAAM,wBAAwB,EAAE,WAAW,OAAO,UAAU,OAAO,OAAO,MAAM,CAAC;AAAA,MACjF;AAAA,IACD;AACA,WAAO,MAAM;AACZ,mBAAa,oBAAoB;AAAA,IAClC;AAAA,EACD,GAAG,CAAC,sBAAsB,uBAAuB,CAAC;AAElD,QAAM,6BAA6B,cAAAA,QAAM;AAAA,IACxC,CAAC,UAAkB;AAClB,8BAAwB,EAAE,sBAAsB,UAAU,MAAM,CAAC;AAAA,IAClE;AAAA,IACA,CAAC,yBAAyB,KAAK;AAAA,EAChC;AAEA,QAAM,gBAAgB,YAAY;AACjC,UAAM,YAAY,YAAY;AAC7B,UAAI;AACH,cAAM,WAAW,OAAO,kBAAkB;AAC1C,gBAAQ,oBAAoB;AAAA,MAC7B,SAAS,KAAK;AACb,YAAI,eAAe,YAAY,IAAI,WAAW,KAAK;AAClD,gBAAM;AAAA,YACL,KAAK;AAAA,YACL,MAAM;AAAA,YACN,SAAS;AAAA,YACT,aAAa;AAAA,YACb,eAAe;AAAA,YACf,MAAM;AAAA,YACN,UAAU;AAAA,UACX,CAAC;AACD;AAAA,QACD;AACA,QAAAF,KAAI,YAAY,GAAG;AACnB,cAAM;AAAA,UACL,KAAK;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,aAAa;AAAA,UACb,eAAe;AAAA,UACf,MAAM;AAAA,UACN,UAAU;AAAA,UACV,QAAQ;AAAA,YACP,OAAO;AAAA,YACP,SAAS,MAAM,WAAW,iBAAiB;AAAA,UAC5C;AAAA,QACD,CAAC;AAAA,MACF;AAAA,IACD;AAEA,0BAAsB;AAAA,MACrB,OAAO;AAAA,MACP,aACC;AAAA,MACD,UACC,6CAAC,gBACA,uDAAC,aAAU,aAAY,oBAAmB,OAAM,IAAG,UAAU,4BAA4B,gBAAc,MAAC,GACzG;AAAA,MAED,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA,sBAAsB;AAAA,MACtB;AAAA,IACD,CAAC;AAAA,EACF;AAEA,SACC,6CAAC,SAAM,SAAS,IAAI,WAAkB,YACrC,wDAAC,SAAM,KAAK,IAAI,WAAkB,YACjC;AAAA,kDAAC,SAAM,KAAK,IAAI,YAAW,UACzB;AAAA,OAAC,aAAa,6CAAC,iBAAc,oBAAM;AAAA,MACpC;AAAA,QAAC;AAAA;AAAA,UACA,UAAU;AAAA,UACV,QAAQ,QAAQ;AAAA,UAChB,OAAO,OAAO;AAAA,UACd,MAAM,GAAG,QAAQ,UAAU,CAAC,CAAC,GAAG,QAAQ,SAAS,CAAC,CAAC;AAAA,UACnD,WAAS;AAAA;AAAA,MACV;AAAA,OACD;AAAA,IACA,8CAAC,SAAM,gBAAe,iBAAgB,WAAkB,YAAY,KAAK,GACxE;AAAA,oDAAC,SAAM,WAAU,UAAS,gBAAe,WAAU,YAAW,WAAU,KAAK,IAC5E;AAAA,sDAAC,SAAM,WAAkB,gBACxB;AAAA;AAAA,YAAC;AAAA;AAAA,cACA,sBAAsB,qBAAqB;AAAA,cAC3C,aAAY;AAAA,cACZ,MAAK;AAAA,cACL,OAAM;AAAA,cACN,OAAO;AAAA,cACP,UAAU;AAAA,cACV,OAAO,aAAa,cAAc,YAAY,SAAS,GAAG,iBAAiB,SAAS;AAAA;AAAA,UACrF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACA,sBAAsB,qBAAqB;AAAA,cAC3C,aAAY;AAAA,cACZ,MAAK;AAAA,cACL,OAAM;AAAA,cACN,OAAO;AAAA,cACP,UAAU;AAAA,cACV,OAAO,aAAa,aAAa,YAAY,QAAQ,GAAG,iBAAiB,QAAQ;AAAA;AAAA,UAClF;AAAA,WACD;AAAA,QACA,8CAAC,SAAM,WAAU,UAAS,gBAAe,WAAU,YAAW,WAAU,KAAK,IAC5E;AAAA;AAAA,YAAC;AAAA;AAAA,cACA,sBAAsB,qBAAqB;AAAA,cAC3C,SAAS,QAAQ;AAAA,cACjB,aAAY;AAAA,cACZ,MAAK;AAAA,cACL;AAAA,cACA,OAAO;AAAA,cACP,UAAU;AAAA,cACV,OAAO,aAAa,SAAS,aAAa,KAAK,GAAG,iBAAiB,KAAK;AAAA,cACxE,YAAY,6CAAC,oBAAiB;AAAA,cAC9B,gBAAe;AAAA;AAAA,UAChB;AAAA,UACC,oBACA,8CAAC,SAAI,WAAkB,uBAAuB;AAAA;AAAA,YAAsB,QAAQ;AAAA,YAAa;AAAA,aAAC;AAAA,WAE5F;AAAA,SACD;AAAA,MACA,6CAAC,UAAO,MAAI,MAAC;AAAA,MACb,8CAAC,SAAM,WAAU,OAAM,gBAAe,iBACrC;AAAA,qDAAC,UAAO,WAAkB,gBAAgB,SAAS,MAAM,QAAQ,oBAAoB,GACpF,uDAAC,gBAAE,sBAAQ,GACZ;AAAA,QACA,6CAAC,UAAO,WAAkB,gBAAgB,SAAS,eAClD,uDAAC,gBAAE,4BAAc,GAClB;AAAA,SACD;AAAA,OACD;AAAA,KACD,GACD;AAEF;AAEA,SAAS,aAAa,WAAmB,SAAkB,cAA2C;AACrG,MAAI,CAAC,SAAS;AACb,WAAO,wBAAwB,SAAS;AAAA,EACzC,WAAW,cAAc;AACxB,WAAO,cAAc,SAAS;AAAA,EAC/B;AACD;AAEA,SAAS,mBAAmB;AAC3B,SACC,8EACC;AAAA,iDAAC,gBAAE,wEAA0D;AAAA,IAC7D,6CAAC,QAAG;AAAA,IACJ,6CAAC,gBAAE,kFAA+D;AAAA,KACnE;AAEF;;;AQjPA,IAAAG,gBAAwB;;;ACbwB,IAAM,oBAAoB;AACnE,IAAM,aAAa;AACnB,IAAM,qBAAqB;AAC3B,IAAM,eAAe;AACrB,IAAM,kBAAkB;AACxB,IAAM,yBAAyB;AAC/B,IAAM,gBAAgB;AACtB,IAAM,qBAAqB;AAC3B,IAAM,cAAc;;;AD4CjB,IAAAC,sBAAA;AA3BV,IAAM,kBAAkB,CAAC,YAA6B;AACrD,QAAM,EAAE,OAAO,IAAI;AAEnB,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,KAAK,OAAO,OAAO,WAAW,QAAQ,OAAO;AAEnD,UAAQ,OAAO,MAAM;AAAA,IACpB,KAAK;AACJ,aAAO,OAAO;AAAA,IACf,KAAK;AACJ,aAAO,cAAc,EAAE;AAAA,IACxB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACJ,aAAO;AAAA,IACR;AACC,aAAO;AAAA,EACT;AACD;AAEA,IAAM,kBAAkB,CAAC,YAAsC;AAC9D,QAAM,EAAE,OAAO,IAAI;AAEnB,UAAQ,QAAQ,SAAS;AAAA,IACxB,KAAK;AACJ,aAAO,6CAAC,cAAW;AAAA,IACpB,KAAK;AACJ,aAAO,6CAAC,eAAY;AAAA,IACrB,KAAK;AACJ,aAAO,6CAAC,cAAW;AAAA,IACpB,KAAK;AACJ,aAAO,6CAAC,YAAS;AAAA,IAClB;AACC,UAAI,QAAQ,GAAI,QAAO,6CAAC,aAAU;AAClC,aAAO,6CAAC,qBAAkB;AAAA,EAC5B;AACD;AACA,IAAM,WAAW,CAAC,YAAqB;AACtC,MAAI,QAAQ,iBAAkB,QAAO;AACrC,SAAO,QAAQ,YAAY,QAAQ,SAAS,SAAS,KAClD,kBAAkB,QAAQ,SAAS,IAAI,KACvC;AACJ;AAEA,IAAMC;AAEC,SAAS,SAAS,EAAE,UAAU,WAAW,GAAU;AACzD,kBAAgB,iBAAiB,EAAE,MAAAA,MAAK,CAAC;AAEzC,WAAS,YAAY,WAAmB;AACvC,WAAO,kBAAkB,EAAE,MAAAA,OAAM,mCAA6B,CAAC;AAC/D,eAAW,SAAS;AAAA,EACrB;AAGA,QAAM,sBAAkB,uBAAQ,MAAM;AACrC,UAAM,iBAAiB,SAAS,KAAK,OAAK,EAAE,gBAAgB;AAC5D,QAAI,CAAC,gBAAgB;AACpB,aAAO;AAAA,IACR;AACA,UAAM,kCAAkC,SAAS,OAAO,aAAW,CAAC,QAAQ,gBAAgB;AAC5F,WAAO,CAAC,gBAAgB,GAAG,+BAA+B;AAAA,EAC3D,GAAG,CAAC,QAAQ,CAAC;AAEb,SACC,6CAAC,SAAM,SAAQ,eAAc,KAAK,IAAI,WAAkB,mBACtD,0BAAgB,IAAI,aACpB,8CAAC,SAAM,YAAW,UAAS,KAAK,IAAI,WAAU,OAAM,WAAkB,YACrE;AAAA,iDAAC,SAAI,WAAW,QAAQ,mBAA0B,qBAA4B,aAC5E,0BAAgB,OAAO,GACzB;AAAA,IACA,8CAAC,SAAM,KAAK,GAAG,WAAkB,oBAChC;AAAA,mDAAC,SAAI,WAAkB,cAAe,0BAAgB,OAAO,GAAE;AAAA,MAC/D,6CAAC,SAAI,WAAW,WAAU,iBAAiB,QAAQ,oBAA2B,sBAAsB,GAClG,mBAAS,OAAO,GAClB;AAAA,OACD;AAAA,IACC,CAAC,QAAQ,oBACT,6CAAC,UAAO,WAAkB,eAAe,SAAS,MAAM,YAAY,QAAQ,EAAE,GAC7E,uDAAC,gBAAE,sBAAQ,GACZ;AAAA,OAbqF,QAAQ,EAe/F,CACA,GACF;AAEF;",
  "names": ["React", "Header", "import_jsx_runtime", "import_react", "title", "import_jsx_runtime", "React", "ssoWarning", "title", "import_react", "import_react", "description", "import_jsx_runtime", "import_react", "import_jsx_runtime", "React", "import_jsx_runtime", "description", "label", "import_jsx_runtime", "label", "helperText", "import_jsx_runtime", "log", "page", "React", "import_react", "import_jsx_runtime", "page"]
}
