masks-server 0.7.0 → 0.8.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/masks/server/enrollments_controller.rb +66 -0
- data/app/controllers/masks/server/introspections_controller.rb +2 -2
- data/app/controllers/masks/server/registrations_controller.rb +31 -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/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/client.rb +81 -1
- 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/issuer.rb +1 -0
- data/app/models/masks/server/namespace.rb +6 -3
- data/app/models/masks/server/replay.rb +22 -4
- data/app/models/masks/server/token.rb +1 -0
- data/app/views/layouts/masks/server/manage.html.erb +2 -2
- data/app/views/masks/server/application/_person.html.erb +1 -1
- data/app/views/masks/server/handshakes/show.html.erb +129 -59
- data/config/locales/de/account.yml +1 -1
- data/config/locales/de/events.yml +5 -2
- 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 +6 -6
- 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 +3 -3
- data/config/locales/en/events.yml +4 -1
- 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 +6 -6
- 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 +1 -1
- data/config/locales/es/application.yml +1 -1
- data/config/locales/es/events.yml +4 -1
- 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 +6 -6
- 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/events.yml +3 -0
- 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 +6 -6
- 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/public/masks-assets/.vite/manifest-assets.json +1 -0
- data/public/masks-assets/.vite/manifest.json +62 -0
- data/public/masks-assets/assets/app-DoQZrM_J.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/manage-isLCrWiU.js +567 -0
- data/public/masks-assets/assets/manage-isLCrWiU.js.map +1 -0
- data/version.txt +1 -1
- metadata +14 -7
- 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/manage-Z3GmPDNQ.js +0 -560
- data/public/masks-assets/assets/manage-Z3GmPDNQ.js.map +0 -1
|
@@ -29,7 +29,7 @@ fr:
|
|
|
29
29
|
notices:
|
|
30
30
|
discovered: "Points de terminaison renseignés à partir du document de découverte."
|
|
31
31
|
metadata_read: "L’entité, l’URL de connexion et les certificats du fournisseur d’identité ont été lus."
|
|
32
|
-
registered: "%{name} est enregistré, et les
|
|
32
|
+
registered: "%{name} est enregistré, et les clients peuvent l’utiliser."
|
|
33
33
|
added: "%{name} peut désormais connecter des utilisateurs."
|
|
34
34
|
saved: "%{name} enregistré."
|
|
35
35
|
archived: "%{name} est archivé."
|
|
@@ -39,10 +39,12 @@ fr:
|
|
|
39
39
|
archive: "Archiver %{name} ? Personne ne pourra se connecter avec lui tant qu’il n’est pas restauré."
|
|
40
40
|
register: "S’enregistrer de nouveau auprès de %{name} ? Toutes les personnes qui y sont liées devront se reconnecter."
|
|
41
41
|
picker:
|
|
42
|
-
help: "Choisissez
|
|
42
|
+
help: "Choisissez avec quoi les acteurs se connectent. Ce qui n’est pas listé parle l’un des protocoles de Tout le reste."
|
|
43
|
+
back: "En choisir un autre"
|
|
44
|
+
known: "Fournisseurs connus"
|
|
45
|
+
generic: "Tout le reste"
|
|
43
46
|
form:
|
|
44
47
|
add_title: "Ajouter %{name}"
|
|
45
|
-
edit_title: "Modifier %{name}"
|
|
46
48
|
guide_lead: "Enregistrez d’abord masks auprès de %{name} :"
|
|
47
49
|
guide_link: "Console de %{name}"
|
|
48
50
|
give: "Donnez ceci à %{name}"
|
|
@@ -62,13 +64,13 @@ fr:
|
|
|
62
64
|
certificates: "Certificats de signature"
|
|
63
65
|
name_id_format: "Format du Name ID"
|
|
64
66
|
mcp_url: "URL du serveur MCP"
|
|
65
|
-
mcp_hint: "masks trouve le serveur d’autorisation du serveur à partir de ses métadonnées de ressource protégée et s’y enregistre
|
|
67
|
+
mcp_hint: "masks trouve le serveur d’autorisation du serveur à partir de ses métadonnées de ressource protégée et s’y enregistre, il n’y a donc pas d’ID client à copier. Un serveur MCP ne connecte jamais personne. Les clients l’utilisent pour un acteur."
|
|
66
68
|
issuer: "Émetteur"
|
|
67
69
|
discover: "Découvrir"
|
|
68
70
|
authorization_url: "URL d’autorisation"
|
|
69
71
|
token_url: "URL des jetons"
|
|
70
72
|
userinfo_url: "URL Userinfo"
|
|
71
|
-
emails_url: "URL des e-mails
|
|
73
|
+
emails_url: "URL des e-mails"
|
|
72
74
|
jwks_uri: "URI JWKS"
|
|
73
75
|
optional: "facultatif"
|
|
74
76
|
discovered_if_empty: "découvert si laissé vide"
|
|
@@ -91,66 +93,86 @@ fr:
|
|
|
91
93
|
subject_oidc: "Sujet (sub ou oid)"
|
|
92
94
|
subject_path: "Chemin du sujet"
|
|
93
95
|
attribute_name: "nom de l’attribut"
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
delegates_hint: "Une application approuvée peut demander à un utilisateur l’autorisation d’agir en son nom sur %{name} pendant son absence. masks conserve les jetons, les actualise et ne remet chacun d’eux qu’à l’application que cet utilisateur a acceptée."
|
|
98
|
-
delegated_scopes: "Ce que les applications peuvent faire"
|
|
96
|
+
delegates: "Laisser les clients utiliser le compte %{name} d’un acteur"
|
|
97
|
+
delegates_hint: "Un client approuvé peut demander à un acteur de le laisser agir en son nom sur %{name} pendant son absence. masks garde les jetons, les renouvelle et ne remet chacun qu’au client auquel cet acteur a dit oui."
|
|
98
|
+
delegated_scopes: "Ce que les clients peuvent faire"
|
|
99
99
|
server_grants: "ce que le serveur accorde"
|
|
100
100
|
delegation_params: "Paramètres supplémentaires lors de la liaison"
|
|
101
|
-
delegation_asks: "
|
|
102
|
-
delegation_reconnect: "
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
this_provider: "Ce fournisseur"
|
|
106
|
-
owns_hint: "Activé, une nouvelle personne obtient un compte ici, et son nom, sa photo et son adresse suivent %{name} à chaque connexion. Désactivé, ce n’est qu’un autre moyen d’accéder à un compte existant. Dans les deux cas, il remplace un mot de passe, jamais un second facteur."
|
|
101
|
+
delegation_asks: "Un client demande"
|
|
102
|
+
delegation_reconnect: "Changer ce que les clients peuvent faire oblige tout le monde à se reconnecter."
|
|
103
|
+
owns: "Ajouter les acteurs qu’il connecte"
|
|
104
|
+
owns_hint: "Activé, une personne nouvelle devient un acteur ici, et son nom, sa photo et son adresse suivent %{name} à chaque connexion. Désactivé, ce n’est qu’un autre moyen de se connecter en tant qu’acteur existant. Dans les deux cas, il remplace un mot de passe, jamais un second facteur."
|
|
107
105
|
trusts_email: "Faire confiance aux adresses qu’il confirme"
|
|
108
106
|
trusts_email_hint: "Uniquement pour un fournisseur qui vérifie réellement qu’un utilisateur détient la boîte aux lettres, comme Google, Apple et GitHub. Désactivé, seules les adresses des domaines ci-dessous sont acceptées telles quelles."
|
|
109
107
|
signals: "Accepter ses événements de sécurité"
|
|
110
108
|
signals_lead: "Il envoie des signaux partagés à"
|
|
111
|
-
signals_rest: "Une session révoquée, un identifiant
|
|
109
|
+
signals_rest: "Une session révoquée, un identifiant changé ou un compte désactivé là-bas déconnecte l’acteur partout ici."
|
|
112
110
|
saml_domains: "Domaines d’e-mail dont il répond"
|
|
113
111
|
domains: "Domaines d’e-mail"
|
|
114
112
|
any_domain: "n’importe quel domaine"
|
|
115
|
-
signup_scopes: "Portées d’un
|
|
113
|
+
signup_scopes: "Portées d’un nouvel acteur"
|
|
116
114
|
saving: "Enregistrement..."
|
|
117
115
|
add: "Ajouter"
|
|
118
116
|
save: "Enregistrer"
|
|
119
|
-
empty: "Aucun fournisseur n’est configuré. Ajoutez-en un
|
|
120
|
-
edit: "Modifier"
|
|
117
|
+
empty: "Aucun fournisseur n’est configuré. Ajoutez-en un et les acteurs pourront se connecter avec Google, GitHub, Okta, Entra ID ou tout ce qui parle OpenID Connect, OAuth 2.0 ou SAML."
|
|
121
118
|
register: "S’enregistrer de nouveau"
|
|
122
119
|
archive: "Archiver"
|
|
123
|
-
badges:
|
|
124
|
-
never_signs_in: "ne connecte jamais"
|
|
125
|
-
owns_accounts: "possède les comptes"
|
|
126
|
-
existing_only: "comptes existants uniquement"
|
|
127
|
-
trusts_email: "fait confiance aux adresses confirmées"
|
|
128
|
-
signals: "accepte les événements de sécurité"
|
|
129
|
-
delegates: "utilisable par les applications"
|
|
130
120
|
facts:
|
|
131
|
-
|
|
132
|
-
redirect_uri: "URI de redirection"
|
|
133
|
-
sp_entity_id: "Entity ID du fournisseur de services"
|
|
134
|
-
identity_provider: "Fournisseur d’identité"
|
|
135
|
-
metadata: "Métadonnées"
|
|
136
|
-
metadata_read: "lues le %{day}"
|
|
121
|
+
metadata_read: "Métadonnées lues %{day}."
|
|
137
122
|
never: "jamais"
|
|
138
|
-
|
|
139
|
-
client_id: "Client ID"
|
|
140
|
-
signing_key: "Clé de signature"
|
|
141
|
-
secret: "Secret"
|
|
142
|
-
held: "conservé"
|
|
143
|
-
none_set: "aucun"
|
|
144
|
-
issuer: "Émetteur"
|
|
145
|
-
scopes: "Portées demandées en amont"
|
|
146
|
-
mcp_server: "Serveur MCP"
|
|
147
|
-
registered: "Enregistré"
|
|
148
|
-
delegation_scope: "Les applications demandent"
|
|
149
|
-
delegations: "Applications qui l’utilisent"
|
|
150
|
-
delegated_scopes: "Ce que les applications peuvent faire"
|
|
151
|
-
connections: "Comptes associés"
|
|
123
|
+
registered: "Enregistré là-bas %{day}."
|
|
152
124
|
signed_in: "Connexions avec ce fournisseur : %{count}"
|
|
153
|
-
|
|
125
|
+
delegations_count:
|
|
126
|
+
one: "Les clients détiennent %{count} délégation par lui."
|
|
127
|
+
other: "Les clients détiennent %{count} délégations par lui."
|
|
154
128
|
archived: "Archivés"
|
|
155
129
|
archived_on: "archivé le %{day}"
|
|
156
130
|
restore: "Restaurer"
|
|
131
|
+
lede: "Les autres endroits par lesquels les acteurs se connectent, et les serveurs MCP que les clients peuvent utiliser pour un acteur."
|
|
132
|
+
back: "Fournisseurs"
|
|
133
|
+
copy: "Copier"
|
|
134
|
+
missing: "Aucun fournisseur n’a cette clé."
|
|
135
|
+
unsaved: "Modifications non enregistrées"
|
|
136
|
+
discard: "Annuler les modifications"
|
|
137
|
+
danger: "Archiver"
|
|
138
|
+
danger_lede: "Personne ne peut se connecter avec lui tant qu’il n’est pas restauré."
|
|
139
|
+
danger_lede_mcp: "S’enregistrer à nouveau oblige tous ceux qui y sont connectés à se reconnecter. L’archiver l’arrête jusqu’à sa restauration."
|
|
140
|
+
columns:
|
|
141
|
+
provider: "Fournisseur"
|
|
142
|
+
kind: "Type"
|
|
143
|
+
connections: "Comptes associés"
|
|
144
|
+
roles:
|
|
145
|
+
owns: "ajoute les acteurs qu’il connecte"
|
|
146
|
+
existing: "connecte seulement les acteurs existants"
|
|
147
|
+
never: "ne connecte jamais personne"
|
|
148
|
+
marks:
|
|
149
|
+
owns: "Ajoute les acteurs qu’il connecte"
|
|
150
|
+
trusts_email: "Fait confiance aux adresses qu’il confirme"
|
|
151
|
+
signals: "Accepte ses événements de sécurité"
|
|
152
|
+
delegates: "Les clients peuvent l’utiliser pour un acteur"
|
|
153
|
+
no_secret: "Aucun secret client n’est défini"
|
|
154
|
+
parts:
|
|
155
|
+
label: "Fournisseur"
|
|
156
|
+
setup: "Configuration"
|
|
157
|
+
sign_in: "Connexion"
|
|
158
|
+
clients: "Clients"
|
|
159
|
+
accounts: "Comptes associés (%{count})"
|
|
160
|
+
sections:
|
|
161
|
+
give_lede: "Enregistrez masks là-bas avec ces valeurs, pour qu’il renvoie les acteurs ici."
|
|
162
|
+
identity: "Nom"
|
|
163
|
+
identity_lede: "La clé fait partie de son URI de redirection, elle ne peut donc plus changer une fois ajoutée."
|
|
164
|
+
endpoints: "Points de terminaison"
|
|
165
|
+
endpoints_oidc: "Découvrir les remplit à partir du document de découverte de l’émetteur."
|
|
166
|
+
credentials_lede: "Ce que %{name} a émis quand masks y a été enregistré."
|
|
167
|
+
mcp: "Serveur MCP"
|
|
168
|
+
accounts: "Acteurs"
|
|
169
|
+
addresses: "Adresses e-mail"
|
|
170
|
+
signals: "Événements de sécurité"
|
|
171
|
+
claims_lede: "Quelle revendication ou quel attribut remplit chaque partie du profil d’un acteur."
|
|
172
|
+
delegation: "Délégation"
|
|
173
|
+
callouts:
|
|
174
|
+
archived: "Archivé %{day}. Personne ne peut se connecter avec lui."
|
|
175
|
+
no_secret: "Aucun secret client n’est défini"
|
|
176
|
+
no_secret_detail: "Saisissez sous Identifiants ce que %{name} a émis."
|
|
177
|
+
organization_lead: "Il appartient à"
|
|
178
|
+
organization_rest: "Les acteurs qui se connectent par lui rejoignent cette organisation."
|
|
@@ -2,7 +2,7 @@ fr:
|
|
|
2
2
|
manage:
|
|
3
3
|
provisioning:
|
|
4
4
|
title: "Provisionnement"
|
|
5
|
-
lede: "Un
|
|
5
|
+
lede: "Un annuaire ajoute, modifie, suspend et supprime ici des acteurs via SCIM 2.0."
|
|
6
6
|
revoke_confirm: "Révoquer %{label} ? Tout provisionnement qui l’utilise est désormais refusé."
|
|
7
7
|
revoked: "%{label} est révoqué."
|
|
8
8
|
lifetimes:
|
|
@@ -10,12 +10,12 @@ fr:
|
|
|
10
10
|
quarter: "90 jours"
|
|
11
11
|
year: "Un an"
|
|
12
12
|
connect:
|
|
13
|
-
title: "Connecter un
|
|
14
|
-
help: "Donnez
|
|
13
|
+
title: "Connecter un annuaire"
|
|
14
|
+
help: "Donnez à l’annuaire cette URL et un jeton. Un acteur provisionné est identifié par son adresse e-mail, que masks considère comme confirmée, et se connecte via un fournisseur ou une invitation. Le mot de passe et l’adresse e-mail de quiconque détient une portée masks: ne sont jamais modifiés de cette façon, et le dernier gestionnaire n’est jamais suspendu ni supprimé."
|
|
15
15
|
base_url: "URL de base SCIM"
|
|
16
16
|
label: "Libellé"
|
|
17
17
|
provisions: "Provisionne"
|
|
18
|
-
every_account: "Tous les
|
|
18
|
+
every_account: "Tous les acteurs"
|
|
19
19
|
only_members: "Seulement les membres de %{name}"
|
|
20
20
|
lifetime: "Durée de vie du jeton"
|
|
21
21
|
issue: "Émettre un jeton"
|
|
@@ -25,7 +25,7 @@ fr:
|
|
|
25
25
|
name: "Nom"
|
|
26
26
|
optional: "%{label} (facultatif)"
|
|
27
27
|
unchanged: "inchangé"
|
|
28
|
-
primary: "Principal
|
|
28
|
+
primary: "Principal, tout ce type est envoyé par son intermédiaire"
|
|
29
29
|
create: "Ajouter"
|
|
30
30
|
save: "Enregistrer"
|
|
31
31
|
cancel: "Annuler"
|
|
@@ -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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_initial-D99AzFOd.js": {
|
|
3
|
+
"file": "assets/initial-D99AzFOd.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-DoQZrM_J.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-CNs1UpxJ.js",
|
|
45
|
+
"name": "entrypoints/login.js",
|
|
46
|
+
"src": "entrypoints/login.js",
|
|
47
|
+
"isEntry": true,
|
|
48
|
+
"imports": [
|
|
49
|
+
"_passkey-DIj_5LCY.js",
|
|
50
|
+
"_initial-D99AzFOd.js"
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
"entrypoints/manage.js": {
|
|
54
|
+
"file": "assets/manage-isLCrWiU.js",
|
|
55
|
+
"name": "entrypoints/manage.js",
|
|
56
|
+
"src": "entrypoints/manage.js",
|
|
57
|
+
"isEntry": true,
|
|
58
|
+
"imports": [
|
|
59
|
+
"_initial-D99AzFOd.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,.person{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 .person{box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none;border-color:var(--line);background:0 0}.handshake-as .person-note{color:var(--ink-soft);font-style:italic}.handshake-as .person-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}.person{border-radius:.75rem;grid-template-columns:auto 1fr auto;align-items:center;gap:.875rem;padding:.75rem .875rem;display:grid}.person-avatar{object-fit:cover;border-radius:999px;width:2.75rem;height:2.75rem}.person-who{flex-direction:column;gap:.125rem;min-width:0;display:flex}.person-name{overflow-wrap:anywhere;font-weight:600;line-height:1.3}.person-sub{color:var(--ink-soft);overflow-wrap:anywhere;font-size:.8125rem;line-height:1.4}.person-note{color:var(--brass)}.person-role{letter-spacing:.08em;text-transform:uppercase;width:fit-content;color:var(--signal);margin-top:.25rem;font-size:.6875rem;font-weight:700}.person .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}
|