@hgdc/docs 0.4.2 → 0.4.4

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 (183) hide show
  1. package/package.json +1 -1
  2. package/src/integration.ts +8 -1
  3. package/src/styles/theme.css +44 -10
  4. package/template/.astro/content-modules.mjs +15 -35
  5. package/template/.build/.well-known/llms.txt +34 -51
  6. package/template/.build/404.html +4 -4
  7. package/template/.build/_astro/Search.astro_astro_type_script_index_0_lang.VKDD8r2I.js +1 -0
  8. package/template/.build/_astro/common.Ixp7olnv.css +3 -0
  9. package/template/.build/_astro/logo-clair.BqNh6JNi.svg +1 -0
  10. package/template/.build/_astro/logo-sombre.BkgsFXxh.svg +1 -0
  11. package/template/.build/_hgdc/corpus.json +1 -1
  12. package/template/.build/demarrer/premiere-doc/index.html +25 -0
  13. package/template/.build/demarrer/premiere-doc.md +65 -0
  14. package/template/.build/explications/donnees/index.html +55 -0
  15. package/template/.build/explications/donnees.md +28 -0
  16. package/template/.build/explications/fonctionnement/index.html +33 -0
  17. package/template/.build/explications/fonctionnement.md +32 -0
  18. package/template/.build/guides/agents/index.html +59 -0
  19. package/template/.build/guides/agents.md +54 -0
  20. package/template/.build/guides/assistant/index.html +60 -0
  21. package/template/.build/guides/assistant.md +46 -0
  22. package/template/.build/guides/composants/index.html +38 -0
  23. package/template/.build/guides/composants.md +103 -0
  24. package/template/.build/guides/ecrire/index.html +56 -0
  25. package/template/.build/guides/ecrire.md +63 -0
  26. package/template/.build/guides/elements/index.html +1 -0
  27. package/template/.build/guides/navigation/index.html +30 -0
  28. package/template/.build/guides/navigation.md +63 -0
  29. package/template/.build/guides/publier/index.html +27 -0
  30. package/template/.build/guides/publier.md +65 -0
  31. package/template/.build/guides/theme/index.html +27 -0
  32. package/template/.build/guides/theme.md +33 -0
  33. package/template/.build/images/favicon.svg +1 -0
  34. package/template/.build/images/logo-clair.svg +1 -0
  35. package/template/.build/images/logo-sombre.svg +1 -0
  36. package/template/.build/index.html +14 -18
  37. package/template/.build/index.md +21 -59
  38. package/template/.build/llms-full.txt +515 -2331
  39. package/template/.build/llms.txt +34 -51
  40. package/template/.build/pagefind/fragment/fr-ch_1aa5706.pf_fragment +0 -0
  41. package/template/.build/pagefind/fragment/fr-ch_21308c9.pf_fragment +0 -0
  42. package/template/.build/pagefind/fragment/fr-ch_256be83.pf_fragment +0 -0
  43. package/template/.build/pagefind/fragment/fr-ch_3786e05.pf_fragment +0 -0
  44. package/template/.build/pagefind/fragment/fr-ch_3e2d7bf.pf_fragment +0 -0
  45. package/template/.build/pagefind/fragment/fr-ch_53e6d95.pf_fragment +0 -0
  46. package/template/.build/pagefind/fragment/fr-ch_7011e1a.pf_fragment +0 -0
  47. package/template/.build/pagefind/fragment/fr-ch_7252d5b.pf_fragment +0 -0
  48. package/template/.build/pagefind/fragment/fr-ch_8a5f581.pf_fragment +0 -0
  49. package/template/.build/pagefind/fragment/fr-ch_9221692.pf_fragment +0 -0
  50. package/template/.build/pagefind/fragment/fr-ch_a4b68e2.pf_fragment +0 -0
  51. package/template/.build/pagefind/fragment/fr-ch_d4ef5e9.pf_fragment +0 -0
  52. package/template/.build/pagefind/fragment/fr-ch_edaf413.pf_fragment +0 -0
  53. package/template/.build/pagefind/fragment/fr-ch_f017e56.pf_fragment +0 -0
  54. package/template/.build/pagefind/fragment/fr-ch_fe71cc1.pf_fragment +0 -0
  55. package/template/.build/pagefind/index/fr-ch_481c81a.pf_index +0 -0
  56. package/template/.build/pagefind/pagefind-entry.json +1 -1
  57. package/template/.build/pagefind/pagefind.fr-ch_46a632d8eba7e.pf_meta +0 -0
  58. package/template/.build/reference/api-assistant/index.html +102 -0
  59. package/template/.build/reference/api-assistant.md +60 -0
  60. package/template/.build/reference/cli/index.html +11 -153
  61. package/template/.build/reference/cli.md +23 -159
  62. package/template/.build/reference/docs-json/index.html +157 -0
  63. package/template/.build/reference/docs-json.md +47 -0
  64. package/template/.build/reference/mcp/index.html +92 -0
  65. package/template/.build/reference/mcp.md +49 -0
  66. package/template/node_modules/.vite/deps/_metadata.json +8 -8
  67. package/template/.astro/data-store.json +0 -1
  68. package/template/.astro/settings.json +0 -5
  69. package/template/.build/_astro/Search.astro_astro_type_script_index_0_lang.D7EcezBU.js +0 -1
  70. package/template/.build/_astro/common.Dx3aBIS0.css +0 -3
  71. package/template/.build/_astro/logo.BPu921Tp.svg +0 -1
  72. package/template/.build/concepts/confidentialite/index.html +0 -50
  73. package/template/.build/concepts/confidentialite.md +0 -38
  74. package/template/.build/concepts/deploiements/index.html +0 -106
  75. package/template/.build/concepts/deploiements.md +0 -70
  76. package/template/.build/concepts/organisations-et-roles/index.html +0 -83
  77. package/template/.build/concepts/organisations-et-roles.md +0 -39
  78. package/template/.build/concepts/preversion/index.html +0 -49
  79. package/template/.build/concepts/preversion.md +0 -52
  80. package/template/.build/concepts/secrets-et-coffre/index.html +0 -70
  81. package/template/.build/concepts/secrets-et-coffre.md +0 -54
  82. package/template/.build/demarrer/depuis-github/index.html +0 -34
  83. package/template/.build/demarrer/depuis-github.md +0 -68
  84. package/template/.build/demarrer/premier-site/index.html +0 -28
  85. package/template/.build/demarrer/premier-site.md +0 -94
  86. package/template/.build/guides/brancher-un-domaine/index.html +0 -91
  87. package/template/.build/guides/brancher-un-domaine.md +0 -81
  88. package/template/.build/guides/cle-d-api/index.html +0 -62
  89. package/template/.build/guides/cle-d-api.md +0 -78
  90. package/template/.build/guides/depannage/index.html +0 -64
  91. package/template/.build/guides/depannage.md +0 -69
  92. package/template/.build/guides/deployer-depuis-github/index.html +0 -45
  93. package/template/.build/guides/deployer-depuis-github.md +0 -70
  94. package/template/.build/guides/deployer-un-framework/index.html +0 -81
  95. package/template/.build/guides/deployer-un-framework.md +0 -74
  96. package/template/.build/guides/github-actions-sans-application/index.html +0 -53
  97. package/template/.build/guides/github-actions-sans-application.md +0 -95
  98. package/template/.build/guides/inviter-une-personne/index.html +0 -28
  99. package/template/.build/guides/inviter-une-personne.md +0 -38
  100. package/template/.build/guides/lire-les-logs/index.html +0 -37
  101. package/template/.build/guides/lire-les-logs.md +0 -48
  102. package/template/.build/guides/migrer-depuis-vercel/index.html +0 -25
  103. package/template/.build/guides/migrer-depuis-vercel.md +0 -51
  104. package/template/.build/guides/monorepo/index.html +0 -40
  105. package/template/.build/guides/monorepo.md +0 -42
  106. package/template/.build/guides/revenir-en-arriere/index.html +0 -39
  107. package/template/.build/guides/revenir-en-arriere.md +0 -50
  108. package/template/.build/guides/site-statique/index.html +0 -41
  109. package/template/.build/guides/site-statique.md +0 -59
  110. package/template/.build/guides/synchroniser-doppler/index.html +0 -46
  111. package/template/.build/guides/synchroniser-doppler.md +0 -63
  112. package/template/.build/guides/variables-d-environnement/index.html +0 -73
  113. package/template/.build/guides/variables-d-environnement.md +0 -92
  114. package/template/.build/images/famille/account.svg +0 -1
  115. package/template/.build/images/famille/analytics.svg +0 -1
  116. package/template/.build/images/famille/docs.svg +0 -1
  117. package/template/.build/images/famille/host.svg +0 -1
  118. package/template/.build/images/famille/mail.svg +0 -1
  119. package/template/.build/images/famille/portal.svg +0 -1
  120. package/template/.build/images/famille/status.svg +0 -1
  121. package/template/.build/images/logo.svg +0 -1
  122. package/template/.build/pagefind/fragment/fr-ch_16987e2.pf_fragment +0 -0
  123. package/template/.build/pagefind/fragment/fr-ch_2b4c97b.pf_fragment +0 -0
  124. package/template/.build/pagefind/fragment/fr-ch_3294a5c.pf_fragment +0 -0
  125. package/template/.build/pagefind/fragment/fr-ch_34858c9.pf_fragment +0 -0
  126. package/template/.build/pagefind/fragment/fr-ch_39ddba1.pf_fragment +0 -0
  127. package/template/.build/pagefind/fragment/fr-ch_4ab1899.pf_fragment +0 -0
  128. package/template/.build/pagefind/fragment/fr-ch_4d3a52a.pf_fragment +0 -0
  129. package/template/.build/pagefind/fragment/fr-ch_506c187.pf_fragment +0 -0
  130. package/template/.build/pagefind/fragment/fr-ch_5aa255a.pf_fragment +0 -0
  131. package/template/.build/pagefind/fragment/fr-ch_6841c7d.pf_fragment +0 -0
  132. package/template/.build/pagefind/fragment/fr-ch_6dc7a2d.pf_fragment +0 -0
  133. package/template/.build/pagefind/fragment/fr-ch_847edff.pf_fragment +0 -0
  134. package/template/.build/pagefind/fragment/fr-ch_8745af7.pf_fragment +0 -0
  135. package/template/.build/pagefind/fragment/fr-ch_8aac5e6.pf_fragment +0 -0
  136. package/template/.build/pagefind/fragment/fr-ch_916b233.pf_fragment +0 -0
  137. package/template/.build/pagefind/fragment/fr-ch_9fd014a.pf_fragment +0 -0
  138. package/template/.build/pagefind/fragment/fr-ch_a0808f8.pf_fragment +0 -0
  139. package/template/.build/pagefind/fragment/fr-ch_a4e1f69.pf_fragment +0 -0
  140. package/template/.build/pagefind/fragment/fr-ch_a80a53d.pf_fragment +0 -0
  141. package/template/.build/pagefind/fragment/fr-ch_a9e725b.pf_fragment +0 -0
  142. package/template/.build/pagefind/fragment/fr-ch_ac3f64c.pf_fragment +0 -0
  143. package/template/.build/pagefind/fragment/fr-ch_af292f1.pf_fragment +0 -0
  144. package/template/.build/pagefind/fragment/fr-ch_af3e716.pf_fragment +0 -0
  145. package/template/.build/pagefind/fragment/fr-ch_b0689a4.pf_fragment +0 -0
  146. package/template/.build/pagefind/fragment/fr-ch_baed996.pf_fragment +0 -0
  147. package/template/.build/pagefind/fragment/fr-ch_c89e27a.pf_fragment +0 -0
  148. package/template/.build/pagefind/fragment/fr-ch_cd6ca13.pf_fragment +0 -0
  149. package/template/.build/pagefind/fragment/fr-ch_d09af09.pf_fragment +0 -0
  150. package/template/.build/pagefind/fragment/fr-ch_d4bcea8.pf_fragment +0 -0
  151. package/template/.build/pagefind/fragment/fr-ch_dc2a134.pf_fragment +0 -0
  152. package/template/.build/pagefind/fragment/fr-ch_ded7ddc.pf_fragment +0 -0
  153. package/template/.build/pagefind/fragment/fr-ch_e2528cb.pf_fragment +0 -0
  154. package/template/.build/pagefind/fragment/fr-ch_e3cbb4e.pf_fragment +0 -0
  155. package/template/.build/pagefind/fragment/fr-ch_e7902d9.pf_fragment +0 -0
  156. package/template/.build/pagefind/fragment/fr-ch_f48ca47.pf_fragment +0 -0
  157. package/template/.build/pagefind/index/fr-ch_8a5f905.pf_index +0 -0
  158. package/template/.build/pagefind/index/fr-ch_fbd9c96.pf_index +0 -0
  159. package/template/.build/pagefind/pagefind.fr-ch_211aacbfa7f0e.pf_meta +0 -0
  160. package/template/.build/reference/api/deploiements/index.html +0 -326
  161. package/template/.build/reference/api/deploiements.md +0 -170
  162. package/template/.build/reference/api/erreurs/index.html +0 -102
  163. package/template/.build/reference/api/erreurs.md +0 -50
  164. package/template/.build/reference/api/fichiers/index.html +0 -82
  165. package/template/.build/reference/api/fichiers.md +0 -62
  166. package/template/.build/reference/api/introduction/index.html +0 -126
  167. package/template/.build/reference/api/introduction.md +0 -84
  168. package/template/.build/reference/api/projets/index.html +0 -184
  169. package/template/.build/reference/api/projets.md +0 -102
  170. package/template/.build/reference/api/utilisateur/index.html +0 -96
  171. package/template/.build/reference/api/utilisateur.md +0 -89
  172. package/template/.build/reference/api/variables/index.html +0 -75
  173. package/template/.build/reference/api/variables.md +0 -58
  174. package/template/.build/reference/compatibilite/index.html +0 -196
  175. package/template/.build/reference/compatibilite.md +0 -64
  176. package/template/.build/reference/domaines/index.html +0 -171
  177. package/template/.build/reference/domaines.md +0 -76
  178. package/template/.build/reference/limites/index.html +0 -159
  179. package/template/.build/reference/limites.md +0 -56
  180. package/template/.build/reference/variables/index.html +0 -164
  181. package/template/.build/reference/variables.md +0 -63
  182. package/template/.build/reference/vercel-json/index.html +0 -65
  183. package/template/.build/reference/vercel-json.md +0 -51
@@ -1 +0,0 @@
1
- [["Map",1,2,408,409],"docs",["Map",3,4,17,18,28,29,39,40,51,52,62,63,74,75,86,87,97,98,109,110,120,121,131,132,143,144,155,156,167,168,178,179,190,191,202,203,214,215,226,227,238,239,250,251,262,263,272,273,284,285,295,296,307,308,318,319,330,331,341,342,352,353,364,365,375,376,386,387,397,398],"concepts/confidentialite",{"id":3,"data":5,"body":14,"filePath":15,"digest":16,"deferredRender":8},{"sidebarTitle":6,"title":6,"description":7,"editUrl":8,"head":9,"template":10,"sidebar":11,"pagefind":8,"draft":12},"Sécurité et confidentialité","Ce que Host fait pour protéger tes projets, tes secrets, tes sites et les visiteurs, et comment signaler une faille.",true,[],"doc",{"hidden":12,"attrs":13},false,{},"Cette page décrit ce que Host fait pour protéger tes projets, tes secrets, les sites qu'il sert et les visiteurs de ces sites. Elle ne remplace pas ton analyse de risque. Pour une question précise sur le traitement de tes données personnelles, écris à [support@hgdc.ch](mailto:support@hgdc.ch).\n\n## Accès\n\n- La connexion passe uniquement par HGDC. Host ne garde aucun mot de passe.\n- Chaque action vérifie ton rôle dans l'organisation : propriétaire, admin ou membre. Voir [Organisations et rôles](/concepts/organisations-et-roles/).\n- Une clé d'API ne donne accès qu'à une organisation. Une clé posée dans un dépôt ne donne accès qu'à son projet.\n- Les dépôts GitHub ne s'importent que si tu as le droit d'écriture. L'app GitHub ne demande que les droits dont le workflow a besoin.\n\n## Secrets\n\n- Les valeurs des variables sont chiffrées dans un coffre. Chaque organisation a sa propre clé. Voir [Secrets et coffre](/concepts/secrets-et-coffre/).\n- Les clés d'API ne sont stockées que sous forme d'empreinte SHA-256. La clé complète ne s'affiche qu'une fois.\n- Une variable sensible ne se relit jamais après l'enregistrement, et ne part que vers le build du dépôt.\n- Le journal du coffre garde qui a créé, modifié, lu ou téléchargé une variable. Il ne garde jamais la valeur.\n\n## Sites servis\n\n- HTTPS partout, avec un certificat automatique pour chaque domaine vérifié. Un certificat n'est émis que pour un domaine vérifié.\n- Chaque réponse porte l'en-tête `X-Content-Type-Options: nosniff`.\n- Les fichiers cachés, comme `.env` ou `.git`, ne sont jamais servis, sauf `.well-known`.\n- Les configurations et les sources d'un framework ne sont jamais servies. Seul le résultat du build l'est.\n\n## Données et journaux\n\n- Les logs des requêtes ne gardent ni adresse IP, ni en-têtes, ni paramètres d'URL. Ils disparaissent après trois jours.\n- Les logs de build restent tant que le projet existe.\n- Les valeurs des variables ne figurent dans aucun journal.\n\n## Signaler une faille\n\nTu penses avoir trouvé une faille ? Écris à [support@hgdc.ch](mailto:support@hgdc.ch), avec les étapes pour la reproduire. Pour rester dans le cadre de la divulgation responsable :\n\n- n'accède pas aux données d'une autre organisation, même pour démontrer la faille ;\n- ne teste pas la charge de la plateforme ;\n- ne publie pas la faille avant qu'elle soit corrigée.","../../../../wt-aide-ui/host/concepts/confidentialite.mdx","447ad46e934d8c34","concepts/deploiements",{"id":17,"data":19,"body":25,"filePath":26,"digest":27,"deferredRender":8},{"sidebarTitle":20,"title":20,"description":21,"editUrl":8,"head":22,"template":10,"sidebar":23,"pagefind":8,"draft":12},"Déploiements","Preview, production, adresse de production, adresse de déploiement, statuts et retour arrière. Le cycle de vie d'une version de ton site.",[],{"hidden":12,"attrs":24},{},"Un déploiement est une version figée de ton site. Il ne change plus après sa publication : une nouvelle version crée un nouveau déploiement, avec sa propre adresse.\n\nCette page explique ce modèle. Pour les actions pas à pas, voir [Revenir en arrière, redéployer ou annuler](/guides/revenir-en-arriere/).\n\n## Preview et production\n\nChaque déploiement est soit une **preview**, soit une **production**.\n\n| Cible | Créée par | Servie sur |\n|---|---|---|\n| Preview | `vercel deploy`, ou une branche autre que la production | Son adresse de déploiement, et les domaines de branche qui la suivent |\n| Production | `vercel deploy --prod`, ou la branche de production | Son adresse de déploiement, l'adresse de production du projet et ses domaines de production |\n\nAvec l'intégration GitHub, la branche de production part en production, et toutes les autres en preview. Le dernier déploiement de production prêt est celui que servent tes domaines de production.\n\n## Adresse de production\n\nChaque projet reçoit à sa création une adresse qui suit toujours sa production, de la forme `https://\u003Cprojet>.hgdc.cloud`. C'est l'équivalent de `\u003Cprojet>.vercel.app`.\n\n- Elle ne change jamais : ni à une nouvelle mise en production, ni si tu renommes le projet.\n- Elle sert le déploiement de production du moment. Une nouvelle production ou un retour arrière la déplace tout de suite, sans nouveau certificat ni réglage DNS.\n- Si `\u003Cprojet>` est déjà pris par une autre organisation, l'adresse devient `\u003Cprojet>-\u003Corganisation>.hgdc.cloud`. La console affiche celle de ton projet dans la carte de production, sous **Domaines**.\n- Elle n'est pas indexée par les moteurs de recherche. Pour un site public, branche ton propre domaine : voir [Brancher un domaine](/guides/brancher-un-domaine/).\n\nDonne cette adresse à un outil qui doit toujours viser ta production : un proxy, une sonde de disponibilité, une console Docs. Elle est aussi la valeur de `VERCEL_PROJECT_PRODUCTION_URL` tant que le projet n'a pas de domaine.\n\n## Adresse de déploiement\n\nChaque déploiement reçoit une adresse unique, de la forme `https://\u003Cprojet>-\u003Csuffixe>.hgdc.cloud`. Elle reste valable tant que le déploiement existe.\n\nPartage cette adresse pour faire valider une version avant de la passer en production. Une preview se valide ainsi, sans toucher au site en ligne.\n\n## Statuts\n\n| Statut | Libellé dans la console | Signification |\n|---|---|---|\n| `QUEUED` | En file | Le déploiement attend son tour de publication |\n| `BUILDING` | Build en cours | Le build tourne dans la CI, ou les fichiers sont en cours de publication |\n| `READY` | Prêt | Le site est en ligne sur son adresse |\n| `ERROR` | Erreur | Le build ou la publication a échoué. La cause est sur la page du déploiement |\n| `CANCELED` | Annulé | Annulé dans la console, ou dans GitHub Actions |\n\nPour corriger une version en ligne, déploie une nouvelle version : elle reçoit son propre déploiement et sa propre adresse.\n\n## Vue d'ensemble du projet\n\nLa vue d'ensemble montre le déploiement de production : un aperçu du site, son adresse, l'adresse de production du projet et ses domaines, le commit et son auteur. Le projet reprend le favicon de son site.\n\nLes previews actives listent la dernière adresse de chaque branche.\n\n## Revenir en arrière\n\nRevenir en arrière remet en ligne un déploiement de production précédent, tout de suite et sans nouveau build. L'adresse de production et les domaines le servent aussitôt. Seul un déploiement **prêt** peut passer en production.\n\nLe déploiement remis en ligne garde les variables qu'il a reçues à son build. Une variable modifiée depuis ne s'y applique pas.\n\n## Redéployer\n\n- Projet relié à GitHub : reconstruit le même commit, avec les variables d'aujourd'hui.\n- Projet envoyé par la CLI : republie les fichiers du déploiement choisi, sans rien reconstruire. Pour une nouvelle version, relance `vercel deploy`.\n\n## Annuler\n\nUn déploiement **en file** ou **en cours de build** peut être annulé. Un déploiement prêt ne s'annule pas : reviens en arrière à la place.\n\n## Logs de build\n\nLa page de chaque déploiement affiche la sortie du build, en direct pendant le build avec l'intégration GitHub. Voir [Lire les logs](/guides/lire-les-logs/).","../../../../wt-aide-ui/host/concepts/deploiements.mdx","f6f9903c02412e12","concepts/organisations-et-roles",{"id":28,"data":30,"body":36,"filePath":37,"digest":38,"deferredRender":8},{"sidebarTitle":31,"title":31,"description":32,"editUrl":8,"head":33,"template":10,"sidebar":34,"pagefind":8,"draft":12},"Organisations et rôles","Une organisation regroupe des personnes, des projets et des clés d'API. Qui peut faire quoi, et où se gèrent les membres.",[],{"hidden":12,"attrs":35},{},"Une organisation regroupe des personnes, des projets et des clés d'API. Tu peux appartenir à plusieurs organisations, et passer de l'une à l'autre depuis la barre latérale, ou avec `Ctrl+K`.\n\nL'organisation se crée et se gère dans Account. Son slug apparaît dans l'adresse de l'app : `host.hgdc.ch/o/\u003Cslug>/…`.\n\n## Rôles\n\n| Action | Propriétaire | Admin | Membre |\n|---|---|---|---|\n| Voir les projets, déploiements et logs | Oui | Oui | Oui |\n| Voir les noms des variables | Oui | Oui | Oui |\n| Voir les valeurs des variables non sensibles | Oui | Oui | Oui |\n| Créer et déployer des projets, gérer les variables et les domaines | Oui | Oui | Oui |\n| Créer et révoquer des clés d'API | Oui | Oui | Non |\n| Supprimer un projet | Oui | Oui | Non |\n| Gérer l'organisation elle-même, dans Account | Oui | Non | Non |\n\nUne valeur sensible ne s'affiche jamais, quel que soit le rôle. Voir [Secrets et coffre](/concepts/secrets-et-coffre/).\n\nLe rôle lecture seule n'existe plus : les anciens membres en lecture seule sont passés membres.\n\n## Inviter et retirer\n\nLes invitations, les membres et les rôles se gèrent dans Account, pas dans Host. Le guide pas à pas est sur [Inviter une personne](/guides/inviter-une-personne/).\n\nQuand une personne rejoint l'organisation, elle se connecte avec son compte HGDC, avec la même adresse e-mail vérifiée. Son compte est lié, et ses projets restent en place.\n\n## Membres dans Host\n\nHost affiche la liste des membres en lecture seule, avec un bouton vers Account. Un changement fait dans Account arrive dans Host à la prochaine connexion de la personne. Une session dure 7 jours au plus, sans prolongation.\n\n## Quitter ou être retiré\n\nQuand une personne quitte l'organisation, les clés d'API qu'elle a créées cessent de fonctionner. Les projets, les déploiements et les variables restent dans l'organisation.\n\n## Les clés d'API et l'organisation\n\nUne clé d'API appartient à une organisation. L'organisation vient toujours de la clé : une option `--scope` ou `--team` de la CLI est ignorée. Voir [Clés d'API](/guides/cle-d-api/).","../../../../wt-aide-ui/host/concepts/organisations-et-roles.mdx","1f2e5bf684add6ec","concepts/preversion",{"id":39,"data":41,"body":48,"filePath":49,"digest":50,"deferredRender":8},{"sidebarTitle":42,"title":43,"description":44,"editUrl":8,"head":45,"template":10,"sidebar":46,"pagefind":8,"draft":12},"Préversion","Préversion et rendu à la demande","Ce qui s'exécute en préversion (rendu à la demande, routes d'API, ISR, crons), comment ça se comporte et ce qui reste en ligne.",[],{"hidden":12,"attrs":47},{},"Host sert toujours les fichiers statiques et les pages pré-rendues. Les fonctions, c'est-à-dire le rendu à la demande, les routes d'API, les Server Actions, le proxy, le runtime edge, l'ISR et les crons, sont en préversion. Cette page explique comment elles se comportent, et ce que tu observes.\n\n## Ce qui est en ligne dans tous les cas\n\nUn site construit avec `vercel build` produit deux sortes de contenu :\n\n- les fichiers statiques et les pages pré-rendues au build. Ils sont servis dès le déploiement, sans fonction ;\n- les pages et les routes qui ont besoin d'une fonction. Elles passent par l'exécution en préversion.\n\nUne organisation qui n'a pas encore accès à l'exécution des fonctions voit ses pages statiques en ligne normalement. Seule une adresse qui demande une fonction répond `501`, avec le message « Rendu à la demande pas encore servi ».\n\n## Ouvert organisation par organisation\n\nL'exécution des fonctions est ouverte organisation par organisation. Si une de tes adresses répond `501`, demande l'activation à [support@hgdc.ch](mailto:support@hgdc.ch), avec le nom de ton organisation.\n\n## Comportement des fonctions\n\n- Chaque déploiement a son environnement d'exécution, isolé des autres, avec les variables de son environnement.\n- Une fonction dispose de 512 Mo de mémoire par défaut, et de 1 Go au plus.\n- Une requête dure 30 secondes au plus par défaut. Tu peux allonger jusqu'à 60 secondes avec `maxDuration`.\n- Après une période sans trafic, l'environnement s'arrête. La première requête suivante prend quelques secondes ; les suivantes sont immédiates.\n\n## Runtime edge\n\nUne fonction marquée `runtime: \"edge\"` tourne dans un contexte isolé, avec les API Web, comme chez Vercel.\n\n## ISR\n\nUne page avec une durée de revalidation est rendue une fois, puis gardée. Une fois la durée écoulée, elle est régénérée en arrière-plan. Le visiteur reçoit toujours une réponse immédiate.\n\nLe cache de l'ISR est tenu en mémoire par serveur. Il repart à vide quand le serveur redémarre : la page suivante est rendue à nouveau.\n\n## Crons\n\nLes `crons` de `vercel.json` appellent leur chemin en GET, à l'heure indiquée en UTC, sur le déploiement de production uniquement. Un déploiement de preview n'a jamais de cron.\n\nSi tu définis la variable `CRON_SECRET` pour la production, chaque appel porte `Authorization: Bearer \u003CCRON_SECRET>`. Vérifie cet en-tête dans ta route avant d'agir.\n\n## Proxy et middleware\n\nLe proxy, anciennement middleware, et le middleware Node.js s'exécutent en préversion, comme les fonctions.\n\n## Pour une page qui ne peut pas attendre\n\nSi une page a besoin d'une fonction alors que l'exécution n'est pas encore ouverte à ton organisation, tu peux la pré-rendre au build. Elle est alors servie comme une page statique.\n\n## Voir aussi\n\n- [Compatibilité](/reference/compatibilite/) : la liste complète, fonction par fonction.\n- [Limites](/reference/limites/) : mémoire, durée et débits.","../../../../wt-aide-ui/host/concepts/preversion.mdx","7555edf5441a9857","concepts/secrets-et-coffre",{"id":51,"data":53,"body":59,"filePath":60,"digest":61,"deferredRender":8},{"sidebarTitle":54,"title":54,"description":55,"editUrl":8,"head":56,"template":10,"sidebar":57,"pagefind":8,"draft":12},"Secrets et coffre","Comment Host protège les valeurs de tes variables et tes clés d'API, qui peut les lire et ce qui reste dans le journal.",[],{"hidden":12,"attrs":58},{},"Les valeurs de tes variables sont des secrets : mots de passe, clés de service, jetons. Host les garde dans un coffre, les chiffre, et ne les renvoie jamais en clair à quiconque n'en a pas besoin.\n\nCette page explique le modèle. Pour les règles chiffrées, voir [Variables : référence](/reference/variables/).\n\n## Le coffre\n\n- Chaque organisation a sa propre clé de chiffrement, AES-GCM 256 bits.\n- Cette clé est elle-même chiffrée par une clé maîtresse, gardée hors de la base de données.\n- Chaque valeur est liée à son projet. Une valeur recopiée dans un autre projet ne se déchiffre pas.\n\n## Qui lit quoi\n\n| Donnée | Qui la voit |\n|---|---|\n| Nom d'une variable | Tous les membres de l'organisation |\n| Valeur d'une variable non sensible | Tous les membres de l'organisation |\n| Valeur d'une variable sensible | Personne, après l'enregistrement. Elle peut seulement être remplacée |\n\nUne variable sensible ne part que vers le build du dépôt GitHub, par une clé limitée au projet. Un `vercel pull` depuis un poste de développement ne la télécharge pas.\n\n## Le journal du coffre\n\nLe journal, en bas de l'onglet **Variables d'environnement**, garde les 50 derniers gestes sur le coffre :\n\n- qui a créé, modifié ou supprimé une variable ;\n- qui a affiché une valeur non sensible ;\n- quelle clé d'API a téléchargé les variables, avec `vercel pull` ou un build ;\n- quand Doppler a synchronisé une valeur.\n\nLe journal ne garde jamais une valeur.\n\n## Les clés d'API\n\nHost ne garde qu'une empreinte SHA-256 de chaque clé d'API. La clé complète ne s'affiche qu'une fois, à sa création. Si tu la perds, aucune copie n'est possible : crée une nouvelle clé, puis révoque l'ancienne.\n\nUne clé posée dans un dépôt GitHub ne donne accès qu'à son projet. Une clé d'organisation donne accès à tous les projets de l'organisation, avec les variables non sensibles.\n\n## Les secrets des intégrations\n\nLes jetons Doppler et les secrets des webhooks sont chiffrés de la même façon, et ne sont jamais renvoyés par la console ni par l'API. Chaque webhook Doppler est vérifié par sa signature HMAC.\n\n## Ce que le site publie\n\nLe coffre protège les valeurs dans Host. Il ne protège pas un secret qui finit dans le site. Tout ce que le build écrit dans les fichiers du site est public, même si la variable d'origine était sensible.\n\nUne variable lue dans le navigateur, comme celles qui commencent par `PUBLIC_`, `VITE_` ou `NEXT_PUBLIC_`, ne doit jamais contenir un secret.\n\n## Voir aussi\n\n- [Gérer les variables d'environnement](/guides/variables-d-environnement/)\n- [Synchroniser depuis Doppler](/guides/synchroniser-doppler/)\n- [Confidentialité](/concepts/confidentialite/)","../../../../wt-aide-ui/host/concepts/secrets-et-coffre.mdx","f87c34d6b30d99e9","demarrer/depuis-github",{"id":62,"data":64,"body":71,"filePath":72,"digest":73,"deferredRender":8},{"sidebarTitle":65,"title":66,"description":67,"editUrl":8,"head":68,"template":10,"sidebar":69,"pagefind":8,"draft":12},"Depuis GitHub","Déployer un site depuis GitHub","Importe un dépôt GitHub. La branche principale part en production, les autres reçoivent une preview.",[],{"hidden":12,"attrs":70},{},"Dans ce parcours, tu importes un dépôt GitHub dans Host. À la fin, un `git push` sur la branche principale met ton site en production, et chaque autre branche reçoit sa propre preview.\n\n**Avant de commencer** :\n\n- un compte HGDC et une organisation dans Account ;\n- un dépôt GitHub avec un site qui se construit (Astro, Vite, Next.js ou un site statique) ;\n- le droit d'écriture (push) sur ce dépôt. Un dépôt où tu n'as que la lecture ne s'importe pas.\n\n\u003CSteps>\n \u003CStep title=\"Ouvre un nouveau projet\">\n Dans ton organisation, clique **Nouveau projet**, puis **Importer depuis GitHub**.\n\n **Vérification** : la liste des dépôts accessibles s'affiche, ou Host te propose d'installer l'app GitHub.\n \u003C/Step>\n \u003CStep title=\"Installe l'app GitHub\">\n Installe l'app **Host** sur ton compte GitHub ou sur celui de ton organisation. Tu peux la limiter à quelques dépôts.\n\n L'app ne demande que les droits dont le workflow a besoin. Le détail est dans [Déployer depuis GitHub](/guides/deployer-depuis-github/).\n\n **Vérification** : le dépôt choisi apparaît dans la liste de Host.\n \u003C/Step>\n \u003CStep title=\"Choisis le dépôt et vérifie les réglages\">\n Sélectionne le dépôt. Host lit le projet et propose le framework, les commandes d'installation et de build, la version de Node.js et la branche de production.\n\n Si le site est dans un sous-dossier ou dans un monorepo, choisis le dossier de l'app. Voir [Monorepo et sous-dossier](/guides/monorepo/).\n\n **Vérification** : le framework détecté correspond à ton site. Corrige les réglages qui ne correspondent pas.\n \u003C/Step>\n \u003CStep title=\"Fusionne la PR d'installation\">\n L'import ouvre une pull request qui ajoute le fichier `.github/workflows/hgdc-host.yml` et pose le secret `HGDC_HOST_TOKEN` dans le dépôt. Relis-la, puis fusionne-la sur la branche principale.\n\n Le secret est une clé limitée à ce projet. Elle ne peut ni créer de projet ni lire les autres.\n\n **Vérification** : la PR est fusionnée, et le fichier `hgdc-host.yml` existe sur la branche principale.\n \u003C/Step>\n \u003CStep title=\"Pousse une modification\">\n Modifie une page du site, puis pousse-la sur la branche principale :\n\n ```bash\n git add .\n git commit -m \"docs: ajoute une page de test\"\n git push\n ```\n\n **Vérification** : l'onglet **Déploiements** du projet affiche un déploiement en cours, puis **Prêt**. L'adresse de production affiche la modification.\n \u003C/Step>\n \u003CStep title=\"Ouvre une preview\">\n Crée une branche, pousse-la, puis ouvre une pull request sur la branche principale. Host construit la branche et publie une preview.\n\n **Vérification** : le commit affiche le statut du déploiement avec son lien. La preview répond sur son adresse `hgdc.cloud`.\n \u003C/Step>\n\u003C/Steps>\n\n## Et après\n\n- Pour mettre le site sur ton domaine, suis [Brancher un domaine](/guides/brancher-un-domaine/).\n- Pour les variables de build, comme une clé publique ou l'adresse d'une API, suis [Variables d'environnement](/guides/variables-d-environnement/).\n- Pour comprendre ce qui se passe à chaque push, lis [Déploiements](/concepts/deploiements/).\n\n## Si ça ne marche pas\n\n- Le build n'apparaît pas après le push : vérifie que la PR d'installation est fusionnée. Voir [Dépannage](/guides/depannage/#le-build-github-est-absent).\n- Le build échoue : ouvre le déploiement dans Host, la sortie du build y est affichée en direct.","../../../../wt-aide-ui/host/demarrer/depuis-github.mdx","4f4adb772218d952","demarrer/premier-site",{"id":74,"data":76,"body":83,"filePath":84,"digest":85,"deferredRender":8},{"sidebarTitle":77,"title":78,"description":79,"editUrl":8,"head":80,"template":10,"sidebar":81,"pagefind":8,"draft":12},"Premier site","Mettre un premier site en ligne","Du compte à une preview, puis à la production, avec la CLI Vercel, en une quinzaine de minutes.",[],{"hidden":12,"attrs":82},{},"À la fin de ce parcours, ton site répond sur une adresse de preview, puis sur une adresse de production. Tu auras créé une clé d'API, installé la CLI et déployé un dossier de fichiers, sans étape de build.\n\n**Avant de commencer** : Node.js et npm, et un compte HGDC. Sans compte, la page [Demander un accès](https://host.hgdc.ch/acces) envoie ta demande à l'équipe, qui t'invite depuis Account.\n\n\u003CSteps>\n \u003CStep title=\"Connecte-toi\">\n Ouvre [host.hgdc.ch](https://host.hgdc.ch) et clique **Se connecter avec HGDC**. Le même compte sert à Account, Mail et les autres produits de la famille.\n\n Tu arrives sur le tableau de bord. Si tu n'as pas encore d'organisation, crée-la dans Account. Son slug apparaît dans l'adresse de l'app : `host.hgdc.ch/o/\u003Cslug>`.\n\n **Vérification** : le tableau de bord affiche le nom de ton organisation.\n \u003C/Step>\n \u003CStep title=\"Crée une clé d'API\">\n Dans ton organisation, ouvre l'onglet **Clés d'API** et crée une clé. Elle commence par `ah_` et ne s'affiche qu'une fois : copie-la tout de suite.\n\n La clé remplace le mot de passe de la CLI. Le détail est dans [Clés d'API](/guides/cle-d-api/).\n\n **Vérification** : la clé apparaît dans la liste, avec le nom que tu lui as donné.\n \u003C/Step>\n \u003CStep title=\"Installe la CLI Vercel\">\n ```bash\n npm install --global vercel@63\n ```\n\n Host est testé avec la version 63 de la CLI. Une autre version peut fonctionner, mais ce n'est pas garanti.\n\n **Vérification** : `vercel --version` affiche une version 63.x.\n \u003C/Step>\n \u003CStep title=\"Donne la clé et l'adresse de l'API à la CLI\">\n Dans le terminal, exporte la clé, puis passe l'adresse de l'API à chaque commande avec `--api`. La CLI lit la clé dans `VERCEL_TOKEN`.\n\n ```bash\n export VERCEL_TOKEN=ah_…\n vercel --api https://api.host.hgdc.ch whoami\n ```\n\n **Vérification** : la commande affiche ton identifiant, sans demander de connexion dans le navigateur. Pour ne pas retaper l'adresse, voir [Configurer la CLI](/reference/cli/#configurer-la-cli).\n \u003C/Step>\n \u003CStep title=\"Prépare un site\">\n Crée un dossier `mon-site` avec un fichier `index.html` à sa racine :\n\n ```html\n \u003C!doctype html>\n \u003Chtml lang=\"fr\">\n \u003Chead>\n \u003Cmeta charset=\"utf-8\" />\n \u003Ctitle>Mon premier site\u003C/title>\n \u003C/head>\n \u003Cbody>\n \u003Ch1>Bonjour depuis Host\u003C/h1>\n \u003C/body>\n \u003C/html>\n ```\n\n **Vérification** : `index.html` se trouve directement dans `mon-site`, pas dans un sous-dossier.\n \u003C/Step>\n \u003CStep title=\"Déploie une preview\">\n Depuis le dossier du site :\n\n ```bash\n cd mon-site\n vercel --api https://api.host.hgdc.ch deploy\n ```\n\n Au premier envoi, la CLI crée le projet sous le nom du dossier et le relie au dossier dans `.vercel/project.json`. Elle affiche ensuite l'adresse du déploiement, de la forme `https://mon-site-abc123xyz.hgdc.cloud`.\n\n **Vérification** : ouvre l'adresse affichée. La page « Bonjour depuis Host » s'affiche. Le déploiement apparaît aussi dans l'onglet **Déploiements** du projet, avec l'état **Prêt**.\n \u003C/Step>\n \u003CStep title=\"Passe en production\">\n ```bash\n vercel --api https://api.host.hgdc.ch deploy --prod\n ```\n\n Le déploiement devient la production du projet. La CLI affiche l'adresse de production du projet, `https://mon-site.hgdc.cloud`, qui suivra chaque mise en production. Les domaines de production du projet le servent aussi.\n\n **Vérification** : l'onglet **Vue d'ensemble** du projet montre ce déploiement comme production.\n \u003C/Step>\n\u003C/Steps>\n\n## Et après\n\n- Pour mettre le site sur ton propre domaine, suis [Brancher un domaine](/guides/brancher-un-domaine/).\n- Pour déployer à chaque `git push`, suis [Déployer depuis GitHub](/demarrer/depuis-github/).\n\n## Si ça ne marche pas\n\n- La CLI répond `403` : la clé est mal copiée, ou elle ne commence pas par `ah_`. Voir [Dépannage](/guides/depannage/#la-cli-renvoie-403).\n- La page affiche `404` : le dossier envoyé n'a pas d'`index.html` à sa racine.","../../../../wt-aide-ui/host/demarrer/premier-site.mdx","295e3c378beb0d3d","guides/brancher-un-domaine",{"id":86,"data":88,"body":94,"filePath":95,"digest":96,"deferredRender":8},{"sidebarTitle":89,"title":89,"description":90,"editUrl":8,"head":91,"template":10,"sidebar":92,"pagefind":8,"draft":12},"Brancher un domaine","Sers ton site sur ton propre domaine, avec HTTPS automatique, en quelques minutes de configuration DNS.",[],{"hidden":12,"attrs":93},{},"Ce guide sert ton site sur `www.exemple.ch` ou `exemple.ch`. Host vérifie que le domaine est à toi, attend que le trafic arrive, puis obtient le certificat HTTPS.\n\n**Résultat attendu** : le domaine affiche le statut **Vérifié** et le certificat HTTPS, et ton site répond sur ce domaine.\n\n**Avant de commencer** :\n\n- un projet déployé en production ;\n- l'accès à la zone DNS du domaine chez ton hébergeur. Le DNS d'Infomaniak, de Cloudflare ou d'un autre hébergeur fonctionne de la même façon.\n\n\u003CSteps>\n \u003CStep title=\"Ajoute le domaine au projet\">\n Dans le projet, ouvre l'onglet **Domaines** et clique **Ajouter un domaine**. Saisis le nom, par exemple `www.exemple.ch` ou `exemple.ch`.\n\n Choisis ce que le domaine sert, dans **Mise en ligne du domaine** :\n\n - la production, pour le site principal ;\n - une branche, par exemple `staging.exemple.ch` pour la branche `staging` ;\n - une redirection vers un autre domaine du même projet.\n\n Pour un domaine racine, la case **Ajouter aussi www.** crée `www` en redirection permanente vers le domaine racine.\n\n **Vérification** : le domaine apparaît dans la liste avec le statut **En attente des DNS**.\n \u003C/Step>\n \u003CStep title=\"Prouve que le domaine est à toi\">\n Chez ton hébergeur DNS, crée un enregistrement **TXT** avec le nom et la valeur affichés sous **Prouver que le domaine est à toi (TXT)**.\n\n Le nom commence toujours par `_agenthost.`, suivi du domaine. Certains hébergeurs ajoutent le domaine tout seul : saisis alors seulement la partie avant le domaine, par exemple `_agenthost.www`.\n \u003C/Step>\n \u003CStep title=\"Dirige le trafic vers Host\">\n Sous **Diriger le trafic vers Host**, crée l'enregistrement indiqué :\n\n | Domaine | Type | Nom | Valeur |\n |---|---|---|---|\n | Sous-domaine, par exemple `www.exemple.ch` | **CNAME** | `www` | La cible affichée dans la console |\n | Domaine racine, `exemple.ch` | **A** | `@` | L'adresse IPv4 affichée dans la console |\n\n Un CNAME ne peut pas être posé sur la racine d'un domaine. Pour un domaine racine, utilise donc le A.\n\n \u003CWarning>\n Supprime les anciens enregistrements A, AAAA ou CNAME qui pointent vers un autre hébergeur sur le même nom. Un enregistrement qui reste peut masquer le nouveau.\n \u003C/Warning>\n \u003C/Step>\n \u003CStep title=\"Attends la vérification\">\n Host revérifie le domaine toutes les 15 minutes tant qu'il n'est pas vérifié. Clique **Vérifier** pour lancer la vérification tout de suite.\n\n Chaque étape s'affiche : la preuve TXT, le trafic, puis le certificat.\n\n **Vérification** : le statut passe à **Vérifié**, puis le certificat HTTPS apparaît avec sa date d'échéance.\n \u003C/Step>\n\u003C/Steps>\n\nOuvre le domaine dans un navigateur : ton site répond en HTTPS.\n\n## Ce que tu n'as pas à faire\n\n- Téléverser un certificat. Host le demande dès que le domaine est vérifié, et le renouvelle seul.\n- Redéployer. Un domaine de production sert le dernier déploiement de production prêt.\n\n## Statuts d'un domaine\n\n| Statut | Signification |\n|---|---|\n| **En attente des DNS** | La preuve TXT ou le trafic manque encore. Le domaine n'est pas servi. |\n| **Vérifié** | La preuve est là et le trafic arrive. Le domaine est servi. |\n| **Ne pointe pas vers nous** | La preuve TXT est là, mais le trafic n'arrive pas à Host. Corrige le CNAME ou le A. |\n\nUn domaine vérifié est revérifié chaque jour. Si la preuve TXT disparaît, une seconde vérification a lieu une heure plus tard. Si elle échoue aussi, le domaine repasse en attente et n'est plus servi. Garde donc le TXT en place.\n\n## Si ça ne marche pas\n\n- Le domaine reste **En attente des DNS** : vérifie le nom du TXT, qui doit commencer par `_agenthost.`. Un ancien enregistrement peut aussi retarder la propagation. Voir [Dépannage](/guides/depannage/#mon-domaine-reste-en-attente).\n- Host refuse le nom avec « Ce domaine appartient à la plateforme » : les domaines de Host et ceux de la plateforme de déploiement ne peuvent pas être utilisés comme domaine client.\n- Le certificat n'est pas encore émis : attends que le statut soit **Vérifié**, puis patiente quelques minutes. Si l'erreur « Le certificat HTTPS n'a pas encore pu être émis » persiste, écris à [support@hgdc.ch](mailto:support@hgdc.ch).\n\n## Voir aussi\n\n- [Domaines : référence](/reference/domaines/) : les enregistrements, les codes de redirection et les limites.\n- [Migrer depuis Vercel](/guides/migrer-depuis-vercel/) : changer le DNS sans coupure.","../../../../wt-aide-ui/host/guides/brancher-un-domaine.mdx","9091c2f558fcb8c9","guides/cle-d-api",{"id":97,"data":99,"body":106,"filePath":107,"digest":108,"deferredRender":8},{"sidebarTitle":100,"title":101,"description":102,"editUrl":8,"head":103,"template":10,"sidebar":104,"pagefind":8,"draft":12},"Clés d'API","Créer et révoquer une clé d'API","Crée une clé pour la CLI ou ton intégration, choisis sa portée et révoque-la quand elle ne sert plus.",[],{"hidden":12,"attrs":105},{},"Une clé d'API authentifie la CLI et l'API. Ce guide crée une clé, la range au bon endroit, puis la révoque.\n\n**Résultat attendu** : une clé qui commence par `ah_`, visible dans la liste **Clés actives** de ton organisation, et révocable depuis la liste.\n\n**Avant de commencer** : être admin ou propriétaire de l'organisation. Les membres ne voient pas l'onglet **Clés d'API**.\n\n## Créer une clé\n\n\u003CSteps>\n \u003CStep title=\"Ouvre l'onglet Clés d'API\">\n Dans ton organisation, ouvre **Clés d'API**, puis clique **Créer une clé**.\n \u003C/Step>\n \u003CStep title=\"Donne-lui un nom parlant\">\n Choisis un nom qui dit où la clé sert, par exemple `Poste de Léa` ou `CI GitHub`. Il t'aidera à savoir quelle clé révoquer.\n \u003C/Step>\n \u003CStep title=\"Copie la clé tout de suite\">\n La fenêtre **Nouvelle clé d'API** affiche la clé complète une seule fois. Clique **Copier la clé** et range-la dans un gestionnaire de mots de passe.\n\n Host ne garde qu'une empreinte de la clé. Si tu la perds, aucune copie n'est possible : crée une nouvelle clé et révoque l'ancienne.\n\n **Vérification** : la clé apparaît dans **Clés actives** avec son nom et la date de création.\n \u003C/Step>\n\u003C/Steps>\n\n## Choisir la bonne portée\n\n| Sorte de clé | Qui la crée | Ce qu'elle peut faire |\n|---|---|---|\n| Clé d'organisation | Un admin ou un propriétaire, dans la console | Tous les projets de l'organisation, et créer de nouveaux projets |\n| Clé de projet | L'app GitHub, à l'import d'un dépôt | Un seul projet. Tout autre projet répond `404` |\n\nPour ton poste de développement, prends une clé d'organisation. Pour un dépôt, laisse l'app GitHub poser sa clé de projet.\n\n\u003CWarning>\n Une clé d'organisation lit les variables non sensibles de tous les projets avec `vercel pull`. Ne la mets jamais dans un dépôt, ni dans du code envoyé au navigateur.\n\u003C/Warning>\n\n## Utiliser la clé\n\nLa CLI lit la clé dans la variable `VERCEL_TOKEN`, qui évite de l'écrire dans l'historique du shell :\n\n```bash\nexport VERCEL_TOKEN=ah_…\nvercel --api https://api.host.hgdc.ch deploy\n```\n\nPour une requête HTTP, envoie-la dans l'en-tête `Authorization` :\n\n```bash\ncurl https://api.host.hgdc.ch/v2/user \\\n -H \"Authorization: Bearer $VERCEL_TOKEN\"\n```\n\n## Révoquer une clé\n\n\u003CSteps>\n \u003CStep title=\"Repère la clé\">\n Dans **Clés actives**, regarde la date de **Dernière utilisation**. Une clé inutilisée depuis longtemps peut être révoquée sans risque.\n \u003C/Step>\n \u003CStep title=\"Révoque-la\">\n Clique **Révoquer la clé**, puis confirme.\n\n **Vérification** : la clé disparaît de **Clés actives**. Une requête avec cette clé répond `403` avec le code `forbidden`.\n \u003C/Step>\n\u003C/Steps>\n\nUne clé cesse aussi de fonctionner quand la personne qui l'a créée quitte l'organisation dans Account. Une clé n'expire pas d'elle-même.\n\n## Si ça ne marche pas\n\n- La CLI répond `403`, avec le message « Clé d'API absente ou invalide » : la clé est mal copiée, ou elle a été révoquée. Voir [Dépannage](/guides/depannage/#la-cli-renvoie-403).\n- Le message « Cette clé est limitée à un autre projet » apparaît : tu utilises la clé d'un dépôt pour un autre projet. Crée une clé d'organisation.\n\n## Voir aussi\n\n- [Clés d'API et sécurité](/concepts/secrets-et-coffre/) : ce que Host garde et ce qu'il ne garde pas.\n- [Référence de l'API](/reference/api/introduction/#authentification) : l'en-tête, la portée et les limites.","../../../../wt-aide-ui/host/guides/cle-d-api.mdx","1afc33c9875c5d61","guides/depannage",{"id":109,"data":111,"body":117,"filePath":118,"digest":119,"deferredRender":8},{"sidebarTitle":112,"title":112,"description":113,"editUrl":8,"head":114,"template":10,"sidebar":115,"pagefind":8,"draft":12},"Dépannage","Les problèmes les plus fréquents avec la CLI, GitHub, les déploiements et les domaines, et comment les résoudre.",[],{"hidden":12,"attrs":116},{},"Ce guide liste les problèmes fréquents, classés par symptôme. Chaque section donne les causes probables, dans l'ordre où les vérifier.\n\nSi rien ne correspond, écris à [support@hgdc.ch](mailto:support@hgdc.ch) avec l'adresse du déploiement concerné.\n\n## La CLI renvoie 403\n\nLa clé est absente, mal copiée, révoquée, ou elle appartient à une organisation qui n'existe plus.\n\n- Vérifie qu'elle commence par `ah_` et qu'elle est passée par `VERCEL_TOKEN` ou `--token`.\n- Vérifie qu'elle n'a pas été révoquée dans **Clés actives**. Une clé cesse aussi de fonctionner quand la personne qui l'a créée quitte l'organisation.\n- Vérifie que `--api https://api.host.hgdc.ch` est présent. Sans lui, la CLI parle à Vercel, pas à Host.\n\nLe message « Cette clé est limitée à un autre projet » signifie que tu utilises la clé posée dans un dépôt pour un autre projet. Crée une clé d'organisation, voir [Créer et révoquer une clé d'API](/guides/cle-d-api/).\n\n## La CLI affiche missing_files\n\nC'est normal : Host demande les fichiers qu'il n'a pas encore, la CLI les envoie puis rappelle l'API. Si l'erreur persiste, un fichier n'a pas pu partir : il dépasse 20 Mo, ou le réseau a coupé. Relance le déploiement.\n\n## vercel login ne fonctionne pas\n\nC'est voulu : la connexion passe toujours par une clé d'API. Exporte la clé dans `VERCEL_TOKEN`, puis lance la commande avec `--api`, voir [Configurer la CLI](/reference/cli/#configurer-la-cli).\n\n## Le build GitHub est absent\n\nUn push ne déclenche aucun build dans Host.\n\n- La pull request d'installation est-elle fusionnée sur la branche poussée ? Le fichier `.github/workflows/hgdc-host.yml` doit exister sur cette branche.\n- Ouvre l'onglet **Actions** du dépôt : le run y apparaît, avec son erreur.\n- Le secret `HGDC_HOST_TOKEN` manque ou a été supprimé. Débranche le dépôt, puis relie-le pour poser un nouveau secret.\n- Le projet a été importé avant une évolution du workflow. Utilise **Mettre à jour le workflow** dans l'onglet **Git**.\n\n## Mon site affiche 404\n\n- Le dossier envoyé n'a pas d'`index.html` à sa racine, ou le dossier de sortie configuré est faux. Voir [Déployer un site statique](/guides/site-statique/).\n- La page est rendue à la demande, et l'exécution des fonctions n'est pas encore ouverte à ton organisation : la page répond alors `501`. Pré-rends-la, ou consulte [Préversion](/concepts/preversion/).\n- Sans `cleanUrls`, `/a-propos` ne trouve pas `a-propos.html`. Ajoute `\"cleanUrls\": true` à `vercel.json`.\n- La page de déploiement liste les fichiers et les fonctions ignorés à la publication, avec un avertissement. Vérifie-la.\n\n## Mon domaine reste en attente\n\n- Vérifie le nom du TXT : `_agenthost.` suivi de ton domaine, pas `_agenthost` seul. Certains hébergeurs ajoutent le domaine tout seul : saisis alors seulement `_agenthost.www` pour `www.exemple.ch`.\n- Pour un domaine racine, il faut un enregistrement A, pas un CNAME.\n- Un ancien enregistrement A ou AAAA vers un autre hébergeur peut masquer le nouveau : supprime-le.\n- La propagation peut prendre quelques heures. Clique **Vérifier**, ou attends la vérification automatique, toutes les 15 minutes.\n\nTu peux contrôler les enregistrements depuis un terminal :\n\n```bash\ndig +short TXT _agenthost.www.exemple.ch\ndig +short CNAME www.exemple.ch\n```\n\nVoir [Brancher un domaine](/guides/brancher-un-domaine/).\n\n## Ma variable sensible n'apparaît pas dans vercel pull\n\nC'est voulu : une variable sensible ne part que vers le build du dépôt, par la clé limitée au projet. Depuis ton poste, utilise une valeur de développement, dans une variable non sensible visant l'environnement Développement. Voir [Variables d'environnement](/guides/variables-d-environnement/).\n\n## Une fonction répond 501\n\nLe rendu à la demande, les routes d'API et les Server Actions sont en préversion. L'exécution est ouverte organisation par organisation. Les pages statiques et pré-rendues de ton site restent en ligne. Voir [Préversion](/concepts/preversion/).\n\n## Le build échoue\n\n- Ouvre le déploiement : la sortie du build est affichée, avec la première erreur. Voir [Lire les logs](/guides/lire-les-logs/).\n- Reproduis le build sur ton poste avec `vercel build`, puis vérifie que la version de Node.js du projet correspond à celle de ton poste.\n- Une variable manque au build : ajoute-la à l'environnement visé, voir [Variables d'environnement](/guides/variables-d-environnement/).","../../../../wt-aide-ui/host/guides/depannage.mdx","dd7543231150082d","guides/deployer-depuis-github",{"id":120,"data":122,"body":128,"filePath":129,"digest":130,"deferredRender":8},{"sidebarTitle":65,"title":123,"description":124,"editUrl":8,"head":125,"template":10,"sidebar":126,"pagefind":8,"draft":12},"Déployer depuis GitHub","Importe un dépôt, suis chaque build dans Host et mets le workflow à jour quand Host le fait évoluer.",[],{"hidden":12,"attrs":127},{},"L'intégration GitHub construit ton site dans GitHub Actions, sur les minutes de ton compte, et publie le résultat. Chaque push sur la branche principale part en production. Chaque autre branche reçoit une preview.\n\n**Résultat attendu** : un push déclenche un build visible dans Host, avec sa sortie en direct, puis un déploiement **Prêt**.\n\n**Avant de commencer** : un dépôt où tu as le droit d'écriture, et un site qui se construit avec une commande de build.\n\n## Importer un dépôt\n\n\u003CSteps>\n \u003CStep title=\"Installe l'app GitHub\">\n Dans **Nouveau projet**, choisis **Importer depuis GitHub** et installe l'app **Host** sur ton compte GitHub ou sur celui de ton organisation. Tu peux la restreindre à certains dépôts.\n\n Host s'en sert pour lire la liste des dépôts, ouvrir la pull request d'installation et déclencher les builds.\n \u003C/Step>\n \u003CStep title=\"Choisis le dépôt\">\n Seuls les dépôts où tu peux pousser apparaissent. Un dépôt où tu n'as que la lecture ne s'importe pas : l'import ouvre une pull request et pose un secret dans le dépôt.\n \u003C/Step>\n \u003CStep title=\"Vérifie les réglages détectés\">\n Host propose le framework, les commandes d'installation et de build, la version de Node.js et la branche de production. Corrige ce qui ne correspond pas avant de continuer.\n\n Pour un site dans un sous-dossier, voir [Monorepo et sous-dossier](/guides/monorepo/).\n \u003C/Step>\n \u003CStep title=\"Fusionne la pull request\">\n L'import ouvre une pull request qui ajoute `.github/workflows/hgdc-host.yml` et pose le secret `HGDC_HOST_TOKEN`.\n\n **Vérification** : une fois la PR fusionnée, un push sur la branche principale déclenche un build.\n \u003C/Step>\n\u003C/Steps>\n\n## Ce que fait le workflow\n\n1. Il annonce le build à Host. Le déploiement apparaît dans la console dès le début, avec sa sortie en direct.\n2. Il restaure le cache du run précédent : `node_modules` tant que ton fichier de verrouillage ne change pas, le cache de ton framework et la CLI Vercel.\n3. Il lance `vercel pull` pour récupérer les réglages et les variables, puis `vercel build`.\n4. Il envoie le résultat avec `vercel deploy --prebuilt`, avec `--prod` sur la branche de production.\n5. En cas d'échec ou d'annulation, il le signale. Le déploiement passe à **Erreur** ou **Annulé**.\n\nDeux pushes sur la même branche : le premier build est annulé au profit du second. Le premier build d'une branche remplit le cache, les suivants vont plus vite.\n\nPour repartir d'un cache propre, supprime les caches `hgdc-host-*` dans l'onglet **Actions** du dépôt.\n\n## Déployer sans pousser\n\nDans Host, deux actions relancent un build sans nouveau commit :\n\n- **Déployer en production** lance le workflow sur la branche de production.\n- **Redéployer**, sur un déploiement, reconstruit le même commit avec les variables d'aujourd'hui.\n\nLe build passe par GitHub Actions, comme pour un push.\n\n## Mettre le workflow à jour\n\nQuand Host fait évoluer son workflow, l'onglet **Git** du projet propose **Mettre à jour le workflow**. Host ouvre une pull request qui remplace le fichier. Fusionne-la, puis déploie.\n\n## Débrancher le dépôt\n\nDans l'onglet **Git**, **Débrancher** révoque la clé posée dans le dépôt. Les pushes suivants n'arrivent plus à Host. Supprime ensuite le fichier `.github/workflows/hgdc-host.yml` du dépôt. Les dépôts branchés avant le changement de nom gardent `.github/workflows/smartflow-host.yml` et le secret `SMARTFLOW_HOST_TOKEN` : ils continuent de fonctionner, sans rien changer de ton côté.\n\nLes variables du projet restent en place, devenues manuelles. Aucun build ne les perd d'un coup.\n\n\u003CTip>\n Tu préfères écrire ton propre workflow ? Voir [GitHub Actions sans l'application](/guides/github-actions-sans-application/).\n\u003C/Tip>\n\n## Si ça ne marche pas\n\nVoir [Dépannage](/guides/depannage/#le-build-github-est-absent) pour le build qui n'apparaît pas, et la sortie du run dans l'onglet **Actions** du dépôt pour le build qui échoue.","../../../../wt-aide-ui/host/guides/deployer-depuis-github.mdx","9dd130e0b5bf7f9e","guides/deployer-un-framework",{"id":131,"data":133,"body":140,"filePath":141,"digest":142,"deferredRender":8},{"sidebarTitle":134,"title":135,"description":136,"editUrl":8,"head":137,"template":10,"sidebar":138,"pagefind":8,"draft":12},"Un framework","Déployer un framework","Construis ton site avec vercel build, puis envoie le résultat. Astro, Vite, Next.js, SvelteKit, Nuxt et les autres.",[],{"hidden":12,"attrs":139},{},"Host sert ce que `vercel build` produit : les fichiers statiques, les pages pré-rendues et, en préversion, les fonctions Node. Tu construis en local ou en CI, puis tu envoies le résultat. Les sources de ton projet ne sont jamais servies.\n\n**Résultat attendu** : un déploiement **Prêt** dont la page affiche ton site construit.\n\n**Avant de commencer** : une commande de build qui fonctionne sur ton poste, et une clé d'API dans `VERCEL_TOKEN`. Pour la liste des frameworks et de ce qui est servi pour chacun, voir [Compatibilité](/reference/compatibilite/).\n\n## Construire puis envoyer\n\n\u003CSteps>\n \u003CStep title=\"Construis le projet\">\n Depuis le dossier du projet :\n\n ```bash\n export VERCEL_TOKEN=ah_…\n vercel --api https://api.host.hgdc.ch build\n ```\n\n La commande détecte le framework, installe les dépendances, lance le build, et écrit le résultat dans `.vercel/output`. Elle télécharge aussi les variables de l'environnement visé. Voir [vercel build](/reference/cli/#vercel-build).\n\n **Vérification** : le dossier `.vercel/output/static` contient les fichiers de ton site.\n \u003C/Step>\n \u003CStep title=\"Envoie le résultat\">\n ```bash\n vercel --api https://api.host.hgdc.ch deploy --prebuilt\n ```\n\n L'option `--prebuilt` envoie `.vercel/output` tel quel, sans reconstruire.\n\n **Vérification** : l'adresse du déploiement répond avec ton site, et le déploiement passe à **Prêt**.\n \u003C/Step>\n \u003CStep title=\"Passe en production\">\n Utilise la même cible des deux côtés. Pour la production :\n\n ```bash\n vercel --api https://api.host.hgdc.ch build --prod\n vercel --api https://api.host.hgdc.ch deploy --prebuilt --prod\n ```\n\n \u003CWarning>\n La CLI refuse l'envoi si la cible du build et celle du déploiement ne correspondent pas. Une preview se construit sans `--prod`, et se déploie sans `--prod`.\n \u003C/Warning>\n \u003C/Step>\n\u003C/Steps>\n\n## Ce qui est servi, par framework\n\n| Framework | Servi tel quel | Préversion |\n|---|---|---|\n| Astro | Les pages générées | Rendu à la demande, routes d'API, middleware, ISR |\n| Vite (React, Vue, Svelte…) | Le build de l'application | |\n| SvelteKit | Les pages pré-rendues | Rendu à la demande, routes d'API, actions de formulaire, ISR |\n| Nuxt | Les pages générées | Rendu à la demande, routes d'API, middleware serveur, ISR |\n| TanStack Start | Les pages pré-rendues | |\n| React Router | Les pages pré-rendues | |\n| Next.js | Les pages pré-rendues et leur navigation | Rendu à la demande, routes d'API, Server Actions, proxy, ISR, routes edge |\n\nLe tableau complet, avec les fonctions de la plateforme, est dans [Compatibilité](/reference/compatibilite/).\n\n## Next.js\n\n- `next/image` sert l'image d'origine, sans redimensionnement. Optimise tes images avant le build.\n- La page `not-found` sert de 404.\n- Une page rendue à la demande, une route d'API ou une Server Action tourne dans une fonction. Elle demande la préversion, voir [Préversion](/concepts/preversion/).\n\n## Un site de documentation\n\nUn dossier avec un `docs.json` et le paquet `@hgdc/docs` dans son `package.json` est reconnu comme une documentation, sans `vercel.json`. Le build lance `hgdc-docs build` et publie le dossier `dist`. Les pages `.md` sont servies en `text/markdown`.\n\n## Si ça ne marche pas\n\n- Le déploiement répond `404` : la sortie de build ne contient pas de `index.html` à la racine, ou le dossier de sortie est faux. Voir [Dépannage](/guides/depannage/#mon-site-affiche-404).\n- Une page répond `501` : le rendu à la demande n'est pas encore ouvert à ton organisation. Pré-rends la page, ou consulte [Préversion](/concepts/preversion/).","../../../../wt-aide-ui/host/guides/deployer-un-framework.mdx","a96087245851c12f","guides/github-actions-sans-application",{"id":143,"data":145,"body":152,"filePath":153,"digest":154,"deferredRender":8},{"sidebarTitle":146,"title":147,"description":148,"editUrl":8,"head":149,"template":10,"sidebar":150,"pagefind":8,"draft":12},"GitHub Actions sans l'app","Déployer avec GitHub Actions, sans l'application","Écris ton propre workflow avec la CLI Vercel, sans passer par l'app GitHub de Host.",[],{"hidden":12,"attrs":151},{},"Tu préfères garder la main sur ton workflow, ou tu utilises une autre CI ? L'app GitHub n'est pas nécessaire : la CLI suffit. Ce guide met en place un workflow qui construit et déploie à chaque push.\n\n**Résultat attendu** : un push sur la branche principale publie en production, et un push sur une autre branche publie une preview.\n\n**Ce que tu perds par rapport à l'app** : le déploiement n'apparaît dans Host qu'à l'envoi, sans sortie de build en direct, et le statut du commit n'est pas mis à jour.\n\n## Relier le dossier au projet\n\n\u003CSteps>\n \u003CStep title=\"Lance un premier déploiement en local\">\n Depuis le dossier du projet, avec ta clé d'organisation :\n\n ```bash\n export VERCEL_TOKEN=ah_…\n vercel --api https://api.host.hgdc.ch deploy --yes\n ```\n\n La commande crée `.vercel/project.json`, qui contient `orgId` et `projectId`.\n\n **Vérification** : le fichier `.vercel/project.json` existe, et le projet apparaît dans Host.\n \u003C/Step>\n \u003CStep title=\"Ajoute les secrets au dépôt\">\n Dans le dépôt GitHub, ouvre **Settings → Secrets and variables → Actions** et crée trois secrets :\n\n | Secret | Valeur |\n |---|---|\n | `VERCEL_TOKEN` | Une clé d'API `ah_…` d'organisation |\n | `VERCEL_ORG_ID` | La valeur `orgId` de `.vercel/project.json` |\n | `VERCEL_PROJECT_ID` | La valeur `projectId` de `.vercel/project.json` |\n\n Ne mets ni la clé ni les identifiants dans le fichier de workflow.\n \u003C/Step>\n \u003CStep title=\"Ajoute le workflow\">\n Crée `.github/workflows/deploy.yml` :\n\n ```yaml\n name: Déploiement\n\n on:\n push:\n branches: [main]\n pull_request:\n\n permissions:\n contents: read\n\n env:\n VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}\n VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}\n VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}\n API: https://api.host.hgdc.ch\n\n jobs:\n deploy:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v7\n - uses: actions/setup-node@v7\n with:\n node-version: 24\n - run: npm install --global vercel@63\n - name: Production\n if: github.ref == 'refs/heads/main'\n run: |\n vercel pull --yes --environment=production --api \"$API\"\n vercel build --prod --api \"$API\"\n vercel deploy --prebuilt --prod --api \"$API\"\n - name: Preview\n if: github.ref != 'refs/heads/main'\n run: |\n vercel pull --yes --environment=preview --api \"$API\"\n vercel build --api \"$API\"\n vercel deploy --prebuilt --api \"$API\"\n ```\n\n La CLI lit `VERCEL_TOKEN`, `VERCEL_ORG_ID` et `VERCEL_PROJECT_ID` dans l'environnement. Le projet n'a pas besoin d'un dossier `.vercel` dans le dépôt.\n\n Adapte `node-version` à la version de Node.js de ton projet. Pour un site qui n'a pas de build, supprime les étapes `vercel build`.\n\n **Vérification** : le run **Déploiement** apparaît dans l'onglet **Actions**, et son job se termine en vert. Le déploiement apparaît dans le projet Host.\n \u003C/Step>\n\u003C/Steps>\n\n## Variables sensibles\n\nUne variable sensible n'est livrée qu'à une clé limitée au projet, celle que pose l'app GitHub. Avec une clé d'organisation, `vercel pull` ne la récupère pas.\n\nSi ton build a besoin d'un secret, passe-le par un secret du dépôt, puis expose-le au build avec `env:`. Ne le mets pas dans une variable publique du projet. Voir [Secrets et coffre](/concepts/secrets-et-coffre/).\n\n## Si ça ne marche pas\n\n- Le job échoue sur `vercel pull` avec un `403` : la clé `VERCEL_TOKEN` est mal copiée ou révoquée. Voir [Dépannage](/guides/depannage/#la-cli-renvoie-403).\n- Le job tourne, mais aucun déploiement n'apparaît : vérifie que `VERCEL_PROJECT_ID` et `VERCEL_ORG_ID` viennent bien de `.vercel/project.json`.","../../../../wt-aide-ui/host/guides/github-actions-sans-application.mdx","8a2c5a53a9489df0","guides/inviter-une-personne",{"id":155,"data":157,"body":164,"filePath":165,"digest":166,"deferredRender":8},{"sidebarTitle":158,"title":159,"description":160,"editUrl":8,"head":161,"template":10,"sidebar":162,"pagefind":8,"draft":12},"Inviter une personne","Inviter une personne dans une organisation","Ajoute un collègue à ton organisation depuis Account, et choisis son rôle pour qu'il accède aux projets.",[],{"hidden":12,"attrs":163},{},"Les membres d'une organisation se gèrent dans Account, pas dans Host. Ce guide invite une personne, puis vérifie qu'elle accède aux projets.\n\n**Résultat attendu** : la personne se connecte à Host, voit l'organisation et ses projets, avec le rôle que tu lui as donné.\n\n**Avant de commencer** : être propriétaire ou admin de l'organisation dans Account. Les rôles sont décrits dans [Organisations et rôles](/concepts/organisations-et-roles/).\n\n\u003CSteps>\n \u003CStep title=\"Invite depuis Account\">\n Ouvre la page de ton organisation dans [Account](https://account.hgdc.ch). Invite la personne par son adresse e-mail, et choisis son rôle : **membre**, **admin** ou **propriétaire**.\n\n **Vérification** : l'invitation apparaît dans la liste des invitations en attente d'Account.\n \u003C/Step>\n \u003CStep title=\"La personne se connecte\">\n La personne se connecte à Host avec **Se connecter avec HGDC**, avec la même adresse e-mail vérifiée. Son compte est lié à l'organisation, et ses projets restent en place.\n\n Une personne qui n'a pas encore de compte demande d'abord un accès sur la page **Demander un accès** de Host. L'invitation suit.\n \u003C/Step>\n \u003CStep title=\"Vérifie l'accès\">\n Demande à la personne d'ouvrir son tableau de bord.\n\n **Vérification** : elle voit ton organisation dans le sélecteur de la barre latérale, et les projets qu'elle peut voir. Un membre n'a pas accès à l'onglet **Clés d'API**.\n \u003C/Step>\n\u003C/Steps>\n\n## Changer un rôle ou retirer une personne\n\nModifie le rôle ou retire la personne dans Account. Host ne garde pas sa propre liste de membres : la liste affichée dans Host est une copie en lecture seule, mise à jour à la prochaine connexion de la personne.\n\nUne session dure 7 jours au plus, sans prolongation. Un changement de rôle ou un retrait peut donc prendre effet jusqu'à la prochaine connexion, au plus tard à la fin de la session.\n\nLes clés d'API créées par une personne cessent de fonctionner quand elle quitte l'organisation. Révoque-les si tu veux agir tout de suite. Voir [Créer et révoquer une clé d'API](/guides/cle-d-api/).\n\n## Si ça ne marche pas\n\n- L'organisation n'apparaît pas pour la personne : vérifie que l'adresse e-mail de l'invitation est la même que celle de son compte HGDC, et qu'elle est vérifiée.\n- La personne ne peut pas faire une action : son rôle ne le permet pas (voir le tableau des rôles). Vérifie son rôle dans Account.","../../../../wt-aide-ui/host/guides/inviter-une-personne.mdx","fbf0061fe6554705","guides/lire-les-logs",{"id":167,"data":169,"body":175,"filePath":176,"digest":177,"deferredRender":8},{"sidebarTitle":170,"title":170,"description":171,"editUrl":8,"head":172,"template":10,"sidebar":173,"pagefind":8,"draft":12},"Lire les logs","Suis les requêtes servies par ton site, puis la sortie de tes builds, pour trouver la cause d'une erreur.",[],{"hidden":12,"attrs":174},{},"Les logs répondent à deux questions : qu'est-ce que les visiteurs ont reçu, et qu'est-ce qui s'est passé pendant le build. Ce guide montre où les trouver et comment les filtrer.\n\n**Résultat attendu** : tu identifies la requête ou la ligne de build à l'origine d'un problème.\n\n## Les requêtes servies\n\n\u003CSteps>\n \u003CStep title=\"Ouvre l'onglet Logs du projet\">\n Les requêtes apparaissent en direct. Pour chacune, tu vois l'heure, le statut HTTP, la méthode, le domaine, le chemin, la durée de traitement et la taille de la réponse.\n \u003C/Step>\n \u003CStep title=\"Isole les erreurs\">\n Clique **Erreur** pour ne garder que les réponses `5xx`. Clique **Alerte** pour les réponses `4xx`. La recherche lit le chemin et le domaine.\n \u003C/Step>\n \u003CStep title=\"Garde la vue à jour\">\n **Suivre** garde les dernières requêtes en vue. Sous la liste, un compteur donne le nombre de réponses par classe : 2xx, 3xx, 4xx et 5xx.\n \u003C/Step>\n \u003CStep title=\"Copie ce qui t'intéresse\">\n **Tout copier** copie toutes les requêtes reçues, une par ligne. L'icône de copie ne copie que les lignes affichées.\n \u003C/Step>\n\u003C/Steps>\n\nLes requêtes ne gardent ni adresse IP, ni en-têtes, ni paramètres d'URL (la partie après `?`). Elles disparaissent après trois jours. Voir [Confidentialité](/concepts/confidentialite/).\n\n## La sortie d'un build\n\nLa page de chaque déploiement affiche la sortie du build : installation, `vercel build`, puis publication.\n\n- Avec l'intégration GitHub, les lignes arrivent en direct pendant le build.\n- Cherche dans les lignes, ou filtre les erreurs et les alertes.\n- Ouvre le run GitHub Actions pour la sortie complète, si ton build passe par GitHub.\n- **Tout copier** copie la sortie entière. L'icône de copie ne copie que les lignes affichées.\n\n## Suivre un déploiement depuis le terminal\n\n`vercel deploy` suit la publication jusqu'à la fin, pendant 9 minutes au plus, puis rend la main :\n\n```bash\nvercel --api https://api.host.hgdc.ch deploy --prod\n```\n\n## Si ça ne marche pas\n\n- Un build n'a pas de sortie : il est peut-être en file, ou il a été annulé avant de démarrer. Vérifie l'état du déploiement.\n- Un problème de page n'apparaît pas dans les logs de requêtes : les requêtes sont gardées trois jours seulement. Reproduis le problème, puis regarde tout de suite.\n- Pour une erreur de build, commence par la première ligne d'erreur du filtre **Erreur**, puis remonte la sortie jusqu'à elle. Voir [Dépannage](/guides/depannage/).","../../../../wt-aide-ui/host/guides/lire-les-logs.mdx","0470e30b7bd155e2","guides/migrer-depuis-vercel",{"id":178,"data":180,"body":187,"filePath":188,"digest":189,"deferredRender":8},{"sidebarTitle":181,"title":182,"description":183,"editUrl":8,"head":184,"template":10,"sidebar":185,"pagefind":8,"draft":12},"Migrer depuis Vercel","Migrer un projet depuis Vercel","Déplace un projet de Vercel vers Host sans changer tes outils, avec une bascule DNS sans coupure.",[],{"hidden":12,"attrs":186},{},"Host reprend les outils que tu utilises déjà : la CLI Vercel, `vercel.json` et le format Build Output API. Migrer revient à recréer le projet, reprendre ses variables, puis changer le DNS.\n\n**Résultat attendu** : ton domaine sert le site depuis Host, et le projet Vercel n'envoie plus de déploiement.\n\n**Avant de commencer** : vérifie que ton site n'utilise que des fonctions prises en charge. Les fonctions, le runtime edge, l'ISR et les crons sont en préversion, voir [Compatibilité](/reference/compatibilite/).\n\n\u003CSteps>\n \u003CStep title=\"Crée le projet sur Host\">\n Importe le dépôt depuis GitHub, voir [Déployer depuis GitHub](/guides/deployer-depuis-github/). Ou lance `vercel deploy` depuis le dossier du projet avec une clé Host.\n\n Supprime d'abord le dossier `.vercel` s'il existe : il pointe vers le projet Vercel.\n\n ```bash\n rm -rf .vercel\n vercel --api https://api.host.hgdc.ch deploy\n ```\n\n **Vérification** : un déploiement de preview est **Prêt**.\n \u003C/Step>\n \u003CStep title=\"Reprends les variables\">\n Sur Vercel, `vercel env pull .env.production --environment=production` écrit les variables lisibles dans un fichier.\n\n Colle le contenu de ce fichier dans **Ajouter**, dans l'onglet **Variables d'environnement** de Host, en choisissant l'environnement Production. Les variables marquées « Sensitive » sur Vercel ne se relisent pas : saisis-les à nouveau.\n\n **Vérification** : le nombre de variables correspond à celui de Vercel.\n \u003C/Step>\n \u003CStep title=\"Vérifie la preview\">\n Ouvre l'adresse du déploiement et parcours le site : pages, redirections, page 404 et ressources.\n\n **Vérification** : aucune page ne répond `404` ou `501` de façon inattendue.\n \u003C/Step>\n \u003CStep title=\"Ajoute le domaine et change le DNS\">\n Ajoute le domaine au projet, pose le TXT de propriété, puis remplace les enregistrements qui pointaient vers Vercel par le CNAME ou le A indiqué. Le détail est dans [Brancher un domaine](/guides/brancher-un-domaine/).\n \u003C/Step>\n \u003CStep title=\"Retire le projet de Vercel\">\n Une fois le trafic arrivé et le certificat émis, débranche le dépôt côté Vercel. Tu évites ainsi deux déploiements à chaque push.\n \u003C/Step>\n\u003C/Steps>\n\n\u003CTip>\n Pose d'abord le TXT : il ne change rien au trafic. Ne change le CNAME ou le A que quand le domaine est prêt côté Host. Baisse le TTL de l'enregistrement quelques heures avant la bascule, pour revenir vite en arrière si besoin.\n\u003C/Tip>\n\n## Si ça ne marche pas\n\n- La preview affiche une page `501` : une fonction n'est pas encore ouverte à ton organisation. Voir [Préversion](/concepts/preversion/).\n- Le site répond encore depuis Vercel : le DNS n'est pas propagé, ou un ancien enregistrement subsiste. Voir [Dépannage](/guides/depannage/#mon-domaine-reste-en-attente).","../../../../wt-aide-ui/host/guides/migrer-depuis-vercel.mdx","a52b878bb118d086","guides/monorepo",{"id":190,"data":192,"body":199,"filePath":200,"digest":201,"deferredRender":8},{"sidebarTitle":193,"title":194,"description":195,"editUrl":8,"head":196,"template":10,"sidebar":197,"pagefind":8,"draft":12},"Monorepo","Déployer une app dans un monorepo","Déploie une app qui vit dans un sous-dossier, et plusieurs sites d'un même dépôt.",[],{"hidden":12,"attrs":198},{},"Ton site peut vivre dans un sous-dossier, comme `apps/web` ou `site/`, dans un dépôt qui contient d'autres applications. Indique à Host le dossier racine du projet : c'est là que le build s'exécute.\n\n**Résultat attendu** : le build s'exécute depuis le dossier de ton app, et seule cette app est publiée.\n\n## Détection à l'import\n\nÀ l'import GitHub, Host lit tout le dépôt et cherche les dossiers qui contiennent un `package.json`, jusqu'à quatre niveaux de profondeur. Il préfère, dans l'ordre :\n\n1. un framework reconnu ;\n2. un dossier qui a un script `build` ;\n3. un nom usuel : `web`, `site`, `www`, `frontend`, `app`, `landing`, `marketing` ;\n4. le dossier le moins profond.\n\nLa racine d'un monorepo, avec un champ `workspaces`, un `pnpm-workspace.yaml`, un `turbo.json` ou un `nx.json`, n'est jamais choisie seule. Si le dépôt contient plusieurs applications, choisis celle à déployer. Les dossiers `node_modules`, `dist`, `build` et les caches sont ignorés.\n\nPour changer le dossier après l'import, modifie le **dossier racine** dans les réglages du projet.\n\n## Le fichier de verrouillage\n\nDans un monorepo, le fichier de verrouillage, comme `pnpm-lock.yaml` ou `bun.lock`, est souvent à la racine. Il compte pour toutes les applications : la commande d'installation suit le gestionnaire qu'il désigne.\n\n## Plusieurs sites dans un dépôt\n\nImporte le dépôt une fois par site, en choisissant à chaque fois un dossier différent. Chaque projet a ses domaines, ses variables et son historique.\n\n## Avec la CLI\n\nLance la CLI depuis le dossier de l'app :\n\n```bash\ncd apps/web\nvercel --api https://api.host.hgdc.ch deploy\n```\n\nAvec `vercel build` et `--prebuilt`, la même règle s'applique : construis depuis le dossier de l'app. Voir [Déployer un framework](/guides/deployer-un-framework/).\n\n## Si ça ne marche pas\n\n- Le build ne trouve pas tes dépendances : ton dossier est sans doute le mauvais. Vérifie que le dossier racine contient le `package.json` de l'app, et que le fichier de verrouillage est bien à la racine du dépôt.\n- Host propose la racine du monorepo : choisis le dossier de l'application, pas la racine.","../../../../wt-aide-ui/host/guides/monorepo.mdx","cffbdca37bb6ed21","guides/revenir-en-arriere",{"id":202,"data":204,"body":211,"filePath":212,"digest":213,"deferredRender":8},{"sidebarTitle":205,"title":206,"description":207,"editUrl":8,"head":208,"template":10,"sidebar":209,"pagefind":8,"draft":12},"Revenir en arrière","Revenir en arrière, redéployer ou annuler","Remets en ligne une version précédente, relance un build ou annule un déploiement en cours.",[],{"hidden":12,"attrs":210},{},"Une mise en production s'est mal passée ? Ce guide remet en ligne une version précédente, relance un build, ou annule un déploiement en cours. Aucune de ces actions ne demande de nouveau commit.\n\n**Résultat attendu** : ton domaine de production sert la version choisie, ou le déploiement en cours s'arrête.\n\n**Avant de commencer** : une version précédente **Prête**. Un déploiement en erreur ne peut pas redevenir la production.\n\n## Revenir à une version précédente\n\n\u003CSteps>\n \u003CStep title=\"Ouvre la liste des déploiements\">\n Dans le projet, ouvre l'onglet **Déploiements**. Chaque ligne montre l'état, la cible et le commit, quand il est connu.\n \u003C/Step>\n \u003CStep title=\"Choisis la version à remettre en ligne\">\n Ouvre un déploiement de production précédent, qui est **Prêt**, puis clique **Revenir en arrière**.\n\n Le retour est immédiat : aucun build ne tourne.\n \u003C/Step>\n \u003CStep title=\"Vérifie le site\">\n **Vérification** : tes domaines de production répondent avec la version choisie. L'onglet **Vue d'ensemble** l'affiche comme production.\n \u003C/Step>\n\u003C/Steps>\n\nLe déploiement remis en ligne garde les variables qu'il a reçues à son build. Une variable modifiée depuis ne s'y applique pas. Pour appliquer une variable à la version remise en ligne, reconstruis-la : la section **Redéployer** plus bas explique comment.\n\n## Mettre une preview en production\n\nDepuis la page d'une preview prête, clique **Mettre en production**. Cette preview sert alors tes domaines de production, avec les variables de preview qu'elle a reçues. La console te le rappelle avant de confirmer.\n\nUtilise cette action pour valider une version sur son adresse de preview, puis la passer en production sans la reconstruire.\n\n## Redéployer\n\nRedéployer reconstruit une version avec les variables d'aujourd'hui :\n\n- **Projet relié à GitHub** : reconstruit le même commit dans GitHub Actions, avec les variables actuelles. Le bouton **Redéployer la production** le fait pour la production.\n- **Projet envoyé par la CLI** : republie les fichiers du déploiement choisi, sans rien reconstruire. Pour une nouvelle version, relance `vercel deploy`.\n\n## Annuler un déploiement\n\nUn déploiement **En file** ou **En cours de build** peut être annulé, avec **Annuler**. Un déploiement **Prêt** ne s'annule pas : reviens en arrière à la place.\n\n**Vérification** : le déploiement passe à **Annulé**, et la production n'a pas changé.\n\n## Si ça ne marche pas\n\n- **Revenir en arrière** est absent : le déploiement n'est pas **Prêt**, ou il n'est pas de production.\n- Le site répond encore avec l'ancienne version : le cache de ton navigateur ou de ton réseau peut retenir la page. Recharge la page sans cache, puis patiente quelques minutes.\n- Pour comprendre le cycle de vie d'un déploiement, lis [Déploiements](/concepts/deploiements/).","../../../../wt-aide-ui/host/guides/revenir-en-arriere.mdx","010becd77ca8a673","guides/site-statique",{"id":214,"data":216,"body":223,"filePath":224,"digest":225,"deferredRender":8},{"sidebarTitle":217,"title":218,"description":219,"editUrl":8,"head":220,"template":10,"sidebar":221,"pagefind":8,"draft":12},"Site statique","Déployer un site statique","Mets un dossier de HTML, CSS et images en ligne en une commande, sans étape de build.",[],{"hidden":12,"attrs":222},{},"Un site statique est un dossier de fichiers déjà prêts : HTML, CSS, JavaScript et images. Aucun build n'est nécessaire. Une seule commande suffit.\n\n**Résultat attendu** : une adresse de production qui sert ton dossier, avec une page 404 personnalisée si tu en fournis une.\n\n**Avant de commencer** : une clé d'API dans `VERCEL_TOKEN`, et un dossier qui contient un `index.html` à sa racine.\n\n## Déployer le dossier\n\n```bash\ncd mon-site\nvercel --api https://api.host.hgdc.ch deploy --prod\n```\n\nLe premier déploiement crée le projet, sous le nom du dossier, et relie le dossier au projet. Les suivants republient ce qui a changé : un fichier déjà connu de l'organisation n'est jamais renvoyé.\n\n**Vérification** : l'adresse de production répond avec `index.html`.\n\n## Structure attendue\n\n```text\nmon-site/\n├── index.html\n├── a-propos.html\n├── 404.html\n├── styles.css\n└── images/\n └── logo.svg\n```\n\n- Le dossier doit contenir un `index.html` à sa racine.\n- Un dossier qui ressemble à des sources, avec un `package.json` mais sans `index.html`, est refusé. Construis-le avec `vercel build` et envoie-le avec `--prebuilt`. Voir [Déployer un framework](/guides/deployer-un-framework/).\n- Les fichiers et dossiers cachés, comme `.env` ou `.git`, ne sont jamais servis.\n- `404.html` sert de page d'erreur.\n\n## Servir un sous-dossier\n\nSi les fichiers à publier sont dans un sous-dossier, comme `public/` ou `dist/`, lance la commande depuis ce sous-dossier (`cd dist`, puis `deploy`). Avec un projet relié à GitHub, indique le dossier de sortie dans les réglages de build du projet.\n\n## URL propres et redirections\n\nAjoute un `vercel.json` à la racine du dossier pour servir `/a-propos` sans `.html`, ou pour rediriger une ancienne adresse :\n\n```json\n{\n \"cleanUrls\": true,\n \"redirects\": [\n { \"source\": \"/ancienne-page\", \"destination\": \"/a-propos\", \"permanent\": true }\n ]\n}\n```\n\nToutes les options sont dans [vercel.json](/reference/vercel-json/).\n\n## Si ça ne marche pas\n\n- Le site répond `404` : le dossier envoyé n'a pas d'`index.html` à sa racine. Voir [Dépannage](/guides/depannage/#mon-site-affiche-404).\n- `/a-propos` répond `404` alors que `a-propos.html` existe : active `cleanUrls` dans `vercel.json`.","../../../../wt-aide-ui/host/guides/site-statique.mdx","08145a50247ff78d","guides/synchroniser-doppler",{"id":226,"data":228,"body":235,"filePath":236,"digest":237,"deferredRender":8},{"sidebarTitle":229,"title":230,"description":231,"editUrl":8,"head":232,"template":10,"sidebar":233,"pagefind":8,"draft":12},"Doppler","Synchroniser les variables depuis Doppler","Garde tes secrets dans Doppler. Chaque changement arrive dans le projet Host tout seul, et peut redéployer la production.",[],{"hidden":12,"attrs":234},{},"Si tes secrets vivent déjà dans Doppler, relie une de tes configs à un environnement du projet. Doppler reste la source de vérité : chaque changement arrive dans Host sans copie à la main.\n\n**Résultat attendu** : les variables de la config apparaissent dans l'environnement choisi, avec le badge **Doppler**, et ne se modifient plus que dans Doppler.\n\n**Avant de commencer** : un projet Host, et un compte Doppler avec accès à la config à synchroniser.\n\n## Relier une config\n\n\u003CSteps>\n \u003CStep title=\"Crée un jeton de service dans Doppler\">\n Dans Doppler, ouvre la config, par exemple `prd`, onglet **Access**, et génère un jeton de service en lecture seule. Il commence par `dp.st.`.\n \u003C/Step>\n \u003CStep title=\"Relie la config au projet\">\n Dans l'onglet **Variables d'environnement** du projet, section **Synchroniser depuis Doppler**, clique **Relier une config Doppler**. Choisis l'environnement, nomme la config, puis colle le jeton.\n\n Host essaie le jeton, le chiffre et ne l'affiche plus jamais. La première synchronisation part tout de suite.\n\n **Vérification** : les variables de la config apparaissent avec le badge **Doppler**.\n \u003C/Step>\n \u003CStep title=\"Ajoute le webhook dans Doppler\">\n Host affiche une adresse et un secret de signature, une seule fois. Dans Doppler, ouvre **Webhooks**, ajoute un webhook avec cette adresse, coche la config et colle le secret.\n\n Chaque changement est alors signé, puis appliqué en quelques secondes.\n\n **Vérification** : modifie une valeur de test dans Doppler. Elle apparaît dans Host en quelques secondes.\n \u003C/Step>\n\u003C/Steps>\n\n## Ce qui est synchronisé\n\n- Toutes les variables de la config, sauf les métadonnées de Doppler, comme `DOPPLER_PROJECT` ou `DOPPLER_CONFIG`.\n- Les noms réservés, qui commencent par `VERCEL_` ou `AGENTHOST_`, ne sont pas synchronisés. Les valeurs de plus de 64 Ko non plus. La console les signale.\n- 300 variables au plus par config.\n- En production et en preview, les variables sont **sensibles** : elles ne descendent pas sur un poste par `vercel pull`. En développement, elles sont ordinaires. Voir [Variables](/guides/variables-d-environnement/#marquer-une-variable-comme-sensible).\n\n## Ce qui se passe quand une valeur change\n\n- Une variable retirée de Doppler disparaît du projet au passage suivant.\n- Une config devenue vide d'un coup ne retire rien : la console signale l'erreur. C'est une protection contre un accident de configuration.\n- Une variable manuelle du même nom, sur le même environnement, l'emporte et n'est jamais écrasée. La console liste ces noms : supprime la variable manuelle pour que Doppler prenne le relais.\n- Sans webhook, ou si un appel se perd, la synchronisation repasse toute seule toutes les six heures. Clique **Synchroniser** pour la lancer tout de suite.\n\n## Redéployer à chaque changement\n\nPour un projet relié à GitHub et la config de production, active **Redéployer la production à chaque changement**. Quand une valeur change dans Doppler, le workflow du dépôt reconstruit la production avec les nouvelles valeurs.\n\nUne synchronisation sans changement ne redéploie rien.\n\n## Débrancher\n\n**Débrancher** garde les variables dans le projet, redevenues manuelles. Aucun build ne les perd d'un coup. Retire ensuite le webhook et révoque le jeton dans Doppler.\n\n\u003CTip>\n Le jeton de service et le secret du webhook sont chiffrés, liés au projet, et ne sont jamais renvoyés. Si tu perds le secret, clique **Générer un nouveau secret** sous l'adresse du webhook, puis remplace-le dans Doppler.\n\u003C/Tip>\n\n## Si ça ne marche pas\n\n- La synchronisation affiche une erreur à la connexion : le jeton n'est pas un jeton de service de la config, ou il est révoqué. Crée-en un nouveau.\n- Une variable n'arrive pas : elle porte un nom réservé, ou sa valeur dépasse 64 Ko. Vérifie la liste signalée dans la console.\n- Le webhook ne déclenche rien : vérifie que l'adresse et le secret collés dans Doppler sont ceux affichés à la création du webhook. Sinon, génère un nouveau secret.","../../../../wt-aide-ui/host/guides/synchroniser-doppler.mdx","e99ab9fb0815cd6f","guides/variables-d-environnement",{"id":238,"data":240,"body":247,"filePath":248,"digest":249,"deferredRender":8},{"sidebarTitle":241,"title":242,"description":243,"editUrl":8,"head":244,"template":10,"sidebar":245,"pagefind":8,"draft":12},"Variables","Gérer les variables d'environnement","Ajoute des variables par environnement, marque les secrets comme sensibles et applique un changement à ton site.",[],{"hidden":12,"attrs":246},{},"Les variables d'environnement passent des réglages à ton build : l'adresse d'une API, un identifiant public, une clé de service. Ce guide les ajoute, les rend sensibles si besoin, et les applique à ton site.\n\n**Résultat attendu** : une variable visible dans l'onglet **Variables d'environnement** du projet, utilisée par le prochain build de l'environnement visé.\n\n**Avant de commencer** : être membre de l'organisation. Modifier une variable demande le rôle membre ou plus.\n\n## Ajouter une variable\n\n\u003CSteps>\n \u003CStep title=\"Ouvre Ajouter\">\n Dans l'onglet **Variables d'environnement** du projet, clique **Ajouter**.\n \u003C/Step>\n \u003CStep title=\"Remplis le nom et la valeur\">\n Le nom ne contient que des lettres, des chiffres et `_`, et ne commence pas par un chiffre. Il fait 256 caractères au plus. Les noms qui commencent par `VERCEL_` ou `AGENTHOST_` sont réservés à la plateforme.\n\n La valeur fait 64 Ko au plus. Une note facultative rappelle à quoi sert la variable : 500 caractères au plus.\n \u003C/Step>\n \u003CStep title=\"Choisis les environnements\">\n Chaque variable vise un ou plusieurs environnements :\n\n | Environnement | Utilisé par |\n |---|---|\n | **Production** | Les builds de production, avec `vercel build --prod` |\n | **Preview** | Les builds de preview, donc toutes les branches autres que la production |\n | **Développement** | `vercel pull` depuis ton poste |\n\n Un même nom peut exister une fois par environnement, avec une valeur différente. Par exemple, `API_URL` pointe vers l'API de production en production, et vers l'API de test en preview.\n \u003C/Step>\n \u003CStep title=\"Ou colle un fichier .env\">\n Colle le contenu d'un fichier `.env` dans le champ du nom : chaque ligne devient une variable.\n\n ```text\n PUBLIC_API_URL=https://api.exemple.ch\n PUBLIC_ANALYTICS_ID=abc123\n ```\n\n **Vérification** : chaque variable apparaît dans la liste, avec ses environnements.\n \u003C/Step>\n\u003C/Steps>\n\n## Marquer une variable comme sensible\n\nUne clé secrète ou un mot de passe se déclare **sensible**. Une variable sensible :\n\n- ne s'affiche plus jamais après l'enregistrement, ni dans la console ni dans la CLI. Tu peux seulement la remplacer ;\n- vise la production ou la preview, jamais le développement ;\n- n'est livrée qu'au build du dépôt GitHub, par la clé limitée au projet que pose l'app GitHub. Un `vercel pull` depuis ton poste ne la télécharge pas.\n\nPour une valeur sensible utilisée par un build hors GitHub, voir [GitHub Actions sans l'application](/guides/github-actions-sans-application/#variables-sensibles).\n\n\u003CWarning>\n Tout ce que le build écrit dans les fichiers du site est public. Une variable lue dans le navigateur, comme celles qui commencent par `PUBLIC_`, `VITE_` ou `NEXT_PUBLIC_`, ne doit jamais contenir un secret, sensible ou non.\n\u003C/Warning>\n\n## Appliquer un changement\n\nUne variable est lue au build. Les déploiements déjà en ligne gardent les valeurs de leur propre build, et une modification ne les touche pas.\n\n- Pour un projet relié à GitHub, clique **Redéployer la production** pour relancer le build avec les valeurs actuelles.\n- Pour un projet déployé avec la CLI, relance le déploiement de production depuis ton dossier ou ta CI :\n\n```bash\nvercel --api https://api.host.hgdc.ch pull --environment=production\nvercel --api https://api.host.hgdc.ch build --prod\nvercel --api https://api.host.hgdc.ch deploy --prebuilt --prod\n```\n\nL'onglet signale une variable modifiée depuis le dernier build de production.\n\n**Vérification** : le nouveau déploiement de production affiche la nouvelle valeur. Le déploiement précédent ne la montre pas.\n\n## Récupérer les variables sur ton poste\n\n```bash\nvercel --api https://api.host.hgdc.ch pull\n```\n\nPar défaut, la commande télécharge l'environnement **Développement** dans `.vercel/.env.development.local`. Ajoute `--environment=preview` ou `--environment=production` pour un autre environnement. Le dossier `.vercel` est ajouté au `.gitignore` : ne le commite pas.\n\n## Si ça ne marche pas\n\n- Une variable sensible n'apparaît pas dans `vercel pull` : c'est voulu. Utilise une valeur de développement, dans une variable non sensible visant l'environnement Développement.\n- Le site n'a pas changé après la modification : le déploiement n'a pas été relancé. Voir [Appliquer un changement](#appliquer-un-changement).\n- La variable ne peut pas être créée : son nom est réservé, ou sa valeur dépasse 64 Ko. Voir [Variables : référence](/reference/variables/).\n\n## Voir aussi\n\n- [Secrets et coffre](/concepts/secrets-et-coffre/) : comment les valeurs sont chiffrées et qui peut les lire.\n- [Synchroniser depuis Doppler](/guides/synchroniser-doppler/) : garder les secrets dans Doppler.","../../../../wt-aide-ui/host/guides/variables-d-environnement.mdx","c50ad9eab4547b36","index",{"id":250,"data":252,"body":259,"filePath":260,"digest":261,"deferredRender":8},{"sidebarTitle":253,"title":254,"description":255,"editUrl":8,"head":256,"template":10,"sidebar":257,"pagefind":8,"draft":12},"Accueil","Host","Host publie tes sites sur ton domaine, avec la CLI Vercel, depuis l'Union européenne.",[],{"hidden":12,"attrs":258},{},"import Famille from \"./_famille.mdx\"\n\nHost déploie tes sites. Chaque modification donne une version en ligne, avec sa propre adresse, et la production reste sur ton domaine.\n\nTu gardes tes outils : la CLI Vercel, `vercel.json` et le format Build Output API. Seule l'adresse de l'API change.\n\n## Par où commencer\n\n\u003CCardGroup cols={2}>\n \u003CCard title=\"Mettre un premier site en ligne\" href=\"/demarrer/premier-site/\">\n Du compte à une preview, puis à la production, avec la CLI. Une quinzaine de minutes.\n \u003C/Card>\n \u003CCard title=\"Déployer depuis GitHub\" href=\"/demarrer/depuis-github/\">\n Importe un dépôt : chaque push construit le site et le publie.\n \u003C/Card>\n \u003CCard title=\"Référence de la CLI\" href=\"/reference/cli/\">\n Les commandes `deploy`, `build`, `pull` et `link`, avec leurs options.\n \u003C/Card>\n \u003CCard title=\"Référence de l'API\" href=\"/reference/api/introduction/\">\n Les endpoints compatibles Vercel, leurs paramètres et leurs réponses.\n \u003C/Card>\n\u003C/CardGroup>\n\n## Ce que Host fait\n\n- **Des sites statiques et des frameworks** : un dossier de fichiers, ou le résultat de `vercel build` pour Astro, Vite, Next.js, SvelteKit, Nuxt, TanStack Start et React Router. Voir [Compatibilité](/reference/compatibilite/).\n- **Une URL par version** : chaque déploiement a sa propre adresse, à faire valider avant de passer en production.\n- **Un domaine à toi** : tu ajoutes ton domaine, Host vérifie qu'il t'appartient et obtient le certificat HTTPS. Voir [Brancher un domaine](/guides/brancher-un-domaine/).\n- **Des variables par environnement** : production, preview et développement, avec des variables sensibles jamais relues. Voir [Variables d'environnement](/guides/variables-d-environnement/).\n- **Une organisation et des rôles** : les membres se gèrent dans Account. Voir [Organisations et rôles](/concepts/organisations-et-roles/).\n\n## Ce qui arrive en préversion\n\nLe rendu à la demande (SSR), les routes d'API, le proxy, le runtime edge, l'ISR et les crons s'exécutent en préversion, organisation par organisation. Les fichiers statiques et les pages pré-rendues sont servis dans tous les cas. Le détail est sur [Préversion](/concepts/preversion/).\n\n\u003CFamille />","../../../../wt-aide-ui/host/index.mdx","17a0cee0a15e0e2c","reference/api/deploiements",{"id":262,"data":264,"body":269,"filePath":270,"digest":271,"deferredRender":8},{"sidebarTitle":20,"title":20,"description":265,"editUrl":8,"head":266,"template":10,"sidebar":267,"pagefind":8,"draft":12},"Créer un déploiement, lire son état, suivre ses logs en direct. Corps de requête, champs de l'objet déploiement et erreurs.",[],{"hidden":12,"attrs":268},{},"Un déploiement est une version figée de ton site, avec sa propre adresse. Créer un déploiement est l'appel central de `vercel deploy`.\n\n## Déroulement d'une création\n\n1. Envoie la liste des fichiers avec leur empreinte SHA1.\n2. Si des fichiers manquent, l'API répond `400 missing_files`, avec leurs empreintes dans `missing`. Envoie-les par [`/v2/files`](/reference/api/fichiers/).\n3. Renvoie exactement la même requête. Elle crée le déploiement.\n\nLes petits fichiers peuvent aussi être inclus directement dans le corps, dans le champ `data`, sans passer par `/v2/files`. La limite de 20 Mo vaut alors pour l'ensemble des fichiers inclus.\n\n## POST /v13/deployments\n\n```bash\ncurl -X POST https://api.host.hgdc.ch/v13/deployments \\\n -H \"Authorization: Bearer $VERCEL_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"name\": \"site-atelier\",\n \"target\": \"production\",\n \"files\": [\n { \"file\": \"index.html\", \"data\": \"\u003Ch1>Bonjour\u003C/h1>\" }\n ]\n }'\n```\n\n### Corps\n\n| Champ | Type | Requis | Description |\n|---|---|---|---|\n| `name` | `string` | Si `project` est absent | Nom du projet. Le projet est créé s'il n'existe pas |\n| `project` | `string` | Non | Identifiant ou nom du projet. Prioritaire sur `name` |\n| `target` | `\"production\"` ou `null` | Non | `production` pour la production. Toute autre valeur crée une preview |\n| `files` | `object[]` | Oui | Fichiers du déploiement, 15 000 au plus. Voir ci-dessous |\n| `projectSettings.framework` | `string` ou `null` | Non | Framework, enregistré si le déploiement crée le projet |\n| `gitMetadata` | `object` | Non | `commitRef` (branche), `commitSha` et `commitMessage`, affichés dans la console |\n| `meta` | `Record\u003Cstring, string>` | Non | Métadonnées libres. `githubCommitRef`, `githubCommitSha` et `githubCommitMessage` remplacent `gitMetadata` quand il manque |\n\nChaque élément de `files` prend l'une de ces formes :\n\n- `{ \"file\", \"sha\", \"size\" }` : chemin relatif, empreinte SHA1 et taille en octets, pour un fichier déjà envoyé par `/v2/files` ;\n- `{ \"file\", \"data\", \"encoding\" }` : contenu inclus. `encoding` vaut `utf-8` (par défaut) ou `base64`.\n\n`mode` (permissions Unix) est accepté et conservé. Un dossier vide, `{ \"file\", \"mode\" }`, est ignoré.\n\n### Réponse\n\nRéponse `200` : l'objet déploiement. Le déploiement naît le plus souvent à l'état `QUEUED`. Suis-le avec `GET /v13/deployments/:id`, plus bas sur cette page, ou avec le flux de logs `GET /v3/deployments/:id/events`.\n\n### Erreurs\n\n| Statut | Code | Cause |\n|---|---|---|\n| `400` | `bad_request` | Corps invalide, ou nom de projet absent. Le message nomme le champ |\n| `400` | `missing_files` | Des fichiers sont à envoyer avant de créer le déploiement |\n| `403` | `forbidden` | La clé est limitée à un autre projet |\n| `409` | `deployment_closed` | Le déploiement a été annulé ou a échoué : rien n'est publié |\n| `413` | `payload_too_large` | Les fichiers inclus dépassent 20 Mo au total |\n\n## GET /v13/deployments/:id\n\nLit un déploiement.\n\n```bash\ncurl https://api.host.hgdc.ch/v13/deployments/jd7f2k9m3x8q1p5s6t4v0w7y2z \\\n -H \"Authorization: Bearer $VERCEL_TOKEN\"\n```\n\nRéponse `200` :\n\n```json\n{\n \"id\": \"jd7f2k9m3x8q1p5s6t4v0w7y2z\",\n \"uid\": \"jd7f2k9m3x8q1p5s6t4v0w7y2z\",\n \"url\": \"site-atelier-h3k9x2.hgdc.cloud\",\n \"name\": \"site-atelier\",\n \"projectId\": \"j97d3k2m8x1q4p6s7t9v0w2y5z\",\n \"ownerId\": \"k57a1b2c3d4e5f6g7h8j9k0m1n\",\n \"readyState\": \"READY\",\n \"status\": \"READY\",\n \"target\": \"production\",\n \"type\": \"LAMBDAS\",\n \"createdAt\": 1760259600000,\n \"buildingAt\": 1760259601000,\n \"ready\": 1760259604000,\n \"alias\": [\"site-atelier.hgdc.cloud\"],\n \"aliasAssigned\": true,\n \"aliasAssignedAt\": 1760259604000,\n \"aliasError\": null,\n \"errorMessage\": null,\n \"inspectorUrl\": \"https://host.hgdc.ch/atelier/site-atelier/deployments/jd7f2k9m3x8q1p5s6t4v0w7y2z\",\n \"meta\": {\n \"branch\": \"main\",\n \"commitSha\": \"4c3e2f1a9b8d7c6e5f4a3b2c1d0e9f8a7b6c5d4e\",\n \"commitMessage\": \"Nouvelle page Tarifs\"\n },\n \"creator\": { \"uid\": \"u1a2b3c4d5\" }\n}\n```\n\n| Champ | Type | Description |\n|---|---|---|\n| `id` | `string` | Identifiant du déploiement. `uid` porte la même valeur |\n| `url` | `string` | Adresse du déploiement, sans `https://`. Elle reste valable tant que le déploiement existe |\n| `name` | `string` | Nom du projet |\n| `projectId` | `string` | Identifiant du projet |\n| `ownerId` | `string` | Identifiant de l'organisation |\n| `readyState` | `string` | État : `QUEUED`, `BUILDING`, `READY`, `ERROR` ou `CANCELED`. `status` porte la même valeur |\n| `target` | `\"production\"` ou `null` | `production`, ou `null` pour une preview |\n| `createdAt` | `number` | Date de création, en millisecondes |\n| `buildingAt` | `number` | Début du traitement, en millisecondes |\n| `ready` | `number` ou `null` | Fin du traitement. `null` tant que le déploiement n'est pas prêt |\n| `alias` | `string[]` | Adresse de production du projet (`\u003Cprojet>.hgdc.cloud`), une fois un déploiement de production prêt. Vide pour une preview. La CLI l'affiche sur la ligne « Aliased » |\n| `aliasAssigned` | `boolean` | `true` quand le déploiement est prêt |\n| `aliasAssignedAt` | `number` ou `null` | Moment où l'adresse de production lui a été attribuée. `null` pour une preview |\n| `aliasError` | `null` | Toujours `null` |\n| `errorMessage` | `string` ou `null` | Cause de l'échec, quand `readyState` vaut `ERROR` |\n| `inspectorUrl` | `string` | Page du déploiement dans la console |\n| `type` | `\"LAMBDAS\"` | Valeur fixe, pour la CLI |\n| `meta` | `object` | Informations Git connues : `branch`, `commitSha`, `commitMessage` |\n| `creator.uid` | `string` | Personne qui a créé la clé utilisée |\n\n### Attendre la fin\n\nPour attendre qu'un déploiement soit prêt, interroge cet endpoint toutes les secondes jusqu'à `READY`, `ERROR` ou `CANCELED`. Tu peux aussi ouvrir le flux `GET /v3/deployments/:id/events` décrit plus bas, qui se ferme tout seul à la fin.\n\n| Erreur | Code | Cause |\n|---|---|---|\n| `404` | `not_found` | Déploiement inconnu, d'une autre organisation, ou hors de la portée de la clé |\n\n## GET /v3/deployments/:id/events\n\nRenvoie les logs de build d'un déploiement, un événement JSON par ligne (NDJSON). Avec `follow=1`, la connexion reste ouverte et reçoit les nouvelles lignes au fil de l'eau.\n\n```bash\ncurl -N \"https://api.host.hgdc.ch/v3/deployments/jd7f2k9m3x8q1p5s6t4v0w7y2z/events?follow=1\" \\\n -H \"Authorization: Bearer $VERCEL_TOKEN\"\n```\n\n| Paramètre | Valeur | Rôle |\n|---|---|---|\n| `follow` | `1` | Garde la connexion ouverte jusqu'à la fin du déploiement, 9 minutes au plus |\n\nLe type de réponse est `application/x-ndjson`. Chaque ligne de log ressemble à ceci :\n\n```json\n{\"type\":\"stdout\",\"created\":1760259601000,\"date\":1760259601000,\"deploymentId\":\"jd7f2k9m3x8q1p5s6t4v0w7y2z\",\"id\":\"l3k…\",\"text\":\"Publication de 42 fichiers\",\"payload\":{\"id\":\"l3k…\",\"text\":\"Publication de 42 fichiers\",\"date\":1760259601000,\"deploymentId\":\"jd7f2k9m3x8q1p5s6t4v0w7y2z\"}}\n```\n\n| Champ | Type | Description |\n|---|---|---|\n| `type` | `\"stdout\"` ou `\"stderr\"` | `stderr` pour une ligne d'erreur |\n| `text` | `string` | Texte de la ligne |\n| `date` | `number` | Date de la ligne, en millisecondes. `created` porte la même valeur |\n| `payload` | `object` | Les mêmes champs, au format historique de la CLI |\n\nUne fois le déploiement terminé, une dernière ligne donne son état, puis le flux se ferme :\n\n```json\n{\"type\":\"state\",\"event\":\"state\",\"date\":1760259604000,\"payload\":{\"value\":\"READY\"}}\n```\n\nLes lignes du build GitHub Actions ne sont pas renvoyées ici : elles sont dans le run GitHub, et la console les affiche sur la page du déploiement.\n\nLe même endpoint répond aussi sous `/v3/now/deployments/:id/events`.\n\n| Erreur | Code | Cause |\n|---|---|---|\n| `404` | `not_found` | Déploiement inconnu, ou hors de la portée de la clé |","../../../../wt-aide-ui/host/reference/api/deploiements.mdx","36fd64a8c8243905","reference/api/erreurs",{"id":272,"data":274,"body":281,"filePath":282,"digest":283,"deferredRender":8},{"sidebarTitle":275,"title":276,"description":277,"editUrl":8,"head":278,"template":10,"sidebar":279,"pagefind":8,"draft":12},"Erreurs","Erreurs de l'API","Format des erreurs de l'API Host, liste des codes, leur cause et la conduite à tenir.",[],{"hidden":12,"attrs":280},{},"Une erreur répond avec un statut HTTP `4xx` ou `5xx`, et un objet `error`. Le champ `code` est stable : teste-le dans ton code. Le champ `message` est en français et s'affiche à une personne.\n\n```json\n{\n \"error\": {\n \"code\": \"not_found\",\n \"message\": \"Projet introuvable.\"\n }\n}\n```\n\n## Codes\n\n| Statut | Code | Cause | Que faire |\n|---|---|---|---|\n| `400` | `bad_request` | Corps ou paramètre invalide. Le message nomme le champ en cause | Corrige la requête |\n| `400` | `missing_files` | Des fichiers du déploiement ne sont pas encore envoyés. La réponse liste leurs empreintes dans `missing` | Envoie-les par [`/v2/files`](/reference/api/fichiers/), puis recrée le déploiement |\n| `400` | `invalid_digest` | Le contenu envoyé ne correspond pas à l'empreinte annoncée | Recalcule le SHA1 du fichier |\n| `403` | `forbidden` | Clé absente, inconnue ou révoquée. Ou clé de projet utilisée pour un autre projet | Vérifie la clé et sa portée |\n| `404` | `not_found` | Ressource introuvable, ou hors de la portée de la clé | Vérifie l'identifiant ou le nom |\n| `409` | `conflict` | Un projet porte déjà ce nom | Choisis un autre nom, ou utilise le projet existant |\n| `409` | `deployment_closed` | Le déploiement a été annulé ou a échoué : rien n'est publié | Crée un nouveau déploiement |\n| `413` | `file_too_large` | Un fichier dépasse 20 Mo | Allège le fichier, ou sers-le autrement |\n| `413` | `payload_too_large` | Les fichiers inclus dans le corps dépassent 20 Mo au total | Envoie-les par [`/v2/files`](/reference/api/fichiers/) |\n| `429` | `rate_limited` | Trop de requêtes pour cette clé | Attends un instant, puis réessaie |\n| `500` | `internal_server_error` | Erreur de la plateforme. Elle est signalée automatiquement | Réessaie. Si elle persiste, écris à [support@hgdc.ch](mailto:support@hgdc.ch) |\n\nToutes les routes peuvent répondre `403 forbidden`, `429 rate_limited` et `500 internal_server_error`.\n\nLe message d'une erreur `500` ne donne jamais de détail technique. Ne compte pas sur son texte, seulement sur son code.\n\n## Le cas de missing_files\n\n`missing_files` n'est pas une panne : c'est l'étape normale d'un déploiement. La CLI la traite toute seule. Si tu écris ton propre client, voici la réponse :\n\n```json\n{\n \"error\": {\n \"code\": \"missing_files\",\n \"message\": \"Fichiers à envoyer avant de créer le déploiement.\",\n \"missing\": [\n \"2ef7bde608ce5404e97d5f042f95f89f1c232871\"\n ]\n }\n}\n```\n\nEnvoie chaque fichier listé, puis renvoie exactement la même requête de [création de déploiement](/reference/api/deploiements/).","../../../../wt-aide-ui/host/reference/api/erreurs.mdx","2fb155b30f663015","reference/api/fichiers",{"id":284,"data":286,"body":292,"filePath":293,"digest":294,"deferredRender":8},{"sidebarTitle":287,"title":287,"description":288,"editUrl":8,"head":289,"template":10,"sidebar":290,"pagefind":8,"draft":12},"Envoyer un fichier","Envoyer le contenu d'un fichier à Host, adressé par son empreinte SHA1, avant de créer un déploiement.",[],{"hidden":12,"attrs":291},{},"Un fichier s'envoie par son empreinte SHA1. Host ne stocke jamais deux fois le même contenu pour une organisation : tu n'envoies que les fichiers que [Créer un déploiement](/reference/api/deploiements/) signale comme manquants.\n\n## POST /v2/files\n\n```bash\nSHA=$(sha1sum index.html | cut -d' ' -f1)\ncurl -X POST https://api.host.hgdc.ch/v2/files \\\n -H \"Authorization: Bearer $VERCEL_TOKEN\" \\\n -H \"x-vercel-digest: $SHA\" \\\n -H \"Content-Type: application/octet-stream\" \\\n --data-binary @index.html\n```\n\nEn Node.js, calcule l'empreinte avant l'envoi :\n\n```javascript\nimport { createHash } from \"node:crypto\"\nimport { readFile } from \"node:fs/promises\"\n\nconst bytes = await readFile(\"index.html\")\nconst sha = createHash(\"sha1\").update(bytes).digest(\"hex\")\n\nawait fetch(\"https://api.host.hgdc.ch/v2/files\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${process.env.VERCEL_TOKEN}`,\n \"x-vercel-digest\": sha,\n \"Content-Type\": \"application/octet-stream\",\n },\n body: bytes,\n})\n```\n\n### En-têtes\n\n| En-tête | Valeur | Requis |\n|---|---|---|\n| `Authorization` | `Bearer ah_…` | Oui |\n| `x-vercel-digest` | Empreinte SHA1 du contenu, en hexadécimal, 40 caractères | Oui. `x-now-digest` est aussi accepté |\n| `Content-Type` | `application/octet-stream` | Recommandé |\n\n### Corps\n\nLe contenu brut du fichier, 20 Mo au plus.\n\n### Réponse\n\nRéponse `200` avec un objet vide, `{}`.\n\n### Erreurs\n\n| Statut | Code | Cause |\n|---|---|---|\n| `400` | `bad_request` | En-tête `x-vercel-digest` absent ou mal formé |\n| `400` | `invalid_digest` | Le contenu ne correspond pas à l'empreinte annoncée. Recalcule le SHA1 |\n| `413` | `file_too_large` | Le fichier dépasse 20 Mo |\n\n## Limites\n\nL'envoi de fichiers a son propre débit : 6 000 par minute, avec des rafales de 3 000 par clé. Un site Next.js compte souvent des milliers de fichiers : envoie-les en parallèle, mais sans dépasser ce débit. Voir [Limites](/reference/limites/).","../../../../wt-aide-ui/host/reference/api/fichiers.mdx","bde54066cc136b1f","reference/api/introduction",{"id":295,"data":297,"body":304,"filePath":305,"digest":306,"deferredRender":8},{"sidebarTitle":298,"title":299,"description":300,"editUrl":8,"head":301,"template":10,"sidebar":302,"pagefind":8,"draft":12},"Introduction","Introduction à l'API","Adresse de base, authentification par clé, portée des clés, versions des chemins et limites de débit de l'API Host.",[],{"hidden":12,"attrs":303},{},"L'API de Host reprend le sous-ensemble de l'API Vercel qu'utilise la CLI pour relier un dossier, construire et déployer. Elle accepte du JSON, renvoie du JSON, et s'authentifie par une clé d'API.\n\nUtilise l'API si tu écris ton propre outil. Pour déployer depuis un poste ou une CI, la [CLI](/reference/cli/) suffit.\n\n## Adresse de base\n\n```text\nhttps://api.host.hgdc.ch\n```\n\nToutes les requêtes passent en HTTPS.\n\n## Authentification\n\nEnvoie ta clé dans l'en-tête `Authorization`. Les clés commencent par `ah_` et se créent dans l'onglet **Clés d'API** de l'organisation. Voir [Créer et révoquer une clé d'API](/guides/cle-d-api/).\n\n```http\nAuthorization: Bearer ah_…\n```\n\n```bash\ncurl https://api.host.hgdc.ch/v2/user \\\n -H \"Authorization: Bearer $VERCEL_TOKEN\"\n```\n\nIl existe deux sortes de clés :\n\n| Clé | Portée | Variables sensibles |\n|---|---|---|\n| Clé d'organisation, créée par un admin ou un propriétaire | Tous les projets de l'organisation, création de projets comprise | Jamais renvoyées |\n| Clé de projet, posée par l'app GitHub dans le dépôt | Ce seul projet. Tout autre projet répond `404` | Renvoyées, pour le build |\n\n\u003CWarning>\n Une clé donne accès aux variables d'environnement de tes projets. Garde-la dans un gestionnaire de secrets, jamais dans le code ni dans le navigateur.\n\u003C/Warning>\n\n## L'organisation vient de la clé\n\nChaque clé appartient à une organisation, et chaque requête s'exécute dans cette organisation. Un identifiant d'organisation dans l'URL, ou un paramètre `teamId` ou `slug`, que la CLI ajoute parfois, est ignoré.\n\n## Versions dans le chemin\n\nLes chemins gardent les numéros de version de l'API Vercel, comme `/v2`, `/v9` ou `/v13`, pour que la CLI fonctionne sans modification. Plusieurs versions d'un même endpoint renvoient la même réponse : `/v9/projects` et `/v10/projects` par exemple.\n\n## Pagination\n\nLes listes ne sont pas paginées. Elles renvoient un objet `pagination` pour la compatibilité, avec `next` toujours à `null`.\n\n## Limites de débit\n\nChaque clé dispose de 600 requêtes par minute, avec des rafales de 120. L'envoi de fichiers a son propre budget : 6 000 par minute, avec des rafales de 3 000.\n\nAu-delà, l'API répond `429` avec le code `rate_limited` :\n\n```json\n{\n \"error\": {\n \"code\": \"rate_limited\",\n \"message\": \"Trop de requêtes, réessaie dans un instant.\"\n }\n}\n```\n\nLa réponse porte un en-tête `retry-after` quand l'attente est connue. La création de déploiements est aussi limitée par organisation : voir [Limites](/reference/limites/).\n\n## Endpoints\n\n| Méthode | Chemin | Rôle |\n|---|---|---|\n| `GET` | [`/v2/user`](/reference/api/utilisateur/) | Personne qui a créé la clé |\n| `GET` | [`/v2/teams`](/reference/api/utilisateur/) | Organisation de la clé |\n| `GET` | [`/v2/teams/:idOrSlug`](/reference/api/utilisateur/) | Lire l'organisation |\n| `GET` | [`/v9/projects`](/reference/api/projets/) | Lister les projets |\n| `GET` | [`/v9/projects/:idOrName`](/reference/api/projets/) | Lire un projet |\n| `POST` | [`/v11/projects`](/reference/api/projets/) | Créer un projet |\n| `POST` | [`/v2/files`](/reference/api/fichiers/) | Envoyer un fichier |\n| `POST` | [`/v13/deployments`](/reference/api/deploiements/) | Créer un déploiement |\n| `GET` | [`/v13/deployments/:id`](/reference/api/deploiements/) | Lire un déploiement |\n| `GET` | [`/v3/deployments/:id/events`](/reference/api/deploiements/) | Suivre les logs |\n| `GET` | [`/v3/env/pull/:project/:target`](/reference/api/variables/) | Lire les variables d'un environnement |\n\nLes erreurs et leurs codes sont sur [Erreurs](/reference/api/erreurs/).","../../../../wt-aide-ui/host/reference/api/introduction.mdx","a578a0144ead7803","reference/api/projets",{"id":307,"data":309,"body":315,"filePath":316,"digest":317,"deferredRender":8},{"sidebarTitle":310,"title":310,"description":311,"editUrl":8,"head":312,"template":10,"sidebar":313,"pagefind":8,"draft":12},"Projets","Lister, lire et créer des projets avec l'API Host. Champs de l'objet projet et erreurs.",[],{"hidden":12,"attrs":314},{},"Un projet correspond à un site. Il a ses variables, ses domaines et son historique de déploiements.\n\n## GET /v9/projects\n\nListe les projets de l'organisation. Avec une clé de projet, la liste ne contient que ce projet. La liste compte 100 projets au plus.\n\n```bash\ncurl https://api.host.hgdc.ch/v9/projects \\\n -H \"Authorization: Bearer $VERCEL_TOKEN\"\n```\n\nRéponse `200` :\n\n```json\n{\n \"projects\": [\n {\n \"id\": \"j97d3k2m8x1q4p6s7t9v0w2y5z\",\n \"name\": \"site-atelier\",\n \"accountId\": \"k57a1b2c3d4e5f6g7h8j9k0m1n\",\n \"framework\": \"astro\",\n \"rootDirectory\": null,\n \"buildCommand\": null,\n \"installCommand\": null,\n \"outputDirectory\": null,\n \"nodeVersion\": \"24.x\",\n \"createdAt\": 1760259600000,\n \"updatedAt\": 1760259600000\n }\n ],\n \"pagination\": { \"count\": 1, \"next\": null, \"prev\": null }\n}\n```\n\nLe même endpoint répond aussi sous `/v10/projects`.\n\n## GET /v9/projects/:idOrName\n\nLit un projet, par son identifiant ou son nom, sans tenir compte de la casse.\n\n```bash\ncurl https://api.host.hgdc.ch/v9/projects/site-atelier \\\n -H \"Authorization: Bearer $VERCEL_TOKEN\"\n```\n\nRéponse `200` : l'objet projet, décrit ci-dessous. Les routes `/v9` et `/v10` renvoient la même réponse.\n\n| Erreur | Code | Cause |\n|---|---|---|\n| `404` | `not_found` | Aucun projet de ce nom dans l'organisation, ou projet hors de la portée de la clé |\n\n## POST /v11/projects\n\nCrée un projet. Tu peux aussi t'en passer : le premier déploiement sur un nom inconnu crée le projet.\n\n```bash\ncurl -X POST https://api.host.hgdc.ch/v11/projects \\\n -H \"Authorization: Bearer $VERCEL_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"name\":\"site-atelier\",\"framework\":\"astro\"}'\n```\n\n| Champ | Type | Requis | Description |\n|---|---|---|---|\n| `name` | `string` | Oui | Nom du projet, 100 caractères au plus. Il devient le nom dans l'URL, en minuscules |\n| `framework` | `string` ou `null` | Non | `nextjs`, `astro`, `vite`, `sveltekit`, `nuxt`, `tanstack-start` ou `react-router`. Une autre valeur, ou `null`, enregistre un site sans framework |\n\nRéponse `200` : l'objet projet créé.\n\n| Erreur | Code | Cause |\n|---|---|---|\n| `400` | `bad_request` | Nom absent ou trop long |\n| `403` | `forbidden` | La clé est limitée à un projet : elle ne crée rien |\n| `409` | `conflict` | Un projet porte déjà ce nom |\n\n## L'objet projet\n\n| Champ | Type | Description |\n|---|---|---|\n| `id` | `string` | Identifiant du projet. C'est la valeur de `VERCEL_PROJECT_ID` |\n| `name` | `string` | Nom du projet, dans l'URL de la console |\n| `accountId` | `string` | Identifiant de l'organisation propriétaire |\n| `framework` | `string` ou `null` | Framework enregistré, ou `null` pour un site sans framework |\n| `rootDirectory` | `string` ou `null` | Dossier de l'app dans le dépôt, pour un monorepo |\n| `buildCommand` | `string` ou `null` | Commande de build imposée. `null` : celle détectée par `vercel build` |\n| `installCommand` | `string` ou `null` | Commande d'installation imposée |\n| `outputDirectory` | `string` ou `null` | Dossier de sortie imposé |\n| `nodeVersion` | `\"22.x\"` ou `\"24.x\"` | Version de Node.js du build |\n| `createdAt` | `number` | Date de création, en millisecondes depuis l'époque Unix |\n| `updatedAt` | `number` | Même valeur que `createdAt` |\n| `link` | `object` | Présent seulement pour un projet relié à GitHub : `type` (`github`), `repo` (`propriétaire/dépôt`) et `productionBranch` |\n| `alias` | `object[]` | Adresse de production du projet : `domain` (`\u003Cprojet>.hgdc.cloud`), `target` (`PRODUCTION`), `environment` (`production`), `createdAt`, `deployment` (`null`). Les domaines personnalisés n'y figurent pas |\n| `targets.production` | `object` | Présent une fois une production en ligne : le déploiement servi, avec `id`, `url`, `alias` (`[\"\u003Cprojet>.hgdc.cloud\"]`), `aliasAssigned` (moment de la mise en ligne), `readyState`, `createdAt`, `readyAt` et `meta`. `targets` vaut `{}` avant la première production |\n\nPour un projet dont le framework n'est pas reconnu, `framework` vaut `null`.\n\n## Voir aussi\n\n- [Déploiements](/reference/api/deploiements/) : créer un déploiement pour ce projet.\n- [Erreurs](/reference/api/erreurs/) : la liste des codes.","../../../../wt-aide-ui/host/reference/api/projets.mdx","d3acd5f610c2ea4b","reference/api/utilisateur",{"id":318,"data":320,"body":327,"filePath":328,"digest":329,"deferredRender":8},{"sidebarTitle":321,"title":322,"description":323,"editUrl":8,"head":324,"template":10,"sidebar":325,"pagefind":8,"draft":12},"Utilisateur et organisation","Lire le propriétaire de la clé et l'organisation","Renvoie la personne qui a créé la clé, puis l'organisation de la clé. Les routes utilisées par la CLI pour se connecter.",[],{"hidden":12,"attrs":326},{},"Ces trois endpoints disent qui utilise la clé, et dans quelle organisation elle travaille. La CLI les appelle au premier contact.\n\n## GET /v2/user\n\nRenvoie la personne qui a créé la clé.\n\n```bash\ncurl https://api.host.hgdc.ch/v2/user \\\n -H \"Authorization: Bearer $VERCEL_TOKEN\"\n```\n\nRéponse `200` :\n\n```json\n{\n \"user\": {\n \"id\": \"u1a2b3c4d5\",\n \"uid\": \"u1a2b3c4d5\",\n \"email\": \"camille@atelier.ch\",\n \"name\": \"Camille Rochat\",\n \"username\": \"atelier\",\n \"defaultTeamId\": \"k57a1b2c3d4e5f6g7h8j9k0m1n\",\n \"version\": \"northstar\"\n }\n}\n```\n\n| Champ | Type | Description |\n|---|---|---|\n| `user.id` | `string` | Identifiant de la personne. `uid` porte la même valeur |\n| `user.email` | `string` | Adresse e-mail de la personne, tant qu'elle est membre de l'organisation |\n| `user.name` | `string` | Nom affiché de la personne. À défaut, l'adresse e-mail |\n| `user.username` | `string` | Slug de l'organisation de la clé |\n| `user.defaultTeamId` | `string` | Identifiant de l'organisation de la clé. C'est la valeur de `VERCEL_ORG_ID` |\n| `user.version` | `string` | Valeur fixe : `northstar` |\n\nErreurs : `403 forbidden` si l'organisation de la clé n'existe plus.\n\n## GET /v2/teams\n\nRenvoie l'organisation de la clé. La liste ne contient jamais qu'une seule organisation : une clé n'ouvre qu'une organisation.\n\n```bash\ncurl https://api.host.hgdc.ch/v2/teams \\\n -H \"Authorization: Bearer $VERCEL_TOKEN\"\n```\n\nRéponse `200` :\n\n```json\n{\n \"teams\": [\n {\n \"id\": \"k57a1b2c3d4e5f6g7h8j9k0m1n\",\n \"slug\": \"atelier\",\n \"name\": \"Atelier Rochat\",\n \"avatar\": null,\n \"membership\": { \"role\": \"OWNER\" }\n }\n ],\n \"pagination\": { \"count\": 1, \"next\": null, \"prev\": null }\n}\n```\n\n\u003CNote>\n `membership.role` vaut toujours `OWNER` pour la CLI, quel que soit le rôle réel de la personne. Les vrais rôles se gèrent dans Account, voir [Organisations et rôles](/concepts/organisations-et-roles/).\n\u003C/Note>\n\n## GET /v2/teams/:idOrSlug\n\nRenvoie l'organisation seule, sans liste. Le paramètre est l'identifiant ou le slug de l'organisation de la clé.\n\n```bash\ncurl https://api.host.hgdc.ch/v2/teams/atelier \\\n -H \"Authorization: Bearer $VERCEL_TOKEN\"\n```\n\nToute autre organisation répond `404 not_found`. Les deux routes répondent aussi sous `/v1`.\n\n## Erreurs\n\n| Statut | Code | Cause |\n|---|---|---|\n| `403` | `forbidden` | Pour `/v2/user` : l'organisation de la clé n'existe plus |\n| `404` | `not_found` | Pour `/v2/teams/:idOrSlug` : l'organisation demandée n'est pas celle de la clé |\n\nVoir la liste complète sur [Erreurs](/reference/api/erreurs/).","../../../../wt-aide-ui/host/reference/api/utilisateur.mdx","c8fdd737610b05e5","reference/api/variables",{"id":330,"data":332,"body":338,"filePath":339,"digest":340,"deferredRender":8},{"sidebarTitle":241,"title":333,"description":334,"editUrl":8,"head":335,"template":10,"sidebar":336,"pagefind":8,"draft":12},"Lire les variables d'un environnement","Renvoie les variables d'un environnement au format de vercel pull, avec les règles de visibilité des variables sensibles.",[],{"hidden":12,"attrs":337},{},"Cet endpoint renvoie les variables d'un environnement, au format attendu par `vercel pull` et `vercel build`. Les valeurs sont renvoyées déchiffrées : elles ne doivent jamais partir vers le navigateur.\n\n## GET /v3/env/pull/:project/:target\n\n```bash\ncurl https://api.host.hgdc.ch/v3/env/pull/site-atelier/production \\\n -H \"Authorization: Bearer $VERCEL_TOKEN\"\n```\n\n```bash\n# Équivalent avec la CLI\nvercel --api https://api.host.hgdc.ch pull --environment=production\n```\n\n### Paramètres de chemin\n\n| Paramètre | Type | Requis | Description |\n|---|---|---|---|\n| `project` | `string` | Oui | Identifiant ou nom du projet |\n| `target` | `\"production\"`, `\"preview\"` ou `\"development\"` | Non | Environnement. Par défaut : `development` |\n\n### Réponse\n\nRéponse `200` :\n\n```json\n{\n \"env\": {\n \"PUBLIC_API_URL\": \"https://api.atelier.ch\",\n \"CONTACT_EMAIL\": \"bonjour@atelier.ch\"\n },\n \"buildEnv\": {\n \"PUBLIC_API_URL\": \"https://api.atelier.ch\",\n \"CONTACT_EMAIL\": \"bonjour@atelier.ch\"\n }\n}\n```\n\n`env` et `buildEnv` contiennent les mêmes variables. Si le projet a un domaine de production, `VERCEL_PROJECT_PRODUCTION_URL` figure aussi dans la réponse. Voir [Variables : référence](/reference/variables/#variables-fournies-par-la-plateforme).\n\nLa réponse n'est jamais mise en cache : elle porte `cache-control: no-store`.\n\n## Variables sensibles\n\nUne variable sensible n'est renvoyée qu'à une clé limitée au projet, celle que l'app GitHub pose dans le dépôt. Avec une clé d'organisation, elle est absente de la réponse.\n\nChaque lecture d'une variable par une clé est consignée dans le journal du coffre, sans la valeur. Voir [Secrets et coffre](/concepts/secrets-et-coffre/).\n\n## Erreurs\n\n| Statut | Code | Cause |\n|---|---|---|\n| `400` | `bad_request` | Environnement inconnu |\n| `404` | `not_found` | Projet inconnu, ou hors de la portée de la clé |\n\nVoir la liste complète sur [Erreurs](/reference/api/erreurs/).","../../../../wt-aide-ui/host/reference/api/variables.mdx","1f48f1cbbfa09cab","reference/cli",{"id":341,"data":343,"body":349,"filePath":350,"digest":351,"deferredRender":8},{"sidebarTitle":344,"title":344,"description":345,"editUrl":8,"head":346,"template":10,"sidebar":347,"pagefind":8,"draft":12},"CLI","Référence des commandes de la CLI Vercel prises en charge par Host, avec leurs options et leurs exemples.",[],{"hidden":12,"attrs":348},{},"Host accepte la CLI Vercel officielle, version 63. Cette page décrit les commandes prises en charge, leurs options et ce qui n'est pas encore pris en charge.\n\n## Configurer la CLI\n\nHost n'utilise pas la connexion par navigateur de la CLI. Chaque commande reçoit l'adresse de l'API par `--api` et la clé par la variable `VERCEL_TOKEN`.\n\n```bash\nnpm install --global vercel@63\nexport VERCEL_TOKEN=ah_…\nvercel --api https://api.host.hgdc.ch deploy\n```\n\nPour ne pas retaper l'adresse, crée un alias dans ton profil de shell :\n\n```bash\n# ~/.bashrc ou ~/.zshrc\nalias vh=\"vercel --api https://api.host.hgdc.ch\"\n\n# Ensuite\nvh deploy --prod\n```\n\nEn PowerShell, dans `$PROFILE` :\n\n```powershell\nfunction vh { vercel --api https://api.host.hgdc.ch @args }\n```\n\n\u003CWarning>\n Sans `--api`, la CLI parle à Vercel. Si une commande te demande de te connecter dans le navigateur, vérifie que l'option est bien présente.\n\u003C/Warning>\n\n### Options globales\n\n| Option | Valeur | Rôle |\n|---|---|---|\n| `--api` | URL | Adresse de l'API : `https://api.host.hgdc.ch` |\n| `--token` | `ah_…` | Clé d'API. Préfère la variable `VERCEL_TOKEN`, qui n'apparaît pas dans l'historique du shell |\n\n### Ce qui n'est pas pris en charge\n\n| Commande ou option | État |\n|---|---|\n| `vercel login` | Non : la connexion passe par la clé |\n| `vercel env` | Pas encore : gère les variables dans la console |\n| `vercel domains` | Pas encore : gère les domaines dans la console |\n| `vercel logs` | Pas encore : les logs sont dans la console |\n| `vercel alias` | Pas encore : utilise la console, voir [Revenir en arrière](/guides/revenir-en-arriere/) |\n| `--scope`, `--team` | Ignorés : l'organisation vient de la clé |\n\n## vercel deploy\n\nEnvoie un dossier, ou un build déjà construit, et crée un déploiement. Sans option, la commande crée une preview. Avec `--prod`, elle part en production.\n\n```bash\n# Preview du dossier courant\nvercel --api https://api.host.hgdc.ch deploy\n\n# Production\nvercel --api https://api.host.hgdc.ch deploy --prod\n```\n\nDans un script, l'adresse du déploiement est écrite seule sur la sortie standard :\n\n```bash\nURL=$(vercel --api https://api.host.hgdc.ch deploy --yes)\necho \"Preview : $URL\"\n```\n\n| Option | Rôle |\n|---|---|\n| `--prod` | Déploie en production |\n| `--prebuilt` | Envoie `.vercel/output`, produit par `vercel build`, sans reconstruire |\n| `--yes` | Répond oui à toutes les questions : relie le dossier et crée le projet. Indispensable en CI |\n| `--cwd \u003Cchemin>` | Dossier à déployer, s'il n'est pas le dossier courant |\n| `--meta \u003Cclé=valeur>` | Métadonnée attachée au déploiement |\n\nLa commande affiche l'adresse du déploiement, suit la publication, puis rend la main quand le déploiement est prêt ou en erreur. Le suivi dure 9 minutes au plus.\n\nPour un framework, construis d'abord avec `vercel build`, puis envoie le résultat avec `--prebuilt`. Utilise la même cible des deux côtés : `build --prod` avec `deploy --prebuilt --prod`, ou aucune des deux pour une preview. Sinon, la CLI refuse l'envoi.\n\n## vercel build\n\nConstruit le projet en local ou en CI, au format Build Output API. Le résultat va dans `.vercel/output`, prêt pour `vercel deploy --prebuilt`.\n\n```bash\n# Build de preview\nvercel --api https://api.host.hgdc.ch build\n\n# Build de production\nvercel --api https://api.host.hgdc.ch build --prod\n```\n\nAvant de construire, la commande télécharge les variables de l'environnement visé : preview par défaut, production avec `--prod`. Une variable sensible n'est pas téléchargée depuis un poste, seulement depuis le build du dépôt GitHub.\n\n| Option | Rôle |\n|---|---|\n| `--prod` | Construit pour la production, avec les variables de production |\n| `--yes` | Télécharge les réglages du projet sans rien demander. Indispensable en CI |\n| `--cwd \u003Cchemin>` | Dossier du projet, s'il n'est pas le dossier courant |\n\n## vercel pull\n\nTélécharge les réglages du projet et les variables d'un environnement. `vercel build` s'en sert ensuite.\n\n```bash\n# Variables de développement, par défaut\nvercel --api https://api.host.hgdc.ch pull\n\n# Variables de preview ou de production\nvercel --api https://api.host.hgdc.ch pull --environment=preview\nvercel --api https://api.host.hgdc.ch pull --environment=production\n```\n\nLes variables sont écrites dans `.vercel/.env.\u003Cenvironnement>.local`. La CLI ajoute ce dossier au `.gitignore` : ne le commite pas.\n\n| Option | Valeur | Rôle |\n|---|---|---|\n| `--environment` | `development`, `preview` ou `production` | Environnement à lire. Par défaut : `development` |\n| `--yes` | | Relie le dossier sans rien demander |\n| `--cwd \u003Cchemin>` | | Dossier du projet, s'il n'est pas le dossier courant |\n\nCe que reçoit la commande dépend de la clé :\n\n| Clé | Variables normales | Variables sensibles |\n|---|---|---|\n| Clé d'organisation | Oui | Non |\n| Clé de projet, posée par l'app GitHub | Oui | Oui |\n\n## vercel link\n\nRelie un dossier local à un projet. Les autres commandes savent ensuite à quel projet s'adresser.\n\n```bash\nvercel --api https://api.host.hgdc.ch link\n\n# Sans question, avec le nom du dossier\nvercel --api https://api.host.hgdc.ch link --yes\n```\n\nLa liaison est écrite dans `.vercel/project.json`, qui contient `orgId` et `projectId`. Le premier `link` ou `deploy` sur un nom inconnu crée le projet, sous le nom du dossier.\n\n| Option | Rôle |\n|---|---|\n| `--yes` | Relie le dossier sans rien demander, et crée le projet s'il n'existe pas |\n| `--project \u003Cnom>` | Nom du projet à relier, s'il n'est pas celui du dossier |\n| `--cwd \u003Cchemin>` | Dossier à relier, s'il n'est pas le dossier courant |\n\nEn CI, sans dossier `.vercel`, donne les deux identifiants par variables d'environnement, avec la clé :\n\n```bash\nexport VERCEL_ORG_ID=…\nexport VERCEL_PROJECT_ID=…\nexport VERCEL_TOKEN=ah_…\nvercel --api https://api.host.hgdc.ch deploy --prod --yes\n```\n\n`VERCEL_ORG_ID` est la valeur renvoyée par [GET /v2/user](/reference/api/utilisateur/). Le workflow posé par l'app GitHub contient déjà les bonnes valeurs.\n\nPour délier un dossier, supprime son dossier `.vercel`. Le prochain déploiement te redemandera le projet.\n\n## Voir aussi\n\n- [Référence de l'API](/reference/api/introduction/) : les mêmes opérations, sans la CLI.\n- [Compatibilité](/reference/compatibilite/) : la liste des fonctions de la CLI et de la plateforme.","../../../../wt-aide-ui/host/reference/cli.mdx","e40bd36eb7b1cbb7","reference/compatibilite",{"id":352,"data":354,"body":361,"filePath":362,"digest":363,"deferredRender":8},{"sidebarTitle":355,"title":356,"description":357,"editUrl":8,"head":358,"template":10,"sidebar":359,"pagefind":8,"draft":12},"Compatibilité","Compatibilité avec Vercel","Ce que la CLI et la plateforme prennent en charge aujourd'hui, ce qui est en préversion et ce qui n'existe pas encore.",[],{"hidden":12,"attrs":360},{},"Host implémente la partie de l'API Vercel qu'utilise la CLI pour relier un projet, récupérer ses variables, construire et déployer. La CLI officielle, version 63, est la référence de test.\n\nCette page dit ce qui marche aujourd'hui. Elle distingue trois états :\n\n- **Pris en charge** : utilisable en production.\n- **En préversion** : utilisable, mais ouvert organisation par organisation. Une organisation qui n'en profite pas encore reçoit une réponse `501`.\n- **Pas encore** : absent de Host pour le moment.\n\n## Commandes de la CLI\n\n| Commande | État |\n|---|---|\n| `vercel deploy`, avec `--prod` et `--prebuilt` | Pris en charge |\n| `vercel build` | Pris en charge : télécharge les variables de l'environnement visé |\n| `vercel pull` | Pris en charge : réglages et variables |\n| `vercel link` | Pris en charge |\n| `vercel login` | Non : la connexion passe par la clé, dans `VERCEL_TOKEN` ou `--token` |\n| `vercel env` | Pas encore : gère les variables dans la console |\n| `vercel domains` | Pas encore : gère les domaines dans la console |\n| `vercel logs` | Pas encore : les logs sont dans la console |\n| `vercel env add` | Pas encore : ajoute les variables dans la console |\n\n## Fonctions de la plateforme\n\n| Fonction | État |\n|---|---|\n| Fichiers statiques, Build Output API v3 | Pris en charge |\n| Routage de `vercel.json` et de `config.json` | Pris en charge, voir [vercel.json](/reference/vercel-json/) |\n| Pages pré-rendues de Next.js | Prises en charge |\n| Draft mode | Pris en charge |\n| Domaines, redirections, certificats | Pris en charge |\n| Réécritures vers une URL externe | Prises en charge |\n| Variables d'environnement, variables sensibles | Prises en charge |\n| Rendu à la demande (SSR), routes d'API, Server Actions | En préversion : fonctions Node, ouvertes organisation par organisation |\n| Proxy (ex-middleware) et middleware Node.js | En préversion |\n| Fonctions et middleware en runtime edge | En préversion |\n| ISR (régénération incrémentale) | En préversion : cache par serveur, vidé à son redémarrage |\n| Optimisation d'images | Pas encore : l'image d'origine est servie, sans redimensionnement |\n| Crons | En préversion : production seulement, avec `CRON_SECRET` |\n\nLe détail du fonctionnement de la préversion est dans [Préversion et rendu à la demande](/concepts/preversion/).\n\n## Frameworks\n\n| Framework | Ce qui est servi | Commande de build |\n|---|---|---|\n| Site statique (HTML, CSS, JS) | Le dossier tel quel | Aucune : `vercel deploy` |\n| Astro | Les pages générées, et en préversion le rendu à la demande, les routes d'API, le middleware et l'ISR | `vercel build` |\n| Vite (React, Vue, Svelte…) | Le build de l'application | `vercel build` |\n| SvelteKit | Les pages pré-rendues, et en préversion le rendu à la demande, les routes d'API, les actions de formulaire et l'ISR | `vercel build` |\n| Nuxt | Les pages générées, et en préversion le rendu à la demande, les routes d'API, le middleware serveur et l'ISR | `vercel build` |\n| TanStack Start | Les pages pré-rendues | `vercel build` |\n| React Router | Les pages pré-rendues | `vercel build` |\n| Next.js | Les pages pré-rendues et leur navigation, et en préversion le rendu à la demande, les routes d'API, le proxy, l'ISR et les routes en runtime edge | `vercel build` |\n| Documentation `@hgdc/docs` | Le site de documentation, chaque page en Markdown (`.md`), `llms.txt` et le corpus de l'assistant | `hgdc-docs build` |\n\nPour tout framework, la séquence est la même : construis, puis envoie le résultat avec `--prebuilt`. Voir [Déployer un framework](/guides/deployer-un-framework/).\n\n## Ce que cette page ne couvre pas\n\n- Ce qui n'est pas listé ici n'est pas garanti. Ne suppose pas qu'une fonctionnalité de Vercel marche sur Host sans l'avoir testée.\n- Les limites chiffrées, comme la taille des fichiers ou les débits, sont sur [Limites](/reference/limites/).","../../../../wt-aide-ui/host/reference/compatibilite.mdx","a4dc1de6328680da","reference/domaines",{"id":364,"data":366,"body":372,"filePath":373,"digest":374,"deferredRender":8},{"sidebarTitle":367,"title":367,"description":368,"editUrl":8,"head":369,"template":10,"sidebar":370,"pagefind":8,"draft":12},"Domaines","Enregistrements DNS, statuts, usages, codes de redirection et règles de propriété des domaines.",[],{"hidden":12,"attrs":371},{},"Cette page donne les valeurs exactes des enregistrements, les statuts et les règles de propriété. Pour brancher un domaine pas à pas, voir [Brancher un domaine](/guides/brancher-un-domaine/).\n\n## Enregistrements DNS\n\nDeux enregistrements, chez ton hébergeur DNS : un TXT de preuve, et un trafic qui arrive sur Host.\n\n| Enregistrement | Nom | Valeur | Quand |\n|---|---|---|---|\n| **TXT** | `_agenthost.\u003Cdomaine>` | Le jeton affiché dans la console | Toujours : prouve que le domaine t'appartient |\n| **CNAME** | `\u003Csous-domaine>` | La cible affichée dans la console | Pour un sous-domaine, comme `www` |\n| **A** | `\u003Cdomaine racine>` | L'adresse IPv4 affichée dans la console | Pour un domaine racine, comme `exemple.ch` |\n\nLe CNAME ne peut pas être posé sur la racine d'un domaine : le DNS l'interdit. Pour un domaine racine, utilise le A.\n\nLes valeurs peuvent changer. La console affiche toujours les valeurs à utiliser : suis-les plutôt qu'une valeur copiée d'une ancienne page.\n\n## Statuts\n\n| Statut | Signification | Servi ? |\n|---|---|---|\n| **En attente des DNS** | Le TXT ou le trafic manque | Non |\n| **Vérifié** | Le TXT est là et le trafic arrive | Oui |\n| **Ne pointe pas vers nous** | Le TXT est là, mais le trafic n'arrive pas à Host | Non |\n\nUn domaine vérifié est revérifié chaque jour. Si le TXT disparaît, une seconde vérification a lieu une heure plus tard. Si elle échoue aussi, le domaine repasse en attente et n'est plus servi.\n\nLa vérification se relance toutes les 15 minutes tant que le domaine n'est pas vérifié. **Vérifier** la relance tout de suite.\n\n## Certificat HTTPS\n\nDès qu'un domaine est **Vérifié**, Host demande un certificat HTTPS. Le certificat affiche sa date d'échéance dans la console, et se renouvelle seul. Un certificat n'est émis que pour un domaine vérifié.\n\n## Usages\n\n| Usage | Ce qui est servi |\n|---|---|\n| Production | Le dernier déploiement de production prêt |\n| Branche | La dernière preview prête de la branche choisie, par exemple `staging.exemple.ch` |\n| Redirection | Un autre domaine du même projet, chemin conservé |\n\nUne redirection vise un domaine du même projet qui sert un site. Une redirection ne peut pas pointer vers une autre redirection.\n\nPour un domaine racine, la case **Ajouter aussi www.** crée `www` en redirection permanente vers le domaine racine.\n\n## Codes de redirection\n\n| Code | Type | Méthode conservée |\n|---|---|---|\n| `308` | Permanente (par défaut) | Oui |\n| `301` | Permanente | Non |\n| `307` | Temporaire | Oui |\n| `302` | Temporaire | Non |\n\nPréfère `308` ou `307` : elles conservent la méthode et le corps de la requête.\n\n## Propriété\n\n- La preuve TXT l'emporte. Une revendication non prouvée par une autre organisation ne bloque pas le propriétaire réel : l'organisation qui pose le TXT obtient le domaine.\n- Deux TXT prouvés en même temps : le premier prouvé garde le domaine.\n- Les noms de la plateforme ne peuvent pas être ajoutés comme domaine client : Host répond « Ce domaine appartient à la plateforme. »\n\n## Limites\n\n| Limite | Valeur |\n|---|---|\n| Domaines par organisation | 50 |\n| Vérifications de domaine | 20 par minute, avec des rafales de 5 |\n| Revendications concurrentes d'un même nom | 10 au plus |\n\nVoir [Limites](/reference/limites/).\n\n## Propagation DNS\n\nUn enregistrement neuf peut mettre de quelques minutes à quelques heures à apparaître. La vérification interroge des résolveurs DNS publics. Si aucun résolveur ne répond, le statut ne change pas.","../../../../wt-aide-ui/host/reference/domaines.mdx","36b8f85ebe08651f","reference/limites",{"id":375,"data":377,"body":383,"filePath":384,"digest":385,"deferredRender":8},{"sidebarTitle":378,"title":378,"description":379,"editUrl":8,"head":380,"template":10,"sidebar":381,"pagefind":8,"draft":12},"Limites","Tailles, débits, quotas et durées de conservation de Host.",[],{"hidden":12,"attrs":382},{},"Ces limites protègent la plateforme et les autres organisations. Une requête qui dépasse une limite de débit reçoit `429` avec le code `rate_limited`. Attends quelques secondes, puis réessaie.\n\nBesoin d'une limite plus haute ? Écris à [support@hgdc.ch](mailto:support@hgdc.ch).\n\n## Déploiements et fichiers\n\n| Limite | Valeur |\n|---|---|\n| Taille d'un fichier | 20 Mo |\n| Fichiers inclus directement dans la requête de déploiement | 20 Mo au total. Au-delà, envoie les fichiers par `/v2/files` |\n| Fichiers par déploiement | 15 000 |\n| Déploiements par organisation | 60 par heure, avec des rafales de 10 |\n| Suivi de la publication par la CLI | 9 minutes au plus par connexion |\n\n## Fonctions (préversion)\n\n| Limite | Valeur |\n|---|---|\n| Mémoire par fonction | 512 Mo par défaut, 1 Go au plus |\n| Durée par requête | 30 secondes par défaut, 60 secondes au plus |\n| Première requête après une période calme | Quelques secondes, le temps de démarrer l'environnement |\n\nLa durée peut être réglée par fonction avec `maxDuration`, dans la limite de 60 secondes. Voir [Préversion](/concepts/preversion/).\n\n## API\n\n| Limite | Valeur | Compté par |\n|---|---|---|\n| Requêtes à l'API | 600 par minute, avec des rafales de 120 | Clé d'API |\n| Envoi de fichiers (`/v2/files`) | 6 000 par minute, avec des rafales de 3 000 | Clé d'API |\n| Vérifications de domaine | 20 par minute, avec des rafales de 5 | Organisation |\n\nLes rafales sont le nombre de requêtes acceptées d'un coup, avant que la limite par minute ne s'applique.\n\n## Projets, domaines et variables\n\n| Limite | Valeur |\n|---|---|\n| Domaines par organisation | 50 |\n| Nom d'une variable | 256 caractères |\n| Valeur d'une variable | 64 Ko |\n| Note d'une variable | 500 caractères |\n| Variables synchronisées par configuration Doppler | 300 |\n| Entrées par liste de `vercel.json` (`redirects`, `rewrites`, `headers`, `routes`) | 1024 |\n\n## Journaux\n\n| Limite | Valeur |\n|---|---|\n| Conservation des logs des requêtes | 3 jours |\n| Lignes de logs de requêtes affichées | 1000 au plus |\n| Conservation des logs de build | Tant que le projet existe |\n\nLes minutes de GitHub Actions dépendent de ton compte GitHub, pas de Host.","../../../../wt-aide-ui/host/reference/limites.mdx","1464a50a87d37a5d","reference/variables",{"id":386,"data":388,"body":394,"filePath":395,"digest":396,"deferredRender":8},{"sidebarTitle":241,"title":389,"description":390,"editUrl":8,"head":391,"template":10,"sidebar":392,"pagefind":8,"draft":12},"Variables d'environnement","Noms, valeurs, environnements, variables réservées et variables sensibles, avec les règles exactes.",[],{"hidden":12,"attrs":393},{},"Cette page donne les règles qui s'appliquent aux variables d'environnement. Pour les gérer pas à pas, voir [Gérer les variables](/guides/variables-d-environnement/).\n\n## Nom\n\n| Règle | Valeur |\n|---|---|\n| Caractères autorisés | Lettres, chiffres et `_` |\n| Premier caractère | Une lettre ou `_`, pas un chiffre |\n| Longueur | 256 caractères au plus |\n| Noms réservés | Ceux qui commencent par `VERCEL_` ou `AGENTHOST_` |\n\nUn même nom peut exister une fois par environnement.\n\n## Valeur et note\n\n| Champ | Limite |\n|---|---|\n| Valeur | 64 Ko au plus |\n| Note | 500 caractères au plus |\n\n## Environnements\n\n| Environnement | Utilisé par | Télécharge avec `vercel pull` |\n|---|---|---|\n| Production | `vercel build --prod`, les déploiements de production | `--environment=production` |\n| Preview | Les builds de toutes les branches autres que la production | `--environment=preview` |\n| Développement | Ton poste de développement | Par défaut, sans option |\n\n## Variables fournies par la plateforme\n\nHost ajoute ces variables au build, sans que tu les crées :\n\n| Variable | Valeur |\n|---|---|\n| `VERCEL_PROJECT_PRODUCTION_URL` | Le domaine de production du projet, sans `https://`, à défaut son adresse de production `\u003Cprojet>.hgdc.cloud`. Toujours présente, en preview aussi |\n\nLes noms `VERCEL_` sont réservés : tu ne peux pas en créer, et une variable du projet du même nom n'écrase pas celle de la plateforme.\n\n## Variables sensibles\n\n| Propriété | Comportement |\n|---|---|\n| Affichage | Jamais affichée après l'enregistrement, ni dans la console ni dans la CLI. Elle peut seulement être remplacée |\n| Environnements | Production ou preview uniquement. Jamais le développement |\n| Téléchargement | Livrée uniquement au build du dépôt GitHub, par une clé limitée au projet. Absente de `vercel pull` avec une clé d'organisation |\n\n## Synchronisation avec Doppler\n\n| Règle | Valeur |\n|---|---|\n| Variables par configuration | 300 au plus |\n| Métadonnées Doppler | Exclues : `DOPPLER_PROJECT`, `DOPPLER_CONFIG` et similaires |\n| Noms réservés | Ignorés |\n| Valeurs de plus de 64 Ko | Ignorées et signalées |\n| Synchronisation de secours | Toutes les six heures, sans webhook |\n\nVoir [Synchroniser depuis Doppler](/guides/synchroniser-doppler/).\n\n## Ce que le site publie\n\nTout ce que le build écrit dans les fichiers du site est public. Une variable lue dans le navigateur, comme celles qui commencent par `PUBLIC_`, `VITE_` ou `NEXT_PUBLIC_`, ne doit jamais contenir un secret.","../../../../wt-aide-ui/host/reference/variables.mdx","526bde9f8e5c6517","reference/vercel-json",{"id":397,"data":399,"body":405,"filePath":406,"digest":407,"deferredRender":8},{"sidebarTitle":400,"title":400,"description":401,"editUrl":8,"head":402,"template":10,"sidebar":403,"pagefind":8,"draft":12},"vercel.json","Les options de vercel.json que Host applique, leurs limites, et ce qui est filtré à la publication.",[],{"hidden":12,"attrs":404},{},"Host applique le routage de ton site comme Vercel. Pour un site statique sans build, il lit `vercel.json` à la racine du dossier envoyé. Pour un site construit avec `vercel build`, il lit `.vercel/output/config.json`. Les options décrites ici sont converties par la bibliothèque de routage de Vercel, avec les mêmes règles.\n\n## Options prises en charge\n\n| Option | Effet |\n|---|---|\n| `cleanUrls` | Sert `/a-propos` pour `a-propos.html`, sans extension |\n| `trailingSlash` | Ajoute ou retire la barre oblique finale, par redirection |\n| `redirects` | Redirige un chemin vers un autre, avec le code 301, 302, 307 ou 308 |\n| `rewrites` | Sert un autre fichier, ou une URL externe, sans changer l'adresse affichée |\n| `headers` | Ajoute des en-têtes de réponse à certains chemins |\n| `routes` | Le format de routes historique de Vercel, pour les cas avancés |\n\nChaque liste (`redirects`, `rewrites`, `headers`, `routes`) accepte 1024 entrées au plus.\n\n## Exemple\n\n```json\n{\n \"cleanUrls\": true,\n \"redirects\": [\n { \"source\": \"/blog/:slug\", \"destination\": \"/articles/:slug\", \"permanent\": true }\n ],\n \"headers\": [\n {\n \"source\": \"/assets/(.*)\",\n \"headers\": [\n { \"key\": \"Cache-Control\", \"value\": \"public, max-age=31536000, immutable\" }\n ]\n }\n ]\n}\n```\n\n## Build Output API\n\nPour un site envoyé avec `vercel deploy --prebuilt`, Host lit `.vercel/output/config.json` (version 3) et sert le dossier `.vercel/output/static`. Les routes passent par les mêmes phases que chez Vercel : routes principales, système de fichiers, `miss`, `rewrite`, puis `error`.\n\nLes conditions `has` et `missing` sont prises en compte. Elles portent sur l'hôte, un en-tête, un cookie ou un paramètre.\n\n## Ce qui est filtré\n\n- Les en-têtes `set-cookie` d'une route ne sont pas servis.\n- Les fichiers et dossiers qui commencent par un point (`.env`, `.git`) ne sont jamais servis. Seul `.well-known` fait exception.\n- Une expression régulière jugée dangereuse ou trop longue fait échouer la publication. Le message désigne la route en cause. Un exemple de motif dangereux : des quantificateurs imbriqués, comme `(a+)+`.\n\n## Pages introuvables\n\nUn fichier `404.html` à la racine du site sert de page d'erreur. Sans lui, Host affiche sa propre page 404.","../../../../wt-aide-ui/host/reference/vercel-json.mdx","20485a714ce4faa3","meta::meta",["Map",410,411,412,413,414,415],"astro-config-digest","{\"root\":{},\"srcDir\":{},\"publicDir\":{},\"outDir\":{},\"cacheDir\":{},\"compressHTML\":\"jsx\",\"base\":\"/docs/\",\"trailingSlash\":\"always\",\"output\":\"static\",\"scopedStyleStrategy\":\"where\",\"build\":{\"format\":\"directory\",\"client\":{},\"server\":{},\"assets\":\"_astro\",\"serverEntry\":\"entry.mjs\",\"redirects\":true,\"inlineStylesheets\":\"auto\",\"concurrency\":1},\"server\":{\"open\":false,\"host\":false,\"port\":4410,\"allowedHosts\":[]},\"redirects\":{},\"image\":{\"endpoint\":{\"route\":\"/_image/\"},\"service\":{\"entrypoint\":\"astro/assets/services/sharp\",\"config\":{}},\"dangerouslyProcessSVG\":false,\"domains\":[],\"remotePatterns\":[],\"responsiveStyles\":false},\"devToolbar\":{\"enabled\":true},\"markdown\":{\"syntaxHighlight\":false,\"shikiConfig\":{\"langs\":[],\"langAlias\":{},\"theme\":\"github-dark\",\"themes\":{},\"wrap\":false,\"transformers\":[]},\"remarkPlugins\":[],\"rehypePlugins\":[],\"remarkRehype\":{},\"processor\":{\"name\":\"unified\",\"options\":{\"remarkPlugins\":[null,[null,{\"base\":\"/docs\"}],null,null,null],\"rehypePlugins\":[null,[null],null,null],\"remarkRehype\":{},\"recmaPlugins\":[]}}},\"security\":{\"checkOrigin\":true,\"allowedDomains\":[],\"csp\":false,\"actionBodySizeLimit\":1048576,\"serverIslandBodySizeLimit\":1048576},\"env\":{\"schema\":{},\"validateSecrets\":false},\"prerenderConflictBehavior\":\"warn\",\"fetchFile\":\"fetch\",\"experimental\":{\"clientPrerender\":false,\"contentIntellisense\":false,\"chromeDevtoolsWorkspace\":false,\"incrementalBuild\":false,\"collectionStorage\":\"single-file\"},\"legacy\":{\"collectionsBackwardsCompat\":false},\"prefetch\":{\"prefetchAll\":true},\"i18n\":{\"defaultLocale\":\"fr-CH\",\"locales\":[\"fr-CH\"],\"routing\":{\"prefixDefaultLocale\":false,\"redirectToDefaultLocale\":false,\"fallbackType\":\"redirect\"}}}","astro-version","7.3.8","content-config-digest","e5cfe9de0a1dde1b"]
@@ -1,5 +0,0 @@
1
- {
2
- "_variables": {
3
- "lastUpdateCheck": 1792253390779
4
- }
5
- }
@@ -1 +0,0 @@
1
- function e(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/&lt;mark&gt;/g,`<mark>`).replace(/&lt;\/mark&gt;/g,`</mark>`)}var t=(function(){let e=typeof document<`u`&&document.createElement(`link`).relList;return e&&e.supports&&e.supports(`modulepreload`)?`modulepreload`:`preload`})(),n=function(e){return`/docs/`+e},r={},i=function(e){return e.pathname.endsWith(`.css`)},a=function(e,t,n){if(t in e)return e[t];let r=n();if(!r){e[t]=void 0;return}let i=r.then(()=>{e[t]=void 0},n=>{throw e[t]=void 0,n});return e[t]=i,i},o=function(e,o,s){let c=Promise.resolve();if(o&&o.length>0){let e,l=document.querySelector(`meta[property=csp-nonce]`),u=l?.nonce||l?.getAttribute(`nonce`);function d(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function f(e){return import.meta.resolve?new URL(import.meta.resolve(e)):new URL(e,import.meta.url)}c=d(o.map(o=>{o=n(o,s);let c=f(o),l=i(c);return a(r,c.href,()=>{if(e===void 0){e={all:new Set,styles:new Set};let t=document.getElementsByTagName(`link`);for(let n=t.length-1;n>=0;n--){let r=t[n];e.all.add(r.href),r.rel===`stylesheet`&&e.styles.add(r.href)}}if((l?e.styles:e.all).has(c.href))return;let n=document.createElement(`link`);if(n.rel=l?`stylesheet`:t,l||(n.as=`script`),n.crossOrigin=``,n.href=c.href,u&&n.setAttribute(`nonce`,u),document.head.appendChild(n),l)return new Promise((e,t)=>{n.addEventListener(`load`,e),n.addEventListener(`error`,()=>t(Error(`Unable to preload CSS for ${c}`)))})})}).filter(e=>e!==void 0))}function l(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return c.then(t=>{for(let e of t||[])e.status===`rejected`&&l(e.reason);return e().catch(l)})},s=8;function c(e){return e.flatMap(e=>{let t=e.meta.title??e.url;return[{href:e.url,title:t,context:e.meta.section??``,excerpt:e.excerpt,kind:`page`},...(e.sub_results??[]).filter(n=>n.url!==e.url&&n.title!==t).slice(0,3).map(e=>({href:e.url,title:e.title,context:t,excerpt:e.excerpt,kind:`heading`}))]})}var l=class extends HTMLElement{pagefind=null;active=0;get dialog(){return this.querySelector(`dialog`)}get input(){return this.querySelector(`[data-input]`)}get list(){return this.querySelector(`[data-results]`)}get status(){return this.querySelector(`[data-status]`)}connectedCallback(){let e=/Mac|iPhone|iPad/.test(navigator.platform),t=this.querySelector(`[data-shortcut]`);t&&(t.textContent=e?`⌘ K`:`Ctrl K`),this.querySelector(`[data-open]`).addEventListener(`click`,()=>this.open()),this.querySelector(`[data-close]`).addEventListener(`click`,()=>this.dialog.close()),this.dialog.addEventListener(`click`,e=>{e.target===this.dialog&&this.dialog.close()}),this.input.addEventListener(`input`,()=>void this.search(this.input.value)),this.input.addEventListener(`keydown`,e=>this.keydown(e)),document.addEventListener(`keydown`,e=>{let t=e.target instanceof HTMLElement&&e.target.closest(`input, textarea, [contenteditable]`);(e.metaKey||e.ctrlKey)&&e.key.toLowerCase()===`k`?(e.preventDefault(),this.dialog.open?this.dialog.close():this.open()):e.key===`/`&&!t&&!this.dialog.open&&(e.preventDefault(),this.open())})}open(){this.dialog.showModal(),this.input.select(),this.load()}load(){return this.pagefind??=(async()=>{try{let e=`${this.dataset.base??``}/pagefind/pagefind.js`,t=await o(()=>import(e),[]);return await t.options({excerptLength:18}),t}catch{return null}})(),this.pagefind}async search(e){let t=e.trim();if(!t){this.render([],`Tape un mot pour chercher dans les pages.`);return}let n=await this.load();if(!n){this.render(this.askOption(t),`La recherche fonctionne sur le site publié.`);return}let r=await n.debouncedSearch(t,{},120);if(!r||this.input.value.trim()!==t)return;let i=await Promise.all(r.results.slice(0,s).map(e=>e.data())),a=[...c(i),...this.askOption(t)];this.render(a,i.length?`${i.length} page${i.length>1?`s`:``} trouvée${i.length>1?`s`:``}.`:`Aucune page ne parle de « ${t} ».`)}askOption(e){return this.dataset.assistant===void 0?[]:[{title:`Demander à l'assistant : « ${e} »`,context:``,excerpt:``,kind:`ask`}]}render(t,n){this.active=0,this.status.textContent=n,this.list.replaceChildren(...t.map((t,n)=>{let r=document.createElement(t.href?`a`:`button`);r.className=`hd-result hd-result--${t.kind}`,r.id=`hd-result-${n}`,r.setAttribute(`role`,`option`),r.tabIndex=-1,r instanceof HTMLAnchorElement?r.href=t.href:r.type=`button`;let i=document.createElement(`span`);i.className=`hd-result__icon`,i.setAttribute(`aria-hidden`,`true`),i.textContent=t.kind===`heading`?`#`:t.kind===`ask`?`✦`:``;let a=document.createElement(`span`);a.className=`hd-result__body`;let o=document.createElement(`span`);if(o.className=`hd-result__title`,o.textContent=t.title,a.append(o),t.context){let e=document.createElement(`span`);e.className=`hd-result__context`,e.textContent=t.context,a.append(e)}if(t.excerpt){let n=document.createElement(`span`);n.className=`hd-result__excerpt`,n.innerHTML=e(t.excerpt),a.append(n)}return r.append(i,a),r.addEventListener(`click`,e=>{t.kind===`ask`?(e.preventDefault(),this.ask()):this.dialog.close()}),r.addEventListener(`mousemove`,()=>this.highlight(n)),r})),this.input.setAttribute(`aria-expanded`,String(t.length>0)),this.highlight(0)}highlight(e){let t=[...this.list.children];this.active=Math.max(0,Math.min(e,t.length-1)),t.forEach((e,t)=>e.setAttribute(`aria-selected`,String(t===this.active)));let n=t[this.active];n?(this.input.setAttribute(`aria-activedescendant`,n.id),n.scrollIntoView({block:`nearest`})):this.input.removeAttribute(`aria-activedescendant`)}keydown(e){if(e.key===`ArrowDown`||e.key===`ArrowUp`)e.preventDefault(),this.highlight(this.active+(e.key===`ArrowDown`?1:-1));else if(e.key===`Enter`){let t=this.list.children[this.active];if(!t)return;e.preventDefault(),t.click()}}ask(){let e=this.input.value.trim();this.dialog.close(),document.dispatchEvent(new CustomEvent(`hgdc:assistant-open`,{detail:{question:e}}))}};function u(){customElements.get(`hd-search`)||customElements.define(`hd-search`,l)}u();
@@ -1,3 +0,0 @@
1
- @font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/docs/_astro/inter-cyrillic-ext-wght-normal.BOeWTOD4.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/docs/_astro/inter-cyrillic-wght-normal.DqGufNeO.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/docs/_astro/inter-greek-ext-wght-normal.DlzME5K_.woff2)format("woff2-variations");unicode-range:U+1F??}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/docs/_astro/inter-greek-wght-normal.CkhJZR-_.woff2)format("woff2-variations");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/docs/_astro/inter-vietnamese-wght-normal.CBcvBZtf.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/docs/_astro/inter-latin-ext-wght-normal.DO1Apj_S.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/docs/_astro/inter-latin-wght-normal.Dx4kXJAl.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/docs/_astro/geist-cyrillic-ext-wght-normal.DjL33-gN.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/docs/_astro/geist-cyrillic-wght-normal.BEAKL7Jp.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/docs/_astro/geist-vietnamese-wght-normal.6IgcOCM7.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/docs/_astro/geist-latin-ext-wght-normal.DC-KSUi6.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/docs/_astro/geist-latin-wght-normal.BgDaEnEv.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--hd-font-sans:"Geist Variable", ui-sans-serif, system-ui, sans-serif;--hd-font-heading:"Inter Variable", ui-sans-serif, system-ui, sans-serif;--hd-font-mono:ui-monospace, "SFMono-Regular", "Cascadia Code", Consolas, monospace;--hd-ease-out:cubic-bezier(.23, 1, .32, 1);--hd-ease-drawer:cubic-bezier(.32, .72, 0, 1);--hd-nav-h:3.5rem;--hd-sidebar-w:17.5rem;--hd-toc-w:15.5rem;--hd-panel-w:26rem;--hd-content-w:45rem;--hd-gutter:1.25rem;color-scheme:dark;--hd-bg:oklch(14.5% 0 0);--hd-fg:oklch(98.5% 0 0);--hd-fg-2:oklch(87% 0 0);--hd-muted:oklch(20.5% 0 0);--hd-muted-2:oklch(26.9% 0 0);--hd-muted-fg:oklch(70.8% 0 0);--hd-border:oklch(100% 0 0/.1);--hd-border-strong:oklch(100% 0 0/.16);--hd-floating:oklch(20.5% 0 0);--hd-code-bg:oklch(17% 0 0);--hd-code-header:oklch(20% 0 0);--hd-hover:oklch(100% 0 0/.06);--hd-shadow:0 1px 2px oklch(0% 0 0/.3), 0 12px 32px -8px oklch(0% 0 0/.5);--hd-scroll-thumb:oklch(100% 0 0/.22);--hd-backdrop:oklch(0% 0 0/.55);--hd-primary:oklch(92.2% 0 0);--hd-primary-fg:oklch(20.5% 0 0);--hd-tone-note:oklch(72% .15 256);--hd-tone-info:oklch(70.8% 0 0);--hd-tone-tip:oklch(75% .14 156);--hd-tone-check:oklch(75% .14 156);--hd-tone-warning:oklch(82% .15 86);--hd-tone-danger:oklch(72% .19 22);--hd-accent:var(--sl-color-accent);--hd-accent-fg:var(--hgdc-on-accent,#fff);--hd-accent-soft:color-mix(in oklab, var(--hd-accent) 9%, transparent);--sl-font:var(--hd-font-sans);--sl-font-mono:var(--hd-font-mono);--sl-nav-height:var(--hd-nav-h);--sl-sidebar-width:var(--hd-sidebar-w);--sl-content-width:var(--hd-content-w);--sl-mobile-toc-height:0rem;--sl-color-bg:var(--hd-bg);--sl-color-bg-nav:var(--hd-bg);--sl-color-bg-sidebar:var(--hd-bg);--sl-color-hairline:var(--hd-border);--sl-color-hairline-light:var(--hd-border);--sl-color-hairline-shade:var(--hd-border);--sl-color-text:var(--hd-fg-2);--sl-color-text-accent:var(--hd-accent);--sl-color-white:var(--hd-fg);--sl-color-gray-1:oklch(92% 0 0);--sl-color-gray-2:oklch(82% 0 0);--sl-color-gray-3:var(--hd-muted-fg);--sl-color-gray-4:oklch(55% 0 0);--sl-color-gray-5:oklch(32% 0 0);--sl-color-gray-6:var(--hd-muted);--sl-color-black:var(--hd-bg);--sl-text-h1:2.25rem;--sl-text-h2:1.5rem;--sl-text-h3:1.1875rem;--sl-text-h4:1rem}:root:not([data-hd-theme=dark]){color-scheme:light;--hd-bg:oklch(100% 0 0);--hd-fg:oklch(14.5% 0 0);--hd-fg-2:oklch(30% 0 0);--hd-muted:oklch(97% 0 0);--hd-muted-2:oklch(94% 0 0);--hd-muted-fg:oklch(52% 0 0);--hd-border:oklch(92.2% 0 0);--hd-border-strong:oklch(87% 0 0);--hd-floating:oklch(100% 0 0);--hd-code-bg:oklch(100% 0 0);--hd-code-header:oklch(97.5% 0 0);--hd-hover:oklch(0% 0 0/.045);--hd-shadow:0 1px 2px oklch(0% 0 0/.05), 0 12px 32px -8px oklch(0% 0 0/.14);--hd-scroll-thumb:oklch(0% 0 0/.2);--hd-backdrop:oklch(0% 0 0/.3);--hd-primary:oklch(20.5% 0 0);--hd-primary-fg:oklch(98.5% 0 0);--hd-tone-note:oklch(50% .17 256);--hd-tone-info:oklch(45% 0 0);--hd-tone-tip:oklch(47% .12 155);--hd-tone-check:oklch(47% .12 155);--hd-tone-warning:oklch(50% .12 70);--hd-tone-danger:oklch(53% .21 27);--sl-color-gray-1:oklch(25% 0 0);--sl-color-gray-2:oklch(35% 0 0);--sl-color-gray-3:var(--hd-muted-fg);--sl-color-gray-4:oklch(65% 0 0);--sl-color-gray-5:oklch(87% 0 0);--sl-color-gray-6:var(--hd-muted);--sl-color-gray-7:oklch(98.5% 0 0)}html{background:var(--hd-bg);scroll-padding-top:calc(var(--hd-nav-h) + 1.5rem);scrollbar-width:thin;scrollbar-color:var(--hd-scroll-thumb) transparent}body{background:var(--hd-bg);color:var(--hd-fg-2);font-family:var(--hd-font-sans);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;font-size:1rem}::selection{background:color-mix(in oklab, var(--hd-accent) 24%, transparent)}:focus-visible{outline:2px solid var(--hd-accent);outline-offset:2px}:where(.sidebar-pane,.hd-toc-scroll,.expressive-code pre,.hgdc-panel__body,.hd-palette__results,.hd-table){scrollbar-width:thin;scrollbar-color:transparent transparent;scrollbar-gutter:stable}:where(.sidebar-pane,.hd-toc-scroll,.expressive-code pre,.hgdc-panel__body,.hd-palette__results,.hd-table):is(:hover,:focus-within){scrollbar-color:var(--hd-scroll-thumb) transparent}:where(.sidebar-pane,.hd-toc-scroll,.expressive-code pre,.hgdc-panel__body,.hd-palette__results,.hd-table)::-webkit-scrollbar{width:6px;height:6px}:where(.sidebar-pane,.hd-toc-scroll,.expressive-code pre,.hgdc-panel__body,.hd-palette__results,.hd-table)::-webkit-scrollbar-thumb{background:0 0;border-radius:999px}:where(.sidebar-pane,.hd-toc-scroll,.expressive-code pre,.hgdc-panel__body,.hd-palette__results,.hd-table):is(:hover,:focus-within)::-webkit-scrollbar-thumb{background:var(--hd-scroll-thumb)}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.hd-icon{flex-shrink:0}.hd-kbd{border:1px solid var(--hd-border);background:var(--hd-bg);min-width:1.25rem;height:1.25rem;color:var(--hd-muted-fg);font:500 .6875rem/1 var(--hd-font-sans);white-space:nowrap;border-radius:.375rem;align-items:center;gap:.15rem;padding:0 .35rem;display:inline-flex}.hd-kbd--button{cursor:pointer}.hd-icon-button{width:2.25rem;height:2.25rem;color:var(--hd-muted-fg);cursor:pointer;transition:background-color .15s ease, color .15s ease, transform .16s var(--hd-ease-out);background:0 0;border:0;border-radius:999px;place-items:center;display:inline-grid}.hd-icon-button:hover{background:var(--hd-hover);color:var(--hd-fg)}.hd-icon-button:active{transform:scale(.95)}.hd-pill{height:2.25rem;font:500 .875rem/1 var(--hd-font-sans);white-space:nowrap;cursor:pointer;transition:background-color .15s ease, border-color .15s ease, transform .16s var(--hd-ease-out);border:1px solid #0000;border-radius:999px;justify-content:center;align-items:center;gap:.375rem;padding:0 1rem;text-decoration:none;display:inline-flex}.hd-pill:active{transform:scale(.97)}.hd-pill--ghost{border-color:var(--hd-border);background:var(--hd-bg);color:var(--hd-fg)}.hd-pill--ghost:hover{background:var(--hd-muted)}.hd-pill--primary{background:var(--hd-accent);color:var(--hd-accent-fg)}.hd-pill--primary:hover{background:color-mix(in oklab, var(--hd-accent) 88%, var(--hd-fg))}.hd-topbar{z-index:30;height:var(--hd-nav-h);background:var(--hd-bg);border-bottom:1px solid var(--hd-border);padding:0 .75rem 0 .5rem;position:fixed;inset:0 0 auto}.hd-header{align-items:center;gap:.5rem;height:100%;display:flex}.hd-header__start{flex:auto;align-items:center;gap:.25rem;min-width:0;display:flex}.hd-header__tabs{display:none}.hd-header__end{flex:none;align-items:center;gap:.25rem;display:flex}.hd-header__links{display:none}.hd-brand{min-width:0;color:var(--hd-fg);border-radius:.75rem;align-items:center;gap:.625rem;padding:.375rem .5rem;text-decoration:none;display:inline-flex}.hd-brand__mark{flex-shrink:0;display:inline-grid}.hd-brand__mark img{grid-area:1/1;width:1.5rem;height:1.5rem}.hd-brand--footer .hd-brand__mark img{width:1.25rem;height:1.25rem}.hd-brand__dark,:root[data-hd-theme=dark] .hd-brand__light{visibility:hidden}:root[data-hd-theme=dark] .hd-brand__dark{visibility:visible}.hd-brand__name{font:600 1.0625rem/1 var(--hd-font-heading);letter-spacing:-.02em;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.hd-theme-button .hd-theme-button__sun,:root[data-hd-theme=dark] .hd-theme-button .hd-theme-button__moon{display:none}:root[data-hd-theme=dark] .hd-theme-button .hd-theme-button__sun{display:block}.hd-header .hd-theme-button{display:none}.hd-search-trigger{width:2.25rem;height:2.25rem;color:var(--hd-muted-fg);font:400 .875rem/1 var(--hd-font-sans);cursor:pointer;background:0 0;border:0;border-radius:999px;place-items:center;display:inline-grid}.hd-search-trigger:hover{background:var(--hd-hover);color:var(--hd-fg)}.hd-search-trigger__label,.hd-search-trigger .hd-kbd{display:none}@media (width>=50em){.hd-topbar{padding:0 1.25rem 0 .75rem}.hd-menu-button{display:none}.hd-header .hd-theme-button{display:inline-grid}.hd-search-trigger{border:1px solid var(--hd-border);background:var(--hd-bg);text-align:start;gap:.5rem;width:15rem;height:2.25rem;margin-inline-end:.25rem;padding:0 .375rem 0 .875rem;display:inline-flex}.hd-search-trigger:hover{border-color:var(--hd-border-strong);background:var(--hd-bg)}.hd-search-trigger__label{flex:1;display:block}.hd-search-trigger .hd-kbd{display:inline-flex}}@media (width>=64em){.hd-header{grid-template-columns:var(--hd-sidebar-w) 1fr auto;gap:0;display:grid}.hd-header__start{margin-inline-start:-.25rem}.hd-header__end{grid-column:3}.hd-header__tabs{align-items:center;gap:.25rem;min-width:0;padding-inline-start:1rem;display:flex}.hd-header__tabs a{color:var(--hd-muted-fg);font:500 .875rem/1 var(--hd-font-sans);white-space:nowrap;border-radius:999px;padding:.5rem .875rem;text-decoration:none;transition:background-color .15s,color .15s}.hd-header__tabs a:hover{color:var(--hd-fg)}.hd-header__tabs a[aria-current=page]{background:var(--hd-muted);color:var(--hd-fg)}.hd-header__links{align-items:center;gap:.5rem;margin-inline:.5rem .25rem;display:flex}}.hd-sidebar .sidebar-pane{z-index:40;background:var(--hd-bg);width:min(20rem,86vw);height:100dvh;color:inherit;overscroll-behavior:contain;box-shadow:var(--hd-shadow);transition:transform .32s var(--hd-ease-drawer), display .32s allow-discrete, overlay .32s allow-discrete;border:0;margin:0;padding:0;position:fixed;inset:0 auto 0 0;overflow-y:auto;transform:translate(-100%)}.hd-sidebar .sidebar-pane:popover-open{transform:none}@starting-style{.hd-sidebar .sidebar-pane:popover-open{transform:translate(-100%)}}.hd-sidebar .sidebar-pane::backdrop{background:var(--hd-backdrop);opacity:0;transition:opacity .32s ease, display .32s allow-discrete, overlay .32s allow-discrete}.hd-sidebar .sidebar-pane:popover-open::backdrop{opacity:1}@starting-style{.hd-sidebar .sidebar-pane:popover-open::backdrop{opacity:0}}.hd-sidebar__content{flex-direction:column;gap:1.25rem;min-height:100%;padding:1rem .75rem 2rem 1rem;display:flex}.hd-sidebar-head{justify-content:space-between;align-items:center;margin:-.25rem -.25rem 0 -.5rem;display:flex}@media (width>=50em){.hd-sidebar .sidebar-pane{inset:var(--hd-nav-h) auto 0 0;width:var(--hd-sidebar-w);height:auto;box-shadow:none;transition:none;display:block;transform:none}.hd-sidebar__content{padding:1.5rem 1rem 3rem 1.25rem}.hd-mobile-only{display:none!important}}.hd-nav{gap:1px;margin:0;padding:0;list-style:none;display:grid}.hd-nav--depth-0{gap:1.5rem}.hd-nav--depth-0>li:not(.hd-nav__group){margin-bottom:-1.5rem}.hd-nav--depth-0>li:not(.hd-nav__group)+li:not(.hd-nav__group){margin-top:calc(1px - 1.5rem)}.hd-nav__heading{color:var(--hd-fg);font:600 .8125rem/1.25rem var(--hd-font-heading);letter-spacing:-.005em;margin:0 0 .375rem;padding-inline:.75rem}.hd-nav--depth-2,.hd-nav--depth-3{border-inline-start:1px solid var(--hd-border);margin:1px 0 .25rem .75rem;padding-inline-start:.5rem}.hd-nav__link{min-height:2rem;color:var(--hd-muted-fg);font:400 .875rem/1.35 var(--hd-font-sans);cursor:pointer;border-radius:.75rem;align-items:center;gap:.5rem;padding:.3rem .75rem;text-decoration:none;list-style:none;transition:background-color .12s,color .12s;display:flex}.hd-nav__link::-webkit-details-marker{display:none}.hd-nav__link>span:first-child{flex:1;min-width:0}.hd-nav__link:hover{background:var(--hd-hover);color:var(--hd-fg)}.hd-nav__link[aria-current=page]{background:var(--hd-accent-soft);color:var(--hd-accent);font-weight:500}.hd-nav__chevron{color:var(--hd-muted-fg);transition:transform .2s var(--hd-ease-out)}.hd-nav__fold[open]>summary .hd-nav__chevron{transform:rotate(90deg)}.hd-badge{background:var(--hd-accent-soft);color:var(--hd-accent);font:600 .6875rem/1 var(--hd-font-sans);border-radius:999px;flex-shrink:0;padding:.125rem .4rem}.hd-sidebar-tabs{gap:1px;display:grid}.hd-sidebar-tabs a{color:var(--hd-fg-2);font:500 .875rem/1.2 var(--hd-font-sans);border-radius:.75rem;padding:.5rem .75rem;text-decoration:none}.hd-sidebar-tabs a[aria-current=page]{background:var(--hd-muted);color:var(--hd-fg)}.hd-version select{border:1px solid var(--hd-border);background:var(--hd-bg);width:100%;height:2.25rem;color:var(--hd-fg);font:500 .875rem var(--hd-font-sans);border-radius:.875rem;padding:0 .75rem}.hd-sidebar-footer{border-top:1px solid var(--hd-border);gap:1rem;margin-top:auto;padding-top:1rem;display:grid}.hd-sidebar-links{gap:.25rem;display:grid}.hd-sidebar-links a:not(.hd-pill){color:var(--hd-fg-2);padding:.5rem .75rem;font-size:.875rem;text-decoration:none}.hd-theme-choice{border:1px solid var(--hd-border);border-radius:999px;justify-self:start;gap:2px;padding:2px;display:inline-flex}.hd-theme-choice button{width:1.875rem;height:1.75rem;color:var(--hd-muted-fg);cursor:pointer;background:0 0;border:0;border-radius:999px;place-items:center;display:grid}.hd-theme-choice button:hover{color:var(--hd-fg)}.hd-theme-choice button[aria-checked=true]{background:var(--hd-muted-2);color:var(--hd-fg)}.hd-main-frame{padding-top:var(--hd-nav-h);transition:margin .32s var(--hd-ease-out)}@media (width>=50em){[data-has-sidebar] .hd-main-frame{margin-inline-start:var(--hd-sidebar-w)}}main{padding:0 0 2rem}.content-panel{padding:0 var(--hd-gutter)}.content-panel+.content-panel{border-top:0}.sl-container{max-width:var(--hd-content-w);margin-inline:auto}.hd-columns__toc{display:none}@media (width>=50em){:root{--hd-gutter:2.5rem}}@media (width>=72em){.hd-columns--toc{grid-template-columns:minmax(0, 1fr) var(--hd-toc-w);display:grid}.hd-columns__toc{display:block;position:relative}.hd-toc-scroll{top:var(--hd-nav-h);max-height:calc(100dvh - var(--hd-nav-h));padding:2.5rem 1.5rem 2rem .5rem;position:sticky;overflow-y:auto}}starlight-toc h2{color:var(--hd-fg);font:500 .8125rem/1.25rem var(--hd-font-heading);align-items:center;gap:.5rem;margin:0 0 .75rem;display:flex}starlight-toc h2:before{content:"";background:currentColor;width:1rem;height:1rem;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.75' stroke-linecap='round'%3E%3Cpath d='M4 6h16M4 12h10M4 18h13'/%3E%3C/svg%3E") 50%/contain no-repeat}starlight-toc ul{margin:0;padding:0;list-style:none}starlight-toc ul ul{padding-inline-start:.75rem}starlight-toc a{border-inline-start:1px solid var(--hd-border);color:var(--hd-muted-fg);font:400 .8125rem/1.4 var(--hd-font-sans);padding:.3rem 0 .3rem .875rem;text-decoration:none;transition:color .12s;display:block}starlight-toc ul ul a{margin-inline-start:-.75rem;padding-inline-start:1.625rem}starlight-toc a:hover{color:var(--hd-fg)}starlight-toc a[aria-current=true]{border-inline-start-color:var(--hd-accent);color:var(--hd-accent);font-weight:500}starlight-toc a .hd-method{display:none}.hd-title{padding-top:2rem}.hd-eyebrow{color:var(--hd-accent);font:500 .8125rem/1.25rem var(--hd-font-sans);margin:0 0 .5rem}.hd-title__row{flex-direction:column;gap:1rem;display:flex}.hd-title h1{color:var(--hd-fg);font:600 1.875rem/1.15 var(--hd-font-heading);letter-spacing:-.025em;text-wrap:balance;margin:0}.hd-lead{color:var(--hd-muted-fg);text-wrap:pretty;margin:.75rem 0 0;font-size:1.0625rem;line-height:1.6}.hd-title__row+.hd-lead{margin-top:.75rem}@media (width>=50em){.hd-title{padding-top:2.75rem}.hd-title__row{flex-direction:row;justify-content:space-between;align-items:flex-start;gap:1.5rem}.hd-title h1{font-size:2.25rem}.hd-lead{font-size:1.125rem}}.hd-page-actions{flex-shrink:0;order:2}.hd-title__row h1{order:1}@media (width<=49.99em){.hd-title__row{display:contents}.hd-title{flex-direction:column;display:flex}.hd-page-actions{order:3;margin-top:1rem}.hd-lead{order:2}.hd-eyebrow{order:0}}.hd-split{border:1px solid var(--hd-border);background:var(--hd-bg);border-radius:999px;align-items:stretch;height:2.125rem;display:inline-flex}.hd-split__main,.hd-split__more{color:var(--hd-fg);font:500 .8125rem/1 var(--hd-font-sans);cursor:pointer;background:0 0;border:0;align-items:center;gap:.4rem;transition:background-color .15s;display:inline-flex}.hd-split__main{border-radius:999px 0 0 999px;padding:0 .75rem 0 .875rem}.hd-split__more{border-inline-start:1px solid var(--hd-border);border-radius:0 999px 999px 0;height:100%;padding:0 .625rem 0 .5rem;list-style:none}.hd-split__more::-webkit-details-marker{display:none}.hd-split__main:hover,.hd-split__more:hover{background:var(--hd-muted)}.hd-split__main:active{transform:scale(.98)}.hd-menu{position:relative}.hd-menu__list{z-index:20;inset-inline-end:-1px;border:1px solid var(--hd-border);background:var(--hd-floating);width:17rem;box-shadow:var(--hd-shadow);transform-origin:100% 0;animation:hd-pop .15s var(--hd-ease-out);border-radius:1.25rem;gap:1px;margin:0;padding:.375rem;list-style:none;display:grid;position:absolute;top:calc(100% + .5rem)}@media (width<=49.99em){.hd-menu__list{transform-origin:0 0;inset-inline:0 auto}}.hd-menu__list :is(a,button){width:100%;color:var(--hd-muted-fg);font:inherit;text-align:start;cursor:pointer;background:0 0;border:0;border-radius:.875rem;align-items:flex-start;gap:.75rem;padding:.5rem .625rem;text-decoration:none;display:flex}.hd-menu__list .hd-icon{margin-top:.125rem}.hd-menu__list span{gap:.125rem;display:grid}.hd-menu__list strong{color:var(--hd-fg);font:500 .8125rem/1.3 var(--hd-font-sans)}.hd-menu__list small{font-size:.75rem;line-height:1.3}.hd-menu__list :is(a,button):hover{background:var(--hd-muted)}@keyframes hd-pop{0%{opacity:0;transform:scale(.97)translateY(-2px)}}.sl-markdown-content{color:var(--hd-fg-2);padding-top:2rem;font-size:1rem;line-height:1.75}.sl-markdown-content :is(h2,h3,h4,h5,h6){color:var(--hd-fg);font-family:var(--hd-font-heading);scroll-margin-top:calc(var(--hd-nav-h) + 1.5rem);font-weight:600}.sl-markdown-content h2{letter-spacing:-.02em;margin-top:2.75rem;font-size:1.5rem;line-height:1.3}.sl-markdown-content h3{letter-spacing:-.015em;margin-top:2rem;font-size:1.1875rem;line-height:1.4}.sl-markdown-content h4{margin-top:1.5rem;font-size:1rem}.sl-markdown-content :is(h2,h3,h4)+*{margin-top:.75rem}.sl-markdown-content :is(p,ul,ol,table,.hd-table,blockquote,figure,aside,details,.expressive-code)+:is(p,ul,ol,.hd-table,blockquote,figure,aside,details,.expressive-code,.hgdc-card-group,.hgdc-steps,starlight-tabs,hd-code-group){margin-top:1.25rem}.sl-markdown-content strong{color:var(--hd-fg);font-weight:600}.sl-markdown-content a:not(:where(.not-content *,.hgdc-card,.sl-anchor-link)){color:var(--hd-fg);text-decoration:underline;text-decoration-color:color-mix(in oklab, var(--hd-accent) 55%, transparent);text-underline-offset:.22em;font-weight:500;text-decoration-thickness:1px;transition:text-decoration-color .15s}.sl-markdown-content a:not(:where(.not-content *,.hgdc-card,.sl-anchor-link)):hover{text-decoration-color:var(--hd-accent);text-decoration-thickness:2px}.sl-markdown-content :is(ul,ol){padding-inline-start:1.375rem}.sl-markdown-content li+li{margin-top:.375rem}.sl-markdown-content li::marker{color:var(--hd-muted-fg)}.sl-markdown-content :not(pre)>code{border:1px solid var(--hd-border);background:var(--hd-muted);color:var(--hd-fg);font-family:var(--hd-font-mono);overflow-wrap:anywhere;border-radius:.45rem;padding:.125em .4em;font-size:.85em}.sl-markdown-content blockquote{border-inline-start:2px solid var(--hd-border-strong);color:var(--hd-muted-fg);margin-inline:0;padding-inline-start:1rem}.sl-markdown-content hr{border:0;border-top:1px solid var(--hd-border);margin-block:2.5rem}.sl-markdown-content .sl-anchor-link{color:var(--hd-muted-fg)}.sl-markdown-content .hd-table{border:1px solid var(--hd-border);border-radius:1rem;overflow-x:auto}.sl-markdown-content table{border-collapse:separate;border-spacing:0;border:0;width:100%;margin:0;font-size:.875rem;line-height:1.55;display:table}.sl-markdown-content :is(th,td){border:0;border-bottom:1px solid var(--hd-border);text-align:start;vertical-align:top;padding:.625rem .875rem}.sl-markdown-content tr:last-child td{border-bottom:0}.sl-markdown-content th{background:var(--hd-muted);color:var(--hd-fg);white-space:nowrap;font-weight:600}.sl-markdown-content td:first-child code{white-space:nowrap}.sl-markdown-content img{border-radius:1rem}.hd-zoomable{cursor:zoom-in}.hd-zoom{cursor:zoom-out;max-width:min(92vw,80rem);max-height:92dvh;animation:hd-zoom-in .22s var(--hd-ease-out);background:0 0;border:0;border-radius:1rem;padding:0}.hd-zoom img{border-radius:1rem;max-width:100%;max-height:92dvh;display:block}.hd-zoom::backdrop{background:oklch(0% 0 0/.7)}@keyframes hd-zoom-in{0%{opacity:0;transform:scale(.96)}}.sl-markdown-content .hd-endpoint{border:1px solid var(--hd-border);background:var(--hd-muted);letter-spacing:0;border-radius:1rem;flex-wrap:wrap;align-items:center;gap:.625rem;margin-top:3rem;padding:.5rem .75rem .5rem .5rem;font-size:1rem;line-height:1.4;display:flex}.hd-method{--tone:var(--hd-tone-info);background:color-mix(in oklab, var(--tone) 14%, transparent);height:1.625rem;color:var(--tone);font:700 .75rem/1 var(--hd-font-mono);letter-spacing:.02em;border-radius:.5rem;align-items:center;padding:0 .5rem;display:inline-flex}.hd-method[data-method=get]{--tone:var(--hd-tone-tip)}.hd-method[data-method=post]{--tone:var(--hd-tone-note)}.hd-method:is([data-method=put],[data-method=patch]){--tone:var(--hd-tone-warning)}.hd-method[data-method=delete]{--tone:var(--hd-tone-danger)}.sl-markdown-content .hd-endpoint .hd-path{color:var(--hd-fg);font:500 .9375rem/1.4 var(--hd-font-mono);overflow-wrap:anywhere;background:0 0;border:0;padding:0}.hd-path__param{text-decoration:underline dotted var(--hd-accent);text-underline-offset:.25em;text-decoration-thickness:2px}.sl-markdown-content .expressive-code,.expressive-code .frame{position:relative}.expressive-code .frame.has-title .header,.expressive-code .frame.is-terminal .header{min-height:2.5rem}.expressive-code .frame .header .title{font-weight:500}.expressive-code .copy{display:none!important}.hd-code-actions{top:.375rem;z-index:2;background:var(--hd-code-bg);border-radius:999px;gap:.125rem;padding:.125rem;display:flex;position:absolute;inset-inline-end:.375rem}.frame.has-title .hd-code-actions,.frame.is-terminal .hd-code-actions{background:0 0}.hd-code-action{width:1.875rem;height:1.875rem;color:var(--hd-muted-fg);cursor:pointer;background:0 0;border:0;border-radius:999px;place-items:center;transition:background-color .12s,color .12s;display:grid}.hd-code-action:hover{background:var(--hd-hover);color:var(--hd-fg)}.expressive-code .frame:not(.has-title):not(.is-terminal) pre{padding-inline-end:6.5rem}.hd-code-active pre,.hd-code-active .header{border-color:var(--hd-accent)!important}.hd-report{border:1px solid var(--hd-border);background:var(--hd-floating);box-shadow:var(--hd-shadow);animation:hd-pop .16s var(--hd-ease-out);border-radius:1.25rem;gap:.625rem;margin-top:.5rem;padding:1rem;display:grid}.hd-report__title{color:var(--hd-fg);font:600 .9375rem/1.4 var(--hd-font-heading);margin:0}.hd-report__hint{color:var(--hd-muted-fg);font-size:.875rem;line-height:1.5;margin:0!important}.hd-report textarea,.hgdc-feedback textarea{border:1px solid var(--hd-border-strong);background:var(--hd-bg);width:100%;min-height:5rem;color:var(--hd-fg);font:400 .875rem/1.5 var(--hd-font-sans);resize:vertical;border-radius:1rem;padding:.625rem .875rem;margin:0!important}.hd-report textarea:focus-visible,.hgdc-feedback textarea:focus-visible{border-color:var(--hd-accent);box-shadow:0 0 0 3px var(--hd-accent-soft);outline:none}.hd-report__actions{justify-content:flex-end;gap:.5rem;display:flex;margin:0!important}.hgdc-code-group{display:block}.hgdc-code-group:not([data-ready])>:not(:first-child){display:none}.hgdc-code-group[data-ready]{border:1px solid var(--hd-border);background:var(--hd-code-bg);border-radius:1rem;overflow:hidden}.hgdc-code-group[data-ready] .expressive-code{margin:0!important}.hgdc-code-group[data-ready] .expressive-code .frame pre,.hgdc-code-group[data-ready] .expressive-code .frame .header{border:0!important;border-radius:0!important}.hgdc-code-group[data-ready] .expressive-code .frame .header{display:none}.hgdc-code-group[data-ready] .hd-code-actions{background:0 0;top:-2.375rem}.hd-code-tabs{border-bottom:1px solid var(--hd-border);background:var(--hd-code-header);scrollbar-width:none;gap:.25rem;padding:0 7rem 0 .75rem;display:flex;overflow-x:auto}.hd-code-tabs button{height:2.5rem;color:var(--hd-muted-fg);font:500 .8125rem/1 var(--hd-font-sans);white-space:nowrap;cursor:pointer;background:0 0;border:0;padding:0 .5rem;position:relative}.hd-code-tabs button:hover,.hd-code-tabs button[aria-selected=true]{color:var(--hd-fg)}.hd-code-tabs button[aria-selected=true]:after{content:"";background:var(--hd-accent);border-radius:2px;height:2px;position:absolute;inset:auto .25rem -1px}.hd-code-tabs button:focus-visible{outline-offset:-2px}.hd-callout{--tone:var(--hd-tone-note);border:1px solid color-mix(in oklab, var(--tone) 22%, transparent);background:color-mix(in oklab, var(--tone) 7%, var(--hd-bg));color:var(--hd-fg-2);border-radius:1rem;gap:.75rem;padding:.875rem 1rem;font-size:.9375rem;line-height:1.65;display:flex}.hd-callout[data-tone=info]{--tone:var(--hd-tone-info);background:var(--hd-muted);border-color:var(--hd-border)}.hd-callout[data-tone=tip]{--tone:var(--hd-tone-tip)}.hd-callout[data-tone=check]{--tone:var(--hd-tone-check)}.hd-callout[data-tone=warning]{--tone:var(--hd-tone-warning)}.hd-callout[data-tone=danger]{--tone:var(--hd-tone-danger)}.hd-callout__icon{color:var(--tone);margin-top:.2rem}.hd-callout__body{flex:1;min-width:0;margin:0}.hd-callout__body>:first-child{margin-top:0}.hd-callout__body>*+*{margin-top:.5rem!important}.hd-callout__title{color:var(--hd-fg);margin:0;font-weight:600}.hgdc-steps{counter-reset:hgdc-step;margin:1.75rem 0 0;padding:0;list-style:none}.hgdc-step{counter-increment:hgdc-step;padding:0 0 1.5rem 2.75rem;position:relative}.hgdc-step+.hgdc-step{margin-top:0!important}.hgdc-step:before{content:counter(hgdc-step);border:1px solid var(--hd-border);background:var(--hd-muted);width:1.75rem;height:1.75rem;color:var(--hd-fg);font:600 .8125rem/1 var(--hd-font-heading);border-radius:999px;place-items:center;display:grid;position:absolute;inset:0 auto auto 0}.hgdc-step:not(:last-child):after{content:"";background:var(--hd-border);width:1px;position:absolute;inset:2.25rem auto .5rem .875rem}.hgdc-step__title{color:var(--hd-fg);font:600 1rem/1.5rem var(--hd-font-heading);letter-spacing:-.01em;margin:0;padding-top:.125rem}.hgdc-step__body{margin-top:.375rem!important}.hgdc-step__body>:last-child{margin-bottom:0}.hgdc-step__body>:first-child{margin-top:0}.hgdc-card-group{grid-template-columns:1fr;gap:1rem;margin-top:1.5rem;display:grid}@media (width>=40em){.hgdc-card-group{grid-template-columns:repeat(min(var(--hgdc-cols,2), 2), minmax(0, 1fr))}}@media (width>=64em){.hgdc-card-group{grid-template-columns:repeat(var(--hgdc-cols,2), minmax(0, 1fr))}}.hgdc-card{border:1px solid var(--hd-border);background:var(--hd-bg);color:var(--hd-muted-fg);transition:border-color .15s ease, background-color .15s ease, transform .16s var(--hd-ease-out);border-radius:1.25rem;flex-direction:column;gap:.375rem;padding:1.125rem 1.25rem 1.25rem;font-size:.9375rem;line-height:1.6;text-decoration:none;display:flex}.hgdc-card__title{color:var(--hd-fg);font:600 1rem/1.4 var(--hd-font-heading);letter-spacing:-.01em;justify-content:space-between;align-items:center;gap:.5rem;display:flex}.hgdc-card__arrow{color:var(--hd-muted-fg);opacity:0;transition:opacity .15s ease, transform .2s var(--hd-ease-out);transform:translate(-4px)}.hgdc-card__body>:first-child{margin-top:0}.hgdc-card__body>*+*{margin-top:.5rem!important}.hgdc-card__body img{border-radius:.5rem}.hgdc-card:has(.hgdc-card__body>img:first-child),.hgdc-card:has(.hgdc-card__body>p:first-child>img:first-child){flex-direction:column-reverse;justify-content:flex-end}a.hgdc-card:hover{border-color:var(--hd-border-strong);background:var(--hd-muted)}a.hgdc-card:hover .hgdc-card__arrow{opacity:1;transform:none}a.hgdc-card:active{transform:scale(.99)}.sl-markdown-content details.hgdc-accordion{padding-inline-start:0}.sl-markdown-content .hgdc-accordion>summary:before{display:none}.hgdc-accordion__body,.hgdc-step__body,.hgdc-card__body{margin-top:0}.hgdc-accordion{border:1px solid var(--hd-border);background:var(--hd-bg);border-radius:1rem}.hgdc-accordion summary{color:var(--hd-fg);font:500 .9375rem/1.4 var(--hd-font-sans);cursor:pointer;border-radius:1rem;align-items:center;gap:.625rem;padding:.875rem 1rem;list-style:none;display:flex}.hgdc-accordion summary::-webkit-details-marker{display:none}.hgdc-accordion summary:hover{background:var(--hd-hover)}.hgdc-accordion__chevron{color:var(--hd-muted-fg);transition:transform .2s var(--hd-ease-out)}.hgdc-accordion[open] .hgdc-accordion__chevron{transform:rotate(90deg)}.hgdc-accordion__body{padding:0 1rem 1rem 2.625rem}.hgdc-accordion__body>:first-child{margin-top:0}.hgdc-accordion-group{border:1px solid var(--hd-border);border-radius:1rem}.hgdc-accordion-group .hgdc-accordion{background:0 0;border:0;border-radius:0;margin:0!important}.hgdc-accordion-group .hgdc-accordion+.hgdc-accordion{border-top:1px solid var(--hd-border)}.hgdc-accordion-group .hgdc-accordion summary{border-radius:0}.hgdc-accordion-group .hgdc-accordion:first-child summary{border-radius:1rem 1rem 0 0}.hgdc-frame{border:1px solid var(--hd-border);background:var(--hd-muted);border-radius:1.25rem;margin-inline:0;padding:.5rem}.hgdc-frame :is(img,video){border-radius:.875rem;width:100%;display:block}.hgdc-frame figcaption{color:var(--hd-muted-fg);text-align:center;padding:.5rem .5rem .125rem;font-size:.8125rem}starlight-tabs .tablist-wrapper{border-bottom:1px solid var(--hd-border)}starlight-tabs [role=tablist]{gap:.5rem;border:0!important}starlight-tabs [role=tab]{color:var(--hd-muted-fg)!important;font:500 .875rem/1 var(--hd-font-sans)!important;border:0!important;border-bottom:2px solid #0000!important;margin:0!important;padding:.625rem .25rem!important}starlight-tabs [role=tab]:hover{color:var(--hd-fg)!important}starlight-tabs [role=tab][aria-selected=true]{border-bottom-color:var(--hd-accent)!important;color:var(--hd-fg)!important}starlight-tabs [role=tabpanel]{margin-top:1.25rem}.hgdc-feedback{border-top:1px solid var(--hd-border);margin-top:3.5rem;padding-top:1.5rem;display:block}.hgdc-feedback [hidden]{display:none!important}.hgdc-feedback [data-step=ask]{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.75rem;display:flex}.hgdc-feedback__question,.hgdc-feedback label{color:var(--hd-fg);font:500 .875rem/1.4 var(--hd-font-sans);margin:0}.hgdc-feedback__choices{gap:.5rem;display:flex;margin:0!important}.hgdc-feedback button{border:1px solid var(--hd-border);background:var(--hd-bg);height:2rem;color:var(--hd-fg);font:500 .8125rem/1 var(--hd-font-sans);cursor:pointer;transition:background-color .15s ease, transform .16s var(--hd-ease-out);border-radius:999px;align-items:center;gap:.375rem;padding:0 .875rem;display:inline-flex}.hgdc-feedback button:hover{background:var(--hd-muted)}.hgdc-feedback button:active{transform:scale(.97)}.hgdc-feedback button[type=submit]{border-color:var(--hd-accent);background:var(--hd-accent);color:var(--hd-accent-fg)}.hgdc-feedback form{gap:.625rem;display:grid}.hgdc-feedback__done{color:var(--hd-muted-fg);margin:0;font-size:.875rem}.hd-pagination{grid-template-columns:repeat(2,minmax(0,1fr));gap:1rem;margin-top:2rem;display:grid}.hd-pagination__link{border:1px solid var(--hd-border);color:var(--hd-fg);border-radius:1rem;gap:.25rem;padding:.875rem 1.125rem;text-decoration:none;transition:border-color .15s,background-color .15s;display:grid}.hd-pagination__link--next{text-align:end;grid-column:2}.hd-pagination__link:hover{border-color:var(--hd-border-strong);background:var(--hd-muted)}.hd-pagination__hint{color:var(--hd-muted-fg);align-items:center;gap:.25rem;font-size:.8125rem;display:inline-flex}.hd-pagination__link--next .hd-pagination__hint{justify-content:flex-end}.hd-pagination__title{font:500 .9375rem/1.35 var(--hd-font-heading)}.hd-site-footer{margin:2rem var(--hd-gutter) 0;border-top:1px solid var(--hd-border);gap:1.25rem;padding:2rem 0 2.5rem;display:grid}.hd-site-footer__row{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:1rem;display:flex}.hd-site-footer__row--meta p{max-width:32rem;color:var(--hd-muted-fg);margin:0;font-size:.875rem;line-height:1.55}.hd-brand--footer{margin-inline-start:-.5rem}.hd-brand--footer .hd-brand__name{font-size:.9375rem}.hd-socials{gap:.25rem;margin:0;padding:0;list-style:none;display:flex}.hd-palette{border:1px solid var(--hd-border);background:var(--hd-floating);width:min(40rem,100vw - 1.5rem);max-height:min(36rem,100dvh - 6rem);color:var(--hd-fg-2);box-shadow:var(--hd-shadow);border-radius:1.5rem;margin:min(12vh,7rem) auto auto;padding:0;overflow:hidden}.hd-palette::backdrop{background:var(--hd-backdrop)}.hd-palette[open] .hd-palette__box{max-height:inherit;flex-direction:column;display:flex}.hd-palette__field{border-bottom:1px solid var(--hd-border);color:var(--hd-muted-fg);align-items:center;gap:.75rem;padding:.875rem 1rem;display:flex}.hd-palette__field input{min-width:0;color:var(--hd-fg);font:400 1rem/1.5 var(--hd-font-sans);background:0 0;border:0;outline:none;flex:1}.hd-palette__field input::-webkit-search-cancel-button{display:none}.hd-palette__results{gap:1px;padding:.375rem;display:grid;overflow-y:auto}.hd-palette__results:empty{display:none}.hd-result{width:100%;color:inherit;font:inherit;text-align:start;cursor:pointer;background:0 0;border:0;border-radius:.875rem;gap:.75rem;padding:.625rem .75rem;text-decoration:none;display:flex}.hd-result[aria-selected=true]{background:var(--hd-muted)}.hd-result__icon{width:1.25rem;height:1.25rem;color:var(--hd-muted-fg);font:500 .875rem/1 var(--hd-font-mono);flex-shrink:0;place-items:center;margin-top:.0625rem;display:grid}.hd-result--page .hd-result__icon{background:currentColor;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8Zm0 0v5h5M9 13h6m-6 4h4'/%3E%3C/svg%3E") 50%/1.1rem no-repeat}.hd-result--ask .hd-result__icon{color:var(--hd-accent)}.hd-result__body{gap:.125rem;min-width:0;display:grid}.hd-result__title{color:var(--hd-fg);font:500 .9375rem/1.4 var(--hd-font-sans)}.hd-result__context{color:var(--hd-muted-fg);font-size:.75rem}.hd-result__excerpt{color:var(--hd-muted-fg);-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:.8125rem;line-height:1.5;display:-webkit-box;overflow:hidden}.hd-result__excerpt mark{color:var(--hd-accent);background:0 0;font-weight:500}.hd-palette__status{color:var(--hd-muted-fg);margin:0;padding:1rem 1.25rem;font-size:.875rem}.hd-palette__results:not(:empty)+.hd-palette__status{clip:rect(0, 0, 0, 0);width:1px;height:1px;position:absolute;overflow:hidden}.hd-palette__hints{border-top:1px solid var(--hd-border);color:var(--hd-muted-fg);gap:1.25rem;padding:.625rem 1rem;font-size:.75rem;display:none}.hd-palette__hints span{align-items:center;gap:.25rem;display:inline-flex}@media (width>=50em){.hd-palette__hints{display:flex}}.hd-askbar{z-index:10;width:min(var(--hd-content-w), calc(100% - 2 * var(--hd-gutter)));border:1px solid var(--hd-border-strong);background:var(--hd-floating);height:3.25rem;box-shadow:var(--hd-shadow);transition:opacity .2s ease, transform .3s var(--hd-ease-out), border-color .15s ease;border-radius:999px;align-items:center;gap:.5rem;margin:2rem auto 0;padding:0 .5rem 0 1.25rem;display:flex;position:sticky;bottom:1rem}.hd-askbar:focus-within{border-color:var(--hd-accent)}.hd-askbar input{min-width:0;height:100%;color:var(--hd-fg);font:400 .9375rem/1 var(--hd-font-sans);background:0 0;border:0;outline:none;flex:1}.hd-askbar input::placeholder{color:var(--hd-muted-fg)}:root[data-hgdc-assistant] .hd-askbar{opacity:0;pointer-events:none;transform:translateY(.5rem)}@media (width<=49.99em){.hd-askbar{height:3rem;bottom:.75rem}.hd-askbar .hd-kbd{display:none}}.hd-send{background:var(--hd-accent);width:2.25rem;height:2.25rem;color:var(--hd-accent-fg);cursor:pointer;transition:opacity .15s ease, transform .16s var(--hd-ease-out);border:0;border-radius:999px;flex-shrink:0;place-items:center;display:grid}.hd-send:active{transform:scale(.94)}.hd-send:disabled{opacity:.4;cursor:default}hgdc-assistant{display:block}hgdc-assistant:before{content:"";z-index:44;background:var(--hd-backdrop);opacity:0;pointer-events:none;transition:opacity .3s;position:fixed;inset:0}.hgdc-panel{z-index:45;border:1px solid var(--hd-border);background:var(--hd-bg);height:min(88dvh,44rem);box-shadow:var(--hd-shadow);visibility:hidden;transition:transform .38s var(--hd-ease-drawer), visibility 0s linear .38s;border-bottom:0;border-radius:1.5rem 1.5rem 0 0;flex-direction:column;display:flex;position:fixed;inset:auto 0 0;transform:translateY(100%)}:root[data-hgdc-assistant] .hgdc-panel{visibility:visible;transition:transform .38s var(--hd-ease-drawer), visibility 0s;transform:none}@media (width<=49.99em){:root[data-hgdc-assistant] hgdc-assistant:before{opacity:1;pointer-events:auto}}.hgdc-panel__grip{background:var(--hd-border-strong);border-radius:999px;width:2.5rem;height:.3125rem;margin:.5rem auto 0}@media (width>=50em){.hgdc-panel{inset:var(--hd-nav-h) 0 0 auto;width:var(--hd-panel-w);border:0;border-inline-start:1px solid var(--hd-border);border-radius:0;height:auto;transform:translate(100%)}.hgdc-panel__grip{display:none}}@media (width>=50em) and (width<=63.99em){:root[data-hgdc-assistant] .hgdc-panel{box-shadow:var(--hd-shadow)}}@media (width>=64em){.hgdc-panel{box-shadow:none}:root[data-hgdc-assistant] .hd-main-frame{margin-inline-end:var(--hd-panel-w)}:root[data-hgdc-assistant] .hd-columns--toc{grid-template-columns:minmax(0,1fr) 0}:root[data-hgdc-assistant] .hd-columns__toc{visibility:hidden}}@media (prefers-reduced-motion:reduce){.hgdc-panel,:root[data-hgdc-assistant] .hgdc-panel,.hd-main-frame,.hd-sidebar .sidebar-pane{transition-duration:0s!important}.hd-askbar{transition:opacity .15s;transform:none!important}}.hgdc-panel__header{justify-content:space-between;align-items:center;gap:.5rem;padding:.625rem .75rem .625rem 1.25rem;display:flex}.hgdc-panel__header h2{color:var(--hd-fg);font:600 1rem/1.3 var(--hd-font-heading);align-items:center;gap:.5rem;margin:0;display:flex}.hgdc-panel__header h2 .hd-icon{color:var(--hd-accent)}.hgdc-panel__tools{gap:.125rem;display:flex}.hgdc-panel__tools [hidden]{display:none}.hgdc-panel__body{overscroll-behavior:contain;flex-direction:column;flex:1;gap:1rem;padding:.5rem 1.25rem 1rem;display:flex;overflow-y:auto}.hgdc-empty{color:var(--hd-muted-fg);text-align:center;margin:auto 0;padding:1rem 0;font-size:.875rem;line-height:1.6}.hgdc-empty[hidden]{display:none}.hgdc-empty p{margin:0}.hgdc-empty__title{color:var(--hd-fg);font:600 1rem/1.4 var(--hd-font-heading);margin-bottom:.375rem!important}.hgdc-msg{color:var(--hd-fg-2);overflow-wrap:anywhere;font-size:.9375rem;line-height:1.65}.hgdc-msg>:first-child{margin-top:0}.hgdc-msg :is(p,ul,ol,pre,h3){margin:.5rem 0 0}.hgdc-msg :is(ul,ol){padding-inline-start:1.25rem}.hgdc-msg h3{color:var(--hd-fg);font:600 .9375rem/1.4 var(--hd-font-heading)}.hgdc-msg pre{border:1px solid var(--hd-border);background:var(--hd-code-bg);border-radius:.875rem;padding:.75rem .875rem;overflow-x:auto}.hgdc-msg code{font-family:var(--hd-font-mono);font-size:.8125rem}.hgdc-msg :not(pre)>code{background:var(--hd-muted);border-radius:.375rem;padding:.1em .35em}.hgdc-msg a{color:var(--hd-fg);text-decoration-color:var(--hd-accent);text-underline-offset:.2em}.hgdc-msg--user{background:var(--hd-muted);max-width:85%;color:var(--hd-fg);border-radius:1.25rem 1.25rem .375rem;align-self:flex-end;padding:.5rem .875rem}.hgdc-msg--pending{color:var(--hd-muted-fg);animation:1.6s ease-in-out infinite hgdc-breathe}@keyframes hgdc-breathe{50%{opacity:.5}}@media (prefers-reduced-motion:reduce){.hgdc-msg--pending{animation:none}}.hgdc-msg--error p{color:var(--hd-tone-danger)}.hgdc-retry{border:1px solid var(--hd-border);background:var(--hd-bg);height:2rem;color:var(--hd-fg);font:500 .8125rem/1 var(--hd-font-sans);cursor:pointer;border-radius:999px;margin-top:.5rem;padding:0 .875rem}.hgdc-ref{background:var(--hd-accent-soft);min-width:1.125rem;height:1.125rem;font:600 .6875rem/1 var(--hd-font-sans);vertical-align:.15em;border-radius:999px;place-items:center;margin-inline:.125rem;padding:0 .25rem;display:inline-grid;color:var(--hd-accent)!important;text-decoration:none!important}.hgdc-sources__label{color:var(--hd-muted-fg);font:500 .75rem/1 var(--hd-font-sans);margin-top:.875rem!important}.hgdc-sources{gap:.375rem;list-style:none;display:grid;margin-top:.5rem!important;padding:0!important}.hgdc-sources a{border:1px solid var(--hd-border);color:var(--hd-fg);border-radius:.875rem;flex-wrap:wrap;align-items:baseline;gap:.375rem;padding:.5rem .75rem;font-size:.8125rem;text-decoration:none;display:flex}.hgdc-sources a:hover{background:var(--hd-muted)}.hgdc-sources__n{color:var(--hd-accent);font-weight:600}.hgdc-sources__section{color:var(--hd-muted-fg);flex-basis:100%;font-size:.75rem}.hgdc-panel__form{border:1px solid var(--hd-border-strong);background:var(--hd-bg);border-radius:1.5rem;align-items:flex-end;gap:.5rem;margin:0 .75rem;padding:.5rem .5rem .5rem 1rem;transition:border-color .15s;display:flex}.hgdc-panel__form:focus-within{border-color:var(--hd-accent)}.hgdc-panel__form textarea{min-height:2.25rem;max-height:10rem;color:var(--hd-fg);font:400 .9375rem/1.4 var(--hd-font-sans);resize:none;background:0 0;border:0;outline:none;flex:1;padding:.5rem 0}.hgdc-panel__note{color:var(--hd-muted-fg);text-align:center;margin:0;padding:.5rem 1.25rem .875rem;font-size:.6875rem;line-height:1.45}@media (pointer:coarse){.hd-nav__link{min-height:2.75rem}.hd-icon-button,.hd-search-trigger{width:2.75rem;height:2.75rem}}@media print{.hd-topbar,.hd-sidebar,.hd-columns__toc,.hd-askbar,hgdc-assistant,.hd-site-footer,.hd-page-actions,.hgdc-feedback{display:none!important}.hd-main-frame{margin:0!important;padding:0!important}}@layer starlight.base{:root,::backdrop{--sl-color-white:#fff;--sl-color-gray-1:#edeef3;--sl-color-gray-2:#c1c3c8;--sl-color-gray-3:#888c96;--sl-color-gray-4:#555962;--sl-color-gray-5:#353841;--sl-color-gray-6:#23262f;--sl-color-black:#17181c;--sl-hue-orange:41;--sl-color-orange-low:hsl(var(--sl-hue-orange), 39%, 22%);--sl-color-orange:hsl(var(--sl-hue-orange), 82%, 63%);--sl-color-orange-high:hsl(var(--sl-hue-orange), 82%, 87%);--sl-hue-green:101;--sl-color-green-low:hsl(var(--sl-hue-green), 39%, 22%);--sl-color-green:hsl(var(--sl-hue-green), 82%, 63%);--sl-color-green-high:hsl(var(--sl-hue-green), 82%, 80%);--sl-hue-blue:234;--sl-color-blue-low:hsl(var(--sl-hue-blue), 54%, 20%);--sl-color-blue:hsl(var(--sl-hue-blue), 100%, 60%);--sl-color-blue-high:hsl(var(--sl-hue-blue), 100%, 87%);--sl-hue-purple:281;--sl-color-purple-low:hsl(var(--sl-hue-purple), 39%, 22%);--sl-color-purple:hsl(var(--sl-hue-purple), 82%, 63%);--sl-color-purple-high:hsl(var(--sl-hue-purple), 82%, 89%);--sl-hue-red:339;--sl-color-red-low:hsl(var(--sl-hue-red), 39%, 22%);--sl-color-red:hsl(var(--sl-hue-red), 82%, 63%);--sl-color-red-high:hsl(var(--sl-hue-red), 82%, 87%);--sl-color-accent-low:#17264f;--sl-color-accent:#3369ff;--sl-color-accent-high:#b3c7ff;--sl-color-text:var(--sl-color-gray-2);--sl-color-text-accent:var(--sl-color-accent-high);--sl-color-text-invert:var(--sl-color-accent-low);--sl-color-bg:var(--sl-color-black);--sl-color-bg-nav:var(--sl-color-gray-6);--sl-color-bg-sidebar:var(--sl-color-gray-6);--sl-color-bg-inline-code:var(--sl-color-gray-5);--sl-color-bg-accent:var(--sl-color-accent-high);--sl-color-hairline-light:var(--sl-color-gray-5);--sl-color-hairline:var(--sl-color-gray-6);--sl-color-hairline-shade:var(--sl-color-black);--sl-color-backdrop-overlay:#16181da8;--sl-shadow-sm:0px 1px 1px #0000001f, 0px 2px 1px #0000003d;--sl-shadow-md:0px 8px 4px #00000014, 0px 5px 2px #00000014, 0px 3px 2px #0000001f, 0px 1px 1px #00000026;--sl-shadow-lg:0px 25px 7px #00000008, 0px 16px 6px #0000001a, 0px 9px 5px #16181d54, 0px 4px 4px #000000bf, 0px 4px 2px #00000040;--sl-text-2xs:.75rem;--sl-text-xs:.8125rem;--sl-text-sm:.875rem;--sl-text-base:1rem;--sl-text-lg:1.125rem;--sl-text-xl:1.25rem;--sl-text-2xl:1.5rem;--sl-text-3xl:1.8125rem;--sl-text-4xl:2.1875rem;--sl-text-5xl:2.625rem;--sl-text-6xl:4rem;--sl-text-body:var(--sl-text-base);--sl-text-body-sm:var(--sl-text-xs);--sl-text-code:var(--sl-text-sm);--sl-text-code-sm:var(--sl-text-xs);--sl-text-h1:var(--sl-text-4xl);--sl-text-h2:var(--sl-text-3xl);--sl-text-h3:var(--sl-text-2xl);--sl-text-h4:var(--sl-text-xl);--sl-text-h5:var(--sl-text-lg);--sl-line-height:1.75;--sl-line-height-headings:1.2;--sl-font-system:-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";--sl-font-system-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--__sl-font:var(--sl-font,var(--sl-font-system)), var(--sl-font-system);--__sl-font-mono:var(--sl-font-mono,var(--sl-font-system-mono)), var(--sl-font-system-mono);--sl-nav-height:3.5rem;--sl-nav-pad-x:1rem;--sl-nav-pad-y:.75rem;--sl-mobile-toc-height:3rem;--sl-sidebar-width:18.75rem;--sl-sidebar-pad-x:1rem;--sl-content-width:45rem;--sl-content-pad-x:1rem;--sl-content-gap-y:1rem;--sl-main-pad:0 0 3vh 0;--sl-menu-button-size:2rem;--sl-nav-gap:var(--sl-content-pad-x);--sl-outline-offset-inside:-.1875rem;--sl-z-index-toc:4;--sl-z-index-menu:5;--sl-z-index-navbar:10;--sl-z-index-skiplink:20}:root[data-theme=light],[data-theme=light] ::backdrop{--sl-color-white:#17181c;--sl-color-gray-1:#23262f;--sl-color-gray-2:#353841;--sl-color-gray-3:#555962;--sl-color-gray-4:#888c96;--sl-color-gray-5:#c1c3c8;--sl-color-gray-6:#edeef3;--sl-color-gray-7:#f6f7f9;--sl-color-black:#fff;--sl-color-orange-high:hsl(var(--sl-hue-orange), 80%, 25%);--sl-color-orange:hsl(var(--sl-hue-orange), 90%, 60%);--sl-color-orange-low:hsl(var(--sl-hue-orange), 90%, 88%);--sl-color-green-high:hsl(var(--sl-hue-green), 80%, 22%);--sl-color-green:hsl(var(--sl-hue-green), 90%, 46%);--sl-color-green-low:hsl(var(--sl-hue-green), 85%, 90%);--sl-color-blue-high:hsl(var(--sl-hue-blue), 80%, 30%);--sl-color-blue:hsl(var(--sl-hue-blue), 90%, 60%);--sl-color-blue-low:hsl(var(--sl-hue-blue), 88%, 90%);--sl-color-purple-high:hsl(var(--sl-hue-purple), 90%, 30%);--sl-color-purple:hsl(var(--sl-hue-purple), 90%, 60%);--sl-color-purple-low:hsl(var(--sl-hue-purple), 80%, 90%);--sl-color-red-high:hsl(var(--sl-hue-red), 80%, 30%);--sl-color-red:hsl(var(--sl-hue-red), 90%, 60%);--sl-color-red-low:hsl(var(--sl-hue-red), 80%, 90%);--sl-color-accent-high:#0f1c8a;--sl-color-accent:#3d50f5;--sl-color-accent-low:#cfd4fc;--sl-color-text-accent:var(--sl-color-accent);--sl-color-text-invert:var(--sl-color-black);--sl-color-bg-nav:var(--sl-color-gray-7);--sl-color-bg-sidebar:var(--sl-color-bg);--sl-color-bg-inline-code:var(--sl-color-gray-6);--sl-color-bg-accent:var(--sl-color-accent);--sl-color-hairline-light:var(--sl-color-gray-6);--sl-color-hairline-shade:var(--sl-color-gray-6);--sl-color-backdrop-overlay:#545864a8;--sl-shadow-sm:0px 1px 1px #0000000f, 0px 2px 1px #0000000f;--sl-shadow-md:0px 8px 4px #00000008, 0px 5px 2px #00000008, 0px 3px 2px #0000000f, 0px 1px 1px #0000000f;--sl-shadow-lg:0px 25px 7px #00000003, 0px 16px 6px #00000008, 0px 9px 5px #16181d14, 0px 4px 4px #00000029, 0px 4px 2px #0000000a}@media (width>=50em){:root{--sl-nav-height:4rem;--sl-nav-pad-x:1.5rem;--sl-text-h1:var(--sl-text-5xl);--sl-text-h2:var(--sl-text-4xl);--sl-text-h3:var(--sl-text-3xl);--sl-text-h4:var(--sl-text-2xl)}}@media (width>=72rem){:root{--sl-content-pad-x:1.5rem;--sl-mobile-toc-height:0rem}}}@layer starlight.reset{*,:before,:after{box-sizing:border-box}*{margin:0}html{color-scheme:dark;accent-color:var(--sl-color-accent);-webkit-text-size-adjust:100%;text-size-adjust:100%}html[data-theme=light]{color-scheme:light}body{font-family:var(--__sl-font);line-height:var(--sl-line-height);-webkit-font-smoothing:antialiased;color:var(--sl-color-text);background-color:var(--sl-color-bg)}[lang]:where(:lang(zh),:lang(ja)){text-autospace:normal}[lang]:where(:not(:lang(zh),:lang(ja))){text-autospace:initial}pre,code,samp,kbd{text-autospace:no-autospace}input,button,textarea,select{font:inherit}p,h1,h2,h3,h4,h5,h6,code{overflow-wrap:break-word}code{font-family:var(--__sl-font-mono)}}@layer starlight.core{.sl-banner:where(.astro-cfbktusy){--__sl-banner-text:var(--sl-color-banner-text,var(--sl-color-text-invert));padding:var(--sl-nav-pad-y) var(--sl-nav-pad-x);background-color:var(--sl-color-banner-bg,var(--sl-color-bg-accent));color:var(--__sl-banner-text);line-height:var(--sl-line-height-headings);text-align:center;text-wrap:balance;box-shadow:var(--sl-shadow-sm)}.sl-banner:where(.astro-cfbktusy) a{color:var(--__sl-banner-text)}.content-panel:where(.astro-64cflj2q){padding:1.5rem var(--sl-content-pad-x)}.content-panel:where(.astro-64cflj2q)+.content-panel:where(.astro-64cflj2q){border-top:1px solid var(--sl-color-hairline)}.sl-container:where(.astro-64cflj2q){max-width:var(--sl-content-width)}.sl-container:where(.astro-64cflj2q)>*+*{margin-top:1.5rem}@media (width>=72rem){.sl-container:where(.astro-64cflj2q){margin-inline:var(--sl-content-margin-inline,auto)}}p:where(.astro-fuvyun7g){border:1px solid var(--sl-color-orange);background-color:var(--sl-color-orange-low);color:var(--sl-color-orange-high);width:max-content;max-width:100%;font-size:var(--sl-text-body-sm);line-height:var(--sl-line-height-headings);text-align:start;align-items:center;gap:.75em;padding:.75em 1em}.hero:where(.astro-6c7bdrny){grid-template-columns:100%;align-items:center;gap:1rem;padding-bottom:1rem;display:grid}.hero:where(.astro-6c7bdrny)>img:where(.astro-6c7bdrny),.hero:where(.astro-6c7bdrny)>.hero-html:where(.astro-6c7bdrny){object-fit:contain;width:min(70%,20rem);height:auto;margin-inline:auto}.stack:where(.astro-6c7bdrny){text-align:center;flex-direction:column;gap:clamp(1.5rem,1.5rem + 1vw,2rem)}.copy:where(.astro-6c7bdrny){flex-direction:column;align-items:center;gap:1rem}.copy:where(.astro-6c7bdrny)>:where(.astro-6c7bdrny){max-width:50ch}h1:where(.astro-6c7bdrny){font-size:clamp(var(--sl-text-3xl), calc(.25rem + 5vw), var(--sl-text-6xl));line-height:var(--sl-line-height-headings);color:var(--sl-color-white);font-weight:600}.tagline:where(.astro-6c7bdrny){font-size:clamp(var(--sl-text-base), calc(.0625rem + 2vw), var(--sl-text-xl));color:var(--sl-color-gray-2)}.actions:where(.astro-6c7bdrny){flex-wrap:wrap;justify-content:center;gap:1rem 2rem}@media (width>=50rem){.hero:where(.astro-6c7bdrny){grid-template-columns:7fr 4fr;gap:3%;padding-block:clamp(2.5rem,1rem + 10vmin,10rem)}.hero:where(.astro-6c7bdrny)>img:where(.astro-6c7bdrny),.hero:where(.astro-6c7bdrny)>.hero-html:where(.astro-6c7bdrny){order:2;width:min(100%,25rem)}.stack:where(.astro-6c7bdrny){text-align:start}.copy:where(.astro-6c7bdrny){align-items:flex-start}.actions:where(.astro-6c7bdrny){justify-content:flex-start}}ul:where(.astro-jxyovztp){padding:0;list-style:none}a:where(.astro-jxyovztp){--pad-inline:.5rem;padding-block:.25rem;padding-inline:calc(1rem * var(--depth) + var(--pad-inline)) var(--pad-inline);border-radius:.25rem;line-height:1.25;display:block}a:where(.astro-jxyovztp)[aria-current=true]{color:var(--sl-color-text-accent)}.isMobile:where(.astro-jxyovztp) a:where(.astro-jxyovztp){--pad-inline:1rem;justify-content:space-between;gap:var(--pad-inline);border-top:1px solid var(--sl-color-gray-6);color:var(--sl-color-text);font-size:var(--sl-text-sm);outline-offset:var(--sl-outline-offset-inside);border-radius:0;padding-block:.5rem;text-decoration:none;display:flex}.isMobile:where(.astro-jxyovztp):first-child>li:where(.astro-jxyovztp):first-child>a:where(.astro-jxyovztp){border-top:0}.isMobile:where(.astro-jxyovztp) a:where(.astro-jxyovztp)[aria-current=true],.isMobile:where(.astro-jxyovztp) a:where(.astro-jxyovztp)[aria-current=true]:hover,.isMobile:where(.astro-jxyovztp) a:where(.astro-jxyovztp)[aria-current=true]:focus{color:var(--sl-color-white);background-color:unset}.isMobile:where(.astro-jxyovztp) a:where(.astro-jxyovztp)[aria-current=true]:after{content:"";background-color:var(--sl-color-text-accent);flex-shrink:0;width:1rem;-webkit-mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxNCAxNCc+PHBhdGggZD0nTTEwLjkxNCA0LjIwNmEuNTgzLjU4MyAwIDAgMC0uODI4IDBMNS43NCA4LjU1NyAzLjkxNCA2LjcyNmEuNTk2LjU5NiAwIDAgMC0uODI4Ljg1N2wyLjI0IDIuMjRhLjU4My41ODMgMCAwIDAgLjgyOCAwbDQuNzYtNC43NmEuNTgzLjU4MyAwIDAgMCAwLS44NTdaJy8+PC9zdmc+Cg==);mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxNCAxNCc+PHBhdGggZD0nTTEwLjkxNCA0LjIwNmEuNTgzLjU4MyAwIDAgMC0uODI4IDBMNS43NCA4LjU1NyAzLjkxNCA2LjcyNmEuNTk2LjU5NiAwIDAgMC0uODI4Ljg1N2wyLjI0IDIuMjRhLjU4My41ODMgMCAwIDAgLjgyOCAwbDQuNzYtNC43NmEuNTgzLjU4MyAwIDAgMCAwLS44NTdaJy8+PC9zdmc+Cg==);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}a:where(.astro-k4td3kwj){clip:rect(0, 0, 0, 0);top:.75rem;position:fixed;inset-inline-start:.75rem}a:where(.astro-k4td3kwj):focus{clip:unset;z-index:var(--sl-z-index-skiplink);color:var(--sl-color-text-invert);background-color:var(--sl-color-text-accent);box-shadow:var(--sl-shadow-lg);padding:.5rem 1rem;text-decoration:none;display:block}}@layer starlight.content{.sl-markdown-content .sl-heading-wrapper{--sl-anchor-icon-size:.8275em;--sl-anchor-icon-gap:.25em;--sl-anchor-icon-space:calc(var(--sl-anchor-icon-size) + var(--sl-anchor-icon-gap));line-height:var(--sl-line-height-headings)}.sl-markdown-content .sl-heading-wrapper:has(>:first-child:is(.sr-only,[hidden])){display:contents}.sl-markdown-content :not(h1,h2,h3,h4,h5,h6,.sl-heading-wrapper)+.sl-heading-wrapper{margin-top:1.5em}.sl-markdown-content .sl-heading-wrapper.level-h1{font-size:var(--sl-text-h1)}.sl-markdown-content .sl-heading-wrapper.level-h2{font-size:var(--sl-text-h2)}.sl-markdown-content .sl-heading-wrapper.level-h3{font-size:var(--sl-text-h3)}.sl-markdown-content .sl-heading-wrapper.level-h4{font-size:var(--sl-text-h4)}.sl-markdown-content .sl-heading-wrapper.level-h5{font-size:var(--sl-text-h5)}.sl-markdown-content .sl-heading-wrapper.level-h6{font-size:var(--sl-text-h6)}.sl-markdown-content .sl-heading-wrapper>:first-child:not([hidden]){padding-inline-end:var(--sl-anchor-icon-space);display:inline}.sl-markdown-content .sl-anchor-link{-webkit-user-select:none;user-select:none;margin-inline-start:calc(-1 * var(--sl-anchor-icon-size));display:inline-flex;position:relative}.sl-markdown-content .sl-heading-wrapper:has(>:first-child:is(.sr-only,[hidden]))>.sl-anchor-link{display:none}.sl-markdown-content .sl-anchor-link:after{content:"";position:absolute;inset:-.25rem -.5rem}.sl-markdown-content .sl-anchor-icon>svg{width:var(--sl-anchor-icon-size);vertical-align:top;transform:translateY(calc((var(--sl-line-height-headings) * 1em - var(--sl-anchor-icon-size)) / 2));display:inline;overflow:visible}@media (hover:hover){.sl-markdown-content .sl-anchor-link{opacity:0}.sl-markdown-content .sl-anchor-link:focus,.sl-markdown-content .sl-heading-wrapper:hover .sl-anchor-link{opacity:1}}.sl-markdown-content :not(a,strong,em,del,span,input,code,br)+:not(a,strong,em,del,span,input,code,br,:where(.not-content *)),.sl-markdown-content :not(a,strong,em,del,span,input,code,br)+:is(astro-island,astro-slot)>:not(a,strong,em,del,span,input,code,br,:where(.not-content *)):first-child{margin-top:var(--sl-content-gap-y)}.sl-markdown-content :not(h1,h2,h3,h4,h5,h6)+:is(h1,h2,h3,h4,h5,h6):not(:where(.not-content *)){margin-top:1.5em}.sl-markdown-content li+li:not(:where(.not-content *)),.sl-markdown-content dt+dt:not(:where(.not-content *)),.sl-markdown-content dt+dd:not(:where(.not-content *)),.sl-markdown-content dd+dd:not(:where(.not-content *)){margin-top:.25rem}.sl-markdown-content li:not(:where(.not-content *)){overflow-wrap:anywhere}.sl-markdown-content :is(ol,ul):has(>li>:not(a,strong,em,del,span,input,code,br,script,ol,ul))>li>:is(:last-child:not(a,strong,em,del,span,input,code,br,script,:where(.not-content *)),:not(script):has(~script:last-child):not(:has(~:not(script)))){margin-bottom:1.25rem}.sl-markdown-content dt:not(:where(.not-content *)){font-weight:700}.sl-markdown-content dd:not(:where(.not-content *)){padding-inline-start:1rem}.sl-markdown-content :is(h1,h2,h3,h4,h5,h6):not(:where(.not-content *)){color:var(--sl-color-white);line-height:var(--sl-line-height-headings);font-weight:600}.sl-markdown-content :is(img,picture,video,canvas,svg,iframe):not(:where(.not-content *)){max-width:100%;height:auto;display:block}.sl-markdown-content h1:not(:where(.not-content *)){font-size:var(--sl-text-h1)}.sl-markdown-content h2:not(:where(.not-content *)){font-size:var(--sl-text-h2)}.sl-markdown-content h3:not(:where(.not-content *)){font-size:var(--sl-text-h3)}.sl-markdown-content h4:not(:where(.not-content *)){font-size:var(--sl-text-h4)}.sl-markdown-content h5:not(:where(.not-content *)){font-size:var(--sl-text-h5)}.sl-markdown-content h6:not(:where(.not-content *)){font-size:var(--sl-text-h6)}.sl-markdown-content a:not(:where(.not-content *)){color:var(--sl-color-text-accent)}.sl-markdown-content a:hover:not(:where(.not-content *)){color:var(--sl-color-white)}.sl-markdown-content code:not(:where(.not-content *)){background-color:var(--sl-color-bg-inline-code);font-size:var(--sl-text-code-sm);margin-block:-.125rem;padding:.125rem .375rem}.sl-markdown-content :is(h1,h2,h3,h4,h5,h6) code{font-size:inherit}.sl-markdown-content pre:not(:where(.not-content *)){border:1px solid var(--sl-color-gray-5);font-size:var(--sl-text-code);tab-size:2;padding:.75rem 1rem}.sl-markdown-content pre code:not(:where(.not-content *)){all:unset;font-family:var(--__sl-font-mono)}.sl-markdown-content blockquote:not(:where(.not-content *)){border-inline-start:1px solid var(--sl-color-gray-5);padding-inline-start:1rem}.sl-markdown-content table:not(:where(.not-content *)){border-spacing:0;display:block;overflow:auto}.sl-markdown-content :is(th,td):not(:where(.not-content *)){border-bottom:1px solid var(--sl-color-gray-5);vertical-align:baseline;padding:.5rem 1rem}.sl-markdown-content :is(th:first-child,td:first-child):not(:where(.not-content *)){padding-inline-start:0}.sl-markdown-content :is(th:last-child,td:last-child):not(:where(.not-content *)){padding-inline-end:0}.sl-markdown-content th:not(:where(.not-content *)){color:var(--sl-color-white);font-weight:600}.sl-markdown-content th:not([align]):not(:where(.not-content *)){text-align:start}.sl-markdown-content .starlight-aside :is(th,td,hr,blockquote):not(:where(.not-content *)){border-color:var(--sl-color-gray-4)}@supports (border-color:color-mix(in srgb, var(--sl-color-asides-text-accent) 30%, transparent)
2
- ){.sl-markdown-content .starlight-aside :is(th,td,hr,blockquote):not(:where(.not-content *)){border-color:color-mix(in srgb, var(--sl-color-asides-text-accent) 30%, transparent)}}@supports (border-color:color-mix(in srgb, var(--sl-color-asides-text-accent) 12%, transparent)
3
- ){.sl-markdown-content .starlight-aside code:not(:where(.not-content *)){background-color:color-mix(in srgb, var(--sl-color-asides-text-accent) 12%, transparent)}}.sl-markdown-content hr:not(:where(.not-content *)){border:0;border-bottom:1px solid var(--sl-color-hairline)}.sl-markdown-content details:not(:where(.not-content *)){--sl-details-border-color:var(--sl-color-gray-5);--sl-details-border-color--hover:var(--sl-color-text-accent);border-inline-start:2px solid var(--sl-details-border-color);padding-inline-start:1rem}.sl-markdown-content details:not([open]):hover:not(:where(.not-content *)),.sl-markdown-content details:has(>summary:hover):not(:where(.not-content *)){border-color:var(--sl-details-border-color--hover)}.sl-markdown-content summary:not(:where(.not-content *)){color:var(--sl-color-white);cursor:pointer;margin-inline-start:-.5rem;padding-inline-start:.5rem;font-weight:600;display:block}.sl-markdown-content details[open]>summary:not(:where(.not-content *)){margin-bottom:1rem}.sl-markdown-content summary:not(:where(.not-content *))::marker,.sl-markdown-content summary:not(:where(.not-content *))::-webkit-details-marker{display:none}.sl-markdown-content summary:not(:where(.not-content *)):before{--sl-details-marker-size:1.25rem;content:"";height:var(--sl-details-marker-size);width:var(--sl-details-marker-size);margin-inline:calc((var(--sl-details-marker-size) / 4) * -1) .25rem;vertical-align:middle;background-color:currentColor;display:inline-block;-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M14.8 11.3 10.6 7a1 1 0 1 0-1.4 1.5l3.5 3.5-3.5 3.5a1 1 0 0 0 0 1.4 1 1 0 0 0 .7.3 1 1 0 0 0 .7-.3l4.2-4.2a1 1 0 0 0 0-1.4Z'/%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M14.8 11.3 10.6 7a1 1 0 1 0-1.4 1.5l3.5 3.5-3.5 3.5a1 1 0 0 0 0 1.4 1 1 0 0 0 .7.3 1 1 0 0 0 .7-.3l4.2-4.2a1 1 0 0 0 0-1.4Z'/%3E%3C/svg%3E%0A");-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}@media (prefers-reduced-motion:no-preference){.sl-markdown-content summary:not(:where(.not-content *)):before{transition:transform .2s ease-in-out}}.sl-markdown-content details[open]>summary:not(:where(.not-content *)):before{transform:rotate(90deg)}[dir=rtl] .sl-markdown-content summary:not(:where(.not-content *)):before,.sl-markdown-content [dir=rtl] summary:not(:where(.not-content *)):before{transform:rotate(180deg)}.sl-markdown-content summary:not(:where(.not-content *)) p:only-child{display:inline}.sl-markdown-content .starlight-aside details:not(:where(.not-content *)){--sl-details-border-color:var(--sl-color-asides-border);--sl-details-border-color--hover:var(--sl-color-asides-text-accent)}}@layer starlight.components{.starlight-aside{border-inline-start:.25rem solid var(--sl-color-asides-border);color:var(--sl-color-white);padding:1rem}.starlight-aside--note{--sl-color-asides-text-accent:var(--sl-color-blue-high);--sl-color-asides-border:var(--sl-color-blue);background-color:var(--sl-color-blue-low)}.starlight-aside--tip{--sl-color-asides-text-accent:var(--sl-color-purple-high);--sl-color-asides-border:var(--sl-color-purple);background-color:var(--sl-color-purple-low)}.starlight-aside--caution{--sl-color-asides-text-accent:var(--sl-color-orange-high);--sl-color-asides-border:var(--sl-color-orange);background-color:var(--sl-color-orange-low)}.starlight-aside--danger{--sl-color-asides-text-accent:var(--sl-color-red-high);--sl-color-asides-border:var(--sl-color-red);background-color:var(--sl-color-red-low)}.starlight-aside__title{font-size:var(--sl-text-h5);font-weight:600;line-height:var(--sl-line-height-headings);color:var(--sl-color-asides-text-accent);align-items:center;gap:.5rem;display:flex}.starlight-aside__icon{width:1em;height:1em;font-size:1.333em;overflow:visible}.starlight-aside__title+.starlight-aside__content{margin-top:.5rem}.starlight-aside__content:empty{display:none}.starlight-aside__content a{color:var(--sl-color-asides-text-accent)}.sl-link-button:where(.astro-fguwamfv){font-size:var(--sl-text-sm);outline-offset:.25rem;border:1px solid #0000;border-radius:999rem;align-items:center;gap:.5em;padding:.4375rem 1.125rem;line-height:1.1875;text-decoration:none;display:inline-flex}.sl-link-button:where(.astro-fguwamfv).primary{background:var(--sl-color-text-accent);border-color:var(--sl-color-text-accent);color:var(--sl-color-black)}.sl-link-button:where(.astro-fguwamfv).primary:hover{color:var(--sl-color-black)}.sl-link-button:where(.astro-fguwamfv).secondary{border-color:inherit;color:var(--sl-color-white)}.sl-link-button:where(.astro-fguwamfv).minimal{color:var(--sl-color-white);padding-inline:0}.sl-link-button:where(.astro-fguwamfv) svg{flex-shrink:0}@media (width>=50rem){.sl-link-button:where(.astro-fguwamfv){font-size:var(--sl-text-base);padding:.9375rem 1.25rem}}.sl-markdown-content .sl-link-button:where(.astro-fguwamfv){margin-inline-end:1rem}.sl-markdown-content .sl-link-button:where(.astro-fguwamfv):not(:where(p *)){margin-block:1rem}}@layer starlight.utils{.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.sl-hidden{display:none}.sl-flex{display:flex}.sl-block{display:block}@media (width>=50rem){.md\:sl-hidden{display:none}.md\:sl-flex{display:flex}.md\:sl-block{display:block}}@media (width>=72rem){.lg\:sl-hidden{display:none}.lg\:sl-flex{display:flex}.lg\:sl-block{display:block}}[data-theme=light] .light\:sl-hidden,[data-theme=dark] .dark\:sl-hidden{display:none}[dir=rtl] .rtl\:flip:not(:where([dir=rtl] [dir=ltr] *)){transform:matrix(-1,0,0,1,0,0)}}html:not([data-has-toc]){--sl-mobile-toc-height:0rem}html:not([data-has-sidebar]){--sl-content-width:67.5rem}html{scroll-padding-top:calc(1.5rem + var(--sl-nav-height) + var(--sl-mobile-toc-height))}main:where(.astro-mxbotnn6){padding:var(--sl-main-pad)}@media (width>=50em){:where(.astro-mxbotnn6)[data-has-sidebar]{--sl-content-inline-start:var(--sl-sidebar-width)}}@media (width>=72em){html{scroll-padding-top:calc(1.5rem + var(--sl-nav-height))}}
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="66 66 380 380"><defs><linearGradient id="sky" x1="96" y1="76" x2="416" y2="436" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#194ff7"/><stop offset="1" stop-color="#02b4ff"/></linearGradient><linearGradient id="acc" x1="150" y1="160" x2="362" y2="352" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#194ff7"/><stop offset="1" stop-color="#02b4ff"/></linearGradient></defs><circle cx="256" cy="256" r="190" fill="url(#sky)"/><g transform="translate(0 6)"><g fill="#fff"><path d="M158.7 331.3A262.3 262.3 0 0 0 353.3 331.3L334 283H178Z"/><circle cx="178" cy="283" r="52"/><circle cx="334" cy="283" r="52"/><circle cx="214" cy="238" r="54"/><circle cx="288" cy="222" r="72"/><rect x="178" y="232" width="156" height="100"/></g><path fill="none" stroke="url(#acc)" stroke-width="24" stroke-linecap="round" stroke-linejoin="round" d="M256 302V234M224 266L256 234L288 266"/></g></svg>