@zitadel/components 1.0.0-alpha.21 → 1.0.0-alpha.22

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.
@@ -1,4 +1,4 @@
1
- import { C as focusVisibleStyles, E as emit, S as __decorate, T as t, d as hookName, w as baseHostStyles } from "./atoms-DSxjEHca.mjs";
1
+ import { C as focusVisibleStyles, E as emit, S as __decorate, T as t, d as hookName, w as baseHostStyles } from "./atoms-Boaxh79f.mjs";
2
2
  import { i as tokensCss, t as THEME_SELECTORS } from "./tokens-T4N9VJz3.mjs";
3
3
  import { manifestRegistry } from "./manifests.mjs";
4
4
  import { t as default_default } from "./default-Dnjq9iBt.mjs";
@@ -816,7 +816,7 @@ const en = {
816
816
  "password.action.register.lead": "Don't have an account? ",
817
817
  "password.action.register.link": "Sign up",
818
818
  "register.title": "Create your account",
819
- "register.description": "",
819
+ "register.description": "Enter your details to get started",
820
820
  "register.field.email": "Email",
821
821
  "register.field.email.placeholder": "you@example.com",
822
822
  "register.field.password": "Password",
@@ -933,7 +933,7 @@ const de = {
933
933
  "password.action.register.lead": "Noch kein Konto? ",
934
934
  "password.action.register.link": "Registrieren",
935
935
  "register.title": "Konto erstellen",
936
- "register.description": "",
936
+ "register.description": "Gib deine Daten ein, um loszulegen",
937
937
  "register.field.email": "E-Mail",
938
938
  "register.field.email.placeholder": "du@beispiel.de",
939
939
  "register.field.password": "Passwort",
@@ -1049,7 +1049,7 @@ const it = {
1049
1049
  "password.action.register.lead": "Non hai un account? ",
1050
1050
  "password.action.register.link": "Registrati",
1051
1051
  "register.title": "Crea il tuo account",
1052
- "register.description": "",
1052
+ "register.description": "Inserisci i tuoi dati per iniziare",
1053
1053
  "register.field.email": "E-mail",
1054
1054
  "register.field.email.placeholder": "tu@esempio.com",
1055
1055
  "register.field.password": "Password",
@@ -1203,6 +1203,7 @@ var zitadelNextGen_exports = /* @__PURE__ */ __exportAll({
1203
1203
  getBeginUserPasskeyRegistrationUrl: () => getBeginUserPasskeyRegistrationUrl,
1204
1204
  getBrandingById: () => getBrandingById,
1205
1205
  getClaimStatus: () => getClaimStatus,
1206
+ getClaimWindow: () => getClaimWindow,
1206
1207
  getCompleteClaimUrl: () => getCompleteClaimUrl,
1207
1208
  getCreateAuthAttemptUrl: () => getCreateAuthAttemptUrl,
1208
1209
  getCreateBrandingUrl: () => getCreateBrandingUrl,
@@ -1229,6 +1230,7 @@ var zitadelNextGen_exports = /* @__PURE__ */ __exportAll({
1229
1230
  getGetAuthAttemptUrl: () => getGetAuthAttemptUrl,
1230
1231
  getGetBrandingByIdUrl: () => getGetBrandingByIdUrl,
1231
1232
  getGetClaimStatusUrl: () => getGetClaimStatusUrl,
1233
+ getGetClaimWindowUrl: () => getGetClaimWindowUrl,
1232
1234
  getGetEnvironmentByNameUrl: () => getGetEnvironmentByNameUrl,
1233
1235
  getGetEventUrl: () => getGetEventUrl,
1234
1236
  getGetFlowDefinitionUrl: () => getGetFlowDefinitionUrl,
@@ -1262,6 +1264,7 @@ var zitadelNextGen_exports = /* @__PURE__ */ __exportAll({
1262
1264
  getMyUser: () => getMyUser,
1263
1265
  getPatchProjectUrl: () => getPatchProjectUrl,
1264
1266
  getProject: () => getProject,
1267
+ getQueryGrantsUrl: () => getQueryGrantsUrl,
1265
1268
  getQueryProjectsUrl: () => getQueryProjectsUrl,
1266
1269
  getQuerySessionsUrl: () => getQuerySessionsUrl,
1267
1270
  getQueryTeamsUrl: () => getQueryTeamsUrl,
@@ -1290,6 +1293,7 @@ var zitadelNextGen_exports = /* @__PURE__ */ __exportAll({
1290
1293
  listUserPasskeys: () => listUserPasskeys,
1291
1294
  listUserTeams: () => listUserTeams,
1292
1295
  patchProject: () => patchProject,
1296
+ queryGrants: () => queryGrants,
1293
1297
  queryProjects: () => queryProjects,
1294
1298
  querySessions: () => querySessions,
1295
1299
  queryTeams: () => queryTeams,
@@ -1839,7 +1843,11 @@ const getGetClaimStatusUrl = (projectId, params) => {
1839
1843
  * Polled by the CLI while a browser completes the claim. Authorized by the
1840
1844
  project secret that initiated the challenge. Returns `pending`, or
1841
1845
  `completed` with the owning team, the claim timestamp, and the dashboard
1842
- URL once the browser leg has finished.
1846
+ URL once the project is claimed. The claim grant, not the polled
1847
+ challenge, is the source of truth: a project claimed through another
1848
+ concurrent challenge also reports `completed`, and a completed claim
1849
+ keeps reporting `completed` past this challenge's expiry and past the
1850
+ project's claim window.
1843
1851
 
1844
1852
  * @summary Get claim status
1845
1853
  */
@@ -1871,6 +1879,30 @@ const completeClaim = async (projectId, completeClaimBody, options) => {
1871
1879
  body: JSON.stringify(completeClaimBody)
1872
1880
  });
1873
1881
  };
1882
+ const getGetClaimWindowUrl = (projectId, params) => {
1883
+ const normalizedParams = new URLSearchParams();
1884
+ Object.entries(params || {}).forEach(([key, value]) => {
1885
+ if (value !== void 0) normalizedParams.append(key, value === null ? "null" : value.toString());
1886
+ });
1887
+ const stringifiedParams = normalizedParams.toString();
1888
+ return stringifiedParams.length > 0 ? `${getProxyPath()}/projects/${projectId}/claim/window?${stringifiedParams}` : `${getProxyPath()}/projects/${projectId}/claim/window`;
1889
+ };
1890
+ /**
1891
+ * Read by the claim page in the browser to show how long is left to claim the
1892
+ project. Unauthenticated by design: the claim page runs this before the
1893
+ developer has signed in, and holding the `challenge_id` from the claim URL
1894
+ is the authorization — the same capability `claim/complete` accepts. It
1895
+ reveals only the window, never the project itself, and unlike
1896
+ `claim/complete` it spends nothing, so a reload is free.
1897
+
1898
+ * @summary Get the claim window for a project
1899
+ */
1900
+ const getClaimWindow = async (projectId, params, options) => {
1901
+ return customFetch(getGetClaimWindowUrl(projectId, params), {
1902
+ ...options,
1903
+ method: "GET"
1904
+ });
1905
+ };
1874
1906
  const getCreateSessionUrl = () => {
1875
1907
  return `${getProxyPath()}/sessions`;
1876
1908
  };
@@ -2132,12 +2164,17 @@ const getCreateFlowDefinitionUrl = () => {
2132
2164
  return `${getProxyPath()}/flow_definitions`;
2133
2165
  };
2134
2166
  /**
2135
- * Creates a new flow definition.
2167
+ * Publishes a new flow definition revision.
2136
2168
  Flow definitions are templates that define the sequence of steps (capabilities)
2137
2169
  for a particular user journey (e.g., registration, login, password reset).
2138
2170
 
2139
2171
  Flow definitions are created based on the flow definition schema, which includes the flow's purpose, audience, and the steps involved.
2140
2172
 
2173
+ Every call allocates a new opaque id. Revisions of one flow share its
2174
+ `name`; posting a definition under an existing `name` publishes a new
2175
+ revision of that flow, it is not a conflict. List with `name` to see a
2176
+ flow's revisions, newest by creation time first.
2177
+
2141
2178
  * @summary Create a new flow definition
2142
2179
  */
2143
2180
  const createFlowDefinition = async (createFlowDefinitionBody, options) => {
@@ -2160,8 +2197,9 @@ const getListFlowDefinitionsUrl = (params) => {
2160
2197
  return stringifiedParams.length > 0 ? `${getProxyPath()}/flow_definitions?${stringifiedParams}` : `${getProxyPath()}/flow_definitions`;
2161
2198
  };
2162
2199
  /**
2163
- * Retrieves a list of all flow definitions.
2200
+ * Retrieves a list of all flow definitions, newest by creation time first.
2164
2201
  This endpoint can be used to view existing flow definitions and their configurations.
2202
+ Filter by `name` to list the revisions of one flow.
2165
2203
 
2166
2204
  * @summary List flow definitions
2167
2205
  */
@@ -2546,6 +2584,39 @@ const createGrant = async (createGrantBody, params, options) => {
2546
2584
  body: JSON.stringify(createGrantBody)
2547
2585
  });
2548
2586
  };
2587
+ const getQueryGrantsUrl = (params) => {
2588
+ const normalizedParams = new URLSearchParams();
2589
+ Object.entries(params || {}).forEach(([key, value]) => {
2590
+ if (value !== void 0) normalizedParams.append(key, value === null ? "null" : value.toString());
2591
+ });
2592
+ const stringifiedParams = normalizedParams.toString();
2593
+ return stringifiedParams.length > 0 ? `${getProxyPath()}/grants/query?${stringifiedParams}` : `${getProxyPath()}/grants/query`;
2594
+ };
2595
+ /**
2596
+ * Returns the collaboration grants of a project, paginated with a cursor.
2597
+ Only unrevoked grants this API manages are listed (user or team bound to
2598
+ viewer, editor, or admin), including expired grants so a client can
2599
+ DELETE before re-granting. Project-secret setup (`sk_proj`) and
2600
+ owning-team (`relation=team`) rows are not returned. Grants are not in
2601
+ `resource_scope_index`; project scope is required on the query (same as
2602
+ get). Requires `project.read`. `expand: ["principal"]` additionally
2603
+ requires `user.read` and `team.read` (documented on the expand enum;
2604
+ those scopes cannot be ANDed onto this security block because they are
2605
+ body-conditional).
2606
+
2607
+ * @summary Query grants
2608
+ */
2609
+ const queryGrants = async (queryGrantsBody, params, options) => {
2610
+ return customFetch(getQueryGrantsUrl(params), {
2611
+ ...options,
2612
+ method: "POST",
2613
+ headers: {
2614
+ "Content-Type": "application/json",
2615
+ ...options?.headers
2616
+ },
2617
+ body: JSON.stringify(queryGrantsBody)
2618
+ });
2619
+ };
2549
2620
  const getGetGrantUrl = (id, params) => {
2550
2621
  const normalizedParams = new URLSearchParams();
2551
2622
  Object.entries(params || {}).forEach(([key, value]) => {
@@ -3433,7 +3504,7 @@ const TEMPLATE_NAMES = {
3433
3504
  };
3434
3505
  //#endregion
3435
3506
  //#region src/orchestrator/templates/layout-chrome.css?inline
3436
- var layout_chrome_default = ":host {\n color: var(--zl-foreground);\n font-family: var(--zl-font-family-sans);\n background: none;\n display: block;\n}\n\n:host([variant=\"page\"]) {\n background: var(--zl-background);\n min-height: 100%;\n}\n\nimg[data-zl-asset-broken] {\n display: none;\n}\n\n.zl-mount {\n min-height: var(--zl-page-min-height, auto);\n background: inherit;\n color: inherit;\n flex-direction: column;\n display: flex;\n container-type: inline-size;\n}\n\n:host([variant=\"page\"]) .zl-mount {\n min-height: var(--zl-page-min-height, 100vh);\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-trustmark {\n gap: var(--zl-spacing-2-5);\n flex-wrap: wrap;\n}\n\n.zl-trustmark__mark {\n align-items: center;\n gap: var(--zl-spacing-2);\n font-family: var(--zl-font-family-sans);\n font-size: var(--zl-text-sm-size);\n line-height: var(--zl-text-sm-leading);\n color: var(--zl-foreground);\n text-decoration: none;\n display: inline-flex;\n}\n\n.zl-trustmark__mark:hover {\n text-underline-offset: 4px;\n text-decoration: underline;\n}\n\n.zl-trustmark__mark:focus-visible {\n outline: var(--zl-focus-width) solid var(--zl-ring);\n outline-offset: var(--zl-focus-offset);\n border-radius: var(--zl-radius-sm);\n}\n\n.zl-trustmark__logotype {\n flex-shrink: 0;\n width: 65px;\n height: 16px;\n line-height: 0;\n display: block;\n}\n\n.zl-trustmark__logotype-svg {\n width: 100%;\n height: 100%;\n display: block;\n}\n\n.zl-card-logo {\n width: auto;\n max-width: min(12rem, 60%);\n max-height: var(--zl-card-logo-max-height, 2.5rem);\n object-fit: contain;\n}\n\n.zl-card-title {\n font-family: var(--zl-font-family-heading);\n font-size: var(--zl-text-xl-size);\n font-weight: var(--zl-font-weight-medium);\n color: var(--zl-card-foreground);\n text-align: left;\n margin: 0;\n line-height: 1;\n}\n\n.zl-card-subtitle {\n font-family: var(--zl-font-family-sans);\n font-size: var(--zl-text-sm-size);\n line-height: var(--zl-text-sm-leading);\n font-weight: var(--zl-font-weight-normal);\n color: var(--zl-muted-foreground);\n margin: 0;\n}\n\n.zl-field-group {\n gap: var(--zl-spacing-7);\n flex-direction: column;\n display: flex;\n}\n\n.zl-field-group:not(:has(*)) {\n display: none;\n}\n\n.zl-card-actions {\n gap: var(--zl-spacing-3);\n flex-direction: column;\n display: flex;\n}\n\n[data-suppress-header] .zl-card-title, [data-suppress-header] .zl-card-subtitle {\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n position: absolute;\n overflow: hidden;\n}\n\n.zl-card-nav {\n font-family: var(--zl-font-family-sans);\n font-size: var(--zl-text-sm-size);\n line-height: var(--zl-text-sm-leading);\n font-weight: var(--zl-font-weight-normal);\n color: var(--zl-muted-foreground);\n text-align: center;\n margin: 0;\n}\n\n.zl-card-nav__link {\n font: inherit;\n line-height: inherit;\n color: var(--zl-link);\n text-underline-offset: 4px;\n cursor: pointer;\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n text-decoration: underline;\n display: inline;\n}\n\n.zl-card-nav__link:hover {\n color: var(--zl-foreground);\n}\n\n.zl-card-nav__link:focus-visible {\n outline: var(--zl-focus-width) solid var(--zl-ring);\n outline-offset: var(--zl-focus-offset);\n}\n\n.zl-card-forgot {\n text-align: right;\n margin: 0;\n}\n\n.zl-card-forgot__link {\n font-family: var(--zl-font-family-sans);\n font-size: var(--zl-text-sm-size);\n line-height: var(--zl-text-sm-leading);\n font-weight: var(--zl-font-weight-normal);\n color: var(--zl-link);\n text-underline-offset: 4px;\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-forgot__link:hover {\n text-decoration: underline;\n}\n\n.zl-card-forgot__link:focus-visible {\n outline: var(--zl-focus-width) solid var(--zl-ring);\n outline-offset: var(--zl-focus-offset);\n}\n\n.zl-split {\n grid-template-columns: var(--zl-split-columns, minmax(0, 1fr) minmax(0, 1fr));\n align-items: var(--zl-split-align, center);\n gap: var(--zl-spacing-8);\n width: 100%;\n min-height: 100%;\n display: grid;\n}\n\n.zl-split__brand {\n justify-content: center;\n align-items: center;\n gap: var(--zl-spacing-6);\n padding: var(--zl-spacing-8) var(--zl-spacing-4);\n flex-direction: column;\n display: flex;\n}\n\n.zl-split__logo {\n max-width: min(16rem, 60%);\n max-height: var(--zl-split-logo-max-height, 16rem);\n}\n\n.zl-split__logo:has( + .zl-split__hero) {\n max-height: var(--zl-split-logo-max-height, 8rem);\n}\n\n.zl-split__logo:has( + .zl-split__hero) + .zl-split__hero {\n max-height: min(var(--zl-split-hero-max-height, 22.5rem),\n max(6rem,\n calc(100vh - 104px - var(--zl-spacing-8) - var(--zl-spacing-8) -\n 2.5rem - var(--zl-spacing-6) - var(--zl-spacing-6) -\n var(--zl-split-logo-max-height, 8rem))));\n}\n\n.zl-split__hero {\n width: 100%;\n max-height: var(--zl-split-hero-max-height, min(22.5rem, 60vh));\n border-radius: var(--zl-radius-lg);\n object-fit: cover;\n}\n\n.zl-split__placeholder {\n aspect-ratio: 4 / 5;\n border-radius: var(--zl-radius-lg);\n background: radial-gradient(120% 120% at 18% 12%,\n var(--zl-gradient-lavender-start) 0%,\n transparent 60%),\n radial-gradient(130% 130% at 85% 92%,\n var(--zl-gradient-rose-start) 0%,\n transparent 60%),\n var(--zl-card);\n width: min(18rem, 85%);\n}\n\n.zl-split__form {\n justify-content: center;\n align-items: center;\n gap: var(--zl-spacing-6);\n flex-direction: column;\n padding: 16px;\n display: flex;\n}\n\n.zl-split__compact {\n max-width: min(12rem, 60%);\n display: none;\n}\n\nimg.zl-split__compact {\n max-height: 2.5rem;\n}\n\nimg.zl-split__compact--hero {\n border-radius: var(--zl-radius-lg);\n object-fit: cover;\n width: 100%;\n max-width: 100%;\n max-height: 6rem;\n}\n\n.zl-split--right .zl-split__brand {\n order: 2;\n}\n\n.zl-split--right .zl-split__form {\n order: 1;\n}\n\nzl-page-shell:has(.zl-split) [slot=\"footer\"].zl-attribution {\n grid-template-columns: var(--zl-split-columns, minmax(0, 1fr) minmax(0, 1fr));\n gap: var(--zl-spacing-8);\n width: 100%;\n display: grid;\n}\n\nzl-page-shell:has(.zl-split) [slot=\"footer\"].zl-attribution > * {\n grid-column: 2;\n justify-self: center;\n}\n\nzl-page-shell:has(.zl-split--right) [slot=\"footer\"].zl-attribution > * {\n grid-column: 1;\n}\n\n@container (width <= 48rem) {\n .zl-split {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .zl-split__brand {\n display: var(--zl-split-brand-mobile, none);\n }\n\n .zl-split__compact {\n display: block;\n }\n\n zl-page-shell:has(.zl-split) [slot=\"footer\"].zl-attribution {\n grid-template-columns: minmax(0, 1fr);\n }\n\n zl-page-shell:has(.zl-split) .zl-attribution > *, zl-page-shell:has(.zl-split--right) [slot=\"footer\"].zl-attribution > * {\n grid-column: 1;\n }\n}\n\n.zl-hero {\n text-align: left;\n width: 100%;\n max-width: 34rem;\n color: var(--zl-foreground);\n font-family: var(--zl-font-family-sans);\n flex-direction: column;\n display: flex;\n}\n\n.zl-hero__nav {\n margin-bottom: var(--zl-spacing-8);\n justify-content: space-between;\n align-items: center;\n display: flex;\n}\n\n.zl-hero__brand {\n align-items: center;\n gap: var(--zl-spacing-2);\n letter-spacing: -.01em;\n font-size: 1.125rem;\n font-weight: 700;\n display: inline-flex;\n}\n\n.zl-hero__brand-logo {\n max-height: 1.75rem;\n}\n\n.zl-hero__brand-mark {\n border-radius: var(--zl-radius-md);\n background: linear-gradient(135deg,\n var(--zl-gradient-lavender-start),\n var(--zl-gradient-rose-start));\n width: 1.75rem;\n height: 1.75rem;\n display: inline-flex;\n}\n\n.zl-hero__compact-brand {\n overflow-wrap: anywhere;\n letter-spacing: -.01em;\n max-width: 100%;\n color: var(--zl-foreground);\n margin: 0;\n font-size: 1.125rem;\n font-weight: 700;\n}\n\n.zl-hero__nav-links {\n gap: var(--zl-spacing-6);\n color: var(--zl-muted-foreground);\n font-size: .9375rem;\n display: flex;\n}\n\n.zl-hero__nav-links a {\n color: inherit;\n text-decoration: none;\n}\n\n.zl-hero__nav-links a:hover {\n text-decoration: underline;\n}\n\n.zl-hero__eyebrow {\n margin: 0 0 var(--zl-spacing-4);\n letter-spacing: .08em;\n text-transform: uppercase;\n color: var(--zl-muted-foreground);\n font-size: .8125rem;\n font-weight: 600;\n}\n\n.zl-hero__headline {\n margin: 0 0 var(--zl-spacing-4);\n font-family: var(--zl-font-family-heading);\n letter-spacing: -.02em;\n font-size: 2.75rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\n.zl-hero__sub {\n margin: 0 0 var(--zl-spacing-8);\n max-width: 30rem;\n color: var(--zl-muted-foreground);\n font-size: 1.0625rem;\n line-height: 1.6;\n}\n\n.zl-hero__bullets {\n gap: var(--zl-spacing-2);\n margin: 0 0 var(--zl-spacing-8);\n flex-direction: column;\n padding: 0;\n list-style: none;\n display: flex;\n}\n\n.zl-hero__bullets li {\n align-items: center;\n gap: var(--zl-spacing-2);\n font-size: 1rem;\n display: flex;\n}\n\n.zl-hero__bullets li:before {\n content: \"✓\";\n color: var(--zl-success);\n font-weight: 700;\n}\n\n.zl-hero__footnote {\n padding-top: var(--zl-spacing-6);\n border-top: 1px solid var(--zl-border);\n color: var(--zl-muted-foreground);\n margin: 0;\n font-size: .8125rem;\n}\n\n.zl-hero__footnote strong {\n color: var(--zl-muted-foreground);\n font-weight: 600;\n}\n\n.zl-minimal {\n gap: var(--zl-spacing-6);\n flex-direction: column;\n width: min(24rem, 100%);\n margin-inline: auto;\n display: flex;\n}\n\n:host([variant=\"page\"]) .zl-minimal {\n padding: 52px 16px;\n}\n";
3507
+ var layout_chrome_default = ":host {\n color: var(--zl-foreground);\n font-family: var(--zl-font-family-sans);\n background: none;\n display: block;\n}\n\n:host([variant=\"page\"]) {\n background: var(--zl-background);\n min-height: 100%;\n}\n\nimg[data-zl-asset-broken] {\n display: none;\n}\n\n.zl-mount {\n min-height: var(--zl-page-min-height, auto);\n background: inherit;\n color: inherit;\n flex-direction: column;\n display: flex;\n container-type: inline-size;\n}\n\n:host([variant=\"page\"]) .zl-mount {\n min-height: var(--zl-page-min-height, 100vh);\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-trustmark {\n gap: var(--zl-spacing-2-5);\n flex-wrap: wrap;\n}\n\n.zl-trustmark__mark {\n align-items: center;\n gap: var(--zl-spacing-2);\n font-family: var(--zl-font-family-sans);\n font-size: var(--zl-text-sm-size);\n line-height: var(--zl-text-sm-leading);\n color: var(--zl-foreground);\n text-decoration: none;\n display: inline-flex;\n}\n\n.zl-trustmark__mark:hover {\n text-underline-offset: 4px;\n text-decoration: underline;\n}\n\n.zl-trustmark__mark:focus-visible {\n outline: var(--zl-focus-width) solid var(--zl-ring);\n outline-offset: var(--zl-focus-offset);\n border-radius: var(--zl-radius-sm);\n}\n\n.zl-trustmark__logotype {\n flex-shrink: 0;\n width: 65px;\n height: 16px;\n line-height: 0;\n display: block;\n}\n\n.zl-trustmark__logotype-svg {\n width: 100%;\n height: 100%;\n display: block;\n}\n\n.zl-card-logo {\n width: auto;\n max-width: min(12rem, 60%);\n max-height: var(--zl-card-logo-max-height, 2.5rem);\n object-fit: contain;\n}\n\n.zl-card-title {\n font-family: var(--zl-font-family-heading);\n font-size: var(--zl-text-xl-size);\n font-weight: var(--zl-font-weight-medium);\n color: var(--zl-card-foreground);\n text-align: left;\n margin: 0;\n line-height: 1;\n}\n\n.zl-card-subtitle {\n font-family: var(--zl-font-family-sans);\n font-size: var(--zl-text-sm-size);\n line-height: var(--zl-text-sm-leading);\n font-weight: var(--zl-font-weight-normal);\n color: var(--zl-muted-foreground);\n margin: 0;\n}\n\n.zl-field-group {\n gap: var(--zl-spacing-7);\n flex-direction: column;\n display: flex;\n}\n\n.zl-field-group:not(:has(*)) {\n display: none;\n}\n\n.zl-card-actions {\n gap: var(--zl-spacing-3);\n flex-direction: column;\n display: flex;\n}\n\n[data-suppress-header] .zl-card-title, [data-suppress-header] .zl-card-subtitle {\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n position: absolute;\n overflow: hidden;\n}\n\n.zl-card-nav {\n font-family: var(--zl-font-family-sans);\n font-size: var(--zl-text-sm-size);\n line-height: var(--zl-text-sm-leading);\n font-weight: var(--zl-font-weight-normal);\n color: var(--zl-muted-foreground);\n text-align: center;\n margin: 0;\n}\n\n.zl-card-nav__link {\n font: inherit;\n line-height: inherit;\n color: var(--zl-link);\n text-underline-offset: 4px;\n cursor: pointer;\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n text-decoration: underline;\n display: inline;\n}\n\n.zl-card-nav__link:hover {\n color: var(--zl-foreground);\n}\n\n.zl-card-nav__link:focus-visible {\n outline: var(--zl-focus-width) solid var(--zl-ring);\n outline-offset: var(--zl-focus-offset);\n}\n\n.zl-card-forgot {\n text-align: right;\n margin: 0;\n}\n\n.zl-card-forgot__link {\n font-family: var(--zl-font-family-sans);\n font-size: var(--zl-text-sm-size);\n line-height: var(--zl-text-sm-leading);\n font-weight: var(--zl-font-weight-normal);\n color: var(--zl-link);\n text-underline-offset: 4px;\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-forgot__link:hover {\n text-decoration: underline;\n}\n\n.zl-card-forgot__link:focus-visible {\n outline: var(--zl-focus-width) solid var(--zl-ring);\n outline-offset: var(--zl-focus-offset);\n}\n\n.zl-split {\n grid-template-columns: var(--zl-split-columns, minmax(0, 1fr) minmax(0, 1fr));\n align-items: var(--zl-split-align, center);\n gap: var(--zl-spacing-8);\n width: 100%;\n min-height: 100%;\n display: grid;\n}\n\n.zl-split__brand {\n justify-content: center;\n align-items: center;\n gap: var(--zl-spacing-6);\n padding: var(--zl-spacing-8) var(--zl-spacing-4);\n flex-direction: column;\n display: flex;\n}\n\n.zl-split__logo {\n max-width: min(16rem, 60%);\n max-height: var(--zl-split-logo-max-height, 16rem);\n}\n\n.zl-split__logo:has( + .zl-split__hero) {\n max-height: var(--zl-split-logo-max-height, 8rem);\n}\n\n.zl-split__logo:has( + .zl-split__hero) + .zl-split__hero {\n max-height: min(var(--zl-split-hero-max-height, 22.5rem),\n max(6rem,\n calc(100vh - 104px - var(--zl-spacing-8) - var(--zl-spacing-8) -\n 2.5rem - var(--zl-spacing-6) - var(--zl-spacing-6) -\n var(--zl-split-logo-max-height, 8rem))));\n}\n\n.zl-split__hero {\n width: 100%;\n max-height: var(--zl-split-hero-max-height, min(22.5rem, 60vh));\n border-radius: var(--zl-radius-lg);\n object-fit: cover;\n}\n\n.zl-split__placeholder {\n aspect-ratio: 4 / 5;\n border-radius: var(--zl-radius-lg);\n background: radial-gradient(120% 120% at 18% 12%,\n var(--zl-gradient-lavender-start) 0%,\n transparent 60%),\n radial-gradient(130% 130% at 85% 92%,\n var(--zl-gradient-rose-start) 0%,\n transparent 60%),\n var(--zl-card);\n width: min(18rem, 85%);\n}\n\n.zl-split__form {\n justify-content: center;\n align-items: center;\n gap: var(--zl-spacing-6);\n flex-direction: column;\n padding: 16px;\n display: flex;\n}\n\n.zl-split__compact {\n max-width: min(12rem, 60%);\n display: none;\n}\n\nimg.zl-split__compact {\n max-height: 2.5rem;\n}\n\nimg.zl-split__compact--hero {\n border-radius: var(--zl-radius-lg);\n object-fit: cover;\n width: 100%;\n max-width: 100%;\n max-height: 6rem;\n}\n\n.zl-split--right .zl-split__brand {\n order: 2;\n}\n\n.zl-split--right .zl-split__form {\n order: 1;\n}\n\nzl-page-shell:has(.zl-split) [slot=\"footer\"].zl-attribution {\n grid-template-columns: var(--zl-split-columns, minmax(0, 1fr) minmax(0, 1fr));\n gap: var(--zl-spacing-8);\n width: 100%;\n display: grid;\n}\n\nzl-page-shell:has(.zl-split) [slot=\"footer\"].zl-attribution > * {\n grid-column: 2;\n justify-self: center;\n}\n\nzl-page-shell:has(.zl-split--right) [slot=\"footer\"].zl-attribution > * {\n grid-column: 1;\n}\n\nzl-page-shell:has(.zl-split) [slot=\"footer\"].zl-attribution ::slotted(*) {\n grid-column: 2;\n justify-self: center;\n}\n\nzl-page-shell:has(.zl-split--right) [slot=\"footer\"].zl-attribution ::slotted(*) {\n grid-column: 1;\n}\n\n@container (width <= 48rem) {\n .zl-split {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .zl-split__brand {\n display: var(--zl-split-brand-mobile, none);\n }\n\n .zl-split__compact {\n display: block;\n }\n\n zl-page-shell:has(.zl-split) [slot=\"footer\"].zl-attribution {\n grid-template-columns: minmax(0, 1fr);\n }\n\n zl-page-shell:has(.zl-split) .zl-attribution > *, zl-page-shell:has(.zl-split--right) [slot=\"footer\"].zl-attribution > * {\n grid-column: 1;\n }\n}\n\n.zl-hero {\n text-align: left;\n width: 100%;\n max-width: 34rem;\n color: var(--zl-foreground);\n font-family: var(--zl-font-family-sans);\n flex-direction: column;\n display: flex;\n}\n\n.zl-hero__nav {\n margin-bottom: var(--zl-spacing-8);\n justify-content: space-between;\n align-items: center;\n display: flex;\n}\n\n.zl-hero__brand {\n align-items: center;\n gap: var(--zl-spacing-2);\n letter-spacing: -.01em;\n font-size: 1.125rem;\n font-weight: 700;\n display: inline-flex;\n}\n\n.zl-hero__brand-logo {\n max-height: 1.75rem;\n}\n\n.zl-hero__brand-mark {\n border-radius: var(--zl-radius-md);\n background: linear-gradient(135deg,\n var(--zl-gradient-lavender-start),\n var(--zl-gradient-rose-start));\n width: 1.75rem;\n height: 1.75rem;\n display: inline-flex;\n}\n\n.zl-hero__compact-brand {\n overflow-wrap: anywhere;\n letter-spacing: -.01em;\n max-width: 100%;\n color: var(--zl-foreground);\n margin: 0;\n font-size: 1.125rem;\n font-weight: 700;\n}\n\n.zl-hero__nav-links {\n gap: var(--zl-spacing-6);\n color: var(--zl-muted-foreground);\n font-size: .9375rem;\n display: flex;\n}\n\n.zl-hero__nav-links a {\n color: inherit;\n text-decoration: none;\n}\n\n.zl-hero__nav-links a:hover {\n text-decoration: underline;\n}\n\n.zl-hero__eyebrow {\n margin: 0 0 var(--zl-spacing-4);\n letter-spacing: .08em;\n text-transform: uppercase;\n color: var(--zl-muted-foreground);\n font-size: .8125rem;\n font-weight: 600;\n}\n\n.zl-hero__headline {\n margin: 0 0 var(--zl-spacing-4);\n font-family: var(--zl-font-family-heading);\n letter-spacing: -.02em;\n font-size: 2.75rem;\n font-weight: 700;\n line-height: 1.1;\n}\n\n.zl-hero__sub {\n margin: 0 0 var(--zl-spacing-8);\n max-width: 30rem;\n color: var(--zl-muted-foreground);\n font-size: 1.0625rem;\n line-height: 1.6;\n}\n\n.zl-hero__bullets {\n gap: var(--zl-spacing-2);\n margin: 0 0 var(--zl-spacing-8);\n flex-direction: column;\n padding: 0;\n list-style: none;\n display: flex;\n}\n\n.zl-hero__bullets li {\n align-items: center;\n gap: var(--zl-spacing-2);\n font-size: 1rem;\n display: flex;\n}\n\n.zl-hero__bullets li:before {\n content: \"✓\";\n color: var(--zl-success);\n font-weight: 700;\n}\n\n.zl-hero__footnote {\n padding-top: var(--zl-spacing-6);\n border-top: 1px solid var(--zl-border);\n color: var(--zl-muted-foreground);\n margin: 0;\n font-size: .8125rem;\n}\n\n.zl-hero__footnote strong {\n color: var(--zl-muted-foreground);\n font-weight: 600;\n}\n\n.zl-minimal {\n gap: var(--zl-spacing-6);\n flex-direction: column;\n width: min(24rem, 100%);\n margin-inline: auto;\n display: flex;\n}\n\n:host([variant=\"page\"]) .zl-minimal {\n padding: 52px 16px;\n}\n";
3437
3508
  //#endregion
3438
3509
  //#region src/orchestrator/zitadel-login.ts
3439
3510
  /** Narrow a rendered named element to the `formValue` field-atom contract. */
@@ -3542,6 +3613,13 @@ let ZitadelLogin = class ZitadelLogin extends ZitadelSurface {
3542
3613
  set loading(value) {
3543
3614
  this.#_loading_accessor_storage = value;
3544
3615
  }
3616
+ #_completing_accessor_storage = false;
3617
+ get completing() {
3618
+ return this.#_completing_accessor_storage;
3619
+ }
3620
+ set completing(value) {
3621
+ this.#_completing_accessor_storage = value;
3622
+ }
3545
3623
  #_startupError_accessor_storage = null;
3546
3624
  get startupError() {
3547
3625
  return this.#_startupError_accessor_storage;
@@ -3686,7 +3764,7 @@ let ZitadelLogin = class ZitadelLogin extends ZitadelSurface {
3686
3764
  </zl-card>
3687
3765
  </zl-page-shell>
3688
3766
  </form>`;
3689
- if (!this.response || !this.engine) return html`<slot name="loader"></slot>`;
3767
+ if (!this.response || !this.engine || this.completing) return html`<slot name="loader"></slot>`;
3690
3768
  const rendered = this.injectAttribution(this.renderStep(this.response.step, this.engine));
3691
3769
  return html`<form
3692
3770
  class="zl-mount"
@@ -3730,7 +3808,7 @@ let ZitadelLogin = class ZitadelLogin extends ZitadelSurface {
3730
3808
  const custom = attribution?.custom_link;
3731
3809
  if (!show && !custom) return "";
3732
3810
  const mark = custom ? `<a class="zl-trustmark__mark" part="attribution-mark" href="${escapeHtml(String(custom.href))}">${escapeHtml(String(custom.label))}</a>` : `<a class="zl-trustmark__mark" part="attribution-mark" href="https://zitadel.com" aria-label="Secured with Zitadel">${zitadelTrustmarkInnerHtml()}</a>`;
3733
- return `<div${placement === "footer" ? ` slot="footer"` : ""} part="attribution" class="zl-attribution zl-trustmark">${mark}</div>`;
3811
+ return `<div${placement === "footer" ? ` slot="footer"` : ""} part="attribution" class="zl-attribution zl-trustmark">${mark}<slot name="attribution-trailing"></slot></div>`;
3734
3812
  }
3735
3813
  /** Declarative config read from this element's attributes. */
3736
3814
  get projectAttrs() {
@@ -3778,6 +3856,7 @@ let ZitadelLogin = class ZitadelLogin extends ZitadelSurface {
3778
3856
  }
3779
3857
  applyResponse(wire) {
3780
3858
  this.stepErrorDismissed = false;
3859
+ this.completing = navigatesOnComplete(wire, this.postSignInUrl);
3781
3860
  this.response = wire;
3782
3861
  const { branding, issues } = validateBranding(wire.branding, { renderingOrigin: this.ownerDocument.location.origin });
3783
3862
  this.branding = branding;
@@ -4249,6 +4328,7 @@ __decorate([property({ attribute: false })], ZitadelLogin.prototype, "locales",
4249
4328
  __decorate([state()], ZitadelLogin.prototype, "response", null);
4250
4329
  __decorate([state()], ZitadelLogin.prototype, "branding", null);
4251
4330
  __decorate([state()], ZitadelLogin.prototype, "loading", null);
4331
+ __decorate([state()], ZitadelLogin.prototype, "completing", null);
4252
4332
  __decorate([state()], ZitadelLogin.prototype, "startupError", null);
4253
4333
  __decorate([state()], ZitadelLogin.prototype, "formValues", null);
4254
4334
  ZitadelLogin = __decorate([customElement("zitadel-login")], ZitadelLogin);
@@ -4262,6 +4342,19 @@ ZitadelLogin = __decorate([customElement("zitadel-login")], ZitadelLogin);
4262
4342
  function isAllowedSelectValue(field, value) {
4263
4343
  return field.validation?.enum?.includes(value) ?? false;
4264
4344
  }
4345
+ /**
4346
+ * Whether a terminal step ends in a navigation rather than a screen: a
4347
+ * `redirect` with a URI, or a `show` whose handoff the widget exchanges before
4348
+ * sending the browser to `post-sign-in-url`. A `show` without a
4349
+ * `post-sign-in-url` is the host handling the handoff itself, and that screen
4350
+ * is the flow's own last word — it still renders.
4351
+ */
4352
+ function navigatesOnComplete(wire, postSignInUrl) {
4353
+ const behavior = wire.step.complete;
4354
+ if (behavior === "redirect") return Boolean(wire.redirect_uri);
4355
+ if (behavior === "show") return Boolean(wire.handoff_token && postSignInUrl);
4356
+ return false;
4357
+ }
4265
4358
  function collectInitialValues(step) {
4266
4359
  const values = {};
4267
4360
  if (!step.fields) return values;
@@ -5005,4 +5098,4 @@ ZitadelSession = __decorate([customElement("zitadel-session")], ZitadelSession);
5005
5098
  //#endregion
5006
5099
  export { submitStep as C, startFlow as S, zitadelTrustmarkInnerHtml as T, MANDATORY_GATES_MARKER as _, TEMPLATE_NAMES as a, validateBranding as b, applyBrandingTokens as c, createSanitiser as d, builtinLocales as f, en as g, de as h, layout_chrome_default as i, buildBrandingStylesheet as l, it as m, ZitadelLogout as n, ThemeController as o, businessLocales as p, ZitadelLogin as r, applyFontUrl as s, ZitadelSession as t, resolveTheme as u, mandatoryGatesMarkerComment as v, ZITADEL_ATTRIBUTION_LOGOTYPE_SVG as w, getCurrentStep as x, patchMandatoryGates as y };
5007
5100
 
5008
- //# sourceMappingURL=orchestrator-DG-YwFFE.mjs.map
5101
+ //# sourceMappingURL=orchestrator-BPX0Uc77.mjs.map