domain0 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-BHIxsxUT.mjs","names":[],"sources":["../src/client/client.ts","../src/ui/styles.ts","../src/ui/white-label.ts","../src/ui/locales/es.ts","../src/ui/locales/fr.ts","../src/ui/locales/pt-br.ts","../src/ui/locales/pt-pt.ts","../src/ui/localization.ts","../src/ui/connect.ts","../src/ui/connection-flow.ts","../src/ui/shared-flow.ts","../src/ui/sdk.ts"],"sourcesContent":["import type { ZodType } from 'zod'\n\nimport {\n ApplyPlanInputSchema,\n AuthorizeWithCredentialInputSchema,\n CancelConnectionInputSchema,\n CheckDomainInputSchema,\n CheckDomainResponseSchema,\n CheckRecordsInputSchema,\n CheckRecordsResponseSchema,\n CreateSharedFlowInputSchema,\n CreateSharedFlowResponseSchema,\n ConfirmPlanInputSchema,\n ConnectionIdSchema,\n CreateConnectionInputSchema,\n CreateConnectionResponseSchema,\n CreateConnectionFlowInputSchema,\n ConnectionFlowIdSchema,\n ConnectionFlowResponseSchema,\n DetectProviderResponseSchema,\n DkimGuidanceInputSchema,\n DkimGuidanceResponseSchema,\n Domain0ErrorResponseSchema,\n GetConnectionResponseSchema,\n IssueConnectionTokenInputSchema,\n IssueConnectionTokenResponseSchema,\n ListProvidersResponseSchema,\n ProviderHealthResponseSchema,\n PreparePlanInputSchema,\n RetryConnectionInputSchema,\n SelectProviderInputSchema,\n StartDomainConnectInputSchema,\n StartDomainConnectResponseSchema,\n StartOAuthInputSchema,\n StartOAuthResponseSchema,\n StartManualConfigurationInputSchema,\n SubmitManualCompletionInputSchema,\n SubmitDomainConnectCompletionInputSchema,\n VerifyPropagationInputSchema,\n ResolveSharedFlowInputSchema,\n ResolveSharedFlowResponseSchema,\n SharedFlowTokenSchema,\n SharedFlowUrlSchema,\n} from '../contracts'\nimport type {\n ApplyPlanInput,\n AuthorizeWithCredentialInput,\n CancelConnectionInput,\n CheckDomainInput,\n CheckDomainResponse,\n CheckRecordsInput,\n CheckRecordsResponse,\n CreateSharedFlowInput,\n CreateSharedFlowResponse,\n ConfirmPlanInput,\n ConnectionId,\n CreateConnectionInput,\n CreateConnectionResponse,\n CreateConnectionFlowInput,\n ConnectionFlowId,\n ConnectionFlowResponse,\n DetectProviderResponse,\n DkimGuidanceInput,\n DkimGuidanceResponse,\n GetConnectionResponse,\n IssueConnectionTokenInput,\n IssueConnectionTokenResponse,\n ListProvidersResponse,\n ProviderHealthResponse,\n PreparePlanInput,\n RetryConnectionInput,\n SelectProviderInput,\n StartDomainConnectInput,\n StartDomainConnectResponse,\n StartOAuthInput,\n StartOAuthResponse,\n StartManualConfigurationInput,\n SubmitManualCompletionInput,\n SubmitDomainConnectCompletionInput,\n VerifyPropagationInput,\n ResolveSharedFlowResponse,\n SharedFlowUrl,\n} from '../contracts'\nimport { Domain0Error, Domain0ProtocolError, Domain0TransportError } from './error'\n\nexport interface Domain0ClientOptions {\n baseUrl: string\n token: string | (() => string | Promise<string>)\n fetch?: typeof globalThis.fetch\n}\n\nexport interface Domain0Client {\n listProviders(): Promise<ListProvidersResponse>\n getProviderHealth(): Promise<ProviderHealthResponse>\n getDkimGuidance(\n connectionId: ConnectionId,\n input: DkimGuidanceInput,\n ): Promise<DkimGuidanceResponse>\n checkDomain(input: CheckDomainInput): Promise<CheckDomainResponse>\n checkRecords(input: CheckRecordsInput): Promise<CheckRecordsResponse>\n createSharedFlow(input: CreateSharedFlowInput): Promise<CreateSharedFlowResponse>\n createConnection(input: CreateConnectionInput): Promise<CreateConnectionResponse>\n createConnectionFlow(input: CreateConnectionFlowInput): Promise<ConnectionFlowResponse>\n getConnectionFlow(flowId: ConnectionFlowId): Promise<ConnectionFlowResponse>\n getConnection(connectionId: ConnectionId): Promise<GetConnectionResponse>\n issueConnectionToken(\n connectionId: ConnectionId,\n input: IssueConnectionTokenInput,\n ): Promise<IssueConnectionTokenResponse>\n detectProvider(connectionId: ConnectionId): Promise<DetectProviderResponse>\n selectProvider(connectionId: ConnectionId, input: SelectProviderInput): Promise<GetConnectionResponse>\n startDomainConnect(\n connectionId: ConnectionId,\n input: StartDomainConnectInput,\n ): Promise<StartDomainConnectResponse>\n submitDomainConnectCompletion(\n connectionId: ConnectionId,\n input: SubmitDomainConnectCompletionInput,\n ): Promise<GetConnectionResponse>\n startOAuth(connectionId: ConnectionId, input: StartOAuthInput): Promise<StartOAuthResponse>\n authorizeWithCredential(\n connectionId: ConnectionId,\n input: AuthorizeWithCredentialInput,\n ): Promise<GetConnectionResponse>\n preparePlan(connectionId: ConnectionId, input: PreparePlanInput): Promise<GetConnectionResponse>\n confirmPlan(connectionId: ConnectionId, input: ConfirmPlanInput): Promise<GetConnectionResponse>\n applyPlan(connectionId: ConnectionId, input: ApplyPlanInput): Promise<GetConnectionResponse>\n verifyPropagation(\n connectionId: ConnectionId,\n input: VerifyPropagationInput,\n ): Promise<GetConnectionResponse>\n startManualConfiguration(\n connectionId: ConnectionId,\n input: StartManualConfigurationInput,\n ): Promise<GetConnectionResponse>\n submitManualCompletion(\n connectionId: ConnectionId,\n input: SubmitManualCompletionInput,\n ): Promise<GetConnectionResponse>\n cancelConnection(\n connectionId: ConnectionId,\n input: CancelConnectionInput,\n ): Promise<GetConnectionResponse>\n retryConnection(\n connectionId: ConnectionId,\n input: RetryConnectionInput,\n ): Promise<GetConnectionResponse>\n}\n\nexport interface LoadSharedFlowOptions {\n baseUrl: string\n url: SharedFlowUrl\n origin: string\n fetch?: typeof globalThis.fetch\n}\n\nexport interface LoadedSharedFlow extends ResolveSharedFlowResponse {\n client: Domain0Client\n}\n\nexport function createDomain0Client(options: Domain0ClientOptions): Domain0Client {\n const baseUrl = parseBaseUrl(options.baseUrl)\n const fetchImplementation = options.fetch ?? globalThis.fetch\n if (fetchImplementation === undefined) {\n throw new Domain0ProtocolError('No fetch implementation is available')\n }\n\n async function request<TResponse>(\n path: string,\n init: RequestInit,\n responseSchema: ZodType<TResponse>,\n ): Promise<TResponse> {\n const token = parseBearerToken(\n typeof options.token === 'function' ? await options.token() : options.token,\n )\n\n let response: Response\n try {\n response = await fetchImplementation(new URL(path, baseUrl), {\n ...init,\n headers: {\n accept: 'application/json',\n authorization: `Bearer ${token}`,\n ...(init.body === undefined ? {} : { 'content-type': 'application/json' }),\n ...init.headers,\n },\n })\n } catch (cause) {\n throw new Domain0TransportError(cause)\n }\n\n const body = await parseJson(response)\n if (!response.ok) {\n const parsedError = Domain0ErrorResponseSchema.safeParse(body)\n if (!parsedError.success) {\n throw new Domain0ProtocolError(\n `Domain0 returned HTTP ${response.status} with an invalid error response`,\n parsedError.error,\n )\n }\n throw new Domain0Error(response.status, parsedError.data)\n }\n\n const parsedResponse = responseSchema.safeParse(body)\n if (!parsedResponse.success) {\n throw new Domain0ProtocolError(\n `Domain0 returned HTTP ${response.status} with an invalid response`,\n parsedResponse.error,\n )\n }\n return parsedResponse.data\n }\n\n return {\n async listProviders() {\n return request('v1/providers', { method: 'GET' }, ListProvidersResponseSchema)\n },\n async getProviderHealth() {\n return request('v1/providers/health', { method: 'GET' }, ProviderHealthResponseSchema)\n },\n async getDkimGuidance(connectionId, input) {\n const id = ConnectionIdSchema.parse(connectionId)\n const body = DkimGuidanceInputSchema.parse(input)\n return request(\n `v1/connections/${encodeURIComponent(id)}/dkim-guidance`,\n { method: 'POST', body: JSON.stringify(body) },\n DkimGuidanceResponseSchema,\n )\n },\n async checkDomain(input) {\n const body = CheckDomainInputSchema.parse(input)\n return request(\n 'v1/domain-checks',\n { method: 'POST', body: JSON.stringify(body) },\n CheckDomainResponseSchema,\n )\n },\n async checkRecords(input) {\n const body = CheckRecordsInputSchema.parse(input)\n return request(\n 'v1/record-checks',\n { method: 'POST', body: JSON.stringify(body) },\n CheckRecordsResponseSchema,\n )\n },\n async createSharedFlow(input) {\n const body = CreateSharedFlowInputSchema.parse(input)\n return request(\n 'v1/shared-flows',\n { method: 'POST', body: JSON.stringify(body) },\n CreateSharedFlowResponseSchema,\n )\n },\n async createConnection(input) {\n const body = CreateConnectionInputSchema.parse(input)\n return request(\n 'v1/connections',\n { method: 'POST', body: JSON.stringify(body) },\n CreateConnectionResponseSchema,\n )\n },\n async createConnectionFlow(input) {\n const body = CreateConnectionFlowInputSchema.parse(input)\n return request(\n 'v1/connection-flows',\n { method: 'POST', body: JSON.stringify(body) },\n ConnectionFlowResponseSchema,\n )\n },\n async getConnectionFlow(flowId) {\n const id = ConnectionFlowIdSchema.parse(flowId)\n return request(\n `v1/connection-flows/${encodeURIComponent(id)}`,\n { method: 'GET' },\n ConnectionFlowResponseSchema,\n )\n },\n async getConnection(connectionId) {\n const id = ConnectionIdSchema.parse(connectionId)\n return request(`v1/connections/${encodeURIComponent(id)}`, { method: 'GET' }, GetConnectionResponseSchema)\n },\n async issueConnectionToken(connectionId, input) {\n const id = ConnectionIdSchema.parse(connectionId)\n const body = IssueConnectionTokenInputSchema.parse(input)\n return request(\n `v1/connections/${encodeURIComponent(id)}/access-token`,\n { method: 'POST', body: JSON.stringify(body) },\n IssueConnectionTokenResponseSchema,\n )\n },\n async detectProvider(connectionId) {\n const id = ConnectionIdSchema.parse(connectionId)\n return request(\n `v1/connections/${encodeURIComponent(id)}/provider-detection`,\n { method: 'POST' },\n DetectProviderResponseSchema,\n )\n },\n async selectProvider(connectionId, input) {\n const id = ConnectionIdSchema.parse(connectionId)\n const body = SelectProviderInputSchema.parse(input)\n return request(\n `v1/connections/${encodeURIComponent(id)}/provider-selection`,\n { method: 'POST', body: JSON.stringify(body) },\n GetConnectionResponseSchema,\n )\n },\n async startOAuth(connectionId, input) {\n const id = ConnectionIdSchema.parse(connectionId)\n const body = StartOAuthInputSchema.parse(input)\n return request(\n `v1/connections/${encodeURIComponent(id)}/oauth-authorization`,\n { method: 'POST', body: JSON.stringify(body) },\n StartOAuthResponseSchema,\n )\n },\n async startDomainConnect(connectionId, input) {\n const id = ConnectionIdSchema.parse(connectionId)\n const body = StartDomainConnectInputSchema.parse(input)\n return request(\n `v1/connections/${encodeURIComponent(id)}/domain-connect-handoff`,\n { method: 'POST', body: JSON.stringify(body) },\n StartDomainConnectResponseSchema,\n )\n },\n async submitDomainConnectCompletion(connectionId, input) {\n const id = ConnectionIdSchema.parse(connectionId)\n const body = SubmitDomainConnectCompletionInputSchema.parse(input)\n return request(\n `v1/connections/${encodeURIComponent(id)}/domain-connect-completion`,\n { method: 'POST', body: JSON.stringify(body) },\n GetConnectionResponseSchema,\n )\n },\n async authorizeWithCredential(connectionId, input) {\n const id = ConnectionIdSchema.parse(connectionId)\n const body = AuthorizeWithCredentialInputSchema.parse(input)\n return request(\n `v1/connections/${encodeURIComponent(id)}/credential-authorization`,\n { method: 'POST', body: JSON.stringify(body) },\n GetConnectionResponseSchema,\n )\n },\n async preparePlan(connectionId, input) {\n const id = ConnectionIdSchema.parse(connectionId)\n const body = PreparePlanInputSchema.parse(input)\n return request(\n `v1/connections/${encodeURIComponent(id)}/change-plan`,\n { method: 'POST', body: JSON.stringify(body) },\n GetConnectionResponseSchema,\n )\n },\n async confirmPlan(connectionId, input) {\n const id = ConnectionIdSchema.parse(connectionId)\n const body = ConfirmPlanInputSchema.parse(input)\n return request(\n `v1/connections/${encodeURIComponent(id)}/plan-confirmation`,\n { method: 'POST', body: JSON.stringify(body) },\n GetConnectionResponseSchema,\n )\n },\n async applyPlan(connectionId, input) {\n const id = ConnectionIdSchema.parse(connectionId)\n const body = ApplyPlanInputSchema.parse(input)\n return request(\n `v1/connections/${encodeURIComponent(id)}/change-application`,\n { method: 'POST', body: JSON.stringify(body) },\n GetConnectionResponseSchema,\n )\n },\n async verifyPropagation(connectionId, input) {\n const id = ConnectionIdSchema.parse(connectionId)\n const body = VerifyPropagationInputSchema.parse(input)\n return request(\n `v1/connections/${encodeURIComponent(id)}/propagation-verification`,\n { method: 'POST', body: JSON.stringify(body) },\n GetConnectionResponseSchema,\n )\n },\n async startManualConfiguration(connectionId, input) {\n const id = ConnectionIdSchema.parse(connectionId)\n const body = StartManualConfigurationInputSchema.parse(input)\n return request(\n `v1/connections/${encodeURIComponent(id)}/manual-configuration`,\n { method: 'POST', body: JSON.stringify(body) },\n GetConnectionResponseSchema,\n )\n },\n async submitManualCompletion(connectionId, input) {\n const id = ConnectionIdSchema.parse(connectionId)\n const body = SubmitManualCompletionInputSchema.parse(input)\n return request(\n `v1/connections/${encodeURIComponent(id)}/manual-completion`,\n { method: 'POST', body: JSON.stringify(body) },\n GetConnectionResponseSchema,\n )\n },\n async cancelConnection(connectionId, input) {\n const id = ConnectionIdSchema.parse(connectionId)\n const body = CancelConnectionInputSchema.parse(input)\n return request(\n `v1/connections/${encodeURIComponent(id)}/cancellation`,\n { method: 'POST', body: JSON.stringify(body) },\n GetConnectionResponseSchema,\n )\n },\n async retryConnection(connectionId, input) {\n const id = ConnectionIdSchema.parse(connectionId)\n const body = RetryConnectionInputSchema.parse(input)\n return request(\n `v1/connections/${encodeURIComponent(id)}/retry`,\n { method: 'POST', body: JSON.stringify(body) },\n GetConnectionResponseSchema,\n )\n },\n }\n}\n\nexport function createSharedFlowUrl(baseUrl: SharedFlowUrl, token: string): SharedFlowUrl {\n const parsed = parseSharedFlowUrl(baseUrl)\n parsed.hash = `domain0=${SharedFlowTokenSchema.parse(token)}`\n return SharedFlowUrlSchema.parse(parsed.toString())\n}\n\nexport async function loadSharedFlow(options: LoadSharedFlowOptions): Promise<LoadedSharedFlow> {\n const baseUrl = parseBaseUrl(options.baseUrl)\n const sharedUrl = parseSharedFlowUrl(options.url)\n const fragment = new URLSearchParams(sharedUrl.hash.slice(1))\n const token = SharedFlowTokenSchema.parse(fragment.get('domain0'))\n const body = ResolveSharedFlowInputSchema.parse({ token, origin: options.origin })\n const fetchImplementation = options.fetch ?? globalThis.fetch\n if (fetchImplementation === undefined) {\n throw new Domain0ProtocolError('No fetch implementation is available')\n }\n const response = await fetchImplementation(new URL('v1/shared-flows/resolution', baseUrl), {\n method: 'POST',\n headers: { accept: 'application/json', 'content-type': 'application/json' },\n body: JSON.stringify(body),\n })\n const responseBody = await parseJson(response)\n if (!response.ok) {\n const parsedError = Domain0ErrorResponseSchema.safeParse(responseBody)\n if (!parsedError.success) {\n throw new Domain0ProtocolError(`Domain0 returned HTTP ${response.status} with an invalid error response`, parsedError.error)\n }\n throw new Domain0Error(response.status, parsedError.data)\n }\n const resolved = ResolveSharedFlowResponseSchema.safeParse(responseBody)\n if (!resolved.success) {\n throw new Domain0ProtocolError(`Domain0 returned HTTP ${response.status} with an invalid response`, resolved.error)\n }\n return {\n ...resolved.data,\n client: createDomain0Client({ baseUrl: options.baseUrl, token: resolved.data.accessToken, fetch: fetchImplementation }),\n }\n}\n\nfunction parseSharedFlowUrl(value: string): URL {\n let url: URL\n try {\n url = new URL(SharedFlowUrlSchema.parse(value))\n } catch (error) {\n throw new Domain0ProtocolError('Shared flow URL must be an absolute URL', error)\n }\n if (url.protocol !== 'https:' && !(url.protocol === 'http:' && isLoopback(url.hostname))) {\n throw new Domain0ProtocolError('Shared flow URL must use HTTPS outside local development')\n }\n if (url.username !== '' || url.password !== '') {\n throw new Domain0ProtocolError('Shared flow URL must not contain credentials')\n }\n return url\n}\n\nfunction parseBaseUrl(value: string): URL {\n let url: URL\n try {\n url = new URL(value)\n } catch (error) {\n throw new Domain0ProtocolError('Domain0 baseUrl must be an absolute URL', error)\n }\n if (url.protocol !== 'https:' && !isLoopback(url.hostname)) {\n throw new Domain0ProtocolError('Domain0 baseUrl must use HTTPS outside local development')\n }\n if (url.username !== '' || url.password !== '') {\n throw new Domain0ProtocolError('Domain0 baseUrl must not contain credentials')\n }\n if (url.search !== '' || url.hash !== '') {\n throw new Domain0ProtocolError('Domain0 baseUrl must not contain a query or fragment')\n }\n url.pathname = `${url.pathname.replace(/\\/$/, '')}/`\n return url\n}\n\nfunction parseBearerToken(value: unknown): string {\n if (typeof value !== 'string' || value === '') {\n throw new Domain0ProtocolError('Domain0 token must be a non-empty string')\n }\n if (!/^[A-Za-z0-9\\-._~+/]+=*$/.test(value)) {\n throw new Domain0ProtocolError('Domain0 token must use RFC 6750 bearer-token syntax')\n }\n return value\n}\n\nfunction isLoopback(hostname: string): boolean {\n\treturn hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '[::1]'\n}\n\nasync function parseJson(response: Response): Promise<unknown> {\n const contentType = response.headers.get('content-type') ?? ''\n if (!contentType.toLowerCase().includes('application/json')) {\n throw new Domain0ProtocolError(\n `Domain0 returned HTTP ${response.status} without an application/json content type`,\n )\n }\n try {\n return await response.json()\n } catch (error) {\n throw new Domain0ProtocolError(`Domain0 returned HTTP ${response.status} with invalid JSON`, error)\n }\n}\n","export const domain0Styles = `\n.domain0-root {\n --domain0-light-bg: #ffffff;\n --domain0-light-text: #0a0a0a;\n --domain0-light-muted: #6b6b6b;\n --domain0-light-border: #73737c;\n --domain0-light-primary: #0a0a0a;\n --domain0-light-primary-text: #ffffff;\n --domain0-light-link: #2b21ff;\n --domain0-light-focus: #2b21ff;\n --domain0-light-danger: #b91c1c;\n --domain0-light-danger-text: #ffffff;\n --domain0-dark-bg: #111827;\n --domain0-dark-text: #f9fafb;\n --domain0-dark-muted: #d1d5db;\n --domain0-dark-border: #d1d5db;\n --domain0-dark-primary: #bfdbfe;\n --domain0-dark-primary-text: #172554;\n --domain0-dark-link: #bfdbfe;\n --domain0-dark-focus: #fbbf24;\n --domain0-dark-danger: #fca5a5;\n --domain0-dark-danger-text: #450a0a;\n --domain0-bg: var(--domain0-light-bg);\n --domain0-text: var(--domain0-light-text);\n --domain0-muted: var(--domain0-light-muted);\n --domain0-border: var(--domain0-light-border);\n --domain0-primary: var(--domain0-light-primary);\n --domain0-primary-text: var(--domain0-light-primary-text);\n --domain0-link: var(--domain0-light-link);\n --domain0-focus: var(--domain0-light-focus);\n --domain0-danger: var(--domain0-light-danger);\n --domain0-danger-text: var(--domain0-light-danger-text);\n --domain0-backdrop: #050a14d1;\n --domain0-dialog-width: 672px;\n --domain0-dialog-radius: 20px;\n --domain0-button-radius: 999px;\n --domain0-input-radius: 12px;\n --domain0-font-family: \"PP Neue Montreal\", \"Inter Tight\", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n --domain0-mono-font-family: \"Geist Mono\", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n --domain0-font-weight: 400;\n --domain0-bold-font-weight: 500;\n /* Decorative rules only. Anything that is the boundary of a control uses\n --domain0-border, which the palette schema holds at 3:1 against the surface. */\n --domain0-hairline: color-mix(in srgb, var(--domain0-border) 30%, transparent);\n --domain0-logo-background: transparent;\n color: var(--domain0-text);\n color-scheme: light;\n font-family: var(--domain0-font-family);\n font-weight: var(--domain0-font-weight);\n line-height: 1.5;\n}\n\n.domain0-root[data-color-mode=\"dark\"] {\n --domain0-bg: var(--domain0-dark-bg);\n --domain0-text: var(--domain0-dark-text);\n --domain0-muted: var(--domain0-dark-muted);\n --domain0-border: var(--domain0-dark-border);\n --domain0-primary: var(--domain0-dark-primary);\n --domain0-primary-text: var(--domain0-dark-primary-text);\n --domain0-link: var(--domain0-dark-link);\n --domain0-focus: var(--domain0-dark-focus);\n --domain0-danger: var(--domain0-dark-danger);\n --domain0-danger-text: var(--domain0-dark-danger-text);\n color-scheme: dark;\n}\n\n.domain0-root *, .domain0-root *::before, .domain0-root *::after { box-sizing: border-box; }\n\n.domain0-trigger, .domain0-button {\n min-height: 3.5rem;\n border: 0.0625rem solid var(--domain0-primary);\n border-radius: var(--domain0-button-radius);\n padding: 0.625rem 1.25rem;\n background: var(--domain0-primary);\n color: var(--domain0-primary-text);\n font: inherit;\n font-size: 0.9375rem;\n font-weight: var(--domain0-bold-font-weight);\n cursor: pointer;\n transition: background-color 150ms ease, border-color 150ms ease, transform 150ms ease;\n}\n\n.domain0-button--secondary {\n background: transparent;\n color: var(--domain0-text);\n border-color: var(--domain0-border);\n}\n\n/* Destructive actions read as a bordered choice rather than a filled slab, so\n the primary action stays the loudest thing in the dialog. */\n.domain0-button--danger {\n background: transparent;\n border-color: var(--domain0-danger);\n color: var(--domain0-danger);\n}\n\n.domain0-root a:not(.domain0-button) {\n color: var(--domain0-link);\n text-decoration-line: underline;\n text-decoration-thickness: max(1px, 0.08em);\n text-underline-offset: 0.15em;\n}\n\n.domain0-link-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: fit-content;\n text-decoration: none;\n}\n\n.domain0-trigger:hover, .domain0-button:hover {\n background: color-mix(in srgb, var(--domain0-primary) 88%, var(--domain0-text));\n}\n\n.domain0-trigger:active, .domain0-button:active { transform: translateY(1px); }\n\n.domain0-button--secondary:hover {\n background: color-mix(in srgb, var(--domain0-border) 16%, transparent);\n}\n\n.domain0-button--danger:hover {\n background: color-mix(in srgb, var(--domain0-danger) 12%, transparent);\n}\n\n.domain0-trigger:focus-visible, .domain0-button:focus-visible, .domain0-select:focus-visible,\n.domain0-input:focus-visible, .domain0-heading:focus-visible, .domain0-subheading:focus-visible {\n outline: 0.1875rem solid var(--domain0-focus);\n outline-offset: 0.1875rem;\n}\n\n.domain0-heading:focus, .domain0-subheading:focus {\n outline: 0.1875rem solid var(--domain0-focus);\n outline-offset: 0.1875rem;\n}\n\n.domain0-dialog {\n width: min(var(--domain0-dialog-width), calc(100vw - 2rem));\n max-height: calc(100dvh - 2rem);\n margin: auto;\n border: 0.0625rem solid var(--domain0-hairline);\n border-radius: var(--domain0-dialog-radius);\n padding: 0;\n background: var(--domain0-bg);\n color: var(--domain0-text);\n box-shadow: 0 1.5rem 4rem -2rem rgb(10 10 10 / 0.28);\n overflow: auto;\n}\n\n.domain0-dialog::backdrop {\n background: var(--domain0-backdrop);\n backdrop-filter: blur(0.375rem);\n}\n\n.domain0-dialog--inline {\n position: static;\n width: 100%;\n max-height: none;\n margin: 0;\n inset: auto;\n background: transparent;\n}\n\n.domain0-panel {\n display: grid;\n gap: 1.125rem;\n min-height: 30rem;\n align-content: center;\n padding: clamp(1.75rem, 5vw, 2.5rem);\n min-width: 0;\n}\n\n.domain0-company-identity {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n min-width: 0;\n justify-content: center;\n}\n\n.domain0-company-logo {\n width: 2.5rem;\n height: 2.5rem;\n flex: 0 0 auto;\n border: 0.0625rem solid var(--domain0-hairline);\n border-radius: 0.5rem;\n padding: 0.25rem;\n background: var(--domain0-logo-background);\n object-fit: contain;\n}\n\n.domain0-company-logo--borderless { border-color: transparent; }\n.domain0-company-name {\n min-width: 0;\n margin: 0;\n overflow-wrap: anywhere;\n font-weight: var(--domain0-bold-font-weight);\n}\n\n.domain0-content { display: grid; min-width: 0; gap: 1rem; }\n\n.domain0-heading, .domain0-subheading, .domain0-copy, .domain0-status, .domain0-error, .domain0-list {\n margin: 0;\n overflow-wrap: anywhere;\n}\n\n.domain0-heading {\n font-size: clamp(1.5rem, 5vw, 2.125rem);\n line-height: 1.18;\n letter-spacing: -0.03em;\n font-weight: var(--domain0-bold-font-weight);\n text-align: center;\n}\n.domain0-subheading { font-size: 1rem; line-height: 1.35; }\n.domain0-copy {\n color: var(--domain0-muted);\n font-size: 1.0625rem;\n line-height: 1.65;\n}\n\n/* Mono marks this out as machine state rather than prose, but the status is a\n full sentence, so it keeps normal casing and tracking. Uppercase at 0.16em is\n for short eyebrow labels, not something you have to read. */\n.domain0-status {\n color: var(--domain0-muted);\n font-family: var(--domain0-mono-font-family);\n font-size: 0.8125rem;\n line-height: 1.6;\n}\n.domain0-panel > .domain0-copy,\n.domain0-panel > .domain0-status,\n.domain0-panel > .domain0-error { text-align: center; }\n.domain0-error { color: var(--domain0-danger); font-weight: var(--domain0-bold-font-weight); }\n\n.domain0-form { display: grid; gap: 0.875rem; }\n.domain0-label { font-weight: var(--domain0-bold-font-weight); }\n.domain0-checkbox-row { display: flex; align-items: flex-start; gap: 0.625rem; }\n.domain0-checkbox { width: 1.25rem; height: 1.25rem; flex: 0 0 auto; margin-top: 0.125rem; }\n.domain0-checkbox:focus-visible {\n outline: 0.1875rem solid var(--domain0-focus);\n outline-offset: 0.1875rem;\n}\n\n.domain0-table-region {\n box-sizing: border-box;\n width: 100%;\n max-width: 100%;\n overflow-x: auto;\n border: 0.0625rem solid var(--domain0-hairline);\n border-radius: var(--domain0-input-radius);\n}\n\n.domain0-table-region:focus {\n outline: none;\n box-shadow: inset 0 0 0 0.1875rem var(--domain0-focus);\n}\n\n.domain0-table {\n width: 100%;\n min-width: 20rem;\n border-collapse: collapse;\n font-size: 0.875rem;\n text-align: start;\n}\n\n.domain0-table caption {\n padding: 0.75rem;\n font-weight: var(--domain0-bold-font-weight);\n text-align: start;\n}\n\n.domain0-table th {\n font-size: 0.75rem;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--domain0-muted);\n}\n\n.domain0-table th, .domain0-table td {\n padding: 0.5rem 0.75rem;\n border-top: 0.0625rem solid var(--domain0-hairline);\n vertical-align: top;\n overflow-wrap: anywhere;\n}\n\n.domain0-table td {\n font-family: var(--domain0-mono-font-family);\n font-size: 0.8125rem;\n}\n\n.domain0-table td:nth-child(3) { min-width: 12rem; }\n\n.domain0-select, .domain0-input {\n width: 100%;\n min-height: 3.5rem;\n border: 0.0625rem solid var(--domain0-border);\n border-radius: var(--domain0-input-radius);\n padding: 0.625rem 0.875rem;\n background: var(--domain0-bg);\n color: var(--domain0-text);\n font: inherit;\n}\n\n.domain0-content > .domain0-button,\n.domain0-content > .domain0-link-button,\n.domain0-form > .domain0-button {\n width: 100%;\n min-height: 3rem;\n}\n\n.domain0-provider-chip {\n font-family: var(--domain0-mono-font-family);\n display: inline-flex;\n width: fit-content;\n max-width: 100%;\n align-items: center;\n justify-self: center;\n gap: 0.5rem;\n border: 0.0625rem solid color-mix(in srgb, var(--domain0-primary) 15%, transparent);\n border-radius: 999px;\n padding: 0.35rem 0.75rem 0.35rem 0.375rem;\n background: color-mix(in srgb, var(--domain0-primary) 7%, var(--domain0-bg));\n font-size: 0.875rem;\n font-weight: var(--domain0-bold-font-weight);\n box-shadow: 0 0.25rem 1rem -0.75rem rgb(0 0 0 / 0.35);\n}\n\n.domain0-provider-mark {\n display: grid;\n width: 1.75rem;\n height: 1.75rem;\n place-items: center;\n border-radius: 999px;\n background: var(--domain0-primary);\n color: var(--domain0-primary-text);\n font-size: 0.75rem;\n}\n\n.domain0-actions {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: 0.75rem;\n}\n\n/* The machine state as a short label above the heading: the same eyebrow role\n the mono labels play across the brand. connectionState() keeps it short. */\n.domain0-eyebrow {\n margin: 0;\n color: var(--domain0-muted);\n font-family: var(--domain0-mono-font-family);\n font-size: 0.6875rem;\n font-weight: 500;\n letter-spacing: 0.16em;\n line-height: 1.3;\n text-align: center;\n text-transform: uppercase;\n}\n\n.domain0-eyebrow:empty, .domain0-status:empty { display: none; }\n\n/* A destructive change is called out on the row it belongs to, not only in the\n acknowledgement underneath, so the specific record is what draws the eye. */\n.domain0-table__row--destructive > td {\n background: color-mix(in srgb, var(--domain0-danger) 8%, transparent);\n color: var(--domain0-danger);\n}\n\n.domain0-footer {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0;\n padding-top: 0.5rem;\n color: var(--domain0-muted);\n}\n\n.domain0-footer__name {\n font-size: 0.9375rem;\n font-weight: var(--domain0-bold-font-weight);\n letter-spacing: -0.045em;\n}\n\n.domain0-footer__mark { display: inline-flex; position: relative; top: 1px; }\n\n@media (max-width: 24rem) {\n .domain0-dialog { width: calc(100vw - 1rem); max-height: calc(100dvh - 1rem); }\n .domain0-actions { align-items: stretch; flex-direction: column-reverse; }\n .domain0-button { width: 100%; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .domain0-root *, .domain0-root *::before, .domain0-root *::after {\n scroll-behavior: auto !important;\n transition-duration: 0.01ms !important;\n }\n}\n\n@media (prefers-color-scheme: dark) {\n .domain0-root[data-color-mode=\"system\"] {\n --domain0-bg: var(--domain0-dark-bg);\n --domain0-text: var(--domain0-dark-text);\n --domain0-muted: var(--domain0-dark-muted);\n --domain0-border: var(--domain0-dark-border);\n --domain0-primary: var(--domain0-dark-primary);\n --domain0-primary-text: var(--domain0-dark-primary-text);\n --domain0-link: var(--domain0-dark-link);\n --domain0-focus: var(--domain0-dark-focus);\n --domain0-danger: var(--domain0-dark-danger);\n --domain0-danger-text: var(--domain0-dark-danger-text);\n color-scheme: dark;\n }\n}\n\n@media (prefers-contrast: more) {\n .domain0-root { --domain0-muted: var(--domain0-text); }\n .domain0-root :focus-visible { outline-width: 0.25rem; }\n}\n\n@media (forced-colors: active) {\n .domain0-trigger, .domain0-button, .domain0-dialog, .domain0-select, .domain0-input,\n .domain0-table-region, .domain0-company-logo {\n border-color: ButtonBorder;\n }\n .domain0-trigger:focus-visible, .domain0-button:focus-visible, .domain0-select:focus-visible,\n .domain0-input:focus-visible, .domain0-heading:focus-visible, .domain0-subheading:focus-visible,\n .domain0-heading:focus, .domain0-subheading:focus {\n outline-color: Highlight;\n }\n .domain0-table-region:focus {\n outline: 0.1875rem solid Highlight;\n outline-offset: -0.1875rem;\n box-shadow: none;\n }\n}\n`\n","import type { Domain0ThemePalette, Domain0WhiteLabel } from '../contracts'\n\nconst paletteVariableNames = {\n surface: 'bg',\n text: 'text',\n mutedText: 'muted',\n border: 'border',\n primary: 'primary',\n onPrimary: 'primary-text',\n link: 'link',\n focus: 'focus',\n danger: 'danger',\n onDanger: 'danger-text',\n} as const satisfies Record<keyof Domain0ThemePalette, string>\n\nexport function applyWhiteLabel(root: HTMLElement, whiteLabel: Domain0WhiteLabel): void {\n const { theme } = whiteLabel\n root.dataset.colorMode = theme.colorMode\n\n applyPalette(root, 'light', theme.light)\n applyPalette(root, 'dark', theme.dark)\n\n setProperty(root, '--domain0-backdrop', theme.backdrop)\n setProperty(root, '--domain0-dialog-width', `${theme.widthPx}px`)\n setProperty(root, '--domain0-dialog-radius', `${theme.dialogRadiusPx}px`)\n setProperty(root, '--domain0-button-radius', `${theme.buttonRadiusPx}px`)\n setProperty(root, '--domain0-input-radius', `${theme.inputRadiusPx}px`)\n setProperty(root, '--domain0-font-family', theme.fontFamily)\n setProperty(root, '--domain0-font-weight', String(theme.fontWeight))\n setProperty(root, '--domain0-bold-font-weight', String(theme.boldFontWeight))\n if (whiteLabel.logoBackgroundColor !== undefined) {\n setProperty(root, '--domain0-logo-background', whiteLabel.logoBackgroundColor)\n }\n}\n\nexport function interpolateWhiteLabelCopy(\n template: string,\n replacements: Readonly<Record<string, string>>,\n): string {\n return template.replace(/\\{[A-Z]+\\}/g, (placeholder) => replacements[placeholder] ?? placeholder)\n}\n\nfunction applyPalette(\n root: HTMLElement,\n mode: 'light' | 'dark',\n palette: Domain0ThemePalette,\n): void {\n for (const [token, value] of Object.entries(palette) as Array<[\n keyof Domain0ThemePalette,\n string,\n ]>) {\n setProperty(root, `--domain0-${mode}-${paletteVariableNames[token]}`, value)\n }\n}\n\nfunction setProperty(root: HTMLElement, name: string, value: string): void {\n root.style.setProperty(name, value)\n}\n","import type { Domain0Messages } from '../localization'\n\nexport const spanishMessages = {\n triggerConnectDomain: 'Conectar dominio',\n headingConnectDomain: 'Conecte su dominio',\n headingConnectDomains: 'Conecte sus dominios',\n initialSubtitle: 'Elija su proveedor de DNS. Domain0 mostrará la ruta de conexión verificada disponible.',\n cancelConnection: 'Cancelar conexión',\n close: 'Cerrar',\n loadingConnection: 'Cargando los detalles de la conexión…',\n detectingProvider: 'Detectando su proveedor de DNS…',\n detectionUnavailable: 'La detección automática del proveedor no está disponible temporalmente. Elija su proveedor de DNS a continuación.',\n connectionStatus: (state: string) => `Estado de la conexión: ${state}.`,\n manualInstructionsReady: 'Las instrucciones guiadas de DNS manual están listas.',\n forcedManualBlocked: 'Esta conexión ya inició un flujo automático del proveedor. El modo manual forzado no puede reanudarlo ni continuarlo. Cancele esta conexión y cree una nueva conexión manual.',\n forcedManualIncompatible: 'La conexión existente no es compatible con la configuración manual forzada',\n missingConfirmationPlan: 'El servidor devolvió un estado de confirmación sin un plan de cambios',\n missingApplyingPlan: 'El servidor devolvió un estado de aplicación sin un plan confirmado',\n missingFailureDetails: 'El servidor devolvió un estado reintentable sin detalles del error',\n successDescription: (domain: string) => `${domain} está conectado y sus registros requeridos se han propagado.`,\n dkimHeading: 'Proteja el correo saliente con DKIM',\n dkimCheckingProvider: 'Comprobando los registros MX públicos y los registros DNS DKIM de selectores específicos…',\n dkimGuidanceUnavailable: 'La detección del proveedor de correo no está disponible temporalmente. No se realizó ningún cambio de DNS.',\n dkimDomainMismatch: 'El servidor devolvió instrucciones DKIM para otro dominio',\n dkimProviderDetected: (provider: string) => `Se detectó ${provider} mediante los registros MX públicos.`,\n dkimProviderAmbiguous: 'Los registros MX apuntan a más de un proveedor de correo compatible. Revise el enrutamiento del correo antes de cambiar DKIM.',\n dkimProviderUnknown: 'Domain0 no pudo identificar Google Workspace, Microsoft 365 ni Zoho Mail mediante los registros MX públicos.',\n dkimRecordObserved: (selectors: string) => `Se observó un registro DNS DKIM para los selectores comprobados: ${selectors}.`,\n dkimNoRecordObserved: (selectors: string) => `No se observó ningún registro DNS DKIM para los selectores comprobados: ${selectors}. Esto no demuestra que DKIM esté desactivado.`,\n dkimNotChecked: 'Este proveedor usa un selector DKIM definido por la cuenta, por lo que no se comprobó automáticamente ningún registro de selector.',\n dkimLookupUnavailable: 'La consulta DNS específica del selector no estuvo disponible temporalmente.',\n dkimEvidenceBoundary: 'Un registro DNS publicado no demuestra que el correo saliente se esté firmando. Verifique el estado final de DKIM en la administración del proveedor de correo.',\n dkimOpenGuide: (provider: string) => `Abrir la guía oficial de configuración de DKIM de ${provider}`,\n cancelledDescription: (domain: string) => `Se canceló la conexión de ${domain}. No se aplicarán más cambios de DNS.`,\n selectedProvider: (provider: string, support: string) => `${provider} seleccionado. ${support}`,\n currentState: (state: string) => `Esta conexión está actualmente ${state}. Actualice para cargar su estado más reciente.`,\n refreshConnection: 'Actualizar conexión',\n domainConnectHeading: 'Conectar mediante Domain Connect',\n domainConnectGuidance: 'Su proveedor de DNS mostrará la plantilla de servicio exacta y solicitará su consentimiento antes de aplicarla.',\n domainConnectResumeUnavailable: 'Esta aplicación anfitriona debe proporcionar la misma plantilla de servicio de Domain Connect para reanudar esta transferencia.',\n domainConnectUnavailable: 'Esta aplicación anfitriona no configuró su plantilla de servicio de Domain Connect. La configuración manual guiada sigue disponible.',\n continueSecurely: (provider: string) => `Continuar de forma segura con ${provider}`,\n continueSecurelyNewTab: (provider: string) => `Continuar de forma segura con ${provider} en una pestaña nueva`,\n completedDomainConnect: 'He completado Domain Connect',\n preparingAuthoritativeVerification: 'Preparando la verificación de DNS autoritativo…',\n readyToVerifyPropagation: 'Listo para verificar la propagación de DNS.',\n resumeDomainConnect: (provider: string) => `Reanudar Domain Connect con ${provider}`,\n connectWithProvider: (provider: string) => `Conectar con ${provider}`,\n checkingDomainConnectTemplate: 'Comprobando que su proveedor de DNS admita esta plantilla de servicio exacta…',\n domainConnectReady: 'Domain Connect está listo. Continúe con su proveedor de DNS en una pestaña nueva.',\n followProviderGuide: (provider: string) => `Seguir la guía paso a paso de ${provider}`,\n openApplicationManualSetupGuide: 'Abrir la guía paso a paso de DNS de esta aplicación',\n requestManualSetupHelp: 'Obtener ayuda paso a paso con DNS',\n openProviderReference: (provider: string) => `Abrir la referencia del proveedor ${provider}`,\n opensInNewTab: (label: string) => `${label} en una pestaña nueva`,\n sharedFlowHeading: 'Pedir a otra persona que termine la configuración',\n sharedFlowGuidance: 'Copie un enlace de duración limitada para una persona de confianza que pueda actualizar este dominio. El enlace solo concede acceso a esta conexión.',\n copySecureSetupLink: 'Copiar enlace seguro de configuración',\n creatingSecureSetupLink: 'Creando un enlace seguro de configuración…',\n secureSetupLinkCopied: 'Enlace seguro de configuración copiado.',\n copySetupLinkAgain: 'Volver a copiar el enlace de configuración',\n expiredSharedFlow: 'La aplicación anfitriona devolvió una invitación de flujo compartido caducada',\n clipboardUnavailable: 'El acceso al portapapeles no está disponible; configure sharedFlowGateway.copy',\n oauthHeading: 'Autorizar de forma segura con el proveedor',\n oauthGuidance: 'Domain0 usa OAuth con PKCE. Su contraseña del proveedor nunca se comparte con Domain0.',\n continueToProvider: (provider: string) => `Continuar a ${provider}`,\n authorizationExpires: 'Este enlace de autorización caduca el {DATE}.',\n completedAuthorization: 'He completado la autorización',\n resumeAuthorization: (provider: string) => `Reanudar la autorización con ${provider}`,\n authorizeWithProvider: (provider: string) => `Autorizar con ${provider}`,\n authorizeProviderCredentials: (provider: string) => `Autorizar ${provider}`,\n preparingAuthorizationLink: 'Preparando un enlace seguro de autorización del proveedor…',\n authorizationLinkReady: 'El enlace de autorización está listo. Continúe con el proveedor en una pestaña nueva.',\n credentialGuidance: 'Use una credencial del proveedor con el alcance mínimo necesario. Domain0 la cifra en el servidor y nunca la devuelve al navegador.',\n credentialHeadingApiToken: 'Autorizar con un token de API',\n credentialHeadingAccessKey: 'Autorizar con claves de API',\n credentialHeadingUsernamePassword: 'Autorizar con credenciales del proveedor',\n credentialHeadingAccountToken: 'Autorizar con un token de cuenta',\n credentialHeadingUsernameToken: 'Autorizar con un token de usuario',\n credentialHeadingOvh: 'Autorizar con credenciales de la API de OVH',\n credentialHeadingPrivateKey: 'Autorizar con una clave privada',\n credentialHeadingAwsSession: 'Autorizar con una sesión temporal de AWS',\n credentialHeadingCpanel: 'Autorizar con un token de API de cPanel',\n credentialHeadingClientCredentials: 'Autorizar con credenciales de OpenSRS Storefront',\n fieldApiToken: 'Token de API',\n fieldAccessKeyId: 'ID de clave de acceso',\n fieldApiSecret: 'Secreto de API',\n fieldUsername: 'Nombre de usuario',\n fieldPassword: 'Contraseña',\n fieldAccountId: 'ID de cuenta',\n fieldOvhRegion: 'Región de la API de OVH',\n fieldApplicationKey: 'Clave de aplicación',\n fieldApplicationSecret: 'Secreto de aplicación',\n fieldConsumerKey: 'Clave de consumidor',\n fieldProviderLogin: 'Inicio de sesión del proveedor',\n fieldPemPrivateKey: 'Clave privada PEM',\n fieldAwsAccessKeyId: 'ID de clave de acceso de AWS',\n fieldAwsSecretAccessKey: 'Clave de acceso secreta de AWS',\n fieldAwsSessionToken: 'Token de sesión de AWS',\n fieldRoute53ZoneId: 'ID de zona alojada de Route 53',\n fieldSessionExpiration: 'Caducidad de la sesión',\n fieldCpanelEndpoint: 'Punto de conexión HTTPS de cPanel',\n fieldCpanelUsername: 'Nombre de usuario de cPanel',\n fieldCpanelApiToken: 'Token de API de cPanel',\n fieldStorefrontClientId: 'ID de cliente de Storefront',\n fieldStorefrontClientSecret: 'Secreto de cliente de Storefront',\n regionOvhEurope: 'OVH Europa',\n regionOvhUnitedStates: 'OVH Estados Unidos',\n regionOvhCanada: 'OVH Canadá',\n regionKimsufiEurope: 'Kimsufi Europa',\n regionKimsufiCanada: 'Kimsufi Canadá',\n regionSoYouStartEurope: 'So You Start Europa',\n regionSoYouStartCanada: 'So You Start Canadá',\n authorizeApiToken: 'Autorizar token de API',\n encryptingAuthorization: 'Cifrando y validando la autorización del proveedor…',\n authorizationCompleted: 'Autorización del proveedor completada.',\n existingRecordPolicy: 'Política para registros DNS existentes',\n existingRecordPolicyHelp: 'Conservar es la opción más segura. Las políticas de reemplazo pueden proponer cambios destructivos que requieren confirmación por separado.',\n preserveExistingRecords: 'Conservar los registros existentes',\n replaceSameNameAndType: 'Reemplazar registros con el mismo host y tipo',\n replaceAllAtName: 'Reemplazar todos los registros en conflicto del host',\n replaceSpf: 'Reemplazar una política SPF existente en lugar de combinarla',\n replaceSpfHelp: 'Combinar es la opción segura predeterminada. Reemplazar elimina los mecanismos SPF actuales del proveedor y siempre requiere confirmar el cambio destructivo.',\n readingRecords: 'Leyendo los registros actuales del proveedor y preparando un plan de cambios…',\n recordsAlreadyExist: 'Los registros DNS requeridos ya existen. Listo para verificar la propagación.',\n reviewChanges: 'Revise los cambios de DNS propuestos antes de confirmarlos.',\n reviewDnsChanges: 'Revisar cambios de DNS',\n recalculateChangePlan: 'Volver a calcular el plan de cambios',\n proposedChangesRegion: 'Cambios de DNS propuestos',\n proposedChangesCaption: (domain: string) => `Cambios de DNS propuestos para ${domain}`,\n columnAction: 'Acción',\n columnCurrentRecord: 'Registro actual',\n columnResultingRecord: 'Registro resultante',\n columnRisk: 'Riesgo',\n changeCreate: 'Crear',\n changeUpdate: 'Actualizar',\n changeDelete: 'Eliminar',\n destructive: 'Destructivo',\n nonDestructive: 'No destructivo',\n planWarnings: 'Advertencias del plan',\n planWarningSpfPolicyReplaced: 'La política SPF existente será reemplazada por la política SPF solicitada.',\n planWarningSpfPolicyMerged: 'La política SPF existente se combinó con el registro SPF solicitado.',\n planExpires: 'Este plan caduca el {DATE}.',\n destructiveAcknowledgement: 'Entiendo que los registros DNS existentes marcados serán reemplazados o eliminados.',\n confirmChangePlan: 'Confirmar plan de cambios',\n confirmingChangePlan: 'Confirmando este plan de cambios exacto…',\n planConfirmed: 'Plan confirmado. Los cambios de DNS todavía no se han aplicado.',\n applyDnsChanges: 'Aplicar cambios de DNS',\n applyingDnsChanges: 'Aplicando los cambios de DNS confirmados…',\n dnsChangesApplied: 'Los cambios de DNS se aplicaron. Listo para verificar la propagación autoritativa.',\n detectionReasonNoStablePublicProviderIdentity: 'Este proveedor no publica una identidad pública estable que Domain0 pueda detectar de forma segura mediante DNS.',\n manualGuidance: 'Use la configuración manual guiada para añadir los registros DNS requeridos exactos sin compartir credenciales del proveedor.',\n manualSetupUnavailableHeading: 'Configuración manual no disponible',\n manualSetupUnavailableDescription: 'Esta aplicación desactivó la configuración manual de DNS. Use otra ruta verificada disponible o cancele o cierre esta conexión.',\n showDnsRecords: 'Mostrar registros DNS',\n preparingDnsInstructions: 'Preparando las instrucciones de DNS…',\n dnsInstructionsReady: 'Las instrucciones de DNS están listas.',\n addResolvedRecords: 'Añada estos registros resueltos en su proveedor de DNS y continúe.',\n authoritativeRecordGuidance: 'Domain0 comprueba estos registros directamente en cada servidor de nombres autoritativo.',\n dnsRecordsRegion: 'Registros DNS',\n dnsRecordsCaption: (domain: string) => `Registros DNS para ${domain}`,\n thisDomain: 'este dominio',\n columnType: 'Tipo',\n columnHost: 'Host',\n columnValue: 'Valor',\n columnTtl: 'TTL',\n columnPriority: 'Prioridad',\n columnRequirement: 'Requisito',\n optional: 'Opcional',\n required: 'Requerido',\n noRecordChanges: 'La política de DNS existente satisface esta solicitud. No se requiere ningún cambio de registros DNS.',\n addedRecords: 'He añadido estos registros',\n continue: 'Continuar',\n savingConfirmation: 'Guardando su confirmación…',\n verifyDnsRecords: 'Verificar registros DNS',\n finishConnection: 'Finalizar conexión',\n checkingNameservers: 'Comprobando los servidores de nombres autoritativos…',\n requiredRecordsActive: 'Los registros DNS requeridos están activos.',\n propagationPending: 'Los cambios de DNS aún no han llegado a todos los servidores de nombres autoritativos. Puede volver a comprobarlos.',\n providerFailureHeading: 'La operación del proveedor requiere atención',\n snapshotTimeout: 'Domain0 agotó el tiempo de espera al leer los registros DNS del proveedor. No se realizó ningún cambio de DNS. Reintentar restaura el paso de revisión anterior para que pueda solicitar una nueva instantánea.',\n applyTimeout: 'El proveedor no confirmó la actualización de DNS antes del límite, por lo que el resultado es ambiguo. Reintentar restaura el paso de aplicación confirmado; Domain0 concilia los registros actuales del proveedor antes de otra escritura.',\n timeoutRecorded: 'El tiempo de espera se agotó el {DATE}.',\n retryConnection: 'Reintentar conexión',\n restoringConnection: 'Restaurando la conexión a su estado anterior al error…',\n connectionRestored: (state: string) => `Conexión restaurada a ${state}. Continúe cuando esté listo.`,\n cancelHeading: '¿Cancelar esta conexión?',\n cancelGuidance: 'La cancelación detiene este flujo de Domain0. No elimina los registros DNS que ya se hayan aplicado.',\n keepConnection: 'Mantener conexión',\n confirmCancellation: 'Confirmar cancelación',\n cancellingConnection: 'Cancelando conexión…',\n connectionCancelled: 'Conexión cancelada.',\n dnsProvider: 'Proveedor de DNS',\n providerHelp: 'Seleccione la empresa donde administra los registros DNS de este dominio.',\n detectedProviderHelp: 'Domain0 encontró posibles proveedores mediante información pública de DNS. Confirme la empresa donde administra los registros DNS.',\n chooseProvider: 'Elegir un proveedor',\n suggestedFromDns: 'Sugerido por DNS',\n allOtherProviders: 'Todos los demás proveedores',\n continueWithProvider: 'Continuar con el proveedor',\n savingProviderSelection: 'Guardando la selección del proveedor…',\n preparingProviderSelection: 'Preparando la selección del proveedor…',\n providerDetected: (provider: string) => `${provider} detectado.`,\n providerSelected: (provider: string) => `${provider} seleccionado.`,\n preparingManualInstructions: 'Preparando las instrucciones guiadas de DNS manual…',\n manualSetupNotEntered: 'El servidor no inició la configuración manual guiada',\n noProviderDetected: 'No se identificó ningún proveedor automáticamente. Elija su proveedor de DNS a continuación.',\n possibleProviderFound: 'Se encontró 1 posible proveedor de DNS. Confirme su proveedor a continuación.',\n possibleProvidersFound: (count: string) => `Se encontraron ${count} posibles proveedores de DNS. Confirme su proveedor a continuación.`,\n supportAutomatic: 'automático',\n supportDomainConnect: 'Domain Connect',\n supportManual: 'manual guiado',\n supportUnverified: 'aún no verificado',\n supportAutomaticDescription: 'Su adaptador automático está verificado; la configuración manual guiada también está disponible.',\n supportDomainConnectDescription: 'Su ruta de Domain Connect está verificada; la configuración manual guiada también está disponible.',\n supportManualDescription: 'Su ruta manual guiada está verificada.',\n supportUnverifiedDescription: 'La automatización específica del proveedor no está verificada; la configuración manual guiada sigue disponible.',\n recordSummary: (type: string, host: string, value: string, ttl: string, priority: string) => `${type} ${host} = ${value}; TTL ${ttl}${priority}`,\n recordPriority: (priority: string) => `; prioridad ${priority}`,\n errorPrefix: (message: string) => `Error: ${message}`,\n unknownError: 'Error desconocido',\n transportError: 'No se pudo acceder a Domain0. Compruebe su conexión e inténtelo de nuevo.',\n protocolError: 'Domain0 devolvió una respuesta no válida. Inténtelo de nuevo o contacte con el operador de la aplicación.',\n apiErrorInvalidRequest: 'La solicitud no es válida.',\n apiErrorUnauthorized: 'La autenticación falló. Vuelva a abrir el flujo de conexión e inténtelo de nuevo.',\n apiErrorForbidden: 'No tiene permiso para realizar esta operación.',\n apiErrorNotFound: 'El recurso de conexión solicitado no se encontró o ha caducado.',\n apiErrorConflict: 'La conexión cambió antes de que terminara esta operación. Actualice e inténtelo de nuevo.',\n apiErrorRateLimited: 'Se realizaron demasiadas solicitudes. Espere un momento e inténtelo de nuevo.',\n apiErrorDnsUnavailable: 'El DNS autoritativo no está disponible temporalmente. Inténtelo de nuevo.',\n apiErrorProviderUnavailable: 'El proveedor de DNS no está disponible temporalmente. Inténtelo de nuevo.',\n apiErrorProviderAuthorizationFailed: 'La autorización del proveedor de DNS falló o caducó.',\n apiErrorProviderLimitation: 'El proveedor seleccionado no puede completar esta operación automáticamente.',\n apiErrorPlanExpired: 'El plan de cambios de DNS caducó. Prepare y revise un plan nuevo.',\n apiErrorPropagationPending: 'Los cambios de DNS aún no han llegado a todos los servidores de nombres autoritativos.',\n apiErrorInternal: 'Domain0 encontró un error inesperado. Inténtelo de nuevo.',\n loadingFlow: 'Cargando el flujo de conexión de dominios…',\n flowNotReady: 'Las conexiones de dominio aún se están preparando. Vuelva a abrir este flujo para reintentarlo.',\n flowStep: (index: string, domain: string) => `${index}. ${domain}`,\n flowStepConnected: (index: string, domain: string) => `${index}. ${domain} — conectado`,\n allDomainsConnected: (count: string) => `Los ${count} dominios están conectados.`,\n domainProgress: (index: string, total: string, domain: string) => `Dominio ${index} de ${total}: ${domain}`,\n connectionStateRequested: 'solicitada',\n connectionStateDetectingProvider: 'detectando el proveedor',\n connectionStateProviderSelected: 'con el proveedor seleccionado',\n connectionStateDomainConnectPending: 'con Domain Connect pendiente',\n connectionStateAuthorizationPending: 'con la autorización pendiente',\n connectionStateAuthorized: 'autorizada',\n connectionStatePlanning: 'en planificación',\n connectionStateAwaitingConfirmation: 'esperando confirmación',\n connectionStateApplying: 'aplicándose',\n connectionStatePropagationPending: 'con la propagación pendiente',\n connectionStateActive: 'activa',\n connectionStateManualRequired: 'requiere configuración manual',\n connectionStateFailedRetryable: 'con un error temporal',\n connectionStateFailedTerminal: 'con error',\n connectionStateCancelled: 'cancelada',\n} satisfies Domain0Messages\n","import type { Domain0Messages } from '../localization'\n\nexport const frenchMessages = {\n triggerConnectDomain: 'Connecter le domaine',\n headingConnectDomain: 'Connectez votre domaine',\n headingConnectDomains: 'Connectez vos domaines',\n initialSubtitle: 'Choisissez votre fournisseur DNS. Domain0 affichera le parcours de connexion vérifié disponible.',\n cancelConnection: 'Annuler la connexion',\n close: 'Fermer',\n loadingConnection: 'Chargement des détails de la connexion…',\n detectingProvider: 'Détection de votre fournisseur DNS…',\n detectionUnavailable: 'La détection automatique du fournisseur est temporairement indisponible. Choisissez votre fournisseur DNS ci-dessous.',\n connectionStatus: (state: string) => `État de la connexion : ${state}.`,\n manualInstructionsReady: 'Les instructions guidées de configuration DNS manuelle sont prêtes.',\n forcedManualBlocked: 'Cette connexion a déjà démarré un parcours automatique du fournisseur. Le mode manuel forcé ne peut ni le reprendre ni le poursuivre. Annulez cette connexion et créez une nouvelle connexion manuelle.',\n forcedManualIncompatible: 'La connexion existante est incompatible avec la configuration manuelle forcée',\n missingConfirmationPlan: 'Le serveur a renvoyé un état de confirmation sans plan de modification',\n missingApplyingPlan: 'Le serveur a renvoyé un état d’application sans plan confirmé',\n missingFailureDetails: 'Le serveur a renvoyé un état réessayable sans détails sur l’erreur',\n successDescription: (domain: string) => `${domain} est connecté et ses enregistrements requis se sont propagés.`,\n dkimHeading: 'Protégez les e-mails sortants avec DKIM',\n dkimCheckingProvider: 'Vérification des enregistrements MX publics et des enregistrements DNS DKIM propres aux sélecteurs…',\n dkimGuidanceUnavailable: 'La détection du fournisseur de messagerie est temporairement indisponible. Aucune modification DNS n’a été effectuée.',\n dkimDomainMismatch: 'Le serveur a renvoyé des instructions DKIM pour un autre domaine',\n dkimProviderDetected: (provider: string) => `${provider} a été détecté grâce aux enregistrements MX publics.`,\n dkimProviderAmbiguous: 'Les enregistrements MX désignent plusieurs fournisseurs de messagerie compatibles. Vérifiez le routage des e-mails avant de modifier DKIM.',\n dkimProviderUnknown: 'Domain0 n’a pas pu identifier Google Workspace, Microsoft 365 ou Zoho Mail grâce aux enregistrements MX publics.',\n dkimRecordObserved: (selectors: string) => `Un enregistrement DNS DKIM a été observé pour les sélecteurs vérifiés : ${selectors}.`,\n dkimNoRecordObserved: (selectors: string) => `Aucun enregistrement DNS DKIM n’a été observé pour les sélecteurs vérifiés : ${selectors}. Cela ne prouve pas que DKIM est désactivé.`,\n dkimNotChecked: 'Ce fournisseur utilise un sélecteur DKIM défini par le compte. Aucun enregistrement de sélecteur n’a donc été vérifié automatiquement.',\n dkimLookupUnavailable: 'La recherche DNS propre au sélecteur est temporairement indisponible.',\n dkimEvidenceBoundary: 'La publication d’un enregistrement DNS ne prouve pas que les e-mails sortants sont signés. Vérifiez l’état DKIM final dans l’administration du fournisseur de messagerie.',\n dkimOpenGuide: (provider: string) => `Ouvrir le guide officiel de configuration DKIM de ${provider}`,\n cancelledDescription: (domain: string) => `La connexion de ${domain} a été annulée. Aucune autre modification DNS ne sera appliquée.`,\n selectedProvider: (provider: string, support: string) => `${provider} sélectionné. ${support}`,\n currentState: (state: string) => `Cette connexion est actuellement ${state}. Actualisez pour charger son état le plus récent.`,\n refreshConnection: 'Actualiser la connexion',\n domainConnectHeading: 'Se connecter avec Domain Connect',\n domainConnectGuidance: 'Votre fournisseur DNS affichera le modèle de service exact et demandera votre consentement avant de l’appliquer.',\n domainConnectResumeUnavailable: 'Cette application hôte doit fournir le même modèle de service Domain Connect pour reprendre ce transfert.',\n domainConnectUnavailable: 'Cette application hôte n’a pas configuré son modèle de service Domain Connect. La configuration manuelle guidée reste disponible.',\n continueSecurely: (provider: string) => `Continuer de manière sécurisée avec ${provider}`,\n continueSecurelyNewTab: (provider: string) => `Continuer de manière sécurisée avec ${provider} dans un nouvel onglet`,\n completedDomainConnect: 'J’ai terminé Domain Connect',\n preparingAuthoritativeVerification: 'Préparation de la vérification DNS faisant autorité…',\n readyToVerifyPropagation: 'Prêt à vérifier la propagation DNS.',\n resumeDomainConnect: (provider: string) => `Reprendre Domain Connect avec ${provider}`,\n connectWithProvider: (provider: string) => `Se connecter avec ${provider}`,\n checkingDomainConnectTemplate: 'Vérification de la prise en charge de ce modèle de service exact par votre fournisseur DNS…',\n domainConnectReady: 'Domain Connect est prêt. Continuez auprès de votre fournisseur DNS dans un nouvel onglet.',\n followProviderGuide: (provider: string) => `Suivre le guide pas à pas de ${provider}`,\n openApplicationManualSetupGuide: 'Ouvrir le guide DNS pas à pas de cette application',\n requestManualSetupHelp: 'Obtenir une aide DNS pas à pas',\n openProviderReference: (provider: string) => `Ouvrir la documentation du fournisseur ${provider}`,\n opensInNewTab: (label: string) => `${label} dans un nouvel onglet`,\n sharedFlowHeading: 'Demander à une autre personne de terminer la configuration',\n sharedFlowGuidance: 'Copiez un lien à durée limitée pour une personne de confiance capable de mettre à jour ce domaine. Le lien donne uniquement accès à cette connexion.',\n copySecureSetupLink: 'Copier le lien de configuration sécurisé',\n creatingSecureSetupLink: 'Création d’un lien de configuration sécurisé…',\n secureSetupLinkCopied: 'Lien de configuration sécurisé copié.',\n copySetupLinkAgain: 'Copier à nouveau le lien de configuration',\n expiredSharedFlow: 'L’application hôte a renvoyé une invitation de parcours partagé expirée',\n clipboardUnavailable: 'L’accès au presse-papiers est indisponible ; configurez sharedFlowGateway.copy',\n oauthHeading: 'Autoriser le fournisseur de manière sécurisée',\n oauthGuidance: 'Domain0 utilise OAuth avec PKCE. Le mot de passe de votre fournisseur n’est jamais communiqué à Domain0.',\n continueToProvider: (provider: string) => `Continuer vers ${provider}`,\n authorizationExpires: 'Ce lien d’autorisation expire le {DATE}.',\n completedAuthorization: 'J’ai terminé l’autorisation',\n resumeAuthorization: (provider: string) => `Reprendre l’autorisation avec ${provider}`,\n authorizeWithProvider: (provider: string) => `Autoriser avec ${provider}`,\n authorizeProviderCredentials: (provider: string) => `Autoriser ${provider}`,\n preparingAuthorizationLink: 'Préparation d’un lien sécurisé d’autorisation du fournisseur…',\n authorizationLinkReady: 'Le lien d’autorisation est prêt. Continuez auprès du fournisseur dans un nouvel onglet.',\n credentialGuidance: 'Utilisez un identifiant du fournisseur avec les droits minimaux nécessaires. Domain0 le chiffre sur le serveur et ne le renvoie jamais au navigateur.',\n credentialHeadingApiToken: 'Autoriser avec un jeton API',\n credentialHeadingAccessKey: 'Autoriser avec des clés API',\n credentialHeadingUsernamePassword: 'Autoriser avec les identifiants du fournisseur',\n credentialHeadingAccountToken: 'Autoriser avec un jeton de compte',\n credentialHeadingUsernameToken: 'Autoriser avec un jeton utilisateur',\n credentialHeadingOvh: 'Autoriser avec les identifiants de l’API OVH',\n credentialHeadingPrivateKey: 'Autoriser avec une clé privée',\n credentialHeadingAwsSession: 'Autoriser avec une session AWS temporaire',\n credentialHeadingCpanel: 'Autoriser avec un jeton API cPanel',\n credentialHeadingClientCredentials: 'Autoriser avec les identifiants OpenSRS Storefront',\n fieldApiToken: 'Jeton API',\n fieldAccessKeyId: 'ID de clé d’accès',\n fieldApiSecret: 'Secret API',\n fieldUsername: 'Nom d’utilisateur',\n fieldPassword: 'Mot de passe',\n fieldAccountId: 'ID du compte',\n fieldOvhRegion: 'Région de l’API OVH',\n fieldApplicationKey: 'Clé d’application',\n fieldApplicationSecret: 'Secret d’application',\n fieldConsumerKey: 'Clé consommateur',\n fieldProviderLogin: 'Identifiant du fournisseur',\n fieldPemPrivateKey: 'Clé privée PEM',\n fieldAwsAccessKeyId: 'ID de clé d’accès AWS',\n fieldAwsSecretAccessKey: 'Clé d’accès secrète AWS',\n fieldAwsSessionToken: 'Jeton de session AWS',\n fieldRoute53ZoneId: 'ID de zone hébergée Route 53',\n fieldSessionExpiration: 'Expiration de la session',\n fieldCpanelEndpoint: 'Point de terminaison HTTPS cPanel',\n fieldCpanelUsername: 'Nom d’utilisateur cPanel',\n fieldCpanelApiToken: 'Jeton API cPanel',\n fieldStorefrontClientId: 'ID client Storefront',\n fieldStorefrontClientSecret: 'Secret client Storefront',\n regionOvhEurope: 'OVH Europe',\n regionOvhUnitedStates: 'OVH États-Unis',\n regionOvhCanada: 'OVH Canada',\n regionKimsufiEurope: 'Kimsufi Europe',\n regionKimsufiCanada: 'Kimsufi Canada',\n regionSoYouStartEurope: 'So You Start Europe',\n regionSoYouStartCanada: 'So You Start Canada',\n authorizeApiToken: 'Autoriser le jeton API',\n encryptingAuthorization: 'Chiffrement et validation de l’autorisation du fournisseur…',\n authorizationCompleted: 'Autorisation du fournisseur terminée.',\n existingRecordPolicy: 'Politique pour les enregistrements DNS existants',\n existingRecordPolicyHelp: 'La conservation est l’option la plus sûre. Les politiques de remplacement peuvent proposer des modifications destructives qui nécessitent une confirmation distincte.',\n preserveExistingRecords: 'Conserver les enregistrements existants',\n replaceSameNameAndType: 'Remplacer les enregistrements ayant le même hôte et le même type',\n replaceAllAtName: 'Remplacer tous les enregistrements en conflit sur l’hôte',\n replaceSpf: 'Remplacer une politique SPF existante au lieu de la fusionner',\n replaceSpfHelp: 'La fusion est l’option sûre par défaut. Le remplacement supprime les mécanismes SPF actuels du fournisseur et exige toujours la confirmation de la modification destructive.',\n readingRecords: 'Lecture des enregistrements actuels du fournisseur et préparation d’un plan de modification…',\n recordsAlreadyExist: 'Les enregistrements DNS requis existent déjà. Prêt à vérifier la propagation.',\n reviewChanges: 'Vérifiez les modifications DNS proposées avant de les confirmer.',\n reviewDnsChanges: 'Vérifier les modifications DNS',\n recalculateChangePlan: 'Recalculer le plan de modification',\n proposedChangesRegion: 'Modifications DNS proposées',\n proposedChangesCaption: (domain: string) => `Modifications DNS proposées pour ${domain}`,\n columnAction: 'Action',\n columnCurrentRecord: 'Enregistrement actuel',\n columnResultingRecord: 'Enregistrement obtenu',\n columnRisk: 'Risque',\n changeCreate: 'Créer',\n changeUpdate: 'Mettre à jour',\n changeDelete: 'Supprimer',\n destructive: 'Destructif',\n nonDestructive: 'Non destructif',\n planWarnings: 'Avertissements du plan',\n planWarningSpfPolicyReplaced: 'La politique SPF existante sera remplacée par la politique SPF demandée.',\n planWarningSpfPolicyMerged: 'La politique SPF existante a été fusionnée avec l’enregistrement SPF demandé.',\n planExpires: 'Ce plan expire le {DATE}.',\n destructiveAcknowledgement: 'Je comprends que les enregistrements DNS existants marqués seront remplacés ou supprimés.',\n confirmChangePlan: 'Confirmer le plan de modification',\n confirmingChangePlan: 'Confirmation de ce plan de modification exact…',\n planConfirmed: 'Plan confirmé. Les modifications DNS n’ont pas encore été appliquées.',\n applyDnsChanges: 'Appliquer les modifications DNS',\n applyingDnsChanges: 'Application des modifications DNS confirmées…',\n dnsChangesApplied: 'Les modifications DNS ont été appliquées. Prêt à vérifier la propagation faisant autorité.',\n detectionReasonNoStablePublicProviderIdentity: 'Ce fournisseur ne publie pas d’identité publique stable que Domain0 puisse détecter de manière sûre via DNS.',\n manualGuidance: 'Utilisez la configuration manuelle guidée pour ajouter les enregistrements DNS requis exacts sans communiquer les identifiants du fournisseur.',\n manualSetupUnavailableHeading: 'Configuration manuelle indisponible',\n manualSetupUnavailableDescription: 'Cette application a désactivé la configuration DNS manuelle. Utilisez un autre parcours vérifié disponible, ou annulez ou fermez cette connexion.',\n showDnsRecords: 'Afficher les enregistrements DNS',\n preparingDnsInstructions: 'Préparation des instructions DNS…',\n dnsInstructionsReady: 'Les instructions DNS sont prêtes.',\n addResolvedRecords: 'Ajoutez ces enregistrements résolus chez votre fournisseur DNS, puis continuez.',\n authoritativeRecordGuidance: 'Domain0 vérifie ces enregistrements directement sur chaque serveur de noms faisant autorité.',\n dnsRecordsRegion: 'Enregistrements DNS',\n dnsRecordsCaption: (domain: string) => `Enregistrements DNS pour ${domain}`,\n thisDomain: 'ce domaine',\n columnType: 'Type',\n columnHost: 'Hôte',\n columnValue: 'Valeur',\n columnTtl: 'TTL',\n columnPriority: 'Priorité',\n columnRequirement: 'Exigence',\n optional: 'Facultatif',\n required: 'Requis',\n noRecordChanges: 'La politique DNS existante répond à cette demande. Aucune modification d’enregistrement DNS n’est nécessaire.',\n addedRecords: 'J’ai ajouté ces enregistrements',\n continue: 'Continuer',\n savingConfirmation: 'Enregistrement de votre confirmation…',\n verifyDnsRecords: 'Vérifier les enregistrements DNS',\n finishConnection: 'Terminer la connexion',\n checkingNameservers: 'Vérification des serveurs de noms faisant autorité…',\n requiredRecordsActive: 'Les enregistrements DNS requis sont actifs.',\n propagationPending: 'Les modifications DNS n’ont pas encore atteint tous les serveurs de noms faisant autorité. Vous pouvez les vérifier à nouveau.',\n providerFailureHeading: 'L’opération du fournisseur nécessite votre attention',\n snapshotTimeout: 'Domain0 a dépassé le délai de lecture des enregistrements DNS du fournisseur. Aucune modification DNS n’a été effectuée. Réessayer restaure l’étape de vérification précédente afin de demander un nouvel instantané.',\n applyTimeout: 'Le fournisseur n’a pas confirmé la mise à jour DNS avant la limite ; le résultat est donc ambigu. Réessayer restaure l’étape d’application confirmée. Domain0 rapproche les enregistrements actuels du fournisseur avant toute nouvelle écriture.',\n timeoutRecorded: 'Le délai a été dépassé le {DATE}.',\n retryConnection: 'Réessayer la connexion',\n restoringConnection: 'Restauration de la connexion à son état antérieur à l’erreur…',\n connectionRestored: (state: string) => `Connexion restaurée à l’état ${state}. Continuez lorsque vous êtes prêt.`,\n cancelHeading: 'Annuler cette connexion ?',\n cancelGuidance: 'L’annulation arrête ce parcours Domain0. Elle ne supprime pas les enregistrements DNS déjà appliqués.',\n keepConnection: 'Conserver la connexion',\n confirmCancellation: 'Confirmer l’annulation',\n cancellingConnection: 'Annulation de la connexion…',\n connectionCancelled: 'Connexion annulée.',\n dnsProvider: 'Fournisseur DNS',\n providerHelp: 'Sélectionnez l’entreprise auprès de laquelle vous gérez les enregistrements DNS de ce domaine.',\n detectedProviderHelp: 'Domain0 a trouvé des fournisseurs possibles grâce aux informations DNS publiques. Confirmez l’entreprise auprès de laquelle vous gérez vos DNS.',\n chooseProvider: 'Choisir un fournisseur',\n suggestedFromDns: 'Suggéré par le DNS',\n allOtherProviders: 'Tous les autres fournisseurs',\n continueWithProvider: 'Continuer avec le fournisseur',\n savingProviderSelection: 'Enregistrement du fournisseur sélectionné…',\n preparingProviderSelection: 'Préparation de la sélection du fournisseur…',\n providerDetected: (provider: string) => `${provider} détecté.`,\n providerSelected: (provider: string) => `${provider} sélectionné.`,\n preparingManualInstructions: 'Préparation des instructions guidées de configuration DNS manuelle…',\n manualSetupNotEntered: 'Le serveur n’a pas démarré la configuration manuelle guidée',\n noProviderDetected: 'Aucun fournisseur n’a été identifié automatiquement. Choisissez votre fournisseur DNS ci-dessous.',\n possibleProviderFound: '1 fournisseur DNS possible a été trouvé. Confirmez votre fournisseur ci-dessous.',\n possibleProvidersFound: (count: string) => `${count} fournisseurs DNS possibles ont été trouvés. Confirmez votre fournisseur ci-dessous.`,\n supportAutomatic: 'automatique',\n supportDomainConnect: 'Domain Connect',\n supportManual: 'manuel guidé',\n supportUnverified: 'pas encore vérifié',\n supportAutomaticDescription: 'Son adaptateur automatique est vérifié ; la configuration manuelle guidée reste également disponible.',\n supportDomainConnectDescription: 'Son parcours Domain Connect est vérifié ; la configuration manuelle guidée reste également disponible.',\n supportManualDescription: 'Son parcours manuel guidé est vérifié.',\n supportUnverifiedDescription: 'L’automatisation propre au fournisseur n’est pas vérifiée ; la configuration manuelle guidée reste disponible.',\n recordSummary: (type: string, host: string, value: string, ttl: string, priority: string) => `${type} ${host} = ${value} ; TTL ${ttl}${priority}`,\n recordPriority: (priority: string) => ` ; priorité ${priority}`,\n errorPrefix: (message: string) => `Erreur : ${message}`,\n unknownError: 'Erreur inconnue',\n transportError: 'Domain0 est inaccessible. Vérifiez votre connexion et réessayez.',\n protocolError: 'Domain0 a renvoyé une réponse non valide. Réessayez ou contactez l’exploitant de l’application.',\n apiErrorInvalidRequest: 'La demande n’est pas valide.',\n apiErrorUnauthorized: 'L’authentification a échoué. Rouvrez le parcours de connexion et réessayez.',\n apiErrorForbidden: 'Vous n’êtes pas autorisé à effectuer cette opération.',\n apiErrorNotFound: 'La ressource de connexion demandée est introuvable ou a expiré.',\n apiErrorConflict: 'La connexion a changé avant la fin de cette opération. Actualisez et réessayez.',\n apiErrorRateLimited: 'Trop de demandes ont été effectuées. Patientez un instant et réessayez.',\n apiErrorDnsUnavailable: 'Le DNS faisant autorité est temporairement indisponible. Réessayez.',\n apiErrorProviderUnavailable: 'Le fournisseur DNS est temporairement indisponible. Réessayez.',\n apiErrorProviderAuthorizationFailed: 'L’autorisation du fournisseur DNS a échoué ou a expiré.',\n apiErrorProviderLimitation: 'Le fournisseur sélectionné ne peut pas effectuer cette opération automatiquement.',\n apiErrorPlanExpired: 'Le plan de modification DNS a expiré. Préparez et vérifiez un nouveau plan.',\n apiErrorPropagationPending: 'Les modifications DNS n’ont pas encore atteint tous les serveurs de noms faisant autorité.',\n apiErrorInternal: 'Domain0 a rencontré une erreur inattendue. Réessayez.',\n loadingFlow: 'Chargement du parcours de connexion des domaines…',\n flowNotReady: 'Les connexions de domaine sont toujours en préparation. Rouvrez ce parcours pour réessayer.',\n flowStep: (index: string, domain: string) => `${index}. ${domain}`,\n flowStepConnected: (index: string, domain: string) => `${index}. ${domain} — connecté`,\n allDomainsConnected: (count: string) => `Les ${count} domaines sont connectés.`,\n domainProgress: (index: string, total: string, domain: string) => `Domaine ${index} sur ${total} : ${domain}`,\n connectionStateRequested: 'demandée',\n connectionStateDetectingProvider: 'en cours de détection du fournisseur',\n connectionStateProviderSelected: 'avec le fournisseur sélectionné',\n connectionStateDomainConnectPending: 'en attente de Domain Connect',\n connectionStateAuthorizationPending: 'en attente d’autorisation',\n connectionStateAuthorized: 'autorisée',\n connectionStatePlanning: 'en cours de planification',\n connectionStateAwaitingConfirmation: 'en attente de confirmation',\n connectionStateApplying: 'en cours d’application',\n connectionStatePropagationPending: 'en attente de propagation',\n connectionStateActive: 'active',\n connectionStateManualRequired: 'nécessite une configuration manuelle',\n connectionStateFailedRetryable: 'en échec temporaire',\n connectionStateFailedTerminal: 'en échec',\n connectionStateCancelled: 'annulée',\n} satisfies Domain0Messages\n","import type { Domain0Messages } from '../localization'\n\nexport const brazilianPortugueseMessages = {\n triggerConnectDomain: 'Conectar domínio',\n headingConnectDomain: 'Conecte seu domínio',\n headingConnectDomains: 'Conecte seus domínios',\n initialSubtitle: 'Escolha seu provedor de DNS. O Domain0 mostrará o caminho de conexão verificado disponível.',\n cancelConnection: 'Cancelar conexão',\n close: 'Fechar',\n loadingConnection: 'Carregando detalhes da conexão…',\n detectingProvider: 'Detectando seu provedor de DNS…',\n detectionUnavailable: 'A detecção automática do provedor está temporariamente indisponível. Escolha seu provedor de DNS abaixo.',\n connectionStatus: (state: string) => `Status da conexão: ${state}.`,\n manualInstructionsReady: 'As instruções guiadas de DNS manual estão prontas.',\n forcedManualBlocked: 'Esta conexão já entrou em um fluxo automático do provedor. O modo manual forçado não pode retomá-lo nem avançá-lo. Cancele esta conexão e crie uma nova conexão manual.',\n forcedManualIncompatible: 'A conexão existente é incompatível com a configuração manual forçada',\n missingConfirmationPlan: 'O servidor retornou um estado de confirmação sem um plano de alterações',\n missingApplyingPlan: 'O servidor retornou um estado de aplicação sem um plano confirmado',\n missingFailureDetails: 'O servidor retornou um estado que permite nova tentativa sem detalhes da falha',\n successDescription: (domain: string) => `${domain} está conectado e seus registros obrigatórios foram propagados.`,\n dkimHeading: 'Proteja os e-mails enviados com DKIM',\n dkimCheckingProvider: 'Verificando registros MX públicos e registros DNS DKIM dos seletores específicos…',\n dkimGuidanceUnavailable: 'A detecção do provedor de e-mail está temporariamente indisponível. Nenhuma alteração de DNS foi feita.',\n dkimDomainMismatch: 'O servidor retornou orientações de DKIM para outro domínio',\n dkimProviderDetected: (provider: string) => `${provider} foi detectado pelos registros MX públicos.`,\n dkimProviderAmbiguous: 'Os registros MX apontam para mais de um provedor de e-mail compatível. Revise o roteamento de e-mail antes de alterar o DKIM.',\n dkimProviderUnknown: 'O Domain0 não identificou Google Workspace, Microsoft 365 ou Zoho Mail nos registros MX públicos.',\n dkimRecordObserved: (selectors: string) => `Um registro DNS DKIM foi observado para os seletores verificados: ${selectors}.`,\n dkimNoRecordObserved: (selectors: string) => `Nenhum registro DNS DKIM foi observado para os seletores verificados: ${selectors}. Isso não prova que o DKIM esteja desativado.`,\n dkimNotChecked: 'Este provedor usa um seletor DKIM definido pela conta, portanto nenhum registro de seletor foi verificado automaticamente.',\n dkimLookupUnavailable: 'A verificação do DNS DKIM específica do seletor ficou temporariamente indisponível.',\n dkimEvidenceBoundary: 'Um registro DNS publicado não prova que os e-mails enviados estejam sendo assinados. Verifique o status final do DKIM na administração do provedor de e-mail.',\n dkimOpenGuide: (provider: string) => `Abrir o guia oficial de configuração do DKIM do ${provider}`,\n cancelledDescription: (domain: string) => `A conexão de ${domain} foi cancelada. Nenhuma outra alteração de DNS será aplicada.`,\n selectedProvider: (provider: string, support: string) => `${provider} selecionado. ${support}`,\n currentState: (state: string) => `Esta conexão está ${state}. Atualize para carregar o estado mais recente.`,\n refreshConnection: 'Atualizar conexão',\n domainConnectHeading: 'Conectar pelo Domain Connect',\n domainConnectGuidance: 'Seu provedor de DNS mostrará o modelo de serviço exato e solicitará seu consentimento antes de aplicá-lo.',\n domainConnectResumeUnavailable: 'Este aplicativo host deve fornecer o mesmo modelo de serviço do Domain Connect para retomar esta transferência.',\n domainConnectUnavailable: 'Este aplicativo host não configurou seu modelo de serviço do Domain Connect. A configuração manual guiada continua disponível.',\n continueSecurely: (provider: string) => `Continuar com segurança com ${provider}`,\n continueSecurelyNewTab: (provider: string) => `Continuar com segurança com ${provider} em uma nova aba`,\n completedDomainConnect: 'Concluí o Domain Connect',\n preparingAuthoritativeVerification: 'Preparando a verificação do DNS autoritativo…',\n readyToVerifyPropagation: 'Pronto para verificar a propagação do DNS.',\n resumeDomainConnect: (provider: string) => `Retomar o Domain Connect com ${provider}`,\n connectWithProvider: (provider: string) => `Conectar com ${provider}`,\n checkingDomainConnectTemplate: 'Verificando se seu provedor de DNS aceita este modelo de serviço exato…',\n domainConnectReady: 'O Domain Connect está pronto. Continue com seu provedor de DNS em uma nova aba.',\n followProviderGuide: (provider: string) => `Seguir o guia passo a passo do ${provider}`,\n openApplicationManualSetupGuide: 'Abrir o guia passo a passo de DNS deste aplicativo',\n requestManualSetupHelp: 'Obter ajuda passo a passo para o DNS',\n openProviderReference: (provider: string) => `Abrir a referência do provedor ${provider}`,\n opensInNewTab: (label: string) => `${label} em uma nova aba`,\n sharedFlowHeading: 'Peça a outra pessoa para concluir a configuração',\n sharedFlowGuidance: 'Copie um link com prazo limitado para uma pessoa de confiança que possa atualizar este domínio. O link concede acesso somente a esta conexão.',\n copySecureSetupLink: 'Copiar link seguro de configuração',\n creatingSecureSetupLink: 'Criando link seguro de configuração…',\n secureSetupLinkCopied: 'Link seguro de configuração copiado.',\n copySetupLinkAgain: 'Copiar o link de configuração novamente',\n expiredSharedFlow: 'O host retornou um convite de fluxo compartilhado expirado',\n clipboardUnavailable: 'O acesso à área de transferência está indisponível; configure sharedFlowGateway.copy',\n oauthHeading: 'Autorize com segurança no provedor',\n oauthGuidance: 'O Domain0 usa OAuth com PKCE. Sua senha do provedor nunca é compartilhada com o Domain0.',\n continueToProvider: (provider: string) => `Continuar para ${provider}`,\n authorizationExpires: 'Este link de autorização expira em {DATE}.',\n completedAuthorization: 'Concluí a autorização',\n resumeAuthorization: (provider: string) => `Retomar a autorização com ${provider}`,\n authorizeWithProvider: (provider: string) => `Autorizar com ${provider}`,\n authorizeProviderCredentials: (provider: string) => `Autorizar ${provider}`,\n preparingAuthorizationLink: 'Preparando um link seguro de autorização do provedor…',\n authorizationLinkReady: 'O link de autorização está pronto. Continue com o provedor em uma nova aba.',\n credentialGuidance: 'Use uma credencial do provedor com o menor escopo possível. O Domain0 a criptografa no servidor e nunca a devolve ao navegador.',\n credentialHeadingApiToken: 'Autorizar com um token de API',\n credentialHeadingAccessKey: 'Autorizar com chaves de API',\n credentialHeadingUsernamePassword: 'Autorizar com credenciais do provedor',\n credentialHeadingAccountToken: 'Autorizar com um token de conta',\n credentialHeadingUsernameToken: 'Autorizar com um token de usuário',\n credentialHeadingOvh: 'Autorizar com credenciais da API OVH',\n credentialHeadingPrivateKey: 'Autorizar com uma chave privada',\n credentialHeadingAwsSession: 'Autorizar com uma sessão temporária da AWS',\n credentialHeadingCpanel: 'Autorizar com um token de API do cPanel',\n credentialHeadingClientCredentials: 'Autorizar com credenciais da OpenSRS Storefront',\n fieldApiToken: 'Token de API',\n fieldAccessKeyId: 'ID da chave de acesso',\n fieldApiSecret: 'Segredo da API',\n fieldUsername: 'Nome de usuário',\n fieldPassword: 'Senha',\n fieldAccountId: 'ID da conta',\n fieldOvhRegion: 'Região da API OVH',\n fieldApplicationKey: 'Chave do aplicativo',\n fieldApplicationSecret: 'Segredo do aplicativo',\n fieldConsumerKey: 'Chave do consumidor',\n fieldProviderLogin: 'Login do provedor',\n fieldPemPrivateKey: 'Chave privada PEM',\n fieldAwsAccessKeyId: 'ID da chave de acesso da AWS',\n fieldAwsSecretAccessKey: 'Chave de acesso secreta da AWS',\n fieldAwsSessionToken: 'Token de sessão da AWS',\n fieldRoute53ZoneId: 'ID da zona hospedada do Route 53',\n fieldSessionExpiration: 'Expiração da sessão',\n fieldCpanelEndpoint: 'Endpoint HTTPS do cPanel',\n fieldCpanelUsername: 'Nome de usuário do cPanel',\n fieldCpanelApiToken: 'Token de API do cPanel',\n fieldStorefrontClientId: 'ID do cliente da Storefront',\n fieldStorefrontClientSecret: 'Segredo do cliente da Storefront',\n regionOvhEurope: 'OVH Europa',\n regionOvhUnitedStates: 'OVH Estados Unidos',\n regionOvhCanada: 'OVH Canadá',\n regionKimsufiEurope: 'Kimsufi Europa',\n regionKimsufiCanada: 'Kimsufi Canadá',\n regionSoYouStartEurope: 'So You Start Europa',\n regionSoYouStartCanada: 'So You Start Canadá',\n authorizeApiToken: 'Autorizar token de API',\n encryptingAuthorization: 'Criptografando e validando a autorização do provedor…',\n authorizationCompleted: 'Autorização do provedor concluída.',\n existingRecordPolicy: 'Política para registros DNS existentes',\n existingRecordPolicyHelp: 'Preservar é a opção mais segura. Políticas de substituição podem propor alterações destrutivas que exigem confirmação separada.',\n preserveExistingRecords: 'Preservar registros existentes',\n replaceSameNameAndType: 'Substituir registros com o mesmo host e tipo',\n replaceAllAtName: 'Substituir todos os registros conflitantes no host',\n replaceSpf: 'Substituir uma política SPF existente em vez de combiná-la',\n replaceSpfHelp: 'A combinação é o padrão seguro. A substituição remove os mecanismos SPF atuais do provedor e sempre exige confirmação da alteração destrutiva.',\n readingRecords: 'Lendo os registros atuais do provedor e preparando um plano de alterações…',\n recordsAlreadyExist: 'Os registros DNS obrigatórios já existem. Pronto para verificar a propagação.',\n reviewChanges: 'Revise as alterações de DNS propostas antes de confirmar.',\n reviewDnsChanges: 'Revisar alterações de DNS',\n recalculateChangePlan: 'Recalcular plano de alterações',\n proposedChangesRegion: 'Alterações de DNS propostas',\n proposedChangesCaption: (domain: string) => `Alterações de DNS propostas para ${domain}`,\n columnAction: 'Ação',\n columnCurrentRecord: 'Registro atual',\n columnResultingRecord: 'Registro resultante',\n columnRisk: 'Risco',\n changeCreate: 'Criar',\n changeUpdate: 'Atualizar',\n changeDelete: 'Excluir',\n destructive: 'Destrutiva',\n nonDestructive: 'Não destrutiva',\n planWarnings: 'Avisos do plano',\n planWarningSpfPolicyReplaced: 'A política SPF existente será substituída pela política SPF solicitada.',\n planWarningSpfPolicyMerged: 'A política SPF existente foi combinada com o registro SPF solicitado.',\n planExpires: 'Este plano expira em {DATE}.',\n destructiveAcknowledgement: 'Entendo que os registros DNS existentes marcados serão substituídos ou excluídos.',\n confirmChangePlan: 'Confirmar plano de alterações',\n confirmingChangePlan: 'Confirmando este plano de alterações exato…',\n planConfirmed: 'Plano confirmado. As alterações de DNS ainda não foram aplicadas.',\n applyDnsChanges: 'Aplicar alterações de DNS',\n applyingDnsChanges: 'Aplicando as alterações de DNS confirmadas…',\n dnsChangesApplied: 'As alterações de DNS foram aplicadas. Pronto para verificar a propagação autoritativa.',\n detectionReasonNoStablePublicProviderIdentity: 'Este provedor não publica uma identidade pública estável que o Domain0 possa detectar com segurança pelo DNS.',\n manualGuidance: 'Use a configuração manual guiada para adicionar os registros DNS obrigatórios exatos sem compartilhar credenciais do provedor.',\n manualSetupUnavailableHeading: 'Configuração manual indisponível',\n manualSetupUnavailableDescription: 'A configuração manual de DNS foi desativada por este aplicativo. Use outro caminho verificado disponível ou cancele ou feche esta conexão.',\n showDnsRecords: 'Mostrar registros DNS',\n preparingDnsInstructions: 'Preparando instruções de DNS…',\n dnsInstructionsReady: 'As instruções de DNS estão prontas.',\n addResolvedRecords: 'Adicione estes registros resolvidos no seu provedor de DNS e continue.',\n authoritativeRecordGuidance: 'Estes são os registros que o Domain0 verifica diretamente em cada servidor de nomes autoritativo.',\n dnsRecordsRegion: 'Registros DNS',\n dnsRecordsCaption: (domain: string) => `Registros DNS de ${domain}`,\n thisDomain: 'este domínio',\n columnType: 'Tipo',\n columnHost: 'Host',\n columnValue: 'Valor',\n columnTtl: 'TTL',\n columnPriority: 'Prioridade',\n columnRequirement: 'Obrigatoriedade',\n optional: 'Opcional',\n required: 'Obrigatório',\n noRecordChanges: 'A política de DNS existente atende a esta solicitação. Nenhuma alteração de registro DNS é necessária.',\n addedRecords: 'Adicionei estes registros',\n continue: 'Continuar',\n savingConfirmation: 'Salvando sua confirmação…',\n verifyDnsRecords: 'Verificar registros DNS',\n finishConnection: 'Concluir conexão',\n checkingNameservers: 'Verificando servidores de nomes autoritativos…',\n requiredRecordsActive: 'Os registros DNS obrigatórios estão ativos.',\n propagationPending: 'As alterações de DNS ainda não chegaram a todos os servidores de nomes autoritativos. Você pode verificar novamente.',\n providerFailureHeading: 'A operação do provedor precisa de atenção',\n snapshotTimeout: 'O Domain0 excedeu o tempo limite ao ler os registros DNS do provedor. Nenhuma alteração de DNS foi feita. Uma nova tentativa restaura a etapa de revisão anterior para que você solicite um novo instantâneo.',\n applyTimeout: 'O provedor não confirmou a atualização do DNS antes do prazo, então o resultado é ambíguo. Uma nova tentativa restaura a etapa de aplicação confirmada; o Domain0 reconcilia os registros atuais do provedor antes de outra gravação.',\n timeoutRecorded: 'O tempo limite foi registrado em {DATE}.',\n retryConnection: 'Tentar conexão novamente',\n restoringConnection: 'Restaurando a conexão para o estado anterior à falha…',\n connectionRestored: (state: string) => `Conexão restaurada para ${state}. Continue quando estiver pronto.`,\n cancelHeading: 'Cancelar esta conexão?',\n cancelGuidance: 'O cancelamento interrompe este fluxo do Domain0. Ele não remove registros DNS que já foram aplicados.',\n keepConnection: 'Manter conexão',\n confirmCancellation: 'Confirmar cancelamento',\n cancellingConnection: 'Cancelando conexão…',\n connectionCancelled: 'Conexão cancelada.',\n dnsProvider: 'Provedor de DNS',\n providerHelp: 'Selecione a empresa onde você gerencia os registros DNS deste domínio.',\n detectedProviderHelp: 'O Domain0 encontrou possíveis provedores usando informações públicas do DNS. Confirme a empresa onde você gerencia os registros DNS.',\n chooseProvider: 'Escolher um provedor',\n suggestedFromDns: 'Sugerido pelo DNS',\n allOtherProviders: 'Todos os outros provedores',\n continueWithProvider: 'Continuar com o provedor',\n savingProviderSelection: 'Salvando a seleção do provedor…',\n preparingProviderSelection: 'Preparando a seleção do provedor…',\n providerDetected: (provider: string) => `${provider} detectado.`,\n providerSelected: (provider: string) => `${provider} selecionado.`,\n preparingManualInstructions: 'Preparando instruções guiadas para a configuração manual de DNS…',\n manualSetupNotEntered: 'O servidor não entrou na configuração manual guiada',\n noProviderDetected: 'Nenhum provedor foi identificado automaticamente. Escolha seu provedor de DNS abaixo.',\n possibleProviderFound: 'Foi encontrado 1 possível provedor de DNS. Confirme seu provedor abaixo.',\n possibleProvidersFound: (count: string) => `Foram encontrados ${count} possíveis provedores de DNS. Confirme seu provedor abaixo.`,\n supportAutomatic: 'automático',\n supportDomainConnect: 'Domain Connect',\n supportManual: 'manual guiado',\n supportUnverified: 'ainda não verificado',\n supportAutomaticDescription: 'O adaptador automático está verificado; a configuração manual guiada também está disponível.',\n supportDomainConnectDescription: 'O caminho do Domain Connect está verificado; a configuração manual guiada também está disponível.',\n supportManualDescription: 'O caminho manual guiado está verificado.',\n supportUnverifiedDescription: 'A automação específica do provedor não está verificada; a configuração manual guiada continua disponível.',\n recordSummary: (type: string, host: string, value: string, ttl: string, priority: string) => `${type} ${host} = ${value}; TTL ${ttl}${priority}`,\n recordPriority: (priority: string) => `; prioridade ${priority}`,\n errorPrefix: (message: string) => `Erro: ${message}`,\n unknownError: 'Erro desconhecido',\n transportError: 'Não foi possível acessar o Domain0. Verifique sua conexão e tente novamente.',\n protocolError: 'O Domain0 retornou uma resposta inválida. Tente novamente ou entre em contato com o operador do aplicativo.',\n apiErrorInvalidRequest: 'A solicitação é inválida.',\n apiErrorUnauthorized: 'A autenticação falhou. Reabra o fluxo de conexão e tente novamente.',\n apiErrorForbidden: 'Você não tem permissão para realizar esta operação.',\n apiErrorNotFound: 'O recurso de conexão solicitado não foi encontrado ou expirou.',\n apiErrorConflict: 'A conexão mudou antes que esta operação fosse concluída. Atualize e tente novamente.',\n apiErrorRateLimited: 'Muitas solicitações foram feitas. Aguarde um pouco e tente novamente.',\n apiErrorDnsUnavailable: 'O DNS autoritativo está temporariamente indisponível. Tente novamente.',\n apiErrorProviderUnavailable: 'O provedor de DNS está temporariamente indisponível. Tente novamente.',\n apiErrorProviderAuthorizationFailed: 'A autorização do provedor de DNS falhou ou expirou.',\n apiErrorProviderLimitation: 'O provedor selecionado não pode concluir esta operação automaticamente.',\n apiErrorPlanExpired: 'O plano de alterações de DNS expirou. Prepare e revise um novo plano.',\n apiErrorPropagationPending: 'As alterações de DNS ainda não chegaram a todos os servidores de nomes autoritativos.',\n apiErrorInternal: 'O Domain0 encontrou um erro inesperado. Tente novamente.',\n loadingFlow: 'Carregando o fluxo de conexão de domínios…',\n flowNotReady: 'As conexões de domínio ainda estão sendo preparadas. Reabra este fluxo para tentar novamente.',\n flowStep: (index: string, domain: string) => `${index}. ${domain}`,\n flowStepConnected: (index: string, domain: string) => `${index}. ${domain} — conectado`,\n allDomainsConnected: (count: string) => `Todos os ${count} domínios estão conectados.`,\n domainProgress: (index: string, total: string, domain: string) => `Domínio ${index} de ${total}: ${domain}`,\n connectionStateRequested: 'solicitada',\n connectionStateDetectingProvider: 'detectando o provedor',\n connectionStateProviderSelected: 'com o provedor selecionado',\n connectionStateDomainConnectPending: 'aguardando o Domain Connect',\n connectionStateAuthorizationPending: 'aguardando autorização',\n connectionStateAuthorized: 'autorizada',\n connectionStatePlanning: 'em planejamento',\n connectionStateAwaitingConfirmation: 'aguardando confirmação',\n connectionStateApplying: 'em aplicação',\n connectionStatePropagationPending: 'aguardando propagação',\n connectionStateActive: 'ativa',\n connectionStateManualRequired: 'exige configuração manual',\n connectionStateFailedRetryable: 'com falha temporária',\n connectionStateFailedTerminal: 'com falha',\n connectionStateCancelled: 'cancelada',\n} satisfies Domain0Messages\n","import type { Domain0Messages } from '../localization'\nimport { brazilianPortugueseMessages } from './pt-br'\n\nconst europeanPortugueseOverrides = {\n headingConnectDomain: 'Ligue o seu domínio',\n headingConnectDomains: 'Ligue os seus domínios',\n initialSubtitle: 'Escolha o seu fornecedor de DNS. O Domain0 mostrará o caminho de ligação verificado disponível.',\n loadingConnection: 'A carregar os detalhes da ligação…',\n detectingProvider: 'A detetar o seu fornecedor de DNS…',\n detectionUnavailable: 'A deteção automática do fornecedor está temporariamente indisponível. Escolha abaixo o seu fornecedor de DNS.',\n connectionStatus: (state: string) => `Estado da ligação: ${state}.`,\n forcedManualBlocked: 'Esta ligação já entrou num fluxo automático do fornecedor. O modo manual forçado não o pode retomar nem avançar. Cancele esta ligação e crie uma nova ligação manual.',\n forcedManualIncompatible: 'A ligação existente é incompatível com a configuração manual forçada',\n successDescription: (domain: string) => `${domain} está ligado e os respetivos registos obrigatórios foram propagados.`,\n cancelledDescription: (domain: string) => `A ligação de ${domain} foi cancelada. Não serão aplicadas mais alterações de DNS.`,\n currentState: (state: string) => `Esta ligação encontra-se ${state}. Atualize para carregar o estado mais recente.`,\n refreshConnection: 'Atualizar ligação',\n continueSecurelyNewTab: (provider: string) => `Continuar em segurança com ${provider} num novo separador`,\n domainConnectReady: 'O Domain Connect está pronto. Continue com o seu fornecedor de DNS num novo separador.',\n opensInNewTab: (label: string) => `${label} num novo separador`,\n sharedFlowGuidance: 'Copie uma ligação com prazo limitado para uma pessoa de confiança que possa atualizar este domínio. A ligação concede acesso apenas a esta ligação de domínio.',\n copySecureSetupLink: 'Copiar ligação segura de configuração',\n creatingSecureSetupLink: 'A criar uma ligação segura de configuração…',\n secureSetupLinkCopied: 'Ligação segura de configuração copiada.',\n copySetupLinkAgain: 'Copiar novamente a ligação de configuração',\n authorizationExpires: 'Esta ligação de autorização expira em {DATE}.',\n preparingAuthorizationLink: 'A preparar uma ligação segura de autorização do fornecedor…',\n authorizationLinkReady: 'A ligação de autorização está pronta. Continue com o fornecedor num novo separador.',\n credentialGuidance: 'Utilize uma credencial do fornecedor com o âmbito mínimo. O Domain0 cifra-a no servidor e nunca a devolve ao navegador.',\n encryptingAuthorization: 'A cifrar e validar a autorização do fornecedor…',\n existingRecordPolicy: 'Política para registos DNS existentes',\n preserveExistingRecords: 'Preservar registos existentes',\n replaceSameNameAndType: 'Substituir registos com o mesmo anfitrião e tipo',\n replaceAllAtName: 'Substituir todos os registos em conflito no anfitrião',\n readingRecords: 'A ler os registos atuais do fornecedor e a preparar um plano de alterações…',\n recordsAlreadyExist: 'Os registos DNS obrigatórios já existem. Pronto para verificar a propagação.',\n reviewDnsChanges: 'Rever alterações de DNS',\n proposedChangesCaption: (domain: string) => `Alterações de DNS propostas para ${domain}`,\n columnCurrentRecord: 'Registo atual',\n columnResultingRecord: 'Registo resultante',\n changeDelete: 'Eliminar',\n planWarningSpfPolicyMerged: 'A política SPF existente foi combinada com o registo SPF solicitado.',\n destructiveAcknowledgement: 'Compreendo que os registos DNS existentes assinalados serão substituídos ou eliminados.',\n applyingDnsChanges: 'A aplicar as alterações de DNS confirmadas…',\n manualGuidance: 'Utilize a configuração manual guiada para adicionar os registos DNS obrigatórios exatos sem partilhar credenciais do fornecedor.',\n showDnsRecords: 'Mostrar registos DNS',\n preparingDnsInstructions: 'A preparar instruções de DNS…',\n dnsInstructionsReady: 'As instruções de DNS estão prontas.',\n addResolvedRecords: 'Adicione estes registos resolvidos no seu fornecedor de DNS e continue.',\n authoritativeRecordGuidance: 'Estes são os registos que o Domain0 verifica diretamente em cada servidor de nomes autoritativo.',\n dnsRecordsRegion: 'Registos DNS',\n dnsRecordsCaption: (domain: string) => `Registos DNS de ${domain}`,\n noRecordChanges: 'A política de DNS existente satisfaz este pedido. Não é necessária nenhuma alteração de registo DNS.',\n addedRecords: 'Adicionei estes registos',\n verifyDnsRecords: 'Verificar registos DNS',\n checkingNameservers: 'A verificar os servidores de nomes autoritativos…',\n requiredRecordsActive: 'Os registos DNS obrigatórios estão ativos.',\n propagationPending: 'As alterações de DNS ainda não chegaram a todos os servidores de nomes autoritativos. Pode verificar novamente.',\n snapshotTimeout: 'O Domain0 excedeu o tempo limite ao ler os registos DNS do fornecedor. Não foi feita nenhuma alteração de DNS. Uma nova tentativa restaura a etapa de revisão anterior para que possa pedir um novo instantâneo.',\n applyTimeout: 'O fornecedor não confirmou a atualização do DNS antes do prazo, pelo que o resultado é ambíguo. Uma nova tentativa restaura a etapa de aplicação confirmada; o Domain0 reconcilia os registos atuais do fornecedor antes de outra escrita.',\n restoringConnection: 'A restaurar a ligação para o estado anterior à falha…',\n connectionRestored: (state: string) => `Ligação restaurada para ${state}. Continue quando estiver pronto.`,\n cancelHeading: 'Cancelar esta ligação?',\n cancelGuidance: 'O cancelamento interrompe este fluxo do Domain0. Não remove registos DNS que já tenham sido aplicados.',\n keepConnection: 'Manter ligação',\n cancellingConnection: 'A cancelar a ligação…',\n connectionCancelled: 'Ligação cancelada.',\n dnsProvider: 'Fornecedor de DNS',\n providerHelp: 'Selecione a empresa onde gere os registos DNS deste domínio.',\n detectedProviderHelp: 'O Domain0 encontrou possíveis fornecedores através de informações públicas de DNS. Confirme a empresa onde gere os registos DNS.',\n chooseProvider: 'Escolher um fornecedor',\n allOtherProviders: 'Todos os outros fornecedores',\n continueWithProvider: 'Continuar com o fornecedor',\n savingProviderSelection: 'A guardar a seleção do fornecedor…',\n preparingProviderSelection: 'A preparar a seleção do fornecedor…',\n providerDetected: (provider: string) => `${provider} detetado.`,\n preparingManualInstructions: 'A preparar instruções guiadas para a configuração manual de DNS…',\n noProviderDetected: 'Nenhum fornecedor foi identificado automaticamente. Escolha abaixo o seu fornecedor de DNS.',\n possibleProviderFound: 'Foi encontrado 1 possível fornecedor de DNS. Confirme abaixo o seu fornecedor.',\n possibleProvidersFound: (count: string) => `Foram encontrados ${count} possíveis fornecedores de DNS. Confirme abaixo o seu fornecedor.`,\n supportAutomaticDescription: 'O adaptador automático está verificado; a configuração manual guiada também está disponível.',\n supportDomainConnectDescription: 'O caminho do Domain Connect está verificado; a configuração manual guiada também está disponível.',\n supportUnverifiedDescription: 'A automatização específica do fornecedor não está verificada; a configuração manual guiada continua disponível.',\n unknownError: 'Erro desconhecido',\n transportError: 'Não foi possível contactar o Domain0. Verifique a sua ligação e tente novamente.',\n protocolError: 'O Domain0 devolveu uma resposta inválida. Tente novamente ou contacte o operador da aplicação.',\n apiErrorInvalidRequest: 'O pedido é inválido.',\n apiErrorUnauthorized: 'A autenticação falhou. Reabra o fluxo de ligação e tente novamente.',\n apiErrorForbidden: 'Não tem permissão para realizar esta operação.',\n apiErrorNotFound: 'O recurso de ligação solicitado não foi encontrado ou expirou.',\n apiErrorConflict: 'A ligação mudou antes de esta operação terminar. Atualize e tente novamente.',\n apiErrorRateLimited: 'Foram feitos demasiados pedidos. Aguarde um pouco e tente novamente.',\n apiErrorProviderUnavailable: 'O fornecedor de DNS está temporariamente indisponível. Tente novamente.',\n apiErrorProviderAuthorizationFailed: 'A autorização do fornecedor de DNS falhou ou expirou.',\n apiErrorProviderLimitation: 'O fornecedor selecionado não pode concluir esta operação automaticamente.',\n apiErrorPropagationPending: 'As alterações de DNS ainda não chegaram a todos os servidores de nomes autoritativos.',\n loadingFlow: 'A carregar o fluxo de ligação de domínios…',\n flowNotReady: 'As ligações de domínio ainda estão a ser preparadas. Reabra este fluxo para tentar novamente.',\n flowStepConnected: (index: string, domain: string) => `${index}. ${domain} — ligado`,\n allDomainsConnected: (count: string) => `Todos os ${count} domínios estão ligados.`,\n connectionStateRequested: 'solicitada',\n connectionStateDetectingProvider: 'a detetar o fornecedor',\n connectionStateProviderSelected: 'com o fornecedor selecionado',\n connectionStateAuthorizationPending: 'a aguardar autorização',\n connectionStateAuthorized: 'autorizada',\n connectionStatePlanning: 'em planeamento',\n connectionStateAwaitingConfirmation: 'a aguardar confirmação',\n connectionStateApplying: 'em aplicação',\n connectionStatePropagationPending: 'a aguardar propagação',\n connectionStateActive: 'ativa',\n connectionStateManualRequired: 'requer configuração manual',\n connectionStateFailedRetryable: 'com falha temporária',\n connectionStateFailedTerminal: 'com falha',\n connectionStateCancelled: 'cancelada',\n} satisfies Partial<Domain0Messages>\n\nexport const europeanPortugueseMessages = {\n ...brazilianPortugueseMessages,\n ...europeanPortugueseOverrides,\n} satisfies Domain0Messages\n","import type {\n ConnectionState,\n Domain0ErrorCode,\n Domain0Locale,\n PlanWarningCode,\n ProviderDetectionUnavailableReasonCode,\n} from '../contracts'\nimport { Domain0LocaleSchema } from '../contracts'\nimport { spanishMessages } from './locales/es'\nimport { frenchMessages } from './locales/fr'\nimport { brazilianPortugueseMessages } from './locales/pt-br'\nimport { europeanPortugueseMessages } from './locales/pt-pt'\n\nconst englishMessages = {\n triggerConnectDomain: 'Connect domain',\n headingConnectDomain: 'Connect your domain',\n headingConnectDomains: 'Connect your domains',\n initialSubtitle: 'Choose your DNS provider. Domain0 will show the verified connection path available for it.',\n cancelConnection: 'Cancel connection',\n close: 'Close',\n loadingConnection: 'Loading connection details…',\n detectingProvider: 'Detecting your DNS provider…',\n detectionUnavailable: 'Automatic provider detection is temporarily unavailable. Choose your DNS provider below.',\n connectionStatus: (state: string) => `Connection status: ${state}.`,\n manualInstructionsReady: 'Guided manual DNS instructions are ready.',\n forcedManualBlocked: 'This connection already entered an automatic provider workflow. Forced manual mode will not resume or advance it. Cancel this connection and create a new manual connection.',\n forcedManualIncompatible: 'The existing connection is incompatible with forced manual setup',\n missingConfirmationPlan: 'The server returned a confirmation state without a change plan',\n missingApplyingPlan: 'The server returned an applying state without a confirmed plan',\n missingFailureDetails: 'The server returned a retryable state without failure details',\n successDescription: (domain: string) => `${domain} is connected and its required records have propagated.`,\n dkimHeading: 'Secure outgoing email with DKIM',\n dkimCheckingProvider: 'Checking public MX and selector-specific DKIM DNS records…',\n dkimGuidanceUnavailable: 'Email-provider detection is temporarily unavailable. No DNS changes were made.',\n dkimDomainMismatch: 'The server returned DKIM guidance for a different domain',\n dkimProviderDetected: (provider: string) => `${provider} was detected from public MX records.`,\n dkimProviderAmbiguous: 'MX records point to more than one supported email provider. Review the mail routing before changing DKIM.',\n dkimProviderUnknown: 'Domain0 could not identify Google Workspace, Microsoft 365, or Zoho Mail from the public MX records.',\n dkimRecordObserved: (selectors: string) => `A DKIM DNS record was observed for the checked selector(s): ${selectors}.`,\n dkimNoRecordObserved: (selectors: string) => `No DKIM DNS record was observed for the checked selector(s): ${selectors}. This does not prove that DKIM is disabled.`,\n dkimNotChecked: 'This provider uses an account-defined DKIM selector, so no selector record was checked automatically.',\n dkimLookupUnavailable: 'The selector-specific DKIM DNS check was temporarily unavailable.',\n dkimEvidenceBoundary: 'A published DNS record does not prove that outgoing mail is being signed. Verify the final DKIM status in the email provider admin.',\n dkimOpenGuide: (provider: string) => `Open the official ${provider} DKIM setup guide`,\n cancelledDescription: (domain: string) => `The connection for ${domain} was cancelled. No further DNS changes will be applied.`,\n selectedProvider: (provider: string, support: string) => `${provider} selected. ${support}`,\n currentState: (state: string) => `This connection is currently ${state}. Refresh to load its latest state.`,\n refreshConnection: 'Refresh connection',\n domainConnectHeading: 'Connect through Domain Connect',\n domainConnectGuidance: 'Your DNS provider will show the exact service template and ask for consent before applying it.',\n domainConnectResumeUnavailable: 'This host application must provide the same Domain Connect service template to resume this handoff.',\n domainConnectUnavailable: 'This host application has not configured its Domain Connect service template. Guided manual setup remains available.',\n continueSecurely: (provider: string) => `Continue securely with ${provider}`,\n continueSecurelyNewTab: (provider: string) => `Continue securely with ${provider} in a new tab`,\n completedDomainConnect: 'I completed Domain Connect',\n preparingAuthoritativeVerification: 'Preparing authoritative DNS verification…',\n readyToVerifyPropagation: 'Ready to verify DNS propagation.',\n resumeDomainConnect: (provider: string) => `Resume Domain Connect with ${provider}`,\n connectWithProvider: (provider: string) => `Connect with ${provider}`,\n checkingDomainConnectTemplate: 'Checking that your DNS provider supports this exact service template…',\n domainConnectReady: 'Domain Connect is ready. Continue with your DNS provider in a new tab.',\n followProviderGuide: (provider: string) => `Follow the ${provider} step-by-step guide`,\n openApplicationManualSetupGuide: 'Open this application\\'s step-by-step DNS guide',\n requestManualSetupHelp: 'Get step-by-step DNS help',\n openProviderReference: (provider: string) => `Open ${provider} provider reference`,\n opensInNewTab: (label: string) => `${label} in a new tab`,\n sharedFlowHeading: 'Ask someone else to finish setup',\n sharedFlowGuidance: 'Copy a time-limited link for a trusted person who can update this domain. The link grants access only to this connection.',\n copySecureSetupLink: 'Copy secure setup link',\n creatingSecureSetupLink: 'Creating a secure setup link…',\n secureSetupLinkCopied: 'Secure setup link copied.',\n copySetupLinkAgain: 'Copy setup link again',\n expiredSharedFlow: 'The host returned an expired shared-flow invitation',\n clipboardUnavailable: 'Clipboard access is unavailable; configure sharedFlowGateway.copy',\n oauthHeading: 'Authorize securely with the provider',\n oauthGuidance: 'Domain0 uses OAuth with PKCE. Your provider password is never shared with Domain0.',\n continueToProvider: (provider: string) => `Continue to ${provider}`,\n authorizationExpires: 'This authorization link expires at {DATE}.',\n completedAuthorization: 'I completed authorization',\n resumeAuthorization: (provider: string) => `Resume authorization with ${provider}`,\n authorizeWithProvider: (provider: string) => `Authorize with ${provider}`,\n authorizeProviderCredentials: (provider: string) => `Authorize ${provider}`,\n preparingAuthorizationLink: 'Preparing a secure provider authorization link…',\n authorizationLinkReady: 'Authorization link ready. Continue with the provider in a new tab.',\n credentialGuidance: 'Use a minimally scoped provider credential. Domain0 encrypts it server-side and never returns it to the browser.',\n credentialHeadingApiToken: 'Authorize with an API token',\n credentialHeadingAccessKey: 'Authorize with API keys',\n credentialHeadingUsernamePassword: 'Authorize with provider credentials',\n credentialHeadingAccountToken: 'Authorize with an account token',\n credentialHeadingUsernameToken: 'Authorize with a user token',\n credentialHeadingOvh: 'Authorize with OVH API credentials',\n credentialHeadingPrivateKey: 'Authorize with a private key',\n credentialHeadingAwsSession: 'Authorize with a temporary AWS session',\n credentialHeadingCpanel: 'Authorize with a cPanel API token',\n credentialHeadingClientCredentials: 'Authorize with OpenSRS Storefront credentials',\n fieldApiToken: 'API token',\n fieldAccessKeyId: 'Access key ID',\n fieldApiSecret: 'API secret',\n fieldUsername: 'Username',\n fieldPassword: 'Password',\n fieldAccountId: 'Account ID',\n fieldOvhRegion: 'OVH API region',\n fieldApplicationKey: 'Application key',\n fieldApplicationSecret: 'Application secret',\n fieldConsumerKey: 'Consumer key',\n fieldProviderLogin: 'Provider login',\n fieldPemPrivateKey: 'PEM private key',\n fieldAwsAccessKeyId: 'AWS access key ID',\n fieldAwsSecretAccessKey: 'AWS secret access key',\n fieldAwsSessionToken: 'AWS session token',\n fieldRoute53ZoneId: 'Route 53 hosted zone ID',\n fieldSessionExpiration: 'Session expiration',\n fieldCpanelEndpoint: 'cPanel HTTPS endpoint',\n fieldCpanelUsername: 'cPanel username',\n fieldCpanelApiToken: 'cPanel API token',\n fieldStorefrontClientId: 'Storefront client ID',\n fieldStorefrontClientSecret: 'Storefront client secret',\n regionOvhEurope: 'OVH Europe',\n regionOvhUnitedStates: 'OVH United States',\n regionOvhCanada: 'OVH Canada',\n regionKimsufiEurope: 'Kimsufi Europe',\n regionKimsufiCanada: 'Kimsufi Canada',\n regionSoYouStartEurope: 'So You Start Europe',\n regionSoYouStartCanada: 'So You Start Canada',\n authorizeApiToken: 'Authorize API token',\n encryptingAuthorization: 'Encrypting and validating provider authorization…',\n authorizationCompleted: 'Provider authorization completed.',\n existingRecordPolicy: 'Existing DNS record policy',\n existingRecordPolicyHelp: 'Preserve is safest. Replacement policies may propose destructive changes that require separate confirmation.',\n preserveExistingRecords: 'Preserve existing records',\n replaceSameNameAndType: 'Replace records with the same host and type',\n replaceAllAtName: 'Replace all conflicting records at the host',\n replaceSpf: 'Replace an existing SPF policy instead of merging it',\n replaceSpfHelp: 'Merging is the safe default. Replacement removes the provider\\'s current SPF mechanisms and always requires destructive-change confirmation.',\n readingRecords: 'Reading current provider records and preparing a change plan…',\n recordsAlreadyExist: 'The required DNS records already exist. Ready to verify propagation.',\n reviewChanges: 'Review the proposed DNS changes before confirmation.',\n reviewDnsChanges: 'Review DNS changes',\n recalculateChangePlan: 'Recalculate change plan',\n proposedChangesRegion: 'Proposed DNS changes',\n proposedChangesCaption: (domain: string) => `Proposed DNS changes for ${domain}`,\n columnAction: 'Action',\n columnCurrentRecord: 'Current record',\n columnResultingRecord: 'Resulting record',\n columnRisk: 'Risk',\n changeCreate: 'Create',\n changeUpdate: 'Update',\n changeDelete: 'Delete',\n destructive: 'Destructive',\n nonDestructive: 'Non-destructive',\n planWarnings: 'Plan warnings',\n planWarningSpfPolicyReplaced: 'The existing SPF policy will be replaced by the requested SPF policy.',\n planWarningSpfPolicyMerged: 'The existing SPF policy was merged into the requested SPF record.',\n planExpires: 'This plan expires at {DATE}.',\n destructiveAcknowledgement: 'I understand that the marked existing DNS records will be replaced or deleted.',\n confirmChangePlan: 'Confirm change plan',\n confirmingChangePlan: 'Confirming this exact change plan…',\n planConfirmed: 'Plan confirmed. DNS changes have not been applied yet.',\n applyDnsChanges: 'Apply DNS changes',\n applyingDnsChanges: 'Applying the confirmed DNS changes…',\n dnsChangesApplied: 'DNS changes were applied. Ready to verify authoritative propagation.',\n detectionReasonNoStablePublicProviderIdentity: 'This provider does not publish a stable public identity that Domain0 can safely detect from DNS.',\n manualGuidance: 'Use guided manual setup to add the exact required DNS records without sharing provider credentials.',\n manualSetupUnavailableHeading: 'Manual setup unavailable',\n manualSetupUnavailableDescription: 'Manual DNS setup is disabled by this application. Use another available verified path, or cancel or close this connection.',\n showDnsRecords: 'Show DNS records',\n preparingDnsInstructions: 'Preparing DNS instructions…',\n dnsInstructionsReady: 'DNS instructions are ready.',\n addResolvedRecords: 'Add these resolved records in your DNS provider, then continue.',\n authoritativeRecordGuidance: 'These are the records Domain0 checks directly on every authoritative nameserver.',\n dnsRecordsRegion: 'DNS records',\n dnsRecordsCaption: (domain: string) => `DNS records for ${domain}`,\n thisDomain: 'this domain',\n columnType: 'Type',\n columnHost: 'Host',\n columnValue: 'Value',\n columnTtl: 'TTL',\n columnPriority: 'Priority',\n columnRequirement: 'Requirement',\n optional: 'Optional',\n required: 'Required',\n noRecordChanges: 'The existing DNS policy satisfies this request. No DNS record changes are required.',\n addedRecords: 'I added these records',\n continue: 'Continue',\n savingConfirmation: 'Saving your confirmation…',\n verifyDnsRecords: 'Verify DNS records',\n finishConnection: 'Finish connection',\n checkingNameservers: 'Checking authoritative nameservers…',\n requiredRecordsActive: 'Required DNS records are active.',\n propagationPending: 'DNS changes have not reached every authoritative nameserver yet. You can check again.',\n providerFailureHeading: 'Provider operation needs attention',\n snapshotTimeout: 'Domain0 timed out while reading provider DNS records. No DNS changes were made. Retry restores the prior review step so you can request a fresh snapshot.',\n applyTimeout: 'The provider did not confirm the DNS update before the deadline, so the outcome is ambiguous. Retry restores the confirmed application step; Domain0 reconciles current provider records before another write.',\n timeoutRecorded: 'The timeout was recorded at {DATE}.',\n retryConnection: 'Retry connection',\n restoringConnection: 'Restoring the connection to its pre-failure state…',\n connectionRestored: (state: string) => `Connection restored to ${state}. Continue when ready.`,\n cancelHeading: 'Cancel this connection?',\n cancelGuidance: 'Cancellation stops this Domain0 workflow. It does not remove DNS records that were already applied.',\n keepConnection: 'Keep connection',\n confirmCancellation: 'Confirm cancellation',\n cancellingConnection: 'Cancelling connection…',\n connectionCancelled: 'Connection cancelled.',\n dnsProvider: 'DNS provider',\n providerHelp: 'Select the company where you manage DNS records for this domain.',\n detectedProviderHelp: 'Domain0 found possible providers from public DNS information. Confirm the company where you manage DNS records.',\n chooseProvider: 'Choose a provider',\n suggestedFromDns: 'Suggested from DNS',\n allOtherProviders: 'All other providers',\n continueWithProvider: 'Continue with provider',\n savingProviderSelection: 'Saving provider selection…',\n preparingProviderSelection: 'Preparing provider selection…',\n providerDetected: (provider: string) => `${provider} detected.`,\n providerSelected: (provider: string) => `${provider} selected.`,\n preparingManualInstructions: 'Preparing guided manual DNS instructions…',\n manualSetupNotEntered: 'The server did not enter guided manual setup',\n noProviderDetected: 'No provider was identified automatically. Choose your DNS provider below.',\n possibleProviderFound: '1 possible DNS provider was found. Confirm your provider below.',\n possibleProvidersFound: (count: string) => `${count} possible DNS providers were found. Confirm your provider below.`,\n supportAutomatic: 'automatic',\n supportDomainConnect: 'Domain Connect',\n supportManual: 'guided manual',\n supportUnverified: 'not yet verified',\n supportAutomaticDescription: 'Its automatic adapter is verified; guided manual setup is also available.',\n supportDomainConnectDescription: 'Its Domain Connect path is verified; guided manual setup is also available.',\n supportManualDescription: 'Its guided manual path is verified.',\n supportUnverifiedDescription: 'Provider-specific automation is not verified; guided manual setup remains available.',\n recordSummary: (type: string, host: string, value: string, ttl: string, priority: string) => `${type} ${host} = ${value}; TTL ${ttl}${priority}`,\n recordPriority: (priority: string) => `; priority ${priority}`,\n errorPrefix: (message: string) => `Error: ${message}`,\n unknownError: 'Unknown error',\n transportError: 'Domain0 could not be reached. Check your connection and try again.',\n protocolError: 'Domain0 returned an invalid response. Try again or contact the application operator.',\n apiErrorInvalidRequest: 'The request is invalid.',\n apiErrorUnauthorized: 'Authentication failed. Reopen the connection flow and try again.',\n apiErrorForbidden: 'You are not allowed to perform this operation.',\n apiErrorNotFound: 'The requested connection resource was not found or has expired.',\n apiErrorConflict: 'The connection changed before this operation completed. Refresh and try again.',\n apiErrorRateLimited: 'Too many requests were made. Wait briefly and try again.',\n apiErrorDnsUnavailable: 'Authoritative DNS is temporarily unavailable. Try again.',\n apiErrorProviderUnavailable: 'The DNS provider is temporarily unavailable. Try again.',\n apiErrorProviderAuthorizationFailed: 'The DNS provider authorization failed or expired.',\n apiErrorProviderLimitation: 'The selected provider cannot complete this operation automatically.',\n apiErrorPlanExpired: 'The DNS change plan expired. Prepare and review a new plan.',\n apiErrorPropagationPending: 'The DNS changes have not reached every authoritative nameserver yet.',\n apiErrorInternal: 'Domain0 encountered an unexpected error. Try again.',\n loadingFlow: 'Loading domain connection flow…',\n flowNotReady: 'Domain connections are still being prepared. Reopen this flow to retry.',\n flowStep: (index: string, domain: string) => `${index}. ${domain}`,\n flowStepConnected: (index: string, domain: string) => `${index}. ${domain} — connected`,\n allDomainsConnected: (count: string) => `All ${count} domains are connected.`,\n domainProgress: (index: string, total: string, domain: string) => `Domain ${index} of ${total}: ${domain}`,\n connectionStateRequested: 'requested',\n connectionStateDetectingProvider: 'detecting provider',\n connectionStateProviderSelected: 'provider selected',\n connectionStateDomainConnectPending: 'Domain Connect pending',\n connectionStateAuthorizationPending: 'authorization pending',\n connectionStateAuthorized: 'authorized',\n connectionStatePlanning: 'planning',\n connectionStateAwaitingConfirmation: 'awaiting confirmation',\n connectionStateApplying: 'applying',\n connectionStatePropagationPending: 'propagation pending',\n connectionStateActive: 'active',\n connectionStateManualRequired: 'manual setup required',\n connectionStateFailedRetryable: 'temporarily failed',\n connectionStateFailedTerminal: 'failed',\n connectionStateCancelled: 'cancelled',\n} as const\n\ntype WidenMessage<T> = T extends (...arguments_: infer Arguments) => string\n ? (...arguments_: Arguments) => string\n : string\n\nexport type Domain0Messages = {\n readonly [Key in keyof typeof englishMessages]: WidenMessage<(typeof englishMessages)[Key]>\n}\n\nconst germanMessages = {\n triggerConnectDomain: 'Domain verbinden',\n headingConnectDomain: 'Domain verbinden',\n headingConnectDomains: 'Domains verbinden',\n initialSubtitle: 'Wählen Sie Ihren DNS-Anbieter. Domain0 zeigt den dafür verfügbaren, verifizierten Verbindungsweg.',\n cancelConnection: 'Verbindung abbrechen',\n close: 'Schließen',\n loadingConnection: 'Verbindungsdetails werden geladen…',\n detectingProvider: 'DNS-Anbieter wird ermittelt…',\n detectionUnavailable: 'Die automatische Anbietererkennung ist vorübergehend nicht verfügbar. Wählen Sie unten Ihren DNS-Anbieter aus.',\n connectionStatus: (state: string) => `Verbindungsstatus: ${state}.`,\n manualInstructionsReady: 'Die geführte manuelle DNS-Anleitung ist bereit.',\n forcedManualBlocked: 'Diese Verbindung befindet sich bereits in einem automatischen Anbieterablauf. Der erzwungene manuelle Modus kann ihn weder fortsetzen noch voranbringen. Brechen Sie diese Verbindung ab und erstellen Sie eine neue manuelle Verbindung.',\n forcedManualIncompatible: 'Die bestehende Verbindung ist mit der erzwungenen manuellen Einrichtung nicht kompatibel',\n missingConfirmationPlan: 'Der Server hat einen Bestätigungsstatus ohne Änderungsplan zurückgegeben',\n missingApplyingPlan: 'Der Server hat einen Anwendungsstatus ohne bestätigten Plan zurückgegeben',\n missingFailureDetails: 'Der Server hat einen wiederholbaren Fehlerstatus ohne Fehlerdetails zurückgegeben',\n successDescription: (domain: string) => `${domain} ist verbunden und die erforderlichen Einträge wurden übernommen.`,\n dkimHeading: 'Ausgehende E-Mails mit DKIM absichern',\n dkimCheckingProvider: 'Öffentliche MX- und selektorspezifische DKIM-DNS-Einträge werden geprüft…',\n dkimGuidanceUnavailable: 'Die Erkennung des E-Mail-Anbieters ist vorübergehend nicht verfügbar. Es wurden keine DNS-Änderungen vorgenommen.',\n dkimDomainMismatch: 'Der Server hat DKIM-Hinweise für eine andere Domain zurückgegeben',\n dkimProviderDetected: (provider: string) => `${provider} wurde anhand der öffentlichen MX-Einträge erkannt.`,\n dkimProviderAmbiguous: 'Die MX-Einträge verweisen auf mehrere unterstützte E-Mail-Anbieter. Prüfen Sie das Mail-Routing, bevor Sie DKIM ändern.',\n dkimProviderUnknown: 'Domain0 konnte Google Workspace, Microsoft 365 oder Zoho Mail anhand der öffentlichen MX-Einträge nicht erkennen.',\n dkimRecordObserved: (selectors: string) => `Für die geprüften Selektoren wurde ein DKIM-DNS-Eintrag gefunden: ${selectors}.`,\n dkimNoRecordObserved: (selectors: string) => `Für die geprüften Selektoren wurde kein DKIM-DNS-Eintrag gefunden: ${selectors}. Dies beweist nicht, dass DKIM deaktiviert ist.`,\n dkimNotChecked: 'Dieser Anbieter verwendet einen kontospezifischen DKIM-Selektor. Daher wurde kein Selektoreintrag automatisch geprüft.',\n dkimLookupUnavailable: 'Die selektorspezifische DKIM-DNS-Prüfung war vorübergehend nicht verfügbar.',\n dkimEvidenceBoundary: 'Ein veröffentlichter DNS-Eintrag beweist nicht, dass ausgehende E-Mails signiert werden. Prüfen Sie den endgültigen DKIM-Status in der Verwaltung des E-Mail-Anbieters.',\n dkimOpenGuide: (provider: string) => `Offizielle DKIM-Einrichtungsanleitung von ${provider} öffnen`,\n cancelledDescription: (domain: string) => `Die Verbindung für ${domain} wurde abgebrochen. Es werden keine weiteren DNS-Änderungen angewendet.`,\n selectedProvider: (provider: string, support: string) => `${provider} ausgewählt. ${support}`,\n currentState: (state: string) => `Diese Verbindung ist derzeit ${state}. Aktualisieren Sie, um den neuesten Status zu laden.`,\n refreshConnection: 'Verbindung aktualisieren',\n domainConnectHeading: 'Über Domain Connect verbinden',\n domainConnectGuidance: 'Ihr DNS-Anbieter zeigt die genaue Dienstvorlage an und bittet vor der Anwendung um Zustimmung.',\n domainConnectResumeUnavailable: 'Die Host-Anwendung muss dieselbe Domain-Connect-Dienstvorlage bereitstellen, um diese Übergabe fortzusetzen.',\n domainConnectUnavailable: 'Die Host-Anwendung hat keine Domain-Connect-Dienstvorlage konfiguriert. Die geführte manuelle Einrichtung bleibt verfügbar.',\n continueSecurely: (provider: string) => `Sicher mit ${provider} fortfahren`,\n continueSecurelyNewTab: (provider: string) => `Sicher mit ${provider} in einem neuen Tab fortfahren`,\n completedDomainConnect: 'Domain Connect abgeschlossen',\n preparingAuthoritativeVerification: 'Verbindliche DNS-Prüfung wird vorbereitet…',\n readyToVerifyPropagation: 'Bereit zur Prüfung der DNS-Übernahme.',\n resumeDomainConnect: (provider: string) => `Domain Connect mit ${provider} fortsetzen`,\n connectWithProvider: (provider: string) => `Mit ${provider} verbinden`,\n checkingDomainConnectTemplate: 'Es wird geprüft, ob Ihr DNS-Anbieter genau diese Dienstvorlage unterstützt…',\n domainConnectReady: 'Domain Connect ist bereit. Fahren Sie in einem neuen Tab mit Ihrem DNS-Anbieter fort.',\n followProviderGuide: (provider: string) => `Schritt-für-Schritt-Anleitung von ${provider} öffnen`,\n openApplicationManualSetupGuide: 'Schritt-für-Schritt-DNS-Anleitung dieser Anwendung öffnen',\n requestManualSetupHelp: 'Schrittweise DNS-Hilfe anfordern',\n openProviderReference: (provider: string) => `Anbieterreferenz von ${provider} öffnen`,\n opensInNewTab: (label: string) => `${label} (öffnet einen neuen Tab)`,\n sharedFlowHeading: 'Eine andere Person um den Abschluss bitten',\n sharedFlowGuidance: 'Kopieren Sie einen zeitlich begrenzten Link für eine vertrauenswürdige Person, die diese Domain aktualisieren kann. Der Link gewährt nur Zugriff auf diese Verbindung.',\n copySecureSetupLink: 'Sicheren Einrichtungslink kopieren',\n creatingSecureSetupLink: 'Sicherer Einrichtungslink wird erstellt…',\n secureSetupLinkCopied: 'Sicherer Einrichtungslink kopiert.',\n copySetupLinkAgain: 'Einrichtungslink erneut kopieren',\n expiredSharedFlow: 'Die Host-Anwendung hat eine abgelaufene Einladung für den freigegebenen Ablauf zurückgegeben',\n clipboardUnavailable: 'Zwischenablage ist nicht verfügbar; konfigurieren Sie sharedFlowGateway.copy',\n oauthHeading: 'Sicher beim Anbieter autorisieren',\n oauthGuidance: 'Domain0 verwendet OAuth mit PKCE. Ihr Anbieterpasswort wird niemals an Domain0 weitergegeben.',\n continueToProvider: (provider: string) => `Weiter zu ${provider}`,\n authorizationExpires: 'Dieser Autorisierungslink läuft am {DATE} ab.',\n completedAuthorization: 'Autorisierung abgeschlossen',\n resumeAuthorization: (provider: string) => `Autorisierung mit ${provider} fortsetzen`,\n authorizeWithProvider: (provider: string) => `Mit ${provider} autorisieren`,\n authorizeProviderCredentials: (provider: string) => `${provider} autorisieren`,\n preparingAuthorizationLink: 'Sicherer Autorisierungslink für den Anbieter wird vorbereitet…',\n authorizationLinkReady: 'Der Autorisierungslink ist bereit. Fahren Sie in einem neuen Tab mit dem Anbieter fort.',\n credentialGuidance: 'Verwenden Sie Anbieterzugangsdaten mit minimalem Berechtigungsumfang. Domain0 verschlüsselt sie serverseitig und gibt sie niemals an den Browser zurück.',\n credentialHeadingApiToken: 'Mit einem API-Token autorisieren',\n credentialHeadingAccessKey: 'Mit API-Schlüsseln autorisieren',\n credentialHeadingUsernamePassword: 'Mit Anbieterzugangsdaten autorisieren',\n credentialHeadingAccountToken: 'Mit einem Konto-Token autorisieren',\n credentialHeadingUsernameToken: 'Mit einem Benutzer-Token autorisieren',\n credentialHeadingOvh: 'Mit OVH-API-Zugangsdaten autorisieren',\n credentialHeadingPrivateKey: 'Mit einem privaten Schlüssel autorisieren',\n credentialHeadingAwsSession: 'Mit einer temporären AWS-Sitzung autorisieren',\n credentialHeadingCpanel: 'Mit einem cPanel-API-Token autorisieren',\n credentialHeadingClientCredentials: 'Mit OpenSRS-Storefront-Zugangsdaten autorisieren',\n fieldApiToken: 'API-Token',\n fieldAccessKeyId: 'Zugriffsschlüssel-ID',\n fieldApiSecret: 'API-Geheimnis',\n fieldUsername: 'Benutzername',\n fieldPassword: 'Passwort',\n fieldAccountId: 'Konto-ID',\n fieldOvhRegion: 'OVH-API-Region',\n fieldApplicationKey: 'Anwendungsschlüssel',\n fieldApplicationSecret: 'Anwendungsgeheimnis',\n fieldConsumerKey: 'Consumer-Schlüssel',\n fieldProviderLogin: 'Anbieter-Anmeldung',\n fieldPemPrivateKey: 'Privater PEM-Schlüssel',\n fieldAwsAccessKeyId: 'AWS-Zugriffsschlüssel-ID',\n fieldAwsSecretAccessKey: 'Geheimer AWS-Zugriffsschlüssel',\n fieldAwsSessionToken: 'AWS-Sitzungstoken',\n fieldRoute53ZoneId: 'Route-53-Hosted-Zone-ID',\n fieldSessionExpiration: 'Sitzungsablauf',\n fieldCpanelEndpoint: 'cPanel-HTTPS-Endpunkt',\n fieldCpanelUsername: 'cPanel-Benutzername',\n fieldCpanelApiToken: 'cPanel-API-Token',\n fieldStorefrontClientId: 'Storefront-Client-ID',\n fieldStorefrontClientSecret: 'Storefront-Client-Geheimnis',\n regionOvhEurope: 'OVH Europa',\n regionOvhUnitedStates: 'OVH Vereinigte Staaten',\n regionOvhCanada: 'OVH Kanada',\n regionKimsufiEurope: 'Kimsufi Europa',\n regionKimsufiCanada: 'Kimsufi Kanada',\n regionSoYouStartEurope: 'So You Start Europa',\n regionSoYouStartCanada: 'So You Start Kanada',\n authorizeApiToken: 'API-Token autorisieren',\n encryptingAuthorization: 'Anbieterautorisierung wird verschlüsselt und geprüft…',\n authorizationCompleted: 'Anbieterautorisierung abgeschlossen.',\n existingRecordPolicy: 'Richtlinie für bestehende DNS-Einträge',\n existingRecordPolicyHelp: 'Beibehalten ist am sichersten. Ersetzungsrichtlinien können destruktive Änderungen vorschlagen, die separat bestätigt werden müssen.',\n preserveExistingRecords: 'Bestehende Einträge beibehalten',\n replaceSameNameAndType: 'Einträge mit gleichem Host und Typ ersetzen',\n replaceAllAtName: 'Alle konfliktbehafteten Einträge am Host ersetzen',\n replaceSpf: 'Eine bestehende SPF-Richtlinie ersetzen, statt sie zusammenzuführen',\n replaceSpfHelp: 'Zusammenführen ist die sichere Voreinstellung. Ersetzen entfernt die aktuellen SPF-Mechanismen des Anbieters und erfordert immer eine Bestätigung der destruktiven Änderung.',\n readingRecords: 'Aktuelle Anbietereinträge werden gelesen und ein Änderungsplan wird vorbereitet…',\n recordsAlreadyExist: 'Die erforderlichen DNS-Einträge sind bereits vorhanden. Bereit zur Prüfung der Übernahme.',\n reviewChanges: 'Prüfen Sie die vorgeschlagenen DNS-Änderungen vor der Bestätigung.',\n reviewDnsChanges: 'DNS-Änderungen prüfen',\n recalculateChangePlan: 'Änderungsplan neu berechnen',\n proposedChangesRegion: 'Vorgeschlagene DNS-Änderungen',\n proposedChangesCaption: (domain: string) => `Vorgeschlagene DNS-Änderungen für ${domain}`,\n columnAction: 'Aktion',\n columnCurrentRecord: 'Aktueller Eintrag',\n columnResultingRecord: 'Resultierender Eintrag',\n columnRisk: 'Risiko',\n changeCreate: 'Erstellen',\n changeUpdate: 'Ersetzen',\n changeDelete: 'Löschen',\n destructive: 'Destruktiv',\n nonDestructive: 'Nicht destruktiv',\n planWarnings: 'Planwarnungen',\n planWarningSpfPolicyReplaced: 'Die bestehende SPF-Richtlinie wird durch die angeforderte SPF-Richtlinie ersetzt.',\n planWarningSpfPolicyMerged: 'Die bestehende SPF-Richtlinie wurde in den angeforderten SPF-Eintrag übernommen.',\n planExpires: 'Dieser Plan läuft am {DATE} ab.',\n destructiveAcknowledgement: 'Ich verstehe, dass die markierten bestehenden DNS-Einträge ersetzt oder gelöscht werden.',\n confirmChangePlan: 'Änderungsplan bestätigen',\n confirmingChangePlan: 'Dieser genaue Änderungsplan wird bestätigt…',\n planConfirmed: 'Plan bestätigt. DNS-Änderungen wurden noch nicht angewendet.',\n applyDnsChanges: 'DNS-Änderungen anwenden',\n applyingDnsChanges: 'Bestätigte DNS-Änderungen werden angewendet…',\n dnsChangesApplied: 'DNS-Änderungen wurden angewendet. Bereit zur verbindlichen Übernahmeprüfung.',\n detectionReasonNoStablePublicProviderIdentity: 'Dieser Anbieter veröffentlicht keine stabile öffentliche Identität, die Domain0 sicher anhand des DNS erkennen kann.',\n manualGuidance: 'Verwenden Sie die geführte manuelle Einrichtung, um die genauen erforderlichen DNS-Einträge ohne Weitergabe von Anbieterzugangsdaten hinzuzufügen.',\n manualSetupUnavailableHeading: 'Manuelle Einrichtung nicht verfügbar',\n manualSetupUnavailableDescription: 'Die manuelle DNS-Einrichtung wurde von dieser Anwendung deaktiviert. Verwenden Sie einen anderen verfügbaren verifizierten Weg oder brechen beziehungsweise schließen Sie diese Verbindung ab.',\n showDnsRecords: 'DNS-Einträge anzeigen',\n preparingDnsInstructions: 'DNS-Anleitung wird vorbereitet…',\n dnsInstructionsReady: 'DNS-Anleitung ist bereit.',\n addResolvedRecords: 'Fügen Sie diese aufgelösten Einträge bei Ihrem DNS-Anbieter hinzu und fahren Sie dann fort.',\n authoritativeRecordGuidance: 'Diese Einträge prüft Domain0 direkt auf jedem verbindlichen Nameserver.',\n dnsRecordsRegion: 'DNS-Einträge',\n dnsRecordsCaption: (domain: string) => `DNS-Einträge für ${domain}`,\n thisDomain: 'diese Domain',\n columnType: 'Typ',\n columnHost: 'Host',\n columnValue: 'Wert',\n columnTtl: 'TTL',\n columnPriority: 'Priorität',\n columnRequirement: 'Anforderung',\n optional: 'Optional',\n required: 'Erforderlich',\n noRecordChanges: 'Die bestehende DNS-Richtlinie erfüllt diese Anfrage. Es sind keine DNS-Änderungen erforderlich.',\n addedRecords: 'Ich habe diese Einträge hinzugefügt',\n continue: 'Fortfahren',\n savingConfirmation: 'Ihre Bestätigung wird gespeichert…',\n verifyDnsRecords: 'DNS-Einträge prüfen',\n finishConnection: 'Verbindung abschließen',\n checkingNameservers: 'Verbindliche Nameserver werden geprüft…',\n requiredRecordsActive: 'Die erforderlichen DNS-Einträge sind aktiv.',\n propagationPending: 'Die DNS-Änderungen haben noch nicht jeden verbindlichen Nameserver erreicht. Sie können erneut prüfen.',\n providerFailureHeading: 'Anbietervorgang erfordert Aufmerksamkeit',\n snapshotTimeout: 'Beim Lesen der DNS-Einträge des Anbieters hat Domain0 das Zeitlimit überschritten. Es wurden keine DNS-Änderungen vorgenommen. Eine Wiederholung stellt den vorherigen Prüfschritt wieder her, damit Sie einen neuen Schnappschuss anfordern können.',\n applyTimeout: 'Der Anbieter hat die DNS-Aktualisierung nicht vor Ablauf der Frist bestätigt; das Ergebnis ist daher unklar. Eine Wiederholung stellt den bestätigten Anwendungsschritt wieder her. Domain0 gleicht vor einem weiteren Schreibvorgang die aktuellen Anbietereinträge ab.',\n timeoutRecorded: 'Die Zeitüberschreitung wurde am {DATE} erfasst.',\n retryConnection: 'Verbindung erneut versuchen',\n restoringConnection: 'Verbindung wird auf den Zustand vor dem Fehler zurückgesetzt…',\n connectionRestored: (state: string) => `Verbindung auf ${state} zurückgesetzt. Fahren Sie fort, wenn Sie bereit sind.`,\n cancelHeading: 'Diese Verbindung abbrechen?',\n cancelGuidance: 'Der Abbruch beendet diesen Domain0-Ablauf. Bereits angewendete DNS-Einträge werden dadurch nicht entfernt.',\n keepConnection: 'Verbindung beibehalten',\n confirmCancellation: 'Abbruch bestätigen',\n cancellingConnection: 'Verbindung wird abgebrochen…',\n connectionCancelled: 'Verbindung abgebrochen.',\n dnsProvider: 'DNS-Anbieter',\n providerHelp: 'Wählen Sie das Unternehmen, bei dem Sie die DNS-Einträge dieser Domain verwalten.',\n detectedProviderHelp: 'Domain0 hat anhand öffentlicher DNS-Informationen mögliche Anbieter gefunden. Bestätigen Sie Ihren DNS-Anbieter.',\n chooseProvider: 'Anbieter auswählen',\n suggestedFromDns: 'Aus DNS vorgeschlagen',\n allOtherProviders: 'Alle anderen Anbieter',\n continueWithProvider: 'Mit Anbieter fortfahren',\n savingProviderSelection: 'Anbieterauswahl wird gespeichert…',\n preparingProviderSelection: 'Anbieterauswahl wird vorbereitet…',\n providerDetected: (provider: string) => `${provider} erkannt.`,\n providerSelected: (provider: string) => `${provider} ausgewählt.`,\n preparingManualInstructions: 'Geführte manuelle DNS-Anleitung wird vorbereitet…',\n manualSetupNotEntered: 'Der Server hat die geführte manuelle Einrichtung nicht gestartet',\n noProviderDetected: 'Es wurde kein Anbieter automatisch erkannt. Wählen Sie unten Ihren DNS-Anbieter aus.',\n possibleProviderFound: '1 möglicher DNS-Anbieter wurde gefunden. Bestätigen Sie unten Ihren Anbieter.',\n possibleProvidersFound: (count: string) => `${count} mögliche DNS-Anbieter wurden gefunden. Bestätigen Sie unten Ihren Anbieter.`,\n supportAutomatic: 'automatisch',\n supportDomainConnect: 'Domain Connect',\n supportManual: 'geführt manuell',\n supportUnverified: 'noch nicht verifiziert',\n supportAutomaticDescription: 'Der automatische Adapter ist verifiziert; die geführte manuelle Einrichtung ist ebenfalls verfügbar.',\n supportDomainConnectDescription: 'Der Domain-Connect-Pfad ist verifiziert; die geführte manuelle Einrichtung ist ebenfalls verfügbar.',\n supportManualDescription: 'Der geführte manuelle Pfad ist verifiziert.',\n supportUnverifiedDescription: 'Anbieterspezifische Automatisierung ist nicht verifiziert; die geführte manuelle Einrichtung bleibt verfügbar.',\n recordSummary: (type: string, host: string, value: string, ttl: string, priority: string) => `${type} ${host} = ${value}; TTL ${ttl}${priority}`,\n recordPriority: (priority: string) => `; Priorität ${priority}`,\n loadingFlow: 'Domain-Verbindungsablauf wird geladen…',\n flowNotReady: 'Die Domain-Verbindungen werden noch vorbereitet. Öffnen Sie diesen Ablauf erneut, um es noch einmal zu versuchen.',\n flowStep: (index: string, domain: string) => `${index}. ${domain}`,\n flowStepConnected: (index: string, domain: string) => `${index}. ${domain} — verbunden`,\n allDomainsConnected: (count: string) => `Alle ${count} Domains sind verbunden.`,\n domainProgress: (index: string, total: string, domain: string) => `Domain ${index} von ${total}: ${domain}`,\n errorPrefix: (message: string) => `Fehler: ${message}`,\n unknownError: 'Unbekannter Fehler',\n transportError: 'Domain0 ist nicht erreichbar. Prüfen Sie Ihre Verbindung und versuchen Sie es erneut.',\n protocolError: 'Domain0 hat eine ungültige Antwort zurückgegeben. Versuchen Sie es erneut oder wenden Sie sich an den Betreiber der Anwendung.',\n apiErrorInvalidRequest: 'Die Anfrage ist ungültig.',\n apiErrorUnauthorized: 'Die Authentifizierung ist fehlgeschlagen. Öffnen Sie den Verbindungsablauf erneut und versuchen Sie es noch einmal.',\n apiErrorForbidden: 'Sie dürfen diesen Vorgang nicht ausführen.',\n apiErrorNotFound: 'Die angeforderte Verbindungsressource wurde nicht gefunden oder ist abgelaufen.',\n apiErrorConflict: 'Die Verbindung wurde vor Abschluss dieses Vorgangs geändert. Aktualisieren Sie sie und versuchen Sie es erneut.',\n apiErrorRateLimited: 'Es wurden zu viele Anfragen gestellt. Warten Sie kurz und versuchen Sie es erneut.',\n apiErrorDnsUnavailable: 'Das verbindliche DNS ist vorübergehend nicht verfügbar. Versuchen Sie es erneut.',\n apiErrorProviderUnavailable: 'Der DNS-Anbieter ist vorübergehend nicht verfügbar. Versuchen Sie es erneut.',\n apiErrorProviderAuthorizationFailed: 'Die Autorisierung beim DNS-Anbieter ist fehlgeschlagen oder abgelaufen.',\n apiErrorProviderLimitation: 'Der ausgewählte Anbieter kann diesen Vorgang nicht automatisch abschließen.',\n apiErrorPlanExpired: 'Der DNS-Änderungsplan ist abgelaufen. Erstellen und prüfen Sie einen neuen Plan.',\n apiErrorPropagationPending: 'Die DNS-Änderungen haben noch nicht jeden verbindlichen Nameserver erreicht.',\n apiErrorInternal: 'In Domain0 ist ein unerwarteter Fehler aufgetreten. Versuchen Sie es erneut.',\n connectionStateRequested: 'angefordert',\n connectionStateDetectingProvider: 'Anbieter wird ermittelt',\n connectionStateProviderSelected: 'Anbieter ausgewählt',\n connectionStateDomainConnectPending: 'Domain Connect ausstehend',\n connectionStateAuthorizationPending: 'Autorisierung ausstehend',\n connectionStateAuthorized: 'autorisiert',\n connectionStatePlanning: 'in Planung',\n connectionStateAwaitingConfirmation: 'Bestätigung ausstehend',\n connectionStateApplying: 'wird angewendet',\n connectionStatePropagationPending: 'Übernahme ausstehend',\n connectionStateActive: 'aktiv',\n connectionStateManualRequired: 'manuelle Einrichtung erforderlich',\n connectionStateFailedRetryable: 'vorübergehend fehlgeschlagen',\n connectionStateFailedTerminal: 'fehlgeschlagen',\n connectionStateCancelled: 'abgebrochen',\n} satisfies Domain0Messages\n\nexport const domain0TranslatedLocales = ['en', 'es', 'pt-br', 'pt-pt', 'fr', 'de'] as const\nexport type Domain0TranslatedLocale = (typeof domain0TranslatedLocales)[number]\n\nconst catalogs: Readonly<Record<Domain0TranslatedLocale, Domain0Messages>> = {\n en: englishMessages,\n es: spanishMessages,\n 'pt-br': brazilianPortugueseMessages,\n 'pt-pt': europeanPortugueseMessages,\n fr: frenchMessages,\n de: germanMessages,\n}\n\nconst translatedLocaleByLocale: Readonly<Partial<Record<Domain0Locale, Domain0TranslatedLocale>>> = {\n en: 'en',\n es: 'es',\n pt: 'pt-br',\n 'pt-br': 'pt-br',\n 'pt-pt': 'pt-pt',\n fr: 'fr',\n de: 'de',\n}\n\nconst languageTags: Readonly<Record<Domain0Locale, string>> = {\n en: 'en',\n es: 'es',\n pt: 'pt-BR',\n 'pt-br': 'pt-BR',\n 'pt-pt': 'pt-PT',\n fr: 'fr',\n it: 'it',\n de: 'de',\n nl: 'nl',\n pl: 'pl',\n tr: 'tr',\n ja: 'ja',\n da: 'da',\n sv: 'sv',\n}\n\nexport interface Domain0Localizer {\n readonly locale: Domain0Locale\n readonly translatedLocale: Domain0TranslatedLocale\n readonly languageTag: string\n readonly direction: 'ltr'\n readonly messages: Domain0Messages\n formatInteger(value: number): string\n formatDateTime(value: string): string\n connectionState(state: ConnectionState): string\n providerDetectionReason(code: ProviderDetectionUnavailableReasonCode): string\n planWarning(code: PlanWarningCode): string\n apiError(code: Domain0ErrorCode): string\n}\n\nexport function createDomain0Localizer(input: unknown = 'en'): Domain0Localizer {\n const locale = Domain0LocaleSchema.parse(input)\n const languageTag = languageTags[locale]\n const translatedLocale = translatedLocaleByLocale[locale] ?? 'en'\n const messages = catalogs[translatedLocale]\n const numberFormat = new Intl.NumberFormat(languageTag)\n const dateTimeFormat = new Intl.DateTimeFormat(languageTag, {\n dateStyle: 'medium',\n timeStyle: 'short',\n })\n\n return {\n locale,\n translatedLocale,\n languageTag,\n direction: 'ltr',\n messages,\n formatInteger: (value) => numberFormat.format(value),\n formatDateTime: (value) => dateTimeFormat.format(new Date(value)),\n connectionState: (state) => messages[connectionStateMessageKey[state]],\n providerDetectionReason: (code) => messages[providerDetectionReasonMessageKey[code]],\n planWarning: (code) => messages[planWarningMessageKey[code]],\n apiError: (code) => messages[apiErrorMessageKey[code]],\n }\n}\n\nexport function localizedCopy(\n copy: Readonly<\n { en: string } & Partial<Record<Domain0Locale, string | undefined>>\n > | undefined,\n locale: Domain0Locale,\n): string | undefined {\n if (copy === undefined) return undefined\n if (locale === 'pt') return copy.pt ?? copy['pt-br'] ?? copy.en\n return copy[locale] ?? copy.en\n}\n\nconst connectionStateMessageKey = {\n requested: 'connectionStateRequested',\n detecting_provider: 'connectionStateDetectingProvider',\n provider_selected: 'connectionStateProviderSelected',\n domain_connect_pending: 'connectionStateDomainConnectPending',\n authorization_pending: 'connectionStateAuthorizationPending',\n authorized: 'connectionStateAuthorized',\n planning: 'connectionStatePlanning',\n awaiting_confirmation: 'connectionStateAwaitingConfirmation',\n applying: 'connectionStateApplying',\n propagation_pending: 'connectionStatePropagationPending',\n active: 'connectionStateActive',\n manual_required: 'connectionStateManualRequired',\n failed_retryable: 'connectionStateFailedRetryable',\n failed_terminal: 'connectionStateFailedTerminal',\n cancelled: 'connectionStateCancelled',\n} as const satisfies Record<ConnectionState, keyof Domain0Messages>\n\nconst providerDetectionReasonMessageKey = {\n no_stable_public_provider_identity: 'detectionReasonNoStablePublicProviderIdentity',\n} as const satisfies Record<ProviderDetectionUnavailableReasonCode, keyof Domain0Messages>\n\nconst planWarningMessageKey = {\n spf_policy_replaced: 'planWarningSpfPolicyReplaced',\n spf_policy_merged: 'planWarningSpfPolicyMerged',\n} as const satisfies Record<PlanWarningCode, keyof Domain0Messages>\n\nconst apiErrorMessageKey = {\n invalid_request: 'apiErrorInvalidRequest',\n unauthorized: 'apiErrorUnauthorized',\n forbidden: 'apiErrorForbidden',\n not_found: 'apiErrorNotFound',\n conflict: 'apiErrorConflict',\n rate_limited: 'apiErrorRateLimited',\n dns_unavailable: 'apiErrorDnsUnavailable',\n provider_unavailable: 'apiErrorProviderUnavailable',\n provider_authorization_failed: 'apiErrorProviderAuthorizationFailed',\n provider_limitation: 'apiErrorProviderLimitation',\n plan_expired: 'apiErrorPlanExpired',\n propagation_pending: 'apiErrorPropagationPending',\n internal_error: 'apiErrorInternal',\n} as const satisfies Record<Domain0ErrorCode, keyof Domain0Messages>\n","import type { Domain0Client } from '../client'\nimport { Domain0Error, Domain0ProtocolError, Domain0TransportError } from '../client'\nimport type {\n ChangePlan,\n ConflictPolicy,\n Connection,\n ConnectionFailure,\n ConnectionId,\n DnsRecord,\n DkimGuidanceResponse,\n DkimSelector,\n EmailProvider,\n DomainConnectTemplate,\n Provider,\n ProviderCandidate,\n DirectCredentialKind,\n SpfConflictPolicy,\n Domain0WhiteLabel,\n Domain0WhiteLabelInput,\n Domain0SetupPolicyInput,\n Domain0Locale,\n Domain0ConnectEvent,\n Domain0ConnectSuccessEvent as Domain0ConnectSuccessContractEvent,\n Domain0ConnectCloseEvent as Domain0ConnectCloseContractEvent,\n Domain0ConnectStepChangeEvent as Domain0ConnectStepChangeContractEvent,\n Domain0ManualSetupDocumentationClickEvent as Domain0ManualSetupDocumentationClickContractEvent,\n Domain0RequestCloseEvent as Domain0RequestCloseContractEvent,\n Domain0SharedFlowSentEvent as Domain0SharedFlowSentContractEvent,\n Domain0DkimSetupDocumentationClickEvent as Domain0DkimSetupDocumentationClickContractEvent,\n Domain0ConnectStep as Domain0ConnectStepContract,\n Domain0ConnectCloseReason as Domain0ConnectCloseReasonContract,\n SharedFlowInvitationInput,\n SharedFlowInvitationUrl,\n ManualSetupDocumentationUrlInput,\n} from '../contracts'\nimport {\n AuthorizeWithCredentialInputSchema,\n Domain0ConnectCloseEventSchema,\n Domain0ConnectStepChangeEventSchema,\n Domain0ManualSetupDocumentationClickEventSchema,\n Domain0RequestCloseEventSchema,\n Domain0SharedFlowSentEventSchema,\n Domain0DkimSetupDocumentationClickEventSchema,\n Domain0ConnectConfigurationSchema,\n Domain0ConnectSuccessEventSchema,\n SharedFlowInvitationSchema,\n directCredentialKindByProvider,\n} from '../contracts'\nimport { domain0Styles } from './styles'\nimport { applyWhiteLabel, interpolateWhiteLabelCopy } from './white-label'\nimport {\n createDomain0Localizer,\n localizedCopy,\n type Domain0Localizer,\n type Domain0Messages,\n} from './localization'\n\ntype EventPayload<TEvent extends { readonly type: string }> = Omit<TEvent, 'type'>\n\nexport type Domain0ConnectStep = Domain0ConnectStepContract\nexport type Domain0ConnectCloseReason = Domain0ConnectCloseReasonContract\nexport type Domain0ActiveConnection = Domain0ConnectSuccessContractEvent['connection']\nexport type Domain0ConnectSuccessEvent = EventPayload<Domain0ConnectSuccessContractEvent>\nexport type Domain0ConnectCloseEvent = EventPayload<Domain0ConnectCloseContractEvent>\nexport type Domain0ConnectStepChangeEvent = EventPayload<Domain0ConnectStepChangeContractEvent>\nexport type Domain0ManualSetupDocumentationClickEvent = EventPayload<\n Domain0ManualSetupDocumentationClickContractEvent\n>\nexport type Domain0RequestCloseEvent = EventPayload<Domain0RequestCloseContractEvent>\nexport type Domain0SharedFlowSentEvent = EventPayload<Domain0SharedFlowSentContractEvent>\nexport type Domain0DkimSetupDocumentationClickEvent = EventPayload<\n Domain0DkimSetupDocumentationClickContractEvent\n>\n\nexport interface Domain0CreateSharedFlowRequest {\n readonly connectionId: ConnectionId\n}\n\nexport interface Domain0SharedFlowGateway {\n create(request: Domain0CreateSharedFlowRequest): Promise<SharedFlowInvitationInput>\n copy?(url: SharedFlowInvitationUrl): Promise<void>\n}\n\nexport interface Domain0ConnectOptions {\n target: HTMLElement\n client: Domain0Client\n connectionId: ConnectionId\n applicationName?: string\n triggerLabel?: string\n triggerHidden?: boolean\n /**\n * 'modal' (default) opens the dialog over the page. 'inline' renders it in\n * normal flow, for embedding the flow inside a surface you already own; it\n * takes no backdrop, traps no focus, and does not steal focus on open.\n */\n presentation?: 'modal' | 'inline'\n locale?: Domain0Locale\n whiteLabel?: Domain0WhiteLabelInput\n setupPolicy?: Domain0SetupPolicyInput\n manualSetupDocumentation?: ManualSetupDocumentationUrlInput\n enableDkim?: boolean\n dkimSelectors?: readonly DkimSelector[]\n domainConnectTemplate?: DomainConnectTemplate\n sharedFlowGateway?: Domain0SharedFlowGateway\n onConnectionChange?: (connection: Connection) => void\n onEvent?: (event: Domain0ConnectEvent) => void\n onSuccess?: (event: Domain0ConnectSuccessEvent) => void\n onClose?: (event: Domain0ConnectCloseEvent) => void\n onStepChange?: (event: Domain0ConnectStepChangeEvent) => void\n onManualSetupDocumentationClick?: (\n event: Domain0ManualSetupDocumentationClickEvent,\n ) => void\n onRequestClose?: (event: Domain0RequestCloseEvent) => void\n onSharedFlowSent?: (event: Domain0SharedFlowSentEvent) => void\n onDkimSetupDocumentationClick?: (\n event: Domain0DkimSetupDocumentationClickEvent,\n ) => void\n}\n\nexport interface Domain0ConnectController {\n open(): Promise<void>\n close(): void\n destroy(): void\n}\n\nlet instanceSequence = 0\n\nconst automaticSetupStates = new Set<Connection['state']>([\n 'domain_connect_pending',\n 'authorization_pending',\n 'authorized',\n 'planning',\n 'awaiting_confirmation',\n 'applying',\n 'failed_retryable',\n])\nconst pollingStates = new Set<Connection['state']>([\n 'domain_connect_pending',\n 'authorization_pending',\n 'planning',\n 'applying',\n 'propagation_pending',\n])\nconst connectionPollIntervalMs = 2_500\n\ninterface CredentialField {\n readonly name: string\n readonly label: string\n readonly control?: 'input' | 'textarea' | 'select'\n readonly type?: 'text' | 'password' | 'datetime-local'\n readonly placeholder?: string\n readonly options?: ReadonlyArray<readonly [string, string]>\n}\n\nexport function mountDomain0Connect(options: Domain0ConnectOptions): Domain0ConnectController {\n const configuration = Domain0ConnectConfigurationSchema.parse({\n applicationName: options.applicationName,\n whiteLabel: options.whiteLabel,\n setupPolicy: options.setupPolicy,\n dkim: {\n enableDkim: options.enableDkim,\n dkimSelectors: options.dkimSelectors,\n },\n manualSetupDocumentation: options.manualSetupDocumentation,\n })\n const {\n applicationName,\n whiteLabel,\n setupPolicy,\n dkim: dkimOptions,\n manualSetupDocumentation,\n } = configuration\n const localizer = createDomain0Localizer(options.locale)\n const messages = localizer.messages\n const document = options.target.ownerDocument\n const instanceId = `domain0-${++instanceSequence}`\n const root = element(document, 'div', 'domain0-root')\n root.lang = localizer.languageTag\n root.dir = localizer.direction\n applyWhiteLabel(root, whiteLabel)\n const style = element(document, 'style')\n style.textContent = domain0Styles\n\n const trigger = element(document, 'button', 'domain0-trigger')\n trigger.type = 'button'\n trigger.textContent = options.triggerLabel ?? messages.triggerConnectDomain\n trigger.hidden = options.triggerHidden ?? false\n\n const presentation = options.presentation ?? 'modal'\n const dialog = presentation === 'inline'\n ? element(document, 'section', 'domain0-dialog domain0-dialog--inline')\n : element(document, 'dialog', 'domain0-dialog')\n const headingId = `${instanceId}-heading`\n dialog.setAttribute('aria-labelledby', headingId)\n if (presentation === 'inline') {\n dialog.hidden = true\n }\n\n const panel = element(document, 'div', 'domain0-panel')\n const companyIdentity = renderCompanyIdentity(document, applicationName, whiteLabel)\n const heading = element(document, 'h2', 'domain0-heading')\n heading.id = headingId\n heading.tabIndex = -1\n heading.textContent = messages.headingConnectDomain\n\n const explanation = element(document, 'p', 'domain0-copy')\n explanation.textContent = localizedCopy(whiteLabel.copy.initialSubtitle, localizer.locale) ??\n messages.initialSubtitle\n\n const eyebrow = element(document, 'p', 'domain0-eyebrow')\n const status = element(document, 'p', 'domain0-status')\n status.setAttribute('role', 'status')\n\n const error = element(document, 'p', 'domain0-error')\n error.setAttribute('role', 'alert')\n\n const content = element(document, 'div', 'domain0-content')\n const actions = element(document, 'div', 'domain0-actions')\n const cancelButton = element(document, 'button', 'domain0-button domain0-button--danger')\n cancelButton.type = 'button'\n cancelButton.textContent = messages.cancelConnection\n cancelButton.hidden = true\n const closeButton = element(document, 'button', 'domain0-button domain0-button--secondary')\n closeButton.type = 'button'\n closeButton.textContent = messages.close\n closeButton.hidden = presentation === 'inline'\n\n actions.append(cancelButton, closeButton)\n if (companyIdentity !== undefined) {\n panel.append(companyIdentity)\n }\n const footer = element(document, 'div', 'domain0-footer')\n footer.setAttribute('aria-hidden', 'true')\n footer.innerHTML =\n '<span class=\"domain0-footer__mark\" aria-hidden=\"true\">' +\n '<svg viewBox=\"0 0 100 100\" fill=\"none\" width=\"12\" height=\"12\">' +\n '<path d=\"M66.34 17.92A36 36 0 0 0 17.92 66.34\" stroke=\"currentColor\" stroke-width=\"15\"/>' +\n '<path d=\"M33.66 82.08A36 36 0 0 0 82.08 33.66\" stroke=\"currentColor\" stroke-width=\"15\"/>' +\n '<path d=\"M16.77 83.23 83.23 16.77\" stroke=\"currentColor\" stroke-width=\"12\"/>' +\n '</svg></span>'\n const footerName = element(document, 'span', 'domain0-footer__name')\n footerName.textContent = 'domain'\n footer.prepend(footerName)\n panel.append(eyebrow, heading, explanation, status, error, content, actions, footer)\n dialog.append(panel)\n root.append(style, trigger, dialog)\n options.target.append(root)\n\n let destroyed = false\n let providers: Provider[] = []\n let candidates: ProviderCandidate[] = []\n let connection: Connection | undefined\n let authorizationHandoff: { url: string; expiresAt: string } | undefined\n let domainConnectHandoffURL: string | undefined\n let currentStep: Domain0ConnectStep | undefined\n let lastConnectionRevision: string | undefined\n let successEmitted = false\n let closeEmitted = true\n let pendingCloseReason: Domain0ConnectCloseReason | undefined\n let returnFocusTo: HTMLElement | undefined\n let loadSequence = 0\n let dkimGuidance: DkimGuidanceResponse | undefined\n let dkimGuidanceLoading = false\n let dkimGuidanceUnavailable = false\n let pollTimer: ReturnType<typeof setTimeout> | undefined\n\n trigger.addEventListener('click', () => {\n void open()\n })\n closeButton.addEventListener('click', requestClose)\n cancelButton.addEventListener('click', renderCancellationConfirmation)\n if (presentation === 'modal') {\n dialog.addEventListener('cancel', () => {\n pendingCloseReason = 'escape'\n })\n dialog.addEventListener('keydown', trapFocus)\n dialog.addEventListener('close', handleClosed)\n }\n\n function isOpen(): boolean {\n return presentation === 'inline'\n ? !dialog.hidden\n : (dialog as HTMLDialogElement).open\n }\n\n function showSurface(): void {\n if (presentation === 'inline') {\n dialog.hidden = false\n return\n }\n ;(dialog as HTMLDialogElement).showModal()\n }\n\n function handleClosed(): void {\n if (closeEmitted) {\n pendingCloseReason = undefined\n return\n }\n loadSequence += 1\n stopPolling()\n emitClose(pendingCloseReason ?? 'programmatic')\n pendingCloseReason = undefined\n restoreFocus()\n }\n\n async function open(): Promise<void> {\n if (destroyed) {\n throw new Error('Domain0 connect UI has been destroyed')\n }\n const loadId = ++loadSequence\n stopPolling()\n clearError()\n status.textContent = messages.loadingConnection\n content.replaceChildren()\n if (!isOpen()) {\n currentStep = undefined\n successEmitted = false\n closeEmitted = false\n pendingCloseReason = undefined\n dkimGuidance = undefined\n dkimGuidanceLoading = false\n dkimGuidanceUnavailable = false\n if (presentation === 'modal') {\n returnFocusTo = currentFocusTarget()\n }\n showSurface()\n if (presentation === 'modal') {\n heading.focus()\n }\n }\n emitStepChange('loading')\n\n try {\n const [connectionResult, providerResult] = await Promise.all([\n options.client.getConnection(options.connectionId),\n options.client.listProviders(),\n ])\n if (!isCurrentLoad(loadId)) {\n return\n }\n connection = connectionResult.connection\n providers = providerResult.providers\n\n candidates = []\n if (shouldDetectProvider(connection)) {\n status.textContent = messages.detectingProvider\n emitStepChange('provider_detection')\n try {\n const detection = await options.client.detectProvider(options.connectionId)\n if (!isCurrentLoad(loadId)) {\n return\n }\n connection = detection.connection\n candidates = detection.candidates\n status.textContent = providerDetectionStatus(connection, candidates, localizer)\n } catch {\n if (!isCurrentLoad(loadId)) {\n return\n }\n status.textContent = messages.detectionUnavailable\n }\n } else {\n status.textContent = ''\n }\n const forcedManualSetup = setupPolicy.mode === 'manual' && connection.state === 'provider_selected'\n if (forcedManualSetup) {\n connection = await enterForcedManualSetup(connection)\n if (!isCurrentLoad(loadId)) {\n return\n }\n status.textContent = messages.manualInstructionsReady\n }\n render()\n } catch (cause) {\n if (isCurrentLoad(loadId)) {\n showError(cause)\n }\n }\n }\n\n function isCurrentLoad(loadId: number): boolean {\n return loadId === loadSequence && isOpen() && !destroyed\n }\n\n function stopPolling(): void {\n if (pollTimer !== undefined) {\n clearTimeout(pollTimer)\n pollTimer = undefined\n }\n }\n\n function schedulePolling(current: Connection): void {\n stopPolling()\n if (!pollingStates.has(current.state) || !isOpen() || destroyed) {\n return\n }\n pollTimer = setTimeout(() => {\n pollTimer = undefined\n void pollConnection(current)\n }, connectionPollIntervalMs)\n }\n\n async function pollConnection(previous: Connection): Promise<void> {\n const loadId = loadSequence\n try {\n const result = await options.client.getConnection(options.connectionId)\n if (!isCurrentLoad(loadId)) {\n return\n }\n const next = result.connection\n const previousRevision = `${previous.id}:${previous.state}:${previous.updatedAt}`\n const nextRevision = `${next.id}:${next.state}:${next.updatedAt}`\n connection = next\n if (previousRevision === nextRevision) {\n schedulePolling(next)\n return\n }\n status.textContent = ''\n render()\n } catch {\n if (isCurrentLoad(loadId) && connection !== undefined) {\n schedulePolling(connection)\n }\n }\n }\n\n function closeDialog(reason: Domain0ConnectCloseReason): void {\n if (!isOpen()) {\n return\n }\n pendingCloseReason = reason\n if (presentation === 'inline') {\n dialog.hidden = true\n handleClosed()\n } else {\n ;(dialog as HTMLDialogElement).close()\n // Native close events are queued differently across engines. Complete\n // the SDK lifecycle now so connectDomain() never resolves before close.\n handleClosed()\n }\n }\n\n function trapFocus(event: KeyboardEvent): void {\n if (event.key !== 'Tab') {\n return\n }\n const focusable = focusableElements(dialog)\n const first = focusable.at(0)\n const last = focusable.at(-1)\n if (first === undefined || last === undefined) {\n event.preventDefault()\n heading.focus()\n return\n }\n const activeIndex = focusable.findIndex((candidate) => candidate === document.activeElement)\n const next = event.shiftKey\n ? (activeIndex <= 0 ? last : focusable[activeIndex - 1])\n : (activeIndex < 0 || activeIndex === focusable.length - 1 ? first : focusable[activeIndex + 1])\n event.preventDefault()\n next?.focus()\n }\n\n function emitClose(reason: Domain0ConnectCloseReason): void {\n if (closeEmitted) {\n return\n }\n closeEmitted = true\n const event = Domain0ConnectCloseEventSchema.parse({\n type: 'close',\n reason,\n connection,\n step: currentStep,\n })\n emitEvent(event)\n options.onClose?.(eventPayload(event))\n }\n\n function requestClose(): void {\n if (options.onRequestClose === undefined) {\n closeDialog('close_button')\n return\n }\n const event = Domain0RequestCloseEventSchema.parse({\n type: 'request_close',\n connection,\n step: currentStep ?? 'loading',\n })\n emitEvent(event)\n options.onRequestClose(eventPayload(event))\n }\n\n function currentFocusTarget(): HTMLElement {\n const activeElement = document.activeElement\n const HTMLElementConstructor = document.defaultView?.HTMLElement\n return HTMLElementConstructor !== undefined && activeElement instanceof HTMLElementConstructor &&\n activeElement !== document.body\n ? activeElement\n : trigger\n }\n\n function restoreFocus(): void {\n const target = returnFocusTo\n returnFocusTo = undefined\n if (target?.isConnected === true) {\n target.focus()\n }\n }\n\n function emitStepChange(step: Domain0ConnectStep): void {\n if (step === currentStep) {\n return\n }\n const previousStep = currentStep\n currentStep = step\n const event = Domain0ConnectStepChangeEventSchema.parse({\n type: 'step_change',\n step,\n previousStep,\n connection,\n })\n emitEvent(event)\n options.onStepChange?.(eventPayload(event))\n }\n\n function emitRenderedConnection(current: Connection, step: Domain0ConnectStep): void {\n const revision = `${current.id}:${current.state}:${current.updatedAt}`\n if (revision !== lastConnectionRevision) {\n lastConnectionRevision = revision\n options.onConnectionChange?.(current)\n }\n emitStepChange(step)\n if (current.state === 'active' && !successEmitted) {\n successEmitted = true\n const event = Domain0ConnectSuccessEventSchema.parse({\n type: 'success',\n connection: current,\n })\n emitEvent(event)\n options.onSuccess?.(eventPayload(event))\n }\n }\n\n function render(): void {\n if (!isOpen() || destroyed) {\n return\n }\n eyebrow.textContent =\n connection === undefined ? '' : localizer.connectionState(connection.state)\n content.replaceChildren()\n heading.textContent = messages.headingConnectDomain\n closeButton.textContent = messages.close\n if (connection === undefined) {\n cancelButton.hidden = true\n return\n }\n cancelButton.hidden = !canCancel(connection.state)\n schedulePolling(connection)\n\n if (setupPolicy.mode === 'manual' && automaticSetupStates.has(connection.state)) {\n const blocked = element(document, 'p', 'domain0-copy')\n blocked.textContent = messages.forcedManualBlocked\n content.append(blocked)\n showError(new Error(messages.forcedManualIncompatible))\n emitRenderedConnection(connection, connection.state)\n focusRenderedStepIfNeeded()\n return\n }\n\n if (connection.state === 'active') {\n if (whiteLabel.skipCongratulationsScreen) {\n emitRenderedConnection(connection, 'active')\n closeDialog('success')\n return\n }\n const message = element(document, 'p', 'domain0-copy')\n heading.textContent = interpolateWhiteLabelCopy(\n localizedCopy(whiteLabel.copy.successTitle, localizer.locale) ?? messages.headingConnectDomain,\n { '{DOMAIN}': connection.intent.domain },\n )\n message.textContent = interpolateWhiteLabelCopy(\n localizedCopy(whiteLabel.copy.successDescription, localizer.locale) ??\n messages.successDescription('{DOMAIN}'),\n { '{DOMAIN}': connection.intent.domain },\n )\n closeButton.textContent = localizedCopy(whiteLabel.copy.successButton, localizer.locale) ??\n messages.close\n content.append(message)\n renderDkimGuidance(connection)\n emitRenderedConnection(connection, 'active')\n focusRenderedStepIfNeeded()\n return\n }\n if (connection.state === 'cancelled') {\n const message = element(document, 'p', 'domain0-copy')\n message.textContent = messages.cancelledDescription(connection.intent.domain)\n content.append(message)\n emitRenderedConnection(connection, 'cancelled')\n focusRenderedStepIfNeeded()\n return\n }\n if (connection.provider !== undefined) {\n renderSelectedProvider(connection, connection.provider)\n emitRenderedConnection(connection, connection.state)\n focusRenderedStepIfNeeded()\n return\n }\n renderProviderForm()\n emitRenderedConnection(connection, 'provider_selection')\n focusRenderedStepIfNeeded()\n }\n\n function renderDkimGuidance(current: Connection): void {\n if (!dkimOptions.enableDkim) {\n return\n }\n const guidanceHeading = element(document, 'h3', 'domain0-subheading')\n guidanceHeading.textContent = messages.dkimHeading\n content.append(guidanceHeading)\n\n if (dkimGuidanceLoading) {\n const loading = element(document, 'p', 'domain0-copy')\n loading.textContent = messages.dkimCheckingProvider\n content.append(loading)\n return\n }\n if (dkimGuidanceUnavailable) {\n const unavailable = element(document, 'p', 'domain0-copy')\n unavailable.textContent = messages.dkimGuidanceUnavailable\n content.append(unavailable)\n return\n }\n if (dkimGuidance === undefined) {\n dkimGuidanceLoading = true\n const loading = element(document, 'p', 'domain0-copy')\n loading.textContent = messages.dkimCheckingProvider\n content.append(loading)\n void loadDkimGuidance(current)\n return\n }\n\n const providerStatus = element(document, 'p', 'domain0-copy')\n if (dkimGuidance.detectionStatus === 'detected' && dkimGuidance.provider !== undefined) {\n providerStatus.textContent = messages.dkimProviderDetected(dkimGuidance.provider.name)\n } else if (dkimGuidance.detectionStatus === 'ambiguous') {\n providerStatus.textContent = messages.dkimProviderAmbiguous\n } else {\n providerStatus.textContent = messages.dkimProviderUnknown\n }\n content.append(providerStatus)\n\n const evidence = element(document, 'p', 'domain0-copy')\n evidence.textContent = dkimEvidenceMessage(dkimGuidance, messages)\n content.append(evidence)\n\n if (dkimGuidance.provider === undefined) {\n return\n }\n const boundary = element(document, 'p', 'domain0-copy')\n boundary.textContent = messages.dkimEvidenceBoundary\n const linkContainer = element(document, 'p', 'domain0-copy')\n const link = element(document, 'a')\n link.href = dkimGuidance.provider.guideUrl\n link.target = '_blank'\n link.rel = 'noopener noreferrer'\n link.textContent = messages.opensInNewTab(messages.dkimOpenGuide(dkimGuidance.provider.name))\n const provider = dkimGuidance.provider\n link.addEventListener('click', () => emitDkimDocumentationClick(current, provider))\n linkContainer.append(link)\n content.append(boundary, linkContainer)\n }\n\n async function loadDkimGuidance(current: Connection): Promise<void> {\n const loadId = loadSequence\n try {\n const result = await options.client.getDkimGuidance(current.id, {\n selectors: dkimOptions.dkimSelectors,\n })\n if (!isCurrentLoad(loadId) || connection?.state !== 'active') {\n return\n }\n if (result.domain !== current.intent.domain) {\n throw new Error(messages.dkimDomainMismatch)\n }\n dkimGuidance = result\n dkimGuidanceLoading = false\n render()\n } catch {\n if (!isCurrentLoad(loadId) || connection?.state !== 'active') {\n return\n }\n dkimGuidanceLoading = false\n dkimGuidanceUnavailable = true\n render()\n }\n }\n\n function emitDkimDocumentationClick(\n current: Connection,\n emailProvider: EmailProvider,\n ): void {\n const event = Domain0DkimSetupDocumentationClickEventSchema.parse({\n type: 'dkim_setup_documentation_click',\n connection: current,\n emailProvider,\n })\n emitEvent(event)\n options.onDkimSetupDocumentationClick?.(eventPayload(event))\n }\n\n function renderSelectedProvider(current: Connection, provider: Provider): void {\n if (current.state !== 'authorization_pending') {\n authorizationHandoff = undefined\n }\n if (current.state !== 'domain_connect_pending') {\n domainConnectHandoffURL = undefined\n }\n const identity = element(document, 'div', 'domain0-provider-chip')\n const providerMark = element(document, 'span', 'domain0-provider-mark')\n providerMark.setAttribute('aria-hidden', 'true')\n providerMark.textContent = provider.name.slice(0, 1).toUpperCase()\n const identityText = element(document, 'span')\n identityText.textContent = `${current.intent.domain} · ${provider.name}`\n identity.append(providerMark, identityText)\n\n const message = element(document, 'p', 'domain0-copy')\n const support = supportDescription(provider, messages)\n message.textContent = messages.selectedProvider(provider.name, support)\n content.append(identity, message)\n const manualScreenDisabled = current.state === 'manual_required' &&\n whiteLabel.customProperties.manualConfiguration.disableScreen\n if (!manualScreenDisabled) {\n const reference = providerReference(provider, current)\n if (reference !== undefined) {\n content.append(reference)\n }\n }\n\n switch (current.state) {\n case 'provider_selected':\n renderAuthorizationChoices(provider)\n if (whiteLabel.customProperties.providerLogin.gotoManualLink.disable) {\n renderManualSetupUnavailable()\n } else {\n renderManualStart()\n }\n return\n case 'authorization_pending':\n if (provider.availableAuthorizationMethods.includes('oauth2_pkce')) {\n renderOAuthAuthorization(provider)\n return\n }\n renderRefresh(messages.refreshConnection)\n return\n case 'domain_connect_pending':\n renderDomainConnect(provider)\n return\n case 'authorized':\n renderPlanPreparation(messages.reviewDnsChanges)\n return\n case 'awaiting_confirmation':\n if (current.plan === undefined) {\n showError(new Error(messages.missingConfirmationPlan))\n return\n }\n renderChangePlan(current.plan)\n renderPlanConfirmation(current.plan)\n renderPlanPreparation(messages.recalculateChangePlan)\n return\n case 'applying':\n if (current.plan === undefined) {\n showError(new Error(messages.missingApplyingPlan))\n return\n }\n renderChangePlan(current.plan)\n renderPlanApplication()\n return\n case 'manual_required':\n if (whiteLabel.customProperties.manualConfiguration.disableScreen) {\n renderManualSetupUnavailable()\n return\n }\n if (effectiveRecords(current).length === 0) {\n renderNoRecordChangesRequired()\n renderManualSubmit(messages.continue)\n } else {\n renderRecordInstructions(\n effectiveRecords(current),\n messages.addResolvedRecords,\n )\n renderManualSubmit()\n }\n renderSharedFlowHandoff(current)\n return\n case 'propagation_pending':\n if (effectiveRecords(current).length === 0) {\n renderNoRecordChangesRequired()\n renderPropagationCheck(messages.finishConnection)\n } else {\n renderRecordInstructions(\n effectiveRecords(current),\n messages.authoritativeRecordGuidance,\n )\n renderPropagationCheck()\n }\n return\n case 'failed_retryable':\n if (current.failure === undefined) {\n showError(new Error(messages.missingFailureDetails))\n return\n }\n renderRetryableFailure(current.failure)\n return\n default: {\n const stateMessage = element(document, 'p', 'domain0-copy')\n stateMessage.textContent = messages.currentState(localizer.connectionState(current.state))\n const refresh = actionButton(messages.refreshConnection, () => open())\n content.append(stateMessage, refresh)\n }\n }\n }\n\n function focusRenderedStepIfNeeded(): void {\n const active = document.activeElement\n const intentionalHeading = active === heading ||\n (active instanceof HTMLElement && active.matches('.domain0-subheading'))\n const activeControl = active instanceof HTMLElement && focusableElements(dialog).includes(active)\n if (intentionalHeading || activeControl) {\n return\n }\n const target = [\n '.domain0-subheading',\n '.domain0-table-region',\n 'select, input, textarea',\n 'button',\n 'a[href]',\n ].map((selector) => content.querySelector<HTMLElement>(selector))\n .find((candidate): candidate is HTMLElement => candidate !== null) ?? heading\n if (target.matches('.domain0-subheading')) {\n target.tabIndex = -1\n }\n target.focus()\n }\n\n function renderAuthorizationChoices(provider: Provider): void {\n if (provider.availableAuthorizationMethods.includes('domain_connect')) {\n renderDomainConnect(provider)\n }\n if (provider.availableAuthorizationMethods.includes('oauth2_pkce')) {\n renderOAuthAuthorization(provider)\n }\n if (provider.availableAuthorizationMethods.some(\n (method) => method === 'api_token' || method === 'api_key' || method === 'basic' || method === 'session',\n )) {\n renderCredentialAuthorization(provider)\n }\n }\n\n function renderDomainConnect(provider: Provider): void {\n const heading = element(document, 'h3', 'domain0-subheading')\n heading.textContent = messages.domainConnectHeading\n const guidance = element(document, 'p', 'domain0-copy')\n guidance.textContent = providerLoginMessage(\n provider,\n messages.domainConnectGuidance,\n )\n content.append(heading, guidance)\n\n const template = options.domainConnectTemplate\n if (template === undefined) {\n const unavailable = element(document, 'p', 'domain0-copy')\n unavailable.textContent = connection?.state === 'domain_connect_pending'\n ? messages.domainConnectResumeUnavailable\n : messages.domainConnectUnavailable\n content.append(unavailable)\n return\n }\n if (domainConnectHandoffURL !== undefined) {\n const link = element(document, 'a', 'domain0-button domain0-link-button')\n link.href = domainConnectHandoffURL\n link.target = '_blank'\n link.rel = 'noopener noreferrer'\n link.textContent = messages.continueSecurely(provider.name)\n link.setAttribute('aria-label', messages.continueSecurelyNewTab(provider.name))\n const completion = actionButton(messages.completedDomainConnect, async (button) => {\n status.textContent = messages.preparingAuthoritativeVerification\n const result = await options.client.submitDomainConnectCompletion(options.connectionId, {\n commandId: commandId(instanceId, 'domain-connect-complete'),\n })\n connection = result.connection\n status.textContent = messages.readyToVerifyPropagation\n render()\n button.disabled = false\n })\n content.append(link, completion)\n return\n }\n\n const label = connection?.state === 'domain_connect_pending'\n ? messages.resumeDomainConnect(provider.name)\n : messages.connectWithProvider(provider.name)\n const start = actionButton(label, async (button) => {\n status.textContent = messages.checkingDomainConnectTemplate\n const result = await options.client.startDomainConnect(options.connectionId, {\n ...template,\n commandId: commandId(instanceId, 'domain-connect-start'),\n })\n connection = result.connection\n domainConnectHandoffURL = result.handoffUrl\n status.textContent = messages.domainConnectReady\n render()\n button.disabled = false\n })\n content.append(start)\n }\n\n function providerReference(\n provider: Provider,\n current: Connection,\n ): HTMLParagraphElement | undefined {\n const container = element(document, 'p', 'domain0-copy')\n const manualSetup = current.state === 'manual_required'\n const documentationLinkDisabled = manualSetup &&\n whiteLabel.copy.manuallyScreen.disableManualSetupDocumentationLink\n const manualGuideLabel = localizedCopy(\n whiteLabel.copy.manuallyScreen.stepByStepGuide,\n localizer.locale,\n )\n\n if (documentationLinkDisabled) {\n if (options.onEvent === undefined && options.onManualSetupDocumentationClick === undefined) {\n return undefined\n }\n const help = element(document, 'button', 'domain0-button domain0-button--secondary')\n help.type = 'button'\n help.textContent = manualGuideLabel ?? messages.requestManualSetupHelp\n help.addEventListener('click', () => emitManualDocumentationClick(current))\n container.append(help)\n return container\n }\n\n const link = element(document, 'a')\n link.href = manualSetup && manualSetupDocumentation !== undefined\n ? manualSetupDocumentation\n : provider.referenceUrl\n link.target = '_blank'\n link.rel = 'noopener noreferrer'\n const linkLabel = manualSetup\n ? manualGuideLabel ?? (manualSetupDocumentation !== undefined\n ? messages.openApplicationManualSetupGuide\n : messages.followProviderGuide(provider.name))\n : messages.openProviderReference(provider.name)\n const accessibleLabel = messages.opensInNewTab(linkLabel)\n link.textContent = manualSetup && manualSetupDocumentation !== undefined\n ? accessibleLabel\n : linkLabel\n link.setAttribute('aria-label', accessibleLabel)\n if (manualSetup) {\n link.addEventListener('click', () => emitManualDocumentationClick(current))\n }\n container.append(link)\n return container\n }\n\n function emitManualDocumentationClick(current: Connection): void {\n if (current.state !== 'manual_required') {\n return\n }\n const event = Domain0ManualSetupDocumentationClickEventSchema.parse({\n type: 'manual_setup_documentation_click',\n connection: current,\n })\n emitEvent(event)\n options.onManualSetupDocumentationClick?.(eventPayload(event))\n }\n\n function renderSharedFlowHandoff(current: Connection): void {\n const gateway = options.sharedFlowGateway\n const sharingDisabled = whiteLabel.removeShareLogin ||\n whiteLabel.customProperties.providerLogin.forwardLink.disable\n if (gateway === undefined || current.state !== 'manual_required' || sharingDisabled) {\n return\n }\n const shareHeading = element(document, 'h3', 'domain0-subheading')\n shareHeading.textContent = messages.sharedFlowHeading\n const guidance = element(document, 'p', 'domain0-copy')\n guidance.textContent = messages.sharedFlowGuidance\n const share = actionButton(messages.copySecureSetupLink, async (button) => {\n status.textContent = messages.creatingSecureSetupLink\n const invitation = SharedFlowInvitationSchema.parse(await gateway.create({\n connectionId: current.id,\n }))\n if (Date.parse(invitation.expiresAt) <= Date.now()) {\n throw new Error(messages.expiredSharedFlow)\n }\n await copySharedFlowURL(gateway, invitation.url)\n const event = Domain0SharedFlowSentEventSchema.parse({\n type: 'shared_flow_sent',\n connection: current,\n ...invitation,\n })\n emitEvent(event)\n options.onSharedFlowSent?.(eventPayload(event))\n status.textContent = messages.secureSetupLinkCopied\n button.textContent = messages.copySetupLinkAgain\n button.disabled = false\n })\n content.append(shareHeading, guidance, share)\n }\n\n async function copySharedFlowURL(\n gateway: Domain0SharedFlowGateway,\n url: SharedFlowInvitationUrl,\n ): Promise<void> {\n if (gateway.copy !== undefined) {\n await gateway.copy(url)\n return\n }\n const clipboard = document.defaultView?.navigator.clipboard\n if (clipboard === undefined) {\n throw new Error(messages.clipboardUnavailable)\n }\n await clipboard.writeText(url)\n }\n\n function emitEvent(event: Domain0ConnectEvent): void {\n options.onEvent?.(event)\n }\n\n function renderOAuthAuthorization(provider: Provider): void {\n const heading = element(document, 'h3', 'domain0-subheading')\n heading.textContent = messages.oauthHeading\n const guidance = element(document, 'p', 'domain0-copy')\n guidance.textContent = providerLoginMessage(\n provider,\n messages.oauthGuidance,\n )\n content.append(heading, guidance)\n\n if (authorizationHandoff !== undefined) {\n const link = element(document, 'a', 'domain0-button domain0-link-button')\n link.href = authorizationHandoff.url\n link.target = '_blank'\n link.rel = 'noopener noreferrer'\n link.textContent = messages.continueToProvider(provider.name)\n const expiry = element(document, 'p', 'domain0-copy')\n const time = element(document, 'time')\n time.dateTime = authorizationHandoff.expiresAt\n time.textContent = localizer.formatDateTime(authorizationHandoff.expiresAt)\n appendDateMessage(expiry, messages.authorizationExpires, time)\n content.append(link, expiry)\n renderRefresh(messages.completedAuthorization)\n return\n }\n\n const label = connection?.state === 'authorization_pending'\n ? messages.resumeAuthorization(provider.name)\n : messages.authorizeWithProvider(provider.name)\n const start = actionButton(label, async (button) => {\n status.textContent = messages.preparingAuthorizationLink\n const result = await options.client.startOAuth(options.connectionId, {\n commandId: commandId(instanceId, 'start-oauth'),\n })\n connection = result.connection\n authorizationHandoff = { url: result.authorizationUrl, expiresAt: result.expiresAt }\n status.textContent = messages.authorizationLinkReady\n render()\n button.disabled = false\n })\n content.append(start)\n }\n\n function renderCredentialAuthorization(provider: Provider): void {\n const kind = credentialKindForProvider(provider.id)\n if (kind === undefined) {\n return\n }\n const heading = element(document, 'h3', 'domain0-subheading')\n heading.textContent = credentialHeading(kind, messages)\n const guidance = element(document, 'p', 'domain0-copy')\n guidance.textContent = providerLoginMessage(\n provider,\n messages.credentialGuidance,\n )\n const form = element(document, 'form', 'domain0-form')\n const controls = new Map<string, HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>()\n for (const [index, field] of credentialFields(kind, messages).entries()) {\n const inputId = `${instanceId}-credential-${index}`\n const label = element(document, 'label', 'domain0-label')\n label.htmlFor = inputId\n label.textContent = field.label\n let control: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n if (field.control === 'textarea') {\n control = element(document, 'textarea', 'domain0-input')\n control.rows = 7\n } else if (field.control === 'select') {\n const select = element(document, 'select', 'domain0-select')\n for (const [value, text] of field.options ?? []) {\n const option = element(document, 'option')\n option.value = value\n option.textContent = text\n select.append(option)\n }\n control = select\n } else {\n const input = element(document, 'input', 'domain0-input')\n input.type = field.type ?? 'text'\n input.autocapitalize = 'none'\n input.spellcheck = false\n control = input\n }\n control.id = inputId\n control.name = kind === 'api_token' && field.name === 'token' ? 'api-token' : field.name\n control.required = true\n control.autocomplete = 'off'\n if (field.placeholder !== undefined) {\n control.setAttribute('placeholder', field.placeholder)\n }\n controls.set(field.name, control)\n form.append(label, control)\n }\n const submit = element(document, 'button', 'domain0-button')\n submit.type = 'submit'\n submit.textContent = kind === 'api_token'\n ? messages.authorizeApiToken\n : messages.authorizeProviderCredentials(provider.name)\n form.append(submit)\n form.addEventListener('submit', (event) => {\n event.preventDefault()\n if (!form.reportValidity()) {\n return\n }\n clearError()\n const credentials: Record<string, string> = { kind }\n for (const [name, control] of controls) {\n credentials[name] = name === 'expiresAt'\n ? new Date(control.value).toISOString()\n : control.value\n control.value = ''\n control.disabled = true\n }\n let authorizationInput\n try {\n authorizationInput = AuthorizeWithCredentialInputSchema.parse({\n providerId: provider.id,\n credentials,\n commandId: commandId(instanceId, 'authorize-credential'),\n })\n } catch (cause) {\n for (const control of controls.values()) {\n control.disabled = false\n }\n showError(cause)\n controls.values().next().value?.focus()\n return\n }\n submit.disabled = true\n status.textContent = messages.encryptingAuthorization\n void options.client.authorizeWithCredential(options.connectionId, authorizationInput).then((result) => {\n connection = result.connection\n status.textContent = messages.authorizationCompleted\n render()\n }).catch((cause: unknown) => {\n for (const control of controls.values()) {\n control.disabled = false\n }\n submit.disabled = false\n showError(cause)\n controls.values().next().value?.focus()\n })\n })\n content.append(heading, guidance, form)\n }\n\n function renderRefresh(label: string): void {\n const refresh = actionButton(label, () => open())\n content.append(refresh)\n }\n\n function providerLoginMessage(provider: Provider, fallback: string): string {\n const message = localizedCopy(whiteLabel.copy.providerLoginMessage, localizer.locale)\n return message === undefined\n ? fallback\n : interpolateWhiteLabelCopy(message, { '{PROVIDER}': provider.name })\n }\n\n function renderPlanPreparation(submitLabel: string): void {\n const selectId = `${instanceId}-conflict-policy`\n const helpId = `${instanceId}-conflict-policy-help`\n const spfPolicyId = `${instanceId}-spf-replacement`\n const spfHelpId = `${instanceId}-spf-replacement-help`\n const form = element(document, 'form', 'domain0-form')\n const label = element(document, 'label', 'domain0-label')\n label.htmlFor = selectId\n label.textContent = messages.existingRecordPolicy\n const help = element(document, 'p', 'domain0-copy')\n help.id = helpId\n help.textContent = messages.existingRecordPolicyHelp\n const select = element(document, 'select', 'domain0-select')\n select.id = selectId\n select.setAttribute('aria-describedby', helpId)\n for (const [value, text] of conflictPolicyOptions(messages)) {\n const option = element(document, 'option')\n option.value = value\n option.textContent = text\n select.append(option)\n }\n const spfRow = element(document, 'div', 'domain0-checkbox-row')\n const replaceSPF = element(document, 'input', 'domain0-checkbox')\n replaceSPF.type = 'checkbox'\n replaceSPF.id = spfPolicyId\n replaceSPF.setAttribute('aria-describedby', spfHelpId)\n const spfLabel = element(document, 'label', 'domain0-label')\n spfLabel.htmlFor = spfPolicyId\n spfLabel.textContent = messages.replaceSpf\n spfRow.append(replaceSPF, spfLabel)\n const spfHelp = element(document, 'p', 'domain0-copy')\n spfHelp.id = spfHelpId\n spfHelp.textContent = messages.replaceSpfHelp\n const submit = element(document, 'button', 'domain0-button')\n submit.type = 'submit'\n submit.textContent = submitLabel\n form.append(label, help, select, spfRow, spfHelp, submit)\n form.addEventListener('submit', (event) => {\n event.preventDefault()\n clearError()\n select.disabled = true\n replaceSPF.disabled = true\n submit.disabled = true\n status.textContent = messages.readingRecords\n const spfPolicy: SpfConflictPolicy = replaceSPF.checked ? 'replace' : 'merge'\n void options.client.preparePlan(options.connectionId, {\n conflictPolicy: select.value as ConflictPolicy,\n spfPolicy,\n commandId: commandId(instanceId, 'prepare-plan'),\n }).then((result) => {\n connection = result.connection\n status.textContent = connection.state === 'propagation_pending'\n ? messages.recordsAlreadyExist\n : messages.reviewChanges\n render()\n }).catch((cause: unknown) => {\n select.disabled = false\n replaceSPF.disabled = false\n submit.disabled = false\n showError(cause)\n select.focus()\n })\n })\n content.append(form)\n }\n\n function renderChangePlan(plan: ChangePlan): void {\n const region = element(document, 'div', 'domain0-table-region')\n region.tabIndex = 0\n region.setAttribute('role', 'region')\n region.setAttribute('aria-label', messages.proposedChangesRegion)\n const table = element(document, 'table', 'domain0-table')\n const caption = element(document, 'caption')\n caption.textContent = messages.proposedChangesCaption(\n connection?.intent.domain ?? messages.thisDomain,\n )\n const head = element(document, 'thead')\n const headingRow = element(document, 'tr')\n for (const label of [\n messages.columnAction,\n messages.columnCurrentRecord,\n messages.columnResultingRecord,\n messages.columnRisk,\n ]) {\n const header = element(document, 'th')\n header.scope = 'col'\n header.textContent = label\n headingRow.append(header)\n }\n head.append(headingRow)\n const body = element(document, 'tbody')\n for (const change of plan.changes) {\n const row = element(document, 'tr')\n appendCell(row, changeActionLabel(change.action, messages), true)\n appendCell(row, recordSummary(change.before, localizer))\n appendCell(row, recordSummary(change.after, localizer))\n appendCell(row, change.destructive ? messages.destructive : messages.nonDestructive)\n if (change.destructive) {\n row.classList.add('domain0-table__row--destructive')\n }\n body.append(row)\n }\n table.append(caption, head, body)\n region.append(table)\n content.append(region)\n\n if (plan.warnings.length > 0) {\n const warningHeading = element(document, 'h3', 'domain0-subheading')\n warningHeading.textContent = messages.planWarnings\n const warnings = element(document, 'ul', 'domain0-list')\n for (const warning of plan.warnings) {\n const item = element(document, 'li')\n item.textContent = localizer.planWarning(warning)\n warnings.append(item)\n }\n content.append(warningHeading, warnings)\n }\n const expiry = element(document, 'p', 'domain0-copy')\n const time = element(document, 'time')\n time.dateTime = plan.expiresAt\n time.textContent = localizer.formatDateTime(plan.expiresAt)\n appendDateMessage(expiry, messages.planExpires, time)\n content.append(expiry)\n }\n\n function renderPlanConfirmation(plan: ChangePlan): void {\n const destructive = plan.changes.some((change) => change.destructive)\n const form = element(document, 'form', 'domain0-form')\n let acknowledgement: HTMLInputElement | undefined\n if (destructive) {\n const row = element(document, 'div', 'domain0-checkbox-row')\n acknowledgement = element(document, 'input', 'domain0-checkbox')\n acknowledgement.type = 'checkbox'\n acknowledgement.id = `${instanceId}-destructive-confirmation`\n acknowledgement.required = true\n const label = element(document, 'label')\n label.htmlFor = acknowledgement.id\n label.textContent = messages.destructiveAcknowledgement\n row.append(acknowledgement, label)\n form.append(row)\n }\n const submit = element(document, 'button', 'domain0-button')\n submit.type = 'submit'\n submit.textContent = messages.confirmChangePlan\n form.append(submit)\n form.addEventListener('submit', (event) => {\n event.preventDefault()\n if (acknowledgement !== undefined && !acknowledgement.reportValidity()) {\n acknowledgement.focus()\n return\n }\n submit.disabled = true\n status.textContent = messages.confirmingChangePlan\n void options.client.confirmPlan(options.connectionId, {\n digest: plan.digest,\n allowDestructive: acknowledgement?.checked ?? false,\n commandId: commandId(instanceId, 'confirm-plan'),\n }).then((result) => {\n connection = result.connection\n status.textContent = messages.planConfirmed\n render()\n }).catch((cause: unknown) => {\n submit.disabled = false\n showError(cause)\n submit.focus()\n })\n })\n content.append(form)\n }\n\n function renderPlanApplication(): void {\n const apply = actionButton(messages.applyDnsChanges, async (button) => {\n status.textContent = messages.applyingDnsChanges\n const result = await options.client.applyPlan(options.connectionId, {\n commandId: commandId(instanceId, 'apply-plan'),\n })\n connection = result.connection\n status.textContent = messages.dnsChangesApplied\n render()\n button.disabled = false\n })\n content.append(apply)\n }\n\n function renderManualStart(): void {\n const guidance = element(document, 'p', 'domain0-copy')\n guidance.textContent = connection?.provider?.detection.method === 'manual'\n ? `${localizer.providerDetectionReason(connection.provider.detection.reasonCode)} ${messages.manualGuidance}`\n : messages.manualGuidance\n const start = actionButton(messages.showDnsRecords, async (button) => {\n status.textContent = messages.preparingDnsInstructions\n const result = await options.client.startManualConfiguration(options.connectionId, {\n commandId: commandId(instanceId, 'manual-start'),\n })\n connection = result.connection\n status.textContent = messages.dnsInstructionsReady\n render()\n button.disabled = false\n })\n start.classList.add('domain0-button--secondary')\n content.append(guidance, start)\n }\n\n function renderManualSetupUnavailable(): void {\n const unavailableHeading = element(document, 'h3', 'domain0-subheading')\n unavailableHeading.textContent = messages.manualSetupUnavailableHeading\n const guidance = element(document, 'p', 'domain0-copy')\n guidance.textContent = messages.manualSetupUnavailableDescription\n content.append(unavailableHeading, guidance)\n }\n\n function renderRecordInstructions(records: DnsRecord[], description: string): void {\n const guidance = element(document, 'p', 'domain0-copy')\n guidance.textContent = description\n\n const region = element(document, 'div', 'domain0-table-region')\n region.tabIndex = 0\n region.setAttribute('role', 'region')\n region.setAttribute('aria-label', messages.dnsRecordsRegion)\n\n const table = element(document, 'table', 'domain0-table')\n const caption = element(document, 'caption')\n caption.textContent = messages.dnsRecordsCaption(\n connection?.intent.domain ?? messages.thisDomain,\n )\n const head = element(document, 'thead')\n const headingRow = element(document, 'tr')\n for (const label of [\n messages.columnType,\n messages.columnHost,\n messages.columnValue,\n messages.columnTtl,\n messages.columnPriority,\n messages.columnRequirement,\n ]) {\n const header = element(document, 'th')\n header.scope = 'col'\n header.textContent = label\n headingRow.append(header)\n }\n head.append(headingRow)\n\n const body = element(document, 'tbody')\n for (const record of records) {\n const row = element(document, 'tr')\n appendCell(row, record.type, true)\n appendCell(row, record.host)\n appendCell(row, record.value)\n appendCell(row, String(record.ttl))\n appendCell(row, record.priority === undefined ? '—' : String(record.priority))\n appendCell(row, record.optional ? messages.optional : messages.required)\n body.append(row)\n }\n table.append(caption, head, body)\n region.append(table)\n content.append(guidance, region)\n }\n\n function effectiveRecords(current: Connection): DnsRecord[] {\n return current.effectiveIntent?.records ?? current.intent.records\n }\n\n function renderNoRecordChangesRequired(): void {\n const message = element(document, 'p', 'domain0-copy')\n message.textContent = messages.noRecordChanges\n content.append(message)\n }\n\n function renderManualSubmit(label = messages.addedRecords): void {\n const submit = actionButton(label, async (button) => {\n status.textContent = messages.savingConfirmation\n const result = await options.client.submitManualCompletion(options.connectionId, {\n commandId: commandId(instanceId, 'manual-submit'),\n })\n connection = result.connection\n status.textContent = messages.readyToVerifyPropagation\n render()\n button.disabled = false\n })\n content.append(submit)\n }\n\n function renderPropagationCheck(label = messages.verifyDnsRecords): void {\n const verify = actionButton(label, async (button) => {\n status.textContent = messages.checkingNameservers\n const result = await options.client.verifyPropagation(options.connectionId, {\n commandId: commandId(instanceId, 'verify'),\n })\n connection = result.connection\n status.textContent = connection.state === 'active'\n ? messages.requiredRecordsActive\n : messages.propagationPending\n render()\n button.disabled = false\n })\n content.append(verify)\n }\n\n function renderRetryableFailure(failure: ConnectionFailure): void {\n const heading = element(document, 'h3', 'domain0-subheading')\n heading.textContent = messages.providerFailureHeading\n const guidance = element(document, 'p', 'domain0-copy')\n guidance.textContent = failureDescription(failure, messages)\n const occurred = element(document, 'p', 'domain0-copy')\n const time = element(document, 'time')\n time.dateTime = failure.occurredAt\n time.textContent = localizer.formatDateTime(failure.occurredAt)\n appendDateMessage(occurred, messages.timeoutRecorded, time)\n const retry = actionButton(messages.retryConnection, async (button) => {\n status.textContent = messages.restoringConnection\n const result = await options.client.retryConnection(options.connectionId, {\n commandId: commandId(instanceId, 'retry'),\n })\n connection = result.connection\n status.textContent = messages.connectionRestored(localizer.connectionState(connection.state))\n render()\n button.disabled = false\n })\n content.append(heading, guidance, occurred, retry)\n }\n\n function renderCancellationConfirmation(): void {\n if (connection === undefined || !canCancel(connection.state)) {\n return\n }\n cancelButton.hidden = true\n content.replaceChildren()\n\n const confirmationHeading = element(document, 'h3', 'domain0-subheading')\n confirmationHeading.textContent = messages.cancelHeading\n const guidance = element(document, 'p', 'domain0-copy')\n guidance.textContent = messages.cancelGuidance\n const confirmationActions = element(document, 'div', 'domain0-actions')\n const keep = element(document, 'button', 'domain0-button domain0-button--secondary')\n keep.type = 'button'\n keep.textContent = messages.keepConnection\n keep.addEventListener('click', render)\n const confirm = actionButton(messages.confirmCancellation, async (button) => {\n status.textContent = messages.cancellingConnection\n const result = await options.client.cancelConnection(options.connectionId, {\n commandId: commandId(instanceId, 'cancel'),\n })\n connection = result.connection\n status.textContent = messages.connectionCancelled\n render()\n button.disabled = false\n })\n confirm.classList.add('domain0-button--danger')\n confirmationActions.append(keep, confirm)\n content.append(confirmationHeading, guidance, confirmationActions)\n confirmationHeading.tabIndex = -1\n confirmationHeading.focus()\n emitStepChange('cancellation_confirmation')\n }\n\n function actionButton(\n label: string,\n action: (button: HTMLButtonElement) => Promise<void>,\n ): HTMLButtonElement {\n const button = element(document, 'button', 'domain0-button')\n button.type = 'button'\n button.textContent = label\n button.addEventListener('click', () => {\n clearError()\n button.disabled = true\n void action(button).catch((cause: unknown) => {\n button.disabled = false\n showError(cause)\n button.focus()\n })\n })\n return button\n }\n\n function renderProviderForm(): void {\n const helpId = `${instanceId}-provider-help`\n const selectId = `${instanceId}-provider`\n const form = element(document, 'form', 'domain0-form')\n form.noValidate = true\n\n const label = element(document, 'label', 'domain0-label')\n label.htmlFor = selectId\n label.textContent = messages.dnsProvider\n\n const help = element(document, 'p', 'domain0-copy')\n help.id = helpId\n help.textContent = candidates.length === 0\n ? messages.providerHelp\n : messages.detectedProviderHelp\n\n const select = element(document, 'select', 'domain0-select')\n select.id = selectId\n select.name = 'provider'\n select.required = true\n select.setAttribute('aria-describedby', helpId)\n\n const placeholder = element(document, 'option')\n placeholder.value = ''\n placeholder.textContent = messages.chooseProvider\n select.append(placeholder)\n\n const suggestedProviderIds = new Set(candidates.map((candidate) => candidate.provider.id))\n const suggestedProviders = providers.filter((provider) => suggestedProviderIds.has(provider.id))\n const otherProviders = providers.filter((provider) => !suggestedProviderIds.has(provider.id))\n if (suggestedProviders.length > 0) {\n select.append(providerOptions(document, messages.suggestedFromDns, suggestedProviders, messages))\n select.append(providerOptions(document, messages.allOtherProviders, otherProviders, messages))\n } else {\n for (const provider of providers) {\n select.append(providerOption(document, provider, messages))\n }\n }\n\n const submit = element(document, 'button', 'domain0-button')\n submit.type = 'submit'\n submit.textContent = messages.continueWithProvider\n\n form.append(label, help, select, submit)\n form.addEventListener('submit', (event) => {\n event.preventDefault()\n if (!select.reportValidity()) {\n select.focus()\n return\n }\n void selectProvider(select.value, select, submit)\n })\n content.append(form)\n }\n\n async function selectProvider(\n providerId: string,\n select: HTMLSelectElement,\n submit: HTMLButtonElement,\n ): Promise<void> {\n clearError()\n select.disabled = true\n submit.disabled = true\n status.textContent = messages.savingProviderSelection\n try {\n if (connection !== undefined && connection.state === 'requested') {\n status.textContent = messages.preparingProviderSelection\n const detection = await options.client.detectProvider(options.connectionId)\n connection = detection.connection\n candidates = detection.candidates\n if (connection.provider !== undefined) {\n const providerName = connection.provider.name\n if (setupPolicy.mode === 'manual') {\n connection = await enterForcedManualSetup(connection)\n }\n status.textContent = setupPolicy.mode === 'manual'\n ? messages.manualInstructionsReady\n : messages.providerDetected(providerName)\n render()\n return\n }\n }\n const result = await options.client.selectProvider(options.connectionId, {\n providerId,\n commandId: `${instanceId}-select-${providerId}`,\n })\n connection = result.connection\n if (setupPolicy.mode === 'manual') {\n connection = await enterForcedManualSetup(connection)\n }\n status.textContent = setupPolicy.mode === 'manual'\n ? messages.manualInstructionsReady\n : messages.providerSelected(connection.provider?.name ?? messages.dnsProvider)\n render()\n } catch (cause) {\n select.disabled = false\n submit.disabled = false\n showError(cause)\n select.focus()\n }\n }\n\n async function enterForcedManualSetup(current: Connection): Promise<Connection> {\n if (setupPolicy.mode !== 'manual' || current.state !== 'provider_selected') {\n return current\n }\n status.textContent = messages.preparingManualInstructions\n const result = await options.client.startManualConfiguration(options.connectionId, {\n commandId: commandId(instanceId, 'forced-manual-start'),\n })\n if (result.connection.state !== 'manual_required') {\n throw new Error(messages.manualSetupNotEntered)\n }\n return result.connection\n }\n\n function showError(cause: unknown): void {\n const message = cause instanceof Domain0Error\n ? localizer.apiError(cause.response.error.code)\n : cause instanceof Domain0TransportError\n ? messages.transportError\n : cause instanceof Domain0ProtocolError\n ? messages.protocolError\n : cause instanceof Error\n ? cause.message\n : messages.unknownError\n error.textContent = messages.errorPrefix(message)\n status.textContent = ''\n }\n\n function clearError(): void {\n error.textContent = ''\n }\n\n return {\n open,\n close() {\n closeDialog('programmatic')\n },\n destroy() {\n stopPolling()\n if (isOpen()) {\n closeDialog('destroyed')\n emitClose('destroyed')\n }\n root.remove()\n destroyed = true\n },\n }\n}\n\nfunction renderCompanyIdentity(\n document: Document,\n applicationName: string | undefined,\n whiteLabel: Domain0WhiteLabel,\n): HTMLElement | undefined {\n const logoUrl = whiteLabel.logo\n const showLogo = logoUrl !== undefined && !whiteLabel.hideCompanyLogo\n const showName = applicationName !== undefined && !whiteLabel.hideCompanyName\n if (!showLogo && !showName) {\n return undefined\n }\n\n const identity = element(document, 'div', 'domain0-company-identity')\n if (showLogo) {\n const logo = element(document, 'img', 'domain0-company-logo')\n logo.alt = showName ? '' : (applicationName ?? '')\n logo.width = 64\n logo.height = 64\n logo.decoding = 'async'\n logo.referrerPolicy = 'no-referrer'\n logo.src = logoUrl\n if (whiteLabel.removeLogoBorder) {\n logo.classList.add('domain0-company-logo--borderless')\n }\n identity.append(logo)\n }\n if (showName) {\n const name = element(document, 'p', 'domain0-company-name')\n name.textContent = applicationName\n identity.append(name)\n }\n return identity\n}\n\nfunction shouldDetectProvider(connection: Connection): boolean {\n return connection.provider === undefined &&\n (connection.state === 'requested' || connection.state === 'detecting_provider')\n}\n\nfunction focusableElements(container: HTMLElement): HTMLElement[] {\n const selector = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n ].join(',')\n return [...container.querySelectorAll<HTMLElement>(selector)].filter(\n (candidate) => !candidate.hidden && candidate.closest('[hidden]') === null &&\n candidate.getAttribute('aria-hidden') !== 'true',\n )\n}\n\nfunction canCancel(state: Connection['state']): boolean {\n return state !== 'active' && state !== 'failed_terminal' && state !== 'cancelled'\n}\n\nfunction providerDetectionStatus(\n connection: Connection,\n candidates: ProviderCandidate[],\n localizer: Domain0Localizer,\n): string {\n const { messages } = localizer\n if (connection.provider !== undefined) {\n return messages.providerDetected(connection.provider.name)\n }\n if (candidates.length === 0) {\n return messages.noProviderDetected\n }\n return candidates.length === 1\n ? messages.possibleProviderFound\n : messages.possibleProvidersFound(localizer.formatInteger(candidates.length))\n}\n\nfunction providerOptions(\n document: Document,\n label: string,\n providers: Provider[],\n messages: Domain0Messages,\n): HTMLOptGroupElement {\n const group = element(document, 'optgroup')\n group.label = label\n for (const provider of providers) {\n group.append(providerOption(document, provider, messages))\n }\n return group\n}\n\nfunction providerOption(\n document: Document,\n provider: Provider,\n messages: Domain0Messages,\n): HTMLOptionElement {\n const option = element(document, 'option')\n option.value = provider.id\n option.textContent = `${provider.name} — ${supportLabel(provider, messages)}`\n return option\n}\n\nfunction recordSummary(record: DnsRecord | undefined, localizer: Domain0Localizer): string {\n if (record === undefined) {\n return '—'\n }\n const priority = record.priority === undefined\n ? ''\n : localizer.messages.recordPriority(localizer.formatInteger(record.priority))\n return localizer.messages.recordSummary(\n record.type,\n record.host,\n record.value,\n localizer.formatInteger(record.ttl),\n priority,\n )\n}\n\nfunction supportLabel(provider: Provider, messages: Domain0Messages): string {\n switch (provider.implementation) {\n case 'automatic': return messages.supportAutomatic\n case 'domain_connect': return messages.supportDomainConnect\n case 'manual': return messages.supportManual\n case 'unverified': return messages.supportUnverified\n }\n}\n\nfunction dkimEvidenceMessage(\n guidance: DkimGuidanceResponse,\n messages: Domain0Messages,\n): string {\n switch (guidance.dkimDns.status) {\n case 'record_observed':\n return messages.dkimRecordObserved(\n guidance.dkimDns.records.map((record) => record.selector).join(', '),\n )\n case 'no_record_observed':\n return messages.dkimNoRecordObserved(guidance.dkimDns.selectorsChecked.join(', '))\n case 'not_checked':\n return messages.dkimNotChecked\n case 'lookup_unavailable':\n return messages.dkimLookupUnavailable\n }\n}\n\nfunction supportDescription(provider: Provider, messages: Domain0Messages): string {\n switch (provider.implementation) {\n case 'automatic': return messages.supportAutomaticDescription\n case 'domain_connect': return messages.supportDomainConnectDescription\n case 'manual': return messages.supportManualDescription\n case 'unverified': return messages.supportUnverifiedDescription\n }\n}\n\nfunction failureDescription(failure: ConnectionFailure, messages: Domain0Messages): string {\n switch (failure.code) {\n case 'provider_snapshot_timeout':\n return messages.snapshotTimeout\n case 'provider_apply_timeout':\n return messages.applyTimeout\n }\n}\n\nfunction commandId(instanceId: string, operation: string): string {\n const nonce = globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${++instanceSequence}`\n return `${instanceId}-${operation}-${nonce}`\n}\n\nfunction credentialKindForProvider(providerId: string): DirectCredentialKind | undefined {\n return Object.prototype.hasOwnProperty.call(directCredentialKindByProvider, providerId)\n ? directCredentialKindByProvider[providerId as keyof typeof directCredentialKindByProvider]\n : undefined\n}\n\nfunction credentialHeading(kind: DirectCredentialKind, messages: Domain0Messages): string {\n switch (kind) {\n case 'api_token': return messages.credentialHeadingApiToken\n case 'access_key': return messages.credentialHeadingAccessKey\n case 'username_password': return messages.credentialHeadingUsernamePassword\n case 'account_token': return messages.credentialHeadingAccountToken\n case 'username_token': return messages.credentialHeadingUsernameToken\n case 'ovh': return messages.credentialHeadingOvh\n case 'private_key': return messages.credentialHeadingPrivateKey\n case 'aws_session': return messages.credentialHeadingAwsSession\n case 'cpanel': return messages.credentialHeadingCpanel\n case 'client_credentials': return messages.credentialHeadingClientCredentials\n }\n}\n\nfunction credentialFields(\n kind: DirectCredentialKind,\n messages: Domain0Messages,\n): readonly CredentialField[] {\n switch (kind) {\n case 'api_token': return [{ name: 'token', label: messages.fieldApiToken, type: 'password' }]\n case 'access_key': return [\n { name: 'keyId', label: messages.fieldAccessKeyId },\n { name: 'secret', label: messages.fieldApiSecret, type: 'password' },\n ]\n case 'username_password': return [\n { name: 'username', label: messages.fieldUsername },\n { name: 'password', label: messages.fieldPassword, type: 'password' },\n ]\n case 'account_token': return [\n { name: 'accountId', label: messages.fieldAccountId },\n { name: 'token', label: messages.fieldApiToken, type: 'password' },\n ]\n case 'username_token': return [\n { name: 'username', label: messages.fieldUsername },\n { name: 'token', label: messages.fieldApiToken, type: 'password' },\n ]\n case 'ovh': return [\n {\n name: 'endpoint', label: messages.fieldOvhRegion, control: 'select', options: [\n ['ovh-eu', messages.regionOvhEurope],\n ['ovh-us', messages.regionOvhUnitedStates],\n ['ovh-ca', messages.regionOvhCanada],\n ['kimsufi-eu', messages.regionKimsufiEurope],\n ['kimsufi-ca', messages.regionKimsufiCanada],\n ['soyoustart-eu', messages.regionSoYouStartEurope],\n ['soyoustart-ca', messages.regionSoYouStartCanada],\n ],\n },\n { name: 'applicationKey', label: messages.fieldApplicationKey },\n { name: 'applicationSecret', label: messages.fieldApplicationSecret, type: 'password' },\n { name: 'consumerKey', label: messages.fieldConsumerKey, type: 'password' },\n ]\n case 'private_key': return [\n { name: 'login', label: messages.fieldProviderLogin },\n { name: 'privateKey', label: messages.fieldPemPrivateKey, control: 'textarea' },\n ]\n case 'aws_session': return [\n { name: 'keyId', label: messages.fieldAwsAccessKeyId },\n { name: 'secret', label: messages.fieldAwsSecretAccessKey, type: 'password' },\n { name: 'sessionToken', label: messages.fieldAwsSessionToken, type: 'password' },\n { name: 'hostedZoneId', label: messages.fieldRoute53ZoneId, placeholder: 'Z0123456789ABC' },\n { name: 'expiresAt', label: messages.fieldSessionExpiration, type: 'datetime-local' },\n ]\n case 'cpanel': return [\n { name: 'endpoint', label: messages.fieldCpanelEndpoint, placeholder: 'https://host.example:2083' },\n { name: 'username', label: messages.fieldCpanelUsername },\n { name: 'token', label: messages.fieldCpanelApiToken, type: 'password' },\n ]\n case 'client_credentials': return [\n { name: 'clientId', label: messages.fieldStorefrontClientId },\n { name: 'clientSecret', label: messages.fieldStorefrontClientSecret, type: 'password' },\n ]\n }\n}\n\nfunction appendCell(row: HTMLTableRowElement, value: string, header = false): void {\n const cell = row.ownerDocument.createElement(header ? 'th' : 'td')\n if (header) {\n cell.scope = 'row'\n }\n cell.textContent = value\n row.append(cell)\n}\n\nfunction appendDateMessage(\n container: HTMLElement,\n template: string,\n time: HTMLTimeElement,\n): void {\n const [before, after, ...unexpected] = template.split('{DATE}')\n if (before === undefined || after === undefined || unexpected.length > 0) {\n throw new Error('Localized date message must contain exactly one {DATE} placeholder')\n }\n container.append(before, time, after)\n}\n\nfunction conflictPolicyOptions(\n messages: Domain0Messages,\n): ReadonlyArray<readonly [ConflictPolicy, string]> {\n return [\n ['preserve', messages.preserveExistingRecords],\n ['replace_same_name_and_type', messages.replaceSameNameAndType],\n ['replace_all_at_name', messages.replaceAllAtName],\n ]\n}\n\nfunction changeActionLabel(\n action: ChangePlan['changes'][number]['action'],\n messages: Domain0Messages,\n): string {\n switch (action) {\n case 'create': return messages.changeCreate\n case 'replace': return messages.changeUpdate\n case 'delete': return messages.changeDelete\n }\n}\n\nfunction eventPayload<TEvent extends { readonly type: string }>(\n event: TEvent,\n): Omit<TEvent, 'type'> {\n const { type: _type, ...payload } = event\n return payload\n}\n\nfunction element<K extends keyof HTMLElementTagNameMap>(\n document: Document,\n tagName: K,\n className?: string,\n): HTMLElementTagNameMap[K] {\n const result = document.createElement(tagName)\n if (className !== undefined) {\n result.className = className\n }\n return result\n}\n","import type { Domain0Client } from '../client'\nimport {\n ConnectionFlowIdSchema,\n type Domain0Locale,\n type ConnectionFlow,\n type ConnectionFlowId,\n} from '../contracts'\nimport {\n mountDomain0Connect,\n type Domain0ConnectController,\n type Domain0ConnectOptions,\n} from './connect'\nimport { createDomain0Localizer } from './localization'\n\ntype ChildConnectOptions = Omit<\n Domain0ConnectOptions,\n 'target' | 'client' | 'connectionId' | 'triggerHidden' | 'locale'\n>\n\nexport interface Domain0ConnectionFlowOptions {\n target: HTMLElement\n client: Domain0Client\n flowId: ConnectionFlowId\n locale?: Domain0Locale\n connect?: ChildConnectOptions\n onTargetChange?: (event: {\n flow: ConnectionFlow\n index: number\n total: number\n domain: string\n }) => void\n onSuccess?: (flow: ConnectionFlow) => void\n}\n\nexport interface Domain0ConnectionFlowController {\n open(): Promise<void>\n close(): void\n destroy(): void\n}\n\nexport function mountDomain0ConnectionFlow(\n options: Domain0ConnectionFlowOptions,\n): Domain0ConnectionFlowController {\n const flowId = ConnectionFlowIdSchema.parse(options.flowId)\n const localizer = createDomain0Localizer(options.locale)\n const { messages } = localizer\n const document = options.target.ownerDocument\n const root = document.createElement('section')\n root.className = 'domain0-flow'\n root.lang = localizer.languageTag\n root.dir = localizer.direction\n root.setAttribute('aria-labelledby', `domain0-flow-${flowId}-heading`)\n\n const heading = document.createElement('h2')\n heading.id = `domain0-flow-${flowId}-heading`\n heading.textContent = messages.headingConnectDomains\n const progress = document.createElement('p')\n progress.className = 'domain0-flow__progress'\n progress.setAttribute('role', 'status')\n progress.setAttribute('aria-live', 'polite')\n const steps = document.createElement('ol')\n steps.className = 'domain0-flow__steps'\n const childHost = document.createElement('div')\n childHost.className = 'domain0-flow__current'\n root.append(heading, progress, steps, childHost)\n options.target.append(root)\n\n let destroyed = false\n let session = 0\n let child: Domain0ConnectController | undefined\n let flow: ConnectionFlow | undefined\n const completed = new Set<string>()\n\n async function open(): Promise<void> {\n if (destroyed) throw new Error('Domain0 connection flow UI has been destroyed')\n const currentSession = ++session\n child?.destroy()\n child = undefined\n childHost.replaceChildren()\n progress.textContent = messages.loadingFlow\n const response = await options.client.getConnectionFlow(flowId)\n if (destroyed || currentSession !== session) return\n flow = response.flow\n if (flow.state !== 'ready') {\n progress.textContent = messages.flowNotReady\n return\n }\n renderSteps(flow)\n await openNext(currentSession)\n }\n\n function renderSteps(current: ConnectionFlow): void {\n const items = current.targets.map((target, index) => {\n const item = document.createElement('li')\n item.dataset.connectionId = target.connectionId\n item.textContent = messages.flowStep(localizer.formatInteger(index + 1), target.domain)\n return item\n })\n steps.replaceChildren(...items)\n }\n\n async function openNext(currentSession: number): Promise<void> {\n if (destroyed || currentSession !== session || flow === undefined) return\n const index = flow.targets.findIndex((target) =>\n target.connectionId !== undefined && !completed.has(target.connectionId),\n )\n if (index < 0) {\n progress.textContent = messages.allDomainsConnected(localizer.formatInteger(flow.targets.length))\n childHost.replaceChildren()\n options.onSuccess?.(flow)\n return\n }\n const target = flow.targets[index]\n if (target === undefined || target.connectionId === undefined) return\n progress.textContent = messages.domainProgress(\n localizer.formatInteger(index + 1),\n localizer.formatInteger(flow.targets.length),\n target.domain,\n )\n steps.querySelectorAll('li').forEach((item, itemIndex) => {\n if (itemIndex === index) item.setAttribute('aria-current', 'step')\n else item.removeAttribute('aria-current')\n })\n options.onTargetChange?.({ flow, index, total: flow.targets.length, domain: target.domain })\n\n const connect = options.connect\n child = mountDomain0Connect({\n ...connect,\n target: childHost,\n client: options.client,\n connectionId: target.connectionId,\n locale: localizer.locale,\n triggerHidden: true,\n onSuccess: (event) => {\n connect?.onSuccess?.(event)\n completed.add(target.connectionId as string)\n const item = steps.children.item(index) as HTMLElement | null\n item?.removeAttribute('aria-current')\n if (item !== null) {\n item.textContent = messages.flowStepConnected(\n localizer.formatInteger(index + 1),\n target.domain,\n )\n }\n queueMicrotask(() => {\n child?.destroy()\n child = undefined\n childHost.replaceChildren()\n void openNext(currentSession)\n })\n },\n })\n await child.open()\n }\n\n return {\n open,\n close() {\n session += 1\n child?.close()\n },\n destroy() {\n if (destroyed) return\n destroyed = true\n session += 1\n child?.destroy()\n root.remove()\n },\n }\n}\n","import { loadSharedFlow } from '../client'\nimport type { SharedFlowUrl } from '../contracts'\nimport { Domain0ProtocolError } from '../client/error'\nimport { mountDomain0Connect } from './connect'\nimport type { Domain0ConnectController, Domain0ConnectOptions } from './connect'\n\nexport interface Domain0SharedFlowOptions\n extends Omit<Domain0ConnectOptions, 'target' | 'client' | 'connectionId'> {\n target: HTMLElement\n apiBaseUrl: string\n url: SharedFlowUrl\n origin?: string\n fetch?: typeof globalThis.fetch\n}\n\nexport async function mountDomain0SharedFlow(\n options: Domain0SharedFlowOptions,\n): Promise<Domain0ConnectController> {\n const inferredOrigin = options.target.ownerDocument.defaultView?.location.origin\n const origin = options.origin ?? inferredOrigin\n if (origin === undefined || origin === 'null') {\n throw new Domain0ProtocolError('Shared flows require an explicit browser origin')\n }\n const loaded = await loadSharedFlow({\n baseUrl: options.apiBaseUrl,\n url: options.url,\n origin,\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n })\n return mountDomain0Connect({\n target: options.target,\n client: loaded.client,\n connectionId: loaded.connectionId,\n ...(options.triggerLabel === undefined ? {} : { triggerLabel: options.triggerLabel }),\n ...(options.triggerHidden === undefined ? {} : { triggerHidden: options.triggerHidden }),\n ...(options.locale === undefined ? {} : { locale: options.locale }),\n ...(options.whiteLabel === undefined ? {} : { whiteLabel: options.whiteLabel }),\n ...(options.setupPolicy === undefined ? {} : { setupPolicy: options.setupPolicy }),\n ...(options.manualSetupDocumentation === undefined\n ? {}\n : { manualSetupDocumentation: options.manualSetupDocumentation }),\n ...(options.enableDkim === undefined ? {} : { enableDkim: options.enableDkim }),\n ...(options.dkimSelectors === undefined ? {} : { dkimSelectors: options.dkimSelectors }),\n ...(options.domainConnectTemplate === undefined ? {} : { domainConnectTemplate: options.domainConnectTemplate }),\n ...(options.sharedFlowGateway === undefined ? {} : { sharedFlowGateway: options.sharedFlowGateway }),\n ...(options.onConnectionChange === undefined ? {} : { onConnectionChange: options.onConnectionChange }),\n ...(options.onEvent === undefined ? {} : { onEvent: options.onEvent }),\n ...(options.onSuccess === undefined ? {} : { onSuccess: options.onSuccess }),\n ...(options.onClose === undefined ? {} : { onClose: options.onClose }),\n ...(options.onStepChange === undefined ? {} : { onStepChange: options.onStepChange }),\n ...(options.onManualSetupDocumentationClick === undefined\n ? {}\n : { onManualSetupDocumentationClick: options.onManualSetupDocumentationClick }),\n ...(options.onRequestClose === undefined ? {} : { onRequestClose: options.onRequestClose }),\n ...(options.onSharedFlowSent === undefined ? {} : { onSharedFlowSent: options.onSharedFlowSent }),\n ...(options.onDkimSetupDocumentationClick === undefined\n ? {}\n : { onDkimSetupDocumentationClick: options.onDkimSetupDocumentationClick }),\n })\n}\n","import { Domain0ProtocolError } from '../client/error'\nimport { mountDomain0Connect } from './connect'\nimport type { Domain0ConnectController, Domain0ConnectOptions } from './connect'\nimport { mountDomain0ConnectionFlow } from './connection-flow'\nimport type {\n Domain0ConnectionFlowController,\n Domain0ConnectionFlowOptions,\n} from './connection-flow'\nimport { mountDomain0SharedFlow } from './shared-flow'\nimport type { Domain0SharedFlowOptions as Domain0MountedSharedFlowOptions } from './shared-flow'\n\nexport type {\n Domain0CreateSharedFlowRequest,\n Domain0SharedFlowGateway,\n} from './connect'\n\nexport interface Domain0ConnectDomainOptions\n extends Omit<Domain0ConnectOptions, 'target' | 'triggerHidden'> {\n target?: HTMLElement\n}\n\nexport interface Domain0LoadSharedFlowOptions\n extends Omit<Domain0MountedSharedFlowOptions, 'target' | 'triggerHidden'> {\n target?: HTMLElement\n}\n\nexport interface Domain0ConnectDomainsOptions\n extends Omit<Domain0ConnectionFlowOptions, 'target'> {\n target?: HTMLElement\n}\n\nexport interface Domain0SDK {\n load(): Promise<void>\n connectDomain(options: Domain0ConnectDomainOptions): Promise<Domain0ConnectController>\n connectDomains(options: Domain0ConnectDomainsOptions): Promise<Domain0ConnectionFlowController>\n loadSharedFlow(options: Domain0LoadSharedFlowOptions): Promise<Domain0ConnectController>\n close(): void\n destroy(): void\n}\n\nexport function createDomain0(): Domain0SDK {\n type ActiveController = Pick<Domain0ConnectController, 'open' | 'close' | 'destroy'>\n\n let active: ActiveController | undefined\n let launchSequence = 0\n\n function targetOrDocumentBody(target: HTMLElement | undefined): HTMLElement {\n const resolved = target ?? globalThis.document?.body\n if (resolved === undefined) {\n throw new Domain0ProtocolError('Domain0 Connect requires a browser document or an explicit target')\n }\n return resolved\n }\n\n function replaceActive(): number {\n const launch = ++launchSequence\n if (active !== undefined) {\n active.close()\n active.destroy()\n active = undefined\n }\n return launch\n }\n\n async function activate<Controller extends ActiveController>(\n launch: number,\n controllerPromise: Controller | Promise<Controller>,\n ): Promise<Controller> {\n const controller = await controllerPromise\n if (launch !== launchSequence) {\n controller.destroy()\n throw new Domain0ProtocolError('Domain0 Connect launch was superseded')\n }\n active = controller\n await controller.open()\n if (launch !== launchSequence) {\n controller.destroy()\n if (active === controller) {\n active = undefined\n }\n throw new Domain0ProtocolError('Domain0 Connect launch was superseded')\n }\n return controller\n }\n\n return {\n async load() {\n // The npm package is already loaded; this preserves Entri-style preload semantics.\n },\n async connectDomain(options) {\n const launch = replaceActive()\n const controller = mountDomain0Connect({\n ...options,\n target: targetOrDocumentBody(options.target),\n triggerHidden: true,\n })\n return activate(launch, controller)\n },\n async connectDomains(options) {\n const launch = replaceActive()\n const controller = mountDomain0ConnectionFlow({\n ...options,\n target: targetOrDocumentBody(options.target),\n })\n return activate(launch, controller)\n },\n async loadSharedFlow(options) {\n const launch = replaceActive()\n const controller = mountDomain0SharedFlow({\n ...options,\n target: targetOrDocumentBody(options.target),\n triggerHidden: true,\n })\n return activate(launch, controller)\n },\n close() {\n launchSequence++\n active?.close()\n },\n destroy() {\n launchSequence++\n active?.destroy()\n active = undefined\n },\n }\n}\n\nexport const domain0 = createDomain0()\n"],"mappings":"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"}