@zitadel/config 1.0.0-alpha.23 → 1.0.0-alpha.24
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/defaults/README-branding.md +26 -34
- package/dist/{defaults-DV6hY2KT.mjs → defaults-BnRHT7RQ.mjs} +17 -18
- package/dist/defaults-BnRHT7RQ.mjs.map +1 -0
- package/dist/{defaults-BxGCGdqS.d.mts → defaults-BnWXllBk.d.mts} +12 -9
- package/dist/defaults-BnWXllBk.d.mts.map +1 -0
- package/dist/defaults.d.mts +1 -1
- package/dist/defaults.mjs +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.mjs +2 -2
- package/dist/{meta-schemas-OowgSUfU.mjs → meta-schemas-K8f7YZYz.mjs} +12 -12
- package/dist/{meta-schemas-OowgSUfU.mjs.map → meta-schemas-K8f7YZYz.mjs.map} +1 -1
- package/dist/meta-schemas.mjs +1 -1
- package/dist/template.mjs +1 -1
- package/dist/template.mjs.map +1 -1
- package/meta-schemas/branding.json +5 -5
- package/meta-schemas/idp-connection.json +6 -6
- package/package.json +10 -6
- package/defaults/branding/hero/login.liquid +0 -238
- package/defaults/branding/split/login.liquid +0 -197
- package/defaults/branding/split-right/login.liquid +0 -197
- package/dist/defaults-BxGCGdqS.d.mts.map +0 -1
- package/dist/defaults-DV6hY2KT.mjs.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zitadel/config",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.24",
|
|
4
4
|
"description": "Versioned Zitadel local config schemas and defaults",
|
|
5
5
|
"homepage": "https://github.com/zitadel/nextgen/tree/main/packages/config#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -84,20 +84,24 @@
|
|
|
84
84
|
"culori": "^4.0.2",
|
|
85
85
|
"liquidjs": "^10.27.2",
|
|
86
86
|
"zod": "^4.3.6",
|
|
87
|
-
"@zitadel/api": "1.0.0-alpha.
|
|
87
|
+
"@zitadel/api": "1.0.0-alpha.24"
|
|
88
88
|
},
|
|
89
89
|
"devDependencies": {
|
|
90
90
|
"@types/culori": "^4.0.1",
|
|
91
91
|
"ajv": "^8.20.0",
|
|
92
92
|
"tsdown": "^0.21.10",
|
|
93
93
|
"tslib": "^2.8.1",
|
|
94
|
-
"vitest": "^4.1.
|
|
94
|
+
"vitest": "^4.1.11"
|
|
95
95
|
},
|
|
96
96
|
"scripts": {
|
|
97
97
|
"sync-schemas": "node scripts/sync-meta-schemas.mjs",
|
|
98
|
-
"
|
|
99
|
-
"
|
|
100
|
-
"
|
|
98
|
+
"prebuild": "pnpm run sync-schemas",
|
|
99
|
+
"build": "tsdown",
|
|
100
|
+
"pretypecheck": "pnpm run sync-schemas",
|
|
101
|
+
"typecheck": "tsc --build tsconfig.json",
|
|
102
|
+
"pretest": "pnpm run sync-schemas",
|
|
103
|
+
"test": "vitest run",
|
|
104
|
+
"test:all": "pnpm run test",
|
|
101
105
|
"lint": "oxlint ."
|
|
102
106
|
}
|
|
103
107
|
}
|
|
@@ -1,238 +0,0 @@
|
|
|
1
|
-
<zl-page-shell data-zl-template-root>
|
|
2
|
-
<div class="zl-split">
|
|
3
|
-
<aside class="zl-split__brand">
|
|
4
|
-
{% comment %} ──────────────────────────────────────────────────────────
|
|
5
|
-
YOUR LANDING CONTENT — everything inside this aside is yours.
|
|
6
|
-
Edit the copy and structure freely: structural HTML (div, section,
|
|
7
|
-
nav, h1–h6, ul, li, a, img, …) plus inline style="" attributes are
|
|
8
|
-
allowed; button, input, form, script, and style tags are stripped —
|
|
9
|
-
use plain anchors for landing CTAs. The zl-hero__* classes keep
|
|
10
|
-
this pane on design tokens so palettes and theme mode apply.
|
|
11
|
-
|
|
12
|
-
The login card in the section below is fully wired to the flow
|
|
13
|
-
engine; leave its zl-* atoms intact. Layout knobs (set on the root
|
|
14
|
-
element's style attribute): --zl-split-columns, --zl-split-align,
|
|
15
|
-
--zl-split-brand-mobile. Add zl-split--right to the wrapper div to
|
|
16
|
-
mirror the panes. More in .zitadel/branding/README.md.
|
|
17
|
-
────────────────────────────────────────────────────────────── {% endcomment %}
|
|
18
|
-
<div class="zl-hero">
|
|
19
|
-
<nav class="zl-hero__nav">
|
|
20
|
-
<span class="zl-hero__brand">
|
|
21
|
-
{% if branding.logo_url %}
|
|
22
|
-
<img class="zl-hero__brand-logo" src="{{ branding.logo_url }}" alt="" data-zl-asset-fallback />
|
|
23
|
-
<span class="zl-hero__brand-mark" aria-hidden="true" hidden data-zl-asset-fallback-content></span>
|
|
24
|
-
{% else %}
|
|
25
|
-
<span class="zl-hero__brand-mark" aria-hidden="true"></span>
|
|
26
|
-
{% endif %}
|
|
27
|
-
Your brand
|
|
28
|
-
</span>
|
|
29
|
-
<span class="zl-hero__nav-links">
|
|
30
|
-
<a href="#">Product</a>
|
|
31
|
-
<a href="#">Pricing</a>
|
|
32
|
-
<a href="#">Docs</a>
|
|
33
|
-
</span>
|
|
34
|
-
</nav>
|
|
35
|
-
|
|
36
|
-
<p class="zl-hero__eyebrow">Your product category</p>
|
|
37
|
-
<h2 class="zl-hero__headline">A headline about what you ship.</h2>
|
|
38
|
-
<p class="zl-hero__sub">
|
|
39
|
-
Use this pane to tell visitors why they sign up: what your product
|
|
40
|
-
does, who it is for, and what happens after they sign in. Replace
|
|
41
|
-
every line here before you publish.
|
|
42
|
-
</p>
|
|
43
|
-
|
|
44
|
-
<ul class="zl-hero__bullets">
|
|
45
|
-
<li>Your first selling point</li>
|
|
46
|
-
<li>Your second selling point</li>
|
|
47
|
-
<li>Your third selling point</li>
|
|
48
|
-
</ul>
|
|
49
|
-
|
|
50
|
-
<p class="zl-hero__footnote">
|
|
51
|
-
Replace this line with real social proof, such as customer logos or
|
|
52
|
-
a certification you actually hold.
|
|
53
|
-
</p>
|
|
54
|
-
</div>
|
|
55
|
-
</aside>
|
|
56
|
-
<section class="zl-split__form">
|
|
57
|
-
{% if branding.logo_url %}
|
|
58
|
-
<img class="zl-split__compact" src="{{ branding.logo_url }}" alt="" data-zl-asset-fallback />
|
|
59
|
-
<p class="zl-split__compact zl-hero__compact-brand" hidden data-zl-asset-fallback-content>Your brand</p>
|
|
60
|
-
{% else %}
|
|
61
|
-
<p class="zl-split__compact zl-hero__compact-brand">Your brand</p>
|
|
62
|
-
{% endif %}
|
|
63
|
-
<zl-card>
|
|
64
|
-
<h1 slot="header" class="zl-card-title">{{ step.texts.title_key | t: identity.display_name }}</h1>
|
|
65
|
-
{% if step.texts.description_key %}
|
|
66
|
-
{% assign card_subtitle = step.texts.description_key | t: identity.display_name %}
|
|
67
|
-
{% if card_subtitle != "" %}
|
|
68
|
-
<p slot="header" class="zl-card-subtitle">{{ card_subtitle }}</p>
|
|
69
|
-
{% endif %}
|
|
70
|
-
{% endif %}
|
|
71
|
-
|
|
72
|
-
{% assign recover = actions | where: "name", "recover" | first %}
|
|
73
|
-
{% assign password_field = fields | where: "type", "password" | first %}
|
|
74
|
-
<div class="zl-field-group">
|
|
75
|
-
{% for f in fields %}
|
|
76
|
-
{% assign field_placeholder = f.text_key | fieldPlaceholder %}
|
|
77
|
-
{% assign field_help = f.text_key | fieldHelp %}
|
|
78
|
-
{% assign field_err = f.name | fieldError: errors %}
|
|
79
|
-
{% case f.type %}
|
|
80
|
-
{% when 'checkbox' %}
|
|
81
|
-
<zl-checkbox
|
|
82
|
-
name="{{ f.name }}"
|
|
83
|
-
data-testid="zitadel-field-{{ f.name | testid }}"
|
|
84
|
-
label="{{ f.text_key | t }}"
|
|
85
|
-
value="true"
|
|
86
|
-
{% if f.value %}checked{% endif %}
|
|
87
|
-
{% if field_err != "" %}invalid error="{{ field_err }}"{% endif %}
|
|
88
|
-
></zl-checkbox>
|
|
89
|
-
{% when 'select' %}
|
|
90
|
-
<zl-select
|
|
91
|
-
name="{{ f.name }}"
|
|
92
|
-
data-testid="zitadel-field-{{ f.name | testid }}"
|
|
93
|
-
label="{{ f.text_key | t }}"
|
|
94
|
-
value="{{ f.value }}"
|
|
95
|
-
options='{{ f.validation.enum | selectOptions | json }}'
|
|
96
|
-
{% if f.required %}required{% endif %}
|
|
97
|
-
{% if field_placeholder != "" %}placeholder="{{ field_placeholder }}"{% endif %}
|
|
98
|
-
{% if field_err != "" %}invalid error="{{ field_err }}"{% endif %}
|
|
99
|
-
></zl-select>
|
|
100
|
-
{% else %}
|
|
101
|
-
{% assign autocomplete_val = '' %}
|
|
102
|
-
{% if f.name == 'email' %}
|
|
103
|
-
{% assign autocomplete_val = 'email' %}
|
|
104
|
-
{% elsif f.type == 'password' and step.name contains 'register' %}
|
|
105
|
-
{% assign autocomplete_val = 'new-password' %}
|
|
106
|
-
{% elsif f.type == 'password' %}
|
|
107
|
-
{% assign autocomplete_val = 'current-password' %}
|
|
108
|
-
{% endif %}
|
|
109
|
-
<zl-field
|
|
110
|
-
name="{{ f.name }}"
|
|
111
|
-
data-testid="zitadel-field-{{ f.name | testid }}"
|
|
112
|
-
label="{{ f.text_key | t }}"
|
|
113
|
-
type="{{ f.type }}"
|
|
114
|
-
value="{{ f.value }}"
|
|
115
|
-
{% if autocomplete_val != '' %}autocomplete="{{ autocomplete_val }}"{% endif %}
|
|
116
|
-
{% if f.required %}required{% endif %}
|
|
117
|
-
{% if field_placeholder != "" %}placeholder="{{ field_placeholder }}"{% endif %}
|
|
118
|
-
{% if field_err != "" %}invalid error="{{ field_err }}"{% endif %}
|
|
119
|
-
{% if recover and f.type == 'password' %}forgot-password-href="#" forgot-password-action="{{ recover.name }}" forgot-password-label="{{ recover.text_key | t }}"{% endif %}
|
|
120
|
-
>
|
|
121
|
-
{% if field_help != "" %}
|
|
122
|
-
<span slot="help">{{ field_help }}</span>
|
|
123
|
-
{% endif %}
|
|
124
|
-
</zl-field>
|
|
125
|
-
{% endcase %}
|
|
126
|
-
{% endfor %}
|
|
127
|
-
|
|
128
|
-
{% if errors and errors.size > 0 %}
|
|
129
|
-
{% for err in errors %}
|
|
130
|
-
{% if err | formLevelError %}
|
|
131
|
-
{% assign alert_heading = err.text_key | alertHeading %}
|
|
132
|
-
{% assign alert_body = err.text_key | alertBody %}
|
|
133
|
-
<zl-alert data-zl-step-error{% if alert_heading != "" %} heading="{{ alert_heading | t }}"{% endif %}>
|
|
134
|
-
{% if alert_body != "" %}{{ alert_body | t }}{% elsif err.text_key %}{{ err.text_key | t }}{% else %}{{ err.message }}{% endif %}
|
|
135
|
-
</zl-alert>
|
|
136
|
-
{% endif %}
|
|
137
|
-
{% endfor %}
|
|
138
|
-
{% endif %}
|
|
139
|
-
</div>
|
|
140
|
-
|
|
141
|
-
<div class="zl-card-actions">
|
|
142
|
-
{% comment %}
|
|
143
|
-
A step can offer recovery without asking for a password (an identifier-only
|
|
144
|
-
screen, say). With no label row to sit on, the affordance keeps its own row
|
|
145
|
-
rather than disappearing.
|
|
146
|
-
{% endcomment %}
|
|
147
|
-
{% if recover and password_field == nil %}
|
|
148
|
-
<p class="zl-card-forgot">
|
|
149
|
-
<a href="#" class="zl-card-forgot__link" data-action="recover">{{ recover.text_key | t }}</a>
|
|
150
|
-
</p>
|
|
151
|
-
{% endif %}
|
|
152
|
-
|
|
153
|
-
{% for a in actions %}
|
|
154
|
-
{% if a.primary %}
|
|
155
|
-
<zl-button
|
|
156
|
-
hierarchy="primary"
|
|
157
|
-
size="medium"
|
|
158
|
-
type="submit"
|
|
159
|
-
block
|
|
160
|
-
action="{{ a.name }}"
|
|
161
|
-
data-testid="zitadel-action-{{ a.name }}"
|
|
162
|
-
label="{{ a.text_key | t }}"
|
|
163
|
-
{% if loading %}loading{% endif %}
|
|
164
|
-
></zl-button>
|
|
165
|
-
{% endif %}
|
|
166
|
-
{% endfor %}
|
|
167
|
-
|
|
168
|
-
{% for a in actions %}
|
|
169
|
-
{% unless a.primary or a.kind == 'back' or a.name == 'passkey' or a.name == 'register' or a.name == 'sign_in' or a.name == 'recover' %}
|
|
170
|
-
<zl-button
|
|
171
|
-
hierarchy="secondary"
|
|
172
|
-
size="medium"
|
|
173
|
-
type="button"
|
|
174
|
-
block
|
|
175
|
-
action="{{ a.name }}"
|
|
176
|
-
data-testid="zitadel-action-{{ a.name }}"
|
|
177
|
-
label="{{ a.text_key | t }}"
|
|
178
|
-
></zl-button>
|
|
179
|
-
{% endunless %}
|
|
180
|
-
{% endfor %}
|
|
181
|
-
|
|
182
|
-
{% assign passkey = actions | where: "name", "passkey" | first %}
|
|
183
|
-
{% if passkey %}
|
|
184
|
-
{% unless passkey.primary %}
|
|
185
|
-
<zl-button
|
|
186
|
-
hierarchy="secondary"
|
|
187
|
-
size="medium"
|
|
188
|
-
block
|
|
189
|
-
action="passkey"
|
|
190
|
-
data-testid="zitadel-action-passkey"
|
|
191
|
-
label="{{ passkey.text_key | t }}"
|
|
192
|
-
></zl-button>
|
|
193
|
-
{% endunless %}
|
|
194
|
-
{% endif %}
|
|
195
|
-
|
|
196
|
-
{% assign register = actions | where: "name", "register" | first %}
|
|
197
|
-
{% if register %}
|
|
198
|
-
<p class="zl-card-nav">
|
|
199
|
-
{{ 'identifier.action.register.lead' | t }}<a href="#" class="zl-card-nav__link" data-action="register" data-testid="zitadel-action-register-link">{{ 'identifier.action.register.link' | t }}</a>
|
|
200
|
-
</p>
|
|
201
|
-
{% endif %}
|
|
202
|
-
|
|
203
|
-
{% assign sign_in = actions | where: "name", "sign_in" | first %}
|
|
204
|
-
{% if sign_in %}
|
|
205
|
-
<p class="zl-card-nav">
|
|
206
|
-
{{ 'register.action.sign_in.lead' | t }}<a href="#" class="zl-card-nav__link" data-action="sign_in" data-testid="zitadel-action-sign_in-link">{{ 'register.action.sign_in.link' | t }}</a>
|
|
207
|
-
</p>
|
|
208
|
-
{% endif %}
|
|
209
|
-
</div>
|
|
210
|
-
|
|
211
|
-
{% if challenge %}
|
|
212
|
-
{% if challenge.method == "passkey" or challenge.method == "passkey_register" %}
|
|
213
|
-
{% assign ceremony = "authenticate" %}
|
|
214
|
-
{% assign submit_method = challenge.method %}
|
|
215
|
-
{% if challenge.method == "passkey_register" or challenge.options.user %}
|
|
216
|
-
{% assign ceremony = "register" %}
|
|
217
|
-
{% assign submit_method = "passkey_register" %}
|
|
218
|
-
{% endif %}
|
|
219
|
-
<zl-passkey
|
|
220
|
-
ceremony="{{ ceremony }}"
|
|
221
|
-
method="{{ submit_method }}"
|
|
222
|
-
challenge-id="{{ challenge.challenge_id }}"
|
|
223
|
-
options='{{ challenge.options | json }}'
|
|
224
|
-
pending-label="{{ 'passkey.pending.status' | t }}"
|
|
225
|
-
cancel-label="{{ 'action.cancel' | t }}"
|
|
226
|
-
></zl-passkey>
|
|
227
|
-
{% endif %}
|
|
228
|
-
{% endif %}
|
|
229
|
-
|
|
230
|
-
{% mandatory_gates %}
|
|
231
|
-
</zl-card>
|
|
232
|
-
{% comment %} The orchestrator swaps this for the trustmark, so it sits with
|
|
233
|
-
the card rather than under the seam between the panes. Removing it falls
|
|
234
|
-
back to the page-shell footer. {% endcomment %}
|
|
235
|
-
<div data-zl-attribution-anchor></div>
|
|
236
|
-
</section>
|
|
237
|
-
</div>
|
|
238
|
-
</zl-page-shell>
|
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
<zl-page-shell data-zl-template-root>
|
|
2
|
-
<div class="zl-split">
|
|
3
|
-
<aside class="zl-split__brand">
|
|
4
|
-
{% if branding.logo_url %}
|
|
5
|
-
<img class="zl-split__logo" src="{{ branding.logo_url }}" alt="" />
|
|
6
|
-
{% endif %}
|
|
7
|
-
{% if branding.hero_url %}
|
|
8
|
-
<img class="zl-split__hero" src="{{ branding.hero_url }}" alt="" />
|
|
9
|
-
{% endif %}
|
|
10
|
-
{% unless branding.logo_url or branding.hero_url %}
|
|
11
|
-
{% comment %} Until branding.json names an asset, a decorative panel
|
|
12
|
-
keeps the split composition readable. {% endcomment %}
|
|
13
|
-
<div class="zl-split__placeholder" aria-hidden="true"></div>
|
|
14
|
-
{% endunless %}
|
|
15
|
-
</aside>
|
|
16
|
-
<section class="zl-split__form">
|
|
17
|
-
{% if branding.logo_url %}
|
|
18
|
-
<img class="zl-split__compact" src="{{ branding.logo_url }}" alt="" />
|
|
19
|
-
{% elsif branding.hero_url %}
|
|
20
|
-
<img class="zl-split__compact zl-split__compact--hero" src="{{ branding.hero_url }}" alt="" />
|
|
21
|
-
{% endif %}
|
|
22
|
-
<zl-card>
|
|
23
|
-
<h1 slot="header" class="zl-card-title">{{ step.texts.title_key | t: identity.display_name }}</h1>
|
|
24
|
-
{% if step.texts.description_key %}
|
|
25
|
-
{% assign card_subtitle = step.texts.description_key | t: identity.display_name %}
|
|
26
|
-
{% if card_subtitle != "" %}
|
|
27
|
-
<p slot="header" class="zl-card-subtitle">{{ card_subtitle }}</p>
|
|
28
|
-
{% endif %}
|
|
29
|
-
{% endif %}
|
|
30
|
-
|
|
31
|
-
{% assign recover = actions | where: "name", "recover" | first %}
|
|
32
|
-
{% assign password_field = fields | where: "type", "password" | first %}
|
|
33
|
-
<div class="zl-field-group">
|
|
34
|
-
{% for f in fields %}
|
|
35
|
-
{% assign field_placeholder = f.text_key | fieldPlaceholder %}
|
|
36
|
-
{% assign field_help = f.text_key | fieldHelp %}
|
|
37
|
-
{% assign field_err = f.name | fieldError: errors %}
|
|
38
|
-
{% case f.type %}
|
|
39
|
-
{% when 'checkbox' %}
|
|
40
|
-
<zl-checkbox
|
|
41
|
-
name="{{ f.name }}"
|
|
42
|
-
data-testid="zitadel-field-{{ f.name | testid }}"
|
|
43
|
-
label="{{ f.text_key | t }}"
|
|
44
|
-
value="true"
|
|
45
|
-
{% if f.value %}checked{% endif %}
|
|
46
|
-
{% if field_err != "" %}invalid error="{{ field_err }}"{% endif %}
|
|
47
|
-
></zl-checkbox>
|
|
48
|
-
{% when 'select' %}
|
|
49
|
-
<zl-select
|
|
50
|
-
name="{{ f.name }}"
|
|
51
|
-
data-testid="zitadel-field-{{ f.name | testid }}"
|
|
52
|
-
label="{{ f.text_key | t }}"
|
|
53
|
-
value="{{ f.value }}"
|
|
54
|
-
options='{{ f.validation.enum | selectOptions | json }}'
|
|
55
|
-
{% if f.required %}required{% endif %}
|
|
56
|
-
{% if field_placeholder != "" %}placeholder="{{ field_placeholder }}"{% endif %}
|
|
57
|
-
{% if field_err != "" %}invalid error="{{ field_err }}"{% endif %}
|
|
58
|
-
></zl-select>
|
|
59
|
-
{% else %}
|
|
60
|
-
{% assign autocomplete_val = '' %}
|
|
61
|
-
{% if f.name == 'email' %}
|
|
62
|
-
{% assign autocomplete_val = 'email' %}
|
|
63
|
-
{% elsif f.type == 'password' and step.name contains 'register' %}
|
|
64
|
-
{% assign autocomplete_val = 'new-password' %}
|
|
65
|
-
{% elsif f.type == 'password' %}
|
|
66
|
-
{% assign autocomplete_val = 'current-password' %}
|
|
67
|
-
{% endif %}
|
|
68
|
-
<zl-field
|
|
69
|
-
name="{{ f.name }}"
|
|
70
|
-
data-testid="zitadel-field-{{ f.name | testid }}"
|
|
71
|
-
label="{{ f.text_key | t }}"
|
|
72
|
-
type="{{ f.type }}"
|
|
73
|
-
value="{{ f.value }}"
|
|
74
|
-
{% if autocomplete_val != '' %}autocomplete="{{ autocomplete_val }}"{% endif %}
|
|
75
|
-
{% if f.required %}required{% endif %}
|
|
76
|
-
{% if field_placeholder != "" %}placeholder="{{ field_placeholder }}"{% endif %}
|
|
77
|
-
{% if field_err != "" %}invalid error="{{ field_err }}"{% endif %}
|
|
78
|
-
{% if recover and f.type == 'password' %}forgot-password-href="#" forgot-password-action="{{ recover.name }}" forgot-password-label="{{ recover.text_key | t }}"{% endif %}
|
|
79
|
-
>
|
|
80
|
-
{% if field_help != "" %}
|
|
81
|
-
<span slot="help">{{ field_help }}</span>
|
|
82
|
-
{% endif %}
|
|
83
|
-
</zl-field>
|
|
84
|
-
{% endcase %}
|
|
85
|
-
{% endfor %}
|
|
86
|
-
|
|
87
|
-
{% if errors and errors.size > 0 %}
|
|
88
|
-
{% for err in errors %}
|
|
89
|
-
{% if err | formLevelError %}
|
|
90
|
-
{% assign alert_heading = err.text_key | alertHeading %}
|
|
91
|
-
{% assign alert_body = err.text_key | alertBody %}
|
|
92
|
-
<zl-alert data-zl-step-error{% if alert_heading != "" %} heading="{{ alert_heading | t }}"{% endif %}>
|
|
93
|
-
{% if alert_body != "" %}{{ alert_body | t }}{% elsif err.text_key %}{{ err.text_key | t }}{% else %}{{ err.message }}{% endif %}
|
|
94
|
-
</zl-alert>
|
|
95
|
-
{% endif %}
|
|
96
|
-
{% endfor %}
|
|
97
|
-
{% endif %}
|
|
98
|
-
</div>
|
|
99
|
-
|
|
100
|
-
<div class="zl-card-actions">
|
|
101
|
-
{% comment %}
|
|
102
|
-
A step can offer recovery without asking for a password (an identifier-only
|
|
103
|
-
screen, say). With no label row to sit on, the affordance keeps its own row
|
|
104
|
-
rather than disappearing.
|
|
105
|
-
{% endcomment %}
|
|
106
|
-
{% if recover and password_field == nil %}
|
|
107
|
-
<p class="zl-card-forgot">
|
|
108
|
-
<a href="#" class="zl-card-forgot__link" data-action="recover">{{ recover.text_key | t }}</a>
|
|
109
|
-
</p>
|
|
110
|
-
{% endif %}
|
|
111
|
-
|
|
112
|
-
{% for a in actions %}
|
|
113
|
-
{% if a.primary %}
|
|
114
|
-
<zl-button
|
|
115
|
-
hierarchy="primary"
|
|
116
|
-
size="medium"
|
|
117
|
-
type="submit"
|
|
118
|
-
block
|
|
119
|
-
action="{{ a.name }}"
|
|
120
|
-
data-testid="zitadel-action-{{ a.name }}"
|
|
121
|
-
label="{{ a.text_key | t }}"
|
|
122
|
-
{% if loading %}loading{% endif %}
|
|
123
|
-
></zl-button>
|
|
124
|
-
{% endif %}
|
|
125
|
-
{% endfor %}
|
|
126
|
-
|
|
127
|
-
{% for a in actions %}
|
|
128
|
-
{% unless a.primary or a.kind == 'back' or a.name == 'passkey' or a.name == 'register' or a.name == 'sign_in' or a.name == 'recover' %}
|
|
129
|
-
<zl-button
|
|
130
|
-
hierarchy="secondary"
|
|
131
|
-
size="medium"
|
|
132
|
-
type="button"
|
|
133
|
-
block
|
|
134
|
-
action="{{ a.name }}"
|
|
135
|
-
data-testid="zitadel-action-{{ a.name }}"
|
|
136
|
-
label="{{ a.text_key | t }}"
|
|
137
|
-
></zl-button>
|
|
138
|
-
{% endunless %}
|
|
139
|
-
{% endfor %}
|
|
140
|
-
|
|
141
|
-
{% assign passkey = actions | where: "name", "passkey" | first %}
|
|
142
|
-
{% if passkey %}
|
|
143
|
-
{% unless passkey.primary %}
|
|
144
|
-
<zl-button
|
|
145
|
-
hierarchy="secondary"
|
|
146
|
-
size="medium"
|
|
147
|
-
block
|
|
148
|
-
action="passkey"
|
|
149
|
-
data-testid="zitadel-action-passkey"
|
|
150
|
-
label="{{ passkey.text_key | t }}"
|
|
151
|
-
></zl-button>
|
|
152
|
-
{% endunless %}
|
|
153
|
-
{% endif %}
|
|
154
|
-
|
|
155
|
-
{% assign register = actions | where: "name", "register" | first %}
|
|
156
|
-
{% if register %}
|
|
157
|
-
<p class="zl-card-nav">
|
|
158
|
-
{{ 'identifier.action.register.lead' | t }}<a href="#" class="zl-card-nav__link" data-action="register" data-testid="zitadel-action-register-link">{{ 'identifier.action.register.link' | t }}</a>
|
|
159
|
-
</p>
|
|
160
|
-
{% endif %}
|
|
161
|
-
|
|
162
|
-
{% assign sign_in = actions | where: "name", "sign_in" | first %}
|
|
163
|
-
{% if sign_in %}
|
|
164
|
-
<p class="zl-card-nav">
|
|
165
|
-
{{ 'register.action.sign_in.lead' | t }}<a href="#" class="zl-card-nav__link" data-action="sign_in" data-testid="zitadel-action-sign_in-link">{{ 'register.action.sign_in.link' | t }}</a>
|
|
166
|
-
</p>
|
|
167
|
-
{% endif %}
|
|
168
|
-
</div>
|
|
169
|
-
|
|
170
|
-
{% if challenge %}
|
|
171
|
-
{% if challenge.method == "passkey" or challenge.method == "passkey_register" %}
|
|
172
|
-
{% assign ceremony = "authenticate" %}
|
|
173
|
-
{% assign submit_method = challenge.method %}
|
|
174
|
-
{% if challenge.method == "passkey_register" or challenge.options.user %}
|
|
175
|
-
{% assign ceremony = "register" %}
|
|
176
|
-
{% assign submit_method = "passkey_register" %}
|
|
177
|
-
{% endif %}
|
|
178
|
-
<zl-passkey
|
|
179
|
-
ceremony="{{ ceremony }}"
|
|
180
|
-
method="{{ submit_method }}"
|
|
181
|
-
challenge-id="{{ challenge.challenge_id }}"
|
|
182
|
-
options='{{ challenge.options | json }}'
|
|
183
|
-
pending-label="{{ 'passkey.pending.status' | t }}"
|
|
184
|
-
cancel-label="{{ 'action.cancel' | t }}"
|
|
185
|
-
></zl-passkey>
|
|
186
|
-
{% endif %}
|
|
187
|
-
{% endif %}
|
|
188
|
-
|
|
189
|
-
{% mandatory_gates %}
|
|
190
|
-
</zl-card>
|
|
191
|
-
{% comment %} The orchestrator swaps this for the trustmark, so it sits with
|
|
192
|
-
the card rather than under the seam between the panes. Removing it falls
|
|
193
|
-
back to the page-shell footer. {% endcomment %}
|
|
194
|
-
<div data-zl-attribution-anchor></div>
|
|
195
|
-
</section>
|
|
196
|
-
</div>
|
|
197
|
-
</zl-page-shell>
|
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
<zl-page-shell data-zl-template-root>
|
|
2
|
-
<div class="zl-split zl-split--right">
|
|
3
|
-
<aside class="zl-split__brand">
|
|
4
|
-
{% if branding.logo_url %}
|
|
5
|
-
<img class="zl-split__logo" src="{{ branding.logo_url }}" alt="" />
|
|
6
|
-
{% endif %}
|
|
7
|
-
{% if branding.hero_url %}
|
|
8
|
-
<img class="zl-split__hero" src="{{ branding.hero_url }}" alt="" />
|
|
9
|
-
{% endif %}
|
|
10
|
-
{% unless branding.logo_url or branding.hero_url %}
|
|
11
|
-
{% comment %} Until branding.json names an asset, a decorative panel
|
|
12
|
-
keeps the split composition readable. {% endcomment %}
|
|
13
|
-
<div class="zl-split__placeholder" aria-hidden="true"></div>
|
|
14
|
-
{% endunless %}
|
|
15
|
-
</aside>
|
|
16
|
-
<section class="zl-split__form">
|
|
17
|
-
{% if branding.logo_url %}
|
|
18
|
-
<img class="zl-split__compact" src="{{ branding.logo_url }}" alt="" />
|
|
19
|
-
{% elsif branding.hero_url %}
|
|
20
|
-
<img class="zl-split__compact zl-split__compact--hero" src="{{ branding.hero_url }}" alt="" />
|
|
21
|
-
{% endif %}
|
|
22
|
-
<zl-card>
|
|
23
|
-
<h1 slot="header" class="zl-card-title">{{ step.texts.title_key | t: identity.display_name }}</h1>
|
|
24
|
-
{% if step.texts.description_key %}
|
|
25
|
-
{% assign card_subtitle = step.texts.description_key | t: identity.display_name %}
|
|
26
|
-
{% if card_subtitle != "" %}
|
|
27
|
-
<p slot="header" class="zl-card-subtitle">{{ card_subtitle }}</p>
|
|
28
|
-
{% endif %}
|
|
29
|
-
{% endif %}
|
|
30
|
-
|
|
31
|
-
{% assign recover = actions | where: "name", "recover" | first %}
|
|
32
|
-
{% assign password_field = fields | where: "type", "password" | first %}
|
|
33
|
-
<div class="zl-field-group">
|
|
34
|
-
{% for f in fields %}
|
|
35
|
-
{% assign field_placeholder = f.text_key | fieldPlaceholder %}
|
|
36
|
-
{% assign field_help = f.text_key | fieldHelp %}
|
|
37
|
-
{% assign field_err = f.name | fieldError: errors %}
|
|
38
|
-
{% case f.type %}
|
|
39
|
-
{% when 'checkbox' %}
|
|
40
|
-
<zl-checkbox
|
|
41
|
-
name="{{ f.name }}"
|
|
42
|
-
data-testid="zitadel-field-{{ f.name | testid }}"
|
|
43
|
-
label="{{ f.text_key | t }}"
|
|
44
|
-
value="true"
|
|
45
|
-
{% if f.value %}checked{% endif %}
|
|
46
|
-
{% if field_err != "" %}invalid error="{{ field_err }}"{% endif %}
|
|
47
|
-
></zl-checkbox>
|
|
48
|
-
{% when 'select' %}
|
|
49
|
-
<zl-select
|
|
50
|
-
name="{{ f.name }}"
|
|
51
|
-
data-testid="zitadel-field-{{ f.name | testid }}"
|
|
52
|
-
label="{{ f.text_key | t }}"
|
|
53
|
-
value="{{ f.value }}"
|
|
54
|
-
options='{{ f.validation.enum | selectOptions | json }}'
|
|
55
|
-
{% if f.required %}required{% endif %}
|
|
56
|
-
{% if field_placeholder != "" %}placeholder="{{ field_placeholder }}"{% endif %}
|
|
57
|
-
{% if field_err != "" %}invalid error="{{ field_err }}"{% endif %}
|
|
58
|
-
></zl-select>
|
|
59
|
-
{% else %}
|
|
60
|
-
{% assign autocomplete_val = '' %}
|
|
61
|
-
{% if f.name == 'email' %}
|
|
62
|
-
{% assign autocomplete_val = 'email' %}
|
|
63
|
-
{% elsif f.type == 'password' and step.name contains 'register' %}
|
|
64
|
-
{% assign autocomplete_val = 'new-password' %}
|
|
65
|
-
{% elsif f.type == 'password' %}
|
|
66
|
-
{% assign autocomplete_val = 'current-password' %}
|
|
67
|
-
{% endif %}
|
|
68
|
-
<zl-field
|
|
69
|
-
name="{{ f.name }}"
|
|
70
|
-
data-testid="zitadel-field-{{ f.name | testid }}"
|
|
71
|
-
label="{{ f.text_key | t }}"
|
|
72
|
-
type="{{ f.type }}"
|
|
73
|
-
value="{{ f.value }}"
|
|
74
|
-
{% if autocomplete_val != '' %}autocomplete="{{ autocomplete_val }}"{% endif %}
|
|
75
|
-
{% if f.required %}required{% endif %}
|
|
76
|
-
{% if field_placeholder != "" %}placeholder="{{ field_placeholder }}"{% endif %}
|
|
77
|
-
{% if field_err != "" %}invalid error="{{ field_err }}"{% endif %}
|
|
78
|
-
{% if recover and f.type == 'password' %}forgot-password-href="#" forgot-password-action="{{ recover.name }}" forgot-password-label="{{ recover.text_key | t }}"{% endif %}
|
|
79
|
-
>
|
|
80
|
-
{% if field_help != "" %}
|
|
81
|
-
<span slot="help">{{ field_help }}</span>
|
|
82
|
-
{% endif %}
|
|
83
|
-
</zl-field>
|
|
84
|
-
{% endcase %}
|
|
85
|
-
{% endfor %}
|
|
86
|
-
|
|
87
|
-
{% if errors and errors.size > 0 %}
|
|
88
|
-
{% for err in errors %}
|
|
89
|
-
{% if err | formLevelError %}
|
|
90
|
-
{% assign alert_heading = err.text_key | alertHeading %}
|
|
91
|
-
{% assign alert_body = err.text_key | alertBody %}
|
|
92
|
-
<zl-alert data-zl-step-error{% if alert_heading != "" %} heading="{{ alert_heading | t }}"{% endif %}>
|
|
93
|
-
{% if alert_body != "" %}{{ alert_body | t }}{% elsif err.text_key %}{{ err.text_key | t }}{% else %}{{ err.message }}{% endif %}
|
|
94
|
-
</zl-alert>
|
|
95
|
-
{% endif %}
|
|
96
|
-
{% endfor %}
|
|
97
|
-
{% endif %}
|
|
98
|
-
</div>
|
|
99
|
-
|
|
100
|
-
<div class="zl-card-actions">
|
|
101
|
-
{% comment %}
|
|
102
|
-
A step can offer recovery without asking for a password (an identifier-only
|
|
103
|
-
screen, say). With no label row to sit on, the affordance keeps its own row
|
|
104
|
-
rather than disappearing.
|
|
105
|
-
{% endcomment %}
|
|
106
|
-
{% if recover and password_field == nil %}
|
|
107
|
-
<p class="zl-card-forgot">
|
|
108
|
-
<a href="#" class="zl-card-forgot__link" data-action="recover">{{ recover.text_key | t }}</a>
|
|
109
|
-
</p>
|
|
110
|
-
{% endif %}
|
|
111
|
-
|
|
112
|
-
{% for a in actions %}
|
|
113
|
-
{% if a.primary %}
|
|
114
|
-
<zl-button
|
|
115
|
-
hierarchy="primary"
|
|
116
|
-
size="medium"
|
|
117
|
-
type="submit"
|
|
118
|
-
block
|
|
119
|
-
action="{{ a.name }}"
|
|
120
|
-
data-testid="zitadel-action-{{ a.name }}"
|
|
121
|
-
label="{{ a.text_key | t }}"
|
|
122
|
-
{% if loading %}loading{% endif %}
|
|
123
|
-
></zl-button>
|
|
124
|
-
{% endif %}
|
|
125
|
-
{% endfor %}
|
|
126
|
-
|
|
127
|
-
{% for a in actions %}
|
|
128
|
-
{% unless a.primary or a.kind == 'back' or a.name == 'passkey' or a.name == 'register' or a.name == 'sign_in' or a.name == 'recover' %}
|
|
129
|
-
<zl-button
|
|
130
|
-
hierarchy="secondary"
|
|
131
|
-
size="medium"
|
|
132
|
-
type="button"
|
|
133
|
-
block
|
|
134
|
-
action="{{ a.name }}"
|
|
135
|
-
data-testid="zitadel-action-{{ a.name }}"
|
|
136
|
-
label="{{ a.text_key | t }}"
|
|
137
|
-
></zl-button>
|
|
138
|
-
{% endunless %}
|
|
139
|
-
{% endfor %}
|
|
140
|
-
|
|
141
|
-
{% assign passkey = actions | where: "name", "passkey" | first %}
|
|
142
|
-
{% if passkey %}
|
|
143
|
-
{% unless passkey.primary %}
|
|
144
|
-
<zl-button
|
|
145
|
-
hierarchy="secondary"
|
|
146
|
-
size="medium"
|
|
147
|
-
block
|
|
148
|
-
action="passkey"
|
|
149
|
-
data-testid="zitadel-action-passkey"
|
|
150
|
-
label="{{ passkey.text_key | t }}"
|
|
151
|
-
></zl-button>
|
|
152
|
-
{% endunless %}
|
|
153
|
-
{% endif %}
|
|
154
|
-
|
|
155
|
-
{% assign register = actions | where: "name", "register" | first %}
|
|
156
|
-
{% if register %}
|
|
157
|
-
<p class="zl-card-nav">
|
|
158
|
-
{{ 'identifier.action.register.lead' | t }}<a href="#" class="zl-card-nav__link" data-action="register" data-testid="zitadel-action-register-link">{{ 'identifier.action.register.link' | t }}</a>
|
|
159
|
-
</p>
|
|
160
|
-
{% endif %}
|
|
161
|
-
|
|
162
|
-
{% assign sign_in = actions | where: "name", "sign_in" | first %}
|
|
163
|
-
{% if sign_in %}
|
|
164
|
-
<p class="zl-card-nav">
|
|
165
|
-
{{ 'register.action.sign_in.lead' | t }}<a href="#" class="zl-card-nav__link" data-action="sign_in" data-testid="zitadel-action-sign_in-link">{{ 'register.action.sign_in.link' | t }}</a>
|
|
166
|
-
</p>
|
|
167
|
-
{% endif %}
|
|
168
|
-
</div>
|
|
169
|
-
|
|
170
|
-
{% if challenge %}
|
|
171
|
-
{% if challenge.method == "passkey" or challenge.method == "passkey_register" %}
|
|
172
|
-
{% assign ceremony = "authenticate" %}
|
|
173
|
-
{% assign submit_method = challenge.method %}
|
|
174
|
-
{% if challenge.method == "passkey_register" or challenge.options.user %}
|
|
175
|
-
{% assign ceremony = "register" %}
|
|
176
|
-
{% assign submit_method = "passkey_register" %}
|
|
177
|
-
{% endif %}
|
|
178
|
-
<zl-passkey
|
|
179
|
-
ceremony="{{ ceremony }}"
|
|
180
|
-
method="{{ submit_method }}"
|
|
181
|
-
challenge-id="{{ challenge.challenge_id }}"
|
|
182
|
-
options='{{ challenge.options | json }}'
|
|
183
|
-
pending-label="{{ 'passkey.pending.status' | t }}"
|
|
184
|
-
cancel-label="{{ 'action.cancel' | t }}"
|
|
185
|
-
></zl-passkey>
|
|
186
|
-
{% endif %}
|
|
187
|
-
{% endif %}
|
|
188
|
-
|
|
189
|
-
{% mandatory_gates %}
|
|
190
|
-
</zl-card>
|
|
191
|
-
{% comment %} The orchestrator swaps this for the trustmark, so it sits with
|
|
192
|
-
the card rather than under the seam between the panes. Removing it falls
|
|
193
|
-
back to the page-shell footer. {% endcomment %}
|
|
194
|
-
<div data-zl-attribution-anchor></div>
|
|
195
|
-
</section>
|
|
196
|
-
</div>
|
|
197
|
-
</zl-page-shell>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"defaults-BxGCGdqS.d.mts","names":[],"sources":["../src/readmes.ts","../src/defaults.ts"],"mappings":";;;;;;AAQA;;iBAAgB,oBAAA,CAAA;;;AAQhB;;iBAAgB,kBAAA,CAAA;;;AAShB;;;iBAAgB,qBAAA,CAAA;;;cCFH,2BAAA;AAAA,cACA,uBAAA;AAAA,cACA,0BAAA;AAAA,cACA,wBAAA;AAAA,cACA,4BAAA;AAAA,cACA,8BAAA;ADZb;;;;;AASA;;AATA,cCqBa,aAAA;AAAA,KAED,WAAA,WAAsB,aAAA;AAAA,cAErB,oBAAA,EAAsB,WAAA;;;;AAlBnC;;;;cAkDa,gBAAA;AAAA,KAED,cAAA,WAAyB,gBAAA;AAAA,cAExB,uBAAA,EAAyB,cAAA;AAAA,KAW1B,qBAAA;EAhEwB,8EAkElC,QAAA;IACE,MAAA,wBAlEmC;IAoEnC,eAAA;MAAmB,KAAA;IAAA;EAAA,GAnEc;EAsEnC,QAAA;AAAA;;AArEF;;;;iBA6EgB,wBAAA,CACd,MAAA,YACC,qBAAA;AA9EH;;;;;AASA;;;AATA,cAiHa,eAAA;AAAA,KAED,YAAA,WAAuB,eAAA;AAAA,cAEtB,sBAAA,EAAwB,YAAA;AAAA,KA0GzB,0BAAA;EACV,iBAAA;EACA,aAAA,WAtN6C;EAwN7C,MAAA,WAtN+D;EAwN/D,OAAA;AAAA;AAAA,iBAGc,yBAAA,CACd,iBAAA;AAAA,iBAKc,yBAAA,CACd,OAAA,GAAS,0BAAA,GACR,gBAAA;AAAA,iBAca,mBAAA,CACd,OAAA,GAAS,0BAAA,GACR,sCAAA"}
|