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.
Files changed (208) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/masks/server/client_authentication.rb +1 -1
  3. data/app/controllers/concerns/masks/server/resource_token.rb +12 -3
  4. data/app/controllers/masks/server/application_controller.rb +8 -6
  5. data/app/controllers/masks/server/authorize_controller.rb +1 -1
  6. data/app/controllers/masks/server/enrollments_controller.rb +66 -0
  7. data/app/controllers/masks/server/introspections_controller.rb +2 -2
  8. data/app/controllers/masks/server/logins_controller.rb +2 -1
  9. data/app/controllers/masks/server/registrations_controller.rb +40 -2
  10. data/app/controllers/masks/server/scim/metadata_controller.rb +1 -1
  11. data/app/controllers/masks/server/tokens_controller.rb +1 -1
  12. data/app/graphql/masks/server/manage/mutations/add_app.rb +1 -1
  13. data/app/graphql/masks/server/manage/types/client_type.rb +8 -0
  14. data/app/graphql/masks/server/manage/types/query_type.rb +6 -1
  15. data/app/helpers/masks/server/account_helper.rb +1 -1
  16. data/app/helpers/masks/server/application_helper.rb +0 -1
  17. data/app/helpers/masks/server/scopes_helper.rb +28 -0
  18. data/app/jobs/masks/server/cleanup_job.rb +1 -0
  19. data/app/models/masks/server/actor.rb +3 -3
  20. data/app/models/masks/server/client.rb +127 -7
  21. data/app/models/masks/server/client_keys.rb +6 -1
  22. data/app/models/masks/server/enrollment_token.rb +54 -0
  23. data/app/models/masks/server/event.rb +3 -0
  24. data/app/models/masks/server/handshake.rb +12 -6
  25. data/app/models/masks/server/issuer.rb +1 -0
  26. data/app/models/masks/server/login.rb +3 -6
  27. data/app/models/masks/server/namespace.rb +6 -3
  28. data/app/models/masks/server/pending_handshake.rb +2 -1
  29. data/app/models/masks/server/replay.rb +22 -4
  30. data/app/models/masks/server/session.rb +7 -5
  31. data/app/models/masks/server/token.rb +1 -0
  32. data/app/policies/masks/server/exchange_policy.rb +1 -1
  33. data/app/policies/masks/server/grant_checks.rb +1 -1
  34. data/app/views/layouts/masks/server/manage.html.erb +2 -2
  35. data/app/views/masks/server/account/_info.html.erb +1 -1
  36. data/app/views/masks/server/account/_organizations.html.erb +4 -4
  37. data/app/views/masks/server/application/_actor.html.erb +27 -0
  38. data/app/views/masks/server/handshakes/refused.html.erb +1 -1
  39. data/app/views/masks/server/handshakes/show.html.erb +129 -59
  40. data/app/views/masks/server/logins/_choose_organization.html.erb +1 -1
  41. data/app/views/masks/server/logins/_consent.html.erb +1 -1
  42. data/app/views/masks/server/sessions/confirm.html.erb +1 -1
  43. data/config/locales/de/account.yml +3 -3
  44. data/config/locales/de/application.yml +1 -1
  45. data/config/locales/de/events.yml +10 -7
  46. data/config/locales/de/flashes.yml +2 -2
  47. data/config/locales/de/handshakes.yml +33 -14
  48. data/config/locales/de/mailers.yml +1 -1
  49. data/config/locales/de/manage/activity.yml +2 -2
  50. data/config/locales/de/manage/actor.yml +41 -23
  51. data/config/locales/de/manage/actors.yml +16 -15
  52. data/config/locales/de/manage/api.yml +1 -1
  53. data/config/locales/de/manage/app.yml +6 -6
  54. data/config/locales/de/manage/client.yml +45 -45
  55. data/config/locales/de/manage/clients.yml +28 -32
  56. data/config/locales/de/manage/connections.yml +2 -2
  57. data/config/locales/de/manage/consents.yml +2 -2
  58. data/config/locales/de/manage/device.yml +7 -7
  59. data/config/locales/de/manage/devices.yml +18 -18
  60. data/config/locales/de/manage/directory.yml +1 -1
  61. data/config/locales/de/manage/domains.yml +6 -6
  62. data/config/locales/de/manage/emails.yml +4 -4
  63. data/config/locales/de/manage/events.yml +3 -0
  64. data/config/locales/de/manage/groups.yml +7 -7
  65. data/config/locales/de/manage/ldap.yml +8 -8
  66. data/config/locales/de/manage/namespaces.yml +1 -1
  67. data/config/locales/de/manage/organization.yml +15 -8
  68. data/config/locales/de/manage/organizations.yml +3 -3
  69. data/config/locales/de/manage/policies.yml +6 -6
  70. data/config/locales/de/manage/policy_rules.yml +1 -1
  71. data/config/locales/de/manage/presence.yml +6 -6
  72. data/config/locales/de/manage/providers.yml +70 -48
  73. data/config/locales/de/manage/provisioning.yml +4 -4
  74. data/config/locales/de/manage/senders.yml +1 -1
  75. data/config/locales/de/manage/settings.yml +37 -26
  76. data/config/locales/de/manage/settings_shell.yml +2 -2
  77. data/config/locales/de/refusals.yml +5 -5
  78. data/config/locales/en/account.yml +5 -5
  79. data/config/locales/en/application.yml +1 -1
  80. data/config/locales/en/events.yml +9 -6
  81. data/config/locales/en/flashes.yml +3 -3
  82. data/config/locales/en/handshakes.yml +33 -14
  83. data/config/locales/en/logins.yml +2 -2
  84. data/config/locales/en/manage/actor.yml +32 -14
  85. data/config/locales/en/manage/actors.yml +16 -15
  86. data/config/locales/en/manage/app.yml +5 -5
  87. data/config/locales/en/manage/client.yml +9 -9
  88. data/config/locales/en/manage/clients.yml +8 -12
  89. data/config/locales/en/manage/connections.yml +1 -1
  90. data/config/locales/en/manage/consents.yml +1 -1
  91. data/config/locales/en/manage/device.yml +1 -1
  92. data/config/locales/en/manage/devices.yml +1 -1
  93. data/config/locales/en/manage/directory.yml +1 -1
  94. data/config/locales/en/manage/domains.yml +6 -6
  95. data/config/locales/en/manage/emails.yml +4 -4
  96. data/config/locales/en/manage/events.yml +3 -0
  97. data/config/locales/en/manage/groups.yml +7 -7
  98. data/config/locales/en/manage/ldap.yml +8 -8
  99. data/config/locales/en/manage/messages.yml +1 -1
  100. data/config/locales/en/manage/namespaces.yml +1 -1
  101. data/config/locales/en/manage/organization.yml +16 -9
  102. data/config/locales/en/manage/organizations.yml +3 -3
  103. data/config/locales/en/manage/policies.yml +6 -6
  104. data/config/locales/en/manage/policy_rules.yml +2 -2
  105. data/config/locales/en/manage/presence.yml +1 -1
  106. data/config/locales/en/manage/providers.yml +70 -48
  107. data/config/locales/en/manage/provisioning.yml +4 -4
  108. data/config/locales/en/manage/senders.yml +2 -2
  109. data/config/locales/en/manage/settings.yml +34 -23
  110. data/config/locales/es/account.yml +3 -3
  111. data/config/locales/es/application.yml +2 -2
  112. data/config/locales/es/events.yml +9 -6
  113. data/config/locales/es/flashes.yml +4 -4
  114. data/config/locales/es/handshakes.yml +33 -14
  115. data/config/locales/es/logins.yml +12 -12
  116. data/config/locales/es/mailers.yml +7 -7
  117. data/config/locales/es/manage/activity.yml +2 -2
  118. data/config/locales/es/manage/actor.yml +33 -15
  119. data/config/locales/es/manage/actors.yml +17 -16
  120. data/config/locales/es/manage/api.yml +1 -1
  121. data/config/locales/es/manage/app.yml +6 -6
  122. data/config/locales/es/manage/client.yml +30 -30
  123. data/config/locales/es/manage/clients.yml +22 -26
  124. data/config/locales/es/manage/connections.yml +1 -1
  125. data/config/locales/es/manage/consents.yml +1 -1
  126. data/config/locales/es/manage/device.yml +1 -1
  127. data/config/locales/es/manage/directory.yml +1 -1
  128. data/config/locales/es/manage/domains.yml +5 -5
  129. data/config/locales/es/manage/emails.yml +7 -7
  130. data/config/locales/es/manage/events.yml +3 -0
  131. data/config/locales/es/manage/groups.yml +7 -7
  132. data/config/locales/es/manage/ldap.yml +8 -8
  133. data/config/locales/es/manage/namespaces.yml +1 -1
  134. data/config/locales/es/manage/organization.yml +16 -9
  135. data/config/locales/es/manage/organizations.yml +3 -3
  136. data/config/locales/es/manage/policies.yml +8 -8
  137. data/config/locales/es/manage/policy_rules.yml +2 -2
  138. data/config/locales/es/manage/providers.yml +70 -48
  139. data/config/locales/es/manage/provisioning.yml +4 -4
  140. data/config/locales/es/manage/senders.yml +1 -1
  141. data/config/locales/es/manage/settings.yml +38 -27
  142. data/config/locales/es/manage/settings_shell.yml +2 -2
  143. data/config/locales/es/refusals.yml +3 -3
  144. data/config/locales/fr/account.yml +2 -2
  145. data/config/locales/fr/application.yml +1 -1
  146. data/config/locales/fr/events.yml +8 -5
  147. data/config/locales/fr/flashes.yml +1 -1
  148. data/config/locales/fr/handshakes.yml +33 -14
  149. data/config/locales/fr/manage/activity.yml +4 -4
  150. data/config/locales/fr/manage/actor.yml +43 -25
  151. data/config/locales/fr/manage/actors.yml +22 -21
  152. data/config/locales/fr/manage/api.yml +1 -1
  153. data/config/locales/fr/manage/app.yml +7 -7
  154. data/config/locales/fr/manage/client.yml +50 -50
  155. data/config/locales/fr/manage/clients.yml +28 -32
  156. data/config/locales/fr/manage/connections.yml +2 -2
  157. data/config/locales/fr/manage/consents.yml +1 -1
  158. data/config/locales/fr/manage/device.yml +1 -1
  159. data/config/locales/fr/manage/directory.yml +1 -1
  160. data/config/locales/fr/manage/domains.yml +6 -6
  161. data/config/locales/fr/manage/emails.yml +5 -5
  162. data/config/locales/fr/manage/events.yml +3 -0
  163. data/config/locales/fr/manage/groups.yml +7 -7
  164. data/config/locales/fr/manage/ldap.yml +8 -8
  165. data/config/locales/fr/manage/namespaces.yml +1 -1
  166. data/config/locales/fr/manage/organization.yml +15 -8
  167. data/config/locales/fr/manage/organizations.yml +3 -3
  168. data/config/locales/fr/manage/policies.yml +6 -6
  169. data/config/locales/fr/manage/policy_rules.yml +1 -1
  170. data/config/locales/fr/manage/providers.yml +70 -48
  171. data/config/locales/fr/manage/provisioning.yml +4 -4
  172. data/config/locales/fr/manage/senders.yml +1 -1
  173. data/config/locales/fr/manage/settings.yml +38 -27
  174. data/config/locales/fr/manage/settings_shell.yml +2 -2
  175. data/config/routes.rb +2 -0
  176. data/config/vite.json +1 -0
  177. data/db/migrate/20261011190000_add_enrolled_by_to_clients.rb +5 -0
  178. data/db/migrate/20261012100000_create_replays.rb +23 -0
  179. data/db/migrate/20261013010000_add_handshake_return_to_to_clients.rb +5 -0
  180. data/lib/generators/masks/server/install/install_generator.rb +2 -2
  181. data/lib/masks/server/browser_access.rb +35 -0
  182. data/lib/masks/server/configuration.rb +3 -3
  183. data/lib/masks/server/engine.rb +1 -0
  184. data/lib/masks/server/schema_reference.rb +17 -4
  185. data/lib/masks/server.rb +1 -0
  186. data/public/masks-assets/.vite/manifest-assets.json +1 -0
  187. data/public/masks-assets/.vite/manifest.json +62 -0
  188. data/public/masks-assets/assets/app-B27oPUll.css +2 -0
  189. data/public/masks-assets/assets/console-DoyNbIw3.css +1 -0
  190. data/public/masks-assets/assets/handshake-DIFZPSAK.js +2 -0
  191. data/public/masks-assets/assets/handshake-DIFZPSAK.js.map +1 -0
  192. data/public/masks-assets/assets/{initial-D99AzFOd.js → initial-C1GpCiEh.js} +2 -2
  193. data/public/masks-assets/assets/{initial-D99AzFOd.js.map → initial-C1GpCiEh.js.map} +1 -1
  194. data/public/masks-assets/assets/login-C_6igRZ3.js +4 -0
  195. data/public/masks-assets/assets/login-C_6igRZ3.js.map +1 -0
  196. data/public/masks-assets/assets/manage-Dbfiy3Mj.js +567 -0
  197. data/public/masks-assets/assets/manage-Dbfiy3Mj.js.map +1 -0
  198. data/version.txt +1 -1
  199. metadata +21 -12
  200. data/app/views/masks/server/application/_person.html.erb +0 -27
  201. data/public/masks-assets/assets/app-olx-5PkA.css +0 -2
  202. data/public/masks-assets/assets/console-CiuQ3qj0.css +0 -1
  203. data/public/masks-assets/assets/handshake-BYhhQ_X3.js +0 -2
  204. data/public/masks-assets/assets/handshake-BYhhQ_X3.js.map +0 -1
  205. data/public/masks-assets/assets/login-CNs1UpxJ.js +0 -4
  206. data/public/masks-assets/assets/login-CNs1UpxJ.js.map +0 -1
  207. data/public/masks-assets/assets/manage-Z3GmPDNQ.js +0 -560
  208. 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: "Utilisateurs"
8
- clients: "Applications"
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: "Connectez votre première application"
20
- detail: "Enregistrez une application à la main, ou laissez-la se connecter elle-même par la poignée de main."
21
- action: "Ajouter une application"
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 personne reçoit une invitation pour configurer sa propre connexion."
25
- action: "Inviter des personnes"
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 client dont les membres se connectent ensemble, et les applications qui demandent la portée organization apprennent le rôle de chaque personne."
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 applications découvrent cet espace à son émetteur, et l’API de gestion répond à sa ressource."
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 mis à jour."
57
+ logo_updated: "Logo modifié."
59
58
  logo_removed: "Logo supprimé."
60
59
  accent: "Couleur d’accent"
61
- color_updated: "Couleur mise à jour."
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’une personne saisit pour se connecter. Chaque politique doit exiger ce qui est choisi ici."
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 mis à jour."
69
+ updated: "Identifiant principal modifié."
71
70
  policy:
72
71
  title: "Politique par défaut"
73
- help: "La politique de connexion de chaque application 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."
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 mise à jour."
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 mises à jour."
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 compte auquel personne ne se connecte et qui n’est utilisé par aucune application 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 le compte. Si Suspendre est défini, seuls les comptes suspendus pour inactivité sont supprimés. Si Suspendre est sur Jamais, les comptes inactifs sont supprimés directement. Le dernier gestionnaire et les comptes provisionnés par un fournisseur via SCIM ne sont pas concernés."
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 mise à jour."
92
- delete_confirm: "Supprimer les comptes inactifs ? Un compte supprimé ne peut pas être restauré."
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 des événements par masks. Les 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."
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 applications peuvent s’enregistrer elles-mêmes via RFC 7591. Une application auto-enregistrée n’est jamais approuvée, et avec la limite activée elle ne peut demander que les portées choisies ici."
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 mis à jour."
116
- ceiling_updated: "Plafond mis à jour."
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 applications 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."
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 applications la voient au point de terminaison JWKS avant qu’elle ne signe quoi que ce soit."
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 l’application"
8
- forget_confirm: "Oublier cette application de gestion ? masks vous demande aussitôt d’en approuver une nouvelle. L’ancienne reste dans Applications jusqu’à son archivage."
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,5 @@
1
+ class AddEnrolledByToClients < ActiveRecord::Migration[8.1]
2
+ def change
3
+ add_reference :clients, :enrolled_by, foreign_key: { to_table: :clients, on_delete: :nullify }, index: true
4
+ end
5
+ end
@@ -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,5 @@
1
+ class AddHandshakeReturnToToClients < ActiveRecord::Migration[8.1]
2
+ def change
3
+ add_column :clients, :handshake_return_to, :string
4
+ end
5
+ 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 to start: row-level"
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 and let the first-run " \
97
- "screen decide."
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 and let the first-run screen decide."
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
@@ -7,6 +7,7 @@ module Masks
7
7
  app.config.masks = Configuration.defaults
8
8
  end
9
9
 
10
+ middleware.use BrowserAccess
10
11
  middleware.use Tenancy::Middleware
11
12
 
12
13
  initializer "masks_server.forwarded_app" do |app|
@@ -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. Serialized as a string unless a client says otherwise.\n"
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
- # Every description in this schema is empty, because the code carries no
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,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"}