@zitadel/components 0.0.0 → 0.1.0-alpha.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.
- package/dist/atoms/index.d.mts +1 -1
- package/dist/atoms/index.mjs +1 -1
- package/dist/atoms/zl-field.d.ts +8 -1
- package/dist/atoms/zl-field.d.ts.map +1 -1
- package/dist/atoms/zl-passkey.d.ts +6 -1
- package/dist/atoms/zl-passkey.d.ts.map +1 -1
- package/dist/{atoms-CmOTltTH.mjs → atoms-B9yd0c-i.mjs} +18 -6
- package/dist/atoms-B9yd0c-i.mjs.map +1 -0
- package/dist/default-DP74t2io.mjs +6 -0
- package/dist/default-DP74t2io.mjs.map +1 -0
- package/dist/{index-7FDHEpv5.d.mts → index-B74_igDN.d.mts} +20 -83
- package/dist/index-B74_igDN.d.mts.map +1 -0
- package/dist/{index-DIUFZjXw.d.mts → index-Dd8hfOWt.d.mts} +16 -4
- package/dist/{index-DIUFZjXw.d.mts.map → index-Dd8hfOWt.d.mts.map} +1 -1
- package/dist/{index-DaOSCm0T.d.mts → index-EJengPPu.d.mts} +1 -1
- package/dist/{index-DaOSCm0T.d.mts.map → index-EJengPPu.d.mts.map} +1 -1
- package/dist/index.d.mts +6 -5
- package/dist/index.d.mts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +4 -3
- package/dist/{manifest-DCC2FxCE.d.mts → manifest-DN5Al_Ur.d.mts} +1 -1
- package/dist/{manifest-DCC2FxCE.d.mts.map → manifest-DN5Al_Ur.d.mts.map} +1 -1
- package/dist/manifests.d.mts +1 -1
- package/dist/manifests.mjs +1 -1
- package/dist/orchestrator/index.d.mts +3 -2
- package/dist/orchestrator/index.d.ts +3 -5
- package/dist/orchestrator/index.d.ts.map +1 -1
- package/dist/orchestrator/index.mjs +3 -2
- package/dist/orchestrator/liquid.d.ts +3 -0
- package/dist/orchestrator/liquid.d.ts.map +1 -1
- package/dist/orchestrator/locales/de.d.ts +7 -0
- package/dist/orchestrator/locales/de.d.ts.map +1 -1
- package/dist/orchestrator/locales/en.d.ts +6 -0
- package/dist/orchestrator/locales/en.d.ts.map +1 -1
- package/dist/orchestrator/locales/index.d.ts +1 -0
- package/dist/orchestrator/locales/index.d.ts.map +1 -1
- package/dist/orchestrator/locales/it.d.ts +14 -0
- package/dist/orchestrator/locales/it.d.ts.map +1 -0
- package/dist/orchestrator/zitadel-login.d.ts +3 -0
- package/dist/orchestrator/zitadel-login.d.ts.map +1 -1
- package/dist/orchestrator/zitadel-logout.d.ts.map +1 -1
- package/dist/{orchestrator-CNKo2WQG.mjs → orchestrator-B8eXcPRi.mjs} +241 -497
- package/dist/orchestrator-B8eXcPRi.mjs.map +1 -0
- package/dist/tokens/index.d.mts +1 -1
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/dist/atoms-CmOTltTH.mjs.map +0 -1
- package/dist/index-7FDHEpv5.d.mts.map +0 -1
- package/dist/index-bZEvwHtq.d.mts +0 -996
- package/dist/index-bZEvwHtq.d.mts.map +0 -1
- package/dist/orchestrator/templates/auth-form.liquid.d.ts +0 -14
- package/dist/orchestrator/templates/auth-form.liquid.d.ts.map +0 -1
- package/dist/orchestrator/templates/default.liquid.d.ts +0 -23
- package/dist/orchestrator/templates/default.liquid.d.ts.map +0 -1
- package/dist/orchestrator/templates/passkey-upsell.liquid.d.ts +0 -15
- package/dist/orchestrator/templates/passkey-upsell.liquid.d.ts.map +0 -1
- package/dist/orchestrator/templates/signed-in.liquid.d.ts +0 -20
- package/dist/orchestrator/templates/signed-in.liquid.d.ts.map +0 -1
- package/dist/orchestrator-CNKo2WQG.mjs.map +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { _ as __decorate, b as t, v as focusVisibleStyles, y as baseHostStyles } from "./atoms-
|
|
1
|
+
import { _ as __decorate, b as t, v as focusVisibleStyles, y as baseHostStyles } from "./atoms-B9yd0c-i.mjs";
|
|
2
2
|
import { r as tokensCss } from "./tokens-TXmurodq.mjs";
|
|
3
|
+
import { t as default_default } from "./default-DP74t2io.mjs";
|
|
3
4
|
import { manifestRegistry } from "./manifests.mjs";
|
|
4
5
|
import { LitElement, css, html, nothing } from "lit";
|
|
5
6
|
import { customElement, property, state } from "lit/decorators.js";
|
|
@@ -1519,458 +1520,6 @@ function lookup(locale, key) {
|
|
|
1519
1520
|
return locale[key] ?? key;
|
|
1520
1521
|
}
|
|
1521
1522
|
//#endregion
|
|
1522
|
-
//#region src/orchestrator/templates/auth-form.liquid.ts
|
|
1523
|
-
/**
|
|
1524
|
-
* `auth-form` partial — Sign in and Sign up screens (Figma screens file).
|
|
1525
|
-
*
|
|
1526
|
-
* Sign up 2xl frame: `6593:141741` (card `6593:141743`, attribution `6593:141767`).
|
|
1527
|
-
* Sign in 2xl frame: `6593:141983`, card `6593:141985`, stack `6593:141989`
|
|
1528
|
-
* (email + password + forgot link + CTAs on one step).
|
|
1529
|
-
* Sign-in errors: wrong credentials `6602:180268`, server alert `6594:125237`.
|
|
1530
|
-
*
|
|
1531
|
-
* Figma `Field+CTAs` stacks fields + CTAs in one column at 16px (`spacing-03`).
|
|
1532
|
-
* Primary/secondary are 48px buttons; register / sign_in are body copy with a
|
|
1533
|
-
* purple text link (24px row) — not `<zl-button hierarchy="text">`.
|
|
1534
|
-
*/
|
|
1535
|
-
const authFormTemplate = String.raw`
|
|
1536
|
-
<zl-page-shell data-zl-template-root>
|
|
1537
|
-
{% if branding.logo_url %}
|
|
1538
|
-
<img slot="header" class="zl-card-logo" src="{{ branding.logo_url }}" alt="" />
|
|
1539
|
-
{% endif %}
|
|
1540
|
-
<zl-card>
|
|
1541
|
-
<h1 slot="header" class="zl-card-title">{{ step.texts.title_key | t: identity.display_name }}</h1>
|
|
1542
|
-
{% if step.texts.description_key %}
|
|
1543
|
-
<p slot="header" class="zl-card-subtitle">{{ step.texts.description_key | t: identity.display_name }}</p>
|
|
1544
|
-
{% endif %}
|
|
1545
|
-
|
|
1546
|
-
{% if errors and errors.size > 0 %}
|
|
1547
|
-
{% for err in errors %}
|
|
1548
|
-
{% if err | formLevelError %}
|
|
1549
|
-
{% assign alert_heading = err.text_key | alertHeading %}
|
|
1550
|
-
{% assign alert_body = err.text_key | alertBody %}
|
|
1551
|
-
<zl-alert severity="error"{% if alert_heading != "" %} heading="{{ alert_heading | t }}"{% endif %}>
|
|
1552
|
-
{% if alert_body != "" %}{{ alert_body | t }}{% elsif err.text_key %}{{ err.text_key | t }}{% else %}{{ err.message }}{% endif %}
|
|
1553
|
-
</zl-alert>
|
|
1554
|
-
{% endif %}
|
|
1555
|
-
{% endfor %}
|
|
1556
|
-
{% endif %}
|
|
1557
|
-
|
|
1558
|
-
{% for entry in fields %}
|
|
1559
|
-
{% assign field_placeholder = entry[1].text_key | fieldPlaceholder %}
|
|
1560
|
-
{% assign field_help = entry[1].text_key | fieldHelp %}
|
|
1561
|
-
{% assign field_err = entry[0] | fieldError: errors %}
|
|
1562
|
-
{% assign autocomplete_val = '' %}
|
|
1563
|
-
{% if entry[0] == 'email' %}
|
|
1564
|
-
{% assign autocomplete_val = 'email' %}
|
|
1565
|
-
{% elsif entry[1].type == 'password' and step.name == 'register' %}
|
|
1566
|
-
{% assign autocomplete_val = 'new-password' %}
|
|
1567
|
-
{% elsif entry[1].type == 'password' %}
|
|
1568
|
-
{% assign autocomplete_val = 'current-password' %}
|
|
1569
|
-
{% endif %}
|
|
1570
|
-
<zl-field
|
|
1571
|
-
name="{{ entry[0] }}"
|
|
1572
|
-
label="{{ entry[1].text_key | t }}"
|
|
1573
|
-
type="{{ entry[1].type }}"
|
|
1574
|
-
value="{{ entry[1].value }}"
|
|
1575
|
-
{% if autocomplete_val != '' %}autocomplete="{{ autocomplete_val }}"{% endif %}
|
|
1576
|
-
{% if entry[1].required %}required{% endif %}
|
|
1577
|
-
{% if field_placeholder != "" %}placeholder="{{ field_placeholder }}"{% endif %}
|
|
1578
|
-
{% if field_err != "" %}invalid error="{{ field_err }}"{% endif %}
|
|
1579
|
-
>
|
|
1580
|
-
{% if field_help != "" %}
|
|
1581
|
-
<span slot="help">{{ field_help }}</span>
|
|
1582
|
-
{% endif %}
|
|
1583
|
-
</zl-field>
|
|
1584
|
-
{% endfor %}
|
|
1585
|
-
|
|
1586
|
-
{% if fields.email and fields.password and step.name == 'identifier' %}
|
|
1587
|
-
<p class="zl-card-forgot">
|
|
1588
|
-
<a href="#" class="zl-card-forgot__link" data-action="recover">{{ 'action.forgot_password' | t }}</a>
|
|
1589
|
-
</p>
|
|
1590
|
-
{% endif %}
|
|
1591
|
-
|
|
1592
|
-
{% for entry in actions %}
|
|
1593
|
-
{% if entry[1].primary %}
|
|
1594
|
-
<zl-button
|
|
1595
|
-
hierarchy="primary"
|
|
1596
|
-
size="medium"
|
|
1597
|
-
type="submit"
|
|
1598
|
-
block
|
|
1599
|
-
action="{{ entry[0] }}"
|
|
1600
|
-
label="{{ entry[1].text_key | t }}"
|
|
1601
|
-
{% if loading %}loading{% endif %}
|
|
1602
|
-
></zl-button>
|
|
1603
|
-
{% endif %}
|
|
1604
|
-
{% endfor %}
|
|
1605
|
-
|
|
1606
|
-
{% if actions.passkey %}
|
|
1607
|
-
<zl-button
|
|
1608
|
-
hierarchy="secondary"
|
|
1609
|
-
size="medium"
|
|
1610
|
-
block
|
|
1611
|
-
action="passkey"
|
|
1612
|
-
label="{{ actions.passkey.text_key | t }}"
|
|
1613
|
-
></zl-button>
|
|
1614
|
-
{% endif %}
|
|
1615
|
-
|
|
1616
|
-
{% if actions.register %}
|
|
1617
|
-
<p class="zl-card-nav">
|
|
1618
|
-
{{ 'identifier.action.register.lead' | t }}<a href="#" class="zl-card-nav__link" data-action="register">{{ 'identifier.action.register.link' | t }}</a>
|
|
1619
|
-
</p>
|
|
1620
|
-
{% endif %}
|
|
1621
|
-
|
|
1622
|
-
{% if actions.sign_in %}
|
|
1623
|
-
<p class="zl-card-nav">
|
|
1624
|
-
{{ 'register.action.sign_in.lead' | t }}<a href="#" class="zl-card-nav__link" data-action="sign_in">{{ 'register.action.sign_in.link' | t }}</a>
|
|
1625
|
-
</p>
|
|
1626
|
-
{% endif %}
|
|
1627
|
-
|
|
1628
|
-
{% if challenge and challenge.method == "passkey" %}
|
|
1629
|
-
<zl-passkey
|
|
1630
|
-
ceremony="{{ challenge.options.ceremony | default: 'authenticate' }}"
|
|
1631
|
-
challenge-id="{{ challenge.challenge_id }}"
|
|
1632
|
-
options='{{ challenge.options | json }}'
|
|
1633
|
-
></zl-passkey>
|
|
1634
|
-
{% endif %}
|
|
1635
|
-
|
|
1636
|
-
{% mandatory_gates %}
|
|
1637
|
-
</zl-card>
|
|
1638
|
-
</zl-page-shell>
|
|
1639
|
-
`;
|
|
1640
|
-
//#endregion
|
|
1641
|
-
//#region src/orchestrator/templates/default.liquid.ts
|
|
1642
|
-
/**
|
|
1643
|
-
* Bundled `default.liquid` master template.
|
|
1644
|
-
*
|
|
1645
|
-
* Renders the four target Figma auth screens (Sign in, Sign up, Passkey
|
|
1646
|
-
* upsell, Signed in) by including the appropriate partial based on
|
|
1647
|
-
* `step.name`. Tenant-specific layouts (`branding.layout`) replace the
|
|
1648
|
-
* outer chrome only — the per-step partials stay shared so atom output
|
|
1649
|
-
* tracks the design system without each tenant re-implementing it.
|
|
1650
|
-
*
|
|
1651
|
-
* Spec: docs/design/branding/templates.md.
|
|
1652
|
-
*/
|
|
1653
|
-
const defaultTemplate = String.raw`
|
|
1654
|
-
{%- if step.name == 'signed-in' or step.complete == 'show' -%}
|
|
1655
|
-
{%- include 'signed-in' -%}
|
|
1656
|
-
{%- elsif step.name == 'passkey' or step.name == 'passkey-upsell' or step.name == 'passkey-setup' or step.name == 'passkey-login' -%}
|
|
1657
|
-
{%- include 'passkey-upsell' -%}
|
|
1658
|
-
{%- else -%}
|
|
1659
|
-
{%- include 'auth-form' -%}
|
|
1660
|
-
{%- endif -%}
|
|
1661
|
-
`;
|
|
1662
|
-
/**
|
|
1663
|
-
* Layout chrome injected as an `adoptedStyleSheet` on the orchestrator's
|
|
1664
|
-
* shadow root. Provides the page background and the attribution-footer
|
|
1665
|
-
* positioning that lives *outside* any template — the rest of the visual
|
|
1666
|
-
* surface is owned by the `<zl-page-shell>` / `<zl-card>` atoms the
|
|
1667
|
-
* templates render. Token references resolve against the
|
|
1668
|
-
* `@zitadel/design-tokens` CSS variables that are present on
|
|
1669
|
-
* `:host` via the branding stylesheet.
|
|
1670
|
-
*/
|
|
1671
|
-
const layoutChromeCss = `
|
|
1672
|
-
:host {
|
|
1673
|
-
display: block;
|
|
1674
|
-
min-height: 100%;
|
|
1675
|
-
background: var(--zl-color-surface-default-black, #0f0f11);
|
|
1676
|
-
color: var(--zl-color-text-primary-white, #f4f4f6);
|
|
1677
|
-
font-family: var(--zl-font-family-sans, system-ui, sans-serif);
|
|
1678
|
-
}
|
|
1679
|
-
.zl-mount {
|
|
1680
|
-
display: flex;
|
|
1681
|
-
flex-direction: column;
|
|
1682
|
-
min-height: 100vh;
|
|
1683
|
-
background: inherit;
|
|
1684
|
-
color: inherit;
|
|
1685
|
-
}
|
|
1686
|
-
.zl-mount > zl-page-shell,
|
|
1687
|
-
.zl-mount > [data-zl-template-root] {
|
|
1688
|
-
flex: 1 1 auto;
|
|
1689
|
-
}
|
|
1690
|
-
.zl-attribution {
|
|
1691
|
-
display: flex;
|
|
1692
|
-
justify-content: center;
|
|
1693
|
-
align-items: center;
|
|
1694
|
-
background: transparent;
|
|
1695
|
-
}
|
|
1696
|
-
.zl-attribution[hidden] {
|
|
1697
|
-
display: none;
|
|
1698
|
-
}
|
|
1699
|
-
/* Card header typography — Figma "Desktop/Headings/Small" + "Body Small
|
|
1700
|
-
Regular" pattern shared by sign-in (6593:141740), passkey upsell
|
|
1701
|
-
(6594:89142 / 6594:12796), and signed-in (6596:132845). Templates
|
|
1702
|
-
slot raw <h1>/<p> elements into <zl-card>, which keeps them in the
|
|
1703
|
-
light DOM where the orchestrator's stylesheet can reach them — the
|
|
1704
|
-
atom intentionally doesn't dictate typography. */
|
|
1705
|
-
.zl-card-title {
|
|
1706
|
-
margin: 0;
|
|
1707
|
-
font-family: var(--zl-font-family-heading, var(--zl-font-family-sans, system-ui, sans-serif));
|
|
1708
|
-
font-size: 2rem;
|
|
1709
|
-
font-weight: 400;
|
|
1710
|
-
line-height: 2.5rem;
|
|
1711
|
-
letter-spacing: -0.02em;
|
|
1712
|
-
color: var(--zl-color-text-primary-white, #f4f4f6);
|
|
1713
|
-
text-align: left;
|
|
1714
|
-
}
|
|
1715
|
-
.zl-card-subtitle {
|
|
1716
|
-
margin: 0;
|
|
1717
|
-
font-family: var(--zl-font-family-sans, system-ui, sans-serif);
|
|
1718
|
-
font-size: 0.875rem;
|
|
1719
|
-
line-height: 1.25rem;
|
|
1720
|
-
font-weight: 400;
|
|
1721
|
-
color: var(--zl-color-text-primary-white, #f4f4f6);
|
|
1722
|
-
}
|
|
1723
|
-
/* Figma 6593:141989 / 6594:12882 — left-aligned in Field+CTAs (x=0, items-start). */
|
|
1724
|
-
.zl-card-nav {
|
|
1725
|
-
margin: 0;
|
|
1726
|
-
font-family: var(--zl-font-family-sans, system-ui, sans-serif);
|
|
1727
|
-
font-size: 1rem;
|
|
1728
|
-
line-height: 1.5rem;
|
|
1729
|
-
font-weight: 400;
|
|
1730
|
-
color: var(--zl-color-text-primary-white, #f4f4f6);
|
|
1731
|
-
text-align: left;
|
|
1732
|
-
}
|
|
1733
|
-
.zl-card-nav__link {
|
|
1734
|
-
display: inline;
|
|
1735
|
-
margin: 0;
|
|
1736
|
-
padding: 0;
|
|
1737
|
-
border: none;
|
|
1738
|
-
background: transparent;
|
|
1739
|
-
font: inherit;
|
|
1740
|
-
line-height: inherit;
|
|
1741
|
-
color: var(--zl-color-icon-default-purple, #bba5e4);
|
|
1742
|
-
text-decoration: none;
|
|
1743
|
-
cursor: pointer;
|
|
1744
|
-
}
|
|
1745
|
-
.zl-card-nav__link:hover {
|
|
1746
|
-
text-decoration: underline;
|
|
1747
|
-
}
|
|
1748
|
-
.zl-card-nav__link:focus-visible {
|
|
1749
|
-
outline: var(--zl-focus-width, 2px) solid var(--zl-focus-color, #f4f4f6);
|
|
1750
|
-
outline-offset: var(--zl-focus-offset, 2px);
|
|
1751
|
-
}
|
|
1752
|
-
/* Figma 6593:141989 — forgot password row (left-aligned, before CTAs). */
|
|
1753
|
-
.zl-card-forgot {
|
|
1754
|
-
margin: 0;
|
|
1755
|
-
text-align: left;
|
|
1756
|
-
}
|
|
1757
|
-
.zl-card-forgot__link {
|
|
1758
|
-
display: inline;
|
|
1759
|
-
margin: 0;
|
|
1760
|
-
padding: 0;
|
|
1761
|
-
border: none;
|
|
1762
|
-
background: transparent;
|
|
1763
|
-
font-family: var(--zl-font-family-sans, system-ui, sans-serif);
|
|
1764
|
-
font-size: 1rem;
|
|
1765
|
-
line-height: 1.5rem;
|
|
1766
|
-
font-weight: 400;
|
|
1767
|
-
color: var(--zl-color-icon-default-purple, #bba5e4);
|
|
1768
|
-
text-decoration: none;
|
|
1769
|
-
cursor: pointer;
|
|
1770
|
-
}
|
|
1771
|
-
.zl-card-forgot__link:hover {
|
|
1772
|
-
text-decoration: underline;
|
|
1773
|
-
}
|
|
1774
|
-
.zl-card-forgot__link:focus-visible {
|
|
1775
|
-
outline: var(--zl-focus-width, 2px) solid var(--zl-focus-color, #f4f4f6);
|
|
1776
|
-
outline-offset: var(--zl-focus-offset, 2px);
|
|
1777
|
-
}
|
|
1778
|
-
`;
|
|
1779
|
-
//#endregion
|
|
1780
|
-
//#region src/orchestrator/templates/passkey-upsell.liquid.ts
|
|
1781
|
-
/**
|
|
1782
|
-
* `passkey-upsell` partial — third Figma target screen (file
|
|
1783
|
-
* `xkvBjkOJ8ENuHdTGZHXezK`, node `6594:630`).
|
|
1784
|
-
*
|
|
1785
|
-
* Differs from `auth-form`:
|
|
1786
|
-
* - heading + subtitle live in a compact card (gap 24px instead of 32px),
|
|
1787
|
-
* - primary "Set up passkey" CTA carries a trailing 24px passkey icon
|
|
1788
|
-
* (Figma slots the icon to the right of the label, not above it),
|
|
1789
|
-
* - secondary "Skip for now" uses the dark secondary hierarchy, not the
|
|
1790
|
-
* `text` hierarchy — the Figma button has a solid #252528 background.
|
|
1791
|
-
*
|
|
1792
|
-
* Server-side errors land in a `<zl-alert>` the same way as the auth form.
|
|
1793
|
-
*/
|
|
1794
|
-
const passkeyUpsellTemplate = String.raw`
|
|
1795
|
-
<zl-page-shell data-zl-template-root>
|
|
1796
|
-
{% if branding.logo_url %}
|
|
1797
|
-
<img slot="header" class="zl-card-logo" src="{{ branding.logo_url }}" alt="" />
|
|
1798
|
-
{% endif %}
|
|
1799
|
-
<zl-card compact>
|
|
1800
|
-
<h1 slot="header" class="zl-card-title">{{ step.texts.title_key | t: identity.display_name }}</h1>
|
|
1801
|
-
<p slot="header" class="zl-card-subtitle">{{ 'passkey-upsell.description.line1' | t }}</p>
|
|
1802
|
-
<p slot="header" class="zl-card-subtitle">{{ 'passkey-upsell.description.line2' | t }}</p>
|
|
1803
|
-
|
|
1804
|
-
{% if errors and errors.size > 0 %}
|
|
1805
|
-
{% for err in errors %}
|
|
1806
|
-
{% if err | formLevelError %}
|
|
1807
|
-
<zl-alert severity="error">
|
|
1808
|
-
{% if err.text_key %}{{ err.text_key | t }}{% else %}{{ err.message }}{% endif %}
|
|
1809
|
-
</zl-alert>
|
|
1810
|
-
{% endif %}
|
|
1811
|
-
{% endfor %}
|
|
1812
|
-
{% endif %}
|
|
1813
|
-
|
|
1814
|
-
{% for entry in actions %}
|
|
1815
|
-
{% if entry[1].primary %}
|
|
1816
|
-
<zl-button
|
|
1817
|
-
slot="footer"
|
|
1818
|
-
hierarchy="primary"
|
|
1819
|
-
size="medium"
|
|
1820
|
-
type="submit"
|
|
1821
|
-
block
|
|
1822
|
-
action="{{ entry[0] }}"
|
|
1823
|
-
{% if loading %}loading disabled{% endif %}
|
|
1824
|
-
>
|
|
1825
|
-
{{ entry[1].text_key | t }}
|
|
1826
|
-
<zl-icon slot="trailing" name="passkey" size="24"></zl-icon>
|
|
1827
|
-
</zl-button>
|
|
1828
|
-
{% endif %}
|
|
1829
|
-
{% endfor %}
|
|
1830
|
-
|
|
1831
|
-
{% for entry in actions %}
|
|
1832
|
-
{% unless entry[1].primary %}
|
|
1833
|
-
<zl-button
|
|
1834
|
-
slot="footer"
|
|
1835
|
-
hierarchy="secondary"
|
|
1836
|
-
size="medium"
|
|
1837
|
-
type="button"
|
|
1838
|
-
block
|
|
1839
|
-
action="{{ entry[0] }}"
|
|
1840
|
-
label="{{ entry[1].text_key | t }}"
|
|
1841
|
-
></zl-button>
|
|
1842
|
-
{% endunless %}
|
|
1843
|
-
{% endfor %}
|
|
1844
|
-
|
|
1845
|
-
{% mandatory_gates %}
|
|
1846
|
-
|
|
1847
|
-
{% if challenge and challenge.method == "passkey" %}
|
|
1848
|
-
<zl-passkey
|
|
1849
|
-
ceremony="{{ challenge.options.ceremony | default: 'register' }}"
|
|
1850
|
-
challenge-id="{{ challenge.challenge_id }}"
|
|
1851
|
-
options='{{ challenge.options | json }}'
|
|
1852
|
-
></zl-passkey>
|
|
1853
|
-
{% endif %}
|
|
1854
|
-
</zl-card>
|
|
1855
|
-
</zl-page-shell>
|
|
1856
|
-
`;
|
|
1857
|
-
//#endregion
|
|
1858
|
-
//#region src/orchestrator/templates/signed-in.liquid.ts
|
|
1859
|
-
/**
|
|
1860
|
-
* `signed-in` partial — fourth Figma target screen (file
|
|
1861
|
-
* `xkvBjkOJ8ENuHdTGZHXezK`, node `6596:132844`).
|
|
1862
|
-
*
|
|
1863
|
-
* Figma layout:
|
|
1864
|
-
* - heading "You're signed in as" (left-aligned, full width)
|
|
1865
|
-
* - body line with the authenticated email address (Arimo Regular 16/24)
|
|
1866
|
-
* - "Continue" primary CTA
|
|
1867
|
-
* - "Logout" secondary CTA
|
|
1868
|
-
*
|
|
1869
|
-
* No avatar / identity hero glyph: the Figma frame is intentionally a
|
|
1870
|
-
* pure modal layover and dropping the avatar keeps the orchestrator
|
|
1871
|
-
* default in lockstep with the spec.
|
|
1872
|
-
*
|
|
1873
|
-
* Rendered when the flow returns a terminal step (`complete: "show"`)
|
|
1874
|
-
* and no `post-sign-in-url` is configured, so the user can confirm the
|
|
1875
|
-
* identity before the host SPA takes over.
|
|
1876
|
-
*/
|
|
1877
|
-
const signedInTemplate = String.raw`
|
|
1878
|
-
<zl-page-shell data-zl-template-root>
|
|
1879
|
-
{% if branding.logo_url %}
|
|
1880
|
-
<img slot="header" class="zl-card-logo" src="{{ branding.logo_url }}" alt="" />
|
|
1881
|
-
{% endif %}
|
|
1882
|
-
<zl-card compact>
|
|
1883
|
-
<h1 slot="header" class="zl-card-title">
|
|
1884
|
-
{{ step.texts.title_key | t: identity.display_name }}
|
|
1885
|
-
</h1>
|
|
1886
|
-
{% if identity.email_address or identity.display_name %}
|
|
1887
|
-
<p slot="header" class="zl-card-subtitle">
|
|
1888
|
-
{{ identity.email_address | default: identity.display_name }}
|
|
1889
|
-
</p>
|
|
1890
|
-
{% endif %}
|
|
1891
|
-
|
|
1892
|
-
{% if errors and errors.size > 0 %}
|
|
1893
|
-
{% for err in errors %}
|
|
1894
|
-
<zl-alert severity="error">{{ err.text_key | t }}</zl-alert>
|
|
1895
|
-
{% endfor %}
|
|
1896
|
-
{% endif %}
|
|
1897
|
-
|
|
1898
|
-
{% if actions and actions.size > 0 %}
|
|
1899
|
-
{% for entry in actions %}
|
|
1900
|
-
{% if entry[1].primary %}
|
|
1901
|
-
<zl-button
|
|
1902
|
-
slot="footer"
|
|
1903
|
-
hierarchy="primary"
|
|
1904
|
-
size="medium"
|
|
1905
|
-
type="submit"
|
|
1906
|
-
block
|
|
1907
|
-
action="{{ entry[0] }}"
|
|
1908
|
-
label="{{ entry[1].text_key | t }}"
|
|
1909
|
-
{% if loading %}loading{% endif %}
|
|
1910
|
-
></zl-button>
|
|
1911
|
-
{% endif %}
|
|
1912
|
-
{% endfor %}
|
|
1913
|
-
|
|
1914
|
-
{% for entry in actions %}
|
|
1915
|
-
{% unless entry[1].primary %}
|
|
1916
|
-
<zl-button
|
|
1917
|
-
slot="footer"
|
|
1918
|
-
hierarchy="secondary"
|
|
1919
|
-
size="medium"
|
|
1920
|
-
block
|
|
1921
|
-
action="{{ entry[0] }}"
|
|
1922
|
-
label="{{ entry[1].text_key | t }}"
|
|
1923
|
-
></zl-button>
|
|
1924
|
-
{% endunless %}
|
|
1925
|
-
{% endfor %}
|
|
1926
|
-
{% else %}
|
|
1927
|
-
{% comment %}
|
|
1928
|
-
Fallback when the API ships a terminal step with no actions —
|
|
1929
|
-
matches Figma node 6596:132844 which always renders Continue
|
|
1930
|
-
+ Logout. The orchestrator wires these to its built-in
|
|
1931
|
-
continue / logout handlers.
|
|
1932
|
-
{% endcomment %}
|
|
1933
|
-
<zl-button
|
|
1934
|
-
slot="footer"
|
|
1935
|
-
hierarchy="primary"
|
|
1936
|
-
size="medium"
|
|
1937
|
-
type="submit"
|
|
1938
|
-
block
|
|
1939
|
-
action="continue"
|
|
1940
|
-
label="{{ 'signed-in.continue' | t }}"
|
|
1941
|
-
></zl-button>
|
|
1942
|
-
<zl-button
|
|
1943
|
-
slot="footer"
|
|
1944
|
-
hierarchy="secondary"
|
|
1945
|
-
size="medium"
|
|
1946
|
-
block
|
|
1947
|
-
action="logout"
|
|
1948
|
-
label="{{ 'signed-in.logout' | t }}"
|
|
1949
|
-
></zl-button>
|
|
1950
|
-
{% endif %}
|
|
1951
|
-
|
|
1952
|
-
{% mandatory_gates %}
|
|
1953
|
-
</zl-card>
|
|
1954
|
-
</zl-page-shell>
|
|
1955
|
-
`;
|
|
1956
|
-
//#endregion
|
|
1957
|
-
//#region src/orchestrator/template-names.ts
|
|
1958
|
-
/**
|
|
1959
|
-
* Names of the bundled Liquid templates the `<zitadel-login>` orchestrator
|
|
1960
|
-
* registers.
|
|
1961
|
-
*
|
|
1962
|
-
* This lives in its own module — separate from `liquid.ts` — so the public
|
|
1963
|
-
* barrel can re-export `TEMPLATE_NAMES` without dragging LiquidJS' `Liquid`
|
|
1964
|
-
* type (and its Node ambient-type requirements) into the published
|
|
1965
|
-
* declaration surface. See `liquid.ts` / the orchestrator barrel.
|
|
1966
|
-
*/
|
|
1967
|
-
const TEMPLATE_NAMES = {
|
|
1968
|
-
default: "default",
|
|
1969
|
-
authForm: "auth-form",
|
|
1970
|
-
passkeyUpsell: "passkey-upsell",
|
|
1971
|
-
signedIn: "signed-in"
|
|
1972
|
-
};
|
|
1973
|
-
//#endregion
|
|
1974
1523
|
//#region src/orchestrator/liquid.ts
|
|
1975
1524
|
/**
|
|
1976
1525
|
* LiquidJS engine factory for the `<zitadel-login>` orchestrator.
|
|
@@ -1987,13 +1536,11 @@ const TEMPLATE_NAMES = {
|
|
|
1987
1536
|
* escapes (Layer 1 of the security pipeline).
|
|
1988
1537
|
* - Partials are loaded from an in-memory map; no filesystem access.
|
|
1989
1538
|
*/
|
|
1539
|
+
const TEMPLATE_NAMES$1 = { default: "default" };
|
|
1990
1540
|
function createLiquidEngine(options) {
|
|
1991
1541
|
const engine = new Liquid({
|
|
1992
1542
|
templates: {
|
|
1993
|
-
[TEMPLATE_NAMES.default]:
|
|
1994
|
-
[TEMPLATE_NAMES.authForm]: authFormTemplate,
|
|
1995
|
-
[TEMPLATE_NAMES.passkeyUpsell]: passkeyUpsellTemplate,
|
|
1996
|
-
[TEMPLATE_NAMES.signedIn]: signedInTemplate,
|
|
1543
|
+
[TEMPLATE_NAMES$1.default]: default_default,
|
|
1997
1544
|
...options.templates ?? {}
|
|
1998
1545
|
},
|
|
1999
1546
|
cache: true,
|
|
@@ -2077,6 +1624,23 @@ function interpolate(template, args) {
|
|
|
2077
1624
|
});
|
|
2078
1625
|
}
|
|
2079
1626
|
//#endregion
|
|
1627
|
+
//#region src/orchestrator/template-names.ts
|
|
1628
|
+
/**
|
|
1629
|
+
* Names of the bundled Liquid templates the `<zitadel-login>` orchestrator
|
|
1630
|
+
* registers.
|
|
1631
|
+
*
|
|
1632
|
+
* This lives in its own module — separate from `liquid.ts` — so the public
|
|
1633
|
+
* barrel can re-export `TEMPLATE_NAMES` without dragging LiquidJS' `Liquid`
|
|
1634
|
+
* type (and its Node ambient-type requirements) into the published
|
|
1635
|
+
* declaration surface. See `liquid.ts` / the orchestrator barrel.
|
|
1636
|
+
*/
|
|
1637
|
+
const TEMPLATE_NAMES = {
|
|
1638
|
+
default: "default",
|
|
1639
|
+
authForm: "auth-form",
|
|
1640
|
+
passkeyUpsell: "passkey-upsell",
|
|
1641
|
+
signedIn: "signed-in"
|
|
1642
|
+
};
|
|
1643
|
+
//#endregion
|
|
2080
1644
|
//#region src/orchestrator/locales/en.ts
|
|
2081
1645
|
/**
|
|
2082
1646
|
* Minimal English locale dictionary.
|
|
@@ -2085,53 +1649,97 @@ function interpolate(template, args) {
|
|
|
2085
1649
|
* to the raw key (matches the spec in
|
|
2086
1650
|
* `docs/design/flowengine/flow-engine-guide.md`).
|
|
2087
1651
|
*
|
|
1652
|
+
* Text keys are auto-generated by the server from the flow definition:
|
|
1653
|
+
* - Step titles: `<step>.title`
|
|
1654
|
+
* - Step descriptions: `<step>.description`
|
|
1655
|
+
* - Field labels: `<step>.field.<field>`
|
|
1656
|
+
* - Action labels: `<step>.action.<action>`
|
|
1657
|
+
*
|
|
2088
1658
|
* Copy aligned to Figma screens file `xkvBjkOJ8ENuHdTGZHXezK` (May 2026).
|
|
2089
1659
|
* MVP only — multi-locale support is deferred.
|
|
2090
1660
|
*/
|
|
2091
1661
|
const en = {
|
|
2092
1662
|
"identifier.title": "Sign in",
|
|
1663
|
+
"identifier.description": "Enter your email to continue",
|
|
2093
1664
|
"identifier.field.email": "Work email",
|
|
2094
1665
|
"identifier.field.email.placeholder": "you@company.com",
|
|
2095
|
-
"identifier.
|
|
1666
|
+
"identifier.action.submit": "Continue",
|
|
1667
|
+
"identifier.action.continue": "Continue",
|
|
2096
1668
|
"identifier.action.passkey": "Sign in with a passkey",
|
|
2097
1669
|
"identifier.action.register.lead": "Don't have an account? ",
|
|
2098
1670
|
"identifier.action.register.link": "Sign up",
|
|
1671
|
+
"authenticate.title": "Sign in",
|
|
1672
|
+
"authenticate.description": "Enter your password",
|
|
1673
|
+
"authenticate.field.password": "Password",
|
|
1674
|
+
"authenticate.action.submit": "Sign in",
|
|
1675
|
+
"choose-register.title": "Create your account",
|
|
1676
|
+
"choose-register.description": "Choose how you'd like to sign up",
|
|
1677
|
+
"choose-register.action.register-with-password": "Sign up with password",
|
|
1678
|
+
"choose-register.action.register-with-passkey": "Sign up with passkey",
|
|
1679
|
+
"collect-credentials.title": "Create your account",
|
|
1680
|
+
"collect-credentials.description": "Set up your email and password",
|
|
1681
|
+
"collect-credentials.field.email": "Work email",
|
|
1682
|
+
"collect-credentials.field.email.placeholder": "you@company.com",
|
|
1683
|
+
"collect-credentials.field.password": "Password",
|
|
1684
|
+
"collect-credentials.field.password.help": "At least 8 characters, including a symbol and number.",
|
|
1685
|
+
"collect-credentials.action.submit": "Sign up",
|
|
1686
|
+
"register-password.title": "Create your password",
|
|
1687
|
+
"register-password.description": "Choose a secure password for your account",
|
|
1688
|
+
"register-password.field.password": "Password",
|
|
1689
|
+
"register-password.field.password.help": "At least 8 characters, including a symbol and number.",
|
|
1690
|
+
"register-password.action.submit": "Sign up",
|
|
1691
|
+
"passkey-upsell.title": "Sign in faster next time",
|
|
1692
|
+
"passkey-upsell.description": "No password needed ever again.",
|
|
1693
|
+
"passkey-upsell.description.line1": "No password needed ever again.",
|
|
1694
|
+
"passkey-upsell.description.line2": "Sign in with Face ID, Touch ID, or PIN.",
|
|
1695
|
+
"passkey-upsell.action.passkey_register": "Set up passkey",
|
|
1696
|
+
"passkey-upsell.action.skip": "Skip for now",
|
|
1697
|
+
"passkey-upsell.action.setup": "Set up passkey",
|
|
1698
|
+
"collect-passkey-email.title": "Create your account",
|
|
1699
|
+
"collect-passkey-email.description": "Enter your email to set up a passkey",
|
|
1700
|
+
"collect-passkey-email.field.email": "Work email",
|
|
1701
|
+
"collect-passkey-email.field.email.placeholder": "you@company.com",
|
|
1702
|
+
"collect-passkey-email.action.submit": "Continue",
|
|
1703
|
+
"passkey-enroll.title": "Set up your passkey",
|
|
1704
|
+
"passkey-enroll.description": "Use Face ID, Touch ID, or your device PIN to create a passkey.",
|
|
1705
|
+
"passkey-enroll.action.passkey_register": "Set up passkey",
|
|
1706
|
+
"done.title": "You're signed in as",
|
|
1707
|
+
"done.description": "",
|
|
2099
1708
|
"password.title": "Sign in",
|
|
1709
|
+
"password.description": "Enter your password",
|
|
2100
1710
|
"password.field.password": "Password",
|
|
1711
|
+
"password.action.signin": "Sign in",
|
|
2101
1712
|
"password.action.passkey": "Sign in with a passkey",
|
|
2102
1713
|
"password.action.register.lead": "Don't have an account? ",
|
|
2103
1714
|
"password.action.register.link": "Sign up",
|
|
2104
1715
|
"register.title": "Create your account",
|
|
1716
|
+
"register.description": "Enter your email to get started",
|
|
2105
1717
|
"register.field.email": "Work email",
|
|
2106
1718
|
"register.field.email.placeholder": "you@company.com",
|
|
2107
1719
|
"register.field.password": "Password",
|
|
2108
1720
|
"register.field.password.help": "At least 8 characters, including a symbol and number.",
|
|
1721
|
+
"register.action.password": "Continue with password",
|
|
1722
|
+
"register.action.passkey": "Register with a passkey",
|
|
2109
1723
|
"register.action.submit": "Sign up",
|
|
2110
1724
|
"register.action.sign_in.lead": "Already have an account? ",
|
|
2111
1725
|
"register.action.sign_in.link": "Sign in",
|
|
2112
|
-
"passkey-upsell.title": "Sign in faster next time",
|
|
2113
|
-
"passkey-upsell.description.line1": "No password needed ever again.",
|
|
2114
|
-
"passkey-upsell.description.line2": "Sign in with Face ID, Touch ID, or PIN.",
|
|
2115
|
-
"passkey-upsell.action.setup": "Set up passkey",
|
|
2116
|
-
"passkey-upsell.action.skip": "Skip for now",
|
|
2117
|
-
/** Figma `6594:630` setup-passkey annotations — form-level `<zl-alert>`. */
|
|
2118
|
-
"error.passkey_cancelled": "Passkey setup was cancelled",
|
|
2119
|
-
"error.passkey_not_registered": "This passkey is not registered. Please sign in with your email and password.",
|
|
2120
|
-
"error.passkey_setup_failed": "Passkey registration did not complete. Please try again.",
|
|
2121
|
-
"error.passkey_unsupported": "This device does not support passkeys",
|
|
2122
|
-
"error.passkey_failed": "Something went wrong. Please try again.",
|
|
2123
1726
|
"complete.title": "You're signed in as",
|
|
2124
1727
|
"signed-in.continue": "Continue",
|
|
2125
1728
|
"signed-in.logout": "Logout",
|
|
1729
|
+
"passkey-login.title": "Sign in with your passkey",
|
|
2126
1730
|
"recover.title": "Check your email",
|
|
2127
1731
|
"recover.description": "We sent a password reset link to your email address.",
|
|
2128
1732
|
"recover.action.back": "Back to sign in",
|
|
2129
|
-
"passkey-login.title": "Sign in with your passkey",
|
|
2130
1733
|
"submit.continue": "Continue",
|
|
2131
1734
|
"submit.signin": "Sign in",
|
|
2132
1735
|
"action.forgot_password": "Forgot password?",
|
|
2133
1736
|
"action.cancel": "Cancel",
|
|
2134
1737
|
"sso.redirect.title": "Redirecting to your provider…",
|
|
1738
|
+
"error.passkey_cancelled": "Passkey setup was cancelled",
|
|
1739
|
+
"error.passkey_not_registered": "This passkey is not registered. Please sign in with your email and password.",
|
|
1740
|
+
"error.passkey_setup_failed": "Passkey registration did not complete. Please try again.",
|
|
1741
|
+
"error.passkey_unsupported": "This device does not support passkeys",
|
|
1742
|
+
"error.passkey_failed": "Something went wrong. Please try again.",
|
|
2135
1743
|
"error.email_required": "Please enter an email address",
|
|
2136
1744
|
"error.email_invalid": "Please enter a valid email",
|
|
2137
1745
|
"error.password_required": "Please enter a password",
|
|
@@ -2147,47 +1755,86 @@ const en = {
|
|
|
2147
1755
|
//#region src/orchestrator/locales/de.ts
|
|
2148
1756
|
const de = {
|
|
2149
1757
|
"identifier.title": "Anmelden",
|
|
1758
|
+
"identifier.description": "Gib deine E-Mail-Adresse ein, um fortzufahren",
|
|
2150
1759
|
"identifier.field.email": "E-Mail",
|
|
2151
1760
|
"identifier.field.email.placeholder": "du@unternehmen.com",
|
|
2152
|
-
"identifier.
|
|
1761
|
+
"identifier.action.submit": "Weiter",
|
|
1762
|
+
"identifier.action.continue": "Weiter",
|
|
2153
1763
|
"identifier.action.passkey": "Mit Passkey anmelden",
|
|
2154
1764
|
"identifier.action.register.lead": "Noch kein Konto? ",
|
|
2155
1765
|
"identifier.action.register.link": "Registrieren",
|
|
1766
|
+
"authenticate.title": "Anmelden",
|
|
1767
|
+
"authenticate.description": "Gib dein Passwort ein",
|
|
1768
|
+
"authenticate.field.password": "Passwort",
|
|
1769
|
+
"authenticate.action.submit": "Anmelden",
|
|
1770
|
+
"choose-register.title": "Konto erstellen",
|
|
1771
|
+
"choose-register.description": "Wähle, wie du dich registrieren möchtest",
|
|
1772
|
+
"choose-register.action.register-with-password": "Mit Passwort registrieren",
|
|
1773
|
+
"choose-register.action.register-with-passkey": "Mit Passkey registrieren",
|
|
1774
|
+
"collect-credentials.title": "Konto erstellen",
|
|
1775
|
+
"collect-credentials.description": "Richte E-Mail und Passwort ein",
|
|
1776
|
+
"collect-credentials.field.email": "E-Mail",
|
|
1777
|
+
"collect-credentials.field.email.placeholder": "du@unternehmen.com",
|
|
1778
|
+
"collect-credentials.field.password": "Passwort",
|
|
1779
|
+
"collect-credentials.field.password.help": "Mindestens 8 Zeichen, einschließlich eines Sonderzeichens und einer Zahl.",
|
|
1780
|
+
"collect-credentials.action.submit": "Registrieren",
|
|
1781
|
+
"register-password.title": "Passwort erstellen",
|
|
1782
|
+
"register-password.description": "Wähle ein sicheres Passwort für dein Konto",
|
|
1783
|
+
"register-password.field.password": "Passwort",
|
|
1784
|
+
"register-password.field.password.help": "Mindestens 8 Zeichen, einschließlich eines Sonderzeichens und einer Zahl.",
|
|
1785
|
+
"register-password.action.submit": "Registrieren",
|
|
1786
|
+
"passkey-upsell.title": "Nächstes Mal schneller anmelden",
|
|
1787
|
+
"passkey-upsell.description": "Kein Passwort mehr nötig.",
|
|
1788
|
+
"passkey-upsell.description.line1": "Kein Passwort mehr nötig.",
|
|
1789
|
+
"passkey-upsell.description.line2": "Melde dich mit Face ID, Touch ID oder PIN an.",
|
|
1790
|
+
"passkey-upsell.action.passkey_register": "Passkey einrichten",
|
|
1791
|
+
"passkey-upsell.action.skip": "Vorerst überspringen",
|
|
1792
|
+
"passkey-upsell.action.setup": "Passkey einrichten",
|
|
1793
|
+
"collect-passkey-email.title": "Konto erstellen",
|
|
1794
|
+
"collect-passkey-email.description": "Gib deine E-Mail-Adresse ein, um einen Passkey einzurichten",
|
|
1795
|
+
"collect-passkey-email.field.email": "E-Mail",
|
|
1796
|
+
"collect-passkey-email.field.email.placeholder": "du@unternehmen.com",
|
|
1797
|
+
"collect-passkey-email.action.submit": "Weiter",
|
|
1798
|
+
"passkey-enroll.title": "Passkey einrichten",
|
|
1799
|
+
"passkey-enroll.description": "Verwende Face ID, Touch ID oder die Geräte-PIN, um einen Passkey zu erstellen.",
|
|
1800
|
+
"passkey-enroll.action.passkey_register": "Passkey einrichten",
|
|
1801
|
+
"done.title": "Du bist angemeldet als",
|
|
1802
|
+
"done.description": "",
|
|
2156
1803
|
"password.title": "Anmelden",
|
|
1804
|
+
"password.description": "Gib dein Passwort ein",
|
|
2157
1805
|
"password.field.password": "Passwort",
|
|
1806
|
+
"password.action.signin": "Anmelden",
|
|
2158
1807
|
"password.action.passkey": "Mit Passkey anmelden",
|
|
2159
1808
|
"password.action.register.lead": "Noch kein Konto? ",
|
|
2160
1809
|
"password.action.register.link": "Registrieren",
|
|
2161
1810
|
"register.title": "Konto erstellen",
|
|
1811
|
+
"register.description": "Gib deine E-Mail-Adresse ein, um loszulegen",
|
|
2162
1812
|
"register.field.email": "E-Mail",
|
|
2163
1813
|
"register.field.email.placeholder": "du@unternehmen.com",
|
|
2164
1814
|
"register.field.password": "Passwort",
|
|
2165
1815
|
"register.field.password.help": "Mindestens 8 Zeichen, einschließlich eines Sonderzeichens und einer Zahl.",
|
|
1816
|
+
"register.action.password": "Mit Passwort fortfahren",
|
|
1817
|
+
"register.action.passkey": "Mit Passkey registrieren",
|
|
2166
1818
|
"register.action.submit": "Registrieren",
|
|
2167
1819
|
"register.action.sign_in.lead": "Bereits ein Konto? ",
|
|
2168
1820
|
"register.action.sign_in.link": "Anmelden",
|
|
2169
|
-
"passkey-upsell.title": "Nächstes Mal schneller anmelden",
|
|
2170
|
-
"passkey-upsell.description.line1": "Kein Passwort mehr nötig.",
|
|
2171
|
-
"passkey-upsell.description.line2": "Melde dich mit Face ID, Touch ID oder PIN an.",
|
|
2172
|
-
"passkey-upsell.action.setup": "Passkey einrichten",
|
|
2173
|
-
"passkey-upsell.action.skip": "Vorerst überspringen",
|
|
2174
|
-
"error.passkey_cancelled": "Passkey-Einrichtung wurde abgebrochen",
|
|
2175
|
-
"error.passkey_not_registered": "Dieser Passkey ist nicht registriert. Bitte melde dich mit E-Mail und Passwort an.",
|
|
2176
|
-
"error.passkey_setup_failed": "Passkey-Registrierung wurde nicht abgeschlossen. Bitte versuche es erneut.",
|
|
2177
|
-
"error.passkey_unsupported": "Dieses Gerät unterstützt keine Passkeys",
|
|
2178
|
-
"error.passkey_failed": "Etwas ist schiefgelaufen. Bitte versuche es erneut.",
|
|
2179
1821
|
"complete.title": "Du bist angemeldet als",
|
|
2180
1822
|
"signed-in.continue": "Weiter",
|
|
2181
1823
|
"signed-in.logout": "Abmelden",
|
|
1824
|
+
"passkey-login.title": "Mit Passkey anmelden",
|
|
2182
1825
|
"recover.title": "E-Mail prüfen",
|
|
2183
1826
|
"recover.description": "Wir haben einen Link zum Zurücksetzen des Passworts an deine E-Mail-Adresse gesendet.",
|
|
2184
1827
|
"recover.action.back": "Zurück zur Anmeldung",
|
|
2185
|
-
"passkey-login.title": "Mit Passkey anmelden",
|
|
2186
1828
|
"submit.continue": "Weiter",
|
|
2187
1829
|
"submit.signin": "Anmelden",
|
|
2188
1830
|
"action.forgot_password": "Passwort vergessen?",
|
|
2189
1831
|
"action.cancel": "Abbrechen",
|
|
2190
1832
|
"sso.redirect.title": "Weiterleitung zum Anbieter…",
|
|
1833
|
+
"error.passkey_cancelled": "Passkey-Einrichtung wurde abgebrochen",
|
|
1834
|
+
"error.passkey_not_registered": "Dieser Passkey ist nicht registriert. Bitte melde dich mit E-Mail und Passwort an.",
|
|
1835
|
+
"error.passkey_setup_failed": "Passkey-Registrierung wurde nicht abgeschlossen. Bitte versuche es erneut.",
|
|
1836
|
+
"error.passkey_unsupported": "Dieses Gerät unterstützt keine Passkeys",
|
|
1837
|
+
"error.passkey_failed": "Etwas ist schiefgelaufen. Bitte versuche es erneut.",
|
|
2191
1838
|
"error.email_required": "Bitte gib eine E-Mail-Adresse ein",
|
|
2192
1839
|
"error.email_invalid": "Bitte gib eine gültige E-Mail-Adresse ein",
|
|
2193
1840
|
"error.password_required": "Bitte gib ein Passwort ein",
|
|
@@ -2199,10 +1846,105 @@ const de = {
|
|
|
2199
1846
|
"error.sign_in_server.body": "Bitte versuche es in einigen Minuten erneut"
|
|
2200
1847
|
};
|
|
2201
1848
|
//#endregion
|
|
1849
|
+
//#region src/orchestrator/locales/it.ts
|
|
1850
|
+
const it = {
|
|
1851
|
+
"identifier.title": "Accedi",
|
|
1852
|
+
"identifier.description": "Inserisci la tua e-mail per continuare",
|
|
1853
|
+
"identifier.field.email": "E-mail aziendale",
|
|
1854
|
+
"identifier.field.email.placeholder": "tu@azienda.com",
|
|
1855
|
+
"identifier.action.submit": "Continua",
|
|
1856
|
+
"identifier.action.continue": "Continua",
|
|
1857
|
+
"identifier.action.passkey": "Accedi con passkey",
|
|
1858
|
+
"identifier.action.register.lead": "Non hai un account? ",
|
|
1859
|
+
"identifier.action.register.link": "Registrati",
|
|
1860
|
+
"authenticate.title": "Accedi",
|
|
1861
|
+
"authenticate.description": "Inserisci la tua password",
|
|
1862
|
+
"authenticate.field.password": "Password",
|
|
1863
|
+
"authenticate.action.submit": "Accedi",
|
|
1864
|
+
"choose-register.title": "Crea il tuo account",
|
|
1865
|
+
"choose-register.description": "Scegli come registrarti",
|
|
1866
|
+
"choose-register.action.register-with-password": "Registrati con password",
|
|
1867
|
+
"choose-register.action.register-with-passkey": "Registrati con passkey",
|
|
1868
|
+
"collect-credentials.title": "Crea il tuo account",
|
|
1869
|
+
"collect-credentials.description": "Configura e-mail e password",
|
|
1870
|
+
"collect-credentials.field.email": "E-mail aziendale",
|
|
1871
|
+
"collect-credentials.field.email.placeholder": "tu@azienda.com",
|
|
1872
|
+
"collect-credentials.field.password": "Password",
|
|
1873
|
+
"collect-credentials.field.password.help": "Almeno 8 caratteri, incluso un simbolo e un numero.",
|
|
1874
|
+
"collect-credentials.action.submit": "Registrati",
|
|
1875
|
+
"register-password.title": "Crea la tua password",
|
|
1876
|
+
"register-password.description": "Scegli una password sicura per il tuo account",
|
|
1877
|
+
"register-password.field.password": "Password",
|
|
1878
|
+
"register-password.field.password.help": "Almeno 8 caratteri, incluso un simbolo e un numero.",
|
|
1879
|
+
"register-password.action.submit": "Registrati",
|
|
1880
|
+
"passkey-upsell.title": "Accedi più velocemente la prossima volta",
|
|
1881
|
+
"passkey-upsell.description": "Nessuna password necessaria.",
|
|
1882
|
+
"passkey-upsell.description.line1": "Nessuna password necessaria.",
|
|
1883
|
+
"passkey-upsell.description.line2": "Accedi con Face ID, Touch ID o PIN.",
|
|
1884
|
+
"passkey-upsell.action.passkey_register": "Configura passkey",
|
|
1885
|
+
"passkey-upsell.action.skip": "Salta per ora",
|
|
1886
|
+
"passkey-upsell.action.setup": "Configura passkey",
|
|
1887
|
+
"collect-passkey-email.title": "Crea il tuo account",
|
|
1888
|
+
"collect-passkey-email.description": "Inserisci la tua e-mail per configurare una passkey",
|
|
1889
|
+
"collect-passkey-email.field.email": "E-mail aziendale",
|
|
1890
|
+
"collect-passkey-email.field.email.placeholder": "tu@azienda.com",
|
|
1891
|
+
"collect-passkey-email.action.submit": "Continua",
|
|
1892
|
+
"passkey-enroll.title": "Configura la tua passkey",
|
|
1893
|
+
"passkey-enroll.description": "Usa Face ID, Touch ID o il PIN del dispositivo per creare una passkey.",
|
|
1894
|
+
"passkey-enroll.action.passkey_register": "Configura passkey",
|
|
1895
|
+
"done.title": "Sei connesso come",
|
|
1896
|
+
"done.description": "",
|
|
1897
|
+
"password.title": "Accedi",
|
|
1898
|
+
"password.description": "Inserisci la tua password",
|
|
1899
|
+
"password.field.password": "Password",
|
|
1900
|
+
"password.action.signin": "Accedi",
|
|
1901
|
+
"password.action.passkey": "Accedi con passkey",
|
|
1902
|
+
"password.action.register.lead": "Non hai un account? ",
|
|
1903
|
+
"password.action.register.link": "Registrati",
|
|
1904
|
+
"register.title": "Crea il tuo account",
|
|
1905
|
+
"register.description": "Inserisci la tua e-mail per iniziare",
|
|
1906
|
+
"register.field.email": "E-mail aziendale",
|
|
1907
|
+
"register.field.email.placeholder": "tu@azienda.com",
|
|
1908
|
+
"register.field.password": "Password",
|
|
1909
|
+
"register.field.password.help": "Almeno 8 caratteri, incluso un simbolo e un numero.",
|
|
1910
|
+
"register.action.password": "Continua con password",
|
|
1911
|
+
"register.action.passkey": "Registrati con passkey",
|
|
1912
|
+
"register.action.submit": "Registrati",
|
|
1913
|
+
"register.action.sign_in.lead": "Hai già un account? ",
|
|
1914
|
+
"register.action.sign_in.link": "Accedi",
|
|
1915
|
+
"complete.title": "Sei connesso come",
|
|
1916
|
+
"signed-in.continue": "Continua",
|
|
1917
|
+
"signed-in.logout": "Esci",
|
|
1918
|
+
"passkey-login.title": "Accedi con la tua passkey",
|
|
1919
|
+
"recover.title": "Controlla la tua e-mail",
|
|
1920
|
+
"recover.description": "Abbiamo inviato un link per reimpostare la password al tuo indirizzo e-mail.",
|
|
1921
|
+
"recover.action.back": "Torna all'accesso",
|
|
1922
|
+
"submit.continue": "Continua",
|
|
1923
|
+
"submit.signin": "Accedi",
|
|
1924
|
+
"action.forgot_password": "Password dimenticata?",
|
|
1925
|
+
"action.cancel": "Annulla",
|
|
1926
|
+
"sso.redirect.title": "Reindirizzamento al provider…",
|
|
1927
|
+
"error.passkey_cancelled": "La configurazione della passkey è stata annullata",
|
|
1928
|
+
"error.passkey_not_registered": "Questa passkey non è registrata. Accedi con e-mail e password.",
|
|
1929
|
+
"error.passkey_setup_failed": "La registrazione della passkey non è stata completata. Riprova.",
|
|
1930
|
+
"error.passkey_unsupported": "Questo dispositivo non supporta le passkey",
|
|
1931
|
+
"error.passkey_failed": "Qualcosa è andato storto. Riprova.",
|
|
1932
|
+
"error.email_required": "Inserisci un indirizzo e-mail",
|
|
1933
|
+
"error.email_invalid": "Inserisci un indirizzo e-mail valido",
|
|
1934
|
+
"error.password_required": "Inserisci una password",
|
|
1935
|
+
"error.password_incorrect": "E-mail o password errata.",
|
|
1936
|
+
"error.email_exists": "Esiste già un account con questo indirizzo e-mail.",
|
|
1937
|
+
"error.invalid_credentials": "E-mail o password errata.",
|
|
1938
|
+
"error.required": "Questo campo è obbligatorio.",
|
|
1939
|
+
"error.sign_in_server.title": "Non è stato possibile completare l'accesso.",
|
|
1940
|
+
"error.sign_in_server.body": "Riprova tra qualche minuto"
|
|
1941
|
+
};
|
|
1942
|
+
//#endregion
|
|
2202
1943
|
//#region src/orchestrator/locales/index.ts
|
|
2203
1944
|
const builtinLocales = {
|
|
2204
1945
|
en,
|
|
2205
|
-
de
|
|
1946
|
+
de,
|
|
1947
|
+
it
|
|
2206
1948
|
};
|
|
2207
1949
|
//#endregion
|
|
2208
1950
|
//#region ../shared-component-styles/dist/attribution-markup.mjs
|
|
@@ -2349,6 +2091,9 @@ function createSanitiser() {
|
|
|
2349
2091
|
};
|
|
2350
2092
|
}
|
|
2351
2093
|
//#endregion
|
|
2094
|
+
//#region src/orchestrator/templates/layout-chrome.css?inline
|
|
2095
|
+
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";
|
|
2096
|
+
//#endregion
|
|
2352
2097
|
//#region src/orchestrator/theme-controller.ts
|
|
2353
2098
|
const DARK_QUERY = "(prefers-color-scheme: dark)";
|
|
2354
2099
|
var ThemeController = class {
|
|
@@ -2506,7 +2251,7 @@ let ZitadelLogin = class ZitadelLogin extends LitElement {
|
|
|
2506
2251
|
if (root instanceof ShadowRoot) {
|
|
2507
2252
|
const existing = Array.isArray(root.adoptedStyleSheets) ? root.adoptedStyleSheets : [];
|
|
2508
2253
|
const sheet = new CSSStyleSheet();
|
|
2509
|
-
sheet.replaceSync(
|
|
2254
|
+
sheet.replaceSync(layout_chrome_default);
|
|
2510
2255
|
root.adoptedStyleSheets = [...existing, sheet];
|
|
2511
2256
|
root.addEventListener("zl-input", this.handleAtomInput);
|
|
2512
2257
|
root.addEventListener("zl-submit", this.handleAtomSubmit);
|
|
@@ -2535,9 +2280,12 @@ let ZitadelLogin = class ZitadelLogin extends LitElement {
|
|
|
2535
2280
|
* resolved language is used as the base; entries from the `locales` map (if
|
|
2536
2281
|
* set) are spread on top so partial overrides work without importing and
|
|
2537
2282
|
* spreading the full base dictionary.
|
|
2283
|
+
*
|
|
2284
|
+
* Priority: explicit `lang` attr → `navigator.language` (user preference)
|
|
2285
|
+
* → `document.documentElement.lang` (page default) → English fallback.
|
|
2538
2286
|
*/
|
|
2539
2287
|
resolveLocale() {
|
|
2540
|
-
const primary = ((this.lang || (typeof
|
|
2288
|
+
const primary = ((this.lang || (typeof navigator !== "undefined" ? navigator.language : "") || (typeof document !== "undefined" ? document.documentElement.lang : "")).split("-")[0] ?? "").toLowerCase();
|
|
2541
2289
|
const builtin = builtinLocales[primary] ?? en;
|
|
2542
2290
|
const custom = this.locales?.[primary];
|
|
2543
2291
|
return custom ? {
|
|
@@ -2802,7 +2550,7 @@ let ZitadelLogin = class ZitadelLogin extends LitElement {
|
|
|
2802
2550
|
handlePasskeyResult = (event) => {
|
|
2803
2551
|
if (this.loading) return;
|
|
2804
2552
|
const { challenge_id, method, proof } = event.detail;
|
|
2805
|
-
this.submit(
|
|
2553
|
+
this.submit(method, {
|
|
2806
2554
|
challenge_id,
|
|
2807
2555
|
method,
|
|
2808
2556
|
proof
|
|
@@ -3190,22 +2938,18 @@ let ZitadelLogout = class ZitadelLogout extends LitElement {
|
|
|
3190
2938
|
this.errorMessage = "";
|
|
3191
2939
|
}
|
|
3192
2940
|
/**
|
|
3193
|
-
* Calls
|
|
3194
|
-
*
|
|
3195
|
-
* `Set-Cookie: Max-Age=0
|
|
3196
|
-
* and optionally navigates to `postSignOutUrl`.
|
|
2941
|
+
* Calls `DELETE /sessions/me` (`revokeMySession`) with `credentials: "include"`.
|
|
2942
|
+
* The server validates the `__nextgen_session` cookie, deletes the session, and
|
|
2943
|
+
* clears the cookie via `Set-Cookie: Max-Age=0`. On success this element fires
|
|
2944
|
+
* `zitadel-signout` and optionally navigates to `postSignOutUrl`.
|
|
3197
2945
|
*/
|
|
3198
2946
|
async doLogout() {
|
|
3199
2947
|
this.loading = true;
|
|
3200
2948
|
this.errorMessage = "";
|
|
3201
|
-
const params = {
|
|
3202
|
-
...this.clientId ? { client_id: this.clientId } : {},
|
|
3203
|
-
...this.postSignOutUrl ? { post_logout_redirect_uri: this.postSignOutUrl } : {}
|
|
3204
|
-
};
|
|
3205
2949
|
try {
|
|
3206
2950
|
const cfg = this.project ?? getZitadelConfig();
|
|
3207
2951
|
if (!cfg) throw new Error("<zitadel-logout> requires a `config` prop (from configureZitadel()).");
|
|
3208
|
-
await getApi(cfg).
|
|
2952
|
+
await getApi(cfg).revokeMySession({ credentials: "include" });
|
|
3209
2953
|
} catch (error) {
|
|
3210
2954
|
const message = error instanceof Error ? error.message : "";
|
|
3211
2955
|
this.errorMessage = message || "Sign-out failed. Please try again.";
|
|
@@ -3331,6 +3075,6 @@ function fillTemplateTokens(fragment, name, email, initial) {
|
|
|
3331
3075
|
}
|
|
3332
3076
|
}
|
|
3333
3077
|
//#endregion
|
|
3334
|
-
export {
|
|
3078
|
+
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 };
|
|
3335
3079
|
|
|
3336
|
-
//# sourceMappingURL=orchestrator-
|
|
3080
|
+
//# sourceMappingURL=orchestrator-B8eXcPRi.mjs.map
|