masks-server 0.7.0 → 0.9.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.
- checksums.yaml +4 -4
- data/app/controllers/concerns/masks/server/client_authentication.rb +1 -1
- data/app/controllers/concerns/masks/server/resource_token.rb +12 -3
- data/app/controllers/masks/server/application_controller.rb +8 -6
- data/app/controllers/masks/server/authorize_controller.rb +1 -1
- data/app/controllers/masks/server/enrollments_controller.rb +66 -0
- data/app/controllers/masks/server/introspections_controller.rb +2 -2
- data/app/controllers/masks/server/logins_controller.rb +2 -1
- data/app/controllers/masks/server/registrations_controller.rb +40 -2
- data/app/controllers/masks/server/scim/metadata_controller.rb +1 -1
- data/app/controllers/masks/server/tokens_controller.rb +1 -1
- data/app/graphql/masks/server/manage/mutations/add_app.rb +1 -1
- data/app/graphql/masks/server/manage/types/client_type.rb +8 -0
- data/app/graphql/masks/server/manage/types/query_type.rb +6 -1
- data/app/helpers/masks/server/account_helper.rb +1 -1
- data/app/helpers/masks/server/application_helper.rb +0 -1
- data/app/helpers/masks/server/scopes_helper.rb +28 -0
- data/app/jobs/masks/server/cleanup_job.rb +1 -0
- data/app/models/masks/server/actor.rb +3 -3
- data/app/models/masks/server/client.rb +127 -7
- data/app/models/masks/server/client_keys.rb +6 -1
- data/app/models/masks/server/enrollment_token.rb +54 -0
- data/app/models/masks/server/event.rb +3 -0
- data/app/models/masks/server/handshake.rb +12 -6
- data/app/models/masks/server/issuer.rb +1 -0
- data/app/models/masks/server/login.rb +3 -6
- data/app/models/masks/server/namespace.rb +6 -3
- data/app/models/masks/server/pending_handshake.rb +2 -1
- data/app/models/masks/server/replay.rb +22 -4
- data/app/models/masks/server/session.rb +7 -5
- data/app/models/masks/server/token.rb +1 -0
- data/app/policies/masks/server/exchange_policy.rb +1 -1
- data/app/policies/masks/server/grant_checks.rb +1 -1
- data/app/views/layouts/masks/server/manage.html.erb +2 -2
- data/app/views/masks/server/account/_info.html.erb +1 -1
- data/app/views/masks/server/account/_organizations.html.erb +4 -4
- data/app/views/masks/server/application/_actor.html.erb +27 -0
- data/app/views/masks/server/handshakes/refused.html.erb +1 -1
- data/app/views/masks/server/handshakes/show.html.erb +129 -59
- data/app/views/masks/server/logins/_choose_organization.html.erb +1 -1
- data/app/views/masks/server/logins/_consent.html.erb +1 -1
- data/app/views/masks/server/sessions/confirm.html.erb +1 -1
- data/config/locales/de/account.yml +3 -3
- data/config/locales/de/application.yml +1 -1
- data/config/locales/de/events.yml +10 -7
- data/config/locales/de/flashes.yml +2 -2
- data/config/locales/de/handshakes.yml +33 -14
- data/config/locales/de/mailers.yml +1 -1
- data/config/locales/de/manage/activity.yml +2 -2
- data/config/locales/de/manage/actor.yml +41 -23
- data/config/locales/de/manage/actors.yml +16 -15
- data/config/locales/de/manage/api.yml +1 -1
- data/config/locales/de/manage/app.yml +6 -6
- data/config/locales/de/manage/client.yml +45 -45
- data/config/locales/de/manage/clients.yml +28 -32
- data/config/locales/de/manage/connections.yml +2 -2
- data/config/locales/de/manage/consents.yml +2 -2
- data/config/locales/de/manage/device.yml +7 -7
- data/config/locales/de/manage/devices.yml +18 -18
- data/config/locales/de/manage/directory.yml +1 -1
- data/config/locales/de/manage/domains.yml +6 -6
- data/config/locales/de/manage/emails.yml +4 -4
- data/config/locales/de/manage/events.yml +3 -0
- data/config/locales/de/manage/groups.yml +7 -7
- data/config/locales/de/manage/ldap.yml +8 -8
- data/config/locales/de/manage/namespaces.yml +1 -1
- data/config/locales/de/manage/organization.yml +15 -8
- data/config/locales/de/manage/organizations.yml +3 -3
- data/config/locales/de/manage/policies.yml +6 -6
- data/config/locales/de/manage/policy_rules.yml +1 -1
- data/config/locales/de/manage/presence.yml +6 -6
- data/config/locales/de/manage/providers.yml +70 -48
- data/config/locales/de/manage/provisioning.yml +4 -4
- data/config/locales/de/manage/senders.yml +1 -1
- data/config/locales/de/manage/settings.yml +37 -26
- data/config/locales/de/manage/settings_shell.yml +2 -2
- data/config/locales/de/refusals.yml +5 -5
- data/config/locales/en/account.yml +5 -5
- data/config/locales/en/application.yml +1 -1
- data/config/locales/en/events.yml +9 -6
- data/config/locales/en/flashes.yml +3 -3
- data/config/locales/en/handshakes.yml +33 -14
- data/config/locales/en/logins.yml +2 -2
- data/config/locales/en/manage/actor.yml +32 -14
- data/config/locales/en/manage/actors.yml +16 -15
- data/config/locales/en/manage/app.yml +5 -5
- data/config/locales/en/manage/client.yml +9 -9
- data/config/locales/en/manage/clients.yml +8 -12
- data/config/locales/en/manage/connections.yml +1 -1
- data/config/locales/en/manage/consents.yml +1 -1
- data/config/locales/en/manage/device.yml +1 -1
- data/config/locales/en/manage/devices.yml +1 -1
- data/config/locales/en/manage/directory.yml +1 -1
- data/config/locales/en/manage/domains.yml +6 -6
- data/config/locales/en/manage/emails.yml +4 -4
- data/config/locales/en/manage/events.yml +3 -0
- data/config/locales/en/manage/groups.yml +7 -7
- data/config/locales/en/manage/ldap.yml +8 -8
- data/config/locales/en/manage/messages.yml +1 -1
- data/config/locales/en/manage/namespaces.yml +1 -1
- data/config/locales/en/manage/organization.yml +16 -9
- data/config/locales/en/manage/organizations.yml +3 -3
- data/config/locales/en/manage/policies.yml +6 -6
- data/config/locales/en/manage/policy_rules.yml +2 -2
- data/config/locales/en/manage/presence.yml +1 -1
- data/config/locales/en/manage/providers.yml +70 -48
- data/config/locales/en/manage/provisioning.yml +4 -4
- data/config/locales/en/manage/senders.yml +2 -2
- data/config/locales/en/manage/settings.yml +34 -23
- data/config/locales/es/account.yml +3 -3
- data/config/locales/es/application.yml +2 -2
- data/config/locales/es/events.yml +9 -6
- data/config/locales/es/flashes.yml +4 -4
- data/config/locales/es/handshakes.yml +33 -14
- data/config/locales/es/logins.yml +12 -12
- data/config/locales/es/mailers.yml +7 -7
- data/config/locales/es/manage/activity.yml +2 -2
- data/config/locales/es/manage/actor.yml +33 -15
- data/config/locales/es/manage/actors.yml +17 -16
- data/config/locales/es/manage/api.yml +1 -1
- data/config/locales/es/manage/app.yml +6 -6
- data/config/locales/es/manage/client.yml +30 -30
- data/config/locales/es/manage/clients.yml +22 -26
- data/config/locales/es/manage/connections.yml +1 -1
- data/config/locales/es/manage/consents.yml +1 -1
- data/config/locales/es/manage/device.yml +1 -1
- data/config/locales/es/manage/directory.yml +1 -1
- data/config/locales/es/manage/domains.yml +5 -5
- data/config/locales/es/manage/emails.yml +7 -7
- data/config/locales/es/manage/events.yml +3 -0
- data/config/locales/es/manage/groups.yml +7 -7
- data/config/locales/es/manage/ldap.yml +8 -8
- data/config/locales/es/manage/namespaces.yml +1 -1
- data/config/locales/es/manage/organization.yml +16 -9
- data/config/locales/es/manage/organizations.yml +3 -3
- data/config/locales/es/manage/policies.yml +8 -8
- data/config/locales/es/manage/policy_rules.yml +2 -2
- data/config/locales/es/manage/providers.yml +70 -48
- data/config/locales/es/manage/provisioning.yml +4 -4
- data/config/locales/es/manage/senders.yml +1 -1
- data/config/locales/es/manage/settings.yml +38 -27
- data/config/locales/es/manage/settings_shell.yml +2 -2
- data/config/locales/es/refusals.yml +3 -3
- data/config/locales/fr/account.yml +2 -2
- data/config/locales/fr/application.yml +1 -1
- data/config/locales/fr/events.yml +8 -5
- data/config/locales/fr/flashes.yml +1 -1
- data/config/locales/fr/handshakes.yml +33 -14
- data/config/locales/fr/manage/activity.yml +4 -4
- data/config/locales/fr/manage/actor.yml +43 -25
- data/config/locales/fr/manage/actors.yml +22 -21
- data/config/locales/fr/manage/api.yml +1 -1
- data/config/locales/fr/manage/app.yml +7 -7
- data/config/locales/fr/manage/client.yml +50 -50
- data/config/locales/fr/manage/clients.yml +28 -32
- data/config/locales/fr/manage/connections.yml +2 -2
- data/config/locales/fr/manage/consents.yml +1 -1
- data/config/locales/fr/manage/device.yml +1 -1
- data/config/locales/fr/manage/directory.yml +1 -1
- data/config/locales/fr/manage/domains.yml +6 -6
- data/config/locales/fr/manage/emails.yml +5 -5
- data/config/locales/fr/manage/events.yml +3 -0
- data/config/locales/fr/manage/groups.yml +7 -7
- data/config/locales/fr/manage/ldap.yml +8 -8
- data/config/locales/fr/manage/namespaces.yml +1 -1
- data/config/locales/fr/manage/organization.yml +15 -8
- data/config/locales/fr/manage/organizations.yml +3 -3
- data/config/locales/fr/manage/policies.yml +6 -6
- data/config/locales/fr/manage/policy_rules.yml +1 -1
- data/config/locales/fr/manage/providers.yml +70 -48
- data/config/locales/fr/manage/provisioning.yml +4 -4
- data/config/locales/fr/manage/senders.yml +1 -1
- data/config/locales/fr/manage/settings.yml +38 -27
- data/config/locales/fr/manage/settings_shell.yml +2 -2
- data/config/routes.rb +2 -0
- data/config/vite.json +1 -0
- data/db/migrate/20261011190000_add_enrolled_by_to_clients.rb +5 -0
- data/db/migrate/20261012100000_create_replays.rb +23 -0
- data/db/migrate/20261013010000_add_handshake_return_to_to_clients.rb +5 -0
- data/lib/generators/masks/server/install/install_generator.rb +2 -2
- data/lib/masks/server/browser_access.rb +35 -0
- data/lib/masks/server/configuration.rb +3 -3
- data/lib/masks/server/engine.rb +1 -0
- data/lib/masks/server/schema_reference.rb +17 -4
- data/lib/masks/server.rb +1 -0
- data/public/masks-assets/.vite/manifest-assets.json +1 -0
- data/public/masks-assets/.vite/manifest.json +62 -0
- data/public/masks-assets/assets/app-B27oPUll.css +2 -0
- data/public/masks-assets/assets/console-DoyNbIw3.css +1 -0
- data/public/masks-assets/assets/handshake-DIFZPSAK.js +2 -0
- data/public/masks-assets/assets/handshake-DIFZPSAK.js.map +1 -0
- data/public/masks-assets/assets/{initial-D99AzFOd.js → initial-C1GpCiEh.js} +2 -2
- data/public/masks-assets/assets/{initial-D99AzFOd.js.map → initial-C1GpCiEh.js.map} +1 -1
- data/public/masks-assets/assets/login-C_6igRZ3.js +4 -0
- data/public/masks-assets/assets/login-C_6igRZ3.js.map +1 -0
- data/public/masks-assets/assets/manage-Dbfiy3Mj.js +567 -0
- data/public/masks-assets/assets/manage-Dbfiy3Mj.js.map +1 -0
- data/version.txt +1 -1
- metadata +21 -12
- data/app/views/masks/server/application/_person.html.erb +0 -27
- data/public/masks-assets/assets/app-olx-5PkA.css +0 -2
- data/public/masks-assets/assets/console-CiuQ3qj0.css +0 -1
- data/public/masks-assets/assets/handshake-BYhhQ_X3.js +0 -2
- data/public/masks-assets/assets/handshake-BYhhQ_X3.js.map +0 -1
- data/public/masks-assets/assets/login-CNs1UpxJ.js +0 -4
- data/public/masks-assets/assets/login-CNs1UpxJ.js.map +0 -1
- data/public/masks-assets/assets/manage-Z3GmPDNQ.js +0 -560
- data/public/masks-assets/assets/manage-Z3GmPDNQ.js.map +0 -1
|
@@ -4,8 +4,8 @@ fr:
|
|
|
4
4
|
title: "Général"
|
|
5
5
|
after_days: "Après %{days} jours"
|
|
6
6
|
counts:
|
|
7
|
-
actors: "
|
|
8
|
-
clients: "
|
|
7
|
+
actors: "Acteurs"
|
|
8
|
+
clients: "Clients"
|
|
9
9
|
organizations: "Organisations"
|
|
10
10
|
devices: "Appareils"
|
|
11
11
|
starting:
|
|
@@ -16,13 +16,13 @@ fr:
|
|
|
16
16
|
detail: "Les invitations, les réinitialisations de mot de passe et les codes de connexion sont envoyés par e-mail. En attendant, un gestionnaire transmet chaque lien d’invitation à la main."
|
|
17
17
|
action: "Ajouter un service d’e-mail"
|
|
18
18
|
client:
|
|
19
|
-
title: "
|
|
20
|
-
detail: "Enregistrez
|
|
21
|
-
action: "Ajouter
|
|
19
|
+
title: "Enregistrez votre premier client"
|
|
20
|
+
detail: "Enregistrez un client à la main, ou laissez-le se connecter lui-même par la poignée de main."
|
|
21
|
+
action: "Ajouter un client"
|
|
22
22
|
invite:
|
|
23
23
|
title: "Invitez quelqu’un"
|
|
24
|
-
detail: "Chaque
|
|
25
|
-
action: "Inviter des
|
|
24
|
+
detail: "Chaque acteur reçoit une invitation pour configurer sa propre connexion."
|
|
25
|
+
action: "Inviter des acteurs"
|
|
26
26
|
sign_ins:
|
|
27
27
|
title: "Connexions"
|
|
28
28
|
range: "Période"
|
|
@@ -34,15 +34,14 @@ fr:
|
|
|
34
34
|
all: "Toutes les organisations"
|
|
35
35
|
organization: "Organisation"
|
|
36
36
|
members: "Membres"
|
|
37
|
-
empty: "Aucune organisation pour l’instant. Ajoutez-en une pour chaque
|
|
37
|
+
empty: "Aucune organisation pour l’instant. Ajoutez-en une pour chaque entreprise cliente dont les membres se connectent ensemble, et les clients qui demandent la portée organization apprennent le rôle de chaque acteur."
|
|
38
38
|
recent:
|
|
39
|
-
worrying: "À examiner"
|
|
40
|
-
lately: "Récemment"
|
|
41
39
|
all: "Toute l’activité"
|
|
42
40
|
empty: "Rien pour l’instant."
|
|
41
|
+
title: "Activité"
|
|
43
42
|
tenant:
|
|
44
43
|
title: "Espace"
|
|
45
|
-
help: "Le nom figure en tête de chaque écran et de chaque e-mail envoyé par masks. Les
|
|
44
|
+
help: "Le nom figure en tête de chaque écran et de chaque e-mail envoyé par masks. Les clients découvrent cet espace à son émetteur, et l’API de gestion répond à sa ressource."
|
|
46
45
|
name: "Nom"
|
|
47
46
|
renamed: "Renommé."
|
|
48
47
|
subdomain: "Sous-domaine"
|
|
@@ -55,41 +54,41 @@ fr:
|
|
|
55
54
|
change_logo: "Changer le logo"
|
|
56
55
|
upload_logo: "Téléverser un logo"
|
|
57
56
|
remove: "Supprimer"
|
|
58
|
-
logo_updated: "Logo
|
|
57
|
+
logo_updated: "Logo modifié."
|
|
59
58
|
logo_removed: "Logo supprimé."
|
|
60
59
|
accent: "Couleur d’accent"
|
|
61
|
-
color_updated: "Couleur
|
|
60
|
+
color_updated: "Couleur modifiée."
|
|
62
61
|
color_reset: "Couleur réinitialisée."
|
|
63
62
|
own: "Utiliser celle de masks"
|
|
64
63
|
naming:
|
|
65
64
|
title: "Identifiant principal"
|
|
66
|
-
help: "Ce qu’
|
|
65
|
+
help: "Ce qu’un acteur saisit pour se connecter. Chaque politique doit exiger ce qui est choisi ici."
|
|
67
66
|
nickname: "Pseudo"
|
|
68
67
|
email: "E-mail"
|
|
69
68
|
either: "L’un ou l’autre"
|
|
70
|
-
updated: "Identifiant principal
|
|
69
|
+
updated: "Identifiant principal modifié."
|
|
71
70
|
policy:
|
|
72
71
|
title: "Politique par défaut"
|
|
73
|
-
help: "La politique de connexion de chaque
|
|
72
|
+
help: "La politique de connexion de chaque client qui n’en a pas. La politique intégrée propose les mots de passe, les clés d’accès et les fournisseurs, avec un second facteur facultatif."
|
|
74
73
|
built_in: "Intégrée"
|
|
75
|
-
updated: "Politique par défaut
|
|
74
|
+
updated: "Politique par défaut modifiée."
|
|
76
75
|
access:
|
|
77
76
|
title: "Qui peut se connecter"
|
|
78
77
|
help: "Navigateurs uniquement refuse toute connexion provenant de quelque chose qui ne se présente pas comme un navigateur. User agents refusés accepte des fragments, séparés par des virgules, et refuse tout user agent qui en contient un."
|
|
79
78
|
browsers_only: "Navigateurs uniquement"
|
|
80
79
|
refused_agents: "User agents refusés"
|
|
81
|
-
updated: "Règles de connexion
|
|
80
|
+
updated: "Règles de connexion modifiées."
|
|
82
81
|
risky_networks: "Réseaux à risque"
|
|
83
82
|
risky_hint: "Plages d’adresses, une par ligne, qui augmentent le score de risque d’une connexion. Une politique de connexion décide de l’effet d’un score."
|
|
84
83
|
save_networks: "Enregistrer les réseaux"
|
|
85
84
|
networks_saved: "Réseaux à risque enregistrés."
|
|
86
85
|
idle:
|
|
87
86
|
title: "Suppression automatique"
|
|
88
|
-
help: "Un
|
|
87
|
+
help: "Un acteur avec lequel personne ne se connecte et qui n’est utilisé par aucun client est suspendu, puis supprimé, après ces durées. Chaque étape est annoncée par e-mail au moins 30 jours à l’avance, et se connecter avant une suspension conserve l’acteur. Si Suspendre est défini, seuls les acteurs suspendus pour inactivité sont supprimés. Si Suspendre est sur Jamais, les acteurs inactifs sont supprimés directement. Le dernier gestionnaire et les acteurs provisionnés par un annuaire via SCIM ne sont pas concernés."
|
|
89
88
|
suspend: "Suspendre"
|
|
90
89
|
delete: "Supprimer"
|
|
91
|
-
updated: "Suppression automatique
|
|
92
|
-
delete_confirm: "Supprimer les
|
|
90
|
+
updated: "Suppression automatique modifiée."
|
|
91
|
+
delete_confirm: "Supprimer les acteurs inactifs ? Un acteur supprimé ne peut pas être restauré."
|
|
93
92
|
never: "Jamais"
|
|
94
93
|
after_90_days: "Après 90 jours"
|
|
95
94
|
after_180_days: "Après 180 jours"
|
|
@@ -98,7 +97,7 @@ fr:
|
|
|
98
97
|
after_three_years: "Après trois ans"
|
|
99
98
|
retention:
|
|
100
99
|
title: "Activité"
|
|
101
|
-
help: "Durée de conservation
|
|
100
|
+
help: "Durée de conservation de l’activité par masks. Les événements plus anciens sont supprimés chaque nuit, et une durée plus courte prend effet au passage suivant. Exportez une période depuis Activité avant de la raccourcir."
|
|
102
101
|
updated: "L’activité est conservée pour la nouvelle durée."
|
|
103
102
|
days_30: "30 jours"
|
|
104
103
|
days_90: "90 jours"
|
|
@@ -108,12 +107,12 @@ fr:
|
|
|
108
107
|
seven_years: "Sept ans"
|
|
109
108
|
registration:
|
|
110
109
|
title: "Enregistrement dynamique"
|
|
111
|
-
help: "Indique si les
|
|
110
|
+
help: "Indique si les clients peuvent s’enregistrer eux-mêmes via RFC 7591. Un client auto-enregistré n’est jamais approuvé, et avec la limite activée il ne peut demander que les portées choisies ici."
|
|
112
111
|
"off": "Désactivé"
|
|
113
112
|
"on": "Activé"
|
|
114
113
|
bounded: "Activé, limité à ces portées"
|
|
115
|
-
updated: "Enregistrement dynamique
|
|
116
|
-
ceiling_updated: "Plafond
|
|
114
|
+
updated: "Enregistrement dynamique modifié."
|
|
115
|
+
ceiling_updated: "Plafond modifié."
|
|
117
116
|
keys:
|
|
118
117
|
schedule: "Renouvellement"
|
|
119
118
|
by_hand: "Manuel"
|
|
@@ -122,7 +121,7 @@ fr:
|
|
|
122
121
|
other: "Tous les %{count} jours"
|
|
123
122
|
scheduled: "Calendrier enregistré. Une nouvelle clé est publiée un jour avant de signer."
|
|
124
123
|
title: "Clés de signature"
|
|
125
|
-
help: "Chaque jeton est signé avec la clé active, et les
|
|
124
|
+
help: "Chaque jeton est signé avec la clé active, et les clients le vérifient avec les clés publiées sur le point JWKS. Préparez une clé pour la publier un jour avant qu’elle signe, ou faites une rotation pour changer tout de suite. L’ancienne clé continue de vérifier pendant 24 heures."
|
|
126
125
|
stage: "Préparer"
|
|
127
126
|
rotate: "Renouveler maintenant"
|
|
128
127
|
key: "Clé"
|
|
@@ -133,7 +132,7 @@ fr:
|
|
|
133
132
|
not_yet: "pas encore"
|
|
134
133
|
activate: "Activer"
|
|
135
134
|
discard: "Abandonner"
|
|
136
|
-
staged_notice: "Préparée. Les
|
|
135
|
+
staged_notice: "Préparée. Les clients la voient au point de terminaison JWKS avant qu’elle ne signe quoi que ce soit."
|
|
137
136
|
activate_confirm: "Signer chaque nouveau jeton avec cette clé ? La clé actuelle continue de vérifier pendant 24 heures."
|
|
138
137
|
activated_notice: "Activée."
|
|
139
138
|
discard_confirm: "Abandonner cette clé préparée ? Rien n’a été signé avec elle."
|
|
@@ -145,3 +144,15 @@ fr:
|
|
|
145
144
|
active: "active"
|
|
146
145
|
retiring: "en retrait"
|
|
147
146
|
retired: "retirée"
|
|
147
|
+
needs:
|
|
148
|
+
waiting:
|
|
149
|
+
one: "%{count} acteur attend une approbation"
|
|
150
|
+
other: "%{count} acteurs attendent une approbation"
|
|
151
|
+
help:
|
|
152
|
+
one: "%{count} acteur a demandé de l’aide pour se connecter"
|
|
153
|
+
other: "%{count} acteurs ont demandé de l’aide pour se connecter"
|
|
154
|
+
worrying:
|
|
155
|
+
one: "%{count} événement du dernier jour mérite un coup d’œil"
|
|
156
|
+
other: "%{count} événements du dernier jour méritent un coup d’œil"
|
|
157
|
+
latest: "Le dernier est %{label}, %{when}."
|
|
158
|
+
review: "Examiner"
|
|
@@ -4,8 +4,8 @@ fr:
|
|
|
4
4
|
label: "Paramètres"
|
|
5
5
|
account: "Votre compte"
|
|
6
6
|
sign_out: "Se déconnecter"
|
|
7
|
-
forget: "Oublier
|
|
8
|
-
forget_confirm: "Oublier
|
|
7
|
+
forget: "Oublier le client"
|
|
8
|
+
forget_confirm: "Oublier ce client de gestion ? masks vous demande aussitôt d’en approuver un nouveau. L’ancien reste dans Clients jusqu’à son archivage."
|
|
9
9
|
tabs:
|
|
10
10
|
settings: "Général"
|
|
11
11
|
policies: "Politiques"
|
data/config/routes.rb
CHANGED
|
@@ -107,6 +107,8 @@ Masks::Server::Engine.routes.draw do
|
|
|
107
107
|
match "/userinfo", to: "userinfo#show", via: %i[get post]
|
|
108
108
|
|
|
109
109
|
post "/register", to: "registrations#create"
|
|
110
|
+
post "/enrollments", to: "enrollments#create", as: :enrollments
|
|
111
|
+
delete "/enrollments/:machine", to: "enrollments#destroy", as: :enrollment
|
|
110
112
|
get "/register/:client_id", to: "registrations#show", as: :registration
|
|
111
113
|
put "/register/:client_id", to: "registrations#update"
|
|
112
114
|
delete "/register/:client_id", to: "registrations#destroy"
|
data/config/vite.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
class CreateReplays < ActiveRecord::Migration[8.1]
|
|
2
|
+
include Masks::Server::TenantIsolation
|
|
3
|
+
|
|
4
|
+
def up
|
|
5
|
+
create_table :replays do |t|
|
|
6
|
+
t.references :tenant, null: false, foreign_key: { on_delete: :cascade }, index: false
|
|
7
|
+
t.string :kind, null: false
|
|
8
|
+
t.string :digest, null: false
|
|
9
|
+
t.datetime :expires_at, null: false
|
|
10
|
+
t.datetime :created_at, null: false
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
add_index :replays, %i[tenant_id kind digest], unique: true
|
|
14
|
+
add_index :replays, :expires_at
|
|
15
|
+
|
|
16
|
+
enable_row_level_security(:replays)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def down
|
|
20
|
+
disable_row_level_security(:replays)
|
|
21
|
+
drop_table :replays
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -95,8 +95,8 @@ module Masks
|
|
|
95
95
|
say " migrations_paths: <%= Masks::Server::Engine.root.join(\"db/migrate\") %>"
|
|
96
96
|
say " schema_dump: false"
|
|
97
97
|
say ""
|
|
98
|
-
say "Its role must hold neither SUPERUSER nor BYPASSRLS, or masks refuses
|
|
99
|
-
say "security is what keeps one tenant's accounts and keys away from another's."
|
|
98
|
+
say "Its role must hold neither SUPERUSER nor BYPASSRLS, or masks refuses every request that needs"
|
|
99
|
+
say "a tenant: row-level security is what keeps one tenant's accounts and keys away from another's."
|
|
100
100
|
say ""
|
|
101
101
|
say "Controllers that need the signed-in account include Masks::Server::Host, which gives them"
|
|
102
102
|
say "masks_actor and require_masks_actor!." unless subdomain?
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module Masks
|
|
2
|
+
module Server
|
|
3
|
+
class BrowserAccess
|
|
4
|
+
OPEN = %r{\A/(?:\.well-known/(?:openid-configuration|oauth-authorization-server|jwks\.json|oauth-protected-resource(?:/.*)?)|token|revoke|userinfo|avatars/.+)\z}
|
|
5
|
+
ALLOWED_HEADERS = "Authorization, Content-Type, DPoP".freeze
|
|
6
|
+
EXPOSED_HEADERS = "DPoP-Nonce, WWW-Authenticate".freeze
|
|
7
|
+
PREFLIGHT_LIFETIME = 1.hour.to_i.to_s
|
|
8
|
+
|
|
9
|
+
def initialize(app)
|
|
10
|
+
@app = app
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def call(env)
|
|
14
|
+
return @app.call(env) unless env["HTTP_ORIGIN"] && OPEN.match?(env["PATH_INFO"].to_s)
|
|
15
|
+
return preflight if env["REQUEST_METHOD"] == "OPTIONS"
|
|
16
|
+
|
|
17
|
+
status, headers, body = @app.call(env)
|
|
18
|
+
headers["access-control-allow-origin"] = "*"
|
|
19
|
+
headers["access-control-expose-headers"] = EXPOSED_HEADERS
|
|
20
|
+
|
|
21
|
+
[ status, headers, body ]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
private
|
|
25
|
+
def preflight
|
|
26
|
+
[ 204, {
|
|
27
|
+
"access-control-allow-origin" => "*",
|
|
28
|
+
"access-control-allow-methods" => "GET, POST",
|
|
29
|
+
"access-control-allow-headers" => ALLOWED_HEADERS,
|
|
30
|
+
"access-control-max-age" => PREFLIGHT_LIFETIME
|
|
31
|
+
}, [] ]
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -93,15 +93,15 @@ module Masks
|
|
|
93
93
|
if config.named_by && !%w[nickname email either].include?(config.named_by)
|
|
94
94
|
raise "MASKS_NAMED_BY is #{config.named_by.inspect}, and the only things an " \
|
|
95
95
|
"account can be named by are a nickname, an email address, or either one. " \
|
|
96
|
-
"Set it to nickname, email or either, or leave it unset
|
|
97
|
-
"
|
|
96
|
+
"Set it to nickname, email or either, or leave it unset so each tenant's managers " \
|
|
97
|
+
"choose in /manage."
|
|
98
98
|
end
|
|
99
99
|
|
|
100
100
|
if config.dynamic_registration && !%w[off anything bounded].include?(config.dynamic_registration)
|
|
101
101
|
raise "MASKS_DYNAMIC_REGISTRATION is #{config.dynamic_registration.inspect}. " \
|
|
102
102
|
"Dynamic registration is off, on for anything a manager does not have to grant, " \
|
|
103
103
|
"or on and bounded by MASKS_DYNAMIC_CLIENT_SCOPES. Set it to off, anything or " \
|
|
104
|
-
"bounded, or leave it unset
|
|
104
|
+
"bounded, or leave it unset so each tenant's managers choose in /manage."
|
|
105
105
|
end
|
|
106
106
|
|
|
107
107
|
return if local || building
|
data/lib/masks/server/engine.rb
CHANGED
|
@@ -26,9 +26,12 @@ module Masks
|
|
|
26
26
|
<<~HEAD
|
|
27
27
|
---
|
|
28
28
|
title: Manage API
|
|
29
|
-
description: The GraphQL schema served at /manage/graphql.
|
|
29
|
+
description: The GraphQL schema served at /manage/graphql, with an explorer to browse it.
|
|
30
30
|
---
|
|
31
31
|
|
|
32
|
+
import sdl from "../../../assets/manage.graphql?raw";
|
|
33
|
+
import Explorer from "../../../components/Explorer.tsx";
|
|
34
|
+
|
|
32
35
|
Everything `/manage` can ask for and everything it can change. `/manage/graphql` accepts a
|
|
33
36
|
bearer carrying `masks:manage` or one of the narrower
|
|
34
37
|
[manage roles](/guides/security/#manage-roles), issued for this tenant's manage resource and
|
|
@@ -37,6 +40,17 @@ module Masks
|
|
|
37
40
|
|
|
38
41
|
Generated from `ManageSchema` by `./dev reference`. CI fails when this page and the
|
|
39
42
|
schema disagree.
|
|
43
|
+
|
|
44
|
+
## Explorer
|
|
45
|
+
|
|
46
|
+
The explorer shows this schema in GraphiQL, an in-browser tool for writing GraphQL
|
|
47
|
+
queries. Autocomplete, the docs pane, and validation all work on this page. The explorer
|
|
48
|
+
answers only introspection queries, which ask about the schema itself. It sends nothing
|
|
49
|
+
to a server.
|
|
50
|
+
|
|
51
|
+
To run a query, send it to your own server's `/manage/graphql`.
|
|
52
|
+
|
|
53
|
+
<Explorer client:only="react" sdl={sdl} />
|
|
40
54
|
HEAD
|
|
41
55
|
end
|
|
42
56
|
|
|
@@ -50,7 +64,7 @@ module Masks
|
|
|
50
64
|
body = if type.kind.enum?
|
|
51
65
|
values(type)
|
|
52
66
|
elsif type.kind.scalar?
|
|
53
|
-
"A scalar
|
|
67
|
+
"A scalar.\n"
|
|
54
68
|
else
|
|
55
69
|
fields(type)
|
|
56
70
|
end
|
|
@@ -97,8 +111,7 @@ module Masks
|
|
|
97
111
|
"#{named}#{taken.join}"
|
|
98
112
|
end
|
|
99
113
|
|
|
100
|
-
#
|
|
101
|
-
# comments. An empty column on every row is noise, so it only appears when
|
|
114
|
+
# An empty column on every row is noise, so it only appears when
|
|
102
115
|
# something in that table actually filled it in.
|
|
103
116
|
def cells(values, described)
|
|
104
117
|
kept = described.any?(&:present?) ? values : values[0..-2]
|
data/lib/masks/server.rb
CHANGED
|
@@ -105,6 +105,7 @@ end
|
|
|
105
105
|
|
|
106
106
|
require_relative "server/version"
|
|
107
107
|
require_relative "server/configuration"
|
|
108
|
+
require_relative "server/browser_access"
|
|
108
109
|
require_relative "server/isolation"
|
|
109
110
|
require_relative "server/tenant_key_provider"
|
|
110
111
|
require_relative "server/forwarding"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_initial-C1GpCiEh.js": {
|
|
3
|
+
"file": "assets/initial-C1GpCiEh.js",
|
|
4
|
+
"name": "initial"
|
|
5
|
+
},
|
|
6
|
+
"_passkey-DIj_5LCY.js": {
|
|
7
|
+
"file": "assets/passkey-DIj_5LCY.js",
|
|
8
|
+
"name": "passkey"
|
|
9
|
+
},
|
|
10
|
+
"entrypoints/account.js": {
|
|
11
|
+
"file": "assets/account-D46qDQCo.js",
|
|
12
|
+
"name": "entrypoints/account.js",
|
|
13
|
+
"src": "entrypoints/account.js",
|
|
14
|
+
"isEntry": true,
|
|
15
|
+
"imports": [
|
|
16
|
+
"_passkey-DIj_5LCY.js"
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
"entrypoints/app.css": {
|
|
20
|
+
"file": "assets/app-B27oPUll.css",
|
|
21
|
+
"name": "entrypoints/app.css",
|
|
22
|
+
"names": [
|
|
23
|
+
"entrypoints/app.css"
|
|
24
|
+
],
|
|
25
|
+
"src": "entrypoints/app.css",
|
|
26
|
+
"isEntry": true
|
|
27
|
+
},
|
|
28
|
+
"entrypoints/console.css": {
|
|
29
|
+
"file": "assets/console-DoyNbIw3.css",
|
|
30
|
+
"name": "entrypoints/console.css",
|
|
31
|
+
"names": [
|
|
32
|
+
"entrypoints/console.css"
|
|
33
|
+
],
|
|
34
|
+
"src": "entrypoints/console.css",
|
|
35
|
+
"isEntry": true
|
|
36
|
+
},
|
|
37
|
+
"entrypoints/handshake.js": {
|
|
38
|
+
"file": "assets/handshake-DIFZPSAK.js",
|
|
39
|
+
"name": "entrypoints/handshake.js",
|
|
40
|
+
"src": "entrypoints/handshake.js",
|
|
41
|
+
"isEntry": true
|
|
42
|
+
},
|
|
43
|
+
"entrypoints/login.js": {
|
|
44
|
+
"file": "assets/login-C_6igRZ3.js",
|
|
45
|
+
"name": "entrypoints/login.js",
|
|
46
|
+
"src": "entrypoints/login.js",
|
|
47
|
+
"isEntry": true,
|
|
48
|
+
"imports": [
|
|
49
|
+
"_passkey-DIj_5LCY.js",
|
|
50
|
+
"_initial-C1GpCiEh.js"
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
"entrypoints/manage.js": {
|
|
54
|
+
"file": "assets/manage-Dbfiy3Mj.js",
|
|
55
|
+
"name": "entrypoints/manage.js",
|
|
56
|
+
"src": "entrypoints/manage.js",
|
|
57
|
+
"isEntry": true,
|
|
58
|
+
"imports": [
|
|
59
|
+
"_initial-C1GpCiEh.js"
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-font-weight:initial}}}@layer theme{:root,:host{--font-sans:system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--font-mono:ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-xl:36rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-medium:500;--font-weight-semibold:600;--radius-lg:.5rem;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-base-100:#fff;--color-base-200:#fcf9f7;--color-base-300:#e5ded9;--color-base-content:#211c18;--color-primary:#b04000;--color-primary-content:#fff;--color-secondary:#87611e;--color-accent:#6d4702;--color-neutral:#211c18;--color-neutral-content:#fcf9f7;--color-info:#0077b2;--color-success:#008450;--color-warning:#8b6200;--color-error:#b53530;--color-error-content:#fff;--radius-box:5px;--radius-field:3px}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components{.btn{border-radius:var(--radius-box);border:1px solid var(--edge);background:var(--color-base-100);color:inherit;font:inherit;white-space:nowrap;cursor:pointer;justify-content:center;align-items:center;gap:.4375rem;padding:.5625rem .9375rem;font-size:.875rem;font-weight:500;line-height:1.2;text-decoration:none;transition:border-color .15s,background-color .15s,color .15s;display:inline-flex}.btn:hover:not(:disabled){border-color:#211c18}@supports (color:color-mix(in lab, red, red)){.btn:hover:not(:disabled){border-color:color-mix(in oklab, var(--color-base-content) 30%, var(--edge))}}.btn:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.btn:disabled,.btn[aria-disabled=true]{opacity:.45;cursor:not-allowed}.btn-sm{padding:.375rem .75rem;font-size:.8125rem}.btn-xs{padding:.25rem .5rem;font-size:.75rem}.btn-primary{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-primary-content)}.btn-primary:hover:not(:disabled){background:#973700}@supports (color:color-mix(in lab, red, red)){.btn-primary:hover:not(:disabled){background:color-mix(in oklab, var(--color-primary) 86%, black)}}.btn-primary:hover:not(:disabled){border-color:#973700}@supports (color:color-mix(in lab, red, red)){.btn-primary:hover:not(:disabled){border-color:color-mix(in oklab, var(--color-primary) 86%, black)}}.btn-error{background:var(--color-error);border-color:var(--color-error);color:var(--color-error-content)}.btn-error:hover:not(:disabled){background:#9c2e29}@supports (color:color-mix(in lab, red, red)){.btn-error:hover:not(:disabled){background:color-mix(in oklab, var(--color-error) 86%, black)}}.btn-error:hover:not(:disabled){border-color:#9c2e29}@supports (color:color-mix(in lab, red, red)){.btn-error:hover:not(:disabled){border-color:color-mix(in oklab, var(--color-error) 86%, black)}}.btn-ghost{background:0 0;border-color:#0000}.btn-ghost:hover:not(:disabled){background:var(--sunk);border-color:#0000}.btn-outline{background:0 0}.btn-error.btn-outline{color:var(--color-error);border-color:#b5353073}@supports (color:color-mix(in lab, red, red)){.btn-error.btn-outline{border-color:color-mix(in oklab, var(--color-error) 45%, transparent)}}.btn-error.btn-outline:hover:not(:disabled){background:#b535301f}@supports (color:color-mix(in lab, red, red)){.btn-error.btn-outline:hover:not(:disabled){background:color-mix(in oklab, var(--color-error) 12%, transparent)}}.btn-error.btn-outline:hover:not(:disabled){border-color:var(--color-error)}.link{color:inherit;text-underline-offset:2px;cursor:pointer;text-decoration:underline;text-decoration-thickness:1px}.link-hover{text-decoration:none}.link-hover:hover,.link:hover{text-decoration:underline}.badge{border:1px solid var(--edge);background:var(--color-base-100);white-space:nowrap;border-radius:999px;align-items:center;gap:.25rem;padding:.125rem .4375rem;font-size:.75rem;font-weight:500;line-height:1.5;display:inline-flex}.badge-sm{padding:.0625rem .375rem;font-size:.6875rem}.badge-xs{padding:0 .3125rem;font-size:.625rem}.badge-ghost{background:var(--sunk);border-color:#0000}.badge-success{color:var(--color-success);border-color:#00845066}@supports (color:color-mix(in lab, red, red)){.badge-success{border-color:color-mix(in oklab, var(--color-success) 40%, transparent)}}.badge-success{background:#0084501f}@supports (color:color-mix(in lab, red, red)){.badge-success{background:color-mix(in oklab, var(--color-success) 12%, transparent)}}.badge-warning{color:var(--color-warning);border-color:#8b620066}@supports (color:color-mix(in lab, red, red)){.badge-warning{border-color:color-mix(in oklab, var(--color-warning) 40%, transparent)}}.badge-warning{background:#8b62001f}@supports (color:color-mix(in lab, red, red)){.badge-warning{background:color-mix(in oklab, var(--color-warning) 12%, transparent)}}.badge-error{color:var(--color-error);border-color:#b5353066}@supports (color:color-mix(in lab, red, red)){.badge-error{border-color:color-mix(in oklab, var(--color-error) 40%, transparent)}}.badge-error{background:#b535301f}@supports (color:color-mix(in lab, red, red)){.badge-error{background:color-mix(in oklab, var(--color-error) 12%, transparent)}}.badge-info{color:var(--color-info);border-color:#0077b266}@supports (color:color-mix(in lab, red, red)){.badge-info{border-color:color-mix(in oklab, var(--color-info) 40%, transparent)}}.badge-info{background:#0077b21f}@supports (color:color-mix(in lab, red, red)){.badge-info{background:color-mix(in oklab, var(--color-info) 12%, transparent)}}.alert{border-radius:var(--radius-box);border:1px solid var(--edge);background:var(--color-base-100);align-items:flex-start;gap:.625rem;padding:.75rem .875rem;font-size:.875rem;line-height:1.45;display:flex}.alert-soft{background:var(--sunk);border-color:#0000}.alert-error{color:var(--color-error);border-color:#b5353059}@supports (color:color-mix(in lab, red, red)){.alert-error{border-color:color-mix(in oklab, var(--color-error) 35%, transparent)}}.alert-error{background:#b535301a}@supports (color:color-mix(in lab, red, red)){.alert-error{background:color-mix(in oklab, var(--color-error) 10%, transparent)}}.alert-warning{color:var(--color-warning);border-color:#8b620059}@supports (color:color-mix(in lab, red, red)){.alert-warning{border-color:color-mix(in oklab, var(--color-warning) 35%, transparent)}}.alert-warning{background:#8b62001a}@supports (color:color-mix(in lab, red, red)){.alert-warning{background:color-mix(in oklab, var(--color-warning) 10%, transparent)}}.alert-success{color:var(--color-success);border-color:#00845059}@supports (color:color-mix(in lab, red, red)){.alert-success{border-color:color-mix(in oklab, var(--color-success) 35%, transparent)}}.alert-success{background:#0084501a}@supports (color:color-mix(in lab, red, red)){.alert-success{background:color-mix(in oklab, var(--color-success) 10%, transparent)}}.alert-info{color:var(--color-info);border-color:#0077b259}@supports (color:color-mix(in lab, red, red)){.alert-info{border-color:color-mix(in oklab, var(--color-info) 35%, transparent)}}.alert-info{background:#0077b21a}@supports (color:color-mix(in lab, red, red)){.alert-info{background:color-mix(in oklab, var(--color-info) 10%, transparent)}}.input,.select,.textarea{border-radius:var(--radius-box);border:1px solid var(--edge);background:var(--color-base-100);width:100%;color:inherit;font:inherit;padding:.5625rem .75rem;font-size:.875rem;line-height:1.4}.input:focus,.select:focus,.textarea:focus{outline:2px solid var(--color-primary);outline-offset:-1px}.input-sm,.select-sm,.textarea-sm{padding:.375rem .5625rem;font-size:.8125rem}.textarea{resize:vertical;min-height:5rem}.select{appearance:none;background-image:linear-gradient(45deg,#0000 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,#0000 50%);background-position:calc(100% - .9375rem) 55%,calc(100% - .625rem) 55%;background-repeat:no-repeat;background-size:.3125rem .3125rem,.3125rem .3125rem;padding-right:1.75rem}.checkbox{width:1rem;height:1rem;accent-color:var(--color-primary);cursor:pointer;flex:none;margin:0}.toggle{appearance:none;border:1px solid var(--edge);background:var(--sunk);cursor:pointer;border-radius:999px;flex:none;width:2.25rem;height:1.3125rem;transition:background-color .15s;position:relative}.toggle:after{content:"";background:var(--color-base-content);border-radius:50%;width:.9375rem;height:.9375rem;transition:transform .15s;position:absolute;top:50%;left:.125rem;transform:translateY(-50%)}.toggle:checked{background:var(--color-primary);border-color:var(--color-primary)}.toggle:checked:after{background:var(--color-primary-content);transform:translate(.9375rem,-50%)}.toggle-sm{width:1.875rem;height:1.125rem}.toggle-sm:after{width:.75rem;height:.75rem}.toggle-sm:checked:after{transform:translate(.75rem,-50%)}.range{width:100%;accent-color:var(--color-primary)}.join{display:inline-flex}.join-item:not(:first-child){border-start-start-radius:0;border-end-start-radius:0;margin-inline-start:-1px}.join-item:not(:last-child){border-start-end-radius:0;border-end-end-radius:0}.card{border-radius:var(--radius-box);border:1px solid var(--edge);background:var(--color-base-100);flex-direction:column;display:flex}.table{border-collapse:collapse;text-align:left;width:100%;font-size:.875rem}.table :where(th){color:#211c1899;padding:.625rem .75rem;font-size:.75rem;font-weight:500}@supports (color:color-mix(in lab, red, red)){.table :where(th){color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.table :where(th){border-bottom:1px solid var(--edge)}.table :where(td){border-bottom:1px solid var(--edge);vertical-align:top;padding:.6875rem .75rem}.table :where(tbody tr:last-child td){border-bottom:0}.table-sm :where(th,td){padding:.4375rem .625rem}.loading{border:2px solid;border-top-color:#0000;border-radius:50%;width:1.125rem;height:1.125rem;animation:.62s linear infinite spin;display:inline-block}.loading-spinner{border-style:solid}.auth-page{--ground:#ececed;--surface:#f7f7f8;--line:#d9d9dc;--line-firm:#c4c4c8;--ink:#18181b;--ink-soft:#5c5c63;--brass:#8a5a1c;--brass-lit:#9b6a26;--signal:#b3380f;--signal-ink:#fff;--ring:#b3380f4d;--bad:#b0183f;--bad-field:#fbeef1;--warn:#8b6200;--warn-field:#fbf5e8;--info:#0077b2;--info-field:#edf5fa;--glow:#b3380f0d;--window:url(/masks-public/icon.svg);--window-strength:.2;--pane:var(--surface)}@supports (color:color-mix(in lab, red, red)){.auth-page{--pane:color-mix(in oklab, var(--surface) 58%, transparent)}}.auth-page{--pane-rim:var(--brass)}@supports (color:color-mix(in lab, red, red)){.auth-page{--pane-rim:color-mix(in oklab, var(--brass) 30%, var(--line))}}.auth-page{--pane-shine:#ffffffb3;--pane-sheen:#ffffff73;--pane-shadow:0 1px 1px #14141812, 0 18px 40px -24px #14141866;--bend:8px;--swing:cubic-bezier(.2, .8, .2, 1)}@media (prefers-color-scheme:dark){.auth-page{--ground:#0b0b0c;--surface:#1c1c1f;--line:#2a2a2e;--line-firm:#3e3e44;--ink:#ededef;--ink-soft:#9a9a9f;--brass:#c9a14a;--brass-lit:#e8c27a;--signal:#ff7a4a;--signal-ink:#1f0c06;--ring:#ff7a4a66;--bad:#ff7396;--bad-field:#ff73961a;--warn:#d4ad03;--warn-field:#d4ad031a;--info:#00c2fe;--info-field:#00c2fe1a;--glow:#ff7a4a0f;--window-strength:.36;--pane:var(--surface)}@supports (color:color-mix(in lab, red, red)){.auth-page{--pane:color-mix(in oklab, var(--surface) 52%, transparent)}}.auth-page{--pane-shine:#ffffff1a;--pane-sheen:#ffffff0b;--pane-shadow:0 1px 0 #0009, 0 22px 50px -24px #000c}}.auth-page{background:var(--ground);min-height:100svh;color:var(--ink);font-family:var(--font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0;padding:2.5rem 1.25rem 3rem;display:flex}.auth-page:before{--window-size:min(64rem, 150vw);content:"";top:calc(var(--window-size) * -.42);right:calc(var(--window-size) * -.2);width:var(--window-size);aspect-ratio:1;pointer-events:none;background:var(--window) center / contain no-repeat;filter:blur(56px)saturate(1.2);opacity:var(--window-strength);position:fixed}.auth-col{flex-direction:column;gap:1.5rem;width:100%;max-width:24rem;margin:auto;display:flex;position:relative}.surface-grant{max-width:30rem}.setup-ready{--signal:var(--glass-emerald);--signal-ink:#fff;--ring:var(--glass-emerald)}@supports (color:color-mix(in lab, red, red)){.setup-ready{--ring:color-mix(in oklab, var(--glass-emerald) 26%, transparent)}}@media (prefers-color-scheme:dark){.setup-ready{--signal-ink:#06231a}}.surface-terminus{max-width:21rem}.disclosure{flex-direction:column;gap:.5rem;display:flex}.disclosure>summary{cursor:pointer;width:fit-content;color:var(--signal);text-underline-offset:3px;font-size:.9375rem;text-decoration:underline;list-style:none}.disclosure>summary::-webkit-details-marker{display:none}.surface-terminus .prompt-head{text-align:left;align-items:flex-start}.surface-terminus .prompt-title{letter-spacing:-.012em;font-size:1.125rem;font-weight:500;line-height:1.4}.surface-terminus .prompt-lede{max-width:none;font-size:.9375rem}.state{letter-spacing:.14em;text-transform:uppercase;color:var(--brass);align-items:center;gap:.5rem;font-size:.6875rem;font-weight:700;display:flex}.state:before{content:"";background:currentColor;border-radius:1px;flex:none;width:1.5rem;height:2px}.state-bad{color:var(--bad)}.state-done{color:var(--signal)}.said{border-radius:var(--bend);background:var(--surface);border:1px solid var(--line);font-family:var(--font-mono);color:var(--ink-soft);overflow-wrap:anywhere;margin:0;padding:.6875rem .8125rem;font-size:.75rem;line-height:1.5}.auth-id{text-align:center;flex-direction:column;align-items:center;gap:.75rem;display:flex}.auth-mark{border-radius:var(--bend);background:var(--surface);border:1px solid var(--brass);place-items:center;width:2.75rem;height:2.75rem;display:grid}@supports (color:color-mix(in lab, red, red)){.auth-mark{border:1px solid color-mix(in oklab, var(--brass) 55%, var(--line))}}.auth-mark{color:var(--signal);letter-spacing:-.02em;font-size:1.0625rem;font-weight:700}.avatar{border-radius:var(--bend);border:1px solid var(--line);background:var(--surface);object-fit:cover;display:block}.avatar-photo{border-radius:50%}.avatar-identicon,.avatar-initials{border-radius:22%}.auth-tenant{letter-spacing:.12em;text-transform:uppercase;color:var(--brass);overflow-wrap:anywhere;font-size:.75rem;font-weight:700}.auth-pair{justify-content:center;align-items:center;gap:.875rem;display:flex}.auth-pair .auth-mark{width:2.5rem;height:2.5rem;font-size:1rem}.auth-mark-client{color:var(--ink);border-color:var(--line-firm)}.auth-mark-logo{object-fit:cover;background:var(--surface)}.item-logo{border-radius:.3rem}.app-tiles{grid-template-columns:repeat(auto-fill,minmax(7rem,1fr));gap:.5rem;margin:0;padding:0;list-style:none;display:grid}.app-tile{border:1px solid var(--pane-rim);background:var(--pane);box-shadow:var(--pane-shadow);color:inherit;text-align:center;border-radius:1rem;flex-direction:column;align-items:center;gap:.5rem;padding:1rem .5rem .875rem;text-decoration:none;display:flex}.app-tile:hover,.app-tile:focus-visible{border-color:var(--brass)}.app-tile-logo{border-radius:.45rem;width:2rem;height:2rem}.app-tile-initial{background:var(--brass);place-items:center;display:grid}@supports (color:color-mix(in lab, red, red)){.app-tile-initial{background:color-mix(in oklab, var(--brass) 14%, transparent)}}.app-tile-initial{color:var(--brass);font-weight:600}.app-tile-name{overflow-wrap:anywhere;font-size:.875rem;font-weight:500}.client-links{flex-wrap:wrap;gap:.25rem 1rem;display:flex}.auth-mark-pending{color:var(--brass);border-style:dashed}.auth-mark-rose{background:0 0;border:0;border-radius:50%}.auth-wire{background:var(--line-firm);flex:0 0 3.5rem;height:1px;position:relative}.auth-wire:after{content:"";border-top:1px solid var(--line-firm);border-right:1px solid var(--line-firm);width:5px;height:5px;position:absolute;top:50%;right:0;transform:translateY(-50%)rotate(45deg)}.auth-wire-live{background:var(--signal)}.auth-wire-live:after{background:var(--signal);border:0;border-radius:50%;width:6px;height:6px;transform:translate(50%,-50%)}.slab,.entry,.actor{background:linear-gradient(160deg, var(--pane-sheen), transparent 45%), var(--pane);border:1px solid var(--pane-rim);box-shadow:inset 0 1px 0 var(--pane-shine), var(--pane-shadow);-webkit-backdrop-filter:blur(22px)saturate(1.5);backdrop-filter:blur(22px)saturate(1.5)}.slab{border-radius:var(--bend);flex-direction:column;gap:1rem;padding:1.125rem;display:flex}.grant-scope-hot,.grant-scope-hot .chip-key{color:var(--warn)}.grant-scope-split{background:var(--line-firm);height:1px;margin:.25rem 0;list-style:none}.record-cap{letter-spacing:.16em;text-transform:uppercase;color:var(--brass);font-size:.6875rem;font-weight:700}.place{--accent:var(--glass-gold);flex-direction:column;gap:1.75rem;display:flex}.plaque{isolation:isolate;text-align:center;flex-direction:column;align-items:center;gap:.25rem;padding:0 1rem .5rem;display:flex;position:relative}.plaque-top{text-align:left;align-self:stretch;align-items:center;gap:.5rem;display:flex}.plaque-top .auth-mark{width:1.75rem;height:1.75rem;font-size:.75rem}.plaque-title{border-bottom:1px solid var(--line);letter-spacing:-.02em;text-align:left;align-self:stretch;margin:.5rem 0 1.75rem;padding-bottom:1rem;font-size:1.25rem;font-weight:600}.plaque-notes{text-align:left;flex-direction:column;align-self:stretch;gap:.5rem;margin:-.75rem 0 1.75rem;display:flex}.plaque:before{content:"";z-index:-1;pointer-events:none;background:radial-gradient(44% 58% at 50% 0%, var(--glass-amber), transparent 72%);height:18rem;position:absolute;inset:-3rem 0 auto}@supports (color:color-mix(in lab, red, red)){.plaque:before{background:radial-gradient(44% 58% at 50% 0%, color-mix(in oklab, var(--glass-amber) 20%, transparent), transparent 72%)}}.plaque-shot{display:inline-block;position:relative}.plaque-pick{cursor:pointer;display:block}.plaque-badge-form{z-index:1;position:absolute;bottom:-.1875rem;right:-.1875rem}.plaque-badge{background:var(--surface);border:1px solid var(--line-firm);width:1.75rem;height:1.75rem;color:var(--ink-soft);cursor:pointer;border-radius:50%;place-items:center;padding:0;display:grid}.plaque-badge svg{width:.875rem;height:.875rem}.plaque-badge:hover{border-color:var(--bad);color:var(--bad)}.plaque-done{z-index:2;background:var(--glass-emerald);width:1.75rem;height:1.75rem;color:var(--surface);pointer-events:none;opacity:0;border-radius:50%;place-items:center;animation:2.4s ease-out plaque-done;display:grid;position:absolute;bottom:-.1875rem;right:-.1875rem}.plaque-done svg{stroke-width:2.2px;width:.875rem;height:.875rem}.plaque-shot-done .plaque-avatar{animation:2.4s ease-out plaque-ring}@keyframes plaque-done{0%,65%{opacity:1}to{opacity:0}}@keyframes plaque-ring{0%,65%{box-shadow:0 0 0 2px var(--glass-emerald), 0 16px 34px -18px color-mix(in oklab, var(--glass-amber) 55%, transparent)}}.plaque-file{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.plaque-file-label{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;margin:-1px;position:absolute;overflow:hidden}.plaque-pick:focus-within .plaque-avatar{outline:2px solid var(--accent);outline-offset:3px}.plaque-avatar{object-fit:cover;width:5.5rem;height:5.5rem;box-shadow:0 0 0 1px var(--line-firm), 0 16px 34px -18px var(--glass-amber);flex:none;display:block}@supports (color:color-mix(in lab, red, red)){.plaque-avatar{box-shadow:0 0 0 1px var(--line-firm), 0 16px 34px -18px color-mix(in oklab, var(--glass-amber) 55%, transparent)}}.plaque-name{letter-spacing:-.03em;margin:.75rem 0 0;font-size:1.625rem;font-weight:700;line-height:1.15}.plaque-sub{color:var(--ink-soft);margin:0;font-size:1rem}.plaque-pills{flex-wrap:wrap;justify-content:center;align-items:flex-start;gap:.5rem;margin-top:1rem;display:flex}.signout{display:contents}.pill{border:1px solid var(--line-firm);background:var(--glow);color:var(--ink-soft);cursor:pointer;border-radius:999px;align-items:center;gap:.4375rem;padding:.5rem 1rem;font-family:inherit;font-size:.875rem;font-weight:600;text-decoration:none;display:inline-flex}.pill:hover{border-color:var(--brass);color:var(--ink)}.pill-accent{color:var(--accent);border-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.pill-accent{border-color:color-mix(in oklab, var(--accent) 40%, var(--line))}}.pill-accent:hover{color:var(--accent);border-color:var(--accent)}.pill svg{width:1rem;height:1rem}.group{flex-direction:column;gap:.5rem;scroll-margin-top:1.25rem;display:flex}.group>h2{color:var(--brass);margin:0 0 .125rem .25rem;font-size:.875rem;font-weight:500}.entries{flex-direction:column;gap:.5rem;display:flex}.entry{border-radius:1rem;scroll-margin-top:1.25rem}.entry[open]{border-color:var(--brass)}@supports (color:color-mix(in lab, red, red)){.entry[open]{border-color:color-mix(in oklab, var(--brass) 45%, var(--line-firm))}}.entry>summary{cursor:pointer;align-items:center;gap:.875rem;padding:.9375rem 1rem;list-style:none;display:flex}.entry>summary::-webkit-details-marker{display:none}.entry-icon{border:1px solid var(--line-firm);width:2.25rem;height:2.25rem;color:var(--ink-soft);border-radius:50%;flex:none;place-items:center;display:grid}.entry-icon svg{width:1.125rem;height:1.125rem}.entry-label{overflow-wrap:anywhere;letter-spacing:-.012em;min-width:0;font-size:1rem;font-weight:500}.entry-state{color:var(--brass);text-align:right;flex:none;margin-left:auto;font-size:.875rem}.entry-state-warn{color:var(--accent)}.entry-state-bad{color:var(--bad)}.entry-mark{border-right:1.5px solid var(--line-firm);border-bottom:1.5px solid var(--line-firm);width:.4375rem;height:.4375rem;transition:transform .2s var(--swing);flex:none;transform:rotate(-45deg)}.entry[open] .entry-mark{transform:rotate(45deg)}@media (prefers-reduced-motion:reduce){.entry-mark{transition:none}}.entry-body{flex-direction:column;gap:.875rem;padding:0 1rem 1.125rem;display:flex}.entry-body>.aside{max-width:52ch}.items{flex-direction:column;display:flex}.item{grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:.375rem 1rem;padding:.875rem 0;display:grid}.item+.item{border-top:1px solid var(--line)}.item:first-child{padding-top:.25rem}.item:last-child{padding-bottom:.25rem}.item-name{overflow-wrap:anywhere;letter-spacing:-.01em;flex-wrap:wrap;grid-column:1;align-items:center;gap:.5rem;min-width:0;font-size:.9375rem;font-weight:600;display:flex}.item-meta{color:var(--ink-soft);grid-column:1;font-size:.8125rem;line-height:1.5}.item-list{color:var(--ink-soft);flex-direction:column;grid-column:1;gap:.1875rem;margin:0;padding:0;font-size:.8125rem;line-height:1.4;list-style:none;display:flex}.item-more{color:var(--brass)}.item-delegations{color:var(--ink-soft);flex-direction:column;grid-column:1/-1;gap:.375rem;margin:.25rem 0 0;padding:0;font-size:.8125rem;list-style:none;display:flex}.item-delegations li{border-left:2px solid var(--line);justify-content:space-between;align-items:center;gap:1rem;padding-left:.75rem;display:flex}.item-act{grid-area:1/2;justify-self:end}.item-act .action{white-space:nowrap}.item-acts{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:.5rem;display:flex}.item-acts .control{width:auto}.item-member .item-act{grid-row:1/span 2;align-self:center}@media (width<=34rem){.item-member{grid-template-columns:minmax(0,1fr)}.item-member .item-act{grid-area:auto/1;justify-self:start}.item-member .item-acts{justify-content:flex-start}}.entry-invited{border-color:var(--warn)}@supports (color:color-mix(in lab, red, red)){.entry-invited{border-color:color-mix(in oklab, var(--warn) 55%, var(--line-firm))}}.member-add{border-top:1px solid var(--line);grid-template-columns:minmax(0,1fr) minmax(7rem,auto) auto;align-items:end;gap:.625rem .75rem;padding-top:1rem;display:grid}.member-add-hint{grid-column:1/-1}.member-add .control{height:3.25rem;padding-block:0}.member-add .member-add-go{height:3.25rem}@media (width<=34rem){.member-add{grid-template-columns:minmax(0,1fr) auto}.member-add-email{grid-column:1/-1}}.member-leave{border-top:1px solid var(--line);padding-top:1rem;display:flex}.switches{flex-direction:column;display:flex}.switch{cursor:pointer;justify-content:space-between;align-items:center;gap:1rem;padding:.6875rem 0;font-size:.9375rem;display:flex}.switch+.switch{border-top:1px solid var(--line)}.switch input[type=checkbox]{width:1.0625rem;height:1.0625rem;accent-color:var(--accent);flex:none;margin:0}.switch-set{flex-direction:column;gap:.25rem;display:flex}.switch-set>legend{color:var(--brass);padding:0;font-size:.75rem;font-weight:500}.flow{flex-direction:column;gap:1.25rem;display:flex}.flow-tight{flex-direction:column;gap:.625rem;display:flex}.prompt-head{text-align:center;flex-direction:column;align-items:center;gap:.4375rem;display:flex}.prompt-title{letter-spacing:-.03em;text-wrap:balance;margin:0;font-size:clamp(1.75rem,1.4rem + 1.5vw,2.125rem);font-weight:700;line-height:1.06}.prompt-lede{color:var(--ink-soft);max-width:38ch;margin:0;font-size:1rem;line-height:1.5}.prompt-lede strong{color:var(--ink);font-weight:500}.pulse{background:var(--brass);border-radius:1px;width:2.75rem;height:2px;margin-bottom:.625rem;position:relative}@supports (color:color-mix(in lab, red, red)){.pulse{background:color-mix(in oklab, var(--brass) 60%, transparent)}}.pulse{overflow:hidden}.pulse:after{content:"";background:var(--signal);inset-block:0;border-radius:1px;width:55%;position:absolute;left:0;translate:-100%}.pulse-on:after{animation:1.15s cubic-bezier(.66,0,.34,1) infinite sweep}.pulse-done{background:var(--signal)}.pulse-bad{background:var(--bad)}.ledger-row{border-top:1px solid var(--line);flex-direction:column;gap:.5rem;padding:.9375rem 0;display:flex}.ledger-row:first-child{border-top:0;padding-top:0}.ledger-row:last-child{padding-bottom:0}.ledger-step+.ledger-step{border-top:0}.setup .prompt-head{margin-bottom:.75rem}.tabset{gap:.25rem;display:flex}.tabset-tab{border-bottom:2px solid var(--line);letter-spacing:.06em;text-transform:uppercase;text-align:center;color:var(--ink-soft);flex:1;padding:0 0 .5rem;font-size:.6875rem;font-weight:700;transition:color .2s,border-color .2s}.tabset-done{border-bottom-color:var(--glass-emerald);color:var(--brass)}.tabset-now{border-bottom-color:var(--signal);color:var(--ink)}.ledger-row-aside{grid-template-rows:auto auto;grid-template-columns:1fr auto;align-items:center;column-gap:.75rem;display:grid}.ledger-aside{grid-area:1/2/span 2;justify-self:end}.ledger-label{letter-spacing:.08em;text-transform:uppercase;color:var(--brass);font-size:.75rem;font-weight:700}.ledger-value{overflow-wrap:anywhere;font-size:.9375rem;line-height:1.5}.ledger-row-tight{gap:.25rem;padding:.625rem 0}.ledger-row-tight .ledger-value{font-size:.8125rem}.ledger-step{--step:var(--line-firm)}.ledger-step-done{--step:var(--glass-emerald)}.ledger-step .ledger-label{color:var(--ink-soft);align-items:center;gap:.5rem;transition:color .2s;display:flex}.ledger-step .ledger-label:before{content:"";background:var(--step);border-radius:50%;width:.4375rem;height:.4375rem;transition:background-color .2s}.ledger-step-done .ledger-label{color:var(--step)}.ledger-step-done .control:not(:focus){border-color:var(--step)}@supports (color:color-mix(in lab, red, red)){.ledger-step-done .control:not(:focus){border-color:color-mix(in oklab, var(--step) 45%, var(--line))}}.enrol{flex-wrap:wrap;align-items:center;gap:1rem;display:flex}.enrol-qr{aspect-ratio:1;border-radius:var(--bend);border:1px solid var(--line);background:#fff;flex:none;width:10rem;max-width:100%;overflow:hidden}.enrol-qr svg{width:100%;height:100%;display:block}.enrol-key{flex-direction:column;flex:10rem;gap:.375rem;min-width:0;display:flex}.enrol-secret{overflow-wrap:anywhere;letter-spacing:.06em;-webkit-user-select:all;user-select:all}.codes{font-variant-numeric:tabular-nums;grid-template-columns:repeat(auto-fill,minmax(10rem,1fr));gap:.375rem 1rem;margin:0;padding:0;list-style:none;display:grid}.codes li{-webkit-user-select:all;user-select:all}.codes-actions{flex-wrap:wrap;align-self:flex-start;gap:.5rem 1.25rem;display:flex}.grant-scopes{flex-direction:column;gap:.5rem;margin:0;padding:0;list-style:none;display:flex}.grant-fields{color:var(--ink-soft);flex-basis:100%;grid-template-columns:auto 1fr;gap:.125rem .75rem;margin:.25rem 0 0;font-size:.8125rem;display:grid}.grant-fields dt{font-weight:600}.grant-fields dd{overflow-wrap:anywhere;margin:0}.grant-scope{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:.1875rem .875rem;font-size:.9375rem;line-height:1.45;display:flex}.field{flex-direction:column;gap:.4375rem;display:flex}.field-label{letter-spacing:-.002em;font-size:.875rem;font-weight:500}.field-line{justify-content:space-between;align-items:baseline;gap:1rem;display:flex}.field-line .textlink{font-size:.875rem}.field-hint{color:var(--ink-soft);font-size:.8125rem;line-height:1.45}.field-hint-bad{color:var(--bad);font-weight:500}.control{width:100%;font:inherit;border-radius:var(--bend);border:1px solid var(--line);background:var(--surface);padding:.9375rem 1rem;font-size:1rem}@supports (color:color-mix(in lab, red, red)){.control{background:color-mix(in oklab, var(--surface) 72%, transparent)}}.control{color:var(--ink);caret-color:var(--signal);transition:border-color .15s,box-shadow .15s,background-color .15s}.control:autofill{-webkit-text-fill-color:var(--ink);caret-color:var(--signal);box-shadow:inset 0 0 0 100vmax var(--surface)}.control:autofill:focus{box-shadow:inset 0 0 0 1px var(--brass-lit), inset 0 0 0 100vmax var(--surface)}.control::placeholder{color:var(--ink-soft)}@supports (color:color-mix(in lab, red, red)){.control::placeholder{color:color-mix(in oklab, var(--ink-soft) 78%, transparent)}}.control:hover:not(:disabled):not([readonly]){border-color:var(--line-firm)}.control:focus{border-color:var(--brass-lit);box-shadow:inset 0 0 0 1px var(--brass-lit);outline:none}.control[readonly]{background:var(--ground);color:var(--ink-soft);border-color:var(--line)}.control-sm{padding:.5625rem .75rem;font-size:.9375rem}.control-mono{font-family:var(--font-mono);letter-spacing:.14em;font-size:1rem}.control-code{font-family:var(--font-mono);text-align:center;letter-spacing:.4em;text-indent:.4em;font-variant-numeric:tabular-nums;padding:.875rem .5rem;font-size:1.5rem;font-weight:500}.check{color:var(--ink-soft);cursor:pointer;align-items:center;gap:.625rem;font-size:.875rem;line-height:1.4;display:flex}.check input[type=checkbox],.check input[type=radio]{width:1rem;height:1rem;accent-color:var(--signal);flex:none;margin:0}.check input[type=checkbox]:focus-visible,.check input[type=radio]:focus-visible{outline:2px solid var(--signal);outline-offset:2px}.action{width:100%;font:inherit;letter-spacing:-.014em;text-align:center;border-radius:var(--bend);border:1px solid var(--signal);justify-content:center;align-items:center;gap:.5rem;padding:.9375rem 1.125rem;font-size:1rem;font-weight:500;display:inline-flex;position:relative}@supports (color:color-mix(in lab, red, red)){.action{border:1px solid color-mix(in oklab, var(--signal) 60%, transparent)}}.action{background:var(--signal)}@supports (color:color-mix(in lab, red, red)){.action{background:color-mix(in oklab, var(--signal) 14%, var(--ground))}}.action{color:var(--signal);cursor:pointer;transition:background-color .15s,color .15s,border-color .15s}.action:hover:not(:disabled){border-color:var(--signal);background:var(--signal)}@supports (color:color-mix(in lab, red, red)){.action:hover:not(:disabled){background:color-mix(in oklab, var(--signal) 24%, var(--ground))}}.action:focus-visible{outline:2px solid var(--brass-lit);outline-offset:2px}.action:disabled{border-color:var(--line-firm);color:var(--ink-soft);background:0 0}@supports (color:color-mix(in lab, red, red)){.action:disabled{color:color-mix(in oklab, var(--ink-soft) 66%, transparent)}}.action:disabled{cursor:not-allowed}.action-busy,.action-busy:disabled{background:var(--surface);border-color:var(--line-firm);color:var(--ink-soft);cursor:progress}.action-mark{position:absolute;top:50%;left:1.0625rem;translate:0 -50%}.action-quiet{background:var(--surface);color:var(--ink);border-color:var(--line)}.action-quiet:hover:not(:disabled){background:var(--surface);border-color:var(--line-firm)}.action-plain{color:var(--ink-soft);background:0 0;padding:.6875rem 1rem;font-size:.9375rem;font-weight:400}.action-plain:hover:not(:disabled){background:var(--surface);color:var(--ink)}.action-sm{align-self:flex-start;width:auto;padding:.5625rem .9375rem;font-size:.9375rem}.providers{flex-direction:column;gap:.625rem;display:flex}.providers>form{display:contents}.org-picks{flex-direction:column;gap:.5rem;margin:0;padding:0;list-style:none;display:flex}.org-pick{border:1px solid var(--line);border-radius:var(--bend);background:var(--surface);width:100%;color:var(--ink);font:inherit;text-align:left;cursor:pointer;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:.875rem;padding:.75rem 1rem .75rem .75rem;transition:border-color .15s,background-color .15s;display:grid}.org-pick:hover:not(:disabled){border-color:var(--signal)}@supports (color:color-mix(in lab, red, red)){.org-pick:hover:not(:disabled){border-color:color-mix(in oklab, var(--signal) 60%, var(--line-firm))}}.org-pick:focus-visible{outline:2px solid var(--brass-lit);outline-offset:2px}.org-pick:disabled{cursor:not-allowed;opacity:.6}.org-pick[aria-busy=true]{opacity:1;cursor:progress;border-color:var(--signal)}.org-pick-mark{border-radius:calc(var(--bend) * .75);border:1px solid var(--line-firm);background:var(--ground);width:2.25rem;height:2.25rem;color:var(--signal);letter-spacing:.02em;place-items:center;font-size:.8125rem;font-weight:700;display:grid}.org-pick-name{overflow-wrap:anywhere;letter-spacing:-.014em;min-width:0;font-size:1rem;font-weight:600}.org-pick-role{color:var(--ink-soft);font-size:.8125rem}.credential-ways{grid-template-columns:1fr 1fr;gap:.5rem;display:grid}.credential-way{font:inherit;border-radius:var(--bend);border:1px solid var(--line);background:var(--surface);padding:.75rem 1rem;font-size:.9375rem}@supports (color:color-mix(in lab, red, red)){.credential-way{background:color-mix(in oklab, var(--surface) 72%, transparent)}}.credential-way{color:var(--ink-soft);cursor:pointer;transition:border-color .15s,color .15s}.credential-way[aria-checked=true]{border-color:var(--signal);color:var(--ink);font-weight:600}.credential-way:focus-visible{outline:2px solid var(--signal);outline-offset:2px}.providers-rule{color:var(--ink-soft);text-transform:lowercase;align-items:center;gap:.75rem;font-size:.8125rem;display:flex}.providers-rule:before,.providers-rule:after{content:"";background:var(--line);flex:auto;height:1px}.otherwise{flex-direction:column;gap:.625rem;display:flex}.otherwise>.providers-rule{margin-bottom:.3125rem}.otherwise .providers{gap:.625rem}.action-row{align-items:stretch;gap:.625rem;display:flex}.action-row>form{display:flex}.action-countdown{font-variant-numeric:tabular-nums}.action-grow{flex:auto}.action-row .action-sm{align-self:auto}.action-fit{flex:none;width:auto}.textlink{font:inherit;color:var(--signal);cursor:pointer;text-underline-offset:3px;text-decoration:underline;text-decoration-thickness:1px;-webkit-text-decoration-color:var(--signal);-webkit-text-decoration-color:var(--signal);-webkit-text-decoration-color:var(--signal);text-decoration-color:var(--signal);background:0 0;border:0;padding:0;font-size:.9375rem;font-weight:400}@supports (color:color-mix(in lab, red, red)){.textlink{-webkit-text-decoration-color:color-mix(in oklab, var(--signal) 38%, transparent);-webkit-text-decoration-color:color-mix(in oklab, var(--signal) 38%, transparent);-webkit-text-decoration-color:color-mix(in oklab, var(--signal) 38%, transparent);text-decoration-color:color-mix(in oklab, var(--signal) 38%, transparent)}}.textlink{transition:text-decoration-color .15s}.textlink:hover{text-decoration-color:currentColor}.textlink:focus-visible{outline:2px solid var(--signal);outline-offset:3px;border-radius:3px}.textlink:disabled{opacity:.5;cursor:not-allowed}.whom{border-bottom:1px solid var(--line);flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:.25rem 1rem;padding-bottom:.8125rem;display:flex}.whom-name{font-family:var(--font-mono);color:var(--ink-soft);overflow-wrap:anywhere;font-size:.8125rem;line-height:1.5}.whom .textlink{flex:none;font-size:.875rem}.handshake-warn{color:var(--warn)}.handshake-more>summary{color:var(--ink-soft);-webkit-text-decoration-color:var(--line-firm);-webkit-text-decoration-color:var(--line-firm);-webkit-text-decoration-color:var(--line-firm);text-decoration-color:var(--line-firm);align-self:center;font-size:.8125rem}.handshake-more[open]>summary{margin-bottom:.25rem}.handshake-origin{border:1px solid var(--line-firm);background:var(--surface);border-radius:999px;flex-wrap:wrap;justify-content:center;align-items:baseline;gap:.25rem .5rem;max-width:100%;margin:.375rem 0 .25rem;padding:.375rem .875rem;display:flex}.handshake-origin-label{color:var(--ink-soft);font-size:.75rem}.handshake-origin-value{font-family:var(--font-mono);color:var(--ink);overflow-wrap:anywhere;font-size:.875rem;font-weight:600}.handshake-replacing strong{font-weight:600}.handshake-replacing span{color:var(--ink-soft);font-size:.875rem}.handshake-as{flex-direction:column;gap:.4375rem;display:flex}.handshake-caption{color:var(--ink-soft);padding-inline:.125rem;font-size:.8125rem}.handshake-as .actor{box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none;border-color:var(--line);background:0 0}.handshake-as .actor-note{color:var(--ink-soft);font-style:italic}.handshake-as .actor-role{color:var(--brass);letter-spacing:.06em}.handshake-heeds{flex-direction:column;gap:.625rem;margin:0;padding:0;list-style:none;display:flex}.handshake-heed{border-left:2px solid var(--warn);flex-direction:column;gap:.1875rem;padding:.125rem 0 .125rem .75rem;display:flex}.handshake-heed-what{color:var(--warn);font-size:.9375rem;font-weight:600;line-height:1.4}.handshake-heed-why{color:var(--ink-soft);font-size:.875rem;line-height:1.45}.handshake-heed-alarm{border-left-color:var(--bad)}.handshake-heed-alarm .handshake-heed-what,.handshake-heed-alarm .handshake-heed-why{color:var(--bad)}.handshake-sees{flex-wrap:wrap;gap:.375rem;margin:0;padding:0;list-style:none;display:flex}.handshake-sees li{border:1px solid var(--line);background:var(--surface);border-radius:999px;padding:.25rem .625rem;font-size:.875rem;line-height:1.4}.handshake-say{margin:0;font-size:.9375rem;line-height:1.5}.handshake-say .chip-key{color:var(--ink);font-size:.8125rem}.actor{border-radius:.75rem;grid-template-columns:auto 1fr auto;align-items:center;gap:.875rem;padding:.75rem .875rem;display:grid}.actor-avatar{object-fit:cover;border-radius:999px;width:2.75rem;height:2.75rem}.actor-who{flex-direction:column;gap:.125rem;min-width:0;display:flex}.actor-name{overflow-wrap:anywhere;font-weight:600;line-height:1.3}.actor-sub{color:var(--ink-soft);overflow-wrap:anywhere;font-size:.8125rem;line-height:1.4}.actor-note{color:var(--brass)}.actor-role{letter-spacing:.08em;text-transform:uppercase;width:fit-content;color:var(--signal);margin-top:.25rem;font-size:.6875rem;font-weight:700}.actor .textlink{font-size:.875rem}.chip-key{font-family:var(--font-mono);color:var(--ink-soft);flex:none;font-size:.75rem}.tag{border:1px solid var(--line-firm);background:var(--ground);color:var(--ink-soft);border-radius:999px;flex:none;padding:.0625rem .4375rem;font-size:.75rem;font-weight:500;line-height:1.6}.tag-bad{background:var(--bad-field);color:var(--bad);border-color:currentColor}.aside{color:var(--ink-soft);overflow-wrap:anywhere;margin:0;font-size:.875rem;line-height:1.5}.aside-mono{font-family:var(--font-mono);font-size:.8125rem}.aside-bad{color:var(--bad)}.approval-code{letter-spacing:.12em;color:var(--ink);text-align:center;font-size:2rem}.note{border-radius:var(--bend);color:var(--info);background:var(--info-field);border:1px solid;flex-direction:column;gap:.1875rem;padding:.8125rem .875rem;font-size:.9375rem;line-height:1.45;display:flex}.note-bad{color:var(--bad);background:var(--bad-field)}.note-plain{color:var(--ink);background:var(--glow);border-color:var(--line-firm)}.note-warn{color:var(--warn);background:var(--warn-field)}.spinner{border:2px solid;border-top-color:#0000;border-radius:50%;flex:none;width:1.05em;height:1.05em;animation:.62s linear infinite spin}.waiting{color:var(--ink-soft);align-items:center;gap:.625rem;margin:0;font-size:1rem;display:flex}.over{text-align:center;flex-direction:column;align-items:center;gap:1.5rem;display:flex}.over .prompt-lede{max-width:30ch}.over .action{width:auto;min-width:11rem}.empty{color:var(--ink-soft);margin:0;padding:.375rem 0;font-size:.9375rem;line-height:1.5}.recover{flex-flow:wrap;justify-content:space-between;align-items:baseline;gap:.375rem 1rem;display:flex}.recover>span{flex:14rem}.recover .textlink{color:inherit;flex:none;font-size:.9375rem}.recover .textlink:focus-visible{outline-color:currentColor}}@layer utilities{.collapse{visibility:collapse}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.top-0{top:0}.z-20{z-index:20}.m-0{margin:0}.mx-auto{margin-inline:auto}.ms-auto{margin-inline-start:auto}.-me-3{margin-inline-end:calc(var(--spacing) * -3)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.-mr-1{margin-right:calc(var(--spacing) * -1)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.table{display:table}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.size-16{width:calc(var(--spacing) * 16);height:calc(var(--spacing) * 16)}.min-h-screen{min-height:100vh}.w-0{width:0}.w-16{width:calc(var(--spacing) * 16)}.w-44{width:calc(var(--spacing) * 44)}.w-auto{width:auto}.w-full{width:100%}.max-w-0{max-width:0}.max-w-6xl{max-width:var(--container-6xl)}.max-w-48{max-width:calc(var(--spacing) * 48)}.max-w-60{max-width:calc(var(--spacing) * 60)}.max-w-64{max-width:calc(var(--spacing) * 64)}.max-w-\[16rem\]{max-width:16rem}.max-w-\[18rem\]{max-width:18rem}.max-w-full{max-width:100%}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-28{min-width:calc(var(--spacing) * 28)}.min-w-44{min-width:calc(var(--spacing) * 44)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.basis-28{flex-basis:calc(var(--spacing) * 28)}.cursor-pointer{cursor:pointer}.scroll-mt-20{scroll-margin-top:calc(var(--spacing) * 20)}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-5{column-gap:calc(var(--spacing) * 5)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.gap-y-1{row-gap:var(--spacing)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-4{row-gap:calc(var(--spacing) * 4)}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded{border-radius:.25rem}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-\[var\(--line\)\]{border-color:var(--line)}.border-base-300{border-color:var(--color-base-300)}.bg-base-200{background-color:var(--color-base-200)}.object-cover{object-fit:cover}.p-3{padding:calc(var(--spacing) * 3)}.px-1{padding-inline:var(--spacing)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-1{padding-block:var(--spacing)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-14{padding-block:calc(var(--spacing) * 14)}.py-16{padding-block:calc(var(--spacing) * 16)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-2{padding-left:calc(var(--spacing) * 2)}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-error{color:var(--color-error)}.text-warning{color:var(--color-warning)}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-85{opacity:.85}.outline-none{--tw-outline-style:none;outline-style:none}.last\:border-0:last-child{border-style:var(--tw-border-style);border-width:0}.last\:pb-0:last-child{padding-bottom:0}@media (hover:hover){.hover\:opacity-100:hover{opacity:1}}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}@media (width>=40rem){.sm\:col-span-2{grid-column:span 2/span 2}.sm\:size-16{width:calc(var(--spacing) * 16);height:calc(var(--spacing) * 16)}.sm\:w-48{width:calc(var(--spacing) * 48)}.sm\:w-auto{width:auto}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-\[2fr_1fr\]{grid-template-columns:2fr 1fr}.sm\:grid-cols-\[minmax\(0\,1fr\)_10rem_auto\]{grid-template-columns:minmax(0,1fr) 10rem auto}.sm\:items-end{align-items:flex-end}.sm\:gap-y-2{row-gap:calc(var(--spacing) * 2)}.sm\:pb-0{padding-bottom:0}}@media (width>=48rem){.md\:ml-auto{margin-left:auto}.md\:hidden{display:none}.md\:table-cell{display:table-cell}.md\:w-56{width:calc(var(--spacing) * 56)}.md\:w-auto{width:auto}.md\:max-w-none{max-width:none}.md\:flex-1{flex:1}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}}@media (width>=64rem){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}}@media (prefers-color-scheme:dark){:root{--color-base-100:#15110e;--color-base-200:#1e1915;--color-base-300:#3d352f;--color-base-content:#f3efec;--color-primary:#ff8f53;--color-primary-content:#1a1614;--color-secondary:#b58a41;--color-secondary-content:#000;--color-accent:#deaf56;--color-accent-content:#000;--color-neutral:#1a1614;--color-neutral-content:#e9e5e2;--color-info:#00c2fe;--color-info-content:#000;--color-success:#1dcf98;--color-success-content:#000;--color-warning:#d4ad03;--color-warning-content:#000;--color-error:#ff867a;--color-error-content:#1a1614}}:root{--glass-ruby:#b53530;--glass-ember:#b04000;--glass-amber:#a44f00;--glass-gold:#8b6200;--glass-verdant:#267e05;--glass-emerald:#008450;--glass-cyan:#008386;--glass-sky:#0077b2;--glass-cobalt:#2065c5;--glass-violet:#6e50be}@media (prefers-color-scheme:dark){:root{--glass-ruby:#ff867a;--glass-ember:#ff8f53;--glass-amber:#f19c29;--glass-gold:#d4ad03;--glass-verdant:#78c966;--glass-emerald:#1dcf98;--glass-cyan:#00cecf;--glass-sky:#00c2fe;--glass-cobalt:#70b1ff;--glass-violet:#b49dff}}@keyframes rise{0%{opacity:0;translate:0 4px}to{opacity:1;translate:none}}@keyframes sweep{0%{translate:-100%}to{translate:240%}}@keyframes spin{to{transform:rotate(360deg)}}.gate{flex-direction:column;gap:1.25rem;display:flex}.gate-moving{overflow-clip-margin:8px;overflow:visible clip}.gate-enter>*{animation:rise .34s var(--swing) both}.gate-enter>:nth-child(2){animation-delay:40ms}.gate-enter>:nth-child(3){animation-delay:80ms}.gate-enter>:nth-child(4){animation-delay:.11s}.gate-enter>:nth-child(n+5){animation-delay:.13s}@media (prefers-reduced-motion:reduce){.gate-enter>*{animation:none}.pulse-on:after{animation-duration:2.4s}.spinner{animation-duration:2s}}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.console{--text-xs:.8125rem;--text-xs--line-height:1.45;--text-sm:.875rem;--text-sm--line-height:1.5;--edge:color-mix(in oklab, var(--color-base-content) 16%, transparent);--sunk:color-mix(in oklab, var(--color-base-content) 6%, transparent);--dim:color-mix(in oklab, var(--color-base-content) 72%, transparent);--dimmer:color-mix(in oklab, var(--color-base-content) 58%, transparent);--gutter:1.25rem;--rhythm:1.25rem;--tabbar-clear:calc(5.25rem + env(safe-area-inset-bottom,0px));--radius-box:10px;--radius-field:7px;--ground:#f5f1ee;--shade:33 28 24;--gold:var(--color-secondary);--vermilion-field:color-mix(in oklab, var(--color-primary) 8%, transparent);--ring:color-mix(in oklab, var(--color-primary) 40%, transparent);--focus:2px solid var(--ring);--line:rgb(var(--shade) / .09);--line-firm:rgb(var(--shade) / .14);--sheet:var(--color-base-100);--sheet-lift:0 0 0 1px var(--line), 0 1px 2px rgb(var(--shade) / .04);--tray:#efe9e5;--tray-sink:inset 0 0 0 1px var(--line);--key:#fff;--key-hover:#faf7f5;--key-lift:inset 0 0 0 1px var(--line-firm), 0 1px 1px rgb(var(--shade) / .05);--key-sink:inset 0 0 0 1px var(--line-firm), inset 0 1px 2px rgb(var(--shade) / .1);--key-hot-hover:#c24e0c;--key-hot-lift:0 1px 1px rgb(var(--shade) / .12);--knob:#fff;--top:color-mix(in srgb, var(--ground) 96%, transparent);--tray-bar:#fffffff5;--tray-bar-lift:0 0 0 1px var(--line), 0 8px 24px rgb(var(--shade) / .1);--chart-ink:var(--color-primary);--chart-idle:color-mix(in oklab, var(--color-base-content) 14%, transparent);--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;background:var(--ground);color:var(--color-base-content);font-family:var(--font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.headline{letter-spacing:-.02em;text-wrap:balance;margin:0;font-size:1.5rem;font-weight:600;line-height:1.15}.headline-hero{letter-spacing:-.025em;font-size:1.75rem}.deck{max-width:60ch;color:var(--dim);margin:0;font-size:.875rem;line-height:1.55}.deck-sm{max-width:64ch;color:var(--dim);margin:0;font-size:.875rem;line-height:1.55}.section{min-width:0;padding-top:var(--rhythm);border-top:1px solid var(--line);flex-direction:column;gap:1rem;display:flex}.section-head{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:.5rem 1rem;display:flex}.section-head:not(:has(.deck-sm)){align-items:center;min-height:2rem}@media (width>=48rem){.console{--gutter:1.5rem;--rhythm:1.5rem}}@media (prefers-color-scheme:dark){.console{--ground:#0f0b09;--gold:var(--color-accent);--vermilion-field:color-mix(in oklab, var(--color-primary) 10%, transparent);--ring:color-mix(in oklab, var(--color-primary) 50%, transparent);--line:#ffeee113;--line-firm:#ffeee11c;--sheet-lift:0 0 0 1px var(--line), 0 1px 2px #0000004d;--tray:#0c0907;--key:var(--color-base-200);--key-hover:#292421;--key-lift:inset 0 0 0 1px var(--line-firm), 0 1px 1px #0000004d;--key-sink:inset 0 0 0 1px var(--line-firm), inset 0 1px 3px #00000080;--key-hot-hover:#ffa473;--key-hot-lift:0 1px 1px #0000004d;--knob:var(--color-neutral-content);--tray-bar:color-mix(in srgb, var(--color-neutral) 96%, transparent);--tray-bar-lift:0 0 0 1px var(--line-firm), 0 8px 24px #00000080;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}}.console-page{gap:var(--rhythm);flex-direction:column;min-width:0;display:flex}.console-bar,.console-main{padding-inline:max(var(--gutter), env(safe-area-inset-left,0px), env(safe-area-inset-right,0px))}.console-main{padding-block:var(--rhythm)}.section-body{flex-direction:column;gap:1rem;min-width:0;display:flex}@media (width>=48rem){.section-row{grid-template-columns:minmax(12rem,1fr) minmax(0,2fr);align-items:start;gap:1rem 2.5rem;display:grid}.section-row>.section-head{flex-direction:column;justify-content:flex-start;align-items:flex-start;padding-top:.375rem}}.hint,.term{color:var(--dim);font-size:.875rem;line-height:1.5}.console .field-label{color:color-mix(in oklab, var(--color-base-content) 75%, transparent);font-size:.9375rem}.console :is(.input-sm,.select-sm,.textarea-sm){font-size:.9375rem}.tip{flex:none;display:inline-flex;position:relative}.tip-mark{border:1px solid var(--edge);width:1.125rem;height:1.125rem;font:inherit;color:var(--dim);cursor:help;background:0 0;border-radius:50%;place-items:center;padding:0;font-size:.6875rem;font-weight:600;line-height:1;display:grid}.tip-mark:hover,.tip-mark:focus-visible{color:var(--color-base-content);border-color:var(--dim);outline:none}.tip-body{z-index:30;border-radius:var(--radius-box);background:var(--sheet);width:max-content;max-width:min(24rem,100vw - 2rem);box-shadow:var(--sheet-lift), 0 16px 32px -12px #00000073;letter-spacing:normal;text-transform:none;color:var(--color-base-content);opacity:0;visibility:hidden;pointer-events:none;padding:.625rem .75rem;font-size:.9375rem;font-weight:400;line-height:1.5;transition:opacity .12s;position:absolute;top:calc(100% + .5rem);left:-.5rem}.tip:hover .tip-body,.tip:focus-within .tip-body{opacity:1;visibility:visible}.subhead{letter-spacing:-.005em;color:var(--color-base-content);margin:0;font-size:.9375rem;font-weight:600}.legend{color:var(--dim);font-size:.8125rem;font-weight:600}.stamp{font-family:var(--font-mono);letter-spacing:-.01em;overflow-wrap:anywhere;color:var(--dimmer);font-size:.8125rem}.brand{letter-spacing:-.01em;color:inherit;white-space:nowrap;align-items:center;gap:.625rem;font-size:.9375rem;font-weight:600;text-decoration:none;display:flex}.brand-mark{flex:none;width:1.75rem;height:1.75rem}.nav{flex-wrap:wrap;gap:0 .25rem;display:flex}.nav-item{border-radius:var(--radius-field);white-space:nowrap;color:var(--dimmer);padding:.375rem .625rem;font-size:.875rem;font-weight:500;text-decoration:none;transition:color .15s}.nav-item:not(.nav-item-on):hover{color:var(--color-base-content);background:var(--key-hover)}.nav-item-on{color:var(--color-base-content);background:var(--key);box-shadow:var(--key-lift)}.tally{border-radius:var(--radius-box);background:var(--line);box-shadow:var(--sheet-lift);grid-auto-columns:minmax(0,1fr);grid-auto-flow:column;gap:1px;display:grid;overflow:hidden}.tally-cell{background:var(--sheet);min-width:0;color:inherit;flex-direction:column;gap:.375rem;padding:1rem 1.25rem 1.0625rem;text-decoration:none;transition:background-color .12s;display:flex;position:relative}a.tally-cell:hover{background:var(--key-hover)}a.tally-cell:hover .tally-label{color:var(--color-base-content)}a.tally-cell:after{content:"→";color:var(--dim);opacity:0;transition:opacity .12s,transform .12s;position:absolute;top:.875rem;right:1rem;transform:translate(-.25rem)}a.tally-cell:hover:after,a.tally-cell:focus-visible:after{opacity:1;transform:none}a.tally-cell:active{background:var(--tray)}.tally-cell:focus-visible{outline:var(--focus);outline-offset:-2px}.tally-figure{letter-spacing:-.03em;font-variant-numeric:tabular-nums;order:1;font-size:2rem;font-weight:600;line-height:1.1}.tally-label{color:var(--dim);overflow-wrap:anywhere;font-size:.8125rem;font-weight:500}.slats{flex-direction:column;display:flex;overflow:hidden}.slat{flex-direction:column;gap:.25rem;min-width:0;padding:.6875rem .9375rem;display:flex;overflow:hidden}.slat+.slat,.event+.event{box-shadow:inset 0 1px 0 var(--line)}.event{grid-template-columns:minmax(0,1fr) auto;align-items:baseline;gap:.125rem .75rem;min-width:0;padding:.625rem .9375rem;font-size:.8125rem;display:grid}.event-what{flex-wrap:wrap;align-items:baseline;gap:.25rem .5rem;min-width:0;display:flex}.event-label{font-size:.875rem;font-weight:500}.event-count{background:var(--sunk);color:var(--dim);font-variant-numeric:tabular-nums;border-radius:999px;padding:0 .375rem;font-size:.75rem}.event-when{color:var(--dimmer);white-space:nowrap;font-variant-numeric:tabular-nums}.callout{--tone:var(--color-warning);border-radius:var(--radius-box);background:color-mix(in oklab, var(--tone) 7%, var(--sheet));box-shadow:inset 3px 0 0 var(--tone), 0 0 0 1px color-mix(in oklab, var(--tone) 22%, transparent);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.75rem 1.5rem;padding:.875rem 1rem .875rem 1.125rem;font-size:.875rem;display:flex}.callout-info{--tone:var(--color-info)}.callout-bad{--tone:var(--color-error)}.callout-quiet{--tone:var(--dimmer)}.callout-words{flex-direction:column;flex:22rem;gap:.25rem;min-width:0;line-height:1.5;display:flex}.callout-words strong{font-weight:600}.callout-actions{flex-wrap:wrap;gap:.5rem;display:flex}.savebar{bottom:calc(env(safe-area-inset-bottom,0px) + 1rem);z-index:15;border-radius:var(--radius-box);background:var(--tray-bar);box-shadow:var(--tray-bar-lift);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.5rem 1rem;padding:.625rem .75rem .625rem 1rem;display:flex;position:sticky}@media (width<=47.99rem){.savebar{bottom:calc(var(--tabbar-clear) + .5rem)}}.event-trail{color:var(--dimmer);white-space:nowrap;text-overflow:ellipsis;grid-column:1/-1;overflow:hidden}.scope{color:var(--dim)}.scope-privileged{color:var(--color-error)}.section-row .section-body :is(.select,.input:not([type=date]),.join){max-width:24rem}.section-row .section-body .join .input{max-width:none}.ldap-facts{grid-template-columns:max-content 1fr;align-items:baseline;gap:.375rem 1rem;display:grid}.nav-count{background:var(--color-warning);min-width:1rem;color:var(--color-base-100);text-align:center;vertical-align:.0625rem;font-variant-numeric:tabular-nums;border-radius:999px;margin-inline-start:.375rem;padding-inline:.25rem;font-size:.6875rem;font-weight:600;line-height:1rem;display:inline-block}.marks{flex:none;align-items:center;gap:.25rem;display:inline-flex}.mark{width:.9375rem;height:.9375rem;color:var(--dimmer);display:inline-flex}.mark svg{width:100%;height:100%}.mark-primary{color:var(--color-primary)}.mark-good{color:var(--color-success)}.mark-info{color:var(--color-info)}.mark-warn{color:var(--color-warning)}.mark-bad{color:var(--color-error)}.compact-list{flex-direction:column;display:flex}.compact-list>li{align-items:center;gap:.25rem .75rem;min-width:0;padding-block:.5rem;display:flex}.compact-list>li+li{box-shadow:inset 0 1px 0 var(--line)}.scope-picker{flex-direction:column;gap:.75rem;min-width:0;display:flex}.scope-picker-field{max-width:28rem;position:relative}.scope-picker-list{inset-inline:0;z-index:20;border-radius:var(--radius-field);background:var(--sheet);max-height:16rem;box-shadow:var(--tray-bar-lift);padding:.25rem;position:absolute;top:calc(100% + .25rem);overflow-y:auto}.scope-picker-option{border-radius:calc(var(--radius-field) - 2px);font-size:var(--text-xs);cursor:pointer;align-items:center;gap:.5rem;padding:.375rem .5rem;display:flex}.scope-picker-active{background:var(--sunk)}.scope-picker-new{color:var(--dimmer)}.scope-picker-more{font-size:var(--text-xs);color:var(--dimmer);padding:.375rem .5rem}.scope-picker-held{flex-wrap:wrap;align-items:center;gap:.375rem;display:flex}.scope-picker-remove{opacity:.6;cursor:pointer;border-radius:999px;margin-inline:.125rem -.25rem;padding-inline:.25rem;line-height:1}.scope-picker-remove:hover{opacity:1}.scope-picker-remove:focus-visible{outline:var(--focus)}.drawn{filter:saturate(.35)contrast(1.05)}.console .table{font-variant-numeric:tabular-nums;font-size:.875rem}.console .table :where(th,td){border-bottom-color:var(--line);padding-block:.625rem}.console .table :where(tbody tr:last-child td){border-bottom:0}.console .table tr.hover:hover>td{background:color-mix(in oklab, var(--color-base-content) 3.5%, transparent)}.console .table :where(th:first-child,td:first-child){padding-inline-start:1rem}.console .table :where(th:last-child,td:last-child){padding-inline-end:1rem}.console .table thead th{white-space:nowrap;color:var(--dimmer);background:color-mix(in oklab, var(--color-base-content) 2.5%, transparent);padding-block:.5rem;font-size:.75rem;font-weight:500}.console .table tr.bare:hover>td{background:0 0}.console .badge{white-space:nowrap;letter-spacing:.02em;height:auto;min-height:var(--size);white-space:normal;text-align:left;padding-block:.1875rem;font-size:.8125rem;font-weight:600;line-height:1.35}.console .badge:not(.badge-error,.badge-success,.badge-info,.badge-warning){border-color:#0000}.console .badge-warning{color:var(--gold);background:color-mix(in oklab, var(--gold) 16%, transparent);box-shadow:inset 0 0 0 1px color-mix(in oklab, var(--gold) 30%, transparent);border-color:#0000}.chart{flex-direction:column;gap:.75rem;margin:0;display:flex}.chart-head{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:.5rem 1rem;display:flex}.chart-peak{color:var(--dimmer);font-size:.8125rem}.chart-plot{padding:.75rem .75rem 0;position:relative}.chart-svg{width:100%;height:auto;display:block;overflow:visible}.chart-base{stroke:var(--edge);stroke-width:1px}.chart-bar{fill:var(--chart-ink)}.chart-bar-idle{fill:var(--chart-idle)}.chart-hit{fill:#0000}.chart-bar-on{fill:var(--color-base-content)}.chart-tip{white-space:nowrap;pointer-events:none;border-radius:var(--radius-field);background:var(--sheet);color:var(--color-base-content);box-shadow:var(--sheet-lift), 0 8px 20px -8px #0006;bottom:calc(100% - 1.25rem);left:var(--at);transform:translateX(calc(var(--at) * -1));padding:.375rem .5625rem;font-size:.8125rem;line-height:1.3;position:absolute}.chart-tip strong{font-variant-numeric:tabular-nums;font-weight:600}.chart-tip span{opacity:.7;display:block}.chart-axis{font-variant-numeric:tabular-nums;height:1rem;color:var(--dimmer);margin-inline:.75rem;font-size:.75rem;position:relative}.chart-axis span{left:var(--at);transform:translateX(calc(var(--at) * -1));white-space:nowrap;position:absolute}.range{border-radius:var(--radius-field);scrollbar-width:none;gap:2px;width:max-content;max-width:100%;padding:3px;display:inline-flex;overflow-x:auto}.range button{white-space:nowrap;border-radius:calc(var(--radius-field) - 3px);font:inherit;font-variant-numeric:tabular-nums;color:var(--dimmer);cursor:pointer;background:0 0;border:0;flex:none;padding:.25rem .625rem;font-size:.8125rem;font-weight:500;transition:background-color .15s,color .15s}.range button:hover{color:var(--color-base-content)}.range button[aria-pressed=true]{background:var(--key);box-shadow:var(--key-lift);color:var(--color-base-content)}.range button:focus-visible{outline:var(--focus);outline-offset:1px}.console .prompt-title{letter-spacing:-.02em;font-weight:600}.console-cog{width:2rem;height:2rem;color:var(--dim);border-radius:50%;flex:none;place-items:center;text-decoration:none;transition:color .15s,background-color .15s;display:grid}.console-cog svg{width:1.375rem;height:1.375rem}.console-cog:hover,.console-cog:focus-visible{color:var(--color-base-content);background:var(--key);box-shadow:var(--key-lift);outline:none}.console-cog:focus-visible{box-shadow:var(--key-lift), 0 0 0 2px var(--ring)}.console-cog:active{box-shadow:var(--key-sink)}.console-cog-on{color:var(--color-primary);background:var(--vermilion-field)}.settings{gap:1.5rem;display:grid}.settings-bar{border-bottom:1px solid var(--edge);align-items:center;gap:1rem;min-width:0;padding-bottom:.75rem;display:flex}.settings-tabs{gap:.25rem;min-width:0;display:flex;overflow-x:auto}.settings-tab{border-radius:var(--radius-field);font:inherit;text-align:left;white-space:nowrap;color:var(--dim);cursor:pointer;background:0 0;border:0;padding:.375rem .625rem;font-size:.875rem;text-decoration:none}.settings-tab:hover{color:var(--color-base-content);background:var(--key-hover)}.settings-tab-on{color:var(--color-base-content);background:var(--key);box-shadow:var(--key-lift);font-weight:500}.settings-me{flex-wrap:wrap;align-items:center;gap:.25rem;min-width:0;display:flex}.settings-who{max-width:14rem;color:var(--dim);border-radius:999px;align-items:center;gap:.5rem;padding:.25rem .625rem .25rem .25rem;font-size:.875rem;text-decoration:none;display:inline-flex}.settings-who:hover{color:var(--color-base-content);background:var(--key-hover)}.settings-who img{object-fit:cover;border-radius:50%;flex:none;width:1.5rem;height:1.5rem}.settings-who span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.settings-quiet{color:var(--dimmer);font-size:.875rem}@media (width>=48rem){.settings-me{flex-wrap:nowrap;margin-inline-start:auto}}@media (width<=47.99rem){.settings-bar{display:contents}.settings .settings-tabs{border-bottom:1px solid var(--edge);order:0;padding-bottom:.75rem}.settings>.min-w-0{order:1}.settings-me{border-top:1px solid var(--edge);order:2;padding-top:1rem}}.policy-rows{flex-direction:column;display:flex}.policy-row{border-top:1px solid var(--edge);gap:.625rem;padding-block:1rem;display:grid}.policy-controls{flex-direction:column;gap:.75rem;min-width:0;display:flex}@media (width>=40rem){.policy-row{grid-template-columns:8rem minmax(0,1fr);gap:1.5rem}.policy-row>.legend{padding-top:.25rem}}.sr-only{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;margin:-1px;position:absolute;overflow:hidden}.btn-disabled{opacity:.45;pointer-events:none}.tabbar{inset:auto max(.625rem, env(safe-area-inset-left,0px)) calc(env(safe-area-inset-bottom,0px) + .625rem) max(.625rem, env(safe-area-inset-right,0px));z-index:20;background:var(--tray-bar);box-shadow:var(--tray-bar-lift);border-radius:1.25rem;grid-template-columns:repeat(4,minmax(0,1fr));gap:.25rem;padding:.375rem;display:grid;position:fixed}.tabbar-item{letter-spacing:.02em;color:var(--dimmer);-webkit-tap-highlight-color:transparent;border-radius:.875rem;flex-direction:column;align-items:center;gap:.25rem;padding:.4375rem 0 .5rem;font-size:.8125rem;font-weight:500;text-decoration:none;transition:background-color .15s,color .15s;display:flex}.tabbar-item svg{width:1.375rem;height:1.375rem}.tabbar-item-on{color:var(--color-primary);background:var(--vermilion-field)}.tabbar-item:active{box-shadow:var(--key-sink)}.tabbar-item:focus-visible{outline:var(--focus);outline-offset:-2px}@media (width>=48rem){.tabbar{display:none}}@media (width<=47.99rem){.nav{display:none}.console-main{min-width:0;padding-bottom:calc(var(--tabbar-clear) + 2rem);overflow-x:clip}.tally{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-flow:row}.tally-cell{padding:.875rem 1rem}.tally-cell:first-child:nth-last-child(odd){grid-column:1/-1}.section-head .btn-ghost{margin-inline-end:calc(var(--btn-p,.75rem) * -1)}.tip-body{inset:auto var(--gutter) calc(var(--tabbar-clear) + .75rem);width:auto;max-width:none;position:fixed}}.more>summary{cursor:pointer;width:fit-content;color:var(--dim);font-size:.875rem;list-style:none}.more>summary::-webkit-details-marker{display:none}.more>summary:before{content:"+ "}.more[open]>summary:before{content:"− "}.mail{gap:1.25rem;display:grid}.mail-pick{flex-direction:column;gap:.5rem;display:flex}.mail-list{flex-direction:column;gap:1.25rem;display:none}@media (width>=48rem){.mail-pick{display:none}.mail-list{display:flex}}.mail-group{flex-direction:column;gap:.125rem;display:flex}.mail-group>.select{margin-block:.375rem}.mail-item{border-radius:var(--radius-field);font:inherit;text-align:left;color:var(--dim);cursor:pointer;background:0 0;border:0;padding:.3125rem .625rem;font-size:.875rem}.mail-item:hover{color:var(--color-base-content);background:var(--key-hover)}.mail-item[aria-current]{color:var(--color-base-content);background:var(--key);box-shadow:var(--key-lift);font-weight:500}.mail-view{flex-direction:column;gap:.75rem;min-width:0;display:flex}.mail-head{flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:.5rem 1rem;display:flex}.mail-words{border-block:1px solid var(--color-base-300);flex-direction:column;gap:.75rem;padding-block:.75rem;display:flex}.mail-template summary{cursor:pointer}.mail-subject{overflow-wrap:anywhere;margin:0;font-size:1.0625rem;font-weight:600}.mail-frame{border:1px solid var(--edge);border-radius:var(--radius-box);width:100%;height:32rem;display:block}.mail-text{border:1px solid var(--edge);border-radius:var(--radius-box);background:var(--sunk);font-family:var(--font-mono);white-space:pre-wrap;overflow-wrap:anywhere;margin:0;padding:1rem;font-size:.875rem;line-height:1.6}@media (width>=48rem){.mail{grid-template-columns:15rem minmax(0,1fr);align-items:start;gap:2rem}.mail-list{position:sticky;top:5rem}}.pager{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.5rem 1rem;display:flex}.console-top{background:var(--top);box-shadow:0 1px 0 var(--line)}.sheet,.slats{border-radius:var(--radius-box)}.sheet,.slats,.console .alert{background:var(--sheet);box-shadow:var(--sheet-lift)}.sheet-press{transition:background-color .12s,box-shadow .12s}.sheet-press:hover{background:var(--key-hover);box-shadow:0 0 0 1px var(--line-firm)}.sheet-press:active{background:var(--tray)}.tray{border-radius:calc(var(--radius-box) - 4px)}.tray,.range,.console :is(.input,.select,.textarea),.console .toggle,.console .badge:not(.badge-error,.badge-success,.badge-info,.badge-warning),.console .alert-soft{background-color:var(--tray);box-shadow:var(--tray-sink)}.console .btn{border-radius:var(--radius-field);background:var(--key);box-shadow:var(--key-lift);color:inherit;border:0;font-weight:500;transition:background-color .12s,box-shadow .12s,transform 80ms}.console .btn:hover:not(:disabled){background:var(--key-hover)}.console .btn:active:not(:disabled){box-shadow:var(--key-sink)}.console .btn:focus-visible{outline:var(--focus);outline-offset:2px}.console .btn-primary{background:var(--color-primary);box-shadow:var(--key-hot-lift);color:var(--color-primary-content)}.console .btn-primary:hover:not(:disabled){background:var(--key-hot-hover)}.console .btn-primary:active:not(:disabled){background:var(--color-primary);box-shadow:inset 0 1px 2px #0000004d}.console .btn-error:not(.btn-outline,.btn-ghost){background:var(--color-error);color:var(--color-error-content);box-shadow:0 1px 1px #0003}.console .btn-error:not(.btn-outline,.btn-ghost):hover:not(:disabled){background:color-mix(in oklab, var(--color-error) 90%, white)}.console .btn-ghost{box-shadow:none;color:var(--dim);background:0 0}.console .btn-ghost:hover:not(:disabled){background:var(--key-hover);box-shadow:none;color:var(--color-base-content)}.console .btn-error.btn-outline:hover:not(:disabled),.console .btn-error.btn-outline:focus-visible{background:color-mix(in oklab, var(--color-error) 12%, var(--key));box-shadow:inset 0 0 0 1px color-mix(in oklab, var(--color-error) 45%, transparent);color:var(--color-error)}.console :is(.input,.select,.textarea){border-radius:var(--radius-field);border:0}.console :is(.input,.select,.textarea):focus{outline:var(--focus);outline-offset:1px}.console .select option{background:var(--color-base-100);color:var(--color-base-content)}.console .toggle{border-color:#0000}.console .toggle:after{background:var(--knob);box-shadow:var(--key-lift)}.console .toggle:checked{background:var(--color-primary);box-shadow:none}.console .toggle:checked:after{background:var(--sheet)}.console .toggle:focus-visible{outline:var(--focus);outline-offset:2px}.console .alert{border:0}.console .link:focus-visible,.console a:focus-visible{outline:var(--focus);outline-offset:2px;border-radius:3px}@media (prefers-reduced-motion:no-preference){.console .btn:active:not(:disabled){transform:translateY(.5px)}}@media (prefers-reduced-motion:reduce){.console :is(.btn,.sheet-press){transition:none}}.dash,.dash-main,.dash-side{gap:var(--rhythm);flex-direction:column;min-width:0;display:flex}@media (width>=64rem){.dash{grid-template-columns:minmax(0,2fr) minmax(18rem,1fr);align-items:start;gap:2.5rem;display:grid}}.console .btn-ghost.btn-error:hover:not(:disabled),.console .btn-ghost.btn-error:focus-visible{background:color-mix(in oklab, var(--color-error) 10%, transparent);color:var(--color-error)}@media (width<=47.99rem){.range,.settings-tabs{flex-wrap:wrap;overflow-x:visible}.range{width:auto}}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e=document.querySelector(`[data-countdown]`);if(e){let t=e.textContent,n=e.dataset.waiting,r=Number(e.dataset.countdown),i=()=>{e.disabled=r>0,e.textContent=r>0?n.replace(`%{seconds}`,r):t};i();let a=setInterval(()=>{document.visibilityState===`visible`&&(--r,i(),r<=0&&clearInterval(a))},1e3)}for(let e of document.querySelectorAll(`form`))e.addEventListener(`submit`,t=>{if(e.ariaBusy===`true`){t.preventDefault();return}e.ariaBusy=`true`;for(let t of e.querySelectorAll(`.action`))t.classList.add(`action-busy`)});
|
|
2
|
+
//# sourceMappingURL=handshake-DIFZPSAK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handshake-DIFZPSAK.js","names":["button","ready","waiting","left","render","timer","form","event","action"],"sources":["../../../../server/app/frontend/entrypoints/handshake.js"],"sourcesContent":["const button = document.querySelector(\"[data-countdown]\");\n\nif (button) {\n const ready = button.textContent;\n const waiting = button.dataset.waiting;\n let left = Number(button.dataset.countdown);\n\n const render = () => {\n button.disabled = left > 0;\n button.textContent = left > 0 ? waiting.replace(\"%{seconds}\", left) : ready;\n };\n\n render();\n\n const timer = setInterval(() => {\n if (document.visibilityState !== \"visible\") return;\n\n left -= 1;\n render();\n\n if (left <= 0) clearInterval(timer);\n }, 1000);\n}\n\nfor (const form of document.querySelectorAll(\"form\")) {\n form.addEventListener(\"submit\", (event) => {\n if (form.ariaBusy === \"true\") {\n event.preventDefault();\n return;\n }\n\n form.ariaBusy = \"true\";\n for (const action of form.querySelectorAll(\".action\"))\n action.classList.add(\"action-busy\");\n });\n}\n"],"mappings":"AAAA,IAAMA,EAAS,SAAS,cAAc,kBAAkB,EAExD,GAAIA,EAAQ,CACV,IAAMC,EAAQD,EAAO,YACfE,EAAUF,EAAO,QAAQ,QAC3BG,EAAO,OAAOH,EAAO,QAAQ,SAAS,EAEpCI,MAAe,CACnB,EAAO,SAAWD,EAAO,EACzB,EAAO,YAAcA,EAAO,EAAID,EAAQ,QAAQ,aAAcC,CAAI,EAAIF,CACxE,EAEAG,EAAO,EAEP,IAAMC,EAAQ,gBAAkB,CAC1B,SAAS,kBAAoB,YAEjC,IACAD,EAAO,EAEHD,GAAQ,GAAG,cAAcE,CAAK,EACpC,EAAG,GAAI,CACT,CAEA,IAAK,IAAMC,KAAQ,SAAS,iBAAiB,MAAM,EACjDA,EAAK,iBAAiB,SAAW,GAAU,CACzC,GAAIA,EAAK,WAAa,OAAQ,CAC5BC,EAAM,eAAe,EACrB,MACF,CAEA,EAAK,SAAW,OAChB,IAAK,IAAMC,KAAUF,EAAK,iBAAiB,SAAS,EAClDE,EAAO,UAAU,IAAI,aAAa,CACtC,CAAC"}
|