@zitadel/components 0.1.0-alpha.10 → 0.1.0-alpha.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +25 -42
  2. package/dist/atoms/index.d.mts +2 -2
  3. package/dist/atoms/index.mjs +2 -2
  4. package/dist/{atoms-BaayzEsr.mjs → atoms-BSwVl736.mjs} +617 -11
  5. package/dist/atoms-BSwVl736.mjs.map +1 -0
  6. package/dist/default-6uEUU3Kn.mjs +6 -0
  7. package/dist/default-6uEUU3Kn.mjs.map +1 -0
  8. package/dist/{index-DVDCrfkv.d.mts → index-1zs8u08H.d.mts} +892 -78
  9. package/dist/index-1zs8u08H.d.mts.map +1 -0
  10. package/dist/{index-EJengPPu.d.mts → index-EC-BnGsx.d.mts} +3 -3
  11. package/dist/{index-EJengPPu.d.mts.map → index-EC-BnGsx.d.mts.map} +1 -1
  12. package/dist/{index-DB_JTtln.d.mts → index-eaABWYuQ.d.mts} +34 -8
  13. package/dist/index-eaABWYuQ.d.mts.map +1 -0
  14. package/dist/index.d.mts +5 -5
  15. package/dist/index.mjs +5 -5
  16. package/dist/manifests.d.mts.map +1 -1
  17. package/dist/manifests.mjs +4 -2
  18. package/dist/manifests.mjs.map +1 -1
  19. package/dist/orchestrator/index.d.mts +2 -2
  20. package/dist/orchestrator/index.mjs +2 -2
  21. package/dist/{orchestrator-BEvS2wA_.mjs → orchestrator-D6mdML5f.mjs} +134 -43
  22. package/dist/orchestrator-D6mdML5f.mjs.map +1 -0
  23. package/dist/standalone.mjs +760 -52
  24. package/dist/tokens/index.d.mts +1 -1
  25. package/dist/tokens/index.mjs +1 -1
  26. package/dist/{tokens-BQ_augxi.mjs → tokens-C0j4iCrs.mjs} +4 -4
  27. package/dist/tokens-C0j4iCrs.mjs.map +1 -0
  28. package/package.json +3 -6
  29. package/dist/atoms-BaayzEsr.mjs.map +0 -1
  30. package/dist/default-Cpl78hQN.mjs +0 -6
  31. package/dist/default-Cpl78hQN.mjs.map +0 -1
  32. package/dist/index-DB_JTtln.d.mts.map +0 -1
  33. package/dist/index-DVDCrfkv.d.mts.map +0 -1
  34. package/dist/orchestrator-BEvS2wA_.mjs.map +0 -1
  35. package/dist/tokens-BQ_augxi.mjs.map +0 -1
@@ -1,6 +1,6 @@
1
- import { _ as __decorate, b as t, v as focusVisibleStyles, x as emit, y as baseHostStyles } from "./atoms-BaayzEsr.mjs";
2
- import { r as tokensCss } from "./tokens-BQ_augxi.mjs";
3
- import { t as default_default } from "./default-Cpl78hQN.mjs";
1
+ import { C as baseHostStyles, S as focusVisibleStyles, T as emit, w as t, x as __decorate } from "./atoms-BSwVl736.mjs";
2
+ import { r as tokensCss } from "./tokens-C0j4iCrs.mjs";
3
+ import { t as default_default } from "./default-6uEUU3Kn.mjs";
4
4
  import { manifestRegistry } from "./manifests.mjs";
5
5
  import { LitElement, css, html, nothing } from "lit";
6
6
  import { customElement, property, state } from "lit/decorators.js";
@@ -158,6 +158,7 @@ var __exportAll = (all, no_symbols) => {
158
158
  * OpenAPI spec version: 0.0.1
159
159
  */
160
160
  var zitadelNextGen_exports = /* @__PURE__ */ __exportAll({
161
+ activateFlowDefinition: () => activateFlowDefinition,
161
162
  authorizeDevice: () => authorizeDevice,
162
163
  authorizeGet: () => authorizeGet,
163
164
  createAuthAttempt: () => createAuthAttempt,
@@ -169,9 +170,11 @@ var zitadelNextGen_exports = /* @__PURE__ */ __exportAll({
169
170
  createSession: () => createSession,
170
171
  createTeam: () => createTeam,
171
172
  createUser: () => createUser,
173
+ deactivateFlowDefinition: () => deactivateFlowDefinition,
172
174
  deleteFlowDefinition: () => deleteFlowDefinition,
173
175
  endSession: () => endSession,
174
176
  exchangeHandoff: () => exchangeHandoff,
177
+ getActivateFlowDefinitionUrl: () => getActivateFlowDefinitionUrl,
175
178
  getAuthAttempt: () => getAuthAttempt,
176
179
  getAuthorizeDeviceUrl: () => getAuthorizeDeviceUrl,
177
180
  getAuthorizeGetUrl: () => getAuthorizeGetUrl,
@@ -184,6 +187,7 @@ var zitadelNextGen_exports = /* @__PURE__ */ __exportAll({
184
187
  getCreateSessionUrl: () => getCreateSessionUrl,
185
188
  getCreateTeamUrl: () => getCreateTeamUrl,
186
189
  getCreateUserUrl: () => getCreateUserUrl,
190
+ getDeactivateFlowDefinitionUrl: () => getDeactivateFlowDefinitionUrl,
187
191
  getDeleteFlowDefinitionUrl: () => getDeleteFlowDefinitionUrl,
188
192
  getEndSessionUrl: () => getEndSessionUrl,
189
193
  getExchangeHandoffUrl: () => getExchangeHandoffUrl,
@@ -367,7 +371,7 @@ const getGetTokenUrl = () => {
367
371
  return `${getProxyPath()}/auth/token`;
368
372
  };
369
373
  /**
370
- * @summary Get accesstoken
374
+ * @summary Get access token
371
375
  */
372
376
  const getToken = async (getTokenBody, options) => {
373
377
  const formUrlEncoded = new URLSearchParams();
@@ -1019,7 +1023,7 @@ const getCreateFlowDefinitionUrl = () => {
1019
1023
  Flow definitions are templates that define the sequence of steps (capabilities)
1020
1024
  for a particular user journey (e.g., registration, login, password reset).
1021
1025
 
1022
- Flow definitions are created based on the flow meta schema, which includes the flow's purpose, audience, and the steps involved.
1026
+ Flow definitions are created based on the flow definition schema, which includes the flow's purpose, audience, and the steps involved.
1023
1027
 
1024
1028
  * @summary Create a new flow definition
1025
1029
  */
@@ -1081,13 +1085,15 @@ const getUpdateFlowDefinitionUrl = (id, params) => {
1081
1085
  return stringifiedParams.length > 0 ? `${getProxyPath()}/flow_definitions/${id}?${stringifiedParams}` : `${getProxyPath()}/flow_definitions/${id}`;
1082
1086
  };
1083
1087
  /**
1084
- * Update a flow definition by id
1088
+ * Update a flow definition by id. This endpoint replaces the existing flow definition.
1089
+ If `flow_definition.status` is omitted, the current status is preserved
1090
+
1085
1091
  * @summary Update a flow definition by id
1086
1092
  */
1087
1093
  const updateFlowDefinition = async (id, updateFlowDefinitionBody, params, options) => {
1088
1094
  return customFetch(getUpdateFlowDefinitionUrl(id, params), {
1089
1095
  ...options,
1090
- method: "PATCH",
1096
+ method: "PUT",
1091
1097
  headers: {
1092
1098
  "Content-Type": "application/json",
1093
1099
  ...options?.headers
@@ -1104,7 +1110,10 @@ const getDeleteFlowDefinitionUrl = (id, params) => {
1104
1110
  return stringifiedParams.length > 0 ? `${getProxyPath()}/flow_definitions/${id}?${stringifiedParams}` : `${getProxyPath()}/flow_definitions/${id}`;
1105
1111
  };
1106
1112
  /**
1107
- * Delete a flow definition by id
1113
+ * Delete a flow definition by id.
1114
+ If the flow definition is currently being used by a flow, the deletion will fail.
1115
+ If the flow definition is the last active flow definition for a given purpose, the deletion will fail to prevent disruption of new flows being started for that purpose.
1116
+
1108
1117
  * @summary Delete a flow definition by id
1109
1118
  */
1110
1119
  const deleteFlowDefinition = async (id, params, options) => {
@@ -1113,6 +1122,47 @@ const deleteFlowDefinition = async (id, params, options) => {
1113
1122
  method: "DELETE"
1114
1123
  });
1115
1124
  };
1125
+ const getActivateFlowDefinitionUrl = (id, params) => {
1126
+ const normalizedParams = new URLSearchParams();
1127
+ Object.entries(params || {}).forEach(([key, value]) => {
1128
+ if (value !== void 0) normalizedParams.append(key, value === null ? "null" : value.toString());
1129
+ });
1130
+ const stringifiedParams = normalizedParams.toString();
1131
+ return stringifiedParams.length > 0 ? `${getProxyPath()}/flow_definitions/${id}/activate?${stringifiedParams}` : `${getProxyPath()}/flow_definitions/${id}/activate`;
1132
+ };
1133
+ /**
1134
+ * Activate a flow definition by transitioning it from a `draft` state to an `active` state.
1135
+ Alternatively, the status of a flow definition can also be set via the `POST /flow_definitions` and `PUT /flow_definitions/{id}` endpoints by setting the `status` attribute in the flow definition payload.
1136
+
1137
+ * @summary Activate a flow definition by ID.
1138
+ */
1139
+ const activateFlowDefinition = async (id, params, options) => {
1140
+ return customFetch(getActivateFlowDefinitionUrl(id, params), {
1141
+ ...options,
1142
+ method: "POST"
1143
+ });
1144
+ };
1145
+ const getDeactivateFlowDefinitionUrl = (id, params) => {
1146
+ const normalizedParams = new URLSearchParams();
1147
+ Object.entries(params || {}).forEach(([key, value]) => {
1148
+ if (value !== void 0) normalizedParams.append(key, value === null ? "null" : value.toString());
1149
+ });
1150
+ const stringifiedParams = normalizedParams.toString();
1151
+ return stringifiedParams.length > 0 ? `${getProxyPath()}/flow_definitions/${id}/deactivate?${stringifiedParams}` : `${getProxyPath()}/flow_definitions/${id}/deactivate`;
1152
+ };
1153
+ /**
1154
+ * Deactivates a flow definition in the `active` state by transitioning it to the `draft` state.
1155
+ Flow definitions in `draft` state cannot be used to start new flows. Existing flows that use the deactivated flow definition must gracefully handle this.
1156
+ Alternatively, the status of a flow definition can also be set via the `POST /flow_definitions` and `PUT /flow_definitions/{id}` endpoints by setting the `status` attribute in the flow definition payload.
1157
+
1158
+ * @summary Deactivate a flow definition by ID.
1159
+ */
1160
+ const deactivateFlowDefinition = async (id, params, options) => {
1161
+ return customFetch(getDeactivateFlowDefinitionUrl(id, params), {
1162
+ ...options,
1163
+ method: "POST"
1164
+ });
1165
+ };
1116
1166
  const getCreateTeamUrl = (params) => {
1117
1167
  const normalizedParams = new URLSearchParams();
1118
1168
  Object.entries(params || {}).forEach(([key, value]) => {
@@ -1572,34 +1622,63 @@ function sanitiseUrl(value, field, issues) {
1572
1622
  //#endregion
1573
1623
  //#region src/orchestrator/font-loader.ts
1574
1624
  /**
1575
- * Inject `branding.font_url` as `<link rel="stylesheet">` into the host
1576
- * document's `<head>`. Per `docs/design/branding/templates.md`:
1625
+ * Document-level font stylesheet injection for `<zitadel-login>`.
1626
+ *
1627
+ * Two faces can be linked into the host document's `<head>`:
1577
1628
  *
1578
- * "The `font_url` stylesheet is injected by the orchestrator; the template
1579
- * does not emit the `<link>` tag itself."
1629
+ * - The **design-system default** (`applyDefaultFont`) the brand body face
1630
+ * (Arimo, named first in `--zl-font-family-sans`). The component ships this
1631
+ * so the auth screens render in the brand font out of the box, even when the
1632
+ * server returns no branding. This is the "default users can override" layer.
1633
+ * - The **tenant override** (`applyFontUrl`) — `branding.font_url`, resolved
1634
+ * server-side from the app → team → project branding hierarchy.
1580
1635
  *
1581
- * The link must live at document level, not inside the shadow root:
1582
- * browsers ignore `@font-face` rules declared in shadow-tree stylesheets,
1583
- * so a shadow-scoped link would never register the font faces and every
1584
- * branded font silently falls back to the system stack. `font-family`
1585
- * references inside the shadow tree resolve against document-level faces.
1636
+ * Both must live at document level, not inside the shadow root: browsers ignore
1637
+ * `@font-face` rules declared in shadow-tree stylesheets, so a shadow-scoped
1638
+ * link would never register the font faces and every branded font silently
1639
+ * falls back to the system stack. `font-family` references inside the shadow
1640
+ * tree resolve against document-level faces.
1586
1641
  *
1587
- * Idempotent: calling with the same URL is a no-op; calling with a new URL
1588
- * replaces the previous link. Calling with `null`/`undefined` removes any
1589
- * previously injected link.
1642
+ * Both injectors are idempotent: calling with the same URL is a no-op; calling
1643
+ * with a new URL replaces the previous link; calling with `null`/`undefined`
1644
+ * removes any previously injected link.
1645
+ */
1646
+ const TENANT_LINK_ID = "zl-font-link";
1647
+ const DEFAULT_LINK_ID = "zl-default-font-link";
1648
+ /**
1649
+ * Design-system default brand font. Arimo is the Figma body face and leads the
1650
+ * `--zl-font-family-sans` stack; loading it here makes the unbranded auth UI
1651
+ * paint in the brand font instead of the system fallback. Tenants override it
1652
+ * with `branding.font_url`. Exported so a privacy- or offline-sensitive
1653
+ * deployment can self-host the same face and swap this single URL.
1654
+ */
1655
+ const DEFAULT_BRAND_FONT_HREF = "https://fonts.googleapis.com/css2?family=Arimo:ital,wght@0,400;0,500;0,600;0,700;1,400&display=swap";
1656
+ /**
1657
+ * Inject the tenant's `branding.font_url` stylesheet. Pass `null`/`undefined`
1658
+ * to remove it (e.g. when a flow resolves with no tenant font).
1590
1659
  */
1591
- const LINK_ID = "zl-font-link";
1592
1660
  function applyFontUrl(shadowRoot, fontUrl) {
1661
+ applyLinkedStylesheet(shadowRoot, TENANT_LINK_ID, fontUrl);
1662
+ }
1663
+ /**
1664
+ * Inject the design-system default font stylesheet. Defaults to
1665
+ * {@link DEFAULT_BRAND_FONT_HREF}; pass `null` to remove it (the orchestrator
1666
+ * does this when a tenant `font_url` takes over, to avoid a redundant request).
1667
+ */
1668
+ function applyDefaultFont(shadowRoot, href = DEFAULT_BRAND_FONT_HREF) {
1669
+ applyLinkedStylesheet(shadowRoot, DEFAULT_LINK_ID, href);
1670
+ }
1671
+ function applyLinkedStylesheet(shadowRoot, linkId, href) {
1593
1672
  const ownerDocument = shadowRoot.ownerDocument ?? document;
1594
- const existing = ownerDocument.head.querySelector(`link#${LINK_ID}`);
1595
- if (!fontUrl) {
1673
+ const existing = ownerDocument.head.querySelector(`link#${linkId}`);
1674
+ if (!href) {
1596
1675
  existing?.remove();
1597
1676
  return;
1598
1677
  }
1599
1678
  const link = existing ?? ownerDocument.createElement("link");
1600
- link.id = LINK_ID;
1679
+ link.id = linkId;
1601
1680
  link.rel = "stylesheet";
1602
- if (link.href !== fontUrl) link.href = fontUrl;
1681
+ if (link.href !== href) link.href = href;
1603
1682
  if (!existing) ownerDocument.head.appendChild(link);
1604
1683
  }
1605
1684
  //#endregion
@@ -1727,6 +1806,22 @@ function createLiquidEngine(options) {
1727
1806
  const lookupKey = `${stringify(textKey)}.help`;
1728
1807
  return options.locale[lookupKey] ?? "";
1729
1808
  });
1809
+ /**
1810
+ * Builds `<zl-select>` options from a field's closed `validation.enum`. The
1811
+ * wire only carries the allowed values (strings), so the label defaults to the
1812
+ * value — author the enum with display-ready text. Piped through `| json` into
1813
+ * the element's `options` attribute.
1814
+ */
1815
+ engine.registerFilter("selectOptions", (values) => {
1816
+ if (!Array.isArray(values)) return [];
1817
+ return values.map((value) => {
1818
+ const v = stringify(value);
1819
+ return {
1820
+ value: v,
1821
+ label: v
1822
+ };
1823
+ });
1824
+ });
1730
1825
  /** Maps `error.*` text keys to a field name (Figma inline-error annotations). */
1731
1826
  const fieldErrorKeys = {
1732
1827
  "error.email_required": "email",
@@ -1844,12 +1939,10 @@ const en = {
1844
1939
  "collect-credentials.field.email": "Work email",
1845
1940
  "collect-credentials.field.email.placeholder": "you@company.com",
1846
1941
  "collect-credentials.field.password": "Password",
1847
- "collect-credentials.field.password.help": "At least 8 characters, including a symbol and number.",
1848
1942
  "collect-credentials.action.submit": "Sign up",
1849
1943
  "register-password.title": "Create your password",
1850
1944
  "register-password.description": "Choose a secure password for your account",
1851
1945
  "register-password.field.password": "Password",
1852
- "register-password.field.password.help": "At least 8 characters, including a symbol and number.",
1853
1946
  "register-password.action.submit": "Sign up",
1854
1947
  "passkey-upsell.title": "Sign in faster next time",
1855
1948
  "passkey-upsell.description": "No password needed ever again.",
@@ -1880,12 +1973,12 @@ const en = {
1880
1973
  "register.field.email": "Work email",
1881
1974
  "register.field.email.placeholder": "you@company.com",
1882
1975
  "register.field.password": "Password",
1883
- "register.field.password.help": "At least 8 characters, including a symbol and number.",
1884
1976
  "register.field.givenName": "Given name",
1885
1977
  "register.field.familyName": "Family name",
1886
1978
  "register.field.dateOfBirth": "Date of birth",
1887
- "register.field.dateOfBirth.placeholder": "YYYY-MM-DD",
1888
- "register.field.dateOfBirth.help": "Use YYYY-MM-DD.",
1979
+ "register.field.country": "Country",
1980
+ "register.field.country.placeholder": "Select your country",
1981
+ "register.field.terms": "I agree to the terms of service",
1889
1982
  "register.action.password": "Continue with password",
1890
1983
  "register.action.passkey": "Continue with a passkey",
1891
1984
  "register.action.submit": "Sign up",
@@ -1945,12 +2038,10 @@ const de = {
1945
2038
  "collect-credentials.field.email": "E-Mail",
1946
2039
  "collect-credentials.field.email.placeholder": "du@unternehmen.com",
1947
2040
  "collect-credentials.field.password": "Passwort",
1948
- "collect-credentials.field.password.help": "Mindestens 8 Zeichen, einschließlich eines Sonderzeichens und einer Zahl.",
1949
2041
  "collect-credentials.action.submit": "Registrieren",
1950
2042
  "register-password.title": "Passwort erstellen",
1951
2043
  "register-password.description": "Wähle ein sicheres Passwort für dein Konto",
1952
2044
  "register-password.field.password": "Passwort",
1953
- "register-password.field.password.help": "Mindestens 8 Zeichen, einschließlich eines Sonderzeichens und einer Zahl.",
1954
2045
  "register-password.action.submit": "Registrieren",
1955
2046
  "passkey-upsell.title": "Nächstes Mal schneller anmelden",
1956
2047
  "passkey-upsell.description": "Kein Passwort mehr nötig.",
@@ -1981,12 +2072,12 @@ const de = {
1981
2072
  "register.field.email": "E-Mail",
1982
2073
  "register.field.email.placeholder": "du@unternehmen.com",
1983
2074
  "register.field.password": "Passwort",
1984
- "register.field.password.help": "Mindestens 8 Zeichen, einschließlich eines Sonderzeichens und einer Zahl.",
1985
2075
  "register.field.givenName": "Vorname",
1986
2076
  "register.field.familyName": "Nachname",
1987
2077
  "register.field.dateOfBirth": "Geburtsdatum",
1988
- "register.field.dateOfBirth.placeholder": "JJJJ-MM-TT",
1989
- "register.field.dateOfBirth.help": "Verwende JJJJ-MM-TT.",
2078
+ "register.field.country": "Land",
2079
+ "register.field.country.placeholder": "Land auswählen",
2080
+ "register.field.terms": "Ich stimme den Nutzungsbedingungen zu",
1990
2081
  "register.action.password": "Mit Passwort fortfahren",
1991
2082
  "register.action.passkey": "Weiter mit Passkey",
1992
2083
  "register.action.submit": "Registrieren",
@@ -2045,12 +2136,10 @@ const it = {
2045
2136
  "collect-credentials.field.email": "E-mail aziendale",
2046
2137
  "collect-credentials.field.email.placeholder": "tu@azienda.com",
2047
2138
  "collect-credentials.field.password": "Password",
2048
- "collect-credentials.field.password.help": "Almeno 8 caratteri, incluso un simbolo e un numero.",
2049
2139
  "collect-credentials.action.submit": "Registrati",
2050
2140
  "register-password.title": "Crea la tua password",
2051
2141
  "register-password.description": "Scegli una password sicura per il tuo account",
2052
2142
  "register-password.field.password": "Password",
2053
- "register-password.field.password.help": "Almeno 8 caratteri, incluso un simbolo e un numero.",
2054
2143
  "register-password.action.submit": "Registrati",
2055
2144
  "passkey-upsell.title": "Accedi più velocemente la prossima volta",
2056
2145
  "passkey-upsell.description": "Nessuna password necessaria.",
@@ -2081,12 +2170,12 @@ const it = {
2081
2170
  "register.field.email": "E-mail aziendale",
2082
2171
  "register.field.email.placeholder": "tu@azienda.com",
2083
2172
  "register.field.password": "Password",
2084
- "register.field.password.help": "Almeno 8 caratteri, incluso un simbolo e un numero.",
2085
2173
  "register.field.givenName": "Nome",
2086
2174
  "register.field.familyName": "Cognome",
2087
2175
  "register.field.dateOfBirth": "Data di nascita",
2088
- "register.field.dateOfBirth.placeholder": "AAAA-MM-GG",
2089
- "register.field.dateOfBirth.help": "Usa AAAA-MM-GG.",
2176
+ "register.field.country": "Paese",
2177
+ "register.field.country.placeholder": "Seleziona il tuo paese",
2178
+ "register.field.terms": "Accetto i termini di servizio",
2090
2179
  "register.action.password": "Continua con password",
2091
2180
  "register.action.passkey": "Continua con passkey",
2092
2181
  "register.action.submit": "Registrati",
@@ -2273,7 +2362,7 @@ function createSanitiser() {
2273
2362
  }
2274
2363
  //#endregion
2275
2364
  //#region src/orchestrator/templates/layout-chrome.css?inline
2276
- var layout_chrome_default = ":host {\n background: var(--zl-color-surface-default-black, #0f0f11);\n min-height: 100%;\n color: var(--zl-color-text-primary-white, #f4f4f6);\n font-family: var(--zl-font-family-sans, system-ui, sans-serif);\n display: block;\n}\n\n.zl-mount {\n background: inherit;\n min-height: 100vh;\n color: inherit;\n flex-direction: column;\n display: flex;\n}\n\n.zl-mount > zl-page-shell, .zl-mount > [data-zl-template-root] {\n flex: auto;\n}\n\n.zl-attribution {\n background: none;\n justify-content: center;\n align-items: center;\n display: flex;\n}\n\n.zl-attribution[hidden] {\n display: none;\n}\n\n.zl-card-title {\n font-family: var(--zl-font-family-heading, var(--zl-font-family-sans, system-ui, sans-serif));\n letter-spacing: -.02em;\n color: var(--zl-color-text-primary-white, #f4f4f6);\n text-align: left;\n margin: 0;\n font-size: 2rem;\n font-weight: 400;\n line-height: 2.5rem;\n}\n\n.zl-card-subtitle {\n font-family: var(--zl-font-family-sans, system-ui, sans-serif);\n color: var(--zl-color-text-primary-white, #f4f4f6);\n margin: 0;\n font-size: .875rem;\n font-weight: 400;\n line-height: 1.25rem;\n}\n\n.zl-card-nav {\n font-family: var(--zl-font-family-sans, system-ui, sans-serif);\n color: var(--zl-color-text-primary-white, #f4f4f6);\n text-align: left;\n margin: 0;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5rem;\n}\n\n.zl-card-nav__link {\n font: inherit;\n line-height: inherit;\n color: var(--zl-color-icon-default-purple, #bba5e4);\n cursor: pointer;\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n text-decoration: none;\n display: inline;\n}\n\n.zl-card-nav__link:hover {\n text-decoration: underline;\n}\n\n.zl-card-nav__link:focus-visible {\n outline: var(--zl-focus-width, 2px) solid var(--zl-focus-color, #f4f4f6);\n outline-offset: var(--zl-focus-offset, 2px);\n}\n\n.zl-card-forgot {\n text-align: left;\n margin: 0;\n}\n\n.zl-card-forgot__link {\n font-family: var(--zl-font-family-sans, system-ui, sans-serif);\n color: var(--zl-color-icon-default-purple, #bba5e4);\n cursor: pointer;\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5rem;\n text-decoration: none;\n display: inline;\n}\n\n.zl-card-forgot__link:hover {\n text-decoration: underline;\n}\n\n.zl-card-forgot__link:focus-visible {\n outline: var(--zl-focus-width, 2px) solid var(--zl-focus-color, #f4f4f6);\n outline-offset: var(--zl-focus-offset, 2px);\n}\n";
2365
+ var layout_chrome_default = ":host {\n background: var(--zl-color-surface-default-black, #0f0f11);\n min-height: 100%;\n color: var(--zl-color-text-primary-white, #f4f4f6);\n font-family: var(--zl-font-family-sans, system-ui, sans-serif);\n display: block;\n}\n\n.zl-mount {\n background: inherit;\n min-height: 100vh;\n color: inherit;\n flex-direction: column;\n display: flex;\n}\n\n.zl-mount > zl-page-shell, .zl-mount > [data-zl-template-root] {\n flex: auto;\n}\n\n.zl-attribution {\n background: none;\n justify-content: center;\n align-items: center;\n display: flex;\n}\n\n.zl-attribution[hidden] {\n display: none;\n}\n\n.zl-card-title {\n font-family: var(--zl-font-family-heading, var(--zl-font-family-sans, system-ui, sans-serif));\n letter-spacing: -.02em;\n color: var(--zl-color-text-primary-white, #f4f4f6);\n text-align: left;\n margin: 0;\n font-size: 2rem;\n font-weight: 700;\n line-height: 2.5rem;\n}\n\n.zl-card-subtitle {\n font-family: var(--zl-font-family-sans, system-ui, sans-serif);\n color: var(--zl-color-text-primary-white, #f4f4f6);\n margin: 0;\n font-size: .875rem;\n font-weight: 400;\n line-height: 1.25rem;\n}\n\n.zl-card-nav {\n font-family: var(--zl-font-family-sans, system-ui, sans-serif);\n color: var(--zl-color-text-primary-white, #f4f4f6);\n text-align: left;\n margin: 0;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5rem;\n}\n\n.zl-card-nav__link {\n font: inherit;\n line-height: inherit;\n color: var(--zl-color-icon-default-purple, #bba5e4);\n cursor: pointer;\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n text-decoration: none;\n display: inline;\n}\n\n.zl-card-nav__link:hover {\n text-decoration: underline;\n}\n\n.zl-card-nav__link:focus-visible {\n outline: var(--zl-focus-width, 2px) solid var(--zl-focus-color, #f4f4f6);\n outline-offset: var(--zl-focus-offset, 2px);\n}\n\n.zl-card-forgot {\n text-align: left;\n margin: 0;\n}\n\n.zl-card-forgot__link {\n font-family: var(--zl-font-family-sans, system-ui, sans-serif);\n color: var(--zl-color-icon-default-purple, #bba5e4);\n cursor: pointer;\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5rem;\n text-decoration: none;\n display: inline;\n}\n\n.zl-card-forgot__link:hover {\n text-decoration: underline;\n}\n\n.zl-card-forgot__link:focus-visible {\n outline: var(--zl-focus-width, 2px) solid var(--zl-focus-color, #f4f4f6);\n outline-offset: var(--zl-focus-offset, 2px);\n}\n";
2277
2366
  //#endregion
2278
2367
  //#region src/orchestrator/theme-controller.ts
2279
2368
  const DARK_QUERY = "(prefers-color-scheme: dark)";
@@ -2501,7 +2590,9 @@ let ZitadelLogin = class ZitadelLogin extends LitElement {
2501
2590
  if (root) {
2502
2591
  applyBaseTokens(root);
2503
2592
  applyBrandingTokens(root, this.branding, this.themeController.theme);
2504
- applyFontUrl(root, this.branding?.font_url ?? null);
2593
+ const tenantFontUrl = this.branding?.font_url ?? null;
2594
+ applyDefaultFont(root, tenantFontUrl ? null : void 0);
2595
+ applyFontUrl(root, tenantFontUrl);
2505
2596
  }
2506
2597
  this.dataset.theme = this.themeController.theme;
2507
2598
  this.toggleAttribute("data-theme-dark", this.themeController.theme === "dark");
@@ -3359,4 +3450,4 @@ function fillTemplateTokens(fragment, name, email, initial) {
3359
3450
  //#endregion
3360
3451
  export { buildBrandingStylesheet as _, createSanitiser as a, startFlow as b, de as c, MANDATORY_GATES_MARKER as d, mandatoryGatesMarkerComment as f, applyBrandingTokens as g, validateBranding as h, layout_chrome_default as i, en as l, applyFontUrl as m, ZitadelLogin as n, builtinLocales as o, patchMandatoryGates as p, ThemeController as r, it as s, ZitadelLogout as t, TEMPLATE_NAMES as u, resolveTheme as v, submitStep as x, getCurrentStep as y };
3361
3452
 
3362
- //# sourceMappingURL=orchestrator-BEvS2wA_.mjs.map
3453
+ //# sourceMappingURL=orchestrator-D6mdML5f.mjs.map