@starlove/orbit 1.4.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. package/Dockerfile +10 -8
  2. package/README.md +146 -164
  3. package/dist/full/csp.txt +1 -0
  4. package/dist/full/fonts/JetBrains_Mono/JetBrainsMono-subset.woff2 +0 -0
  5. package/dist/full/fonts/JetBrains_Mono/README.txt +5 -0
  6. package/dist/full/fonts/Mona_Sans/MonaSans-subset.woff2 +0 -0
  7. package/{public/fonts/Open_Sans → dist/full/fonts/Mona_Sans}/OFL.txt +93 -93
  8. package/dist/full/fonts/Mona_Sans/README.txt +10 -0
  9. package/{public/fonts/JetBrains_Mono → dist/full/fonts/Newsreader}/OFL.txt +93 -93
  10. package/dist/full/fonts/Newsreader/README.txt +8 -0
  11. package/dist/full/fonts/Newsreader/newsreader.woff2 +0 -0
  12. package/dist/full/index.html +36 -653
  13. package/dist/full/js/app.BmuponPJ.js +32 -0
  14. package/dist/full/js/app.BmuponPJ.js.map +1 -0
  15. package/dist/full/js/chunk.1fJGQGbW.js +2 -0
  16. package/dist/full/js/chunk.1fJGQGbW.js.map +1 -0
  17. package/dist/full/js/chunk.5D7JO2zp.js +2 -0
  18. package/dist/full/js/chunk.5D7JO2zp.js.map +1 -0
  19. package/dist/full/js/chunk.BrNn_D79.js +2 -0
  20. package/dist/full/js/chunk.BrNn_D79.js.map +1 -0
  21. package/dist/full/js/chunk.CokJXIqM.js +2 -0
  22. package/dist/full/js/chunk.CokJXIqM.js.map +1 -0
  23. package/dist/full/js/chunk.D_Haqy6R.js +2 -0
  24. package/dist/full/js/chunk.D_Haqy6R.js.map +1 -0
  25. package/dist/full/js/chunk.RO0jsH6I.js +15 -0
  26. package/dist/full/js/chunk.RO0jsH6I.js.map +1 -0
  27. package/dist/full/js/chunk.dqWOEtBM.js +2 -0
  28. package/dist/full/js/chunk.dqWOEtBM.js.map +1 -0
  29. package/dist/full/js/warm.f260bbbc.js +15 -0
  30. package/dist/full/orbits-favicon.png +0 -0
  31. package/dist/full/orbits-logo-bg-wide.png +0 -0
  32. package/dist/full/orbits-logo-bg.png +0 -0
  33. package/dist/full/orbits-logo.png +0 -0
  34. package/dist/full/styles.2b154ffe.css +1 -0
  35. package/dist/full/vendor/starlove-ui/theme-init.js +66 -0
  36. package/dist/full/version.json +2 -2
  37. package/docs/AGENT_GUIDE.md +114 -0
  38. package/docs/UPDATING.md +249 -64
  39. package/lib/adapters/indexeddb/blobs.d.ts +3 -0
  40. package/lib/adapters/indexeddb/blobs.js +54 -0
  41. package/lib/adapters/indexeddb/database.d.ts +60 -0
  42. package/lib/adapters/indexeddb/database.js +126 -0
  43. package/lib/adapters/indexeddb/index.d.ts +5 -0
  44. package/lib/adapters/indexeddb/index.js +3 -0
  45. package/lib/adapters/indexeddb/locks.d.ts +14 -0
  46. package/lib/adapters/indexeddb/locks.js +40 -0
  47. package/lib/adapters/indexeddb/store.d.ts +40 -0
  48. package/lib/adapters/indexeddb/store.js +424 -0
  49. package/lib/adapters/indexeddb/tables.d.ts +43 -0
  50. package/lib/adapters/indexeddb/tables.js +127 -0
  51. package/lib/adapters/memory/blobs.d.ts +3 -0
  52. package/lib/adapters/memory/blobs.js +44 -0
  53. package/lib/adapters/memory/board.d.ts +41 -0
  54. package/lib/adapters/memory/board.js +521 -0
  55. package/lib/adapters/memory/index.d.ts +2 -0
  56. package/lib/adapters/memory/index.js +2 -0
  57. package/lib/adapters/memory/search.d.ts +6 -0
  58. package/lib/adapters/memory/search.js +30 -0
  59. package/lib/adapters/memory/store.d.ts +34 -0
  60. package/lib/adapters/memory/store.js +266 -0
  61. package/lib/adapters/sqlite/backups.d.ts +53 -0
  62. package/lib/adapters/sqlite/backups.js +232 -0
  63. package/lib/adapters/sqlite/blobs.d.ts +14 -0
  64. package/lib/adapters/sqlite/blobs.js +109 -0
  65. package/lib/adapters/sqlite/board.d.ts +77 -0
  66. package/lib/adapters/sqlite/board.js +328 -0
  67. package/lib/adapters/sqlite/database.d.ts +67 -0
  68. package/lib/adapters/sqlite/database.js +285 -0
  69. package/lib/adapters/sqlite/index.d.ts +3 -0
  70. package/lib/adapters/sqlite/index.js +2 -0
  71. package/lib/adapters/sqlite/lock.d.ts +11 -0
  72. package/lib/adapters/sqlite/lock.js +34 -0
  73. package/lib/adapters/sqlite/records.d.ts +54 -0
  74. package/lib/adapters/sqlite/records.js +546 -0
  75. package/lib/adapters/sqlite/schema.d.ts +54 -0
  76. package/lib/adapters/sqlite/schema.js +276 -0
  77. package/lib/adapters/sqlite/store.d.ts +39 -0
  78. package/lib/adapters/sqlite/store.js +385 -0
  79. package/lib/browser/in-page.d.ts +31 -0
  80. package/lib/browser/in-page.js +46 -0
  81. package/lib/browser/old-preview.d.ts +13 -0
  82. package/lib/browser/old-preview.js +80 -0
  83. package/lib/browser/preview-board.d.ts +8 -0
  84. package/lib/browser/preview-board.js +69 -0
  85. package/lib/cli/main.d.ts +7 -0
  86. package/lib/cli/main.js +343 -0
  87. package/lib/cli/orbit.d.ts +8 -0
  88. package/lib/cli/orbit.js +25 -0
  89. package/lib/client/http.d.ts +38 -0
  90. package/lib/client/http.js +334 -0
  91. package/lib/client/local.d.ts +26 -0
  92. package/lib/client/local.js +190 -0
  93. package/lib/client/object-url.d.ts +8 -0
  94. package/lib/client/object-url.js +21 -0
  95. package/lib/client/types.d.ts +268 -0
  96. package/lib/client/types.js +8 -0
  97. package/lib/commands/agent-tools.d.ts +31 -0
  98. package/lib/commands/agent-tools.js +100 -0
  99. package/lib/commands/index.d.ts +56 -0
  100. package/lib/commands/index.js +298 -0
  101. package/lib/commands/parse.d.ts +73 -0
  102. package/lib/commands/parse.js +231 -0
  103. package/lib/commands/present.d.ts +134 -0
  104. package/lib/commands/present.js +198 -0
  105. package/lib/commands/session.d.ts +85 -0
  106. package/lib/commands/session.js +138 -0
  107. package/lib/commands/verbs.d.ts +35 -0
  108. package/lib/commands/verbs.js +842 -0
  109. package/lib/core/actors.d.ts +18 -0
  110. package/lib/core/actors.js +45 -0
  111. package/lib/core/agent.d.ts +128 -0
  112. package/lib/core/agent.js +323 -0
  113. package/lib/core/boards.d.ts +113 -0
  114. package/lib/core/boards.js +288 -0
  115. package/lib/core/bootstrap.d.ts +47 -0
  116. package/lib/core/bootstrap.js +100 -0
  117. package/lib/core/bytes.d.ts +10 -0
  118. package/lib/core/bytes.js +52 -0
  119. package/lib/core/card-paths.d.ts +25 -0
  120. package/lib/core/card-paths.js +44 -0
  121. package/lib/core/context.d.ts +60 -0
  122. package/lib/core/context.js +42 -0
  123. package/lib/core/cross-board.d.ts +81 -0
  124. package/lib/core/cross-board.js +228 -0
  125. package/lib/core/describe.d.ts +21 -0
  126. package/lib/core/describe.js +81 -0
  127. package/lib/core/errors.d.ts +159 -0
  128. package/lib/core/errors.js +160 -0
  129. package/lib/core/files.d.ts +79 -0
  130. package/lib/core/files.js +262 -0
  131. package/lib/core/history.d.ts +20 -0
  132. package/lib/core/history.js +53 -0
  133. package/lib/core/image-types.d.ts +16 -0
  134. package/lib/core/image-types.js +36 -0
  135. package/lib/core/model.d.ts +263 -0
  136. package/lib/core/model.js +34 -0
  137. package/lib/core/nebula-link.d.ts +14 -0
  138. package/lib/core/nebula-link.js +39 -0
  139. package/lib/core/relations.d.ts +58 -0
  140. package/lib/core/relations.js +112 -0
  141. package/lib/core/search.d.ts +38 -0
  142. package/lib/core/search.js +92 -0
  143. package/lib/core/sessions.d.ts +44 -0
  144. package/lib/core/sessions.js +158 -0
  145. package/lib/core/snapshot-schema.d.ts +295 -0
  146. package/lib/core/snapshot-schema.js +82 -0
  147. package/lib/core/snapshots.d.ts +75 -0
  148. package/lib/core/snapshots.js +409 -0
  149. package/lib/core/states.d.ts +25 -0
  150. package/lib/core/states.js +126 -0
  151. package/lib/core/text.d.ts +40 -0
  152. package/lib/core/text.js +113 -0
  153. package/lib/core/tickets.d.ts +69 -0
  154. package/lib/core/tickets.js +311 -0
  155. package/lib/core/trello.d.ts +17 -0
  156. package/lib/core/trello.js +269 -0
  157. package/lib/core/verdicts.d.ts +28 -0
  158. package/lib/core/verdicts.js +92 -0
  159. package/lib/core/views.d.ts +95 -0
  160. package/lib/core/views.js +186 -0
  161. package/lib/http/app.d.ts +46 -0
  162. package/lib/http/app.js +491 -0
  163. package/lib/mcp-server.d.ts +10 -0
  164. package/lib/mcp-server.js +120 -0
  165. package/lib/node/assets.d.ts +7 -0
  166. package/lib/node/assets.js +68 -0
  167. package/lib/node/data-folder.d.ts +21 -0
  168. package/lib/node/data-folder.js +34 -0
  169. package/lib/node/env.d.ts +38 -0
  170. package/lib/node/env.js +49 -0
  171. package/lib/node/host-check.d.ts +24 -0
  172. package/lib/node/host-check.js +53 -0
  173. package/lib/node/host-services.d.ts +9 -0
  174. package/lib/node/host-services.js +150 -0
  175. package/lib/node/local.d.ts +22 -0
  176. package/lib/node/local.js +61 -0
  177. package/lib/node/migrate.d.ts +53 -0
  178. package/lib/node/migrate.js +635 -0
  179. package/lib/node/package.d.ts +7 -0
  180. package/lib/node/package.js +14 -0
  181. package/lib/node/repo-board.d.ts +49 -0
  182. package/lib/node/repo-board.js +245 -0
  183. package/lib/node/serve.d.ts +8 -0
  184. package/lib/node/serve.js +106 -0
  185. package/lib/orbit.d.ts +47 -0
  186. package/lib/orbit.js +44 -0
  187. package/lib/quiet-sqlite-warning.d.ts +1 -0
  188. package/lib/quiet-sqlite-warning.js +18 -0
  189. package/lib/store/blob-path.d.ts +6 -0
  190. package/lib/store/blob-path.js +12 -0
  191. package/lib/store/conformance.d.ts +52 -0
  192. package/lib/store/conformance.js +1449 -0
  193. package/lib/store/search-words.d.ts +10 -0
  194. package/lib/store/search-words.js +19 -0
  195. package/lib/store/types.d.ts +452 -0
  196. package/lib/store/types.js +34 -0
  197. package/llms.txt +63 -0
  198. package/package.json +109 -25
  199. package/src/cli/orbit.js +11 -658
  200. package/src/mcp-server.js +16 -876
  201. package/SKILL-ORBIT.md +0 -151
  202. package/build.mjs +0 -210
  203. package/dist/full/js/app.4e6fbe20.js +0 -952
  204. package/dist/full/js/app.4e6fbe20.js.map +0 -7
  205. package/dist/full/styles.4e60d824.css +0 -1
  206. package/docs/AGENT_PROTOCOL.md +0 -424
  207. package/docs/MCP_SETUP.md +0 -54
  208. package/docs/ORBIT_DISPATCH.md +0 -280
  209. package/docs/SS-Orbit-Dark.png +0 -0
  210. package/docs/SS-Orbit-Light.png +0 -0
  211. package/docs/mcp-client.example.json +0 -13
  212. package/docs/setup/orbit-init-wizard.md +0 -174
  213. package/public/apple-touch-icon.png +0 -0
  214. package/public/cursors/live_arrow.cur +0 -0
  215. package/public/cursors/live_link.cur +0 -0
  216. package/public/cursors/live_move.cur +0 -0
  217. package/public/cursors/live_select.cur +0 -0
  218. package/public/cursors/live_unavail.cur +0 -0
  219. package/public/favicon-32x32.png +0 -0
  220. package/public/fonts/Chakra_Petch/ChakraPetch-Bold.ttf +0 -0
  221. package/public/fonts/Chakra_Petch/ChakraPetch-BoldItalic.ttf +0 -0
  222. package/public/fonts/Chakra_Petch/ChakraPetch-Italic.ttf +0 -0
  223. package/public/fonts/Chakra_Petch/ChakraPetch-Light.ttf +0 -0
  224. package/public/fonts/Chakra_Petch/ChakraPetch-LightItalic.ttf +0 -0
  225. package/public/fonts/Chakra_Petch/ChakraPetch-Medium.ttf +0 -0
  226. package/public/fonts/Chakra_Petch/ChakraPetch-MediumItalic.ttf +0 -0
  227. package/public/fonts/Chakra_Petch/ChakraPetch-Regular.ttf +0 -0
  228. package/public/fonts/Chakra_Petch/ChakraPetch-SemiBold.ttf +0 -0
  229. package/public/fonts/Chakra_Petch/ChakraPetch-SemiBoldItalic.ttf +0 -0
  230. package/public/fonts/Chakra_Petch/OFL.txt +0 -93
  231. package/public/fonts/Inter/Inter-Italic-VariableFont_opsz,wght.ttf +0 -0
  232. package/public/fonts/Inter/Inter-VariableFont_opsz,wght.ttf +0 -0
  233. package/public/fonts/Inter/OFL.txt +0 -93
  234. package/public/fonts/Inter/README.txt +0 -118
  235. package/public/fonts/JetBrains_Mono/JetBrainsMono-Italic-VariableFont_wght.ttf +0 -0
  236. package/public/fonts/JetBrains_Mono/JetBrainsMono-VariableFont_wght.ttf +0 -0
  237. package/public/fonts/JetBrains_Mono/README.txt +0 -79
  238. package/public/fonts/OpenRing-Regular.ttf +0 -0
  239. package/public/fonts/Open_Sans/OpenSans-Italic-VariableFont_wdth,wght.ttf +0 -0
  240. package/public/fonts/Open_Sans/OpenSans-VariableFont_wdth,wght.ttf +0 -0
  241. package/public/fonts/Open_Sans/README.txt +0 -100
  242. package/public/fonts/Orbitron/OFL.txt +0 -93
  243. package/public/fonts/Orbitron/Orbitron-VariableFont_wght.ttf +0 -0
  244. package/public/fonts/Orbitron/README.txt +0 -68
  245. package/public/fonts/Rajdhani/OFL.txt +0 -93
  246. package/public/fonts/Rajdhani/Rajdhani-Bold.ttf +0 -0
  247. package/public/fonts/Rajdhani/Rajdhani-Light.ttf +0 -0
  248. package/public/fonts/Rajdhani/Rajdhani-Medium.ttf +0 -0
  249. package/public/fonts/Rajdhani/Rajdhani-Regular.ttf +0 -0
  250. package/public/fonts/Rajdhani/Rajdhani-SemiBold.ttf +0 -0
  251. package/public/fonts/runescape-uf.ttf +0 -0
  252. package/public/index.html +0 -769
  253. package/public/js/actor-labels.js +0 -65
  254. package/public/js/api.js +0 -39
  255. package/public/js/app.js +0 -45
  256. package/public/js/artifact-drawer.js +0 -79
  257. package/public/js/board-export.js +0 -161
  258. package/public/js/board-menu.js +0 -374
  259. package/public/js/card-actions.js +0 -545
  260. package/public/js/config.js +0 -20
  261. package/public/js/create-card.js +0 -190
  262. package/public/js/dom.js +0 -19
  263. package/public/js/drawer.js +0 -273
  264. package/public/js/font-preference.js +0 -230
  265. package/public/js/format.js +0 -433
  266. package/public/js/help-menu.js +0 -31
  267. package/public/js/icons.js +0 -16
  268. package/public/js/kanban.js +0 -694
  269. package/public/js/local-backend.js +0 -1015
  270. package/public/js/main.js +0 -161
  271. package/public/js/modal.js +0 -33
  272. package/public/js/motion-preference.js +0 -64
  273. package/public/js/panel.js +0 -58
  274. package/public/js/router.js +0 -134
  275. package/public/js/search.js +0 -56
  276. package/public/js/settings-tabs.js +0 -7
  277. package/public/js/settings.js +0 -1634
  278. package/public/js/sse.js +0 -159
  279. package/public/js/starscape.js +0 -332
  280. package/public/js/state.js +0 -129
  281. package/public/js/text-editing.js +0 -128
  282. package/public/js/theme-preference.js +0 -95
  283. package/public/js/ticket-detail.js +0 -1516
  284. package/public/js/ticket-typeahead.js +0 -49
  285. package/public/js/toast.js +0 -89
  286. package/public/js/topbar-notes.js +0 -155
  287. package/public/js/transport.js +0 -22
  288. package/public/js/typeahead.js +0 -206
  289. package/public/js/unread.js +0 -121
  290. package/public/js/update-check.js +0 -58
  291. package/public/js/url-routes.js +0 -94
  292. package/public/orbits-favicon.png +0 -0
  293. package/public/orbits-logo-bg-wide.png +0 -0
  294. package/public/orbits-logo-bg.png +0 -0
  295. package/public/orbits-logo.png +0 -0
  296. package/public/styles.css +0 -7709
  297. package/src/core/agent.js +0 -387
  298. package/src/core/agents-md.js +0 -109
  299. package/src/core/artifacts.js +0 -149
  300. package/src/core/attachments.js +0 -238
  301. package/src/core/auth.js +0 -85
  302. package/src/core/backups.js +0 -142
  303. package/src/core/board.js +0 -148
  304. package/src/core/boards.js +0 -409
  305. package/src/core/bootstrap.js +0 -170
  306. package/src/core/css-bundle.js +0 -30
  307. package/src/core/db.js +0 -315
  308. package/src/core/delete-board.js +0 -163
  309. package/src/core/dispatch.js +0 -1007
  310. package/src/core/events.js +0 -314
  311. package/src/core/http.js +0 -115
  312. package/src/core/migrate.js +0 -198
  313. package/src/core/paths.js +0 -55
  314. package/src/core/provision-repo-board.js +0 -119
  315. package/src/core/queries.js +0 -246
  316. package/src/core/registry.js +0 -211
  317. package/src/core/relations.js +0 -163
  318. package/src/core/review-verdicts.js +0 -138
  319. package/src/core/router.js +0 -556
  320. package/src/core/search.js +0 -183
  321. package/src/core/seed.js +0 -234
  322. package/src/core/snapshots.js +0 -692
  323. package/src/core/states.js +0 -167
  324. package/src/core/system-picker.js +0 -109
  325. package/src/core/tickets.js +0 -400
  326. package/src/core/util.js +0 -106
  327. package/src/core/version-check.js +0 -154
  328. package/src/mcp/orbit-client.js +0 -287
  329. package/src/server.js +0 -115
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk.RO0jsH6I.js","names":["headingId","title","heading","aside","lead","id","children","text","what","onCopy","extra","open","checked","labelledBy","onChange","labelId","label","option","move","description","Section","_c","CodeBlock","Switch","aiEnabled","board","field","hasInstructions","live","slug","deployment","AGENT_KINDS","kind","setKind","elsewhere","remote","sentence","MCP_OTHER_APP","appId","event","agentName","REMOTE_ONLY_APPS_LINE","setup","fullPath","app","_c","useState","_temp","Switch","_Fragment","Section","_temp2","_temp3","apiUrl","CodeBlock","_temp4","_temp5","noop","LABELS","users","noop","mulberry32","supportsDialog","enhanced","enhance","noop","Sky","enhanced","enhanced","enhance","useState","useCallback","useRef2","useRef3","Fragment","SkyEngine","Fragment3","Fragment4","themeClicked","reduce","motionClicked","sourceLabel","USER_SCALE_MIN","USER_SCALE_MAX","USER_SCALE_STEP","event","target","id","_c","_temp","THEME_LABELS","Section","_temp2","useState","_temp3","_temp4","live","ticket","s","_c","_temp","_temp2","useState","_temp3","_temp4","_temp5","Section","board","event","includeImages","importAsNew","exportNow","disabled","onFile","label","submit","typed","replace","cancel","remove","error","chip","statusLine","current","checking","checkNow","backingUp","backUp","updating","updateNow","commands","copyCommands","_c","useState","_temp","_temp2","Section","_temp3","_Fragment","_temp4","_temp5","_temp6","_temp7","_temp8","_temp9","CodeBlock","entry","aiEnabled","add","questionId","keyDown","onDelete","cancelButton","deleteButton","isStruck","onToggleStruck","_c","_temp","_temp2","_temp3","_temp4","Section","useState","useRef","lane","name","event","showPriority","index","step","create","first","last","isAiReady","commit","isDefault","onDelete","_c","_temp","useState","_temp2","Section","useRef","field","hasNotes","_c","Section","tab","TABS","s","board","_c","__toESM","require_compiler_runtime","require_react","require_jsx_runtime","resolvedTheme","useOrbit","toast","useBoardStates","cleanText","escapeHtml","capture","useTheme","formatDate","useUi","useShallow","useBoardTickets","reducedMotion","useBoard","renderPreservedText","motionMode","initPrefs","onPrefs","fetchVersionInfo","setMotion","CloseIcon","useCurrentBoard","useVersionInfo","useEditableText","features","LABELS$2","EditableTextView","DrawerShell","downloadJson","DetailCard","importNotes","backUpAllBoards","import_react","import_compiler_runtime","shellWord","word","tomlString","value","yamlString","programOf","server","argsOf","envPairs","key","command","words","envFlags","flag","pair","stdioEntry","type","extra","json","serversJson","root","entry","base64","binary","byte","text","yamlBlock","lines","depth","line","yamlList","values","yamlMap","SAME_NAME","OTHER_APP","s","NAMED_APPS","arg","MCP_APPS","MCP_MAIN_APPS","app","MCP_MORE_APPS","MCP_OTHER_APP","REMOTE_ONLY_APPS_LINE","mcpApp","id","safeAgentName","name","connectSentence","learn","slug","remote","pageApiUrl","location","isLoopbackHost","host","hostname","orbitCommandFor","mcpServerPath","orbitServer","options","dataDir","env","mcpSetupText","appId","mcpInstallLink","install","connectSetupOptions","deployment","serverPath","fullPath","runsInContainer","import_jsx_runtime","Section$1","$","t0","headingId","t1","danger","title","heading","t2","t3","t4","label","t5","aside","t6","lead","t7","children","CodeBlock$1","codeAttrs","what","copyAttrs","onCopy","More","open","Switch$1","checked","labelledBy","onChange","Segmented","step","event","index","option","next","move","labelId","option_0","CheckRow","labelled","description","copyText","textArea","AGENT_KINDS","AiTab","pendingAi","setPendingAi","aiEnabled","board","enabled","_temp$6","setAi","t8","AgentInstructions","t9","ConnectAgents","t10","INSTRUCTIONS_PLACEHOLDER","instructions","field","hasInstructions","useDeployment","read","setRead","boardId","live","manual","_temp2$6","copyWithToast","done","loaded","ConnectAgentsSetup","kind","setKind","elsewhere","setElsewhere","_temp3$5","ShellSteps","McpSteps","sentence","AppOption","setAppId","agentName","setAgentName","setFullPath","chosen","link","setup","external","_temp4$5","_temp5$3","t11","t12","event_0","t13","t14","t15","t16","t17","t18","t19","t20","t21","t22","t23","event_1","t24","app_0","bindings","noop$3","setupScrollAware","threshold","target","attribute","className","marks","mark","bind","user","before","on","users","update","u","now","LABELS$1","COPIED_MS","SELECTOR","handled","shown","regions","users$1","speaking","wordOf","node","button","whatOf","n","isField","el","textOf","targetOf","ref","copyTextOf","shownBeside","want","select","cs","granted","selection","regionIn","region","home","say","dialog","r","restore","flash","initCopy","scope","L","mine","copy","onClick","us","webkit","activeHandle","startStarscape","noop$2","opts","grain","resolveMount","createdGrain","milky","buildSignatureStars","canvas","ctx","stars","width","height","rafId","running","DPR","mouse","resize","buildCanvasStars","density","layers","rng","mulberry32$1","layer","i","size","pickWeighted","pickStarColor","frame","time","t","pulse","alpha","px","py","g","b","radius","grad","half","drawStaticFrame","start","stopRaf","isDarkMode","explicit","isReducedMotion","sync","dark","reduced","onPointerMove","onResize","themeObserver","reducedMotionMql","colorSchemeMql","meteorTimer","scheduleMeteor","range","delay","spawnMeteor","vw","vh","startX","startY","distance","angleDeg","rad","endX","endY","m","stop","count","star","acc","weight","table","a","seed","isSafeUrl","url","bare","scheme","image","delta","position","SPACE","parseSrcset","srcset","out","descriptors","d","parens","c","w","pickSource","set","need","fitBox","k","fill","sw","sh","h","canFill","fit","swipe","dx","dy","ms","ax","dimension","fallback","supportsDialog$1","D","LABELS","KEY","ours","current","stepping","addEntry","onPop","leave","enhanced$3","initGalleries","labels","found","undo","list","off","enhance$2","f","e","tag","cls","ui","items","filled","token","opener","touch","swiped","links","item","img","ids","by","build","bar","fillText","close","prev","stage","foot","caption","dots","status","go","toggle","onClose","onKey","show","x","to","room","layout","can","it","active","box","src","load","dir","pre","refit","scroll","clamp","v","ease","mulberry32","exposureMinutes","deg","reach","y","footerTarget","top","degreesPerPixel","develop","max","drift","nextExposure","gap","E","o","stepFrames","afterSleep","matchedDrift","period","SPEEDS","TAU","DEG","BRIGHTNESS","MAX_CANVAS","FAUX_STRETCH","COLOURS","STRETCHES","DEFAULTS","noop$1","markJS","rgba","parseColour","stretchPercent","stretchKeyword","pct","stretchWorks","canvasStretchWorks","keyword","family","works","slotLines","parts","walk","slot","upper","tidy","whole","Sky$1","still","seen","entries","prefs","attrs","q","fonts","faces","p","wm","rect","dpr","R","changed","keep","names","groups","cu","bright","full","A","B","s0","developing","due","wantStretch","stretch","native","fauxScale","M","ink","total","l","inset","mode","day","stain","dec","hr","r0","observer","enhanced$2","onScrollFrame","run","fn","reporter","section","onExposure","initFullTurn","engine","sky","io","unscroll","arrived","SELECT_EVENT","HEADER_SELECTOR","STAR","starsOf","svg","coreOf","starAt","frameOf","modified","enhanced$1","registry","rove","setCurrent","chart","initStarCharts","enhance$1","offs","initKeys","initTip","initFigures","STEPS","last","GRACE_MS","GAP","tip","one","timer","pending","pointer","hovered","quietHover","quietFocus","insetTop","given","selector","bottom","visible","cancel","centre","place","left","placeTip","hide","onTip","focused","settle","hover","track","STEP","steps","isLower","fw","fh","sides","best","bestRank","offscreen","view","covered","others","sx","sy","nx","ny","overflow","pushed","rank","MAGNITUDES","CHART","chartIds","defaultChartId","ESC","esc","round","num","isPoint","CORE","GLOW","RINGS","SPOKES","ring","labelAt","glyph","WORDS","cleanId","renderStarChart","stageOf","magLine","glowId","knockoutId","cx","cy","selected","data","families","bySlug","figures","hrefOf","MARK","poleLabel","poleY","blurb","tx","anchor","linkOf","core","glow","said","spike","inner","supportsDialog","enhanced","noop","initNavDialogs","html","enhance","media","added","openers","expand","from","shut","back","was","onOpenerClick","onDialogClick","onMedia","mq","useMotion","state","setState","setMode","isRef","useScrollAware","useCopy","useClickOutside","onDoc","handler","useEscapeKey","Starscape","handle","props","rest","variant","Tag","tone","interactive","openProp","internalOpen","setInternalOpen","defaultOpen","isControlled","bodyId","handleToggle","onToggle","hideLabel","showLabel","orientation","dialogRef","closeOnBackdrop","chevron","hasValue","onClear","clearLabel","fillPercent","min","raw","lo","hi","mergedStyle","style","handleInput","onInput","hasHead","valueLabel","input","disabled","color","shape","indeterminate","stacked","banner","icon","closeLabel","actions","local","setRef","forwarded","codeId","builtIn","code","copiedLabel","showHeader","copyLabel","numbered","wrap","buildRange","page","siblings","end","wrapClassName","zebra","scrollAware","subtitle","flat","scrollable","bodyClassName","topbar","skipLink","mainId","skipLinkLabel","background","mainClassName","boardClassName","footer","readStored","useCollapsed","controlled","internal","setInternal","storageKey","defaultCollapsed","collapsed","collapsedProp","onCollapsedChange","brand","search","nav","collapsible","toggleLabels","logo","PageSidebarNavItem","Comp","as","autoTitle","nested","badge","trailing","ChevronIcon","expandedProp","defaultExpanded","expanded","onExpandedChange","meta","onPlay","playState","envelope","chips","note","useGallery","images","thumbWidth","thumbHeight","useFullTurn","pole","AuthTitle","generated","titleId","lede","alt","altNeedsScript","altLabel","tools","starSize","errorId","invalid","error","usernameLabel","usernameName","usernameType","defaultUsername","passwordLabel","passwordName","submitLabel","forgot","reactId","chartId","latest","onSelect","listener","stages","ICON","labelToLight","labelToDark","resolved","hasSystem","systemLabel","pressed","darkLabel","lightLabel","useNavDialog","closeMedia","controls","fallbackHref","Pill","OutArrow","href","copyLabels","copyName","noCopy","PanelIdContext","panelId","stateFor","panelRef","dismissable","hasHeader","eyebrow","innerRef","placement","arrow","menu","summary","compact","markEl","markSize","FONT_STORAGE_KEY","FONT_CHANGE_EVENT","DEFAULT_SITE_FONT","DEFAULT_USER_SCALE","USER_SCALE_MIN","USER_SCALE_MAX","USER_SCALE_STEP","FONT_OPTIONS","FONT_IDS","SITE_FONT_OPTIONS","FONT_TARGETS","FONT_TARGET_IDS","DEFAULT_FONT_PREFERENCES","isFontId","clampUserScale","number","OLD_DEFAULTS","isOldDefaults","normalizeFontPreferences","normalized","legacyControl","storedFontPreferences","applyFontPreferences","config","optionId","preferences","setFontPreferences","setFontPreference","setSiteFont","setUserScale","osPrefersReducedMotion","MOTION_STARS","AppearanceTab","theme","motion","reduce","sourceLabel","themeClicked","_temp$5","motionClicked","_temp2$5","TypeSection","sliderFill","span","setPrefs","_temp3$4","id_1","_temp4$4","id_2","id_0","ArchiveTab","_temp$4","_temp2$4","archive","setArchive","reads","setReads","result","ticket","_temp3$3","ticket_0","_temp4$3","_temp5$2","remove","ticket_1","s_0","parseImportSnapshotText","messageOr","cardCount","tickets","exportSnapshot","snapshot","includeAttachments","importAsNewBoard","file","replaceBoard","DataTab","includeImages","setIncludeImages","exportNow","_temp$3","importAsNew","UpdateSection","BoardRename","_temp2$3","ImportButton","ReplaceBoard","DeleteBoard","red","onFile","_temp3$2","draft","setDraft","nextName","_temp4$2","submit","typed","setTyped","confirmed","_temp5$1","replace","_temp6$1","_temp7$1","UPDATE_INSTRUCTIONS","UPDATE_MODE_LABEL","info","checking","setChecking","backingUp","setBackingUp","updating","setUpdating","available","showSelfUpdate","commands","checkNow","_temp8$1","backUp","_temp9$1","_temp0","copyCommands","_temp1","error_0","updateNow","chip","statusLine","JournalTab","_temp$2","struck","entry_0","_temp2$2","toggleStruck","entry_1","_temp3$1","form","fields","_temp4$1","add","Entry","entry_2","isStruck","showStruckState","setStep","deleteButton","cancelButton","asking","questionId","keyDown","onDelete","onToggleStruck","CORE_LANE_ROLES","deleteBlock","lane","LanesTab","lanes","showPriority","_temp$1","pendingDefault","setPendingDefault","T0","create","counts","_temp2$1","defaultId","lane_0","isDefault","updateLane","lane_1","name_0","rename","lane_2","name_1","_temp3","_temp4","makeDefault","_temp5","lane_3","swapWith","other","_temp6","lane_4","_temp7","name_2","_temp8","LaneRow","lane_5","index_0","step_0","name_3","name_4","saving","isAiReady","onRename","_temp9","commit","onMove","first","onMakeDefault","deleteBlocked","NOTES_PLACEHOLDER","NotesTab","notes","hasNotes","TABS","SettingsPanel","routeTab","_temp","savedTab","_temp2","asked","tab","TabBody"],"sources":["../../../web/src/settings/connect-agents.ts","../../../web/src/settings/parts.tsx","../../../web/src/settings/AiTab.tsx","../../../node_modules/.pnpm/@starlove+ui@3.4.0/node_modules/@starlove/ui/src/scroll-aware.js","../../../node_modules/.pnpm/@starlove+ui@3.4.0/node_modules/@starlove/ui/src/copy.js","../../../node_modules/.pnpm/@starlove+ui@3.4.0/node_modules/@starlove/ui/src/starscape.js","../../../node_modules/.pnpm/@starlove+ui@3.4.0/node_modules/@starlove/ui/src/url.js","../../../node_modules/.pnpm/@starlove+ui@3.4.0/node_modules/@starlove/ui/src/gallery.js","../../../node_modules/.pnpm/@starlove+ui@3.4.0/node_modules/@starlove/ui/src/sky-math.js","../../../node_modules/.pnpm/@starlove+ui@3.4.0/node_modules/@starlove/ui/src/sky-speed.js","../../../node_modules/.pnpm/@starlove+ui@3.4.0/node_modules/@starlove/ui/src/sky.js","../../../node_modules/.pnpm/@starlove+ui@3.4.0/node_modules/@starlove/ui/src/star-chart.js","../../../node_modules/.pnpm/@starlove+ui@3.4.0/node_modules/@starlove/ui/src/star-chart-data.js","../../../node_modules/.pnpm/@starlove+ui@3.4.0/node_modules/@starlove/ui/src/star-chart-render.js","../../../node_modules/.pnpm/@starlove+ui@3.4.0/node_modules/@starlove/ui/src/nav-dialog.js","../../../node_modules/.pnpm/@starlove+ui-react@3.4.0_react@19.3.1_sonner@2.0.8_@types+react@19.3.0_react-dom@19.3.1_react@19.3.1__react@19.3.1_/node_modules/@starlove/ui-react/dist/index.js","../../../web/src/settings/font-preference.ts","../../../web/src/settings/AppearanceTab.tsx","../../../web/src/settings/ArchiveTab.tsx","../../../web/src/settings/DataTab.tsx","../../../web/src/settings/JournalTab.tsx","../../../web/src/settings/LanesTab.tsx","../../../web/src/settings/NotesTab.tsx","../../../web/src/settings/SettingsPanel.tsx"],"sourcesContent":["// \"Connect your agents\": what each agent app needs to use Orbit, and the one\n// sentence to say to an agent once. Pure functions, so tests can run them\n// without a browser; the AI tab renders them.\n//\n// Agents with a shell need only the `orbit` command. MCP apps get one server\n// for the whole user, named `orbit`, running `orbit mcp`, with\n// ORBIT_AGENT_NAME so cards say which agent did what.\n//\n// Each app's setup follows its maker's documentation (the add command, or the\n// config's shape and where it lives on macOS and Linux). Apps change these\n// often, so check the list against the makers' pages before each release.\n\n/** The one server every setup describes: the command that starts `orbit mcp`, and its environment. */\nexport interface OrbitServer {\n /** The program, then its arguments; `mcp` is last. */\n command: string[];\n env: Record<string, string>;\n}\n\n/** How a setup reads: a command to run, a config to paste, or fields to fill in an app's form. */\nexport type SetupFormat = \"command\" | \"json\" | \"toml\" | \"yaml\" | \"form\";\n\nexport interface McpApp {\n id: string;\n label: string;\n agentName: string;\n format: SetupFormat;\n /** Where the setup goes on the person's computer, in plain words. */\n where: string;\n /** The main list, \"More apps\", or the catch-all. */\n group: \"main\" | \"more\" | \"other\";\n setup: (server: OrbitServer) => string;\n /** A link the app's maker documents that adds the same server in one step. */\n install?: { label: string; href: (server: OrbitServer) => string };\n}\n\nconst shellWord = (word: string): string => (/^[A-Za-z0-9._=@/:-]+$/.test(word) ? word : `\"${word.replace(/([\"\\\\$`])/g, \"\\\\$1\")}\"`);\nconst tomlString = (value: string): string => `\"${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\n// A JSON string is a valid YAML double-quoted scalar.\nconst yamlString = (value: string): string => JSON.stringify(value);\n\nconst programOf = (server: OrbitServer): string => server.command[0] ?? \"orbit\";\nconst argsOf = (server: OrbitServer): string[] => server.command.slice(1);\nconst envPairs = (server: OrbitServer): string[] => Object.entries(server.env).map(([key, value]) => `${key}=${value}`);\n\n/** A shell command, each word quoted only when it needs to be. */\nfunction command(words: string[]): string {\n return words.map(shellWord).join(\" \");\n}\n\n/** `--env K=V` (or another flag) once per variable. */\nfunction envFlags(server: OrbitServer, flag: string): string[] {\n return envPairs(server).flatMap((pair) => [flag, pair]);\n}\n\n/** The usual server entry: command, args and env, with whatever an app adds. */\nfunction stdioEntry(server: OrbitServer, extra: Record<string, unknown> = {}, type?: string): Record<string, unknown> {\n return { ...(type ? { type } : {}), command: programOf(server), args: argsOf(server), env: server.env, ...extra };\n}\n\nfunction json(value: unknown): string {\n return JSON.stringify(value, null, 2);\n}\n\n/** `{ \"<root>\": { \"orbit\": entry } }`, the shape most apps read. */\nfunction serversJson(root: string, entry: Record<string, unknown>): string {\n return json({ [root]: { orbit: entry } });\n}\n\n/** Base64 of the text's UTF-8 bytes, as install links carry a config. */\nfunction base64(text: string): string {\n let binary = \"\";\n for (const byte of new TextEncoder().encode(text)) binary += String.fromCharCode(byte);\n return btoa(binary);\n}\n\nfunction yamlBlock(lines: string[], depth: number): string[] {\n return lines.map((line) => `${\" \".repeat(depth)}${line}`);\n}\n\nfunction yamlList(values: string[]): string[] {\n return values.map((value) => `- ${yamlString(value)}`);\n}\n\nfunction yamlMap(values: Record<string, string>): string[] {\n return Object.entries(values).map(([key, value]) => `${key}: ${yamlString(value)}`);\n}\n\nconst SAME_NAME = \"both show the same agent name\";\n\n/** The catch-all, for an app not named: the shape most apps take. */\nconst OTHER_APP: McpApp = {\n id: \"generic\",\n label: \"Other MCP app\",\n agentName: \"agent\",\n format: \"json\",\n group: \"other\",\n where:\n \"Most apps take this shape: a server named orbit, command orbit, argument mcp, and ORBIT_AGENT_NAME. Look for MCP or Tools in your app's settings. The key is usually mcpServers; a few apps use servers, mcp or context_servers. If the app can't find orbit, use the full-path version below. If your app only accepts a web address (https://...), it can't reach Orbit yet.\",\n setup: (s) => serversJson(\"mcpServers\", stdioEntry(s))\n};\n\nconst NAMED_APPS: readonly McpApp[] = [\n {\n id: \"claude-code\",\n label: \"Claude Code\",\n agentName: \"claude\",\n format: \"command\",\n group: \"main\",\n where: \"Run this once in a terminal. It works in every project, unless a project adds its own server named orbit. Start a new session to see it.\",\n setup: (s) => command([\"claude\", \"mcp\", \"add\", \"--scope\", \"user\", \"orbit\", ...envFlags(s, \"--env\"), \"--\", ...s.command])\n },\n {\n id: \"codex\",\n label: \"Codex (CLI and IDE extension)\",\n agentName: \"codex\",\n format: \"command\",\n group: \"main\",\n where: `Run this once in a terminal. It writes ~/.codex/config.toml, which the Codex CLI, its IDE extension and the ChatGPT desktop app all read, so one setup covers them and they show the same agent name.`,\n setup: (s) => command([\"codex\", \"mcp\", \"add\", \"orbit\", ...envFlags(s, \"--env\"), \"--\", ...s.command])\n },\n {\n id: \"chatgpt-desktop\",\n label: \"ChatGPT desktop app\",\n agentName: \"codex\",\n format: \"toml\",\n group: \"main\",\n where: `Add this to ~/.codex/config.toml, then restart the app (or add it in Settings, MCP servers). The Codex CLI and IDE extension read the same file, so one setup covers them and ${SAME_NAME}.`,\n setup: (s) =>\n [\n \"[mcp_servers.orbit]\",\n `command = ${tomlString(programOf(s))}`,\n `args = [${argsOf(s).map(tomlString).join(\", \")}]`,\n \"\",\n \"[mcp_servers.orbit.env]\",\n ...Object.entries(s.env).map(([key, value]) => `${key} = ${tomlString(value)}`)\n ].join(\"\\n\")\n },\n {\n id: \"cursor\",\n label: \"Cursor (editor and CLI)\",\n agentName: \"cursor\",\n format: \"json\",\n group: \"main\",\n where: `Add this to ~/.cursor/mcp.json, then restart Cursor. The Cursor CLI reads the same file (run agent mcp enable orbit once), so one setup covers both and ${SAME_NAME}.`,\n setup: (s) => serversJson(\"mcpServers\", stdioEntry(s, {}, \"stdio\")),\n install: {\n label: \"Add to Cursor\",\n href: (s) => `cursor://anysphere.cursor-deeplink/mcp/install?name=orbit&config=${encodeURIComponent(base64(JSON.stringify(stdioEntry(s, {}, \"stdio\"))))}`\n }\n },\n {\n id: \"vscode-copilot\",\n label: \"VS Code (GitHub Copilot) and Copilot CLI\",\n agentName: \"copilot\",\n format: \"json\",\n group: \"main\",\n where: `Add this to ~/.copilot/mcp-config.json. VS Code's Copilot and Copilot CLI both read it, so one setup covers both and ${SAME_NAME}.`,\n setup: (s) => serversJson(\"mcpServers\", stdioEntry(s, { tools: [\"*\"] }, \"stdio\"))\n },\n {\n id: \"claude-desktop\",\n label: \"Claude Desktop\",\n agentName: \"claude-desktop\",\n format: \"json\",\n group: \"main\",\n where: \"Add this to claude_desktop_config.json, in ~/Library/Application Support/Claude on a Mac or ~/.config/Claude on Linux, then quit Claude completely and open it again.\",\n setup: (s) => serversJson(\"mcpServers\", stdioEntry(s))\n },\n {\n id: \"openclaw\",\n label: \"OpenClaw\",\n agentName: \"openclaw\",\n format: \"command\",\n group: \"main\",\n where: \"Run this once in a terminal while the Gateway is stopped. OpenClaw starts Orbit to check it, then saves it in ~/.openclaw/openclaw.json.\",\n setup: (s) => command([\"openclaw\", \"mcp\", \"add\", \"orbit\", \"--command\", programOf(s), ...argsOf(s).flatMap((arg) => [\"--arg\", arg]), ...envFlags(s, \"--env\")])\n },\n {\n id: \"hermes-agent\",\n label: \"Hermes Agent\",\n agentName: \"hermes\",\n format: \"command\",\n group: \"main\",\n where: \"Run this once in a terminal. Hermes connects to Orbit first and asks which tools to keep, then writes the server to the active Hermes profile; add it to each profile you use.\",\n setup: (s) => command([\"hermes\", \"mcp\", \"add\", \"orbit\", \"--command\", programOf(s), \"--env\", ...envPairs(s), \"--args\", ...argsOf(s)])\n },\n {\n id: \"opencode\",\n label: \"OpenCode\",\n agentName: \"opencode\",\n format: \"json\",\n group: \"main\",\n where: \"Add this to ~/.config/opencode/opencode.json, or to opencode.jsonc there if you have that file. Every current version of OpenCode reads this shape.\",\n setup: (s) => json({ $schema: \"https://opencode.ai/config.json\", mcp: { orbit: { type: \"local\", command: s.command, environment: s.env } } })\n },\n {\n id: \"pi\",\n label: \"Pi\",\n agentName: \"pi\",\n format: \"command\",\n group: \"main\",\n where: \"Run this once in a terminal, then pi mcp list to check it, or /reload in an open session. It gives Orbit's two tools to the model directly.\",\n setup: (s) => command([\"pi\", \"mcp\", \"add\", \"orbit\", \"--exposure\", \"direct\", ...envFlags(s, \"--env\"), \"--\", ...s.command])\n },\n {\n id: \"google-antigravity\",\n label: \"Google Antigravity\",\n agentName: \"antigravity\",\n format: \"json\",\n group: \"main\",\n where: `Add this to ~/.gemini/config/mcp_config.json, then refresh Antigravity's MCP servers. Its app, IDE and CLI read the same file, so one setup covers them and they show the same agent name.`,\n setup: (s) => serversJson(\"mcpServers\", stdioEntry(s))\n },\n {\n id: \"gemini-cli\",\n label: \"Gemini CLI\",\n agentName: \"gemini\",\n format: \"command\",\n group: \"main\",\n where: \"Run this once in a terminal, then restart Gemini CLI. It connects servers only in folders you trust.\",\n setup: (s) => command([\"gemini\", \"mcp\", \"add\", \"-s\", \"user\", ...envFlags(s, \"-e\"), \"orbit\", ...s.command])\n },\n {\n id: \"devin-desktop\",\n label: \"Devin Desktop (formerly Windsurf)\",\n agentName: \"devin\",\n format: \"json\",\n group: \"main\",\n where: `Add this to ~/.config/devin/mcp_config.json (Customize, MCPs opens it). Devin CLI reads the same file, so one setup covers both and ${SAME_NAME}.`,\n setup: (s) => serversJson(\"mcpServers\", stdioEntry(s))\n },\n {\n id: \"jetbrains\",\n label: \"JetBrains (Junie, AI Assistant)\",\n agentName: \"junie\",\n format: \"json\",\n group: \"main\",\n where: `Add this to ~/.junie/mcp/mcp.json (Settings, Tools, Junie, MCP Settings opens it). For AI Assistant, paste it in Settings, Tools, AI Assistant, Model Context Protocol, at the Global level. One setup covers both, and ${SAME_NAME}.`,\n setup: (s) => serversJson(\"mcpServers\", stdioEntry(s))\n },\n {\n id: \"zed\",\n label: \"Zed\",\n agentName: \"zed\",\n format: \"json\",\n group: \"main\",\n where: \"Add this to Zed's settings.json, in ~/.config/zed (the zed: open settings file command opens it). Zed's key is context_servers.\",\n setup: (s) => serversJson(\"context_servers\", stdioEntry(s))\n },\n {\n id: \"cline\",\n label: \"Cline\",\n agentName: \"cline\",\n format: \"json\",\n group: \"main\",\n where: \"Add this to ~/.cline/data/settings/cline_mcp_settings.json (in Cline, MCP Servers, Configure opens it).\",\n setup: (s) => serversJson(\"mcpServers\", stdioEntry(s, { disabled: false }))\n },\n {\n id: \"goose\",\n label: \"goose\",\n agentName: \"goose\",\n format: \"yaml\",\n group: \"main\",\n where: \"Add this under extensions in ~/.config/goose/config.yaml, then restart goose.\",\n setup: (s) =>\n [\n \"extensions:\",\n ...yamlBlock(\n [\n \"orbit:\",\n ...yamlBlock([\"type: stdio\", \"name: orbit\", \"enabled: true\", `cmd: ${yamlString(programOf(s))}`, \"args:\", ...yamlBlock(yamlList(argsOf(s)), 1), \"envs:\", ...yamlBlock(yamlMap(s.env), 1), \"timeout: 300\"], 1)\n ],\n 1\n )\n ].join(\"\\n\")\n },\n // More apps, alphabetical.\n {\n id: \"amp\",\n label: \"Amp\",\n agentName: \"amp\",\n format: \"command\",\n group: \"more\",\n where: \"Run this once in a terminal. It writes ~/.config/amp/settings.json.\",\n setup: (s) => command([\"amp\", \"mcp\", \"add\", \"orbit\", ...envFlags(s, \"--env\"), \"--\", ...s.command])\n },\n {\n id: \"anythingllm\",\n label: \"AnythingLLM\",\n agentName: \"anythingllm\",\n format: \"json\",\n group: \"more\",\n where:\n \"Add this to anythingllm_mcp_servers.json, in ~/Library/Application Support/anythingllm-desktop/storage/plugins on a Mac or ~/.config/anythingllm-desktop/storage/plugins on Linux, then press Refresh in Settings, Agent Skills.\",\n setup: (s) => serversJson(\"mcpServers\", stdioEntry(s))\n },\n {\n id: \"auggie\",\n label: \"Auggie CLI\",\n agentName: \"auggie\",\n format: \"json\",\n group: \"more\",\n where: \"Add this to ~/.augment/settings.json, then start a new Auggie session.\",\n setup: (s) => serversJson(\"mcpServers\", stdioEntry(s, {}, \"stdio\"))\n },\n {\n id: \"augment\",\n label: \"Augment Code (VS Code and JetBrains)\",\n agentName: \"augment\",\n format: \"json\",\n group: \"more\",\n where: \"In the Augment panel, open Settings, then the MCP section's Import from JSON, paste this and save.\",\n setup: (s) => serversJson(\"mcpServers\", stdioEntry(s))\n },\n {\n id: \"cherry-studio\",\n label: \"Cherry Studio\",\n agentName: \"cherry\",\n format: \"json\",\n group: \"more\",\n where: \"In Settings, MCP, MCP Servers, choose Add, then Import from JSON and paste this. Turn it on, then give it to an agent.\",\n setup: (s) => serversJson(\"mcpServers\", stdioEntry(s))\n },\n {\n id: \"droid\",\n label: \"Droid (Factory)\",\n agentName: \"droid\",\n format: \"json\",\n group: \"more\",\n where: \"Add this to ~/.factory/mcp.json. Droid picks it up when the file changes.\",\n setup: (s) => serversJson(\"mcpServers\", stdioEntry(s, {}, \"stdio\"))\n },\n {\n id: \"jan\",\n label: \"Jan\",\n agentName: \"jan\",\n format: \"json\",\n group: \"more\",\n where: \"In Settings, MCP Servers, use Edit All Servers JSON to add this. Or add it to mcp_config.json in Jan's data folder (~/Library/Application Support/Jan/data on a Mac, ~/.local/share/Jan/data on Linux) and restart Jan.\",\n setup: (s) => serversJson(\"mcpServers\", stdioEntry(s, { active: true }))\n },\n {\n id: \"kilo-code\",\n label: \"Kilo Code\",\n agentName: \"kilo\",\n format: \"command\",\n group: \"more\",\n where: \"Run this once in a terminal. It writes Kilo's global config, which its CLI and editor extensions share.\",\n setup: (s) => command([\"kilo\", \"mcp\", \"add\", \"orbit\", ...envFlags(s, \"--env\"), \"--\", ...s.command])\n },\n {\n id: \"kiro\",\n label: \"Kiro\",\n agentName: \"kiro\",\n format: \"json\",\n group: \"more\",\n where: `Add this to ~/.kiro/settings/mcp.json. Kiro's IDE and CLI read the same file, so one setup covers both and ${SAME_NAME}.`,\n setup: (s) => serversJson(\"mcpServers\", stdioEntry(s)),\n install: {\n label: \"Add to Kiro\",\n href: (s) => `https://kiro.dev/launch/mcp/add?name=orbit&config=${encodeURIComponent(JSON.stringify(stdioEntry(s)))}`\n }\n },\n {\n id: \"librechat\",\n label: \"LibreChat\",\n agentName: \"librechat\",\n format: \"yaml\",\n group: \"more\",\n where: \"Add this to librechat.yaml in LibreChat's folder, then restart LibreChat. Orbit must be installed where LibreChat runs.\",\n setup: (s) =>\n [\n \"mcpServers:\",\n ...yamlBlock([\"orbit:\", ...yamlBlock([\"type: stdio\", `command: ${yamlString(programOf(s))}`, \"args:\", ...yamlBlock(yamlList(argsOf(s)), 1), \"serverInstructions: true\", \"env:\", ...yamlBlock(yamlMap(s.env), 1)], 1)], 1)\n ].join(\"\\n\")\n },\n {\n id: \"lm-studio\",\n label: \"LM Studio\",\n agentName: \"lmstudio\",\n format: \"json\",\n group: \"more\",\n where: \"Add this to ~/.lmstudio/mcp.json (in the Program tab, Install, Edit mcp.json opens it). LM Studio loads it when you save.\",\n setup: (s) => serversJson(\"mcpServers\", stdioEntry(s)),\n install: {\n label: \"Add to LM Studio\",\n href: (s) => `lmstudio://add_mcp?name=orbit&config=${encodeURIComponent(base64(JSON.stringify(stdioEntry(s))))}`\n }\n },\n {\n id: \"lobehub\",\n label: \"LobeHub\",\n agentName: \"lobehub\",\n format: \"json\",\n group: \"more\",\n where: \"In the desktop app's Settings, Connectors, import this, then turn it on for an agent in its Connectors.\",\n setup: (s) => serversJson(\"mcpServers\", stdioEntry(s, {}, \"stdio\"))\n },\n {\n id: \"msty-studio\",\n label: \"Msty Studio\",\n agentName: \"msty\",\n format: \"json\",\n group: \"more\",\n where: \"In Toolbox, Tools, add a tool named orbit, choose STDIO / JSON and paste this, then add it to a toolset.\",\n setup: (s) => json(stdioEntry(s))\n },\n {\n id: \"openhands\",\n label: \"OpenHands\",\n agentName: \"openhands\",\n format: \"form\",\n group: \"more\",\n where: \"In Agent Canvas, open Customize, MCP Servers, Add custom server, and fill in these fields. New conversations get it.\",\n setup: (s) => [\"Server Type: STDIO\", \"Name: orbit\", `Command: ${programOf(s)}`, `Command Arguments: ${argsOf(s).join(\" \")}`, \"Environment Variables:\", ...envPairs(s)].join(\"\\n\")\n },\n {\n id: \"qwen-code\",\n label: \"Qwen Code\",\n agentName: \"qwen\",\n format: \"command\",\n group: \"more\",\n where: \"Run this once in a terminal, then restart Qwen Code.\",\n setup: (s) => command([\"qwen\", \"mcp\", \"add\", \"-s\", \"user\", ...envFlags(s, \"-e\"), \"orbit\", ...s.command])\n },\n {\n id: \"raycast\",\n label: \"Raycast\",\n agentName: \"raycast\",\n format: \"form\",\n group: \"more\",\n where: \"Run Raycast's Install MCP Server command and fill in these fields.\",\n setup: (s) => [\"Name: orbit\", \"Transport: Standard Input/Output\", `Command: ${programOf(s)}`, `Arguments: ${argsOf(s).join(\" \")}`, \"Environment:\", ...envPairs(s)].join(\"\\n\")\n },\n {\n id: \"trae\",\n label: \"TRAE\",\n agentName: \"trae\",\n format: \"json\",\n group: \"more\",\n where: \"In Settings, MCP, choose Add, then Create Manually, paste this and confirm.\",\n setup: (s) => serversJson(\"mcpServers\", stdioEntry(s)),\n install: {\n label: \"Add to TRAE\",\n href: (s) => `trae://trae.ai-ide/mcp-import?type=stdio&name=orbit&config=${encodeURIComponent(base64(JSON.stringify(stdioEntry(s))))}`\n }\n },\n {\n id: \"visual-studio\",\n label: \"Visual Studio (GitHub Copilot)\",\n agentName: \"visualstudio\",\n format: \"json\",\n group: \"more\",\n where: \"Visual Studio runs on Windows: add this to .mcp.json in your user folder (%USERPROFILE%), or in Copilot Chat's agent mode use Tools, +, Add custom MCP server.\",\n setup: (s) => serversJson(\"servers\", stdioEntry(s, {}, \"stdio\")),\n install: {\n label: \"Add to Visual Studio\",\n href: (s) => `https://vs-open.link/mcp-install?${encodeURIComponent(JSON.stringify({ name: \"orbit\", ...stdioEntry(s, {}, \"stdio\") }))}`\n }\n },\n {\n id: \"warp\",\n label: \"Warp\",\n agentName: \"warp\",\n format: \"json\",\n group: \"more\",\n where: \"Add this to ~/.warp/.mcp.json. Warp picks it up when you save.\",\n setup: (s) => serversJson(\"mcpServers\", stdioEntry(s))\n }\n];\n\n/** Every app the picker offers: the main list in order, \"More apps\" alphabetical, then the catch-all. */\nexport const MCP_APPS: readonly McpApp[] = [...NAMED_APPS, OTHER_APP];\nexport const MCP_MAIN_APPS = NAMED_APPS.filter((app) => app.group === \"main\");\nexport const MCP_MORE_APPS = NAMED_APPS.filter((app) => app.group === \"more\");\nexport const MCP_OTHER_APP = OTHER_APP;\n\n/** Apps that reach servers only over the internet, said in one line under the picker. */\nexport const REMOTE_ONLY_APPS_LINE = \"ChatGPT and Claude on the web, Le Chat and other web chat apps only connect to servers on the internet, so they can't reach Orbit yet. Use their desktop app, or an agent on this computer.\";\n\n/** The app with this id, or the catch-all. */\nexport function mcpApp(id: string): McpApp {\n return MCP_APPS.find((app) => app.id === id) ?? OTHER_APP;\n}\n\n/** One plain word (letters, digits, dot, dash, underscore), so it can't break the command it's pasted into. */\nexport function safeAgentName(name: unknown): string {\n const raw = typeof name === \"string\" ? name : \"\";\n const word = raw\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n .slice(0, 40);\n return word || \"agent\";\n}\n\n/** The sentence to say to an agent once; with `remote`, for an agent on another computer reaching this Orbit at that address. */\nexport function connectSentence(slug: string, remote = \"\"): string {\n const learn = `run orbit help to learn it, and name the board in commands (orbit view ${slug}, ${slug}#12) unless the repo's orbit.json names it.`;\n if (!remote) return `Use Orbit for this project's tasks, on the board ${slug}: ${learn}`;\n return `Use Orbit for this project's tasks, on the board ${slug}. Orbit runs at ${remote}: install it with npm i -g @starlove/orbit if orbit is missing, run every orbit command with ORBIT_MODE=remote ORBIT_API_URL=${remote} and ORBIT_AGENT_NAME set to your name, then ${learn}`;\n}\n\n/** The address agents on other computers use: the page's own, with any path Orbit is served under. */\nexport function pageApiUrl(location: { origin: string; pathname: string }): string {\n return `${location.origin}${location.pathname.replace(/\\/[^/]*$/, \"\")}`;\n}\n\n/** True when the page was opened on the computer Orbit runs on (a loopback address). */\nexport function isLoopbackHost(hostname: string): boolean {\n const host = hostname.replace(/^\\[|\\]$/g, \"\").toLowerCase();\n return host === \"localhost\" || host.endsWith(\".localhost\") || host === \"::1\" || /^127\\.\\d+\\.\\d+\\.\\d+$/.test(host);\n}\n\n/** The command that starts Orbit when an app can't find `orbit` on its PATH. */\nexport function orbitCommandFor(mcpServerPath: string): string[] {\n return [\"node\", mcpServerPath.replace(/mcp-server\\.js$/, \"cli/orbit.js\")];\n}\n\nexport interface SetupOptions {\n agentName: string;\n /** A data folder, only when it isn't the default. */\n dataDir?: string;\n /** This Orbit's address, for an agent on another computer: `orbit mcp` in remote mode. */\n remote?: string;\n /** How to start Orbit: `orbit`, or node and its full path. */\n command?: string[];\n}\n\n/** The server a setup describes, from the person's choices. */\nexport function orbitServer(options: SetupOptions): OrbitServer {\n const name = safeAgentName(options.agentName);\n const remote = options.remote ?? \"\";\n const dataDir = options.dataDir ?? \"\";\n const env: Record<string, string> = remote ? { ORBIT_MODE: \"remote\", ORBIT_API_URL: remote, ORBIT_AGENT_NAME: name } : { ORBIT_AGENT_NAME: name, ...(dataDir ? { DATA_DIR: dataDir } : {}) };\n return { command: [...(options.command ?? [\"orbit\"]), \"mcp\"], env };\n}\n\n/** The setup text for one app: a command to run, a config to paste, or fields to fill. */\nexport function mcpSetupText(appId: string, options: SetupOptions): string {\n return mcpApp(appId).setup(orbitServer(options));\n}\n\n/** The app's one-step install link, carrying the same server as the setup text; null when its maker documents none. */\nexport function mcpInstallLink(appId: string, options: SetupOptions): { label: string; href: string } | null {\n const install = mcpApp(appId).install;\n return install ? { label: install.label, href: install.href(orbitServer(options)) } : null;\n}\n\n/** Where this Orbit runs, as the board's context answers the person's own app. */\nexport interface Deployment {\n data_dir: string;\n data_dir_default: boolean;\n mcp_server_path: string;\n}\n\n/**\n * The options mcpSetupText needs: a data folder only when it isn't the default,\n * and orbit or its full path. With `remote`, only the address: this Orbit's\n * folders and files don't exist on the agent's computer.\n */\nexport function connectSetupOptions(deployment: Partial<Deployment> | undefined, { agentName, fullPath, remote = \"\" }: { agentName: string; fullPath: boolean; remote?: string }): SetupOptions {\n if (remote) return { agentName, remote, command: [\"orbit\"] };\n const dataDir = deployment?.data_dir ?? \"\";\n const serverPath = deployment?.mcp_server_path ?? \"\";\n return {\n agentName,\n dataDir: dataDir && !deployment?.data_dir_default ? dataDir : \"\",\n command: fullPath && serverPath ? orbitCommandFor(serverPath) : [\"orbit\"]\n };\n}\n\n/** Orbit in its container: its own paths don't exist where the agent runs. */\nexport function runsInContainer(deployment: Partial<Deployment> | undefined): boolean {\n return Boolean(deployment?.mcp_server_path?.startsWith(\"/app/\") && deployment.data_dir === \"/data\");\n}\n","// Small pieces Settings' tabs share. Each tab is one flat sheet: sections with\n// a plain heading and space between them, no frames. Code is the one thing in\n// a panel, with a quiet Copy in its corner; extras fold under a disclosure; an\n// on/off that governs a section is a switch at the right of its heading.\n\nimport type { ChangeEvent, KeyboardEvent, ReactNode } from \"react\";\n\ninterface SectionProps {\n /** Names the section and its heading's id. */\n id: string;\n /** The heading; a tab with one section needs none, since the tab names it. */\n title?: string;\n /** The section's name for a screen reader when it has no heading. */\n label?: string;\n /** Destructive sections: the heading in the danger colour. */\n danger?: boolean;\n /** A control at the right of the heading's line (the switch that governs the section). */\n aside?: ReactNode;\n /** The line of words under the heading. */\n lead?: ReactNode;\n children?: ReactNode;\n}\n\n/** One section of a sheet: a heading in the card drawer's voice, a line of words, then its controls. */\nexport function Section({ id, title, label, danger, aside, lead, children }: SectionProps) {\n const headingId = `${id}Heading`;\n const heading = title ? (\n <h3 className={danger ? \"sheet-heading sheet-heading--danger\" : \"sheet-heading\"} id={headingId}>\n {title}\n </h3>\n ) : null;\n return (\n <section className={danger ? \"sheet-section sheet-section--danger\" : \"sheet-section\"} id={id} aria-labelledby={title ? headingId : undefined} aria-label={title ? undefined : label}>\n {aside ? (\n <div className=\"sheet-heading-line\">\n {heading}\n {aside}\n </div>\n ) : (\n heading\n )}\n {lead ? <p className=\"sheet-lead\">{lead}</p> : null}\n {children}\n </section>\n );\n}\n\ninterface CodeBlockProps {\n text: string;\n /** What Copy copies, for a screen reader: \"the sentence\". */\n what: string;\n onCopy: () => void;\n /** Attributes for the Copy button (data-copy-connect) and the code. */\n copyAttrs?: Record<string, string>;\n codeAttrs?: Record<string, string>;\n /** A link beside Copy (an app's \"Add to\" link). */\n extra?: ReactNode;\n}\n\n/** Code in an inset panel, with a quiet Copy word in its corner. */\nexport function CodeBlock({ text, what, onCopy, copyAttrs, codeAttrs, extra }: CodeBlockProps) {\n return (\n <div className=\"sheet-code\">\n <pre>\n <code {...codeAttrs}>{text}</code>\n </pre>\n <div className=\"sheet-code-actions\">\n {extra}\n <button type=\"button\" data-variant=\"ghost\" data-no-arc=\"\" className=\"sheet-quiet-button\" onClick={onCopy} {...copyAttrs}>\n Copy<span className=\"sheet-hidden\"> {what}</span>\n </button>\n </div>\n </div>\n );\n}\n\n/** Secondary detail, folded under a quiet disclosure. */\nexport function More({ title, open, children }: { title: ReactNode; open?: boolean; children?: ReactNode }) {\n return (\n <details className=\"sheet-more\" open={open}>\n <summary>{title}</summary>\n <div className=\"sheet-more-body\">{children}</div>\n </details>\n );\n}\n\n/** ss-ui's switch, its state (On or Off) beside it; the input takes its name from `labelledBy`. */\nexport function Switch({ id, checked, labelledBy, onChange }: { id: string; checked: boolean; labelledBy: string; onChange: (event: ChangeEvent<HTMLInputElement>) => void }) {\n return (\n <label className=\"switch sheet-switch\" htmlFor={id}>\n <span className=\"sheet-switch-state\" aria-hidden=\"true\">\n {checked ? \"On\" : \"Off\"}\n </span>\n <input type=\"checkbox\" role=\"switch\" id={id} checked={checked} aria-labelledby={labelledBy} onChange={onChange} />\n <span className=\"switch-track\" aria-hidden=\"true\" />\n </label>\n );\n}\n\ninterface SegmentedProps<T extends string> {\n label: string;\n labelId: string;\n options: { value: T; label: string }[];\n value: T;\n onChange: (value: T) => void;\n}\n\n/** A segmented control in ss-ui's markup, as a radio group: one Tab stop, arrow keys move the choice. */\nexport function Segmented<T extends string>({ label, labelId, options, value, onChange }: SegmentedProps<T>) {\n const move = (event: KeyboardEvent<HTMLDivElement>): void => {\n const step = event.key === \"ArrowRight\" || event.key === \"ArrowDown\" ? 1 : event.key === \"ArrowLeft\" || event.key === \"ArrowUp\" ? -1 : 0;\n if (!step) return;\n event.preventDefault();\n const at = options.findIndex((option) => option.value === value);\n const index = (at + step + options.length) % options.length;\n const next = options[index];\n if (!next) return;\n onChange(next.value);\n event.currentTarget.querySelectorAll<HTMLButtonElement>(\"button\")[index]?.focus();\n };\n return (\n <div className=\"sheet-choice\">\n <span className=\"sheet-choice-label\" id={labelId}>\n {label}\n </span>\n <div className=\"segmented\" role=\"radiogroup\" aria-labelledby={labelId} onKeyDown={move}>\n {options.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n data-variant=\"ghost\"\n data-no-arc=\"\"\n className=\"segmented-option\"\n role=\"radio\"\n aria-checked={option.value === value}\n tabIndex={option.value === value ? 0 : -1}\n onClick={() => onChange(option.value)}\n >\n {option.label}\n </button>\n ))}\n </div>\n </div>\n );\n}\n\ninterface CheckRowProps {\n id: string;\n /** Names the box for its label's `for`, as the rows that had one do. */\n withFor?: boolean;\n checked?: boolean;\n onChange: (event: ChangeEvent<HTMLInputElement>) => void;\n title: string;\n description?: ReactNode;\n}\n\n/** A check box styled as Orbit's (.orbit-check), with its title and an optional line under it. */\nexport function CheckRow({ id, withFor: labelled, checked, onChange, title, description }: CheckRowProps) {\n const withFor = labelled ?? false;\n return (\n <label className=\"orbit-check settings-toggle\" htmlFor={withFor ? id : undefined}>\n <input type=\"checkbox\" id={id} checked={checked} onChange={onChange} />\n <span className=\"orbit-check-box\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 16 16\" className=\"orbit-check-tick\">\n <path d=\"M3.5 8.5l3 3 6-7\" />\n </svg>\n </span>\n <span className=\"settings-toggle-text\">\n <span className=\"settings-row-title\">{title}</span>\n {description ? <span className=\"description\">{description}</span> : null}\n </span>\n </label>\n );\n}\n\n/** Puts text on the clipboard; where the Clipboard API is missing, through a hidden text area. */\nexport async function copyText(value: string): Promise<void> {\n // The Clipboard API is missing on pages that aren't a secure context.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(value);\n return;\n }\n const textArea = document.createElement(\"textarea\");\n textArea.value = value;\n textArea.setAttribute(\"readonly\", \"\");\n textArea.style.position = \"fixed\";\n textArea.style.left = \"-9999px\";\n document.body.append(textArea);\n textArea.select();\n // The only way to copy without the Clipboard API.\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n document.execCommand(\"copy\");\n textArea.remove();\n}\n","// Settings > AI (on a computer's Orbit): the switch that turns AI on for the\n// board, first and alone when it's off; then the board's instructions for\n// agents, which a person writes once and agents read on every card; then\n// Connect your agents, where the person says which kind of agent they have and\n// sees only its steps (the sentence for agents with a shell, the setup for MCP\n// apps).\n\nimport { useEffect, useState } from \"react\";\nimport type { BoardManual } from \"../../../src/core/boards.ts\";\nimport type { Board } from \"../../../src/core/model.ts\";\nimport { cleanText, escapeHtml, renderPreservedText } from \"../lib/format.ts\";\nimport { useOrbit } from \"../orbit/context.tsx\";\nimport { EditableTextView, useEditableText } from \"../ui/EditableText.tsx\";\nimport { toast } from \"../ui/toast.ts\";\nimport {\n MCP_MAIN_APPS,\n MCP_MORE_APPS,\n MCP_OTHER_APP,\n REMOTE_ONLY_APPS_LINE,\n connectSentence,\n connectSetupOptions,\n isLoopbackHost,\n mcpApp,\n mcpInstallLink,\n mcpSetupText,\n pageApiUrl,\n runsInContainer,\n safeAgentName\n} from \"./connect-agents.ts\";\nimport type { McpApp } from \"./connect-agents.ts\";\nimport { CheckRow, CodeBlock, Section, Segmented, Switch, copyText } from \"./parts.tsx\";\n\ntype Deployment = BoardManual[\"deployment\"];\ntype AgentKind = \"shell\" | \"mcp\";\n\nconst AGENT_KINDS: { value: AgentKind; label: string }[] = [\n { value: \"shell\", label: \"An agent with a shell\" },\n { value: \"mcp\", label: \"An app that uses MCP\" }\n];\n\nexport function AiTab({ board }: { board: Board }) {\n const app = useOrbit();\n // The switch as just pressed, until the board reads it back.\n const [pendingAi, setPendingAi] = useState<boolean | null>(null);\n const aiEnabled = pendingAi ?? board.ai_enabled !== 0;\n\n const setAi = (enabled: boolean): void => {\n setPendingAi(enabled);\n void (async () => {\n await app.call(() => app.client.boards.update(board.id, { ai_enabled: enabled }));\n await app.load();\n toast.success(enabled ? \"AI is on: the AI Ready, In Progress and Review lanes are ready\" : \"AI is off: AI Ready is hidden\");\n })()\n .catch(() => undefined)\n .finally(() => setPendingAi(null));\n };\n\n return (\n <div className=\"settings-sheet\">\n <Section\n id=\"aiOnBoard\"\n title=\"AI on this board\"\n aside={<Switch id=\"aiEnabledToggle\" checked={aiEnabled} labelledBy=\"aiOnBoardHeading\" onChange={(event) => setAi(event.currentTarget.checked)} />}\n lead={\n <>\n Adds the <strong>AI Ready</strong>, <strong>In Progress</strong> and <strong>Review</strong> lanes if they're missing, shows agent fields on cards, and lets agents connect. Turning it off hides AI Ready; its cards stay where they are.\n </>\n }\n />\n {aiEnabled ? <AgentInstructions board={board} /> : null}\n {aiEnabled ? <ConnectAgents board={board} /> : null}\n </div>\n );\n}\n\nconst INSTRUCTIONS_PLACEHOLDER = \"This project is about…\\n\\nHow agents should work on it: the stack, the rules, how to check their work.\";\n\nfunction AgentInstructions({ board }: { board: Board }) {\n const app = useOrbit();\n const instructions = board.agent_instructions;\n const field = useEditableText({\n value: instructions,\n fieldName: \"agent_instructions\",\n multiline: true,\n ariaLabel: \"Edit agent instructions\",\n onCommit: async (next) => {\n try {\n await app.call(() => app.client.boards.update(board.id, { agent_instructions: cleanText(next) }));\n await app.load();\n toast.success(\"Saved\");\n } catch {\n // Said in a toast already.\n }\n }\n });\n const hasInstructions = Boolean(instructions.trim());\n return (\n <Section id=\"agentInstructions\" title=\"Agent instructions\">\n <div className=\"inline-md-field\">\n <EditableTextView\n field={field}\n noun=\"agent instructions\"\n has={hasInstructions}\n fieldName=\"agent_instructions\"\n lead={<p className=\"sheet-lead\">Agents read this whenever they work on this board's cards.</p>}\n html={hasInstructions ? renderPreservedText(instructions) : escapeHtml(INSTRUCTIONS_PLACEHOLDER)}\n bodyClassName={`inline-md-field-body preserved-text-body editable-field settings-agent-instructions-body${hasInstructions ? \"\" : \" is-placeholder\"}`}\n />\n </div>\n </Section>\n );\n}\n\n/** Where this Orbit runs (its data folder and server path), which the setup text names; read once per board. */\nfunction useDeployment(boardId: string): { loaded: boolean; deployment: Deployment } {\n const app = useOrbit();\n const [read, setRead] = useState<{ boardId: string; deployment: Deployment } | null>(null);\n useEffect(() => {\n let live = true;\n app.call(() => app.client.boards.context(boardId)).then(\n (manual) => {\n if (live) setRead({ boardId, deployment: manual.deployment });\n },\n () => undefined\n );\n return () => {\n live = false;\n };\n }, [app, boardId]);\n return read?.boardId === boardId ? { loaded: true, deployment: read.deployment } : { loaded: false, deployment: undefined };\n}\n\n/** Says a copy worked, or how to copy by hand when it didn't. */\nfunction copyWithToast(text: string, done: string): void {\n copyText(text).then(\n () => toast.success(done),\n () => toast.error(\"Couldn't copy. Select the text and copy it yourself.\")\n );\n}\n\n/**\n * Connect your agents. Agents with a shell need only `orbit` and the\n * sentence, which costs them fewer tokens, so that path comes first; MCP apps\n * get one user-wide server named orbit.\n */\nfunction ConnectAgents({ board }: { board: Board }) {\n const slug = board.slug || \"your-board\";\n const { loaded, deployment } = useDeployment(board.id);\n if (!loaded) return null;\n if (runsInContainer(deployment)) {\n return (\n <Section id=\"connectAgents\" title=\"Connect your agents\">\n <p className=\"sheet-lead\">\n Orbit runs in a container, so its /app/lib/mcp-server.js and /data paths don't exist where your agent runs. Install Orbit there (<code>npm i -g @starlove/orbit</code>), then give the agent <code>ORBIT_MODE=remote</code>, <code>ORBIT_API_URL=&lt;your private Orbit address&gt;</code> and <code>ORBIT_BOARD={slug}</code>, for <code>orbit</code> in a shell or <code>orbit mcp</code> in an MCP app. Keep the address private: this release doesn't sign in remote clients, so anyone who reaches it owns the board.\n </p>\n </Section>\n );\n }\n return <ConnectAgentsSetup slug={slug} deployment={deployment} />;\n}\n\nfunction ConnectAgentsSetup({ slug, deployment }: { slug: string; deployment: Deployment }) {\n const [kind, setKind] = useState<AgentKind>(\"shell\");\n // A page opened from another address than loopback isn't on the computer Orbit runs on, so the\n // agent is most likely elsewhere too: the steps start in remote form, and the person can switch.\n const [elsewhere, setElsewhere] = useState(() => !isLoopbackHost(window.location.hostname));\n const apiUrl = pageApiUrl(window.location);\n const remote = elsewhere ? apiUrl : \"\";\n\n return (\n <Section id=\"connectAgents\" title=\"Connect your agents\">\n <Segmented label=\"Your agent is\" labelId=\"agentKindLabel\" options={AGENT_KINDS} value={kind} onChange={setKind} />\n <CheckRow\n id=\"connectElsewhereToggle\"\n checked={elsewhere}\n onChange={(event) => setElsewhere(event.currentTarget.checked)}\n title=\"My agent runs on another computer\"\n />\n {kind === \"shell\" ? <ShellSteps slug={slug} remote={remote} /> : <McpSteps deployment={deployment} remote={remote} />}\n </Section>\n );\n}\n\nfunction ShellSteps({ slug, remote }: { slug: string; remote: string }) {\n const sentence = connectSentence(slug, remote);\n return (\n <div className=\"sheet-steps\">\n <p className=\"sheet-lead\">\n Claude Code, Codex, Cursor, Copilot CLI, Gemini CLI, OpenCode, Hermes Agent, OpenClaw, Pi, goose and most other coding agents need only the <code>orbit</code> command,{\" \"}\n {remote ? (\n <>\n installed on their computer (<code>npm i -g @starlove/orbit</code>)\n </>\n ) : (\n \"which came with Orbit\"\n )}\n . Say this to your agent once, or put it in the project's AGENTS.md or CLAUDE.md so every session knows:\n </p>\n <CodeBlock text={sentence} what=\"the sentence\" onCopy={() => copyWithToast(sentence, \"Sentence copied\")} copyAttrs={{ \"data-copy-connect\": \"sentence\" }} codeAttrs={{ \"data-connect-sentence\": \"\" }} />\n </div>\n );\n}\n\nfunction AppOption({ app }: { app: McpApp }) {\n return <option value={app.id}>{app.label}</option>;\n}\n\nfunction McpSteps({ deployment, remote }: { deployment: Deployment; remote: string }) {\n const [appId, setAppId] = useState(MCP_MAIN_APPS[0]?.id ?? MCP_OTHER_APP.id);\n const [agentName, setAgentName] = useState(mcpApp(appId).agentName);\n const [fullPath, setFullPath] = useState(false);\n const chosen = mcpApp(appId);\n const options = connectSetupOptions(deployment, { agentName: safeAgentName(agentName), fullPath, remote });\n const setup = mcpSetupText(appId, options);\n const link = mcpInstallLink(appId, options);\n const external = link?.href.startsWith(\"https:\") ?? false;\n\n return (\n <div className=\"sheet-steps\">\n <p className=\"sheet-lead\">Add one server for your user, named orbit. Cards show the agent's name, so you can tell your agents apart.</p>\n <div className=\"control-grid sheet-fields\">\n <label className=\"control-field\">\n <span className=\"control-field-label\">Agent app</span>\n <select\n id=\"mcpClientSelect\"\n className=\"select-chevron-field\"\n value={appId}\n onChange={(event) => {\n const next = mcpApp(event.currentTarget.value);\n setAppId(next.id);\n // Each app suggests its own agent name.\n setAgentName(next.agentName);\n }}\n >\n {MCP_MAIN_APPS.map((app) => (\n <AppOption key={app.id} app={app} />\n ))}\n <optgroup label=\"More apps\">\n {MCP_MORE_APPS.map((app) => (\n <AppOption key={app.id} app={app} />\n ))}\n </optgroup>\n <AppOption app={MCP_OTHER_APP} />\n </select>\n </label>\n <label className=\"control-field\">\n <span className=\"control-field-label\">Agent name</span>\n <input id=\"mcpAgentNameInput\" value={agentName} autoComplete=\"off\" spellCheck={false} onChange={(event) => setAgentName(event.currentTarget.value)} />\n </label>\n </div>\n <p className=\"sheet-note\">{REMOTE_ONLY_APPS_LINE}</p>\n <p className=\"sheet-lead\" data-mcp-helper=\"\">\n {chosen.where}\n </p>\n <CodeBlock\n text={setup}\n what={`the ${chosen.label} setup`}\n onCopy={() => copyWithToast(setup, \"Setup copied\")}\n copyAttrs={{ \"data-copy-connect\": \"setup\" }}\n codeAttrs={{ \"data-mcp-config\": \"\" }}\n extra={\n link ? (\n <a className=\"sheet-quiet-button\" href={link.href} data-mcp-install=\"\" target={external ? \"_blank\" : undefined} rel={external ? \"noopener\" : undefined}>\n {link.label}\n </a>\n ) : null\n }\n />\n {remote ? null : (\n <CheckRow\n id=\"mcpFullPathToggle\"\n checked={fullPath}\n onChange={(event) => setFullPath(event.currentTarget.checked)}\n title=\"The app can't find orbit\"\n description=\"Use the full path to Orbit instead, for apps started outside your terminal.\"\n />\n )}\n </div>\n );\n}\n","/**\n * Starscape v3 — scroll-aware: marks that the page has scrolled.\n *\n * Framework-free and dependency-free. The mark goes on once window.scrollY\n * passes a threshold (strictly greater), in one of two forms:\n *\n * import { setupScrollAware } from '@starlove/ui/scroll-aware';\n *\n * // A class on <body>: body.is-scrolled past 4 px, which the .topbar\n * // (components/topbar.css) lights its glass from. useScrollAware's default.\n * const undo = setupScrollAware();\n *\n * // Or an attribute on an element, \"true\" past the threshold and \"false\"\n * // before it: starscape.biz's header lift (src/scripts/chrome.ts,\n * // initHeader; 2026-10-21).\n * setupScrollAware({ target: header, attribute: 'data-elevated', threshold: 24 });\n *\n * It marks at once, so a page that opens already scrolled (a reload, a #link)\n * starts marked, and then follows one passive scroll listener per mark.\n * Idempotent per target: calls for the same target and mark share that\n * listener, each returns its own undo, and the smallest threshold among them\n * decides. The last undo removes the listener and puts the target back as it\n * was. A threshold of Infinity never passes, so it binds nothing. SSR-safe:\n * without a DOM it does nothing.\n */\n\n/** Marks by target, then by 'class:<name>' or 'attr:<name>'. */\nconst bindings = new WeakMap();\nconst noop = () => {};\n\n/**\n * @param {import('./scroll-aware').ScrollAwareOptions} [options]\n * @returns {() => void} undo\n */\nexport function setupScrollAware(options = {}) {\n if (typeof window === 'undefined' || typeof document === 'undefined') return noop;\n const threshold = typeof options.threshold === 'number' && !Number.isNaN(options.threshold) ? options.threshold : 4;\n if (threshold === Infinity) return noop;\n const target = options.target === undefined ? document.body : options.target;\n if (!target) return noop;\n const attribute = options.attribute || '';\n const className = options.className || 'is-scrolled';\n const key = attribute ? `attr:${attribute}` : `class:${className}`;\n\n let marks = bindings.get(target);\n if (!marks) bindings.set(target, (marks = new Map()));\n let mark = marks.get(key);\n if (!mark) {\n mark = bind(target, attribute, className);\n marks.set(key, mark);\n }\n const user = { threshold };\n mark.users.add(user);\n mark.update();\n\n let done = false;\n return () => {\n if (done) return;\n done = true;\n mark.users.delete(user);\n if (mark.users.size > 0) return mark.update();\n marks.delete(key);\n mark.unbind();\n };\n}\n\nfunction bind(target, attribute, className) {\n // What was there before, to put back on the last undo.\n const before = attribute ? target.getAttribute(attribute) : target.classList.contains(className);\n /** @type {boolean | null} the mark as last written */\n let on = null;\n const users = new Set();\n const update = () => {\n let threshold = Infinity;\n for (const u of users) threshold = Math.min(threshold, u.threshold);\n const now = window.scrollY > threshold;\n if (now === on) return; // only write when it changes\n on = now;\n if (attribute) target.setAttribute(attribute, String(now));\n else target.classList.toggle(className, now);\n };\n window.addEventListener('scroll', update, { passive: true });\n return {\n users,\n update,\n unbind() {\n window.removeEventListener('scroll', update);\n if (!attribute) target.classList.toggle(className, before);\n else if (before === null) target.removeAttribute(attribute);\n else target.setAttribute(attribute, before);\n },\n };\n}\n","/**\n * Starscape v3 — copy: buttons that put text on the clipboard.\n *\n * Framework-free and dependency-free. Ported from starscape.biz's\n * src/scripts/support.ts (the support panel's Copy buttons, 2026-10-21) and\n * made generic; this package is now the shared home. Markup and bindings:\n * the package README, \"Copy\".\n *\n * <code id=\"install\">pnpm add @starlove/ui</code>\n * <button type=\"button\" data-copy-target=\"#install\">Copy<span class=\"visually-hidden\"> the install command</span></button>\n * <button type=\"button\" data-copy=\"team@starscape.app\">Copy<span class=\"visually-hidden\"> the address</span></button>\n *\n * import '@starlove/ui/components/copy'; // hides them until JavaScript runs\n * import { initCopy } from '@starlove/ui/copy';\n * const undo = initCopy(); // every copy button on the page, now and later\n *\n * - data-copy=\"…\" copies that text; data-copy-target=\"#id\" copies the\n * target's text as shown (a code block's .line spans become lines), or a\n * field's value.\n * - The button's word (its first text, \"Copy\") reads \"Copied\" for two\n * seconds, with data-copied set meanwhile; what follows the word (a visually\n * hidden \" the install command\") stays as it is.\n * - A polite live region says what happened. It's emptied first and spoken a\n * moment later, so the same words twice are still heard.\n * - When the clipboard says no, the text is selected instead (the target, or\n * the element beside a data-copy button that shows the same text), and the\n * live region says how to copy it by hand.\n * - Copy buttons need JavaScript: components/copy.css hides them until\n * <html data-js>, which initCopy sets. Set it before first paint (as\n * theme-init does) and they arrive with the page, moving nothing.\n *\n * Idempotent: a click is handled once, even when roots nest or one root is\n * initialised twice. CSP-safe: no inline style attributes, only the CSSOM.\n * SSR-safe: without a DOM it does nothing. Returns a teardown function.\n */\n\n/** Words the module says. Pass your own to initCopy to translate them. */\nexport const LABELS = {\n /** The word a button shows for two seconds after it copies. */\n copied: 'Copied',\n /** Said after a copy. `what` is the button's hidden suffix, trimmed (\"the install command\"), or \"\". */\n done: (what) => (what ? `Copied ${what}.` : 'Copied.'),\n /** Said when the clipboard refuses and the text has been selected instead. */\n selected: (what) => `Selected ${what || 'the text'}. Press Ctrl+C or Cmd+C to copy it.`,\n /** Said when the clipboard refuses and nothing on the page shows the text. */\n failed: (what) => `Couldn't copy ${what || 'the text'}.`,\n};\n\n/** How long a button reads \"Copied\". */\nexport const COPIED_MS = 2000;\n/** How long the live region waits, emptied, before it speaks. */\nexport const SPEAK_MS = 100;\n\nconst SELECTOR = 'button[data-copy], button[data-copy-target]';\n\n/** Clicks already handled, so a root around another leaves them alone. */\nconst handled = new WeakSet();\n/** Buttons reading \"Copied\": the text node, its own words, and the timer that puts them back. */\nconst shown = new Map();\n/** Live regions, by the element they live in: <body>, or an open <dialog>. */\nconst regions = new Map();\nlet users = 0;\nlet speaking;\n\n/** The button's word: its first direct text node with something in it. */\nfunction wordOf(button) {\n for (const node of button.childNodes) {\n if (node.nodeType === 3 && node.data.trim()) return node;\n }\n return null;\n}\n\n/** What the button copies, in words: whatever follows its word, trimmed. */\nfunction whatOf(button) {\n const word = wordOf(button);\n let text = '';\n for (let n = word?.nextSibling; n; n = n.nextSibling) text += n.textContent ?? '';\n return text.replace(/\\s+/g, ' ').trim();\n}\n\nconst isField = (el) => el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement;\n\n/** An element's text as shown (a code block's .line spans become lines), or a field's value. */\nconst textOf = (el) => (isField(el) ? el.value : el instanceof HTMLElement ? el.innerText : (el.textContent ?? ''));\n\n/** The element data-copy-target names. \"#id\" is looked up as an id, so React's useId values work unescaped. */\nfunction targetOf(button) {\n const ref = button.getAttribute('data-copy-target');\n if (!ref) return null;\n const root = button.getRootNode();\n if (ref.startsWith('#')) {\n const id = ref.slice(1);\n const el = root.getElementById?.(id) ?? document.getElementById(id);\n if (el) return el;\n }\n try {\n return root.querySelector?.(ref) ?? null;\n } catch {\n return null; // Not a selector: nothing to copy.\n }\n}\n\n/** The text a button copies: data-copy if it has one, else its target's. Null when there's neither. */\nfunction copyTextOf(button) {\n if (button.hasAttribute('data-copy')) return button.getAttribute('data-copy');\n const target = targetOf(button);\n return target ? textOf(target) : null;\n}\n\n/** Beside a data-copy button, in the same parent: the element that shows the same text. */\nfunction shownBeside(button, text) {\n const want = text.trim();\n if (!want || !button.parentElement) return null;\n for (const el of button.parentElement.querySelectorAll('*')) {\n if (el === button || el.contains(button) || button.contains(el)) continue;\n if (textOf(el).trim() === want) return el;\n }\n return null;\n}\n\n/**\n * Selects an element's text, so Ctrl+C or Cmd+C copies it. ss-ui's body is\n * user-select: none, which leaves a scripted selection empty, so the element\n * is made selectable first (and put back by the teardown).\n */\nfunction select(el, granted) {\n if (isField(el)) {\n el.focus();\n el.select();\n return true;\n }\n const cs = getComputedStyle(el);\n if (cs.userSelect === 'none' || cs.webkitUserSelect === 'none') {\n granted.set(el, [el.style.getPropertyValue('user-select'), el.style.getPropertyValue('-webkit-user-select')]);\n el.style.setProperty('-webkit-user-select', 'text');\n el.style.setProperty('user-select', 'text');\n }\n const selection = getSelection();\n selection?.selectAllChildren(el);\n return Boolean(selection?.toString().trim());\n}\n\n/** A visually hidden polite live region in `home`, made once. */\nfunction regionIn(home) {\n let region = regions.get(home);\n if (region?.isConnected) return region;\n region = document.createElement('div');\n region.className = 'visually-hidden';\n region.setAttribute('role', 'status');\n region.setAttribute('aria-live', 'polite');\n region.setAttribute('aria-atomic', 'true');\n region.setAttribute('data-copy-status', '');\n // Hidden through the CSSOM too (CSP-safe), for apps without the utility class.\n Object.assign(region.style, {\n position: 'absolute', width: '1px', height: '1px', margin: '-1px', padding: '0',\n overflow: 'hidden', clip: 'rect(0 0 0 0)', whiteSpace: 'nowrap', border: '0',\n });\n home.append(region);\n regions.set(home, region);\n return region;\n}\n\n/** Speaks where the button's user can hear it: inside its open dialog (a modal one makes the rest of the page inert), else on <body>. */\nfunction say(button, text) {\n const dialog = button.closest('dialog');\n const region = regionIn(dialog?.open ? dialog : document.body);\n clearTimeout(speaking);\n for (const r of regions.values()) r.textContent = '';\n // The same words written twice change nothing, and a screen reader would stay silent.\n speaking = setTimeout(() => (region.textContent = text), SPEAK_MS);\n}\n\n/** Puts the button's own word back. */\nfunction restore(button) {\n const s = shown.get(button);\n if (!s) return;\n clearTimeout(s.timer);\n // Only our word: if a framework has re-rendered the label meanwhile, its text stands.\n if (s.node && s.node.data === s.word) s.node.data = s.original;\n button.removeAttribute('data-copied');\n shown.delete(button);\n}\n\n/** The word reads \"Copied\" for a while; another copy meanwhile restarts the wait. */\nfunction flash(button, word) {\n const node = wordOf(button);\n // A framework may have replaced the label's text node since the last copy.\n if (shown.has(button) && shown.get(button).node !== node) restore(button);\n let s = shown.get(button);\n if (!s) {\n s = { node, original: node?.data, word, timer: 0 };\n shown.set(button, s);\n }\n clearTimeout(s.timer);\n if (node) node.data = word;\n button.setAttribute('data-copied', '');\n s.timer = setTimeout(() => restore(button), COPIED_MS);\n}\n\n/**\n * Makes every copy button under root (or root itself) work, now and as\n * they're added. Sets <html data-js>, which shows them (components/copy.css).\n * Returns a function that undoes what this call did.\n *\n * @param {Document | Element | DocumentFragment} [root] default: the document\n * @param {{ labels?: Partial<typeof LABELS> }} [options]\n * @returns {() => void}\n */\nexport function initCopy(root, options = {}) {\n if (typeof document === 'undefined') return () => {};\n const scope = root ?? document;\n const L = { ...LABELS, ...options.labels };\n document.documentElement.setAttribute('data-js', '');\n users++;\n // Made now rather than at the first copy: a region that already exists is heard more reliably.\n if (document.body) regionIn(document.body);\n const mine = new Set();\n const granted = new Map();\n let live = true;\n\n async function copy(button) {\n const text = copyTextOf(button);\n if (text === null) return;\n const what = whatOf(button);\n try {\n if (!navigator.clipboard?.writeText) throw new Error('No clipboard here');\n await navigator.clipboard.writeText(text);\n if (!live) return;\n mine.add(button);\n flash(button, L.copied);\n say(button, L.done(what));\n } catch {\n if (!live) return;\n // The clipboard said no: select the text, so Ctrl+C or Cmd+C copies it.\n const el = targetOf(button) ?? (button.hasAttribute('data-copy') ? shownBeside(button, text) : null);\n say(button, el && select(el, granted) ? L.selected(what) : L.failed(what));\n }\n }\n\n const onClick = (e) => {\n const button = e.target instanceof Element ? e.target.closest(SELECTOR) : null;\n if (!button || handled.has(e) || !(scope === button || scope.contains(button))) return;\n handled.add(e);\n // Never a form submission, even without type=\"button\".\n e.preventDefault();\n void copy(button);\n };\n scope.addEventListener('click', onClick);\n\n return () => {\n if (!live) return;\n live = false;\n scope.removeEventListener('click', onClick);\n mine.forEach(restore);\n granted.forEach(([us, webkit], el) => {\n el.style.setProperty('user-select', us);\n el.style.setProperty('-webkit-user-select', webkit);\n });\n if (--users === 0) {\n clearTimeout(speaking);\n regions.forEach((r) => r.remove());\n regions.clear();\n }\n };\n}\n","/**\n * Starscape v3 — JS engine for the dark-mode background system.\n *\n * Mounts a `.grain > .milky-way` skeleton if not present, builds 7 signature\n * stars at random positions, runs a 3-layer parallax canvas starfield, and\n * spawns shooting stars every 14–42 seconds. Sleeps in light mode and on\n * `prefers-reduced-motion: reduce`, and holds one still frame in capture mode\n * (<html data-shot>).\n *\n * Port of public/js/starscape.js from minimal-agent-board, with added:\n * - SSR safety\n * - Idempotency (calling twice returns the same handle)\n * - Full teardown on stop()\n * - Auto-sync via MutationObserver on <html data-theme>\n * - Auto-sync via matchMedia for prefers-color-scheme & reduced-motion\n *\n * import { startStarscape } from '@starlove/ui/starscape';\n * const handle = startStarscape();\n * // …\n * handle.stop(); // teardown when you're done\n */\n\nlet activeHandle = null;\n\n/**\n * @typedef {Object} StarscapeOptions\n * @property {Element|string} [mountTo] Element (or selector) to attach to. Defaults to existing `.grain` or document.body.\n * @property {number} [signatureStars=7] Number of signature pinpoint stars.\n * @property {boolean} [canvasStars=true] Whether to run the canvas starfield.\n * @property {boolean} [meteors=true] Whether to spawn shooting stars.\n * @property {boolean} [parallax=true] Whether stars track mouse movement.\n * @property {number} [meteorMinDelay=14000] Minimum ms between meteors.\n * @property {number} [meteorMaxDelay=42000] Maximum ms between meteors.\n * @property {number} [densityScale=1] Multiplier for star count.\n */\n\n/**\n * @typedef {Object} StarscapeHandle\n * @property {() => void} sync Re-evaluate theme + reduced-motion (idempotent).\n * @property {() => void} stop Tear down DOM, listeners, RAF, and timers.\n */\n\n/**\n * Mount the Starscape dark-mode background system.\n *\n * @param {StarscapeOptions} [options]\n * @returns {StarscapeHandle}\n */\nexport function startStarscape(options = {}) {\n // SSR / non-DOM environments: return a no-op handle.\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return { sync: noop, stop: noop };\n }\n\n // Idempotency — if an instance is already running, return its handle so\n // double-mounting is harmless.\n if (activeHandle) return activeHandle;\n\n const opts = {\n mountTo: undefined,\n signatureStars: 7,\n canvasStars: true,\n meteors: true,\n parallax: true,\n meteorMinDelay: 14000,\n meteorMaxDelay: 42000,\n densityScale: 1,\n ...options,\n };\n\n // ---- Resolve / create the .grain mount point ----\n let grain = resolveMount(opts.mountTo);\n let createdGrain = false;\n if (!grain) {\n grain = document.createElement('div');\n grain.className = 'grain';\n grain.setAttribute('aria-hidden', 'true');\n const milky = document.createElement('div');\n milky.className = 'milky-way';\n milky.setAttribute('aria-hidden', 'true');\n grain.appendChild(milky);\n document.body.insertBefore(grain, document.body.firstChild);\n createdGrain = true;\n } else if (!grain.querySelector('.milky-way')) {\n const milky = document.createElement('div');\n milky.className = 'milky-way';\n milky.setAttribute('aria-hidden', 'true');\n grain.insertBefore(milky, grain.firstChild);\n }\n\n // ---- Signature stars ----\n buildSignatureStars(grain, opts.signatureStars);\n\n // ---- Canvas starfield ----\n let canvas = null;\n let ctx = null;\n let stars = [];\n let width = 0;\n let height = 0;\n let rafId = 0;\n let running = false;\n const DPR = Math.min(window.devicePixelRatio || 1, 2);\n const mouse = { x: 0, y: 0, tx: 0, ty: 0 };\n\n if (opts.canvasStars) {\n canvas = document.createElement('canvas');\n canvas.className = 'starfield-canvas';\n canvas.setAttribute('aria-hidden', 'true');\n ctx = canvas.getContext('2d');\n const milky = grain.querySelector('.milky-way');\n if (milky && milky.nextSibling) {\n grain.insertBefore(canvas, milky.nextSibling);\n } else if (milky) {\n grain.appendChild(canvas);\n } else {\n grain.insertBefore(canvas, grain.firstChild);\n }\n }\n\n function resize() {\n if (!canvas || !ctx) return;\n width = window.innerWidth;\n height = window.innerHeight;\n canvas.width = Math.round(width * DPR);\n canvas.height = Math.round(height * DPR);\n canvas.style.width = width + 'px';\n canvas.style.height = height + 'px';\n ctx.setTransform(DPR, 0, 0, DPR, 0, 0);\n buildCanvasStars();\n }\n\n function buildCanvasStars() {\n if (!ctx) return;\n const density = (width * height) / (1440 * 900) * opts.densityScale;\n const layers = [\n { count: Math.round(320 * density), depth: 0.12, sizes: [[1, 0.9], [1.4, 0.1]], glow: 0 },\n { count: Math.round(160 * density), depth: 0.30, sizes: [[1, 0.5], [1.6, 0.4], [2.4, 0.1]], glow: 1.8 },\n { count: Math.round(44 * density), depth: 0.58, sizes: [[1.8, 0.5], [2.6, 0.38], [3.6, 0.12]], glow: 2.4 },\n ];\n const rng = mulberry32(0xc0ffee);\n stars = [];\n for (const layer of layers) {\n for (let i = 0; i < layer.count; i++) {\n const size = pickWeighted(rng(), layer.sizes);\n stars.push({\n x: rng() * width,\n y: rng() * height,\n size,\n depth: layer.depth,\n glow: size >= 2 ? layer.glow : 0,\n rgb: pickStarColor(rng()),\n period: 2.2 + rng() * 5.4,\n phase: rng() * Math.PI * 2,\n amp: 0.25 + rng() * 0.5,\n baseAlpha: size < 1.5 ? 0.45 + rng() * 0.28 : 0.55 + rng() * 0.22,\n });\n }\n }\n }\n\n function frame(t) {\n if (!ctx) return;\n if (opts.parallax) {\n mouse.x += (mouse.tx - mouse.x) * 0.06;\n mouse.y += (mouse.ty - mouse.y) * 0.06;\n } else {\n mouse.x = 0; mouse.y = 0;\n }\n\n ctx.clearRect(0, 0, width, height);\n ctx.globalCompositeOperation = 'lighter';\n\n const time = t / 1000;\n const parallaxPx = 70;\n\n for (let i = 0; i < stars.length; i++) {\n const s = stars[i];\n const pulse = 0.5 + 0.5 * Math.sin(time * ((2 * Math.PI) / s.period) + s.phase);\n const alpha = s.baseAlpha * (1 - s.amp + s.amp * pulse);\n const px = s.x - mouse.x * s.depth * parallaxPx;\n const py = s.y - mouse.y * s.depth * parallaxPx;\n const [r, g, b] = s.rgb;\n\n if (s.glow > 0) {\n const radius = s.size * s.glow;\n const grad = ctx.createRadialGradient(px, py, 0, px, py, radius);\n grad.addColorStop(0, `rgba(${r},${g},${b},${alpha * 0.85})`);\n grad.addColorStop(0.35, `rgba(${r},${g},${b},${alpha * 0.3})`);\n grad.addColorStop(1, `rgba(${r},${g},${b},0)`);\n ctx.fillStyle = grad;\n ctx.beginPath();\n ctx.arc(px, py, radius, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.fillStyle = `rgba(${r},${g},${b},${alpha})`;\n ctx.beginPath();\n ctx.arc(px, py, s.size / 2, 0, Math.PI * 2);\n ctx.fill();\n } else {\n const half = s.size / 2;\n ctx.fillStyle = `rgba(${r},${g},${b},${alpha})`;\n ctx.fillRect(px - half, py - half, s.size, s.size);\n }\n }\n\n ctx.globalCompositeOperation = 'source-over';\n if (running) rafId = requestAnimationFrame(frame);\n }\n\n function drawStaticFrame() {\n if (!ctx) return;\n if (!stars.length) buildCanvasStars();\n frame(0);\n }\n\n function start() {\n if (!ctx || running) return;\n running = true;\n rafId = requestAnimationFrame(frame);\n }\n\n function stopRaf() {\n running = false;\n if (rafId) cancelAnimationFrame(rafId);\n rafId = 0;\n }\n\n // ---- Theme & reduced-motion sync ----\n\n function isDarkMode() {\n const explicit = document.documentElement.getAttribute('data-theme');\n if (explicit === 'dark') return true;\n if (explicit === 'light') return false;\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\n }\n\n function isReducedMotion() {\n // Three resolution states, mirroring useTheme:\n // 1. data-motion=\"reduce\" on <html> → always reduce\n // 2. data-motion=\"full\" on <html> → ignore OS reduce\n // 3. otherwise → defer to OS prefers-reduced-motion\n // Capture mode (<html data-shot>, ?shot) holds one still frame too.\n if (document.documentElement.hasAttribute('data-shot')) return true;\n const explicit = document.documentElement.getAttribute('data-motion');\n if (explicit === 'reduce') return true;\n if (explicit === 'full') return false;\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n }\n\n function sync() {\n const dark = isDarkMode();\n const reduced = isReducedMotion();\n if (!dark) {\n stopRaf();\n if (ctx) ctx.clearRect(0, 0, width, height);\n return;\n }\n if (!stars.length) resize();\n if (reduced || document.hidden) {\n stopRaf();\n drawStaticFrame();\n } else {\n start();\n }\n }\n\n // ---- Mouse / window listeners ----\n\n function onPointerMove(e) {\n if (!opts.parallax || !width || !height) return;\n mouse.tx = e.clientX / width - 0.5;\n mouse.ty = e.clientY / height - 0.5;\n }\n\n function onResize() {\n resize();\n sync();\n }\n\n // Watch <html data-theme> and <html data-motion> attribute changes so\n // theme/motion toggles auto-sync without the consumer wiring up a callback.\n const themeObserver = new MutationObserver(() => sync());\n themeObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme', 'data-motion', 'data-shot'],\n });\n\n const reducedMotionMql = window.matchMedia('(prefers-reduced-motion: reduce)');\n const colorSchemeMql = window.matchMedia('(prefers-color-scheme: dark)');\n reducedMotionMql.addEventListener('change', sync);\n colorSchemeMql.addEventListener('change', sync);\n document.addEventListener('visibilitychange', sync);\n window.addEventListener('resize', onResize, { passive: true });\n window.addEventListener('pointermove', onPointerMove, { passive: true });\n\n // ---- Meteors ----\n\n let meteorTimer = 0;\n\n function scheduleMeteor() {\n if (!opts.meteors) return;\n const range = opts.meteorMaxDelay - opts.meteorMinDelay;\n const delay = opts.meteorMinDelay + Math.random() * range;\n meteorTimer = window.setTimeout(spawnMeteor, delay);\n }\n\n function spawnMeteor() {\n meteorTimer = 0;\n if (!opts.meteors) return;\n if (!isDarkMode() || isReducedMotion() || document.hidden) {\n scheduleMeteor();\n return;\n }\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const startX = Math.random() * vw * 0.6;\n const startY = Math.random() * vh * 0.55;\n const distance = 380 + Math.random() * 520;\n const angleDeg = 18 + Math.random() * 26;\n const rad = (angleDeg * Math.PI) / 180;\n const endX = startX + Math.cos(rad) * distance;\n const endY = startY + Math.sin(rad) * distance;\n\n const m = document.createElement('div');\n m.className = 'meteor';\n m.setAttribute('aria-hidden', 'true');\n m.style.setProperty('--from-x', startX + 'px');\n m.style.setProperty('--from-y', startY + 'px');\n m.style.setProperty('--to-x', endX + 'px');\n m.style.setProperty('--to-y', endY + 'px');\n m.style.setProperty('--angle', angleDeg + 'deg');\n grain.appendChild(m);\n m.addEventListener('animationend', () => m.remove(), { once: true });\n\n scheduleMeteor();\n }\n\n // ---- Boot ----\n\n if (canvas) resize();\n sync();\n scheduleMeteor();\n\n // ---- Teardown ----\n\n function stop() {\n stopRaf();\n if (meteorTimer) {\n window.clearTimeout(meteorTimer);\n meteorTimer = 0;\n }\n themeObserver.disconnect();\n reducedMotionMql.removeEventListener('change', sync);\n colorSchemeMql.removeEventListener('change', sync);\n document.removeEventListener('visibilitychange', sync);\n window.removeEventListener('resize', onResize);\n window.removeEventListener('pointermove', onPointerMove);\n\n if (canvas && canvas.parentNode) canvas.parentNode.removeChild(canvas);\n grain.querySelectorAll('.signature-star').forEach((el) => el.remove());\n grain.querySelectorAll('.meteor').forEach((el) => el.remove());\n\n if (createdGrain && grain.parentNode) {\n grain.parentNode.removeChild(grain);\n }\n\n activeHandle = null;\n }\n\n activeHandle = { sync, stop };\n return activeHandle;\n}\n\n// ---------------------------------------------------------------------------\n// helpers\n// ---------------------------------------------------------------------------\n\nfunction noop() {}\n\nfunction resolveMount(target) {\n if (!target) {\n return document.querySelector('.grain');\n }\n if (typeof target === 'string') return document.querySelector(target);\n if (target instanceof Element) return target;\n return null;\n}\n\nfunction buildSignatureStars(grain, count) {\n // Clear any previously-injected stars.\n grain.querySelectorAll('.signature-star').forEach((el) => el.remove());\n const rng = mulberry32(0x5ca1e5);\n for (let i = 0; i < count; i++) {\n const star = document.createElement('div');\n star.className = 'signature-star';\n star.setAttribute('aria-hidden', 'true');\n star.style.left = (6 + rng() * 88).toFixed(2) + '%';\n star.style.top = (8 + rng() * 78).toFixed(2) + '%';\n star.style.animationDelay = (-rng() * 4.8).toFixed(2) + 's';\n grain.appendChild(star);\n }\n}\n\nfunction pickStarColor(r) {\n if (r < 0.80) return [255, 255, 255]; // 80% white\n if (r < 0.93) return [255, 222, 186]; // 13% warm peach\n return [195, 218, 255]; // 7% cool blue\n}\n\nfunction pickWeighted(r, table) {\n let acc = 0;\n for (const [value, weight] of table) {\n acc += weight;\n if (r <= acc) return value;\n }\n return table[table.length - 1][0];\n}\n\n// Deterministic PRNG so star placement is stable across reloads.\nfunction mulberry32(seed) {\n let a = seed >>> 0;\n return function () {\n a = (a + 0x6D2B79F5) >>> 0;\n let t = a;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n","/**\n * Starscape UI — URL safety, shared by everything that puts a URL it didn't\n * write into a link, an image or a navigation: the star chart's renderer, the\n * gallery, and ui-react's links. Moved here from star-chart-render.js after\n * Secu's review of 3.4.0, so every module asks the same question the same way.\n *\n * import { isSafeUrl } from '@starlove/ui/url';\n * isSafeUrl('/projects/#orbit'); // true\n * isSafeUrl('java\\tscript:alert(1)'); // false\n * isSafeUrl('data:image/png;base64,…', { image: true }); // true\n */\n\n/**\n * Whether a URL may go in a link or an image: a relative URL, or an http,\n * https or mailto one (data:image too, for images). Browsers drop tabs and\n * newlines anywhere, and controls and spaces at the ends, before they read\n * the scheme, so `java\\tscript:` is read as `javascript:` here too.\n *\n * @param {unknown} url\n * @param {{ image?: boolean }} [options] `image: true` also allows `data:image/…`\n * @returns {boolean}\n */\nexport function isSafeUrl(url, { image = false } = {}) {\n if (typeof url !== 'string') return false;\n const bare = url.replace(/^[\\u0000-\\u0020]+|[\\u0000-\\u0020]+$/g, '').replace(/[\\t\\n\\r]/g, '');\n const scheme = /^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(bare)?.[1].toLowerCase();\n if (!scheme) return true;\n if (scheme === 'http' || scheme === 'https') return true;\n if (image) return scheme === 'data' && /^data:image\\//i.test(bare);\n return scheme === 'mailto';\n}\n","/**\n * Starscape v3 — gallery: thumbnails that open in a lightbox.\n *\n * Framework-free and dependency-free. Pairs with components/gallery.css; the\n * markup contract and bindings (plain HTML, Astro, React) are in the\n * package README, \"Gallery\". Ported from starscape.biz's src/kit/gallery\n * (2026-10-21); this package is now the shared home.\n *\n * import { initGalleries } from '@starlove/ui/gallery';\n * const undo = initGalleries(); // every [data-gallery] on the page\n * // …\n * undo();\n *\n * Idempotent. SSR-safe: the pure helpers run anywhere, and only\n * initGalleries touches the DOM. Returns a teardown function.\n *\n * The lightbox is a native <dialog> on <body>. Back closes it (a history\n * entry of its own, the URL unchanged: see onPop). Arrows, Home and End\n * step; once a tall image fills the width, the scroll keys scroll it, Home\n * and End to its top and foot (onKey). Motion, reduced motion and capture\n * mode (<html data-shot>) are all the stylesheet's: this file only toggles\n * classes. Budget: 4 KB gzipped, minified (test/gallery-weight.test.mjs).\n */\nimport { isSafeUrl } from './url.js';\n\n/** The image after (+1) or before (-1) i, wrapping at the ends. */\nexport const step = (i, delta, n) => (n ? (((i + delta) % n) + n) % n : 0);\nexport const position = (i, n) => `Image ${i + 1} of ${n}`;\nconst SPACE = /[\\t\\n\\f\\r ]/;\n/**\n * A srcset's width candidates, smallest first, read as the HTML standard reads\n * them: a URL runs to whitespace, so commas inside one (CDN paths, data: URLs)\n * stay. A candidate counts only with exactly one width above zero (\"960w\");\n * density candidates and anything malformed are skipped.\n */\nexport function parseSrcset(srcset) {\n const s = srcset ?? '';\n const out = [];\n let i = 0;\n while (i < s.length) {\n while (i < s.length && (SPACE.test(s[i]) || s[i] === ','))\n i++;\n if (i >= s.length)\n break;\n const start = i;\n while (i < s.length && !SPACE.test(s[i]))\n i++;\n let url = s.slice(start, i);\n const descriptors = [];\n if (url.endsWith(','))\n url = url.replace(/,+$/, '');\n else {\n // Descriptors run to the next comma outside parentheses.\n let d = '';\n let parens = false;\n for (; i < s.length; i++) {\n const c = s[i];\n if (parens) {\n d += c;\n if (c === ')')\n parens = false;\n }\n else if (c === ',') {\n i++;\n break;\n }\n else if (SPACE.test(c)) {\n if (d)\n descriptors.push(d);\n d = '';\n }\n else {\n d += c;\n if (c === '(')\n parens = true;\n }\n }\n if (d)\n descriptors.push(d);\n }\n const w = descriptors.length === 1 ? /^(\\d+)w$/.exec(descriptors[0]) : null;\n if (url && w && Number(w[1]) > 0)\n out.push({ url, w: Number(w[1]) });\n }\n return out.sort((a, b) => a.w - b.w);\n}\n/** The smallest candidate at least `need` pixels wide, or the largest there is. */\nexport const pickSource = (set, need) => set.find((s) => s.w >= need) ?? set[set.length - 1] ?? null;\n/**\n * The image's drawn size on a stage of sw × sh. Fit shows all of it, filling\n * the width shows it as wide as the stage for scrolling; neither enlarges it.\n */\nexport function fitBox(w, h, sw, sh, fill) {\n const k = fill ? Math.min(1, sw / w) : Math.min(1, sw / w, sh / h);\n return { width: Math.round(w * k), height: Math.round(h * k) };\n}\n/** Whether filling the width is worth offering: the image overflows the stage and fit shrinks it to under three quarters. */\nexport function canFill(w, h, sw, sh) {\n const fit = fitBox(w, h, sw, sh, false);\n const fill = fitBox(w, h, sw, sh, true);\n return fill.height > sh && fit.width < fill.width * 0.75;\n}\n/**\n * A touch gesture's verdict: 1 for the next image (finger moved left), -1 for\n * the previous one, 0 for neither. It must be mostly horizontal, and either\n * long (48 px) or a quick flick (24 px at 0.4 px a millisecond).\n */\nexport function swipe(dx, dy, ms) {\n if (![dx, dy, ms].every(Number.isFinite))\n return 0;\n const ax = Math.abs(dx);\n if (ax < 24 || ax < 2 * Math.abs(dy))\n return 0;\n if (ax < 48 && ax / Math.max(ms, 1) < 0.4)\n return 0;\n return dx < 0 ? 1 : -1;\n}\n/** A size from data-width or data-height: a finite number above zero, or else the fallback (at least 1). */\nexport function dimension(value, fallback) {\n const n = Number(value);\n if (value && Number.isFinite(n) && n > 0)\n return n;\n return Number.isFinite(fallback) && fallback > 0 ? fallback : 1;\n}\n/** Whether the browser has a modal dialog. Without one, the thumbnails stay plain links to the images. */\nexport function supportsDialog(scope = globalThis) {\n const D = scope.HTMLDialogElement;\n return typeof D === 'function' && typeof D.prototype?.showModal === 'function';\n}\n/** Words the lightbox says. Pass your own to initGalleries to translate them. */\nexport const LABELS = {\n close: 'Close',\n previous: 'Previous image',\n next: 'Next image',\n fill: 'Fill width',\n fit: 'Fit to screen',\n /** The lightbox's name when the gallery has no aria-label or aria-labelledby. */\n dialog: 'Images',\n position,\n};\n/*\n * Back closes the lightbox. Opening one adds a history entry with the URL\n * unchanged (the page's own state plus this key), so Back, a phone's back\n * gesture or history.back() takes that entry away and the lightbox closes\n * instead of the page going. Closing it any other way steps back over the\n * entry, so the next Back leaves the page as it always did. An entry left\n * over (Forward after Back, or a reload while open) is stepped over too, or\n * serves the next lightbox. One listener for every gallery on the page.\n */\nconst KEY = 'galleryLightbox';\nconst ours = () => !!history.state?.[KEY];\nlet current = null; // the open lightbox's <dialog>\nlet stepping = false; // our own step back, not yet landed\nlet users = 0;\nfunction addEntry() {\n const s = history.state;\n try {\n history.pushState(s && typeof s === 'object' ? { ...s, [KEY]: 1 } : { [KEY]: 1 }, '');\n }\n catch {\n // A sandboxed document may refuse; Back then leaves the page, as before.\n }\n}\nfunction onPop() {\n if (stepping) {\n stepping = false;\n // A lightbox opened while the step was on its way: its entry, now.\n if (current?.open)\n addEntry();\n }\n else if (current?.open)\n current.close();\n else\n leave();\n}\n/** Steps back over a lightbox's entry once it has closed some other way than Back, or is left over. */\nfunction leave() {\n if (ours() && !stepping) {\n stepping = true;\n history.back();\n }\n}\nconst enhanced = new WeakMap();\n/**\n * Enhances every [data-gallery] under root (or root itself) that isn't yet:\n * safe to call again, and on markup added later. Returns a function that\n * undoes what this call did.\n *\n * An open lightbox holds one history entry, its URL unchanged, so Back\n * closes it; closed any other way, it steps back over the entry. The undo\n * closes an open lightbox and takes its entry with it.\n */\nexport function initGalleries(root = document, options = {}) {\n // Without a modal dialog, a cancelled click would lose the link; leave the links be.\n if (!supportsDialog())\n return () => { };\n const labels = { ...LABELS, ...options.labels };\n const found = [...root.querySelectorAll('[data-gallery]')];\n if (root instanceof HTMLElement && root.matches('[data-gallery]'))\n found.unshift(root);\n const undo = [];\n for (const list of found) {\n if (enhanced.has(list))\n continue;\n const off = enhance(list, labels);\n enhanced.set(list, off);\n undo.push(() => {\n off();\n enhanced.delete(list);\n });\n }\n return () => undo.splice(0).forEach((f) => f());\n}\nfunction el(tag, cls, text = '') {\n const e = document.createElement(tag);\n e.className = cls;\n if (text)\n e.textContent = text;\n return e;\n}\nfunction button(cls, label) {\n const b = el('button', `gallery-btn ${cls}`);\n b.type = 'button';\n b.append(el('span', 'gallery-sr', label));\n return b;\n}\nfunction enhance(list, L) {\n let ui = null;\n let items = [];\n let index = 0;\n let filled = false;\n let shown = 0; // the width of the file the lightbox shows now\n let token = 0;\n let opener = null;\n let touch = null;\n let swiped = 0;\n // Only links that are safe to follow join the lightbox (Secu's review of\n // 3.4.0); any other link keeps its native behaviour, as without JavaScript.\n const links = () => [...list.querySelectorAll('a[href]')].filter((a) => isSafeUrl(a.href));\n const mark = (on) => links().forEach((a) => (on ? a.setAttribute('aria-haspopup', 'dialog') : a.removeAttribute('aria-haspopup')));\n function item(a) {\n const img = a.querySelector('img');\n const w = dimension(a.dataset.width, img?.naturalWidth ?? 0);\n const h = dimension(a.dataset.height, img?.naturalHeight ?? 0);\n const set = parseSrcset(a.dataset.srcset).filter((c) => isSafeUrl(c.url, { image: true }));\n return { a, w, h, set: set.length ? set : [{ url: a.href, w }], alt: img?.alt ?? '', caption: a.dataset.caption ?? '' };\n }\n function name() {\n const ids = list.getAttribute('aria-labelledby');\n const by = ids && ids.split(/\\s+/).map((id) => document.getElementById(id)?.textContent?.trim()).filter(Boolean).join(' ');\n return list.getAttribute('aria-label') || by || L.dialog;\n }\n function build() {\n const dialog = el('dialog', 'gallery-dialog');\n const bar = el('div', 'gallery-bar');\n const fill = button('gallery-fill', '');\n fill.setAttribute('aria-keyshortcuts', 'F');\n const fillText = el('span', '');\n fill.replaceChildren(fillText, el('kbd', '', 'F'));\n fill.lastElementChild.setAttribute('aria-hidden', 'true');\n const close = button('gallery-close', L.close);\n close.autofocus = true;\n bar.append(fill, close);\n const prev = button('gallery-prev', L.previous);\n const next = button('gallery-next', L.next);\n const stage = el('div', 'gallery-stage');\n const img = el('img', 'gallery-img');\n img.decoding = 'async';\n img.draggable = false;\n stage.append(img);\n const foot = el('div', 'gallery-foot');\n const caption = el('p', 'gallery-caption');\n const dots = el('div', 'gallery-dots');\n dots.setAttribute('aria-hidden', 'true');\n foot.append(caption, dots);\n const status = el('p', 'gallery-sr gallery-status');\n status.setAttribute('aria-live', 'polite');\n status.setAttribute('aria-atomic', 'true');\n dialog.append(bar, prev, stage, next, foot, status);\n // On the body, not beside the list: a framework (React) owns the list's\n // surroundings and may patch a stranger away. The top layer ignores where it sits.\n document.body.append(dialog);\n close.addEventListener('click', () => dialog.close());\n prev.addEventListener('click', () => go(-1));\n next.addEventListener('click', () => go(1));\n fill.addEventListener('click', toggle);\n dialog.addEventListener('close', onClose);\n stage.addEventListener('click', (e) => {\n if (Date.now() - swiped < 400)\n return;\n if (e.target === img)\n toggle();\n else if (e.target === stage)\n dialog.close();\n });\n stage.addEventListener('pointerdown', (e) => {\n touch = e.pointerType !== 'mouse' && e.isPrimary ? { x: e.clientX, y: e.clientY, t: e.timeStamp } : null;\n });\n stage.addEventListener('pointercancel', () => (touch = null));\n stage.addEventListener('pointerup', (e) => {\n if (!touch || !e.isPrimary)\n return;\n const d = swipe(e.clientX - touch.x, e.clientY - touch.y, e.timeStamp - touch.t);\n touch = null;\n if (d) {\n swiped = Date.now();\n go(d);\n }\n });\n return { dialog, fill, fillText, close, prev, next, stage, img, caption, dots, status };\n }\n function open(a) {\n items = links().map(item);\n mark(true);\n ui ??= build();\n const { dialog, prev, next, dots } = ui;\n dialog.setAttribute('aria-label', name());\n const many = items.length > 1;\n prev.hidden = next.hidden = dots.hidden = !many;\n dots.replaceChildren(...items.map(() => document.createElement('i')));\n opener = a;\n filled = false;\n dialog.showModal();\n current = dialog;\n // Its own history entry, so Back closes it: unless a step back is on its\n // way (onPop adds it then), or one is left over to serve it.\n if (!stepping && !ours())\n addEntry();\n addEventListener('resize', onResize);\n // On the document, not the dialog: a click on the image leaves focus on the body.\n document.addEventListener('keydown', onKey);\n show(Math.max(0, items.findIndex((x) => x.a === a)), 0);\n }\n function onClose() {\n if (!current?.open)\n current = null;\n removeEventListener('resize', onResize);\n document.removeEventListener('keydown', onKey);\n token++;\n // Closed by Close, Escape, a click beside the image or a teardown: its entry goes too.\n // Closed by Back, the entry is gone already.\n leave();\n opener?.focus();\n opener = null;\n }\n function go(delta, to = step(index, delta, items.length)) {\n if (items.length > 1 && to !== index)\n show(to, Math.sign(delta));\n }\n /** The stage's inner size. */\n function room() {\n const { stage } = ui;\n const cs = getComputedStyle(stage);\n return [stage.clientWidth - parseFloat(cs.paddingLeft) - parseFloat(cs.paddingRight), stage.clientHeight - parseFloat(cs.paddingTop) - parseFloat(cs.paddingBottom)];\n }\n /** Sizes the image for the stage and mode, and returns the file to show. */\n function layout(it) {\n const { dialog, fill, fillText, close, stage, img } = ui;\n let [sw, sh] = room();\n const can = canFill(it.w, it.h, sw, sh);\n filled &&= can;\n // A control about to go mustn't take focus with it.\n const active = document.activeElement;\n if ((!can && active === fill) || (!filled && active === stage))\n close.focus();\n dialog.classList.toggle('can-fill', can);\n dialog.classList.toggle('is-filled', filled);\n fill.hidden = !can;\n fillText.textContent = filled ? L.fit : L.fill;\n if (filled) {\n stage.tabIndex = 0;\n [sw, sh] = room();\n }\n else\n stage.removeAttribute('tabindex');\n const box = fitBox(it.w, it.h, sw, sh, filled);\n img.style.width = `${box.width}px`;\n img.style.height = `${box.height}px`;\n return pickSource(it.set, box.width * (devicePixelRatio || 1));\n }\n function show(i, dir) {\n const { caption, dots, status, dialog, img } = ui;\n index = i;\n const it = items[i];\n dialog.dataset.index = String(i);\n // The new size applies now and the new file once it has decoded; until then\n // another image's file is hidden, or it would be drawn stretched to the new\n // size. Known by its link, not its place: a gallery may change between viewings.\n if (img.dataset.href !== it.a.href)\n img.classList.add('is-loading');\n img.alt = it.alt;\n const src = layout(it);\n ui.stage.scrollTop = 0;\n caption.textContent = it.caption;\n caption.hidden = !it.caption;\n [...dots.children].forEach((d, k) => d.classList.toggle('is-current', k === i));\n status.textContent = `${L.position(i, items.length)}. ${it.alt}`;\n load(src, it, i, dir);\n for (const d of [-1, 1]) {\n const n = items[step(i, d, items.length)];\n if (n && n !== it) {\n // The same choice the neighbour will make, so stepping finds it cached.\n const pre = new Image();\n pre.decoding = 'async';\n pre.src = pickSource(n.set, fitBox(n.w, n.h, ...room(), false).width * (devicePixelRatio || 1)).url;\n }\n }\n }\n /** Shows a file once it has decoded, so the old image stays until the new one is ready. */\n function load(src, it, i, dir) {\n const { img } = ui;\n const t = ++token;\n const pre = new Image();\n pre.src = src.url;\n pre.decode().catch(() => { }).then(() => {\n if (t !== token)\n return;\n img.src = src.url;\n img.alt = it.alt;\n img.width = it.w;\n img.height = it.h;\n img.dataset.index = String(i);\n img.dataset.href = it.a.href;\n img.classList.remove('is-loading');\n shown = src.w;\n if (dir === null)\n return;\n img.style.setProperty('--gallery-dir', String(dir));\n img.classList.add('is-in');\n void img.offsetWidth;\n img.classList.remove('is-in');\n });\n }\n /** After a resize or a change of mode: a larger file if the image is now drawn larger. */\n function refit() {\n const it = items[index];\n const src = layout(it);\n if (src.w > shown)\n load(src, it, index, null);\n }\n function toggle() {\n const { dialog, stage } = ui;\n if (!dialog.classList.contains('can-fill'))\n return;\n filled = !filled;\n refit();\n stage.scrollTop = 0;\n }\n function onResize() {\n refit();\n }\n function onKey(e) {\n if (e.altKey || e.ctrlKey || e.metaKey)\n return;\n const { stage } = ui;\n const k = e.key;\n // Filled, the scroll keys scroll the image, Home and End to its top and foot,\n // rather than step; a focused stage is scrolled by the browser's own keys.\n const scroll = filled && /^(ArrowUp|ArrowDown|PageUp|PageDown|Home|End)$/.test(k);\n if (scroll && e.target === stage)\n return;\n if (scroll) {\n const by = k === 'Home' || k === 'End' ? stage.scrollHeight : k.startsWith('Page') ? stage.clientHeight * 0.9 : 48;\n stage.scrollBy({ top: /Up$|Home/.test(k) ? -by : by });\n }\n else if (k === 'ArrowRight')\n go(1);\n else if (k === 'ArrowLeft')\n go(-1);\n else if (k === 'Home')\n go(-1, 0);\n else if (k === 'End')\n go(1, items.length - 1);\n else if (k === 'f' || k === 'F')\n toggle();\n else\n return;\n e.preventDefault();\n }\n const onClick = (e) => {\n const a = e.target.closest?.('a[href]');\n if (!a || !list.contains(a) || !isSafeUrl(a.href) || e.defaultPrevented || e.button || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey)\n return;\n e.preventDefault();\n try {\n open(a);\n }\n catch {\n location.assign(a.href);\n }\n };\n list.addEventListener('click', onClick);\n if (!users++)\n addEventListener('popstate', onPop);\n mark(true);\n return () => {\n list.removeEventListener('click', onClick);\n removeEventListener('resize', onResize);\n document.removeEventListener('keydown', onKey);\n mark(false);\n if (ui) {\n const { dialog } = ui;\n // Closed here and now, not by the close event later, so its history entry\n // goes before the popstate listener might.\n dialog.removeEventListener('close', onClose);\n if (dialog.open) {\n dialog.close();\n onClose();\n }\n dialog.remove();\n ui = null;\n }\n if (!--users) {\n removeEventListener('popstate', onPop);\n stepping = false;\n }\n };\n}\n","/**\n * Starscape v3 — sky maths: the pure numbers behind the long-exposure sky.\n *\n * 15° of trail is one hour of exposure; 360° is one sidereal day, 23 h 56 min.\n * No DOM, so it runs anywhere: in the browser under sky.js, at build time (an\n * Astro page can ask how tall a wordmark slot is), and in node:test.\n *\n * import { heroTarget, footerTarget, exposureMinutes } from '@starlove/ui/sky-math';\n *\n * Ported from starscape.biz (src/scripts/sky-math.ts, 2026-10-22; its tests are\n * test/sky-math.test.mjs here, all 19 of them). One addition: heroTarget takes\n * the range it exposes over, so a sky that opens at 0° (starscape.app's\n * shutter) scrolls from 0°; its defaults are biz's 12° to 152°.\n */\nexport const clamp = (v, a, b) => Math.min(b, Math.max(a, v));\nexport const ease = (t) => (t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2);\nconst pad2 = (n) => String(n).padStart(2, '0');\n/** A small seeded random generator, so every visit sees the same sky. */\nexport function mulberry32(seed) {\n let a = seed;\n return () => {\n a |= 0;\n a = (a + 0x6d2b79f5) | 0;\n let t = Math.imul(a ^ (a >>> 15), 1 | a);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n/** Degrees of arc as minutes of exposure: four minutes a degree. */\nexport const exposureMinutes = (deg) => Math.round(deg * 4);\n/** Exposure as hours and minutes, for a speed panel. */\nexport function exposureText(deg) {\n const minutes = exposureMinutes(deg);\n return `${Math.floor(minutes / 60)}h ${pad2(minutes % 60)}m`;\n}\n/** Below 560px of slot width the wordmark stacks, so the letters stay large enough to be windows. */\nexport const WORDMARK_STACK_BELOW = 560;\n/** starscape.biz's wordmark: STARSCAPE on one line, or STAR over SCAPE in a narrow slot. */\nexport const wordmarkLines = (width) => (width < WORDMARK_STACK_BELOW ? ['STAR', 'SCAPE'] : ['STARSCAPE']);\n/** The trail canvas radius: from the pole to the farthest corner of the sky, plus a margin. */\nexport const reach = (w, h, px, py) => Math.ceil(Math.max(...[[0, 0], [w, 0], [0, h], [w, h]].map(([x, y]) => Math.hypot(x - px, y - py)))) + 4;\n/**\n * Scrolling collects light: the hero exposes from `from` to `to` degrees as you\n * leave it (12° to 152° on starscape.biz). `scrolled` is how far the hero has\n * gone up past the top of the window; for a hero at the top of the page, that's\n * scrollY.\n */\nexport const heroTarget = (scrolled, heroHeight, from = 12, to = 152) => from + (to - from) * ease(clamp(scrolled / (heroHeight * 0.95), 0, 1));\n/** The footer completes from 150° to one full turn as it arrives. */\nexport const footerTarget = (top, height, vh) => 150 + 210 * ease(clamp((vh - top) / Math.min(height, vh * 1.1), 0, 1));\n/** One pixel of arc at this radius, in degrees: the smallest new trail anyone could see. */\nexport const degreesPerPixel = (radius) => 180 / (Math.PI * radius);\n/**\n * The exposure after another frame of development: drift degrees a second, up\n * to max. A frame counts for at most one second, so a stalled frame or a tab\n * coming back can't leap, and the light already collected is never taken back.\n */\nexport const develop = (target, drift, ms, max) => target >= max ? target : Math.min(max, target + (drift * Math.min(ms, 1000)) / 1000);\n/**\n * How far to draw the trails this frame, or null for nothing yet.\n * - A still sky (capture mode, reduced motion) is drawn all at once.\n * - While the sky develops, new trail waits until it is worth a pixel at the\n * rim (minStep), so the trails lengthen smoothly without a draw every frame.\n * - A far target (the opening shutter, a scroll) is approached a few degrees a\n * frame. `frames` is how many 60 fps frames have passed, so a slow device\n * takes bigger steps rather than longer.\n */\nexport function nextExposure(E, target, o) {\n const gap = target - E;\n if (gap <= 0.01)\n return null;\n if (o.still)\n return target;\n if (o.developing && gap < o.minStep)\n return null;\n return Math.min(target, E + Math.max(0.4, Math.min(5, gap * 0.18)) * o.frames);\n}\n/**\n * How many 60 fps frames a step stands for: the time since the last frame,\n * from one frame up to fifteen, so a slow device takes bigger steps. After\n * the loop has slept between slivers the gap isn't frame time, so it counts\n * as one frame and a scroll that wakes the loop still eases.\n */\nexport const stepFrames = (ms, afterSleep) => (afterSleep ? 1 : clamp((ms * 60) / 1000, 1, 15));\n","/**\n * Starscape v3 — sky speeds: how fast the exposure keeps developing while\n * someone watches, how fast the sky turns, and where the exposure stops.\n *\n * 15° of trail is one hour, so a drift of d degrees a second adds 4d minutes\n * of exposure every second on screen. Bruce's approved speed is the default\n * everywhere (sky.js reads it from here).\n *\n * import { SPEEDS, parseSpeed } from '@starlove/ui/sky-speed';\n *\n * Preview them with ?speed=<preset>, or override one at a time with ?drift=,\n * ?period= and ?max= (the hero recipe in sky.js reads them; nothing is saved).\n * Pure and DOM-free. Ported from starscape.biz (src/scripts/sky-speed.ts,\n * 2026-10-22; its tests are test/sky-speed.test.mjs here, all 6). One\n * addition: parseSpeed takes the speed to start from, so an app's own default\n * holds until a preview parameter says otherwise.\n */\n/**\n * When the trails grow as fast as the sky turns, their tails hold still and\n * only the heads move on, which is how a real long exposure develops.\n */\nexport const matchedDrift = (period) => 360 / period;\nexport const SPEEDS = {\n /**\n * The speed Bruce chose on 2026-10-19 (the concept had 0.5° a second and a\n * ten-minute turn): the sky turns once a minute while the trails grow 0.75° a\n * second, stopping at 160° (10h 40m) after 3 min 17 s on screen. The footer's\n * sky turns at the same rate, because it's the same sky.\n */\n approved: { drift: 0.75, period: 60, max: 160 },\n /** Visibly alive: a four-minute turn, trails matched to it. */\n developing: { drift: matchedDrift(240), period: 240, max: 240 },\n /** A time-lapse: a turn every ninety seconds, trails matched to it. */\n timelapse: { drift: matchedDrift(90), period: 90, max: 300 },\n};\nexport const NAMES = Object.keys(SPEEDS);\nexport const KEYS = ['drift', 'period', 'max'];\n/** The full turn (360°) belongs to the footer, so the hero stops short of it. */\nexport const LIMITS = {\n drift: [0, 12],\n period: [20, 3600],\n max: [30, 330],\n};\nconst isName = (name) => name !== null && NAMES.includes(name);\n/**\n * Reads ?speed=<preset>, then any ?drift=, ?period= or ?max= override, each\n * held inside its limits. Without a known preset it starts from `base`\n * (Bruce's approved speed unless an app passes its own).\n */\nexport function parseSpeed(params, base = SPEEDS.approved) {\n const name = params.get('speed');\n const speed = { ...(isName(name) ? SPEEDS[name] : base) };\n for (const key of KEYS) {\n const raw = params.get(key);\n const value = raw === null || raw.trim() === '' ? NaN : Number(raw);\n if (!Number.isFinite(value))\n continue;\n const [lo, hi] = LIMITS[key];\n speed[key] = Math.min(hi, Math.max(lo, value));\n }\n return speed;\n}\n","/**\n * Starscape v3 — the long-exposure sky.\n *\n * A polar star chart centred on a star, with star trails that lengthen like a\n * long exposure, and optionally a wordmark cut out of a scrim so the letters\n * become windows onto the sky. A second sky look beside the `starscape`\n * background (starscape.js), which stays as it is.\n *\n * import { initSkies } from '@starlove/ui/sky';\n * const undo = initSkies(); // every [data-sky-hero] and [data-sky-turn]\n *\n * import { Sky } from '@starlove/ui/sky';\n * const sky = new Sky(document.querySelector('.sky'), { pole: star });\n * sky.destroy();\n *\n * Pairs with components/sky.css. Markup, options and bindings (plain HTML,\n * Astro, React): the package README, \"Sky\".\n *\n * Ported from starscape.biz (src/scripts/sky.ts, hero.ts and footer-sky.ts,\n * 2026-10-22; the pure parts are sky-math.js and sky-speed.js). Every trail is\n * an arc around the same pole, so the whole trail layer turns rigidly. That\n * gives a cheap architecture:\n *\n * .sky (container: a static night sky and galactic band in CSS)\n * canvas.sky-trails 2R x 2R square centred on the pole. Drawn once, then\n * only the new sliver of each arc is added as the\n * exposure grows. The compositor rotates it (Web\n * Animations), so turning costs no JavaScript. Never\n * redraw every trail per frame: the first concept did,\n * and fell to 12 fps.\n * canvas.sky-front static: scrim with letter-shaped holes, letter\n * outlines, the polar grid and the reticle.\n * Repainted only on resize, theme or font changes.\n *\n * Exposure only ever grows within a visit: the sky keeps the light it has\n * collected. 15 degrees of arc is one hour; 360 degrees is a sidereal day.\n * While the sky is on screen the exposure keeps developing at `drift` degrees\n * a second, up to `max` (sky-speed.js: Bruce's approved speed by default).\n *\n * Loading (Bruce, 2026-10-22: the text first, even on 3G, and the heavy sky\n * after). Importing this module does nothing: no canvas, observer or listener\n * exists until a function is called, so it can arrive as a deferred module or\n * by dynamic import. The sky keeps biz's waits: the letters are cut only after\n * document.fonts.ready (and their own face) settle, the full turn starts only\n * when its section comes within 60% of a screen of the window, and between\n * slivers a developing sky sleeps on a timer instead of waking every frame.\n * Until the engine draws, the container shows CSS's still night sky.\n *\n * What ss-ui adds to biz's engine:\n * - theme, motion and capture mode from prefs.js: the theme in effect\n * (resolvedTheme), followed live from prefs' event, <html>'s attributes and\n * the OS; `instant` defaults to capture mode (<html data-shot>);\n * - colours from --sky-* properties on the container, which\n * components/sky.css maps onto the tokens (biz's colours are the fallbacks);\n * - `start: 0` opens on point stars (starscape.app's shutter);\n * - the wordmark's font from the slot's CSS or `wordmark.font`, fitted inside\n * the slot whatever the font's proportions, with biz's WebKit faux stretch\n * (`wordmark.fauxStretch`) where canvas can't stretch type;\n * - state on attributes: the container gets data-drawn once it has drawn, the\n * wordmark slot data-cut once its letters are cut;\n * - destroy(): canvases, observers, listeners, timers and the animation go.\n */\nimport { capture, onPrefs, reducedMotion, resolvedTheme } from './prefs.js';\nimport { WORDMARK_STACK_BELOW, clamp, degreesPerPixel, develop, exposureMinutes, footerTarget, heroTarget, mulberry32, nextExposure, reach, stepFrames } from './sky-math.js';\nimport { SPEEDS, parseSpeed } from './sky-speed.js';\n\nconst TAU = Math.PI * 2;\nconst DEG = Math.PI / 180;\nconst BRIGHTNESS = [\n { alpha: 0.26, width: 0.8 },\n { alpha: 0.5, width: 1.05 },\n { alpha: 0.86, width: 1.5 },\n];\nconst MAX_CANVAS = 4096; // stay well inside iOS canvas limits\n// WebKit can't stretch canvas text, so it draws the 100% width scaled to match 125%.\nconst FAUX_STRETCH = 1.19;\n// The canvas colours: each is read from this property on the container, where\n// components/sky.css maps it onto the tokens; these are the fallbacks, biz's own.\nconst COLOURS = {\n // Stars by temperature: blue-white, white, warm; and the brightest stars' heads.\n '--sky-star-cool': [196, 214, 255, 1],\n '--sky-star-white': [240, 244, 255, 1],\n '--sky-star-warm': [255, 224, 186, 1],\n '--sky-star-head': [255, 255, 255, 0.9],\n // Night: the scrim, the grid and reticle's ink, the letters' outline (the star mark's cyan).\n '--sky-night-scrim': [8, 12, 26, 0.74],\n '--sky-night-ink': [168, 192, 255, 1],\n '--sky-night-outline': [92, 196, 236, 0.9],\n // Day: the parchment scrim with its two earth stains, ink for the grid, reticle and letters.\n '--sky-day-scrim': [245, 236, 214, 1],\n '--sky-day-stain-1': [79, 112, 72, 0.16],\n '--sky-day-stain-2': [184, 137, 61, 0.18],\n '--sky-day-ink': [29, 37, 40, 1],\n '--sky-day-outline': [29, 37, 40, 0.92],\n};\nconst STRETCHES = [[50, 'ultra-condensed'], [62.5, 'extra-condensed'], [75, 'condensed'], [87.5, 'semi-condensed'], [100, 'normal'], [112.5, 'semi-expanded'], [125, 'expanded'], [150, 'extra-expanded'], [200, 'ultra-expanded']];\n\n/** The engine's defaults. `instant` defaults to capture mode, read when a sky starts. */\nexport const DEFAULTS = {\n poleFallback: [0.5, 0.3],\n density: 0.00075,\n grid: true,\n reticle: true,\n scrim: true,\n ...SPEEDS.approved,\n seed: 0x5ca1ab1e,\n start: 12,\n still: 24,\n alwaysNight: false,\n instantExposure: 18,\n};\n\nconst noop = () => {};\nconst markJS = () => document.documentElement.setAttribute('data-js', '');\nconst rgba = (c, alpha = 1) => `rgba(${c[0]},${c[1]},${c[2]},${Math.round(c[3] * alpha * 1e4) / 1e4})`;\n\n/** A CSS colour as [r, g, b, a], read by the canvas's own parser; null when it isn't one. */\nfunction parseColour(ctx, value) {\n if (!value)\n return null;\n ctx.fillStyle = '#010203';\n ctx.fillStyle = value;\n const v = String(ctx.fillStyle);\n if (v === '#010203')\n return value.replace(/\\s/g, '').toLowerCase() === '#010203' ? [1, 2, 3, 1] : null;\n if (v[0] === '#')\n return [parseInt(v.slice(1, 3), 16), parseInt(v.slice(3, 5), 16), parseInt(v.slice(5, 7), 16), 1];\n const n = (v.match(/[\\d.]+/g) ?? []).map(Number);\n // color(srgb r g b / a) has channels from 0 to 1.\n const k = v.startsWith('color(') ? 255 : 1;\n return n.length >= 3 ? [n[0] * k, n[1] * k, n[2] * k, n[3] ?? 1] : null;\n}\n\n/** A computed font-stretch (\"125%\", or a keyword) as a percentage. */\nfunction stretchPercent(value) {\n if (!value || value === 'normal')\n return 100;\n if (value.endsWith('%'))\n return parseFloat(value) || 100;\n return STRETCHES.find(([, k]) => k === value)?.[0] ?? 100;\n}\nconst stretchKeyword = (pct) => STRETCHES.reduce((a, b) => (Math.abs(b[0] - pct) < Math.abs(a[0] - pct) ? b : a))[1];\n\nconst stretchWorks = new Map();\n/** Whether canvas text can really be stretched here (Chromium and Firefox can, WebKit can't). */\nfunction canvasStretchWorks(ctx, family, keyword) {\n const key = `${keyword} ${family}`;\n if (stretchWorks.has(key))\n return stretchWorks.get(key);\n let works = false;\n if ('fontStretch' in ctx) {\n ctx.save();\n ctx.font = `800 100px ${family}`;\n ctx.fontStretch = 'normal';\n const a = ctx.measureText('STARSCAPE').width;\n ctx.fontStretch = keyword;\n const b = ctx.measureText('STARSCAPE').width;\n ctx.restore();\n works = Math.abs(b - a) > a * 0.05;\n }\n stretchWorks.set(key, works);\n return works;\n}\n\n/**\n * A wordmark slot's own words, for the `wordmark.lines` option: its text on one\n * line, or split at its <wbr> where the slot is narrower than 560px (the same\n * place the text breaks without JavaScript). Uppercased when the slot's CSS\n * says text-transform: uppercase. \"Star<wbr>scape\" gives STARSCAPE, or STAR\n * over SCAPE: starscape.biz's wordmark (sky-math.js, wordmarkLines).\n */\nexport function slotLines(slot) {\n const parts = [''];\n const walk = (node) => {\n for (const n of node.childNodes) {\n if (n.nodeType === 3)\n parts[parts.length - 1] += n.data;\n else if (n.nodeName === 'WBR')\n parts.push('');\n else if (n.nodeType === 1)\n walk(n);\n }\n };\n walk(slot);\n const upper = getComputedStyle(slot).textTransform === 'uppercase';\n const tidy = (s) => {\n const t = s.replace(/\\s+/g, ' ').trim();\n return upper ? t.toUpperCase() : t;\n };\n const whole = tidy(parts.join(''));\n const lines = parts.map(tidy).filter(Boolean);\n return (width) => (width < WORDMARK_STACK_BELOW && lines.length > 1 ? lines : [whole]);\n}\n\n/**\n * The engine: one sky on one container. It appends two canvases to `host` and\n * draws until destroy(). See the module header and the README for the options.\n */\nexport class Sky {\n constructor(host, options = {}) {\n markJS();\n this.host = host;\n const o = { ...DEFAULTS, instant: capture() };\n for (const [k, v] of Object.entries(options))\n if (v !== undefined)\n o[k] = v;\n if (o.wordmark && typeof o.wordmark.lines !== 'function') {\n const lines = o.wordmark.lines;\n o.wordmark = { ...o.wordmark, lines: lines ? () => lines : slotLines(o.wordmark.slot) };\n }\n this.o = o;\n this.trails = document.createElement('canvas');\n this.front = document.createElement('canvas');\n this.trails.className = 'sky-trails';\n this.front.className = 'sky-front';\n this.E = 0; // exposure already drawn, degrees\n this.target = 0; // exposure we're heading to\n this.visible = true;\n this.fontsReady = false;\n this.raf = 0;\n this.wake = 0; // while developing, a timer that brings the frame the next sliver is due in\n this.slept = false; // the last gap between frames was a sleep, not frame time\n this.lastTick = 0;\n this.groups = [];\n this.stars = [];\n this.w = 0;\n this.h = 0;\n this.dpr = 1;\n this.R = 0;\n this.tScale = 1;\n this.pxPerDeg = 1;\n this.minStep = 0.1; // degrees of new trail worth drawing: about a pixel at the rim\n this.pole = null;\n this.dead = false;\n this.queued = false;\n // A sky that opens (or rests) at 0° shows its stars as points.\n this.points = o.start <= 0 || o.still <= 0 || o.instantExposure <= 0;\n host.append(this.trails, this.front);\n const still = o.instant || reducedMotion();\n this.scrimIn = still ? 1 : 0;\n\n this.spin = this.trails.animate([{ transform: 'rotate(0deg)' }, { transform: 'rotate(-360deg)' }], {\n duration: o.period * 1000,\n iterations: Infinity,\n });\n if (still)\n this.spin.pause();\n\n this.tick = this.tick.bind(this);\n this.onVisibility = () => {\n // A tab coming back resumes from where it was, without counting the time away.\n this.lastTick = 0;\n this.kick();\n };\n const relayout = () => this.layout();\n const resize = new ResizeObserver(relayout);\n resize.observe(host);\n if (o.wordmark)\n resize.observe(o.wordmark.slot);\n const seen = new IntersectionObserver((entries) => {\n this.visible = entries[entries.length - 1].isIntersecting;\n this.syncMotion();\n });\n seen.observe(host);\n // The theme and motion, from prefs' event, from <html>'s attributes for apps\n // that set them directly, and from the OS for apps that never call initPrefs.\n const prefs = () => this.prefsChanged();\n const attrs = new MutationObserver(prefs);\n attrs.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme', 'data-motion'] });\n this.observers = [resize, seen, attrs];\n this.media = typeof matchMedia === 'function'\n ? ['(prefers-color-scheme: dark)', '(prefers-reduced-motion: reduce)'].map((q) => matchMedia(q))\n : [];\n for (const m of this.media)\n m.addEventListener('change', prefs);\n this.unprefs = onPrefs(prefs);\n this.unmedia = () => this.media.forEach((m) => m.removeEventListener('change', prefs));\n document.addEventListener('visibilitychange', this.onVisibility);\n\n // The wordmark face must be loaded before the letters can be cut.\n const fonts = document.fonts;\n const faces = !fonts ? [] : o.wordmark ? [fonts.load(this.wordmarkFont(100)), fonts.ready] : [fonts.ready];\n Promise.all(faces.map((p) => Promise.resolve(p).catch(noop))).then(() => {\n if (this.dead)\n return;\n this.fontsReady = true;\n this.layout();\n this.kick();\n });\n this.layout();\n\n // The opening shutter. After it, the exposure develops while the sky is on screen (tick).\n this.setTarget(o.instant ? o.instantExposure : reducedMotion() ? o.still : o.start);\n }\n\n /** Degrees of exposure drawn so far. */\n get exposure() {\n return this.E;\n }\n\n /** Whether the exposure is developing on its own: on screen, in motion, short of its limit. */\n developing() {\n return this.o.drift > 0 && this.visible && !document.hidden && !this.o.instant && !reducedMotion() && this.target < this.o.max;\n }\n\n /** Spin only while visible, and never under reduced motion or in capture mode. */\n syncMotion() {\n if (this.o.instant || this.dead)\n return;\n if (reducedMotion()) {\n this.spin.pause();\n this.scrimIn = 1;\n this.setTarget(this.o.still);\n }\n else if (this.visible) {\n this.spin.play();\n this.kick();\n }\n else\n this.spin.pause();\n }\n\n /** The theme or motion changed: once per change, however many signals carried it. */\n prefsChanged() {\n if (this.queued || this.dead)\n return;\n this.queued = true;\n queueMicrotask(() => {\n this.queued = false;\n if (this.dead)\n return;\n this.syncMotion();\n this.paintFront();\n });\n }\n\n /** The wordmark's face: `wordmark.font` where given, else the slot's own CSS. */\n wordmarkFace() {\n const wm = this.o.wordmark;\n const cs = getComputedStyle(wm.slot);\n const f = wm.font ?? {};\n return {\n family: f.family ?? cs.fontFamily ?? 'sans-serif',\n weight: String(f.weight ?? (cs.fontWeight || '800')),\n stretch: stretchPercent(f.stretch ?? cs.fontStretch),\n };\n }\n\n wordmarkFont(size) {\n const { family, weight } = this.wordmarkFace();\n return `${weight} ${size}px ${family}`;\n }\n\n polePosition() {\n const c = this.host.getBoundingClientRect();\n if (this.o.pole) {\n const p = this.o.pole.getBoundingClientRect();\n if (p.width)\n return [p.left + p.width / 2 - c.left, p.top + p.height / 2 - c.top];\n }\n return [c.width * this.o.poleFallback[0], c.height * this.o.poleFallback[1]];\n }\n\n /** Measure again, after the pole moved without the container resizing. */\n refresh() {\n if (!this.dead)\n this.layout();\n }\n\n layout() {\n if (this.dead)\n return;\n const rect = this.host.getBoundingClientRect();\n const w = Math.max(1, Math.round(rect.width));\n const h = Math.max(1, Math.round(rect.height));\n const dpr = Math.min(window.devicePixelRatio || 1, 2);\n const [px, py] = this.polePosition();\n const R = reach(w, h, px, py);\n const changed = w !== this.w || h !== this.h || dpr !== this.dpr || R !== this.R || !this.pole ||\n Math.abs(px - this.pole[0]) > 0.5 || Math.abs(py - this.pole[1]) > 0.5;\n this.w = w;\n this.h = h;\n this.dpr = dpr;\n this.pole = [px, py];\n if (changed) {\n this.R = R;\n this.minStep = degreesPerPixel(R);\n this.pxPerDeg = Math.max(w, h) / 70;\n // Trails: soft lines tolerate a lower resolution, which keeps memory sane.\n this.tScale = Math.min(dpr, 1.5, MAX_CANVAS / (2 * R));\n this.trails.width = Math.round(2 * R * this.tScale);\n this.trails.height = Math.round(2 * R * this.tScale);\n Object.assign(this.trails.style, { width: `${2 * R}px`, height: `${2 * R}px`, left: `${px - R}px`, top: `${py - R}px` });\n this.front.width = Math.round(w * dpr);\n this.front.height = Math.round(h * dpr);\n Object.assign(this.front.style, { width: `${w}px`, height: `${h}px` });\n this.readStars();\n this.buildStars();\n if (this.points)\n this.drawPoints();\n const keep = this.E;\n this.E = 0;\n this.drawTrails(0, keep);\n this.E = keep;\n }\n this.paintFront();\n }\n\n /** The colour behind each --sky-* property on the container, or its fallback. */\n colours(names) {\n const cs = getComputedStyle(this.host);\n const ctx = this.front.getContext('2d');\n const out = {};\n for (const name of names)\n out[name] = parseColour(ctx, cs.getPropertyValue(name).trim()) ?? COLOURS[name];\n return out;\n }\n\n readStars() {\n const c = this.colours(['--sky-star-cool', '--sky-star-white', '--sky-star-warm', '--sky-star-head']);\n this.stars = [c['--sky-star-cool'], c['--sky-star-white'], c['--sky-star-warm']];\n this.head = c['--sky-star-head'];\n }\n\n buildStars() {\n const R = this.R;\n const rng = mulberry32(this.o.seed);\n const count = Math.min(3600, Math.round(Math.PI * R * R * this.o.density));\n const groups = [];\n for (let b = 0; b < 3; b++)\n for (let c = 0; c < 3; c++)\n groups.push({ b, c, list: [] });\n for (let i = 0; i < count; i++) {\n const r = Math.sqrt(rng()) * R;\n if (r < 12)\n continue;\n const u = rng();\n const b = u < 0.7 ? 0 : u < 0.93 ? 1 : 2;\n const cu = rng();\n const c = cu < 0.38 ? 0 : cu < 0.82 ? 1 : 2;\n groups[b * 3 + c].list.push({ r, phi: rng() * TAU });\n }\n this.groups = groups.filter((g) => g.list.length);\n }\n\n marked() {\n if (!this.host.hasAttribute('data-drawn'))\n this.host.setAttribute('data-drawn', '');\n }\n\n /** Every star as a point where it is now: the sky at 0°, as the shutter opens. */\n drawPoints() {\n const ctx = this.trails.getContext('2d');\n const R = this.R;\n ctx.setTransform(this.tScale, 0, 0, this.tScale, 0, 0);\n for (const g of this.groups) {\n const bright = BRIGHTNESS[g.b];\n const radius = bright.width * 0.75;\n ctx.fillStyle = rgba(this.stars[g.c], bright.alpha);\n ctx.beginPath();\n for (const s of g.list) {\n const x = R + Math.cos(s.phi) * s.r;\n const y = R + Math.sin(s.phi) * s.r;\n ctx.moveTo(x + radius, y);\n ctx.arc(x, y, radius, 0, TAU);\n }\n ctx.fill();\n }\n this.drawHeads(ctx);\n this.marked();\n }\n\n /** The brightest stars keep a point of light where they are now. */\n drawHeads(ctx) {\n const R = this.R;\n ctx.fillStyle = rgba(this.head);\n ctx.beginPath();\n for (const g of this.groups) {\n if (g.b !== 2)\n continue;\n for (const s of g.list) {\n const x = R + Math.cos(s.phi) * s.r;\n const y = R + Math.sin(s.phi) * s.r;\n ctx.moveTo(x + 1.2, y);\n ctx.arc(x, y, 1.2, 0, TAU);\n }\n }\n ctx.fill();\n }\n\n /** Add the arc slice [a, b] (degrees) to every trail. */\n drawTrails(a, b) {\n if (b <= a)\n return;\n const ctx = this.trails.getContext('2d');\n const R = this.R;\n ctx.setTransform(this.tScale, 0, 0, this.tScale, 0, 0);\n ctx.lineCap = 'butt';\n const full = b - a >= 359.99;\n const A = a * DEG;\n const B = Math.min(b, a + 360) * DEG;\n for (const g of this.groups) {\n const bright = BRIGHTNESS[g.b];\n ctx.lineWidth = bright.width;\n ctx.strokeStyle = rgba(this.stars[g.c], bright.alpha);\n ctx.beginPath();\n for (const s of g.list) {\n // The head leads (counter-clockwise on screen); the trail extends behind it.\n const s0 = s.phi + A;\n ctx.moveTo(R + Math.cos(s0) * s.r, R + Math.sin(s0) * s.r);\n if (full)\n ctx.arc(R, R, s.r, s0, s0 + TAU);\n else\n ctx.arc(R, R, s.r, s0, s.phi + B);\n }\n ctx.stroke();\n }\n if (a === 0)\n this.drawHeads(ctx);\n this.marked();\n }\n\n /** Expose at least this many degrees (never fewer than already drawn), up to max. */\n setTarget(deg) {\n if (this.dead)\n return;\n this.target = Math.min(this.o.max, Math.max(this.target, deg));\n this.kick();\n }\n\n kick() {\n if (this.raf || this.dead)\n return;\n if (this.wake) {\n // Asleep between slivers: carry on now, with the clock still running.\n clearTimeout(this.wake);\n this.wake = 0;\n this.raf = requestAnimationFrame(this.tick);\n return;\n }\n if (!(this.target > this.E + 0.01 || this.developing() || this.scrimIn < 1))\n return;\n this.lastTick = 0;\n this.raf = requestAnimationFrame(this.tick);\n }\n\n /**\n * One frame: develop the exposure by the time that has passed, then draw\n * whatever new trail is worth drawing (sky-math.js, nextExposure). A fast\n * scroll still exposes visibly, a slow device draws bigger slices rather\n * than taking longer, and a developing sky adds slivers of about a pixel, so\n * its trails lengthen smoothly. Between slivers the loop sleeps until the\n * next one is due instead of waking every frame, and it stops once nothing\n * is left to do, which leaves the main thread idle.\n */\n tick(now) {\n this.raf = 0;\n if (this.dead)\n return;\n const ms = this.lastTick ? now - this.lastTick : 1000 / 60;\n this.lastTick = now;\n const developing = this.developing();\n if (developing)\n this.target = develop(this.target, this.o.drift, ms, this.o.max);\n const next = nextExposure(this.E, this.target, {\n still: this.o.instant || reducedMotion(),\n developing,\n minStep: this.minStep,\n frames: stepFrames(ms, this.slept),\n });\n this.slept = false;\n if (next !== null) {\n this.drawTrails(this.E, next);\n this.E = next;\n this.o.onExposure?.(this.E);\n }\n if (this.scrimIn < 1 && this.fontsReady) {\n this.scrimIn = Math.min(1, this.scrimIn + 0.05);\n this.paintFront();\n }\n const gap = this.target - this.E;\n if (this.scrimIn < 1 || (gap > 0.01 && !(developing && gap < this.minStep))) {\n this.raf = requestAnimationFrame(this.tick);\n }\n else if (developing) {\n // At most half a second, so a frame never counts for more than develop() allows.\n const due = Math.min(500, ((this.minStep - gap) / this.o.drift) * 1000);\n if (due < 24)\n this.raf = requestAnimationFrame(this.tick);\n else {\n this.slept = true;\n this.wake = window.setTimeout(() => {\n this.wake = 0;\n this.raf = requestAnimationFrame(this.tick);\n }, due);\n }\n }\n }\n\n /**\n * The wordmark lines, each fitted to the slot's width and centred in its\n * height, then all shrunk together if that would make them taller than the\n * slot (a font wider or narrower than the slot's proportions). CSS sizes the\n * slot from the same proportions (components/sky.css), so the page never\n * shifts when the letters arrive.\n */\n layoutWordmark(ctx) {\n const wm = this.o.wordmark;\n if (!wm || !this.fontsReady)\n return null;\n const slot = wm.slot.getBoundingClientRect();\n const c = this.host.getBoundingClientRect();\n if (!slot.width)\n return null;\n const { family, weight, stretch } = this.wordmarkFace();\n const wantStretch = stretch !== 100;\n const keyword = stretchKeyword(stretch);\n const native = wantStretch && canvasStretchWorks(ctx, family, keyword);\n const fauxScale = wantStretch && !native ? (wm.fauxStretch ?? FAUX_STRETCH) : 1;\n const out = [];\n // Measure large: Chromium rounds text metrics to whole pixels, which at 100px\n // would put the letters a few pixels off the slot's edges.\n const M = 1000;\n ctx.save();\n for (const text of wm.lines(slot.width)) {\n ctx.font = `${weight} ${M}px ${family}`;\n if ('fontStretch' in ctx)\n ctx.fontStretch = native ? keyword : 'normal';\n const m = ctx.measureText(text);\n const ink = (m.actualBoundingBoxLeft + m.actualBoundingBoxRight) * fauxScale;\n const size = (M * slot.width) / ink;\n out.push({\n text, size, family, weight, keyword, native, fauxScale,\n left: m.actualBoundingBoxLeft * (size / M) * fauxScale,\n ascent: m.actualBoundingBoxAscent * (size / M),\n descent: m.actualBoundingBoxDescent * (size / M),\n x: 0, y: 0,\n });\n }\n ctx.restore();\n let gap = out.length > 1 ? out[0].size * 0.075 : 0;\n let total = out.reduce((a, l) => a + l.ascent + l.descent, 0) + gap * (out.length - 1);\n // Never taller than the slot: shrink every line by the same factor and centre them.\n const k = total > slot.height ? slot.height / total : 1;\n if (k < 1) {\n for (const l of out) {\n l.size *= k;\n l.left *= k;\n l.ascent *= k;\n l.descent *= k;\n }\n gap *= k;\n total *= k;\n }\n let y = slot.top - c.top + (slot.height - total) / 2;\n const inset = (slot.width * (1 - k)) / 2;\n for (const l of out) {\n l.x = slot.left - c.left + inset + l.left;\n l.y = y + l.ascent;\n y += l.ascent + l.descent + gap;\n }\n return out;\n }\n\n textAt(ctx, l, mode) {\n ctx.save();\n ctx.translate(l.x, l.y);\n if (l.fauxScale !== 1)\n ctx.scale(l.fauxScale, 1);\n ctx.font = `${l.weight} ${l.size}px ${l.family}`;\n if ('fontStretch' in ctx)\n ctx.fontStretch = l.native ? l.keyword : 'normal';\n if (mode === 'fill')\n ctx.fillText(l.text, 0, 0);\n else\n ctx.strokeText(l.text, 0, 0);\n ctx.restore();\n }\n\n paintFront() {\n if (!this.w || !this.pole || this.dead)\n return;\n const ctx = this.front.getContext('2d');\n const { w, h, dpr } = this;\n const day = resolvedTheme() === 'light' && !this.o.alwaysNight;\n const [px, py] = this.pole;\n const p = this.colours(day\n ? ['--sky-day-scrim', '--sky-day-stain-1', '--sky-day-stain-2', '--sky-day-ink', '--sky-day-outline']\n : ['--sky-night-scrim', '--sky-night-ink', '--sky-night-outline']);\n const ink = day ? p['--sky-day-ink'] : p['--sky-night-ink'];\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, w, h);\n\n // 1. Scrim with letter-shaped holes.\n const lines = this.layoutWordmark(ctx);\n if (this.o.scrim) {\n ctx.save();\n ctx.globalAlpha = this.scrimIn;\n ctx.fillStyle = rgba(day ? p['--sky-day-scrim'] : p['--sky-night-scrim']);\n ctx.fillRect(0, 0, w, h);\n if (day) {\n const stain = (c, x, y, r) => {\n const g = ctx.createRadialGradient(x, y, 0, x, y, r);\n g.addColorStop(0, rgba(c));\n g.addColorStop(1, rgba(c, 0));\n ctx.fillStyle = g;\n ctx.fillRect(0, 0, w, h);\n };\n stain(p['--sky-day-stain-1'], w * 0.08, h * 0.06, w * 0.6);\n stain(p['--sky-day-stain-2'], w * 0.95, h * 0.95, w * 0.55);\n }\n if (lines) {\n ctx.globalCompositeOperation = 'destination-out';\n ctx.globalAlpha = 1;\n ctx.fillStyle = '#000';\n for (const l of lines)\n this.textAt(ctx, l, 'fill');\n ctx.globalCompositeOperation = 'source-over';\n if (!this.o.wordmark.slot.hasAttribute('data-cut'))\n this.o.wordmark.slot.setAttribute('data-cut', '');\n }\n ctx.restore();\n }\n\n // 2. Polar grid: declination every 10 degrees, hour lines every hour.\n if (this.o.grid) {\n const R = this.R;\n ctx.save();\n ctx.lineWidth = 1;\n for (let dec = 80; dec >= -60; dec -= 10) {\n const r = (90 - dec) * this.pxPerDeg;\n if (r > R)\n break;\n ctx.strokeStyle = rgba(ink, dec % 30 === 0 ? (day ? 0.2 : 0.11) : day ? 0.11 : 0.06);\n ctx.beginPath();\n ctx.arc(px, py, r, 0, TAU);\n ctx.stroke();\n }\n for (let hr = 0; hr < 24; hr++) {\n const a = (hr / 24) * TAU;\n ctx.strokeStyle = rgba(ink, hr % 6 === 0 ? (day ? 0.2 : 0.1) : day ? 0.08 : 0.045);\n const r0 = 10 * this.pxPerDeg;\n ctx.beginPath();\n ctx.moveTo(px + Math.cos(a) * r0, py + Math.sin(a) * r0);\n ctx.lineTo(px + Math.cos(a) * R, py + Math.sin(a) * R);\n ctx.stroke();\n }\n ctx.restore();\n }\n\n // 3. Letter outlines: the star mark's cyan by night, ink by day.\n if (lines) {\n ctx.save();\n ctx.globalAlpha = this.scrimIn;\n ctx.lineJoin = 'round';\n ctx.lineWidth = day ? 1.6 : 1.4;\n ctx.strokeStyle = rgba(day ? p['--sky-day-outline'] : p['--sky-night-outline']);\n for (const l of lines)\n this.textAt(ctx, l, 'stroke');\n ctx.restore();\n }\n\n // 4. A finder reticle around the pole star.\n if (this.o.reticle) {\n ctx.save();\n ctx.strokeStyle = rgba(ink, day ? 0.45 : 0.32);\n ctx.lineWidth = 1;\n const r1 = 64;\n ctx.beginPath();\n ctx.arc(px, py, r1, 0, TAU);\n ctx.stroke();\n ctx.setLineDash([2, 5]);\n ctx.beginPath();\n ctx.arc(px, py, r1 + 14, 0, TAU);\n ctx.stroke();\n ctx.setLineDash([]);\n for (let k = 0; k < 4; k++) {\n const a = k * (TAU / 4);\n ctx.beginPath();\n ctx.moveTo(px + Math.cos(a) * (r1 + 20), py + Math.sin(a) * (r1 + 20));\n ctx.lineTo(px + Math.cos(a) * (r1 + 32), py + Math.sin(a) * (r1 + 32));\n ctx.stroke();\n }\n ctx.restore();\n }\n }\n\n /** Stop and take everything away: canvases, observers, listeners, timers, the animation and the marks. */\n destroy() {\n if (this.dead)\n return;\n this.dead = true;\n cancelAnimationFrame(this.raf);\n clearTimeout(this.wake);\n this.raf = 0;\n this.wake = 0;\n for (const observer of this.observers)\n observer.disconnect();\n this.unprefs();\n this.unmedia();\n document.removeEventListener('visibilitychange', this.onVisibility);\n this.spin.cancel();\n this.trails.remove();\n this.front.remove();\n this.host.removeAttribute('data-drawn');\n this.o.wordmark?.slot.removeAttribute('data-cut');\n }\n}\n\n// ---------------------------------------------------------------------------\n// The recipes: starscape.biz's hero and full turn, each a few lines to adopt.\n// ---------------------------------------------------------------------------\n\nconst enhanced = new WeakSet();\n\n/** A scroll listener that runs `fn` at most once a frame; returns its undo. */\nfunction onScrollFrame(fn) {\n let frame = 0;\n const run = () => {\n if (frame)\n return;\n frame = requestAnimationFrame(() => {\n frame = 0;\n fn();\n });\n };\n addEventListener('scroll', run, { passive: true });\n run();\n return () => {\n removeEventListener('scroll', run);\n cancelAnimationFrame(frame);\n };\n}\n\n/** Reports the exposure on the section in minutes (data-exposure), as biz's do; nothing shows it. */\nfunction reporter(section, onExposure) {\n return (deg) => {\n const m = String(exposureMinutes(deg));\n if (section.getAttribute('data-exposure') !== m)\n section.setAttribute('data-exposure', m);\n onExposure?.(deg);\n };\n}\n\n/**\n * The hero (starscape.biz's SkyHero): the long exposure behind the page's\n * first screen, the exposure growing as you scroll away and while it stays on\n * screen, up to `max`. Its section holds a `.sky`, an element marked\n * `data-sky-pole` (the star at the pole) and optionally a `.sky-wordmark` slot,\n * whose words are cut out of the scrim. Engine options pass through; the\n * preview parameters ?speed=, ?drift=, ?period=, ?max= and, in capture mode,\n * ?exposure= win over them unless `previews: false`. Returns its undo.\n */\nexport function initSkyHero(section, options = {}) {\n if (typeof document === 'undefined' || !section || enhanced.has(section))\n return noop;\n const host = section.querySelector('.sky');\n if (!host)\n return noop;\n markJS();\n enhanced.add(section);\n const { previews = true, scrollTo = 152, onExposure, ...engine } = options;\n const params = new URLSearchParams(previews ? location.search : '');\n const slot = section.querySelector('.sky-wordmark');\n const o = {\n pole: section.querySelector('[data-sky-pole]'),\n wordmark: slot ? { slot, lines: slotLines(slot) } : null,\n ...engine,\n };\n // ?speed=, ?drift=, ?period= and ?max= preview the speed settings (sky-speed.js).\n Object.assign(o, parseSpeed(params, {\n drift: o.drift ?? DEFAULTS.drift,\n period: o.period ?? DEFAULTS.period,\n max: o.max ?? DEFAULTS.max,\n }));\n // ?shot&exposure=60 sets the trail length (degrees) for captures.\n const exposure = Number(params.get('exposure'));\n if (Number.isFinite(exposure) && exposure > 0)\n o.instantExposure = clamp(exposure, 1, 360);\n o.onExposure = reporter(section, onExposure);\n const sky = new Sky(host, o);\n // Scrolling collects light: the hero exposes as you leave it.\n const unscroll = onScrollFrame(() => {\n if (!capture() && !reducedMotion())\n sky.setTarget(heroTarget(Math.max(0, -section.getBoundingClientRect().top), section.offsetHeight, sky.o.start, scrollTo));\n });\n return () => {\n unscroll();\n sky.destroy();\n section.removeAttribute('data-exposure');\n enhanced.delete(section);\n };\n}\n\n/**\n * The full turn (starscape.biz's footer sky): one sidereal day completes as\n * the section arrives, centred on its `data-sky-pole` star, always night. It\n * starts only when the section comes within 60% of a screen of the window\n * (`rootMargin`), so a page doesn't spend its first frames on a sky nobody can\n * see yet; in capture mode it starts at once, at 360°. A full turn that is\n * the page itself (the sign-in page, templates/auth) has nowhere to arrive\n * from: `arrived: true`, or `data-sky-turn=\"arrived\"` on the section,\n * completes it as the page opens, however tall the page. Engine options pass\n * through. Returns its undo.\n */\nexport function initFullTurn(section, options = {}) {\n if (typeof document === 'undefined' || !section || enhanced.has(section))\n return noop;\n const host = section.querySelector('.sky');\n if (!host)\n return noop;\n markJS();\n enhanced.add(section);\n const {\n rootMargin = '0px 0px 60% 0px',\n arrived = section.getAttribute('data-sky-turn') === 'arrived',\n onExposure,\n ...engine\n } = options;\n let sky = null;\n let io = null;\n let unscroll = noop;\n const start = () => {\n sky = new Sky(host, {\n pole: section.querySelector('[data-sky-pole]'),\n instantExposure: 360,\n scrim: false,\n alwaysNight: true,\n density: 0.0006,\n seed: 0x0b5e7,\n start: 150,\n still: 360,\n max: 360,\n drift: 0,\n ...engine,\n onExposure: reporter(section, onExposure),\n });\n // Capture mode and reduced motion draw the full turn at once (instantExposure, still).\n if (arrived) {\n if (!capture() && !reducedMotion())\n sky.setTarget(360);\n return;\n }\n unscroll = onScrollFrame(() => {\n if (capture() || reducedMotion())\n return;\n const r = section.getBoundingClientRect();\n sky.setTarget(footerTarget(r.top, r.height, window.innerHeight));\n });\n };\n if (capture())\n start();\n else {\n io = new IntersectionObserver((entries) => {\n if (!entries.some((e) => e.isIntersecting))\n return;\n io.disconnect();\n io = null;\n start();\n }, { rootMargin });\n io.observe(section);\n }\n return () => {\n io?.disconnect();\n unscroll();\n sky?.destroy();\n section.removeAttribute('data-exposure');\n enhanced.delete(section);\n };\n}\n\n/**\n * Enhances every `[data-sky-hero]` and `[data-sky-turn]` under root (or root\n * itself) that isn't yet: safe to call again, and on markup added later.\n * `options.hero` and `options.turn` go to each recipe. Returns a function that\n * undoes what this call did.\n */\nexport function initSkies(root = typeof document === 'undefined' ? null : document, options = {}) {\n if (!root)\n return noop;\n const undos = [];\n const each = (selector, init, opts) => {\n const found = [...root.querySelectorAll(selector)];\n if (root.matches?.(selector))\n found.unshift(root);\n for (const el of found)\n undos.push(init(el, opts));\n };\n each('[data-sky-hero]', initSkyHero, options.hero);\n each('[data-sky-turn]', initFullTurn, options.turn);\n return () => undos.splice(0).forEach((undo) => undo());\n}\n","/**\n * Starscape v3 — the star chart in the browser: the keyboard walk, the\n * tooltip and selection, on the markup renderStarChart drew at build time.\n *\n * import { initStarCharts, setCurrent, SELECT_EVENT } from '@starlove/ui/star-chart';\n * const undo = initStarCharts(); // every [data-star-chart] on the page\n * document.addEventListener(SELECT_EVENT, (e) => showCard(e.detail.slug));\n * setCurrent(chart, 'orbit'); // a deep link, a card the site opened\n *\n * The chart is complete without it: every star is a link, the figures are\n * drawn, the selected star is marked. This adds, from starscape.biz's\n * src/scripts/chart.ts (2026-10-22):\n * - a roving tabindex: Tab enters the chart once, at the selected star or\n * the first; the arrow keys (and Home, End) walk the stars in the order\n * they're drawn, wrapping; Enter follows the star's link;\n * - the tooltip, on hover and keyboard focus, which the pointer can rest on\n * without it ever blocking a star, and Escape dismisses (WCAG 1.4.13). It\n * opens beside its star, clear of a fixed or sticky header (placeTip);\n * - in full mode, selection: a star selects its project in place instead of\n * following its link. The chart fires SELECT_EVENT on its frame (it\n * bubbles; cancel it to refuse), then marks the star (setCurrent), so a\n * site drives its own card, status line and deep links;\n * - the figures drawing themselves in, only for a chart that starts below\n * the screen, and never under reduced motion or in capture mode.\n *\n * Nothing happens at import: no listener, no observer, no timer until\n * initStarCharts runs. It imports no renderer, so a site's browser bundle\n * carries only this (test/star-chart-weight.test.mjs holds its weight).\n * Focus listeners sit on the chart's HTML frame, never on the SVG: in\n * Chromium an SVG element with a focusin listener becomes a Tab stop of its\n * own. Idempotent; the teardown puts the markup back as it was. SSR-safe.\n */\nimport { capture, reducedMotion } from './prefs.js';\n\n/** Fired on a full chart's frame when a star is chosen; it bubbles, and cancelling it keeps the selection. detail: { slug, pointer }. */\nexport const SELECT_EVENT = 'star-chart:select';\n/** Where the tooltip looks for headers to keep clear of, unless told otherwise. */\nexport const HEADER_SELECTOR = 'header, .topbar';\n\nconst STAR = '.star-chart-star';\nconst starsOf = (svg) => [...svg.querySelectorAll(STAR)];\n/** What marks a star's place: its core, or the centre's mark. */\nconst coreOf = (star) => star.querySelector('.star-chart-core, .star-chart-mark') ?? star;\nconst starAt = (target) => (target instanceof Element ? target.closest(STAR) : null);\nconst frameOf = (el) => (el instanceof Element ? el.closest('[data-star-chart]') : null);\n/** A click the browser should keep: a new tab or window, or not the main button. */\nexport const modified = (e) => e.button !== 0 || e.ctrlKey || e.metaKey || e.shiftKey || e.altKey;\n\n/** The charts enhanced now, each with its undo. Made on first use, so importing this module does nothing. */\nlet enhanced = null;\nconst registry = () => (enhanced ??= new WeakMap());\n\n/** Makes one star the chart's only tabbable star. */\nfunction rove(stars, star) {\n for (const s of stars) s.setAttribute('tabindex', s === star ? '0' : '-1');\n}\n\n/**\n * Marks a chart's selected star (`aria-current=\"true\"`) and, on an enhanced\n * chart, makes it the star Tab enters at. `null` clears the selection. Returns\n * false, changing nothing, when the chart has no such star.\n *\n * @param {Element} chart the chart's frame, its SVG, or anything inside it\n * @param {string | null} slug\n */\nexport function setCurrent(chart, slug) {\n const frame = frameOf(chart);\n const svg = frame?.querySelector('svg.star-chart-svg');\n if (!svg) return false;\n const stars = starsOf(svg);\n const star = slug == null ? null : stars.find((s) => s.dataset.slug === slug);\n if (slug != null && !star) return false;\n for (const s of stars) {\n if (s === star) s.setAttribute('aria-current', 'true');\n else s.removeAttribute('aria-current');\n }\n if (star && registry().has(frame)) rove(stars, star);\n return true;\n}\n\n/**\n * Enhances every chart under root (or root itself) that isn't yet: safe to\n * call again, and on markup added later. Returns a function that undoes what\n * this call did.\n *\n * @param {ParentNode} [root]\n * @param {import('./star-chart').StarChartInitOptions} [options]\n * @returns {() => void}\n */\nexport function initStarCharts(root = typeof document === 'undefined' ? null : document, options = {}) {\n if (!root || typeof window === 'undefined') return () => {};\n document.documentElement.setAttribute('data-js', '');\n const found = [...root.querySelectorAll('[data-star-chart]')];\n if (root instanceof Element && root.matches('[data-star-chart]')) found.unshift(root);\n const undo = [];\n for (const frame of found) {\n if (registry().has(frame)) continue;\n const off = enhance(frame, options);\n if (!off) continue;\n registry().set(frame, off);\n undo.push(() => {\n registry().delete(frame);\n off();\n });\n }\n return () => undo.splice(0).forEach((f) => f());\n}\n\nfunction enhance(frame, options) {\n const svg = frame.querySelector('svg.star-chart-svg');\n if (!svg || !svg.querySelector(STAR)) return null;\n const offs = [];\n /** Adds a listener and remembers how to take it off. */\n const on = (target, type, fn, opts) => {\n target.addEventListener(type, fn, opts);\n offs.push(() => target.removeEventListener(type, fn, opts));\n };\n offs.push(initKeys(svg, frame, on), initTip(svg, frame, on, options), initFigures(svg));\n if (frame.dataset.starChart === 'full') {\n on(frame, 'click', (e) => {\n const star = starAt(e.target);\n if (!star || !svg.contains(star) || !star.dataset.slug || modified(e)) return;\n e.preventDefault();\n // detail is 0 when Enter activated the link, and a count for a real click or tap.\n const chosen = new CustomEvent(SELECT_EVENT, { bubbles: true, cancelable: true, detail: { slug: star.dataset.slug, pointer: e.detail > 0 } });\n if (frame.dispatchEvent(chosen)) setCurrent(frame, star.dataset.slug);\n });\n }\n return () => offs.splice(0).reverse().forEach((f) => f?.());\n}\n\nconst STEPS = {\n ArrowRight: (i) => i + 1,\n ArrowDown: (i) => i + 1,\n ArrowLeft: (i) => i - 1,\n ArrowUp: (i) => i - 1,\n Home: () => 0,\n End: (_, last) => last,\n};\n\nfunction initKeys(svg, frame, on) {\n const stars = starsOf(svg);\n rove(stars, stars.find((s) => s.getAttribute('aria-current') === 'true') ?? stars[0]);\n on(frame, 'keydown', (e) => {\n const star = starAt(e.target);\n const step = STEPS[e.key];\n if (!star || !svg.contains(star) || !step || e.altKey || e.ctrlKey || e.metaKey) return;\n e.preventDefault();\n const next = stars[(step(stars.indexOf(star), stars.length - 1) + stars.length) % stars.length];\n rove(stars, next);\n next.focus();\n });\n // A star focused any other way (a click, a screen reader) becomes the tabbable one.\n on(frame, 'focusin', (e) => {\n const star = starAt(e.target);\n if (star && svg.contains(star)) rove(stars, star);\n });\n // Without the script every star is in the Tab order again, as the markup has it.\n return () => stars.forEach((s) => s.setAttribute('tabindex', '0'));\n}\n\n/** How long the tooltip waits before going, so the pointer can cross onto it. */\nconst GRACE_MS = 300;\n/** Space between a star and its tooltip. */\nconst GAP = 18;\n\n/**\n * The tooltip names the star under the pointer or the keyboard focus. It sits\n * in the frame's own coordinates, so it moves with the chart when the page\n * scrolls, on the side placeTip chooses.\n *\n * It meets WCAG 1.4.13 without ever standing between the pointer and a star:\n * - It never takes the pointer (pointer-events: none). Whether the pointer\n * rests on it is read from the pointer's position, and while it does, the\n * tooltip keeps its star, even over another star beneath it. A press there\n * still reaches that star, and the tooltip follows the press.\n * - Leaving a star starts a short grace, so the pointer can cross to the\n * tooltip; after it, the tooltip shows what the pointer or focus is on.\n * - Escape dismisses it without moving either. A dismissed tooltip stays away\n * until the pointer leaves that star, or focus moves to another one.\n * Touch never hovers: a tap selects or follows the star, with no tooltip, and\n * focus from a tap or click (not :focus-visible) doesn't open one either.\n */\nfunction initTip(svg, frame, on, options) {\n // renderStarChart draws it; markup without one simply has no tooltip.\n const tip = frame.querySelector('.star-chart-tip');\n if (!tip || tip.children.length < 3) return null;\n const stars = starsOf(svg);\n const [stage, name, one] = tip.children;\n /** The star the tooltip names, shown or not. */\n let shown = null;\n let timer = 0;\n let pending = false;\n /** Where a mouse or pen pointer last was on the page, and the star under it. */\n let pointer = null;\n let hovered = null;\n /** Stars whose tooltip Escape dismissed: under the pointer, and with keyboard focus. */\n let quietHover = null;\n let quietFocus = null;\n\n /** How far down the window a fixed or sticky header covers it, in px. */\n const insetTop = () => {\n const given = options.insetTop;\n if (typeof given === 'function') return Number(given()) || 0;\n if (typeof given === 'number') return given;\n const selector = options.header === undefined ? HEADER_SELECTOR : options.header;\n if (!selector) return 0;\n const box = frame.getBoundingClientRect();\n let bottom = 0;\n for (const el of document.querySelectorAll(selector)) {\n if (el.contains(frame) || !/^(fixed|sticky)$/.test(getComputedStyle(el).position)) continue;\n const r = el.getBoundingClientRect();\n // A header: in the window's top half, across the chart, and drawn.\n if (r.height > 0 && r.top < innerHeight / 2 && r.left < box.right && r.right > box.left) bottom = Math.max(bottom, r.bottom);\n }\n return bottom;\n };\n\n const visible = () => tip.dataset.show === 'true';\n const cancel = () => {\n clearTimeout(timer);\n pending = false;\n };\n const centre = (el, box) => {\n const r = el.getBoundingClientRect();\n return [r.left + r.width / 2 - box.left, r.top + r.height / 2 - box.top];\n };\n const place = (star) => {\n const box = frame.getBoundingClientRect();\n const [left, top] = placeTip({\n star: centre(coreOf(star), box),\n others: stars.filter((s) => s !== star).map((s) => centre(coreOf(s), box)),\n reach: (star.querySelector('.star-chart-hit')?.getBoundingClientRect().width ?? 0) / 2,\n size: [tip.offsetWidth, tip.offsetHeight],\n frame: [box.width, box.height],\n view: { top: Math.max(0, insetTop()) - box.top, bottom: innerHeight - box.top },\n gap: GAP,\n });\n // CSSOM, not a style attribute: a CSP of style-src 'self' allows it.\n tip.style.left = `${left}px`;\n tip.style.top = `${top}px`;\n };\n const show = (star) => {\n cancel();\n if (star === shown && visible()) return;\n stage.textContent = star.dataset.stage ?? '';\n name.textContent = star.dataset.name ?? '';\n one.textContent = star.dataset.one ?? '';\n place(star);\n tip.dataset.show = 'true';\n shown = star;\n };\n const hide = () => {\n cancel();\n tip.dataset.show = 'false';\n };\n const onTip = () => {\n if (!pointer || !visible()) return false;\n const r = tip.getBoundingClientRect();\n return pointer[0] >= r.left && pointer[0] <= r.right && pointer[1] >= r.top && pointer[1] <= r.bottom;\n };\n /** The star with keyboard focus, whose tooltip outlasts a passing pointer. */\n const focused = () => {\n const star = starAt(document.activeElement);\n return star && svg.contains(star) && star.matches(':focus-visible') ? star : null;\n };\n /** Shows what the pointer is on, else what keyboard focus is on, else nothing. */\n const settle = () => {\n if (hovered && hovered !== quietHover) return show(hovered);\n const star = focused();\n if (star && star !== quietFocus) show(star);\n else hide();\n };\n const leave = () => {\n if (pending) return;\n pending = true;\n timer = window.setTimeout(() => {\n pending = false;\n if (!onTip()) settle();\n }, GRACE_MS);\n };\n\n /** The star under the pointer changes. Leaving a star Escape dismissed lets it open again. */\n const hover = (star) => {\n if (star === hovered) return;\n if (hovered && hovered === quietHover) quietHover = null;\n hovered = star;\n };\n /** Mouse and pen: every move and every element the pointer enters. */\n const track = (e) => {\n if (e.pointerType === 'touch') return;\n pointer = [e.clientX, e.clientY];\n const star = starAt(e.target);\n hover(star && svg.contains(star) ? star : null);\n // Resting on the tooltip keeps its star, even over another star beneath it.\n if (onTip()) return cancel();\n if (hovered) {\n if (hovered !== quietHover) show(hovered);\n } else if (visible()) leave();\n };\n on(document, 'pointermove', track, { passive: true });\n on(document, 'pointerover', track, { passive: true });\n // The pointer left the window: nothing is under it now.\n on(document, 'pointerout', (e) => {\n if (e.relatedTarget || e.pointerType === 'touch') return;\n pointer = null;\n hover(null);\n if (visible()) leave();\n });\n // A press is a choice: the tooltip follows the star pressed, even one beneath it.\n on(frame, 'pointerdown', (e) => {\n const star = starAt(e.target);\n if (!star || !svg.contains(star) || e.pointerType === 'touch') return;\n quietHover = null;\n show(star);\n });\n\n on(frame, 'focusin', (e) => {\n const star = starAt(e.target);\n if (!star || !svg.contains(star) || !star.matches(':focus-visible')) return;\n // Focus coming back from outside the page (another window, the browser's own bar) isn't a new trigger.\n if (star === quietFocus && !e.relatedTarget) return;\n quietFocus = null;\n show(star);\n });\n on(frame, 'focusout', (e) => {\n const to = starAt(e.relatedTarget);\n if (to && svg.contains(to)) return;\n // Focus moved within the page, even to nothing (a click on blank space): coming\n // back is a new trigger. Only the window losing focus keeps a dismissal.\n if (e.relatedTarget || document.hasFocus()) quietFocus = null;\n // A pointer resting on the tooltip, or a grace still running, decides instead.\n if (onTip() || pending) return;\n if (hovered && hovered !== quietHover) show(hovered);\n else hide();\n });\n on(document, 'keydown', (e) => {\n if (e.key !== 'Escape' || !visible() || e.defaultPrevented) return;\n quietHover = hovered;\n quietFocus = focused();\n hide();\n // This Escape goes no further, so a dialog around the chart closes on the next one.\n e.preventDefault();\n });\n\n return () => {\n cancel();\n delete tip.dataset.show;\n tip.style.removeProperty('left');\n tip.style.removeProperty('top');\n // As drawn: no style attribute, not even an empty one.\n if (!tip.style.length) tip.removeAttribute('style');\n for (const p of [stage, name, one]) p.textContent = '';\n };\n}\n\n/**\n * The figures are drawn in the markup. Only a chart that starts below the\n * screen hides them (data-figures=\"pending\") and draws them in once a quarter\n * of it is in view.\n */\nfunction initFigures(svg) {\n if (capture() || reducedMotion() || !('IntersectionObserver' in window)) return null;\n if (svg.getBoundingClientRect().top < innerHeight) return null;\n svg.setAttribute('data-figures', 'pending');\n let timer = 0;\n const io = new IntersectionObserver(\n (entries) => {\n if (!entries.some((e) => e.isIntersecting)) return;\n io.disconnect();\n svg.setAttribute('data-figures', 'drawing');\n // The transition takes 1.6 s; after it, the lines go back to plain strokes.\n timer = window.setTimeout(() => svg.removeAttribute('data-figures'), 2000);\n },\n { threshold: 0.25 },\n );\n io.observe(svg);\n return () => {\n io.disconnect();\n clearTimeout(timer);\n svg.removeAttribute('data-figures');\n };\n}\n\n/** Overflow is weighed in 8px steps after a 1px allowance, so rounding at a fractional header edge never decides a side. */\nconst STEP = 8;\nconst steps = (px) => Math.ceil(Math.max(0, px - 1) / STEP);\n\n/** Whether rank a comes before rank b, comparing term by term. */\nfunction isLower(a, b) {\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return a[i] < b[i];\n return false;\n}\n\n/**\n * Where the tooltip opens: its top-left corner, in the frame's coordinates.\n * Pure geometry (starscape.biz's src/scripts/tip-place.ts).\n *\n * It opens beside its star, on one of four sides. Below and to the right comes\n * first. Another side wins when it keeps the tooltip on screen and clear of the\n * header, then when it covers fewer other stars, then when it stays inside the\n * frame, then when it needn't be pushed in from the frame's edge (so near the\n * right edge it flips to the star's left). The tooltip never takes the\n * pointer, so a star it covers can still be pressed, but a covered star can't\n * be seen, and a tooltip off screen can't be read.\n *\n * @param {import('./star-chart').TipLayout} layout\n * @returns {[number, number]}\n */\nexport function placeTip({ star: [x, y], others, reach, size: [w, h], frame: [fw, fh], view, gap }) {\n const sides = [\n [gap, gap], // below right\n [-gap - w, gap], // below left\n [gap, -gap - h], // above right\n [-gap - w, -gap - h], // above left\n ];\n let best = [0, 0];\n let bestRank = null;\n sides.forEach(([dx, dy], i) => {\n const left = Math.max(0, Math.min(x + dx, fw - w));\n const top = y + dy;\n const offscreen = Math.max(0, view.top - top) + Math.max(0, top + h - view.bottom);\n const covered = others.filter(([sx, sy]) => {\n const nx = Math.max(left, Math.min(sx, left + w)) - sx;\n const ny = Math.max(top, Math.min(sy, top + h)) - sy;\n return nx * nx + ny * ny < reach * reach;\n }).length;\n const overflow = Math.max(0, -top) + Math.max(0, top + h - fh);\n const pushed = left !== x + dx ? 1 : 0;\n const rank = [steps(offscreen), covered, steps(overflow), pushed, i];\n if (!bestRank || isLower(rank, bestRank)) [bestRank, best] = [rank, [left, top]];\n });\n return best;\n}\n","/**\n * Starscape v3 — the star chart's data contract: the stars, their\n * constellations and the figures that join them, and every rule a site checks\n * at build time. Pure: no DOM, no framework, no file system. It runs in Node\n * at build time, or anywhere else.\n *\n * import { prepareChartData, walkOrder } from '@starlove/ui/star-chart-data';\n * const data = prepareChartData({ stars, families, figures }); // throws, listing every problem\n * renderStarChart(data, { mode: 'full' }); // @starlove/ui/star-chart-render\n *\n * The records stay in each site (starscape.biz keeps them in YAML); this is\n * what they must look like. A star is one project or product:\n *\n * slug its stable id: lowercase words joined by hyphens, a URL fragment too\n * centre true for the one star at the pole (each site's other site): no\n * family and no position, the chart draws it at the pole\n * family its constellation, a families id\n * magnitude how far along it is, lower is brighter: 1 Shipped · 2 Live, early\n * · 3 In development · 4 Prototype · 5 Idea (drawn hollow)\n * position [x, y] on the 1000 × 640 chart, with the pole at [500, 320]; it\n * keeps to its constellation's quadrant, clear of the pole and of\n * the other stars\n * name, short, one_liner, body words; short is the chart's label\n * facts, links, image optional, for a site's own cards\n * public false keeps it off the chart (default true)\n * confirm a site's flag for words awaiting confirmation (default false)\n *\n * A family is { id, name, blurb, label: [x, y] }: its name sits at label, which\n * also names the quadrant its stars keep to. A figure is [slug, slug], a line\n * between two stars of one constellation.\n *\n * Ported from starscape.biz's src/lib/projects.ts (2026-10-22): its rules,\n * minus what only a site can check, which comes in as options: files on disk\n * (imageExists), its copy rules (copy), its own page ids (reserved) and keys\n * of its own (keys).\n */\n\n/** Maturity on an astronomer's scale, where lower is brighter. */\nexport const MAGNITUDES = { 1: 'Shipped', 2: 'Live, early', 3: 'In development', 4: 'Prototype', 5: 'Idea' };\n\n/** The chart's coordinate space, with the centre star at the pole. */\nexport const CHART = { width: 1000, height: 640, pole: [500, 320] };\n\n/** Stars keep this far inside the chart's edge, */\nconst MARGIN = 40;\n/** this far from the pole and its label, */\nconst POLE_CLEARANCE = 70;\n/** and this far from each other, so every name has room. */\nconst MIN_GAP = 80;\n\n/** The ids a chart puts on the page, from its id prefix: its glow gradient and its label knockout. */\nexport const chartIds = (id) => [`${id}-glow`, `${id}-knockout`];\n/** A chart's id prefix unless you give one: one per mode, so a teaser and a full chart can share a page. */\nexport const defaultChartId = (mode) => `star-chart-${mode === 'full' ? 'full' : 'teaser'}`;\n\nconst SLUG = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n/** Every key a record may have. Anything else is a typo, such as `pubilc: false`, that would otherwise be ignored. */\nconst KEYS = {\n star: ['slug', 'centre', 'family', 'name', 'short', 'magnitude', 'position', 'one_liner', 'body', 'facts', 'links', 'image', 'public', 'confirm'],\n family: ['id', 'name', 'blurb', 'label'],\n image: ['night', 'day', 'alt', 'alt_day'],\n link: ['label', 'href'],\n};\nconst isRecord = (v) => !!v && typeof v === 'object' && !Array.isArray(v);\nconst unknownKeys = (record, known) => Object.keys(record).filter((k) => !known.includes(k));\nconst isText = (v) => typeof v === 'string' && v.trim() !== '';\nconst isPoint = (v) =>\n Array.isArray(v) && v.length === 2 && v.every(Number.isFinite) && v[0] >= 0 && v[0] <= CHART.width && v[1] >= 0 && v[1] <= CHART.height;\n\n/** A full https address with a real host; `https:///x` and `https://x` don't pass. */\nfunction isHttps(href) {\n if (typeof href !== 'string' || !/^https:\\/\\/[^/\\s]+(?:[/?#]\\S*)?$/.test(href)) return false;\n try {\n const url = new URL(href);\n return url.protocol === 'https:' && url.hostname.includes('.');\n } catch {\n return false;\n }\n}\n\n/**\n * Every rule the records break, in words a person can act on. Empty when all\n * is well. It never throws, whatever it's given.\n *\n * @param {unknown} data { stars, families, figures }, as written (the centre among the stars)\n * @param {import('./star-chart-data').ValidateOptions} [options]\n * @returns {string[]}\n */\nexport function validateChartData(data, options = {}) {\n const { reserved = [], keys = {}, imageExists, copy } = options;\n if (!isRecord(data)) return ['the chart data must be a record of stars, families and figures'];\n const out = [];\n for (const list of ['stars', 'families', 'figures']) {\n if (!Array.isArray(data[list])) out.push(`${list} must be a list`);\n }\n if (out.length) return out;\n const records = (list, name) => list.filter((r, i) => (isRecord(r) ? true : (out.push(`${name} entry ${i + 1} is not a record`), false)));\n const familyList = records(data.families, 'families');\n const starList = records(data.stars, 'stars');\n const known = {\n star: [...KEYS.star, ...(keys.star ?? [])],\n family: [...KEYS.family, ...(keys.family ?? [])],\n };\n /** A site's copy rules (its `copy` option) over a record's words. */\n const words = (who, texts) => {\n if (typeof copy !== 'function') return;\n for (const problem of copy(texts.filter(isText).join(' ')) ?? []) out.push(`${who}: ${problem}`);\n };\n\n // Constellations first: the stars are checked against them.\n const families = new Map();\n for (const f of familyList) {\n const who = isText(f.name) ? f.name : `constellation \"${f.id}\"`;\n for (const key of unknownKeys(f, known.family)) out.push(`${who}: unknown key \"${key}\"`);\n if (typeof f.id !== 'string' || !SLUG.test(f.id)) out.push(`constellation \"${f.id}\": id must be lowercase words joined by hyphens`);\n else if (families.has(f.id)) out.push(`constellation \"${f.id}\" is listed twice`);\n else families.set(f.id, f);\n for (const key of ['name', 'blurb']) if (!isText(f[key])) out.push(`${who}: ${key} is missing`);\n if (!isPoint(f.label)) out.push(`${who}: label must be [x, y] on the chart`);\n words(who, [f.name, f.blurb]);\n }\n\n // A slug is a URL fragment, and often an id on the page: never one the chart or the site already uses.\n const taken = new Set([...chartIds(defaultChartId('teaser')), ...chartIds(defaultChartId('full')), ...reserved]);\n const stars = new Map();\n const centres = [];\n const [poleX, poleY] = CHART.pole;\n for (const s of starList) {\n const who = s.slug;\n for (const key of unknownKeys(s, known.star)) out.push(`${who}: unknown key \"${key}\"`);\n if (typeof s.slug !== 'string' || !SLUG.test(s.slug)) out.push(`slug \"${s.slug}\" must be lowercase words joined by hyphens`);\n else if (taken.has(s.slug)) out.push(`slug \"${s.slug}\" is already an id on the page`);\n if (stars.has(s.slug)) out.push(`slug \"${s.slug}\" is used twice`);\n stars.set(s.slug, s);\n\n if (!Number.isInteger(s.magnitude) || s.magnitude < 1 || s.magnitude > 5) out.push(`${who}: magnitude ${s.magnitude} is not 1 to 5`);\n for (const key of ['name', 'short', 'one_liner', 'body']) {\n if (!isText(s[key])) out.push(`${who}: ${key} is missing`);\n }\n // YAML 1.2 reads `no`, `off` and \"false\" as strings, which are truthy: only true and false will do.\n for (const flag of ['public', 'confirm', 'centre']) {\n if (s[flag] !== undefined && typeof s[flag] !== 'boolean') out.push(`${who}: ${flag} must be true or false`);\n }\n\n if (s.centre === true) {\n // The centre is the star at the pole: the chart draws it there, in no constellation.\n centres.push(s.slug);\n if (s.family !== undefined) out.push(`${who}: the centre joins no constellation, so it takes no family`);\n if (s.position !== undefined) out.push(`${who}: the centre sits at the pole, so it takes no position`);\n } else {\n const family = families.get(s.family);\n if (!family) out.push(`${who}: no constellation \"${s.family}\"`);\n const position = Array.isArray(s.position) && s.position.length === 2 && s.position.every(Number.isFinite) ? s.position : null;\n const [x, y] = position ?? [NaN, NaN];\n const onChart = position !== null && x >= MARGIN && x <= CHART.width - MARGIN && y >= MARGIN && y <= CHART.height - MARGIN;\n if (!onChart) out.push(`${who}: position ${position ? `${x},${y}` : JSON.stringify(s.position ?? null)} is off the chart`);\n else {\n if (family && isPoint(family.label) && ((x < poleX) !== (family.label[0] < poleX) || (y < poleY) !== (family.label[1] < poleY))) {\n out.push(`${who}: sits outside the ${family.name} quadrant`);\n }\n if (Math.hypot(x - poleX, y - poleY) < POLE_CLEARANCE) out.push(`${who}: too close to the pole`);\n }\n }\n\n const facts = s.facts === undefined ? [] : s.facts;\n if (!Array.isArray(facts) || !facts.every(isText)) out.push(`${who}: facts must be a list of sentences`);\n const links = s.links === undefined ? [] : s.links;\n if (!Array.isArray(links)) out.push(`${who}: links must be a list`);\n const linkList = Array.isArray(links) ? links.filter((l) => (isRecord(l) ? true : (out.push(`${who}: a link is not a record`), false))) : [];\n for (const link of linkList) {\n for (const key of unknownKeys(link, KEYS.link)) out.push(`${who}: unknown link key \"${key}\"`);\n if (!isText(link.label)) out.push(`${who}: link \"${link.label ?? ''}\" needs a label`);\n if (!isHttps(link.href)) out.push(`${who}: link ${link.href} must be a full https address`);\n }\n if (s.image !== undefined) {\n if (!isRecord(s.image)) out.push(`${who}: image must have a night file and alt text`);\n else {\n for (const key of unknownKeys(s.image, KEYS.image)) out.push(`${who}: unknown image key \"${key}\"`);\n if (!isText(s.image.night)) out.push(`${who}: image needs a night file`);\n for (const key of ['day', 'alt_day']) if (s.image[key] !== undefined && !isText(s.image[key])) out.push(`${who}: image ${key} must be text`);\n for (const file of [s.image.night, s.image.day]) {\n if (isText(file) && typeof imageExists === 'function' && !imageExists(file)) out.push(`${who}: image ${file} is missing`);\n }\n if (!isText(s.image.alt)) out.push(`${who}: image needs alt text`);\n }\n }\n\n const image = isRecord(s.image) ? s.image : undefined;\n words(who, [s.name, s.short, s.one_liner, s.body, ...(Array.isArray(facts) ? facts : []), ...linkList.map((l) => l.label), image?.alt, image?.alt_day]);\n }\n\n if (centres.length > 1) out.push(`only one star can be the centre: ${centres.join(' and ')}`);\n\n const placed = starList.filter((s) => s.centre !== true && Array.isArray(s.position) && s.position.every(Number.isFinite));\n for (let i = 0; i < placed.length; i++) {\n for (let j = i + 1; j < placed.length; j++) {\n const [a, b] = [placed[i], placed[j]];\n if (Math.hypot(a.position[0] - b.position[0], a.position[1] - b.position[1]) < MIN_GAP) out.push(`${a.slug} and ${b.slug} are too close`);\n }\n }\n\n for (const f of families.values()) {\n if (!starList.some((s) => s.family === f.id)) out.push(`constellation \"${f.id}\" has no stars`);\n }\n\n const drawn = new Set();\n for (const line of data.figures) {\n if (!Array.isArray(line) || line.length !== 2 || !line.every((s) => typeof s === 'string')) {\n out.push(`line ${JSON.stringify(line)} must name two stars`);\n continue;\n }\n const [a, b] = line;\n const ends = [stars.get(a), stars.get(b)];\n [a, b].forEach((slug, i) => {\n if (!ends[i]) out.push(`line ${a} to ${b}: no star \"${slug}\"`);\n });\n if (a === b) out.push(`line ${a} to ${b} joins a star to itself`);\n else if (ends.some((e) => e?.centre === true)) out.push(`line ${a} to ${b}: the centre joins no constellation`);\n else if (ends[0] && ends[1] && ends[0].family !== ends[1].family) out.push(`line ${a} to ${b} crosses constellations`);\n const key = [a, b].sort().join(' ');\n if (drawn.has(key)) out.push(`line ${a} to ${b} is drawn twice`);\n drawn.add(key);\n }\n return out;\n}\n\n/**\n * Constellation by constellation, in the families' order, brightest first;\n * equal magnitudes keep their order in the list.\n */\nexport function catalogueOrder(stars, families) {\n const rank = new Map(families.map((f, i) => [f.id, i]));\n return stars\n .map((s, i) => ({ s, i }))\n .sort((a, b) => (rank.get(a.s.family) ?? 0) - (rank.get(b.s.family) ?? 0) || a.s.magnitude - b.s.magnitude || a.i - b.i)\n .map(({ s }) => s);\n}\n\n/**\n * The records ready to draw: the public stars in catalogue order, the\n * constellations that have stars, the lines between public stars, and the\n * centre star at the pole. Throws, listing every problem, when a record breaks\n * a rule. Defaults filled: public, not awaiting confirmation, no facts or links.\n *\n * @param {import('./star-chart-data').ChartRecords} data\n * @param {import('./star-chart-data').ValidateOptions} [options]\n */\nexport function prepareChartData(data, options = {}) {\n const problems = validateChartData(data, options);\n if (problems.length) {\n throw new Error(`${problems.length} problem${problems.length === 1 ? '' : 's'} in the star chart's data:\\n ${problems.join('\\n ')}`);\n }\n const shown = data.stars\n .map((s) => ({ ...s, facts: s.facts ?? [], links: s.links ?? [], public: s.public ?? true, confirm: s.confirm ?? false }))\n .filter((s) => s.public);\n const hub = shown.find((s) => s.centre === true);\n const stars = catalogueOrder(\n shown.filter((s) => s !== hub),\n data.families,\n );\n const slugs = new Set(stars.map((s) => s.slug));\n return {\n stars,\n families: data.families.filter((f) => stars.some((s) => s.family === f.id)),\n figures: data.figures.filter(([a, b]) => slugs.has(a) && slugs.has(b)),\n ...(hub ? { centre: { ...hub, position: [...CHART.pole] } } : {}),\n };\n}\n\n/** The order the arrow keys and a site's cards follow: the centre, then each constellation's stars. */\nexport function walkOrder({ stars, centre }) {\n return centre ? [centre, ...stars] : [...stars];\n}\n","/**\n * Starscape v3 — the star chart's markup, drawn at build time.\n *\n * import { prepareChartData } from '@starlove/ui/star-chart-data';\n * import { renderStarChart, renderMagnitudeLegend } from '@starlove/ui/star-chart-render';\n * const data = prepareChartData(records);\n * const html = renderStarChart(data, { mode: 'full', selected: 'orbit', href: '/projects/#{slug}' });\n *\n * Pure: data in, a string of HTML out, the same in Node at build time and in\n * the browser. The chart it draws is complete without JavaScript: every star\n * is a link, the constellation figures are drawn, the selected star is marked\n * (aria-current), and every star is in the Tab order. @starlove/ui/star-chart\n * enhances it in the browser; components/star-chart styles it. This module is\n * for the build (or a framework's render): keep it out of the browser bundle.\n *\n * Every text and attribute value is escaped, and a link or image whose URL has\n * a scheme other than http, https or mailto (data:image for the mark) never\n * renders: a star falls back to its own fragment, #slug. It writes no style\n * attribute or <style>, so a CSP of style-src 'self' holds; the SVG's\n * presentation attributes are its only inline styling.\n *\n * Ported from starscape.biz's src/components/StarChart.astro and\n * MagnitudeLegend.astro (2026-10-22). The modes:\n * teaser star names only; every star follows its link\n * full magnitude lines and constellation blurbs; in the browser a star\n * selects its project in place (star-chart.js)\n * Every label knocks the rings, spokes and figures out beneath it, as a\n * printed star chart does: a mask over the grid and the figures holds a copy\n * of each label (star-chart-ko-*), drawn thick in black.\n */\nimport { CHART, MAGNITUDES, chartIds, defaultChartId } from './star-chart-data.js';\nimport { isSafeUrl } from './url.js';\n\nconst ESC = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' };\n/** Text or an attribute value, escaped for HTML (and the SVG inside it). */\nconst esc = (v) => String(v ?? '').replace(/[&<>\"']/g, (c) => ESC[c]);\nconst round = (n) => Math.round(n * 10) / 10;\n/** A coordinate for an attribute: rounded to a tenth, 0 when it isn't a number. */\nconst num = (n) => (Number.isFinite(n) ? String(round(n) + 0) : '0');\nconst isPoint = (p) => Array.isArray(p) && p.length === 2 && p.every(Number.isFinite);\n\n// isSafeUrl moved to url.js (Secu's review of 3.4.0) so the gallery and\n// ui-react ask the same question; it stays exported here, as before.\nexport { isSafeUrl };\n\n/** Core radius and glow radius by magnitude: brighter stars are bigger. Ideas are hollow. */\nconst CORE = { 1: 4.4, 2: 3.6, 3: 2.8, 4: 2.1, 5: 2.4 };\nconst GLOW = { 1: 22, 2: 16, 3: 11, 4: 7, 5: 0 };\nconst RINGS = [70, 150, 230, 310, 390];\nconst SPOKES = Array.from({ length: 12 }, (_, k) => (k / 12) * Math.PI * 2);\n/** A circle as a path, so pathLength can space the focus ring's dashes evenly at any size. */\nconst ring = (x, y, r) => `M${num(x - r)} ${num(y)}a${num(r)} ${num(r)} 0 1 0 ${num(2 * r)} 0a${num(r)} ${num(r)} 0 1 0 ${num(-2 * r)} 0`;\n/** Where a star's name and magnitude line sit: stars near the right edge put them on their left. */\nconst labelAt = (x) => (x > 820 ? { tx: x - 14, anchor: 'end' } : { tx: x + 14, anchor: 'start' });\n/** A four-pointed star, the pole's mark when the site gives no image: r across, with a waist of r / 5. */\nconst glyph = (x, y, r) => {\n const w = r / 5;\n return `M${num(x)} ${num(y - r)}L${num(x + w)} ${num(y - w)}L${num(x + r)} ${num(y)}L${num(x + w)} ${num(y + w)}L${num(x)} ${num(y + r)}L${num(x - w)} ${num(y + w)}L${num(x - r)} ${num(y)}L${num(x - w)} ${num(y - w)}Z`;\n};\n\n/** The words the chart says. Pass your own to translate them. */\nexport const WORDS = {\n /** The chart's accessible name. */\n label: 'Starscape projects drawn as a star chart. Brighter stars are further along.',\n /** The pole's name when no centre star stands there. */\n pole: 'Starscape',\n /** The stages, by magnitude (MAGNITUDES). */\n stages: MAGNITUDES,\n /** The line under a star's name on the full chart: \"Mag 3 · In development\". */\n magnitude: (m, stage) => `Mag ${m} · ${stage}`,\n /** The legend's name, and the word that heads it. */\n legend: 'Magnitude scale',\n legendTitle: 'Magnitude',\n};\n\n/** An id prefix the page can use: letters, digits, hyphens and underscores. */\nconst cleanId = (id, mode) => {\n const clean = String(id ?? '').replace(/[^A-Za-z0-9_-]+/g, '-').replace(/^-+|-+$/g, '');\n return clean || defaultChartId(mode);\n};\n\n/**\n * The star chart as a string of HTML: the frame (`<div class=\"star-chart\"\n * data-star-chart=\"teaser|full\">`) holding the SVG and the tooltip, or with\n * `frame: false` only what goes inside it, for a frame of your own (React's).\n *\n * @param {import('./star-chart-data').ChartData} data prepareChartData's result\n * @param {import('./star-chart-render').StarChartOptions} [options]\n * @returns {string}\n */\nexport function renderStarChart(data, options = {}) {\n const mode = options.mode === 'full' ? 'full' : 'teaser';\n const full = mode === 'full';\n const words = { ...WORDS, ...options.words, stages: { ...MAGNITUDES, ...options.words?.stages } };\n const stageOf = (m) => words.stages[m] ?? '';\n const magLine = (m) => words.magnitude(m, stageOf(m));\n const id = cleanId(options.id, mode);\n const [glowId, knockoutId] = chartIds(id);\n const [cx, cy] = CHART.pole;\n const selected = options.selected ?? null;\n\n const stars = (Array.isArray(data?.stars) ? data.stars : []).filter((s) => s && s.centre !== true && isPoint(s.position));\n const families = (Array.isArray(data?.families) ? data.families : []).filter((f) => f && isPoint(f.label));\n const centre = data?.centre && typeof data.centre === 'object' ? data.centre : null;\n const bySlug = new Map(stars.map((s) => [s.slug, s]));\n const figures = (Array.isArray(data?.figures) ? data.figures : [])\n .map((line) => (Array.isArray(line) ? [bySlug.get(line[0]), bySlug.get(line[1])] : []))\n .filter(([a, b]) => a && b && a !== b);\n\n /** A star's link: the href option (a function, or a string with {slug}), else its fragment. Never a script. */\n const hrefOf = (star) => {\n const fallback = `#${star.slug ?? ''}`;\n const given = typeof options.href === 'function' ? options.href(star) : typeof options.href === 'string' ? options.href.replaceAll('{slug}', String(star.slug ?? '')) : fallback;\n return isSafeUrl(given) ? given : fallback;\n };\n\n // The centre's mark: the site's image, drawn `size` units across, or a four-pointed star.\n const size = Number.isFinite(options.mark?.size) && options.mark.size > 0 ? options.mark.size : 44;\n const MARK = size / 2;\n const src = isSafeUrl(options.mark?.src, { image: true }) && String(options.mark.src).trim() ? options.mark.src : null;\n const mark = (cls) =>\n src\n ? `<image class=\"${cls}\" href=\"${esc(src)}\" x=\"${num(cx - MARK)}\" y=\"${num(cy - MARK)}\" width=\"${num(2 * MARK)}\" height=\"${num(2 * MARK)}\"></image>`\n : `<path class=\"${cls}\" d=\"${glyph(cx, cy, MARK)}\"></path>`;\n const poleLabel = centre ? centre.short : words.pole;\n const poleY = cy + MARK + 18;\n\n const out = [];\n out.push(`<svg class=\"star-chart-svg\" viewBox=\"0 0 ${CHART.width} ${CHART.height}\" role=\"group\" aria-label=\"${esc(words.label)}\">`);\n\n // The glow every bright star wears, and the knockout: white, with each label's copy in black.\n out.push(\n `<defs><radialGradient id=\"${glowId}\">`,\n '<stop class=\"star-chart-glow-core\" offset=\"0\" stop-color=\"#ffffff\" stop-opacity=\"0.85\"></stop>',\n '<stop class=\"star-chart-glow-halo\" offset=\"0.25\" stop-color=\"#a8c0ff\" stop-opacity=\"0.35\"></stop>',\n '<stop class=\"star-chart-glow-halo\" offset=\"1\" stop-color=\"#a8c0ff\" stop-opacity=\"0\"></stop>',\n '</radialGradient>',\n `<mask id=\"${knockoutId}\" maskUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"${CHART.width}\" height=\"${CHART.height}\">`,\n `<rect width=\"${CHART.width}\" height=\"${CHART.height}\" fill=\"#fff\"></rect><g class=\"star-chart-ko\">`,\n `<text class=\"star-chart-ko-centre\" x=\"${num(cx)}\" y=\"${num(poleY)}\" text-anchor=\"middle\">${esc(poleLabel)}</text>`,\n );\n for (const f of families) {\n const blurb = full ? `<tspan class=\"star-chart-blurb\" x=\"${num(f.label[0])}\" dy=\"15\">${esc(f.blurb)}</tspan>` : '';\n out.push(`<text class=\"star-chart-ko-family\" x=\"${num(f.label[0])}\" y=\"${num(f.label[1])}\" text-anchor=\"middle\">${esc(f.name)}${blurb}</text>`);\n }\n for (const s of stars) {\n const [x, y] = s.position;\n const { tx, anchor } = labelAt(x);\n out.push(`<text class=\"star-chart-ko-name\" data-magnitude=\"${esc(s.magnitude)}\" x=\"${num(tx)}\" y=\"${num(y + 4)}\" text-anchor=\"${anchor}\">${esc(s.short)}</text>`);\n if (full) out.push(`<text class=\"star-chart-ko-mag\" x=\"${num(tx)}\" y=\"${num(y + 18)}\" text-anchor=\"${anchor}\">${esc(magLine(s.magnitude))}</text>`);\n }\n out.push('</g></mask></defs>');\n\n // The grid: rings and spokes around the pole, knocked out under the labels.\n out.push(`<g class=\"star-chart-grid\" aria-hidden=\"true\" mask=\"url(#${knockoutId})\">`);\n RINGS.forEach((r, i) => out.push(`<circle class=\"star-chart-ring\"${i % 2 === 1 ? ' data-major=\"\"' : ''} cx=\"${num(cx)}\" cy=\"${num(cy)}\" r=\"${r}\"></circle>`));\n for (const a of SPOKES) {\n out.push(`<line class=\"star-chart-spoke\" x1=\"${num(cx + Math.cos(a) * 46)}\" y1=\"${num(cy + Math.sin(a) * 46)}\" x2=\"${num(cx + Math.cos(a) * 420)}\" y2=\"${num(cy + Math.sin(a) * 420)}\"></line>`);\n }\n out.push('</g>');\n\n // With no centre star, the pole is the mark and its name, and links nowhere.\n if (!centre) out.push(`<g class=\"star-chart-pole\" aria-hidden=\"true\">${mark('star-chart-mark')}<text class=\"star-chart-centre-label\" x=\"${num(cx)}\" y=\"${num(poleY)}\" text-anchor=\"middle\">${esc(poleLabel)}</text></g>`);\n\n // The figures. pathLength 1 lets CSS draw any line in with the same dash values,\n // because the CSP allows no per-line style attribute.\n out.push(`<g class=\"star-chart-figures\" aria-hidden=\"true\" mask=\"url(#${knockoutId})\">`);\n for (const [a, b] of figures) {\n out.push(`<path class=\"star-chart-figure\" d=\"M${num(a.position[0])} ${num(a.position[1])}L${num(b.position[0])} ${num(b.position[1])}\" pathLength=\"1\"></path>`);\n }\n out.push('</g>');\n\n out.push('<g class=\"star-chart-families\" aria-hidden=\"true\">');\n for (const f of families) {\n const blurb = full ? `<tspan class=\"star-chart-blurb\" x=\"${num(f.label[0])}\" dy=\"15\">${esc(f.blurb)}</tspan>` : '';\n out.push(`<text class=\"star-chart-family\" x=\"${num(f.label[0])}\" y=\"${num(f.label[1])}\" text-anchor=\"middle\">${esc(f.name)}${blurb}</text>`);\n }\n out.push('</g>');\n\n // The stars, in the order the arrow keys walk them: the centre, then the rest as given.\n out.push('<g class=\"star-chart-stars\">');\n /** What every star's link carries: its place, its words for the tooltip, and its name. */\n const linkOf = (s, name, extra = '') =>\n `<a class=\"star-chart-star\"${extra} href=\"${esc(hrefOf(s))}\" tabindex=\"0\" data-slug=\"${esc(s.slug)}\" data-magnitude=\"${esc(s.magnitude)}\" data-name=\"${esc(s.name)}\" data-stage=\"${esc(stageOf(s.magnitude))}\" data-one=\"${esc(s.one_liner)}\" aria-label=\"${esc(name)}\"${selected !== null && s.slug === selected ? ' aria-current=\"true\"' : ''}>`;\n if (centre) {\n // Its name says what its tooltip says: the stage alone, as on the teaser.\n out.push(\n linkOf(centre, `${centre.name}. ${stageOf(centre.magnitude)}. ${centre.one_liner}`, ' data-centre=\"\"'),\n `<circle class=\"star-chart-hit\" cx=\"${num(cx)}\" cy=\"${num(cy)}\" r=\"${num(MARK + 8)}\"></circle>`,\n mark('star-chart-mark'),\n `<circle class=\"star-chart-sel\" cx=\"${num(cx)}\" cy=\"${num(cy)}\" r=\"${num(MARK + 8)}\"></circle>`,\n `<path class=\"star-chart-focus\" d=\"${ring(cx, cy, MARK + 8)}\" pathLength=\"12\"></path>`,\n `<text class=\"star-chart-centre-label\" x=\"${num(cx)}\" y=\"${num(poleY)}\" text-anchor=\"middle\">${esc(centre.short)}</text>`,\n '</a>',\n );\n }\n for (const s of stars) {\n const [x, y] = s.position;\n const m = s.magnitude;\n const { tx, anchor } = labelAt(x);\n // Own keys only: records that skipped validation can't reach the prototype\n // (a magnitude of \"constructor\" drew a function's source as a radius).\n const core = Object.hasOwn(CORE, m) ? CORE[m] : CORE[3];\n const glow = Object.hasOwn(GLOW, m) ? GLOW[m] : 0;\n // Its name holds every label it shows (WCAG 2.5.3): on the full chart its\n // magnitude line, elsewhere the stage its tooltip says.\n const said = full ? magLine(m) : stageOf(m);\n const spike = m === 1 ? 16 : 11;\n out.push(linkOf(s, `${s.name}. ${said}. ${s.one_liner}`), `<circle class=\"star-chart-hit\" cx=\"${num(x)}\" cy=\"${num(y)}\" r=\"24\"></circle>`);\n if (glow > 0) out.push(`<circle class=\"star-chart-glow\" cx=\"${num(x)}\" cy=\"${num(y)}\" r=\"${num(glow)}\" fill=\"url(#${glowId})\"></circle>`);\n if (m <= 2) {\n out.push(\n `<line class=\"star-chart-spike\" x1=\"${num(x - spike)}\" y1=\"${num(y)}\" x2=\"${num(x + spike)}\" y2=\"${num(y)}\"></line>`,\n `<line class=\"star-chart-spike\" x1=\"${num(x)}\" y1=\"${num(y - spike)}\" x2=\"${num(x)}\" y2=\"${num(y + spike)}\"></line>`,\n );\n }\n out.push(\n `<circle class=\"star-chart-core\" cx=\"${num(x)}\" cy=\"${num(y)}\" r=\"${num(core)}\"></circle>`,\n `<circle class=\"star-chart-sel\" cx=\"${num(x)}\" cy=\"${num(y)}\" r=\"${num(core + 8)}\"></circle>`,\n `<path class=\"star-chart-focus\" d=\"${ring(x, y, round(core + 8))}\" pathLength=\"12\"></path>`,\n `<text class=\"star-chart-name\" x=\"${num(tx)}\" y=\"${num(y + 4)}\" text-anchor=\"${anchor}\">${esc(s.short)}</text>`,\n );\n // The space keeps \"Orbit\" and \"Mag 1\" two words for assistive tech; SVG doesn't draw it.\n if (full) out.push(` <text class=\"star-chart-mag\" x=\"${num(tx)}\" y=\"${num(y + 18)}\" text-anchor=\"${anchor}\">${esc(magLine(m))}</text>`);\n out.push('</a>');\n }\n out.push('</g></svg>');\n\n // The tooltip: empty and hidden until star-chart.js fills it.\n out.push('<div class=\"star-chart-tip\" aria-hidden=\"true\"><p class=\"star-chart-tip-stage\"></p><p class=\"star-chart-tip-name\"></p><p class=\"star-chart-tip-one\"></p></div>');\n\n const inner = out.join('');\n if (options.frame === false) return inner;\n const cls = ['star-chart', ...String(options.className ?? '').split(/\\s+/).filter(Boolean)].join(' ');\n return `<div class=\"${esc(cls)}\" data-star-chart=\"${mode}\">${inner}</div>`;\n}\n\n/**\n * The magnitude scale to set beside a chart: how far along each star is.\n *\n * @param {import('./star-chart-render').LegendOptions} [options]\n * @returns {string}\n */\nexport function renderMagnitudeLegend(options = {}) {\n const words = { ...WORDS, ...options.words, stages: { ...MAGNITUDES, ...options.words?.stages } };\n const items = Object.keys(MAGNITUDES).map(\n (m) => `<span class=\"star-chart-legend-item\"><span class=\"star-chart-legend-dot\" data-magnitude=\"${m}\"></span>${m} ${esc(words.stages[m])}</span>`,\n );\n const cls = ['star-chart-legend', ...String(options.className ?? '').split(/\\s+/).filter(Boolean)].join(' ');\n return `<div class=\"${esc(cls)}\" role=\"group\" aria-label=\"${esc(words.legend)}\"><span>${esc(words.legendTitle)}</span>${items.join('')}</div>`;\n}\n","/**\n * Starscape v3 — nav-dialog: the phone menu, as a native modal <dialog>.\n *\n * Framework-free and dependency-free. Pairs with components/nav-dialog.css;\n * the markup contract and bindings (plain HTML, Astro, React) are in the\n * package README, \"Nav dialog\". Rebuilt from starscape.biz's phone menu\n * (src/scripts/chrome.ts, initMenu; 2026-10-21) on showModal(), so the page\n * behind is inert, focus stays inside and Escape closes it, all for free.\n *\n * import { initNavDialogs } from '@starlove/ui/nav-dialog';\n * const undo = initNavDialogs(); // every dialog[data-nav-dialog] on the page\n * // …\n * undo();\n *\n * A button with data-nav-dialog-open=\"<the dialog's id>\" opens it. It closes\n * on its [data-nav-dialog-close] button, on Escape, on any link inside it\n * (same-page anchors too: the anchor still scrolls), and when the media query\n * in its data-close-media starts to match (the app's wide layout). Focus goes\n * back to the button that opened it, and that button's aria-expanded is\n * \"true\" while it's open.\n *\n * Idempotent. SSR-safe: without a DOM, or a modal dialog, it does nothing.\n * Returns a teardown function.\n */\n\n/** Whether the browser has a modal dialog. Without one, the page keeps its no-JavaScript menu: the link to the site map. */\nexport function supportsDialog(scope = globalThis) {\n const D = scope.HTMLDialogElement;\n return typeof D === 'function' && typeof D.prototype?.showModal === 'function';\n}\n\nconst enhanced = new WeakMap();\nconst noop = () => {};\n\n/**\n * Enhances every dialog[data-nav-dialog] under root (or root itself) that\n * isn't yet: safe to call again, and on markup added later. Returns a\n * function that undoes what this call did.\n */\nexport function initNavDialogs(root, options = {}) {\n if (typeof document === 'undefined' || !supportsDialog()) return noop;\n root ??= document;\n // The shared \"JavaScript runs\" mark: theme-init sets it before first paint;\n // set here too for apps without it. It shows the menu button and hides the\n // no-JavaScript link (components/nav-dialog.css).\n const html = document.documentElement;\n if (!html.hasAttribute('data-js')) html.setAttribute('data-js', '');\n const found = [...root.querySelectorAll('dialog[data-nav-dialog]')];\n if (root instanceof HTMLDialogElement && root.matches('[data-nav-dialog]')) found.unshift(root);\n const undo = [];\n for (const dialog of found) {\n if (enhanced.has(dialog)) continue;\n const off = enhance(dialog, options);\n enhanced.set(dialog, off);\n undo.push(() => {\n off();\n enhanced.delete(dialog);\n });\n }\n return () => undo.splice(0).forEach((f) => f());\n}\n\nfunction enhance(dialog, options) {\n const id = dialog.id;\n const media = dialog.getAttribute('data-close-media') || options.closeMedia || '';\n /** The button that opened it, which gets focus back. */\n let opener = null;\n /** What had focus before it opened, where the dialog's own close puts focus back. */\n let before = null;\n /** Whether closing returns focus: not when the window widened and the button went with the phone layout. */\n let restore = true;\n let shown = false;\n /** The attributes this script added to each opener, to take off again. */\n const added = new Map();\n\n const openers = () => (id ? [...document.querySelectorAll(`[data-nav-dialog-open=\"${CSS.escape(id)}\"]`)] : []);\n\n function mark(el) {\n if (added.has(el)) return;\n const mine = [];\n for (const [name, value] of [['aria-controls', id], ['aria-haspopup', 'dialog'], ['aria-expanded', 'false']]) {\n if (el.hasAttribute(name)) continue;\n el.setAttribute(name, value);\n mine.push(name);\n }\n added.set(el, mine);\n }\n\n function expand(on) {\n for (const el of openers()) {\n mark(el);\n el.setAttribute('aria-expanded', String(on));\n }\n }\n\n function open(from) {\n if (dialog.open) return;\n const focused = document.activeElement;\n try {\n dialog.showModal();\n } catch {\n return; // not in the document, or open without being modal: leave it be\n }\n opener = from;\n before = focused;\n restore = true;\n shown = true;\n expand(true);\n // Close first, as on starscape.biz; an [autofocus] inside wins (the browser has focused it already).\n if (!dialog.querySelector('[autofocus]')) dialog.querySelector('[data-nav-dialog-close]')?.focus();\n }\n\n /** Closes it from here; the 'close' event covers Escape and an app's own dialog.close(). */\n function shut(back = true) {\n if (!dialog.open) return;\n restore = back;\n dialog.close();\n // Now, not on the 'close' event a task later: a same-page link scrolls and\n // moves focus straight after this click handler, and that must come last.\n settle();\n }\n\n function settle() {\n if (!shown) return;\n shown = false;\n expand(false);\n const back = opener;\n const was = before;\n opener = before = null;\n if (!restore || !back?.isConnected) return;\n // Back to the button. The dialog's own close puts focus back where it was\n // before, which isn't the button when a click didn't focus it (Safari);\n // anywhere else, the app has moved focus on purpose, so it stays there.\n const active = document.activeElement;\n if (!active || active === document.body || active === was || dialog.contains(active)) back.focus({ preventScroll: true });\n }\n\n const onOpenerClick = (e) => {\n const from = e.target instanceof Element ? e.target.closest('[data-nav-dialog-open]') : null;\n if (!from || from.getAttribute('data-nav-dialog-open') !== id || e.defaultPrevented) return;\n e.preventDefault();\n open(from);\n };\n\n const onDialogClick = (e) => {\n const t = e.target instanceof Element ? e.target : null;\n if (!t) return;\n if (t.closest('[data-nav-dialog-close]')) {\n shut();\n return;\n }\n // Any link closes it, same-page anchors included. A modified click opens\n // a new tab or window and leaves this page as it is, menu and all.\n const a = t.closest('a[href]');\n if (a && dialog.contains(a) && !(e.button || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey)) shut();\n };\n\n const onClose = () => settle();\n const onMedia = (m) => {\n if (m.matches) shut(false);\n };\n\n openers().forEach(mark);\n document.addEventListener('click', onOpenerClick);\n dialog.addEventListener('click', onDialogClick);\n dialog.addEventListener('close', onClose);\n const mq = media ? matchMedia(media) : null;\n mq?.addEventListener('change', onMedia);\n\n return () => {\n document.removeEventListener('click', onOpenerClick);\n dialog.removeEventListener('click', onDialogClick);\n dialog.removeEventListener('close', onClose);\n mq?.removeEventListener('change', onMedia);\n if (dialog.open) dialog.close();\n shown = false;\n opener = null;\n for (const [el, mine] of added) {\n mine.forEach((name) => el.removeAttribute(name));\n if (el.hasAttribute('aria-expanded')) el.setAttribute('aria-expanded', 'false');\n }\n added.clear();\n };\n}\n","import {\n useTheme\n} from \"./chunk-7DFA2APW.js\";\n\n// src/useMotion.ts\nimport { useCallback, useEffect, useState } from \"react\";\nimport {\n initPrefs,\n motionMode,\n onPrefs,\n reducedMotion,\n setMotion\n} from \"@starlove/ui/prefs\";\nvar read = () => ({ mode: motionMode(), resolved: reducedMotion() ? \"reduce\" : \"full\" });\nfunction useMotion(options) {\n const [state, setState] = useState(read);\n useEffect(() => {\n const undo = initPrefs(options);\n const update = () => setState((s) => {\n const next = read();\n return next.mode === s.mode && next.resolved === s.resolved ? s : next;\n });\n const off = onPrefs(update);\n update();\n return () => {\n off();\n undo();\n };\n }, []);\n const setMode = useCallback((m) => setMotion(m), []);\n return { mode: state.mode, resolved: state.resolved, setMode };\n}\n\n// src/useScrollAware.ts\nimport { useEffect as useEffect2 } from \"react\";\nimport { setupScrollAware } from \"@starlove/ui/scroll-aware\";\nvar isRef = (t) => typeof t === \"object\" && t !== null && \"current\" in t;\nfunction useScrollAware({\n threshold = 4,\n className = \"is-scrolled\",\n target,\n attribute\n} = {}) {\n useEffect2(() => {\n const el = isRef(target) ? target.current : target;\n if (target !== void 0 && !el) return;\n return setupScrollAware({ threshold, className, attribute, ...el ? { target: el } : {} });\n }, [threshold, className, attribute, target]);\n}\n\n// src/useTooltipPlacement.ts\nimport { useEffect as useEffect3, useRef } from \"react\";\nimport {\n setupTooltipPlacement\n} from \"@starlove/ui/tooltip-placement\";\nfunction useTooltipPlacement(options) {\n const insetTop = options?.insetTop;\n const latest = useRef(insetTop);\n latest.current = insetTop;\n const isFn = typeof insetTop === \"function\";\n useEffect3(() => {\n const inset = isFn ? (el) => {\n const f = latest.current;\n return typeof f === \"function\" ? f(el) : f ?? 0;\n } : latest.current;\n return setupTooltipPlacement({\n verticalGap: options?.verticalGap,\n horizontalGap: options?.horizontalGap,\n header: options?.header,\n ...inset === void 0 ? {} : { insetTop: inset }\n });\n }, [options?.verticalGap, options?.horizontalGap, options?.header, isFn ? \"function\" : insetTop]);\n}\n\n// src/useCopy.ts\nimport { useEffect as useEffect4, useRef as useRef2 } from \"react\";\nimport { initCopy } from \"@starlove/ui/copy\";\nfunction useCopy(ref, options) {\n const opts = useRef2(options);\n useEffect4(() => {\n if (!ref.current) return;\n return initCopy(ref.current, opts.current);\n }, [ref]);\n}\n\n// src/useDisclosure.ts\nimport { useCallback as useCallback2, useId, useMemo, useState as useState2 } from \"react\";\nfunction useDisclosure(initialOpen = false) {\n const [isOpen, setOpen] = useState2(initialOpen);\n const id = useId();\n const open = useCallback2(() => setOpen(true), []);\n const close = useCallback2(() => setOpen(false), []);\n const toggle = useCallback2(() => setOpen((o) => !o), []);\n const triggerProps = useMemo(() => ({\n id: `${id}-trigger`,\n \"aria-expanded\": isOpen,\n \"aria-controls\": id\n }), [id, isOpen]);\n const surfaceProps = useMemo(() => ({\n id,\n \"aria-hidden\": !isOpen\n }), [id, isOpen]);\n return { isOpen, open, close, toggle, triggerProps, surfaceProps };\n}\n\n// src/useStepper.ts\nimport { useCallback as useCallback3, useMemo as useMemo2, useState as useState3 } from \"react\";\nfunction useStepper(total, initial = 0) {\n const max = Math.max(0, total - 1);\n const clamp = useCallback3(\n (n) => Math.min(max, Math.max(0, n)),\n [max]\n );\n const [current, setCurrent2] = useState3(() => clamp(initial));\n const next = useCallback3(() => setCurrent2((c) => clamp(c + 1)), [clamp]);\n const prev = useCallback3(() => setCurrent2((c) => clamp(c - 1)), [clamp]);\n const goTo = useCallback3((index) => setCurrent2(clamp(index)), [clamp]);\n const stateOf = useCallback3(\n (index) => index < current ? \"done\" : index === current ? \"current\" : \"upcoming\",\n [current]\n );\n return useMemo2(\n () => ({\n current,\n total,\n isFirst: current <= 0,\n isLast: current >= max,\n next,\n prev,\n goTo,\n stateOf\n }),\n [current, total, max, next, prev, goTo, stateOf]\n );\n}\n\n// src/useContextMenu.ts\nimport {\n useCallback as useCallback4,\n useMemo as useMemo3,\n useState as useState4\n} from \"react\";\nfunction useContextMenu({\n size = { width: 192, height: 220 }\n} = {}) {\n const [isOpen, setOpen] = useState4(false);\n const [position, setPosition] = useState4({ x: 0, y: 0 });\n const open = useCallback4((x, y) => {\n setPosition({ x, y });\n setOpen(true);\n }, []);\n const close = useCallback4(() => setOpen(false), []);\n const onContextMenu = useCallback4(\n (event) => {\n event.preventDefault();\n open(event.clientX, event.clientY);\n },\n [open]\n );\n const menuProps = useMemo3(() => {\n const vw = typeof window === \"undefined\" ? size.width : window.innerWidth;\n const vh = typeof window === \"undefined\" ? size.height : window.innerHeight;\n const x = Math.max(8, Math.min(position.x, vw - size.width - 8));\n const y = Math.max(8, Math.min(position.y, vh - size.height - 8));\n return { style: { left: x, top: y } };\n }, [position, size.width, size.height]);\n return useMemo3(\n () => ({ isOpen, position, onContextMenu, open, close, menuProps }),\n [isOpen, position, onContextMenu, open, close, menuProps]\n );\n}\n\n// src/useClickOutside.ts\nimport { useEffect as useEffect5 } from \"react\";\nfunction useClickOutside(ref, handler, { enabled = true, event = \"mousedown\" } = {}) {\n useEffect5(() => {\n if (!enabled || typeof document === \"undefined\") return;\n const onDoc = (e) => {\n const node = ref.current;\n if (!node) return;\n if (node.contains(e.target)) return;\n handler(e);\n };\n document.addEventListener(event, onDoc);\n return () => document.removeEventListener(event, onDoc);\n }, [ref, handler, enabled, event]);\n}\n\n// src/useEscapeKey.ts\nimport { useEffect as useEffect6 } from \"react\";\nfunction useEscapeKey(handler, { enabled = true } = {}) {\n useEffect6(() => {\n if (!enabled || typeof document === \"undefined\") return;\n const onKey = (e) => {\n if (e.key === \"Escape\") handler(e);\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [handler, enabled]);\n}\n\n// src/Starscape.tsx\nimport { useEffect as useEffect7, useRef as useRef3 } from \"react\";\nimport {\n startStarscape\n} from \"@starlove/ui/starscape\";\nimport { jsx } from \"react/jsx-runtime\";\nfunction Starscape(props = {}) {\n const ref = useRef3(null);\n useEffect7(() => {\n if (!ref.current) return;\n const handle = startStarscape({ ...props, mountTo: ref.current });\n return () => handle.stop();\n }, []);\n return /* @__PURE__ */ jsx(\"div\", { ref, className: \"grain\", \"aria-hidden\": \"true\", children: /* @__PURE__ */ jsx(\"div\", { className: \"milky-way\", \"aria-hidden\": \"true\" }) });\n}\n\n// src/components/cx.ts\nfunction cx(...parts) {\n return parts.filter(Boolean).join(\" \");\n}\n\n// src/LoadingScreen.tsx\nimport { jsx as jsx2, jsxs } from \"react/jsx-runtime\";\nfunction LoadingScreen({\n label = \"Loading\\u2026\",\n logo,\n logoAlt = \"\",\n hiding = false,\n className,\n ...rest\n}) {\n return /* @__PURE__ */ jsxs(\n \"div\",\n {\n role: \"status\",\n \"aria-live\": \"polite\",\n className: cx(\"loader\", hiding && \"is-hiding\", className),\n ...rest,\n children: [\n logo ? /* @__PURE__ */ jsx2(\"img\", { className: \"loader__logo\", src: logo, alt: logoAlt, \"aria-hidden\": !logoAlt }) : /* @__PURE__ */ jsx2(\"span\", { className: \"loader__star\", \"aria-hidden\": \"true\" }),\n label != null && /* @__PURE__ */ jsx2(\"p\", { className: \"loader__label\", children: label })\n ]\n }\n );\n}\n\n// src/components/Button.tsx\nimport * as React from \"react\";\nimport { jsx as jsx3 } from \"react/jsx-runtime\";\nvar Button = React.forwardRef(\n function Button2({ variant = \"primary\", type = \"button\", ...rest }, ref) {\n return /* @__PURE__ */ jsx3(\n \"button\",\n {\n ref,\n type,\n \"data-variant\": variant === \"primary\" ? void 0 : variant,\n ...rest\n }\n );\n }\n);\n\n// src/components/Card.tsx\nimport * as React2 from \"react\";\nimport { jsx as jsx4 } from \"react/jsx-runtime\";\nvar Card = React2.forwardRef(function Card2({ variant, selected, as: Tag = \"article\", className, ...rest }, ref) {\n return /* @__PURE__ */ jsx4(\n Tag,\n {\n ref,\n className: cx(\"card\", className),\n \"data-variant\": variant,\n \"data-selected\": selected ? \"\" : void 0,\n ...rest\n }\n );\n});\n\n// src/components/Badge.tsx\nimport * as React3 from \"react\";\nimport { jsx as jsx5 } from \"react/jsx-runtime\";\nvar Badge = React3.forwardRef(\n function Badge2({ className, ...rest }, ref) {\n return /* @__PURE__ */ jsx5(\"span\", { ref, className: cx(\"badge\", className), ...rest });\n }\n);\nvar Chip = React3.forwardRef(\n function Chip2({ tone, variant, interactive, className, ...rest }, ref) {\n return /* @__PURE__ */ jsx5(\n \"span\",\n {\n ref,\n className: cx(\"chip\", className),\n \"data-tone\": tone,\n \"data-variant\": variant,\n \"data-interactive\": interactive ? \"\" : void 0,\n ...rest\n }\n );\n }\n);\nvar Dot = React3.forwardRef(\n function Dot2({ live, tone, count, className, ...rest }, ref) {\n return /* @__PURE__ */ jsx5(\n \"span\",\n {\n ref,\n className: cx(\"dot\", className),\n \"data-live\": live ? \"\" : void 0,\n \"data-tone\": tone,\n \"data-count\": count ? \"\" : void 0,\n ...rest\n }\n );\n }\n);\n\n// src/components/EpicAccordion.tsx\nimport * as React4 from \"react\";\nimport { jsx as jsx6, jsxs as jsxs2 } from \"react/jsx-runtime\";\nvar EpicAccordion = React4.forwardRef(\n function EpicAccordion2({\n title,\n count,\n defaultOpen = false,\n open: openProp,\n onToggle,\n showLabel = \"Show\",\n hideLabel = \"Hide\",\n className,\n children,\n ...rest\n }, ref) {\n const [internalOpen, setInternalOpen] = React4.useState(defaultOpen);\n const isControlled = openProp != null;\n const open = isControlled ? openProp : internalOpen;\n const bodyId = React4.useId();\n const handleToggle = () => {\n if (!isControlled) setInternalOpen((o) => !o);\n onToggle?.(!open);\n };\n return /* @__PURE__ */ jsxs2(\n \"section\",\n {\n ref,\n className: cx(\"epic-accordion\", className),\n \"data-open\": open || void 0,\n ...rest,\n children: [\n /* @__PURE__ */ jsxs2(\n \"button\",\n {\n type: \"button\",\n className: \"epic-accordion-toggle\",\n \"aria-expanded\": open,\n \"aria-controls\": bodyId,\n onClick: handleToggle,\n children: [\n /* @__PURE__ */ jsx6(\"svg\", { className: \"epic-accordion-chevron\", viewBox: \"0 0 24 24\", \"aria-hidden\": true, children: /* @__PURE__ */ jsx6(\n \"path\",\n {\n d: \"M9 6l6 6-6 6\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: \"2.5\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n }\n ) }),\n /* @__PURE__ */ jsx6(\"span\", { className: \"epic-accordion-title\", children: title }),\n count != null && /* @__PURE__ */ jsx6(\"span\", { className: \"epic-accordion-count\", children: count }),\n /* @__PURE__ */ jsx6(\"span\", { className: \"epic-accordion-state\", children: open ? hideLabel : showLabel })\n ]\n }\n ),\n open && /* @__PURE__ */ jsx6(\"div\", { className: \"epic-accordion-body\", id: bodyId, children })\n ]\n }\n );\n }\n);\n\n// src/components/Tabs.tsx\nimport * as React5 from \"react\";\nimport { jsx as jsx7 } from \"react/jsx-runtime\";\nvar Tabs = React5.forwardRef(function Tabs2({ variant, orientation, className, ...rest }, ref) {\n return /* @__PURE__ */ jsx7(\n \"div\",\n {\n ref,\n role: \"tablist\",\n className: cx(\"tabs\", className),\n \"data-variant\": variant === \"pill\" ? void 0 : variant,\n \"data-orientation\": orientation === \"horizontal\" ? void 0 : orientation,\n ...rest\n }\n );\n});\nvar Tab = React5.forwardRef(function Tab2({ selected, className, type = \"button\", ...rest }, ref) {\n return /* @__PURE__ */ jsx7(\n \"button\",\n {\n ref,\n type,\n role: \"tab\",\n \"aria-selected\": selected,\n className: cx(\"tab\", className),\n ...rest\n }\n );\n});\n\n// src/components/Modal.tsx\nimport * as React6 from \"react\";\nimport { Fragment, jsx as jsx8, jsxs as jsxs3 } from \"react/jsx-runtime\";\nvar Modal = React6.forwardRef(\n function Modal2({ open, onClose, title, closeOnBackdrop = true, className, children, ...rest }, ref) {\n const dialogRef = React6.useRef(null);\n React6.useImperativeHandle(ref, () => dialogRef.current);\n const labelId = React6.useId();\n useEscapeKey(onClose, { enabled: open });\n useClickOutside(dialogRef, onClose, { enabled: open && closeOnBackdrop });\n return /* @__PURE__ */ jsxs3(Fragment, { children: [\n /* @__PURE__ */ jsx8(\"div\", { className: cx(\"modal-backdrop\", open && \"is-visible\"), \"aria-hidden\": \"true\" }),\n /* @__PURE__ */ jsxs3(\n \"div\",\n {\n ref: dialogRef,\n role: \"dialog\",\n \"aria-modal\": \"true\",\n \"aria-labelledby\": title ? labelId : void 0,\n \"aria-hidden\": !open,\n className: cx(\"modal\", open && \"is-open\", className),\n ...rest,\n children: [\n title != null && /* @__PURE__ */ jsxs3(\"div\", { className: \"modal-header\", children: [\n /* @__PURE__ */ jsx8(\"h2\", { id: labelId, className: \"modal-title\", children: title }),\n /* @__PURE__ */ jsx8(\n \"button\",\n {\n type: \"button\",\n className: \"modal-close\",\n \"aria-label\": \"Close\",\n onClick: onClose,\n children: \"\\xD7\"\n }\n )\n ] }),\n children\n ]\n }\n )\n ] });\n }\n);\n\n// src/components/forms.tsx\nimport * as React7 from \"react\";\nimport { jsx as jsx9, jsxs as jsxs4 } from \"react/jsx-runtime\";\nvar Input = React7.forwardRef(\n function Input2(props, ref) {\n return /* @__PURE__ */ jsx9(\"input\", { ref, ...props });\n }\n);\nvar Textarea = React7.forwardRef(\n function Textarea2(props, ref) {\n return /* @__PURE__ */ jsx9(\"textarea\", { ref, ...props });\n }\n);\nvar Select = React7.forwardRef(\n function Select2({ chevron = true, className, ...rest }, ref) {\n return /* @__PURE__ */ jsx9(\n \"select\",\n {\n ref,\n className: cx(chevron && \"select-chevron-field\", className),\n ...rest\n }\n );\n }\n);\nvar Label = React7.forwardRef(\n function Label2(props, ref) {\n return /* @__PURE__ */ jsx9(\"label\", { ref, ...props });\n }\n);\nvar FormRow = React7.forwardRef(function FormRow2({ className, ...rest }, ref) {\n return /* @__PURE__ */ jsx9(\"div\", { ref, className: cx(\"form-row\", className), ...rest });\n});\nvar FormHelp = React7.forwardRef(function FormHelp2({ className, ...rest }, ref) {\n return /* @__PURE__ */ jsx9(\"p\", { ref, className: cx(\"form-help\", className), ...rest });\n});\nvar FormError = React7.forwardRef(function FormError2({ className, role = \"alert\", ...rest }, ref) {\n return /* @__PURE__ */ jsx9(\"p\", { ref, role, className: cx(\"form-error\", className), ...rest });\n});\nvar SearchInput = React7.forwardRef(\n function SearchInput2({ onClear, clearLabel = \"Clear\", className, value, type = \"search\", ...rest }, ref) {\n const hasValue = value != null && value !== \"\";\n return /* @__PURE__ */ jsxs4(\"div\", { className: cx(\"input-search\", className), children: [\n /* @__PURE__ */ jsx9(\"input\", { ref, type, value, ...rest }),\n onClear && /* @__PURE__ */ jsx9(\n \"button\",\n {\n type: \"button\",\n className: \"input-search-clear\",\n \"aria-label\": clearLabel,\n \"data-has-value\": hasValue ? \"true\" : void 0,\n onClick: onClear,\n children: \"\\xD7\"\n }\n )\n ] });\n }\n);\n\n// src/components/Switch.tsx\nimport * as React8 from \"react\";\nimport { jsx as jsx10, jsxs as jsxs5 } from \"react/jsx-runtime\";\nvar Switch = React8.forwardRef(\n function Switch2({ label, className, ...rest }, ref) {\n return /* @__PURE__ */ jsxs5(\"label\", { className: cx(\"switch\", className), children: [\n /* @__PURE__ */ jsx10(\"input\", { ref, type: \"checkbox\", ...rest }),\n /* @__PURE__ */ jsx10(\"span\", { className: \"switch-track\", \"aria-hidden\": \"true\" }),\n label != null && /* @__PURE__ */ jsx10(\"span\", { className: \"switch-label\", children: label })\n ] });\n }\n);\n\n// src/components/Checkbox.tsx\nimport * as React9 from \"react\";\nimport { jsx as jsx11, jsxs as jsxs6 } from \"react/jsx-runtime\";\nvar Checkbox = React9.forwardRef(\n function Checkbox2({ label, className, ...rest }, ref) {\n if (label == null) {\n return /* @__PURE__ */ jsx11(\"input\", { ref, type: \"checkbox\", className, ...rest });\n }\n return /* @__PURE__ */ jsxs6(\"label\", { className: cx(\"check\", className), children: [\n /* @__PURE__ */ jsx11(\"input\", { ref, type: \"checkbox\", ...rest }),\n /* @__PURE__ */ jsx11(\"span\", { className: \"check-label\", children: label })\n ] });\n }\n);\nvar Radio = React9.forwardRef(\n function Radio2({ label, className, ...rest }, ref) {\n if (label == null) {\n return /* @__PURE__ */ jsx11(\"input\", { ref, type: \"radio\", className, ...rest });\n }\n return /* @__PURE__ */ jsxs6(\"label\", { className: cx(\"radio\", className), children: [\n /* @__PURE__ */ jsx11(\"input\", { ref, type: \"radio\", ...rest }),\n /* @__PURE__ */ jsx11(\"span\", { className: \"radio-label\", children: label })\n ] });\n }\n);\n\n// src/components/Slider.tsx\nimport * as React10 from \"react\";\nimport { jsx as jsx12, jsxs as jsxs7 } from \"react/jsx-runtime\";\nfunction fillPercent(el) {\n const min = Number(el.min || 0);\n const max = Number(el.max || 100);\n return max > min ? (Number(el.value) - min) / (max - min) * 100 : 0;\n}\nvar Slider = React10.forwardRef(\n function Slider2({ size = \"md\", label, valueLabel, className, disabled, style, onInput, min, max, ...rest }, ref) {\n const raw = rest.value ?? rest.defaultValue;\n const lo = Number(min ?? 0);\n const hi = Number(max ?? 100);\n const pct = raw != null && hi > lo ? (Number(raw) - lo) / (hi - lo) * 100 : void 0;\n const mergedStyle = pct != null ? { ...style, \"--value\": pct } : style;\n const handleInput = (e) => {\n e.currentTarget.style.setProperty(\"--value\", String(fillPercent(e.currentTarget)));\n onInput?.(e);\n };\n const hasHead = label != null || valueLabel != null;\n const input = /* @__PURE__ */ jsx12(\n \"input\",\n {\n ref,\n type: \"range\",\n className: hasHead ? void 0 : cx(\"slider\", className),\n disabled,\n min,\n max,\n style: mergedStyle,\n onInput: handleInput,\n ...rest\n }\n );\n if (!hasHead) return input;\n return /* @__PURE__ */ jsxs7(\n \"div\",\n {\n className: cx(\"slider\", className),\n \"data-size\": size === \"md\" ? void 0 : size,\n \"data-disabled\": disabled ? \"\" : void 0,\n children: [\n /* @__PURE__ */ jsxs7(\"span\", { className: \"slider-head\", children: [\n /* @__PURE__ */ jsx12(\"b\", { children: label }),\n /* @__PURE__ */ jsx12(\"b\", { children: valueLabel })\n ] }),\n input\n ]\n }\n );\n }\n);\n\n// src/components/NumberField.tsx\nimport * as React11 from \"react\";\nimport { jsx as jsx13, jsxs as jsxs8 } from \"react/jsx-runtime\";\nvar NumberField = React11.forwardRef(\n function NumberField2({\n value,\n onChange,\n min,\n max,\n step = 1,\n size = \"md\",\n disabled,\n className,\n id,\n name,\n ...rest\n }, ref) {\n const clamp = (n) => Math.min(max ?? Infinity, Math.max(min ?? -Infinity, n));\n const set = (n) => !disabled && onChange(clamp(n));\n return /* @__PURE__ */ jsxs8(\n \"div\",\n {\n className: cx(\"number-field\", className),\n \"data-size\": size === \"md\" ? void 0 : size,\n children: [\n /* @__PURE__ */ jsx13(\n \"button\",\n {\n type: \"button\",\n className: \"number-step\",\n \"data-dir\": \"down\",\n \"aria-label\": \"Decrease\",\n disabled: disabled || min != null && value <= min,\n onClick: () => set(value - step),\n children: \"\\u2212\"\n }\n ),\n /* @__PURE__ */ jsx13(\n \"input\",\n {\n ref,\n type: \"text\",\n inputMode: \"numeric\",\n id,\n name,\n value,\n disabled,\n onChange: (e) => {\n const n = Number(e.target.value);\n if (!Number.isNaN(n)) set(n);\n },\n ...rest\n }\n ),\n /* @__PURE__ */ jsx13(\n \"button\",\n {\n type: \"button\",\n className: \"number-step\",\n \"data-dir\": \"up\",\n \"aria-label\": \"Increase\",\n disabled: disabled || max != null && value >= max,\n onClick: () => set(value + step),\n children: \"+\"\n }\n )\n ]\n }\n );\n }\n);\n\n// src/components/Rating.tsx\nimport * as React12 from \"react\";\nimport { jsx as jsx14, jsxs as jsxs9 } from \"react/jsx-runtime\";\nfunction Rating({\n value,\n onChange,\n max = 5,\n readOnly,\n name,\n className,\n \"aria-label\": ariaLabel = \"Rating\"\n}) {\n const interactive = !!onChange && !readOnly;\n const groupName = React12.useId();\n if (!interactive) {\n return /* @__PURE__ */ jsx14(\n \"div\",\n {\n className: cx(\"rating\", className),\n \"data-readonly\": \"\",\n \"data-value\": value,\n role: \"img\",\n \"aria-label\": `${value} of ${max}`\n }\n );\n }\n const stars = Array.from({ length: max }, (_, i) => max - i);\n return /* @__PURE__ */ jsx14(\"fieldset\", { className: cx(\"rating\", className), \"aria-label\": ariaLabel, children: stars.map((star) => {\n const id = `${groupName}-${star}`;\n return /* @__PURE__ */ jsxs9(React12.Fragment, { children: [\n /* @__PURE__ */ jsx14(\n \"input\",\n {\n type: \"radio\",\n name: name ?? groupName,\n id,\n value: star,\n checked: value === star,\n onChange: () => onChange(star)\n }\n ),\n /* @__PURE__ */ jsxs9(\"label\", { htmlFor: id, title: `${star}`, children: [\n star,\n \" \",\n star === 1 ? \"star\" : \"stars\"\n ] })\n ] }, star);\n }) });\n}\n\n// src/components/TagInput.tsx\nimport * as React13 from \"react\";\nimport { jsx as jsx15, jsxs as jsxs10 } from \"react/jsx-runtime\";\nfunction TagInput({\n tags,\n onAdd,\n onRemove,\n placeholder = \"Add tag\\u2026\",\n commitKeys = [\"Enter\", \",\"],\n className,\n inputProps\n}) {\n const [draft, setDraft] = React13.useState(\"\");\n function handleKeyDown(e) {\n if (commitKeys.includes(e.key)) {\n e.preventDefault();\n const value = draft.trim();\n if (value) {\n onAdd(value);\n setDraft(\"\");\n }\n } else if (e.key === \"Backspace\" && draft === \"\" && tags.length) {\n onRemove(tags.length - 1);\n }\n }\n return /* @__PURE__ */ jsxs10(\"div\", { className: cx(\"tag-input\", className), children: [\n tags.map((tag, i) => /* @__PURE__ */ jsxs10(\"span\", { className: \"tag\", children: [\n tag,\n /* @__PURE__ */ jsx15(\n \"button\",\n {\n type: \"button\",\n className: \"tag-remove\",\n \"aria-label\": `Remove ${tag}`,\n onClick: () => onRemove(i),\n children: \"\\xD7\"\n }\n )\n ] }, `${tag}-${i}`)),\n /* @__PURE__ */ jsx15(\n \"input\",\n {\n type: \"text\",\n placeholder,\n \"aria-label\": \"Add tag\",\n value: draft,\n onChange: (e) => setDraft(e.target.value),\n onKeyDown: handleKeyDown,\n ...inputProps\n }\n )\n ] });\n}\n\n// src/components/primitives.tsx\nimport * as React14 from \"react\";\nimport { jsx as jsx16, jsxs as jsxs11 } from \"react/jsx-runtime\";\nvar Avatar = React14.forwardRef(\n function Avatar2({ size = \"md\", color, src, alt = \"\", className, children, ...rest }, ref) {\n return /* @__PURE__ */ jsx16(\n \"div\",\n {\n ref,\n className: cx(\"avatar\", className),\n \"data-size\": size === \"md\" ? void 0 : size,\n \"data-color\": color,\n ...rest,\n children: src ? /* @__PURE__ */ jsx16(\"img\", { src, alt }) : children\n }\n );\n }\n);\nvar AvatarStack = React14.forwardRef(function AvatarStack2({ className, ...rest }, ref) {\n return /* @__PURE__ */ jsx16(\"div\", { ref, className: cx(\"avatar-stack\", className), ...rest });\n});\nvar Separator = React14.forwardRef(\n function Separator2({ orientation = \"horizontal\", className, ...rest }, ref) {\n return /* @__PURE__ */ jsx16(\n \"div\",\n {\n ref,\n role: \"separator\",\n \"aria-orientation\": orientation,\n className: cx(\"separator\", className),\n \"data-orientation\": orientation === \"horizontal\" ? void 0 : orientation,\n ...rest\n }\n );\n }\n);\nvar Kbd = React14.forwardRef(function Kbd2({ className, ...rest }, ref) {\n return /* @__PURE__ */ jsx16(\"kbd\", { ref, className: cx(\"kbd\", className), ...rest });\n});\nvar Skeleton = React14.forwardRef(\n function Skeleton2({ shape = \"rect\", className, ...rest }, ref) {\n return /* @__PURE__ */ jsx16(\n \"div\",\n {\n ref,\n \"aria-hidden\": \"true\",\n className: cx(\"skeleton\", `skeleton-${shape}`, className),\n ...rest\n }\n );\n }\n);\nvar Progress = React14.forwardRef(\n function Progress2({ value, indeterminate, size = \"md\", className, style, ...rest }, ref) {\n return /* @__PURE__ */ jsx16(\n \"div\",\n {\n ref,\n role: \"progressbar\",\n \"aria-valuenow\": indeterminate ? void 0 : value,\n \"aria-valuemin\": 0,\n \"aria-valuemax\": 100,\n className: cx(\"progress\", className),\n \"data-indeterminate\": indeterminate ? \"\" : void 0,\n \"data-size\": size === \"md\" ? void 0 : size,\n ...rest,\n children: !indeterminate && /* @__PURE__ */ jsx16(\n \"div\",\n {\n className: \"progress-bar\",\n style: { [\"--value\"]: `${value ?? 0}%`, ...style }\n }\n )\n }\n );\n }\n);\nvar Spinner = React14.forwardRef(\n function Spinner2({ label = \"Loading\", className, ...rest }, ref) {\n return /* @__PURE__ */ jsx16(\n \"span\",\n {\n ref,\n role: \"status\",\n \"aria-label\": label,\n className: cx(\"spinner\", className),\n ...rest\n }\n );\n }\n);\nvar List = React14.forwardRef(function List2({ variant, className, ...rest }, ref) {\n const Tag = variant === \"numbered\" ? \"ol\" : \"ul\";\n return /* @__PURE__ */ jsx16(\n Tag,\n {\n ref,\n className: cx(variant && `list-${variant}`, className),\n ...rest\n }\n );\n});\nvar DescriptionList = React14.forwardRef(function DescriptionList2({ layout = \"inline\", className, ...rest }, ref) {\n return /* @__PURE__ */ jsx16(\n \"dl\",\n {\n ref,\n className: cx(\"description-list\", className),\n \"data-layout\": layout === \"inline\" ? void 0 : layout,\n ...rest\n }\n );\n});\nvar ControlRow = React14.forwardRef(\n function ControlRow2({ label, value, stacked, className, children, ...rest }, ref) {\n return /* @__PURE__ */ jsxs11(\n \"div\",\n {\n ref,\n className: cx(\"control-row\", className),\n \"data-stacked\": stacked ? \"\" : void 0,\n ...rest,\n children: [\n label != null && /* @__PURE__ */ jsx16(\"span\", { className: \"control-label\", children: label }),\n children,\n value != null && /* @__PURE__ */ jsx16(\"span\", { className: \"control-value\", children: value })\n ]\n }\n );\n }\n);\n\n// src/components/Alert.tsx\nimport * as React15 from \"react\";\nimport { jsx as jsx17, jsxs as jsxs12 } from \"react/jsx-runtime\";\nvar Alert = React15.forwardRef(function Alert2({ tone, banner, icon, title, onClose, closeLabel = \"Dismiss\", className, children, ...rest }, ref) {\n return /* @__PURE__ */ jsxs12(\n \"div\",\n {\n ref,\n role: \"status\",\n className: cx(\"alert\", className),\n \"data-tone\": tone,\n \"data-variant\": banner ? \"banner\" : void 0,\n ...rest,\n children: [\n icon != null && /* @__PURE__ */ jsx17(\"span\", { className: \"alert-icon\", children: icon }),\n /* @__PURE__ */ jsxs12(\"div\", { className: \"alert-body\", children: [\n title != null && /* @__PURE__ */ jsx17(\"strong\", { className: \"alert-title\", children: title }),\n children != null && /* @__PURE__ */ jsx17(\"p\", { className: \"alert-message\", children })\n ] }),\n onClose && /* @__PURE__ */ jsx17(\n \"button\",\n {\n type: \"button\",\n className: \"alert-close\",\n \"aria-label\": closeLabel,\n onClick: onClose,\n children: \"\\xD7\"\n }\n )\n ]\n }\n );\n});\n\n// src/components/EmptyState.tsx\nimport * as React16 from \"react\";\nimport { jsx as jsx18, jsxs as jsxs13 } from \"react/jsx-runtime\";\nvar EmptyState = React16.forwardRef(\n function EmptyState2({ icon, title, actions, size = \"md\", className, children, ...rest }, ref) {\n return /* @__PURE__ */ jsxs13(\n \"div\",\n {\n ref,\n className: cx(\"empty-state\", className),\n \"data-size\": size === \"md\" ? void 0 : size,\n ...rest,\n children: [\n icon != null && /* @__PURE__ */ jsx18(\"div\", { className: \"empty-state-icon\", \"aria-hidden\": \"true\", children: icon }),\n title != null && /* @__PURE__ */ jsx18(\"h3\", { className: \"empty-state-title\", children: title }),\n children != null && /* @__PURE__ */ jsx18(\"p\", { className: \"empty-state-body\", children }),\n actions != null && /* @__PURE__ */ jsx18(\"div\", { className: \"empty-state-actions\", children: actions })\n ]\n }\n );\n }\n);\n\n// src/components/CodeBlock.tsx\nimport * as React17 from \"react\";\nimport { jsx as jsx19, jsxs as jsxs14 } from \"react/jsx-runtime\";\nvar CodeBlock = React17.forwardRef(\n function CodeBlock2({ name, code, numbered, wrap, onCopy, copyLabel = \"Copy\", copiedLabel, className, children, ...rest }, forwarded) {\n const local = React17.useRef(null);\n const setRef = React17.useCallback(\n (node) => {\n local.current = node;\n if (typeof forwarded === \"function\") forwarded(node);\n else if (forwarded) forwarded.current = node;\n },\n [forwarded]\n );\n const codeId = React17.useId();\n const builtIn = !onCopy && code != null;\n useCopy(local, copiedLabel ? { labels: { copied: copiedLabel } } : void 0);\n const showHeader = name != null || onCopy || code != null;\n return /* @__PURE__ */ jsxs14(\"figure\", { ref: setRef, className: cx(\"code-block\", className), ...rest, children: [\n showHeader && /* @__PURE__ */ jsxs14(\"figcaption\", { className: \"code-block-head\", children: [\n name != null && /* @__PURE__ */ jsx19(\"span\", { className: \"code-block-name\", children: name }),\n onCopy ? /* @__PURE__ */ jsx19(\"button\", { type: \"button\", className: \"code-block-copy\", onClick: onCopy, children: copyLabel }) : builtIn ? /* @__PURE__ */ jsxs14(\"button\", { type: \"button\", className: \"code-block-copy\", \"data-copy-target\": `#${codeId}`, children: [\n copyLabel,\n typeof name === \"string\" && /* @__PURE__ */ jsx19(\"span\", { className: \"visually-hidden\", children: ` ${name}` })\n ] }) : null\n ] }),\n /* @__PURE__ */ jsx19(\n \"pre\",\n {\n \"data-numbered\": numbered ? \"\" : void 0,\n \"data-wrap\": wrap ? \"\" : void 0,\n children: /* @__PURE__ */ jsx19(\"code\", { id: builtIn ? codeId : void 0, children: code ?? children })\n }\n )\n ] });\n }\n);\n\n// src/components/Breadcrumb.tsx\nimport * as React18 from \"react\";\nimport { jsx as jsx20 } from \"react/jsx-runtime\";\nvar Breadcrumb = React18.forwardRef(\n function Breadcrumb2({ items, className, ...rest }, ref) {\n return /* @__PURE__ */ jsx20(\n \"nav\",\n {\n ref,\n \"aria-label\": \"Breadcrumb\",\n className: cx(\"breadcrumb\", className),\n ...rest,\n children: /* @__PURE__ */ jsx20(\"ol\", { children: items.map((item, i) => {\n const current = item.current ?? i === items.length - 1;\n return /* @__PURE__ */ jsx20(\"li\", { children: current || !item.href ? /* @__PURE__ */ jsx20(\"span\", { \"aria-current\": current ? \"page\" : void 0, children: item.label }) : /* @__PURE__ */ jsx20(\"a\", { href: item.href, children: item.label }) }, i);\n }) })\n }\n );\n }\n);\n\n// src/components/Pagination.tsx\nimport * as React19 from \"react\";\nimport { jsx as jsx21, jsxs as jsxs15 } from \"react/jsx-runtime\";\nfunction buildRange(page, count, siblings) {\n const range = [];\n const first = 1;\n const last = count;\n const start = Math.max(first, page - siblings);\n const end = Math.min(last, page + siblings);\n range.push(first);\n if (start > first + 1) range.push(\"gap\");\n for (let p = start; p <= end; p++) {\n if (p !== first && p !== last) range.push(p);\n }\n if (end < last - 1) range.push(\"gap\");\n if (last !== first) range.push(last);\n return range;\n}\nvar Pagination = React19.forwardRef(\n function Pagination2({ page, count, onChange, siblings = 1, size = \"md\", className, ...rest }, ref) {\n const entries = buildRange(page, count, siblings);\n return /* @__PURE__ */ jsxs15(\n \"nav\",\n {\n ref,\n \"aria-label\": \"Pagination\",\n className: cx(\"pagination\", className),\n \"data-size\": size === \"md\" ? void 0 : size,\n ...rest,\n children: [\n /* @__PURE__ */ jsx21(\n \"button\",\n {\n type: \"button\",\n className: \"pagination-item\",\n \"data-nav\": \"\",\n disabled: page <= 1,\n \"aria-label\": \"Previous page\",\n onClick: () => onChange(page - 1),\n children: \"\\u2039 Prev\"\n }\n ),\n entries.map(\n (entry, i) => entry === \"gap\" ? /* @__PURE__ */ jsx21(\"span\", { className: \"pagination-gap\", children: \"\\u2026\" }, `gap-${i}`) : /* @__PURE__ */ jsx21(\n \"button\",\n {\n type: \"button\",\n className: \"pagination-item\",\n \"aria-current\": entry === page ? \"page\" : void 0,\n onClick: () => onChange(entry),\n children: entry\n },\n entry\n )\n ),\n /* @__PURE__ */ jsx21(\n \"button\",\n {\n type: \"button\",\n className: \"pagination-item\",\n \"data-nav\": \"\",\n disabled: page >= count,\n \"aria-label\": \"Next page\",\n onClick: () => onChange(page + 1),\n children: \"Next \\u203A\"\n }\n )\n ]\n }\n );\n }\n);\n\n// src/components/Table.tsx\nimport * as React20 from \"react\";\nimport { jsx as jsx22 } from \"react/jsx-runtime\";\nvar Table = React20.forwardRef(\n function Table2({ zebra, density = \"comfortable\", wrapClassName, className, children, ...rest }, ref) {\n return /* @__PURE__ */ jsx22(\"div\", { className: cx(\"table-wrap\", wrapClassName), children: /* @__PURE__ */ jsx22(\n \"table\",\n {\n ref,\n className: cx(\"table\", className),\n \"data-zebra\": zebra ? \"\" : void 0,\n \"data-density\": density === \"compact\" ? \"compact\" : void 0,\n ...rest,\n children\n }\n ) });\n }\n);\n\n// src/components/Topbar.tsx\nimport * as React21 from \"react\";\nimport { jsx as jsx23 } from \"react/jsx-runtime\";\nvar Topbar = React21.forwardRef(function Topbar2({ scrollAware = true, threshold = 8, className, ...rest }, ref) {\n useScrollAware({ threshold: scrollAware ? threshold : Infinity });\n return /* @__PURE__ */ jsx23(\"header\", { ref, className: cx(\"topbar\", className), ...rest });\n});\nvar TopbarBrand = React21.forwardRef(function TopbarBrand2({ className, ...rest }, ref) {\n return /* @__PURE__ */ jsx23(\"div\", { ref, className: cx(\"topbar-brand\", className), ...rest });\n});\nvar TopbarNav = React21.forwardRef(function TopbarNav2({ className, ...rest }, ref) {\n return /* @__PURE__ */ jsx23(\"nav\", { ref, className: cx(\"topbar-nav\", className), ...rest });\n});\nvar TopbarSpacer = React21.forwardRef(function TopbarSpacer2({ className, ...rest }, ref) {\n return /* @__PURE__ */ jsx23(\n \"div\",\n {\n ref,\n \"aria-hidden\": \"true\",\n className: cx(\"topbar-spacer\", className),\n ...rest\n }\n );\n});\n\n// src/components/Lane.tsx\nimport * as React22 from \"react\";\nimport { jsx as jsx24, jsxs as jsxs16 } from \"react/jsx-runtime\";\nvar Lane = React22.forwardRef(function Lane2({ title, count, subtitle, actions, flat, scrollable, bodyClassName, className, children, ...rest }, ref) {\n const hasHead = title != null || count != null || subtitle != null || actions != null;\n return /* @__PURE__ */ jsxs16(\n \"section\",\n {\n ref,\n className: cx(\"lane\", className),\n \"data-flat\": flat ? \"\" : void 0,\n \"data-scrollable\": scrollable ? \"\" : void 0,\n ...rest,\n children: [\n hasHead && /* @__PURE__ */ jsxs16(\"header\", { className: \"lane-head\", children: [\n title != null && /* @__PURE__ */ jsx24(\"h3\", { className: \"lane-title\", children: title }),\n subtitle != null && /* @__PURE__ */ jsx24(\"span\", { className: \"lane-subtitle\", children: subtitle }),\n count != null && /* @__PURE__ */ jsx24(\"span\", { className: \"count\", children: count }),\n actions != null && /* @__PURE__ */ jsx24(\"div\", { className: \"lane-actions\", children: actions })\n ] }),\n /* @__PURE__ */ jsx24(\"div\", { className: cx(\"lane-body\", bodyClassName), children })\n ]\n }\n );\n});\nvar LaneGrid = React22.forwardRef(function LaneGrid2({ className, ...rest }, ref) {\n return /* @__PURE__ */ jsx24(\"div\", { ref, className: cx(\"lane-grid\", className), ...rest });\n});\n\n// src/components/PageShell.tsx\nimport * as React23 from \"react\";\nimport { jsx as jsx25, jsxs as jsxs17 } from \"react/jsx-runtime\";\nvar PageShell = React23.forwardRef(\n function PageShell2({\n topbar,\n background = false,\n board = false,\n footer,\n skipLink = true,\n skipLinkLabel = \"Skip to content\",\n mainId = \"main\",\n mainClassName,\n boardClassName,\n className,\n children,\n ...rest\n }, ref) {\n return /* @__PURE__ */ jsxs17(\n \"div\",\n {\n ref,\n className: cx(\"page-shell\", className),\n \"data-no-topbar\": topbar == null ? \"\" : void 0,\n \"data-board\": board ? \"\" : void 0,\n ...rest,\n children: [\n skipLink && /* @__PURE__ */ jsx25(\"a\", { className: \"skip-link\", href: `#${mainId}`, children: skipLinkLabel }),\n background && /* @__PURE__ */ jsx25(Starscape, {}),\n topbar,\n /* @__PURE__ */ jsx25(\"main\", { id: mainId, tabIndex: -1, className: cx(\"page-shell-main\", mainClassName), children: board ? /* @__PURE__ */ jsx25(\"div\", { className: cx(\"page-shell-board\", boardClassName), children }) : children }),\n footer\n ]\n }\n );\n }\n);\n\n// src/components/PageSidebar.tsx\nimport * as React24 from \"react\";\nimport { jsx as jsx26, jsxs as jsxs18 } from \"react/jsx-runtime\";\nfunction readStored(key, fallback) {\n if (!key || typeof window === \"undefined\") return fallback;\n try {\n const v = window.localStorage.getItem(key);\n return v == null ? fallback : v === \"1\";\n } catch {\n return fallback;\n }\n}\nfunction useCollapsed(controlled, defaultCollapsed, storageKey, onChange) {\n const isControlled = controlled != null;\n const [internal, setInternal] = React24.useState(\n () => readStored(storageKey, defaultCollapsed)\n );\n const collapsed = isControlled ? controlled : internal;\n const toggle = React24.useCallback(() => {\n const next = !collapsed;\n if (!isControlled) {\n setInternal(next);\n if (storageKey && typeof window !== \"undefined\") {\n try {\n window.localStorage.setItem(storageKey, next ? \"1\" : \"0\");\n } catch {\n }\n }\n }\n onChange?.(next);\n }, [collapsed, isControlled, storageKey, onChange]);\n return [collapsed, toggle];\n}\nvar PageSidebar = React24.forwardRef(\n function PageSidebar2({\n brand,\n search,\n nav,\n footer,\n collapsible = true,\n collapsed: collapsedProp,\n defaultCollapsed = false,\n onCollapsedChange,\n storageKey,\n toggleLabels = [\"collapse\", \"expand\"],\n mainClassName,\n className,\n children,\n ...rest\n }, ref) {\n const [collapsed, toggle] = useCollapsed(\n collapsedProp,\n defaultCollapsed,\n storageKey,\n onCollapsedChange\n );\n return /* @__PURE__ */ jsxs18(\n \"div\",\n {\n ref,\n className: cx(\"page-sidebar-app\", className),\n \"data-collapsed\": collapsed ? \"\" : void 0,\n ...rest,\n children: [\n /* @__PURE__ */ jsxs18(\"aside\", { className: \"page-sidebar\", children: [\n brand,\n search,\n nav,\n footer,\n collapsible && /* @__PURE__ */ jsx26(\"div\", { className: \"page-sidebar-toggle-wrap\", children: /* @__PURE__ */ jsxs18(\n \"button\",\n {\n type: \"button\",\n className: \"page-sidebar-toggle\",\n onClick: toggle,\n \"aria-pressed\": collapsed,\n \"aria-label\": collapsed ? \"expand sidebar\" : \"collapse sidebar\",\n title: collapsed ? \"expand sidebar\" : \"collapse sidebar\",\n children: [\n /* @__PURE__ */ jsx26(\"span\", { className: \"page-sidebar-toggle-icon\", \"aria-hidden\": true, children: collapsed ? \"\\xBB\" : \"\\xAB\" }),\n /* @__PURE__ */ jsx26(\"span\", { className: \"page-sidebar-toggle-label\", children: collapsed ? toggleLabels[1] : toggleLabels[0] })\n ]\n }\n ) })\n ] }),\n /* @__PURE__ */ jsx26(\"main\", { className: cx(\"page-sidebar-main\", mainClassName), children })\n ]\n }\n );\n }\n);\nvar PageSidebarHeader = React24.forwardRef(\n function PageSidebarHeader2({ logo, title, subtitle, className, children, ...rest }, ref) {\n return /* @__PURE__ */ jsxs18(\"div\", { ref, className: cx(\"page-sidebar-header\", className), ...rest, children: [\n logo != null && /* @__PURE__ */ jsx26(\"div\", { className: \"page-sidebar-logo\", \"aria-hidden\": true, children: logo }),\n (title != null || subtitle != null) && /* @__PURE__ */ jsxs18(\"div\", { className: \"page-sidebar-titles\", children: [\n title != null && /* @__PURE__ */ jsx26(\"span\", { className: \"page-sidebar-title\", children: title }),\n subtitle != null && /* @__PURE__ */ jsx26(\"span\", { className: \"page-sidebar-subtitle\", children: subtitle })\n ] }),\n children\n ] });\n }\n);\nvar PageSidebarBrand = React24.forwardRef(\n function PageSidebarBrand2({ title, subtitle, className, children, ...rest }, ref) {\n return /* @__PURE__ */ jsxs18(\"div\", { ref, className: cx(\"page-sidebar-brand\", className), ...rest, children: [\n title != null && /* @__PURE__ */ jsx26(\"h1\", { children: title }),\n subtitle != null && /* @__PURE__ */ jsx26(\"span\", { className: \"page-sidebar-brand-sub\", children: subtitle }),\n children\n ] });\n }\n);\nvar PageSidebarSearch = React24.forwardRef(\n function PageSidebarSearch2({ className, ...rest }, ref) {\n return /* @__PURE__ */ jsx26(\"div\", { ref, className: cx(\"page-sidebar-search\", className), ...rest });\n }\n);\nvar PageSidebarNav = React24.forwardRef(\n function PageSidebarNav2({ className, ...rest }, ref) {\n return /* @__PURE__ */ jsx26(\"nav\", { ref, className: cx(\"page-sidebar-nav\", className), ...rest });\n }\n);\nvar PageSidebarSection = React24.forwardRef(\n function PageSidebarSection2({ label, className, children, ...rest }, ref) {\n return /* @__PURE__ */ jsxs18(\"div\", { ref, className: cx(\"page-sidebar-section\", className), ...rest, children: [\n label != null && /* @__PURE__ */ jsx26(\"div\", { className: \"page-sidebar-section-label\", children: label }),\n children\n ] });\n }\n);\nvar PageSidebarNavItem = React24.forwardRef(\n function PageSidebarNavItem2({ active, icon, badge, trailing, as, nested, title, className, children, ...rest }, ref) {\n const Comp = as ?? \"button\";\n const autoTitle = title ?? (typeof children === \"string\" ? children : void 0);\n return /* @__PURE__ */ jsxs18(\n Comp,\n {\n ref,\n className: cx(\n \"page-sidebar-nav-item\",\n nested && \"page-sidebar-nav-nested\",\n className\n ),\n \"data-active\": active ? \"\" : void 0,\n title: autoTitle,\n ...Comp === \"button\" ? { type: \"button\" } : {},\n ...rest,\n children: [\n icon != null && /* @__PURE__ */ jsx26(\"span\", { className: \"page-sidebar-nav-icon\", \"aria-hidden\": true, children: icon }),\n children != null && /* @__PURE__ */ jsx26(\"span\", { className: \"page-sidebar-nav-label\", children }),\n badge != null && /* @__PURE__ */ jsx26(\"span\", { className: \"page-sidebar-nav-badge\", children: badge }),\n trailing\n ]\n }\n );\n }\n);\nfunction ChevronIcon() {\n return /* @__PURE__ */ jsx26(\"span\", { className: \"page-sidebar-nav-chevron\", \"aria-hidden\": true, children: /* @__PURE__ */ jsx26(\"svg\", { viewBox: \"0 0 24 24\", width: \"16\", height: \"16\", fill: \"none\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\", children: /* @__PURE__ */ jsx26(\"path\", { d: \"M9 6l6 6-6 6\" }) }) });\n}\nvar PageSidebarNavGroup = React24.forwardRef(\n function PageSidebarNavGroup2({\n label,\n icon,\n badge,\n active,\n expanded: expandedProp,\n defaultExpanded = false,\n onExpandedChange,\n as,\n className,\n children,\n ...rest\n }, ref) {\n const isControlled = expandedProp != null;\n const [internal, setInternal] = React24.useState(defaultExpanded);\n const expanded = isControlled ? expandedProp : internal;\n const toggle = () => {\n const next = !expanded;\n if (!isControlled) setInternal(next);\n onExpandedChange?.(next);\n };\n return /* @__PURE__ */ jsxs18(\n \"div\",\n {\n ref,\n className: cx(\"page-sidebar-nav-group\", className),\n \"data-expanded\": expanded ? \"\" : void 0,\n ...rest,\n children: [\n /* @__PURE__ */ jsx26(\n PageSidebarNavItem,\n {\n as,\n icon,\n badge,\n active,\n trailing: /* @__PURE__ */ jsx26(ChevronIcon, {}),\n className: \"page-sidebar-nav-parent\",\n \"aria-expanded\": expanded,\n onClick: toggle,\n children: label\n }\n ),\n /* @__PURE__ */ jsx26(\"div\", { className: \"page-sidebar-nav-children\", children: /* @__PURE__ */ jsx26(\"div\", { className: \"page-sidebar-nav-children-inner\", children }) })\n ]\n }\n );\n }\n);\nvar PageSidebarNavSeparator = React24.forwardRef(function PageSidebarNavSeparator2({ className, ...rest }, ref) {\n return /* @__PURE__ */ jsx26(\n \"div\",\n {\n ref,\n \"aria-hidden\": \"true\",\n className: cx(\"page-sidebar-nav-separator\", className),\n ...rest\n }\n );\n});\nvar PageSidebarFooter = React24.forwardRef(\n function PageSidebarFooter2({ className, ...rest }, ref) {\n return /* @__PURE__ */ jsx26(\"div\", { ref, className: cx(\"page-sidebar-footer\", className), ...rest });\n }\n);\n\n// src/components/MediaCard.tsx\nimport * as React25 from \"react\";\nimport { jsx as jsx27, jsxs as jsxs19 } from \"react/jsx-runtime\";\nvar MediaCard = React25.forwardRef(\n function MediaCard2({ title, meta, selected, playState = \"idle\", onPlay, envelope, chips, note, actions, className, children, ...rest }, ref) {\n return /* @__PURE__ */ jsxs19(\n \"article\",\n {\n ref,\n className: cx(\"media-card\", className),\n \"data-selected\": selected ? \"true\" : void 0,\n ...rest,\n children: [\n /* @__PURE__ */ jsxs19(\"header\", { children: [\n /* @__PURE__ */ jsxs19(\"div\", { children: [\n /* @__PURE__ */ jsx27(\"strong\", { children: title }),\n meta != null && /* @__PURE__ */ jsx27(\"span\", { children: meta })\n ] }),\n onPlay && /* @__PURE__ */ jsx27(\n \"button\",\n {\n type: \"button\",\n className: \"media-play\",\n \"data-state\": playState,\n \"aria-label\": playState === \"playing\" ? \"Pause\" : \"Play\",\n onClick: onPlay,\n children: playState === \"playing\" ? \"Pause\" : \"Play\"\n }\n )\n ] }),\n envelope != null && /* @__PURE__ */ jsx27(\"div\", { className: \"media-envelope\", \"aria-hidden\": \"true\", children: /* @__PURE__ */ jsx27(\"span\", { style: { width: `${envelope}%` } }) }),\n chips != null && /* @__PURE__ */ jsx27(\"div\", { className: \"media-card-chips\", children: chips }),\n note != null && /* @__PURE__ */ jsx27(\"p\", { className: \"media-card-note\", children: note }),\n children,\n actions != null && /* @__PURE__ */ jsx27(\"div\", { className: \"media-card-actions\", children: actions })\n ]\n }\n );\n }\n);\n\n// src/components/Gallery.tsx\nimport * as React26 from \"react\";\nimport { initGalleries } from \"@starlove/ui/gallery\";\nimport { jsx as jsx28 } from \"react/jsx-runtime\";\nfunction useGallery(ref, options) {\n const opts = React26.useRef(options);\n React26.useEffect(() => {\n if (!ref.current) return;\n return initGalleries(ref.current, opts.current);\n }, [ref]);\n}\nvar Gallery = React26.forwardRef(\n function Gallery2({ images, label, thumbWidth = 240, thumbHeight = 180, labels, className, ...rest }, forwarded) {\n const local = React26.useRef(null);\n const setRef = React26.useCallback(\n (node) => {\n local.current = node;\n if (typeof forwarded === \"function\") forwarded(node);\n else if (forwarded) forwarded.current = node;\n },\n [forwarded]\n );\n useGallery(local, { labels });\n return /* @__PURE__ */ jsx28(\n \"ul\",\n {\n ref: setRef,\n className: cx(\"gallery\", className),\n \"data-gallery\": \"\",\n \"aria-label\": label,\n ...rest,\n children: images.map((img) => /* @__PURE__ */ jsx28(\"li\", { children: /* @__PURE__ */ jsx28(\n \"a\",\n {\n className: \"gallery-link\",\n href: img.href,\n \"data-width\": img.width,\n \"data-height\": img.height,\n \"data-srcset\": img.srcSet,\n \"data-caption\": img.caption,\n children: /* @__PURE__ */ jsx28(\n \"img\",\n {\n src: img.thumb,\n srcSet: img.thumbSrcSet,\n width: thumbWidth,\n height: thumbHeight,\n alt: img.alt,\n loading: \"lazy\",\n decoding: \"async\"\n }\n )\n }\n ) }, img.href))\n }\n );\n }\n);\n\n// src/components/Sky.tsx\nimport * as React27 from \"react\";\nimport {\n Sky as SkyEngine,\n initFullTurn,\n initSkyHero\n} from \"@starlove/ui/sky\";\nimport { jsx as jsx29 } from \"react/jsx-runtime\";\nfunction useSky(ref, options) {\n const opts = React27.useRef(options);\n React27.useEffect(() => {\n if (!ref.current) return;\n const sky = new SkyEngine(ref.current, opts.current);\n return () => sky.destroy();\n }, [ref]);\n}\nfunction useSkyHero(ref, options) {\n const opts = React27.useRef(options);\n React27.useEffect(() => {\n if (!ref.current) return;\n return initSkyHero(ref.current, opts.current);\n }, [ref]);\n}\nfunction useFullTurn(ref, options) {\n const opts = React27.useRef(options);\n React27.useEffect(() => {\n if (!ref.current) return;\n return initFullTurn(ref.current, opts.current);\n }, [ref]);\n}\nvar Sky = React27.forwardRef(function Sky2({ options, pole, className, ...rest }, forwarded) {\n const local = React27.useRef(null);\n const setRef = React27.useCallback(\n (node) => {\n local.current = node;\n if (typeof forwarded === \"function\") forwarded(node);\n else if (forwarded) forwarded.current = node;\n },\n [forwarded]\n );\n const opts = React27.useRef(options);\n React27.useEffect(() => {\n if (!local.current) return;\n const sky = new SkyEngine(local.current, { ...opts.current, pole: pole?.current ?? null });\n return () => sky.destroy();\n }, [pole]);\n return /* @__PURE__ */ jsx29(\"div\", { ref: setRef, className: cx(\"sky\", className), \"aria-hidden\": \"true\", ...rest });\n});\n\n// src/components/AuthPage.tsx\nimport * as React28 from \"react\";\nimport { jsx as jsx30, jsxs as jsxs20 } from \"react/jsx-runtime\";\nvar AuthTitle = React28.createContext(void 0);\nvar AuthPage = React28.forwardRef(function AuthPage2({\n star,\n starSize = 76,\n title = \"Sign in\",\n titleId,\n brand,\n lede,\n alt,\n altLabel = \"or\",\n altNeedsScript = true,\n note,\n tools,\n sky,\n className,\n children,\n ...rest\n}, forwarded) {\n const generated = React28.useId();\n const headingId = titleId ?? `${generated}-title`;\n const local = React28.useRef(null);\n const setRef = React28.useCallback(\n (node) => {\n local.current = node;\n if (typeof forwarded === \"function\") forwarded(node);\n else if (forwarded) forwarded.current = node;\n },\n [forwarded]\n );\n useFullTurn(local, sky);\n return /* @__PURE__ */ jsxs20(\"main\", { ref: setRef, className: cx(\"auth sky-turn\", className), \"data-sky-turn\": \"arrived\", ...rest, children: [\n /* @__PURE__ */ jsx30(\"div\", { className: \"sky\", \"aria-hidden\": \"true\" }),\n /* @__PURE__ */ jsxs20(\"div\", { className: \"auth-card\", children: [\n brand != null && /* @__PURE__ */ jsx30(\"p\", { className: \"auth-brand\", children: brand }),\n /* @__PURE__ */ jsx30(\"h1\", { id: headingId, children: title }),\n lede != null && /* @__PURE__ */ jsx30(\"p\", { className: \"auth-lede\", children: lede }),\n /* @__PURE__ */ jsx30(AuthTitle.Provider, { value: headingId, children }),\n alt != null && /* @__PURE__ */ jsxs20(\"div\", { className: \"auth-alt\", \"data-js-only\": altNeedsScript ? \"\" : void 0, children: [\n /* @__PURE__ */ jsx30(\"p\", { className: \"auth-or\", children: altLabel }),\n alt\n ] }),\n note != null && /* @__PURE__ */ jsx30(\"p\", { className: \"auth-note\", children: note }),\n tools != null && /* @__PURE__ */ jsx30(\"div\", { className: \"auth-tools\", children: tools })\n ] }),\n /* @__PURE__ */ jsx30(\"div\", { className: \"sky-turn-star\", \"data-sky-pole\": true, \"aria-hidden\": \"true\", children: /* @__PURE__ */ jsx30(\"img\", { src: star, alt: \"\", width: starSize, height: starSize }) })\n ] });\n});\nvar AuthForm = React28.forwardRef(function AuthForm2({\n error,\n usernameLabel = \"Username or email\",\n passwordLabel = \"Password\",\n submitLabel = \"Sign in\",\n usernameName = \"username\",\n passwordName = \"password\",\n usernameType = \"text\",\n defaultUsername,\n forgot,\n method = \"post\",\n className,\n children,\n ...rest\n}, ref) {\n const titleId = React28.useContext(AuthTitle);\n const id = React28.useId();\n const errorId = `${id}-error`;\n const invalid = error != null && error !== false && error !== \"\" ? true : void 0;\n const labelled = rest[\"aria-label\"] == null && rest[\"aria-labelledby\"] == null ? titleId : void 0;\n return /* @__PURE__ */ jsxs20(\"form\", { ref, className: cx(\"auth-form\", className), method, \"aria-labelledby\": labelled, ...rest, children: [\n children,\n /* @__PURE__ */ jsx30(\"p\", { className: \"auth-error\", id: errorId, role: \"alert\", children: error }),\n /* @__PURE__ */ jsxs20(\"div\", { className: \"auth-field\", children: [\n /* @__PURE__ */ jsx30(\"label\", { htmlFor: `${id}-username`, children: usernameLabel }),\n /* @__PURE__ */ jsx30(\n \"input\",\n {\n id: `${id}-username`,\n name: usernameName,\n type: usernameType,\n autoComplete: \"username\",\n autoCapitalize: \"none\",\n spellCheck: false,\n required: true,\n defaultValue: defaultUsername,\n \"aria-describedby\": errorId,\n \"aria-invalid\": invalid\n }\n )\n ] }),\n /* @__PURE__ */ jsxs20(\"div\", { className: \"auth-field\", children: [\n /* @__PURE__ */ jsx30(\"label\", { htmlFor: `${id}-password`, children: passwordLabel }),\n /* @__PURE__ */ jsx30(\n \"input\",\n {\n id: `${id}-password`,\n name: passwordName,\n type: \"password\",\n autoComplete: \"current-password\",\n required: true,\n \"aria-describedby\": errorId,\n \"aria-invalid\": invalid\n }\n )\n ] }),\n /* @__PURE__ */ jsxs20(\"div\", { className: \"auth-actions\", children: [\n /* @__PURE__ */ jsx30(\"button\", { type: \"submit\", children: submitLabel }),\n forgot\n ] })\n ] });\n});\n\n// src/components/StarChart.tsx\nimport * as React29 from \"react\";\nimport {\n initStarCharts,\n setCurrent,\n SELECT_EVENT\n} from \"@starlove/ui/star-chart\";\nimport { renderStarChart, WORDS } from \"@starlove/ui/star-chart-render\";\nimport { MAGNITUDES } from \"@starlove/ui/star-chart-data\";\nimport { jsx as jsx31, jsxs as jsxs21 } from \"react/jsx-runtime\";\nfunction useStarCharts(ref, options) {\n const opts = React29.useRef(options);\n React29.useEffect(() => {\n if (!ref.current) return;\n return initStarCharts(ref.current, opts.current);\n }, [ref]);\n}\nvar StarChart = React29.forwardRef(function StarChart2({ data, mode = \"teaser\", selected = null, href, chartId, mark, words, onSelect, header, insetTop, className, ...rest }, forwarded) {\n const local = React29.useRef(null);\n const setRef = React29.useCallback(\n (node) => {\n local.current = node;\n if (typeof forwarded === \"function\") forwarded(node);\n else if (forwarded) forwarded.current = node;\n },\n [forwarded]\n );\n const reactId = React29.useId();\n const id = chartId ?? `star-chart-${reactId.replace(/[^A-Za-z0-9_-]/g, \"\")}`;\n const first = React29.useRef(selected);\n const html = renderStarChart(data, { mode, selected: first.current, href, id, mark, words, frame: false });\n const inner = React29.useMemo(() => ({ __html: html }), [html]);\n const enhance = React29.useRef({ header, insetTop });\n enhance.current = { header, insetTop };\n React29.useEffect(() => {\n const node = local.current;\n if (!node) return;\n return initStarCharts(node, { ...enhance.current });\n }, [html]);\n React29.useEffect(() => {\n if (local.current) setCurrent(local.current, selected ?? null);\n }, [selected, html]);\n const latest = React29.useRef(onSelect);\n latest.current = onSelect;\n React29.useEffect(() => {\n const node = local.current;\n if (!node) return;\n const listener = (e) => {\n const event = e;\n latest.current?.(event.detail, event);\n };\n node.addEventListener(SELECT_EVENT, listener);\n return () => node.removeEventListener(SELECT_EVENT, listener);\n }, []);\n return /* @__PURE__ */ jsx31(\n \"div\",\n {\n ref: setRef,\n className: cx(\"star-chart\", className),\n \"data-star-chart\": mode,\n ...rest,\n dangerouslySetInnerHTML: inner\n }\n );\n});\nvar StarChartLegend = React29.forwardRef(function StarChartLegend2({ words, className, ...rest }, ref) {\n const stages = { ...MAGNITUDES, ...words?.stages };\n return /* @__PURE__ */ jsxs21(\"div\", { ref, className: cx(\"star-chart-legend\", className), role: \"group\", \"aria-label\": words?.legend ?? WORDS.legend, ...rest, children: [\n /* @__PURE__ */ jsx31(\"span\", { children: words?.legendTitle ?? WORDS.legendTitle }),\n [1, 2, 3, 4, 5].map((m) => /* @__PURE__ */ jsxs21(\"span\", { className: \"star-chart-legend-item\", children: [\n /* @__PURE__ */ jsx31(\"span\", { className: \"star-chart-legend-dot\", \"data-magnitude\": m }),\n `${m} ${stages[m]}`\n ] }, m))\n ] });\n});\n\n// src/components/Theme.tsx\nimport * as React30 from \"react\";\nimport { useEffect as useEffect11 } from \"react\";\nimport { initReveal } from \"@starlove/ui/reveal\";\nimport { jsx as jsx32, jsxs as jsxs22 } from \"react/jsx-runtime\";\nvar ICON = {\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n \"aria-hidden\": true\n};\nvar ThemeToggle = React30.forwardRef(function ThemeToggle2({ labelToLight = \"Switch to light theme\", labelToDark = \"Switch to dark theme\", className, ...rest }, ref) {\n const { resolved } = useTheme();\n return /* @__PURE__ */ jsxs22(\n \"button\",\n {\n ref,\n type: \"button\",\n className: cx(\"topbar-btn\", className),\n \"data-variant\": \"theme\",\n \"data-theme-toggle\": \"\",\n \"data-label-to-light\": labelToLight,\n \"data-label-to-dark\": labelToDark,\n \"aria-label\": resolved === \"dark\" ? labelToLight : labelToDark,\n suppressHydrationWarning: true,\n ...rest,\n children: [\n /* @__PURE__ */ jsxs22(\"svg\", { className: \"topbar-icon\", \"data-icon\": \"sun\", ...ICON, children: [\n /* @__PURE__ */ jsx32(\"circle\", { cx: \"12\", cy: \"12\", r: \"4.5\" }),\n /* @__PURE__ */ jsx32(\"path\", { d: \"M12 2v2.2M12 19.8V22M3.5 12H5.7M18.3 12h2.2M5.6 5.6l1.5 1.5M16.9 16.9l1.5 1.5M5.6 18.4l1.5-1.5M16.9 7.1l1.5-1.5\" })\n ] }),\n /* @__PURE__ */ jsx32(\"svg\", { className: \"topbar-icon\", \"data-icon\": \"moon\", ...ICON, children: /* @__PURE__ */ jsx32(\"path\", { d: \"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\" }) })\n ]\n }\n );\n});\nvar ThemeSwitch = React30.forwardRef(function ThemeSwitch2({ darkLabel = \"Night\", lightLabel = \"Day\", systemLabel, label = \"Theme\", className, ...rest }, ref) {\n const { mode, resolved } = useTheme();\n const hasSystem = systemLabel != null;\n const pressed = (v) => v === mode || mode === \"system\" && !hasSystem && v === resolved;\n return /* @__PURE__ */ jsxs22(\"div\", { ref, className: cx(\"theme-switch\", className), role: \"group\", \"aria-label\": label, ...rest, children: [\n /* @__PURE__ */ jsx32(\"button\", { type: \"button\", \"data-set-theme\": \"dark\", \"aria-pressed\": pressed(\"dark\"), suppressHydrationWarning: true, children: darkLabel }),\n /* @__PURE__ */ jsx32(\"button\", { type: \"button\", \"data-set-theme\": \"light\", \"aria-pressed\": pressed(\"light\"), suppressHydrationWarning: true, children: lightLabel }),\n hasSystem && /* @__PURE__ */ jsx32(\"button\", { type: \"button\", \"data-set-theme\": \"system\", \"aria-pressed\": pressed(\"system\"), suppressHydrationWarning: true, children: systemLabel })\n ] });\n});\nfunction useReveal(options) {\n useEffect11(() => initReveal(options), [options?.root, options?.rootMargin]);\n}\n\n// src/components/NavDialog.tsx\nimport * as React31 from \"react\";\nimport { initNavDialogs } from \"@starlove/ui/nav-dialog\";\nimport { Fragment as Fragment3, jsx as jsx33, jsxs as jsxs23 } from \"react/jsx-runtime\";\nfunction useNavDialog(ref, options) {\n const opts = React31.useRef(options);\n React31.useEffect(() => {\n if (!ref.current) return;\n return initNavDialogs(ref.current, opts.current);\n }, [ref]);\n}\nvar NavDialog = React31.forwardRef(\n function NavDialog2({ id, label = \"Menu\", brand, closeLabel = \"Close\", foot, closeMedia, className, children, ...rest }, forwarded) {\n const local = React31.useRef(null);\n const setRef = React31.useCallback(\n (node) => {\n local.current = node;\n if (typeof forwarded === \"function\") forwarded(node);\n else if (forwarded) forwarded.current = node;\n },\n [forwarded]\n );\n useNavDialog(local);\n return /* @__PURE__ */ jsxs23(\n \"dialog\",\n {\n ref: setRef,\n id,\n className: cx(\"nav-dialog\", className),\n \"aria-label\": label,\n \"data-nav-dialog\": \"\",\n \"data-close-media\": closeMedia,\n ...rest,\n children: [\n /* @__PURE__ */ jsxs23(\"div\", { className: \"nav-dialog-top\", children: [\n brand,\n /* @__PURE__ */ jsx33(\"button\", { type: \"button\", className: \"nav-dialog-close\", \"data-nav-dialog-close\": \"\", children: closeLabel })\n ] }),\n /* @__PURE__ */ jsx33(\"nav\", { className: \"nav-dialog-links\", \"aria-label\": label, children }),\n foot != null && /* @__PURE__ */ jsx33(\"div\", { className: \"nav-dialog-foot\", children: foot })\n ]\n }\n );\n }\n);\nvar NavDialogTrigger = React31.forwardRef(\n function NavDialogTrigger2({ controls, fallbackHref, className, children = \"Menu\", ...rest }, ref) {\n return /* @__PURE__ */ jsxs23(Fragment3, { children: [\n /* @__PURE__ */ jsx33(\n \"button\",\n {\n ref,\n type: \"button\",\n className: cx(\"nav-dialog-open\", className),\n \"data-nav-dialog-open\": controls,\n \"aria-controls\": controls,\n \"aria-expanded\": false,\n \"aria-haspopup\": \"dialog\",\n ...rest,\n children\n }\n ),\n /* @__PURE__ */ jsx33(\"a\", { className: cx(\"nav-dialog-fallback\", className), href: fallbackHref, children })\n ] });\n }\n);\n\n// src/components/Panel.tsx\nimport * as React32 from \"react\";\nimport { jsx as jsx34, jsxs as jsxs24 } from \"react/jsx-runtime\";\nvar Pill = React32.forwardRef(function Pill2({ variant, size, as, className, type, ...rest }, ref) {\n const Comp = as ?? (rest.href != null ? \"a\" : variant === \"off\" ? \"span\" : \"button\");\n return /* @__PURE__ */ jsx34(\n Comp,\n {\n ref,\n className: cx(\"pill\", className),\n \"data-variant\": variant,\n \"data-size\": size,\n type: Comp === \"button\" ? type ?? \"button\" : type,\n ...rest\n }\n );\n});\nfunction OutArrow() {\n return /* @__PURE__ */ jsx34(\"svg\", { viewBox: \"0 0 16 16\", \"aria-hidden\": \"true\", focusable: \"false\", children: /* @__PURE__ */ jsx34(\"path\", { d: \"M5 11 11 5M6 5h5v5\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 1.6, strokeLinecap: \"round\", strokeLinejoin: \"round\" }) });\n}\nvar Panel = React32.forwardRef(function Panel2({ className, ...rest }, ref) {\n return /* @__PURE__ */ jsx34(\"div\", { ref, className: cx(\"panel\", className), ...rest });\n});\nvar PanelHead = React32.forwardRef(function PanelHead2({ as: Comp = \"summary\", className, ...rest }, ref) {\n return /* @__PURE__ */ jsx34(Comp, { ref, className: cx(\"panel-head\", className), ...rest });\n});\nvar PanelSection = React32.forwardRef(function PanelSection2({ label, defaultOpen, className, children, ...rest }, ref) {\n return /* @__PURE__ */ jsxs24(\"details\", { ref, className: cx(\"panel-section\", className), open: defaultOpen || void 0, ...rest, children: [\n /* @__PURE__ */ jsx34(\"summary\", { className: \"panel-head\", children: label }),\n children\n ] });\n});\nvar PanelLinks = React32.forwardRef(function PanelLinks2({ className, ...rest }, ref) {\n return /* @__PURE__ */ jsx34(\"ul\", { ref, className: cx(\"panel-links\", className), role: \"list\", ...rest });\n});\nvar PanelLink = React32.forwardRef(function PanelLink2({ href, value, note, variant, external, rel, children, ...rest }, ref) {\n const out = external ?? (href != null && /^https?:/.test(href));\n return /* @__PURE__ */ jsxs24(\"li\", { ref, ...rest, children: [\n /* @__PURE__ */ jsxs24(Pill, { href, rel, variant: variant ?? (href == null ? \"off\" : \"filled\"), children: [\n children,\n out && /* @__PURE__ */ jsx34(OutArrow, {})\n ] }),\n (value != null || note != null) && /* @__PURE__ */ jsxs24(\"span\", { className: \"panel-detail\", children: [\n value != null && /* @__PURE__ */ jsx34(\"code\", { children: value }),\n value != null && note != null && \" \",\n note != null && /* @__PURE__ */ jsx34(\"span\", { className: \"panel-note\", children: note })\n ] })\n ] });\n});\nvar PanelRows = React32.forwardRef(function PanelRows2({ copyLabels, className, ...rest }, forwarded) {\n const local = React32.useRef(null);\n const setRef = React32.useCallback(\n (node) => {\n local.current = node;\n if (typeof forwarded === \"function\") forwarded(node);\n else if (forwarded) forwarded.current = node;\n },\n [forwarded]\n );\n useCopy(local, { labels: copyLabels });\n return /* @__PURE__ */ jsx34(\"ul\", { ref: setRef, className: cx(\"panel-rows\", className), role: \"list\", ...rest });\n});\nvar PanelRow = React32.forwardRef(function PanelRow2({ name, handle, note, value, copyName, copyLabel = \"Copy\", noCopy, ...rest }, ref) {\n const id = React32.useId();\n const what = copyName ?? (typeof name === \"string\" ? name : void 0);\n return /* @__PURE__ */ jsxs24(\"li\", { ref, ...rest, children: [\n /* @__PURE__ */ jsxs24(\"span\", { className: \"panel-who\", children: [\n /* @__PURE__ */ jsx34(\"span\", { className: \"panel-name\", children: name }),\n handle != null && /* @__PURE__ */ jsx34(\"span\", { className: \"panel-handle\", children: handle }),\n note != null && /* @__PURE__ */ jsx34(\"span\", { className: \"panel-note\", children: note })\n ] }),\n /* @__PURE__ */ jsx34(\"code\", { className: \"panel-value\", id, children: value }),\n !noCopy && /* @__PURE__ */ jsxs24(Pill, { \"data-copy-target\": `#${id}`, children: [\n copyLabel,\n what && /* @__PURE__ */ jsx34(\"span\", { className: \"visually-hidden\", children: ` ${what}` })\n ] })\n ] });\n});\n\n// src/components/ActionCard.tsx\nimport * as React33 from \"react\";\nimport { jsx as jsx35, jsxs as jsxs25 } from \"react/jsx-runtime\";\nvar PanelIdContext = React33.createContext(void 0);\nvar ActionCard = React33.forwardRef(function ActionCard2({ panelId: given, className, children, ...rest }, ref) {\n const generated = React33.useId();\n const panelId = given ?? generated;\n return /* @__PURE__ */ jsx35(\"div\", { ref, className: cx(\"action-card\", className), ...rest, children: /* @__PURE__ */ jsx35(PanelIdContext.Provider, { value: panelId, children }) });\n});\nvar ActionCardCopy = React33.forwardRef(function ActionCardCopy2({ className, ...rest }, ref) {\n return /* @__PURE__ */ jsx35(\"div\", { ref, className: cx(\"action-card-copy\", className), ...rest });\n});\nvar ActionCardLabel = React33.forwardRef(function ActionCardLabel2({ className, ...rest }, ref) {\n return /* @__PURE__ */ jsx35(\"p\", { ref, className: cx(\"action-card-label\", className), ...rest });\n});\nvar ActionCardTitle = React33.forwardRef(function ActionCardTitle2({ as: Comp = \"h2\", className, ...rest }, ref) {\n return /* @__PURE__ */ jsx35(Comp, { ref, className: cx(\"action-card-title\", className), ...rest });\n});\nvar ActionCardText = React33.forwardRef(function ActionCardText2({ className, ...rest }, ref) {\n return /* @__PURE__ */ jsx35(\"p\", { ref, className: cx(\"action-card-text\", className), ...rest });\n});\nvar ActionCardToggle = React33.forwardRef(function ActionCardToggle2({ defaultOpen, className, children, ...rest }, ref) {\n const panelId = React33.useContext(PanelIdContext);\n return /* @__PURE__ */ jsx35(\"details\", { ref, className: cx(\"action-card-more\", className), open: defaultOpen || void 0, ...rest, children: /* @__PURE__ */ jsxs25(\"summary\", { className: \"pill\", \"data-variant\": \"primary\", \"data-size\": \"lg\", \"aria-controls\": panelId, children: [\n children,\n /* @__PURE__ */ jsx35(\"svg\", { className: \"action-card-chevron\", viewBox: \"0 0 16 16\", \"aria-hidden\": \"true\", focusable: \"false\", children: /* @__PURE__ */ jsx35(\"path\", { d: \"M4 6.5 8 10.5l4-4\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 1.6, strokeLinecap: \"round\", strokeLinejoin: \"round\" }) })\n ] }) });\n});\nvar ActionCardPanel = React33.forwardRef(function ActionCardPanel2({ className, id, ...rest }, ref) {\n const panelId = React33.useContext(PanelIdContext);\n return /* @__PURE__ */ jsx35(\"div\", { ref, className: cx(\"action-card-panel panel\", className), id: panelId ?? id, ...rest });\n});\nvar ActionCardLink = React33.forwardRef(function ActionCardLink2({ className, ...rest }, ref) {\n return /* @__PURE__ */ jsx35(Pill, { ref, as: \"a\", size: \"lg\", className: cx(\"action-card-link\", className), ...rest });\n});\n\n// src/components/Segmented.tsx\nimport { jsx as jsx36 } from \"react/jsx-runtime\";\nfunction Segmented({\n value,\n onChange,\n options,\n size = \"md\",\n className,\n ...rest\n}) {\n return /* @__PURE__ */ jsx36(\n \"div\",\n {\n role: \"radiogroup\",\n className: cx(\"segmented\", className),\n \"data-size\": size === \"md\" ? void 0 : size,\n ...rest,\n children: options.map((opt) => /* @__PURE__ */ jsx36(\n \"button\",\n {\n type: \"button\",\n role: \"radio\",\n className: \"segmented-option\",\n \"aria-checked\": value === opt.value,\n \"aria-disabled\": opt.disabled || void 0,\n disabled: opt.disabled,\n onClick: () => onChange(opt.value),\n children: opt.label\n },\n opt.value\n ))\n }\n );\n}\n\n// src/components/Stepper.tsx\nimport * as React34 from \"react\";\nimport { jsx as jsx37, jsxs as jsxs26 } from \"react/jsx-runtime\";\nfunction stateFor(index, active) {\n if (index < active) return \"done\";\n if (index === active) return \"current\";\n return \"upcoming\";\n}\nvar Stepper = React34.forwardRef(\n function Stepper2({ steps, active, orientation = \"horizontal\", className, ...rest }, ref) {\n return /* @__PURE__ */ jsx37(\n \"ol\",\n {\n ref,\n className: cx(\"stepper\", className),\n \"data-orientation\": orientation === \"horizontal\" ? void 0 : orientation,\n ...rest,\n children: steps.map((step, i) => /* @__PURE__ */ jsxs26(\"li\", { className: \"step\", \"data-state\": stateFor(i, active), children: [\n /* @__PURE__ */ jsx37(\"span\", { className: \"step-dot\", children: step.dot ?? i + 1 }),\n /* @__PURE__ */ jsx37(\"span\", { className: \"step-label\", children: step.label })\n ] }, i))\n }\n );\n }\n);\n\n// src/components/Drawer.tsx\nimport * as React35 from \"react\";\nimport { Fragment as Fragment4, jsx as jsx38, jsxs as jsxs27 } from \"react/jsx-runtime\";\nvar Drawer = React35.forwardRef(\n function Drawer2({ open, onClose, eyebrow, title, footer, dismissable = true, className, children, ...rest }, ref) {\n const panelRef = React35.useRef(null);\n React35.useImperativeHandle(ref, () => panelRef.current);\n useEscapeKey(onClose, { enabled: open && dismissable });\n useClickOutside(panelRef, onClose, { enabled: open && dismissable });\n const hasHeader = eyebrow != null || title != null;\n return /* @__PURE__ */ jsxs27(Fragment4, { children: [\n /* @__PURE__ */ jsx38(\"div\", { className: cx(\"drawer-backdrop\", open && \"is-visible\"), \"aria-hidden\": \"true\" }),\n /* @__PURE__ */ jsxs27(\n \"div\",\n {\n ref: panelRef,\n role: \"dialog\",\n \"aria-modal\": \"true\",\n \"aria-hidden\": !open,\n className: cx(\"drawer\", open && \"is-open\", className),\n ...rest,\n children: [\n hasHeader && /* @__PURE__ */ jsxs27(\"header\", { className: \"drawer-header\", children: [\n /* @__PURE__ */ jsxs27(\"div\", { children: [\n eyebrow != null && /* @__PURE__ */ jsx38(\"div\", { className: \"drawer-eyebrow\", children: eyebrow }),\n title != null && /* @__PURE__ */ jsx38(\"h2\", { className: \"drawer-title\", children: title })\n ] }),\n /* @__PURE__ */ jsx38(\n \"button\",\n {\n type: \"button\",\n className: \"drawer-close\",\n \"aria-label\": \"Close\",\n onClick: onClose,\n children: \"\\xD7\"\n }\n )\n ] }),\n /* @__PURE__ */ jsx38(\"div\", { className: \"drawer-body\", children }),\n footer != null && /* @__PURE__ */ jsx38(\"footer\", { className: \"drawer-footer\", children: footer })\n ]\n }\n )\n ] });\n }\n);\n\n// src/components/Flyout.tsx\nimport * as React36 from \"react\";\nimport { jsx as jsx39 } from \"react/jsx-runtime\";\nvar Flyout = React36.forwardRef(\n function Flyout2({ open, onClose, className, ...rest }, ref) {\n const innerRef = React36.useRef(null);\n React36.useImperativeHandle(ref, () => innerRef.current);\n useEscapeKey(() => onClose?.(), { enabled: open && !!onClose });\n useClickOutside(innerRef, () => onClose?.(), { enabled: open && !!onClose });\n return /* @__PURE__ */ jsx39(\n \"div\",\n {\n ref: innerRef,\n role: \"menu\",\n \"aria-hidden\": !open,\n className: cx(\"flyout\", open && \"is-open\", className),\n ...rest\n }\n );\n }\n);\nvar FlyoutItem = React36.forwardRef(\n function FlyoutItem2({ danger, active, disabled, className, type = \"button\", ...rest }, ref) {\n return /* @__PURE__ */ jsx39(\n \"button\",\n {\n ref,\n type,\n role: \"menuitem\",\n className: cx(\"flyout-item\", active && \"is-active\", className),\n \"data-danger\": danger ? \"\" : void 0,\n \"aria-disabled\": disabled || void 0,\n disabled,\n ...rest\n }\n );\n }\n);\nvar FlyoutSeparator = React36.forwardRef(function FlyoutSeparator2({ className, ...rest }, ref) {\n return /* @__PURE__ */ jsx39(\n \"div\",\n {\n ref,\n role: \"separator\",\n className: cx(\"flyout-separator\", className),\n ...rest\n }\n );\n});\nvar FlyoutSectionLabel = React36.forwardRef(function FlyoutSectionLabel2({ className, ...rest }, ref) {\n return /* @__PURE__ */ jsx39(\"div\", { ref, className: cx(\"flyout-section-label\", className), ...rest });\n});\n\n// src/components/Popover.tsx\nimport * as React37 from \"react\";\nimport { jsx as jsx40, jsxs as jsxs28 } from \"react/jsx-runtime\";\nvar Popover = React37.forwardRef(\n function Popover2({ open, onClose, placement = \"bottom\", title, footer, arrow = true, className, children, ...rest }, ref) {\n const innerRef = React37.useRef(null);\n React37.useImperativeHandle(ref, () => innerRef.current);\n useEscapeKey(() => onClose?.(), { enabled: open && !!onClose });\n useClickOutside(innerRef, () => onClose?.(), { enabled: open && !!onClose });\n return /* @__PURE__ */ jsxs28(\n \"div\",\n {\n ref: innerRef,\n role: \"dialog\",\n \"aria-hidden\": !open,\n className: cx(\"popover\", open && \"is-open\", className),\n \"data-placement\": placement === \"bottom\" ? void 0 : placement,\n ...rest,\n children: [\n arrow && /* @__PURE__ */ jsx40(\"div\", { className: \"popover-arrow\", \"aria-hidden\": \"true\" }),\n title != null && /* @__PURE__ */ jsx40(\"header\", { className: \"popover-head\", children: title }),\n /* @__PURE__ */ jsx40(\"div\", { className: \"popover-body\", children }),\n footer != null && /* @__PURE__ */ jsx40(\"footer\", { className: \"popover-foot\", children: footer })\n ]\n }\n );\n }\n);\n\n// src/components/ContextMenu.tsx\nimport * as React38 from \"react\";\nimport { jsx as jsx41 } from \"react/jsx-runtime\";\nvar ContextMenu = React38.forwardRef(\n function ContextMenu2({ menu, className, children, ...rest }, ref) {\n const innerRef = React38.useRef(null);\n React38.useImperativeHandle(ref, () => innerRef.current);\n useEscapeKey(menu.close, { enabled: menu.isOpen });\n useClickOutside(innerRef, menu.close, { enabled: menu.isOpen });\n if (!menu.isOpen) return null;\n return /* @__PURE__ */ jsx41(\n \"div\",\n {\n ref: innerRef,\n role: \"menu\",\n className: cx(\"context-menu\", className),\n ...menu.menuProps,\n ...rest,\n children\n }\n );\n }\n);\nvar ContextMenuItem = React38.forwardRef(function ContextMenuItem2({ danger, className, type = \"button\", ...rest }, ref) {\n return /* @__PURE__ */ jsx41(\n \"button\",\n {\n ref,\n type,\n role: \"menuitem\",\n className: cx(\"flyout-item\", className),\n \"data-danger\": danger ? \"\" : void 0,\n ...rest\n }\n );\n});\nvar ContextMenuSeparator = React38.forwardRef(function ContextMenuSeparator2({ className, ...rest }, ref) {\n return /* @__PURE__ */ jsx41(\n \"div\",\n {\n ref,\n role: \"separator\",\n className: cx(\"flyout-separator\", className),\n ...rest\n }\n );\n});\n\n// src/components/Accordion.tsx\nimport * as React39 from \"react\";\nimport { jsx as jsx42, jsxs as jsxs29 } from \"react/jsx-runtime\";\nvar Accordion = React39.forwardRef(\n function Accordion2({ summary, className, children, ...rest }, ref) {\n return /* @__PURE__ */ jsxs29(\"details\", { ref, className: cx(\"accordion\", className), ...rest, children: [\n /* @__PURE__ */ jsx42(\"summary\", { children: summary }),\n /* @__PURE__ */ jsx42(\"div\", { className: \"accordion-body\", children })\n ] });\n }\n);\nvar AccordionGroup = React39.forwardRef(function AccordionGroup2({ className, ...rest }, ref) {\n return /* @__PURE__ */ jsx42(\"div\", { ref, className: cx(\"accordion-group\", className), ...rest });\n});\n\n// src/components/tooltip.ts\nfunction tooltip(label, placement) {\n return {\n \"data-tooltip\": label,\n ...placement ? { \"data-tooltip-placement\": placement } : {}\n };\n}\n\n// src/components/Prose.tsx\nimport * as React40 from \"react\";\nimport { jsx as jsx43 } from \"react/jsx-runtime\";\nvar Prose = React40.forwardRef(function Prose2({ variant = \"markdown\", html, className, children, ...rest }, ref) {\n const Tag = variant === \"preserved\" ? \"pre\" : \"div\";\n const cls = cx(\n variant === \"preserved\" ? \"preserved-text-body\" : \"markdown-body\",\n className\n );\n const htmlProps = html != null ? { dangerouslySetInnerHTML: { __html: html } } : {};\n return /* @__PURE__ */ jsx43(\n Tag,\n {\n ref,\n className: cls,\n ...htmlProps,\n ...rest,\n children: html != null ? void 0 : children\n }\n );\n});\n\n// src/components/Terminal.tsx\nimport * as React41 from \"react\";\nimport { jsx as jsx44, jsxs as jsxs30 } from \"react/jsx-runtime\";\nvar CodeSnippet = React41.forwardRef(\n function CodeSnippet2({ code, compact, className, children, ...rest }, ref) {\n return /* @__PURE__ */ jsx44(\n \"pre\",\n {\n ref,\n className: cx(\"code-snippet\", compact && \"code-snippet--compact\", className),\n ...rest,\n children: code ?? children\n }\n );\n }\n);\nvar Terminal = React41.forwardRef(\n function Terminal2({ bar = true, code, compact, className, children, ...rest }, ref) {\n return /* @__PURE__ */ jsxs30(\"div\", { ref, className: cx(\"terminal\", className), ...rest, children: [\n bar && /* @__PURE__ */ jsxs30(\"div\", { className: \"terminal-bar\", \"aria-hidden\": \"true\", children: [\n /* @__PURE__ */ jsx44(\"span\", {}),\n /* @__PURE__ */ jsx44(\"span\", {}),\n /* @__PURE__ */ jsx44(\"span\", {})\n ] }),\n /* @__PURE__ */ jsx44(\"pre\", { className: cx(\"code-snippet\", compact && \"code-snippet--compact\"), children: code ?? children })\n ] });\n }\n);\n\n// src/components/Section.tsx\nimport * as React42 from \"react\";\nimport { jsx as jsx45, jsxs as jsxs31 } from \"react/jsx-runtime\";\nvar Section = React42.forwardRef(\n function Section2({ title, mark, markSize = \"sm\", collapsible = true, className, children, open, ...rest }, ref) {\n const markEl = mark != null ? /* @__PURE__ */ jsx45(\"span\", { className: cx(\"section-mark\", markSize === \"lg\" && \"section-mark--lg\"), children: mark }) : null;\n if (!collapsible) {\n return /* @__PURE__ */ jsxs31(\n \"section\",\n {\n ref,\n className: cx(\"section\", className),\n children: [\n /* @__PURE__ */ jsxs31(\"div\", { className: \"section-title-row\", children: [\n markEl,\n /* @__PURE__ */ jsx45(\"h3\", { children: title })\n ] }),\n children\n ]\n }\n );\n }\n return /* @__PURE__ */ jsxs31(\n \"details\",\n {\n ref,\n className: cx(\"section\", className),\n open,\n ...rest,\n children: [\n /* @__PURE__ */ jsx45(\"summary\", { children: /* @__PURE__ */ jsxs31(\"span\", { className: \"section-title-row\", children: [\n markEl,\n /* @__PURE__ */ jsx45(\"h3\", { children: title })\n ] }) }),\n children\n ]\n }\n );\n }\n);\n\n// src/components/Dialog.tsx\nimport * as React43 from \"react\";\nimport { jsx as jsx46, jsxs as jsxs32 } from \"react/jsx-runtime\";\nvar Dialog = React43.forwardRef(\n function Dialog2({ open, onClose, closeOnBackdrop = true, className, children, ...rest }, ref) {\n const dialogRef = React43.useRef(null);\n React43.useImperativeHandle(ref, () => dialogRef.current);\n React43.useEffect(() => {\n const el = dialogRef.current;\n if (!el) return;\n if (open && !el.open) el.showModal();\n else if (!open && el.open) el.close();\n }, [open]);\n return /* @__PURE__ */ jsx46(\n \"dialog\",\n {\n ref: dialogRef,\n className: cx(\"dialog\", className),\n onClose: () => onClose?.(),\n onClick: (e) => {\n if (closeOnBackdrop && e.target === dialogRef.current) onClose?.();\n },\n ...rest,\n children\n }\n );\n }\n);\nfunction WelcomeDialog({\n open,\n onClose,\n logo,\n edition,\n title,\n lede,\n notices,\n ctaLabel = \"Get started\",\n onCta\n}) {\n return /* @__PURE__ */ jsx46(Dialog, { open, onClose, children: /* @__PURE__ */ jsxs32(\"div\", { className: \"welcome-dialog-inner\", children: [\n (logo != null || edition != null) && /* @__PURE__ */ jsxs32(\"div\", { className: \"welcome-dialog-head\", children: [\n typeof logo === \"string\" ? /* @__PURE__ */ jsx46(\"img\", { className: \"welcome-dialog-logo\", src: logo, alt: \"\" }) : logo,\n edition != null && /* @__PURE__ */ jsx46(\"span\", { className: \"welcome-dialog-edition-pill\", children: edition })\n ] }),\n /* @__PURE__ */ jsxs32(\"div\", { children: [\n /* @__PURE__ */ jsx46(\"h2\", { className: \"welcome-dialog-title\", children: title }),\n lede != null && /* @__PURE__ */ jsx46(\"p\", { className: \"welcome-dialog-lede\", children: lede })\n ] }),\n notices && notices.length > 0 && /* @__PURE__ */ jsx46(\"ul\", { className: \"welcome-dialog-notices\", children: notices.map((n, i) => /* @__PURE__ */ jsxs32(\"li\", { children: [\n n.label != null && /* @__PURE__ */ jsx46(\"span\", { className: \"welcome-dialog-notice-label\", children: n.label }),\n n.content\n ] }, i)) }),\n /* @__PURE__ */ jsx46(\"div\", { className: \"welcome-dialog-footer\", children: /* @__PURE__ */ jsx46(\n \"button\",\n {\n type: \"button\",\n className: \"welcome-dialog-cta\",\n onClick: () => onCta ? onCta() : onClose?.(),\n children: ctaLabel\n }\n ) })\n ] }) });\n}\nexport {\n Accordion,\n AccordionGroup,\n ActionCard,\n ActionCardCopy,\n ActionCardLabel,\n ActionCardLink,\n ActionCardPanel,\n ActionCardText,\n ActionCardTitle,\n ActionCardToggle,\n Alert,\n AuthForm,\n AuthPage,\n Avatar,\n AvatarStack,\n Badge,\n Breadcrumb,\n Button,\n Card,\n Checkbox,\n Chip,\n CodeBlock,\n CodeSnippet,\n ContextMenu,\n ContextMenuItem,\n ContextMenuSeparator,\n ControlRow,\n DescriptionList,\n Dialog,\n Dot,\n Drawer,\n EmptyState,\n EpicAccordion,\n Flyout,\n FlyoutItem,\n FlyoutSectionLabel,\n FlyoutSeparator,\n FormError,\n FormHelp,\n FormRow,\n Gallery,\n Input,\n Kbd,\n Label,\n Lane,\n LaneGrid,\n List,\n LoadingScreen,\n MediaCard,\n Modal,\n NavDialog,\n NavDialogTrigger,\n NumberField,\n PageShell,\n PageSidebar,\n PageSidebarBrand,\n PageSidebarFooter,\n PageSidebarHeader,\n PageSidebarNav,\n PageSidebarNavGroup,\n PageSidebarNavItem,\n PageSidebarNavSeparator,\n PageSidebarSearch,\n PageSidebarSection,\n Pagination,\n Panel,\n PanelHead,\n PanelLink,\n PanelLinks,\n PanelRow,\n PanelRows,\n PanelSection,\n Pill,\n Popover,\n Progress,\n Prose,\n Radio,\n Rating,\n SearchInput,\n Section,\n Segmented,\n Select,\n Separator,\n Skeleton,\n Sky,\n Slider,\n Spinner,\n StarChart,\n StarChartLegend,\n Starscape,\n Stepper,\n Switch,\n Tab,\n Table,\n Tabs,\n TagInput,\n Terminal,\n Textarea,\n ThemeSwitch,\n ThemeToggle,\n Topbar,\n TopbarBrand,\n TopbarNav,\n TopbarSpacer,\n WelcomeDialog,\n tooltip,\n useClickOutside,\n useContextMenu,\n useCopy,\n useDisclosure,\n useEscapeKey,\n useFullTurn,\n useGallery,\n useMotion,\n useNavDialog,\n useReveal,\n useScrollAware,\n useSky,\n useSkyHero,\n useStarCharts,\n useStepper,\n useTheme,\n useTooltipPlacement\n};\n//# sourceMappingURL=index.js.map","// The type controls' preferences: the primary font, a font per category\n// (headings, controls, labels, badges) and a text size, saved under\n// orbit_font_preferences. index.html's pre-paint script applies the saved\n// ones before the first frame, so the key and its shape stay as they are:\n// { control, heading, label, badge, site, userScale }.\n\nexport const FONT_STORAGE_KEY = \"orbit_font_preferences\";\nexport const FONT_CHANGE_EVENT = \"orbit:font-preference-change\";\n\n// Mona Sans, Starscape's own type, is the default for the site and every\n// category. The site font drives global font metrics such as size, spacing,\n// and line-height.\nexport const DEFAULT_SITE_FONT = \"monaSans\";\nconst DEFAULT_USER_SCALE = 1;\nexport const USER_SCALE_MIN = 0.85;\nexport const USER_SCALE_MAX = 1.3;\nexport const USER_SCALE_STEP = 0.05;\n\nexport const FONT_OPTIONS = {\n monaSans: { label: \"Mona Sans\", stack: '\"Orbit Mona Sans\", \"Mona Sans\", system-ui, \"Segoe UI Variable\", \"Segoe UI\", Arial, sans-serif' },\n inter: { label: \"Inter\", stack: '\"Orbit Inter\", \"Inter\", \"Segoe UI Variable\", \"Segoe UI\", Arial, sans-serif' },\n openSans: { label: \"Open Sans\", stack: '\"Orbit Open Sans\", \"Open Sans\", \"Segoe UI Variable\", \"Segoe UI\", Arial, sans-serif' },\n jetBrainsMono: { label: \"JetBrains Mono\", stack: '\"Orbit JetBrains Mono\", \"JetBrains Mono\", \"Cascadia Mono\", \"SFMono-Regular\", Consolas, monospace' },\n chakraPetch: { label: \"Chakra Petch\", stack: '\"Orbit Chakra Petch\", \"Chakra Petch\", \"Segoe UI Variable\", \"Segoe UI\", Arial, sans-serif' },\n orbitron: { label: \"Orbitron\", stack: '\"Orbit Orbitron\", \"Orbitron\", \"Segoe UI Variable\", \"Segoe UI\", Arial, sans-serif' },\n rajdhani: { label: \"Rajdhani\", stack: '\"Orbit Rajdhani\", \"Rajdhani\", \"Segoe UI Variable\", \"Segoe UI\", Arial, sans-serif' },\n runescapeUF: { label: \"Runescape UF\", stack: '\"Orbit Runescape UF\", \"Cascadia Mono\", monospace' },\n openRing: { label: \"Open Ring\", stack: '\"Orbit Open Ring\", \"Segoe UI Variable\", \"Segoe UI\", Arial, sans-serif' }\n} as const;\n\nexport type FontId = keyof typeof FONT_OPTIONS;\nexport const FONT_IDS = Object.keys(FONT_OPTIONS) as FontId[];\n\nexport const SITE_FONT_OPTIONS: readonly FontId[] = [\"monaSans\", \"inter\", \"openSans\", \"jetBrainsMono\", \"chakraPetch\", \"orbitron\", \"rajdhani\", \"runescapeUF\", \"openRing\"];\n\n// Per-category overrides shown in the Appearance grid. Body text is not a\n// target: it always follows the primary font (`site`), so it drives\n// --orbit-font-body directly in applyFontPreferences instead.\nexport const FONT_TARGETS = {\n heading: { label: \"Headings\", cssVar: \"--orbit-font-heading\", dataAttr: \"data-font-heading\" },\n control: { label: \"Controls\", cssVar: \"--orbit-font-control\", dataAttr: \"data-font-control\" },\n label: { label: \"Labels\", cssVar: \"--orbit-font-label\", dataAttr: \"data-font-label\" },\n badge: { label: \"Badges\", cssVar: \"--orbit-font-badge\", dataAttr: \"data-font-badge\" }\n} as const;\n\nexport type FontTarget = keyof typeof FONT_TARGETS;\nexport const FONT_TARGET_IDS = Object.keys(FONT_TARGETS) as FontTarget[];\n\nexport type FontPreferences = Record<FontTarget, FontId> & { site: FontId; userScale: number };\n\nconst DEFAULT_FONT_PREFERENCES: FontPreferences = {\n control: DEFAULT_SITE_FONT,\n heading: DEFAULT_SITE_FONT,\n label: DEFAULT_SITE_FONT,\n badge: DEFAULT_SITE_FONT,\n // Primary font: drives body text and the default for every override category.\n site: DEFAULT_SITE_FONT,\n // User size slider multiplier (drives --type-user-scale).\n userScale: DEFAULT_USER_SCALE\n};\n\nexport function isFontId(value: unknown): value is FontId {\n return typeof value === \"string\" && Object.hasOwn(FONT_OPTIONS, value);\n}\n\nexport function isFontTarget(value: unknown): value is FontTarget {\n return typeof value === \"string\" && Object.hasOwn(FONT_TARGETS, value);\n}\n\nfunction clampUserScale(value: unknown): number {\n const number = Number(value);\n if (!Number.isFinite(number)) return DEFAULT_USER_SCALE;\n return Math.min(USER_SCALE_MAX, Math.max(USER_SCALE_MIN, number));\n}\n\n// The defaults before Mona Sans. Every change in Appearance saved all five,\n// so a browser holding exactly these never chose them: it reads as unset and\n// gets today's defaults (its size stays). index.html's pre-paint script\n// carries the same check.\nconst OLD_DEFAULTS: Record<string, string> = { site: \"inter\", heading: \"orbitron\", control: \"inter\", label: \"inter\", badge: \"orbitron\" };\n\nfunction isOldDefaults(input: Record<string, unknown>): boolean {\n return Object.entries(OLD_DEFAULTS).every(([key, id]) => input[key] === id);\n}\n\nfunction normalizeFontPreferences(value: unknown): FontPreferences {\n const input: Record<string, unknown> = value && typeof value === \"object\" ? { ...value } : {};\n if (isOldDefaults(input)) {\n const normalized: FontPreferences = { ...DEFAULT_FONT_PREFERENCES };\n if (input.userScale !== undefined) normalized.userScale = clampUserScale(input.userScale);\n return normalized;\n }\n const normalized: FontPreferences = { ...DEFAULT_FONT_PREFERENCES };\n const explicit = new Set<FontTarget>();\n for (const key of FONT_TARGET_IDS) {\n const chosen = input[key];\n if (isFontId(chosen)) {\n normalized[key] = chosen;\n explicit.add(key);\n }\n }\n // Before \"control\" had its name, the same choice was saved as \"ui\".\n const legacyControl = input.ui;\n if (!explicit.has(\"control\") && isFontId(legacyControl)) normalized.control = legacyControl;\n if (isFontId(input.site)) normalized.site = input.site;\n if (input.userScale !== undefined) normalized.userScale = clampUserScale(input.userScale);\n // Before the split, one \"label\" target drove both categories. Preserve a\n // customized label choice for badges unless badge was saved separately.\n if (!Object.hasOwn(input, \"badge\") && Object.hasOwn(input, \"label\") && input.label !== \"inter\") {\n normalized.badge = normalized.label;\n }\n return normalized;\n}\n\nexport function storedFontPreferences(): FontPreferences {\n try {\n const raw = localStorage.getItem(FONT_STORAGE_KEY);\n if (!raw) return { ...DEFAULT_FONT_PREFERENCES };\n return normalizeFontPreferences(JSON.parse(raw));\n } catch {\n return { ...DEFAULT_FONT_PREFERENCES };\n }\n}\n\nfunction applyFontPreferences(preferences: FontPreferences): void {\n const root = document.documentElement;\n for (const target of FONT_TARGET_IDS) {\n const config = FONT_TARGETS[target];\n const optionId = preferences[target];\n root.style.setProperty(config.cssVar, FONT_OPTIONS[optionId].stack);\n root.setAttribute(config.dataAttr, optionId);\n }\n // Body text (paragraphs, card titles, long-form prose, editors) always tracks\n // the primary font rather than being an independent category.\n root.style.setProperty(\"--orbit-font-body\", FONT_OPTIONS[preferences.site].stack);\n // The only size lever is the Appearance slider; font family no longer changes size.\n root.style.setProperty(\"--type-user-scale\", String(preferences.userScale));\n root.setAttribute(\"data-font-site\", preferences.site);\n}\n\nfunction setFontPreferences(preferences: FontPreferences): FontPreferences {\n const normalized = normalizeFontPreferences(preferences);\n try {\n localStorage.setItem(FONT_STORAGE_KEY, JSON.stringify(normalized));\n } catch {\n // Blocked storage: the choice lasts this visit.\n }\n applyFontPreferences(normalized);\n dispatchEvent(new CustomEvent(FONT_CHANGE_EVENT, { detail: { preferences: normalized } }));\n return normalized;\n}\n\nexport function setFontPreference(target: FontTarget, optionId: FontId): FontPreferences {\n return setFontPreferences({ ...storedFontPreferences(), [target]: optionId });\n}\n\n/** Swaps the whole site to a primary font: every category follows it; overrides can be set again after. */\nexport function setSiteFont(optionId: FontId): FontPreferences {\n const next = { ...storedFontPreferences(), site: optionId };\n for (const target of FONT_TARGET_IDS) next[target] = optionId;\n return setFontPreferences(next);\n}\n\nexport function setUserScale(value: unknown): FontPreferences {\n return setFontPreferences({ ...storedFontPreferences(), userScale: clampUserScale(value) });\n}\n","// Settings > Appearance: the theme (the topbar's sun/moon button again),\n// reduced theme motion, and the type: text size, the primary font, and a\n// font per category. Theme and motion are @starlove/ui's preferences; the\n// type is Orbit's own (font-preference.ts).\n\nimport { useState } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport { useMotion, useTheme } from \"@starlove/ui-react\";\nimport { LABELS as THEME_LABELS, onPrefs } from \"@starlove/ui/prefs\";\nimport { toast } from \"../ui/toast.ts\";\nimport { Section } from \"./parts.tsx\";\nimport {\n FONT_IDS,\n FONT_OPTIONS,\n FONT_TARGET_IDS,\n FONT_TARGETS,\n SITE_FONT_OPTIONS,\n USER_SCALE_MAX,\n USER_SCALE_MIN,\n USER_SCALE_STEP,\n isFontId,\n setFontPreference,\n setSiteFont,\n setUserScale,\n storedFontPreferences\n} from \"./font-preference.ts\";\n\nfunction osPrefersReducedMotion(): boolean {\n try {\n return matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n } catch {\n return false;\n }\n}\n\n// Twinkling starfield for the motion toggle. Stars shimmer (CSS) while motion\n// is allowed and freeze when the button is pressed (reduced). Each star's\n// delay staggers its animation so the field reads as alive, not pulsing in unison.\nconst MOTION_STARS = [\n { cx: 6, cy: 7, r: 1.1, d: \"0s\" },\n { cx: 17.5, cy: 6, r: 1.5, d: \"0.5s\" },\n { cx: 12, cy: 12, r: 1, d: \"0.9s\" },\n { cx: 7.5, cy: 17, r: 1.4, d: \"0.25s\" },\n { cx: 18, cy: 16.5, r: 1.1, d: \"0.7s\" }\n];\n\nexport function AppearanceTab() {\n const theme = useTheme();\n const motion = useMotion();\n const dark = theme.resolved === \"dark\";\n const reduce = motion.resolved === \"reduce\";\n const sourceLabel = motion.mode === \"system\" ? `Using browser default (${osPrefersReducedMotion() ? \"reduced motion\" : \"motion allowed\"}).` : \"Using your saved preference.\";\n\n // @starlove/ui/prefs flips the theme on this same click (data-theme-toggle,\n // on the document, after this handler): say what it became once it has.\n const themeClicked = (): void => {\n const off = onPrefs(({ resolvedTheme }) => {\n off();\n toast.success(resolvedTheme === \"dark\" ? \"Dark theme enabled\" : \"Light theme enabled\");\n });\n setTimeout(off);\n };\n\n const motionClicked = (): void => {\n const next = !reduce;\n motion.setMode(next ? \"reduce\" : \"full\");\n toast.success(next ? \"Theme motion reduced\" : \"Theme motion enabled\");\n };\n\n return (\n <div className=\"settings-sheet\">\n <Section id=\"appearanceTheme\" title=\"Theme\">\n <div className=\"settings-toggle\">\n <button type=\"button\" className=\"topbar-btn topbar-ctl-shrink\" data-variant=\"theme\" data-theme-toggle=\"\" id=\"appearanceThemeToggle\" aria-label={dark ? THEME_LABELS.toLight : THEME_LABELS.toDark} onClick={themeClicked}>\n <svg className=\"topbar-icon\" data-icon=\"sun\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"5\" />\n <path d=\"M12 1v2m0 18v2M4.2 4.2l1.4 1.4m12.8 12.8l1.4 1.4M1 12h2m18 0h2M4.2 19.8l1.4-1.4M18.4 5.6l1.4-1.4\" />\n </svg>\n <svg className=\"topbar-icon\" data-icon=\"moon\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" aria-hidden=\"true\">\n <path d=\"M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z\" />\n </svg>\n </button>\n <span className=\"settings-toggle-text\">\n <span className=\"settings-row-title\" id=\"appearanceThemeLabel\">\n {dark ? \"Dark\" : \"Light\"}\n </span>\n <span className=\"description\">Tap to switch between the light and dark theme used across the app.</span>\n </span>\n </div>\n </Section>\n <Section id=\"appearanceMotion\" title=\"Motion\">\n <div className=\"settings-toggle\">\n <button type=\"button\" className=\"topbar-btn topbar-ctl-shrink motion-toggle\" data-variant=\"theme\" id=\"appearanceMotionToggle\" aria-pressed={reduce} aria-label=\"Toggle reduced theme motion\" onClick={motionClicked}>\n <svg className=\"topbar-icon motion-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" stroke=\"none\" aria-hidden=\"true\">\n {MOTION_STARS.map((s) => (\n <circle key={`${s.cx}:${s.cy}`} className=\"motion-star\" cx={s.cx} cy={s.cy} r={s.r} style={{ animationDelay: s.d }} />\n ))}\n </svg>\n </button>\n <span className=\"settings-toggle-text\">\n <span className=\"settings-row-title\">Reduce theme motion</span>\n <span className=\"description\">Turns off the animated starfield, meteors, and theme animations. {sourceLabel}</span>\n </span>\n </div>\n </Section>\n <TypeSection />\n </div>\n );\n}\n\n/** ss-ui's slider paints its fill from --value (0 to 100), set from min, max and value. */\nfunction sliderFill(value: number): CSSProperties & { \"--value\": string } {\n const span = USER_SCALE_MAX - USER_SCALE_MIN;\n const pct = span <= 0 ? 0 : ((value - USER_SCALE_MIN) / span) * 100;\n return { \"--value\": String(pct) };\n}\n\nfunction TypeSection() {\n // Seeded from what's saved once; each control saves and shows its choice.\n const [prefs, setPrefs] = useState(storedFontPreferences);\n\n return (\n <Section id=\"appearanceType\" title=\"Type\">\n <div className=\"settings-slider-row\">\n <span className=\"control-field-label\">Text size</span>\n <input\n type=\"range\"\n className=\"slider\"\n id=\"fontScaleSlider\"\n min={USER_SCALE_MIN}\n max={USER_SCALE_MAX}\n step={USER_SCALE_STEP}\n value={prefs.userScale}\n aria-label=\"Text size\"\n style={sliderFill(prefs.userScale)}\n onChange={(event) => setPrefs(setUserScale(event.currentTarget.value))}\n />\n <output id=\"fontScaleValue\" className=\"control-value\">\n {Math.round(prefs.userScale * 100)}%\n </output>\n </div>\n <div className=\"sheet-fields\">\n <label className=\"control-field\">\n <span className=\"control-field-label\">Primary font</span>\n <select\n className=\"select-chevron-field\"\n id=\"siteFontSelect\"\n value={prefs.site}\n onChange={(event) => {\n const id = event.currentTarget.value;\n if (!isFontId(id)) return;\n // A primary font resets every category to it.\n const next = setSiteFont(id);\n setPrefs(next);\n toast.success(`Primary font: ${FONT_OPTIONS[next.site].label}`);\n }}\n >\n {SITE_FONT_OPTIONS.map((id) => (\n <option key={id} value={id}>\n {FONT_OPTIONS[id].label}\n </option>\n ))}\n </select>\n </label>\n </div>\n <div className=\"sheet-fields\">\n <div className=\"control-grid\">\n {FONT_TARGET_IDS.map((target) => (\n <label key={target} className=\"control-field\">\n <span className=\"control-field-label\">{FONT_TARGETS[target].label}</span>\n <select\n className=\"select-chevron-field\"\n data-font-target={target}\n value={prefs[target]}\n onChange={(event) => {\n const id = event.currentTarget.value;\n if (isFontId(id)) setPrefs(setFontPreference(target, id));\n }}\n >\n {FONT_IDS.map((id) => (\n <option key={id} value={id}>\n {FONT_OPTIONS[id].label}\n </option>\n ))}\n </select>\n </label>\n ))}\n </div>\n </div>\n </Section>\n );\n}\n","// Settings > Card Archive: the board's archived cards, each with Restore (back\n// on the board) and Delete permanently (after a confirm). The list is read\n// when the tab opens and again whenever the board is read, so a card an agent\n// archives shows up here.\n\nimport { useEffect, useState } from \"react\";\nimport type { TicketView } from \"../../../src/core/views.ts\";\nimport { useBoard, useOrbit } from \"../orbit/context.tsx\";\nimport { DetailCard } from \"../ui/DetailCard.tsx\";\nimport { toast } from \"../ui/toast.ts\";\nimport { Section } from \"./parts.tsx\";\n\ntype Archive = { status: \"loading\" } | { status: \"loaded\"; tickets: TicketView[] } | { status: \"failed\"; message: string };\n\nexport function ArchiveTab() {\n const app = useOrbit();\n const boardId = useBoard((s) => s.boardId);\n const data = useBoard((s) => s.data);\n const [archive, setArchive] = useState<Archive>({ status: \"loading\" });\n // Bumped to read the list again after a restore or delete.\n const [reads, setReads] = useState(0);\n\n useEffect(() => {\n if (!boardId) return;\n let live = true;\n app.client.boards.archive(boardId).then(\n (result) => {\n if (live) setArchive({ status: \"loaded\", tickets: result.tickets });\n },\n (error: unknown) => {\n if (live) setArchive({ status: \"failed\", message: error instanceof Error && error.message ? error.message : \"unknown error\" });\n }\n );\n return () => {\n live = false;\n };\n }, [app, boardId, data, reads]);\n\n const restore = (ticket: TicketView): void => {\n void (async () => {\n await app.call(() => app.client.tickets.restore(ticket.id, app.hint()));\n toast.success(`Restored: ${ticket.title || \"card\"}`);\n // The board read again reads the list again too.\n await app.load();\n })().catch(() => undefined);\n };\n\n const remove = (ticket: TicketView): void => {\n const title = ticket.title || \"card\";\n if (!confirm(`Permanently delete \"${title}\"? This cannot be undone.`)) return;\n void (async () => {\n await app.call(() => app.client.tickets.remove(ticket.id, app.hint()));\n toast.removed(`Deleted: ${title}`);\n setReads((n) => n + 1);\n })().catch(() => undefined);\n };\n\n return (\n <div className=\"settings-sheet\">\n <Section id=\"archivedCards\" label=\"Archived cards\" lead=\"Archived cards are hidden from the board, search, and agents taking work. Restore puts a card back on the board; delete removes it for good.\">\n <div id=\"archiveList\">\n {archive.status === \"loading\" ? <p className=\"sheet-note\">Loading…</p> : null}\n {archive.status === \"failed\" ? <p className=\"sheet-note\">Could not load archive: {archive.message}</p> : null}\n {archive.status === \"loaded\" && archive.tickets.length === 0 ? <p className=\"sheet-note\">No archived cards yet. To archive one, press the trash icon at the top of its card.</p> : null}\n {archive.status === \"loaded\" && archive.tickets.length > 0 ? (\n <div className=\"detail-card-grid\">\n {archive.tickets.map((ticket) => (\n <DetailCard key={ticket.id} ticket={ticket} archive={{ onRestore: () => restore(ticket), onDelete: () => remove(ticket) }} />\n ))}\n </div>\n ) : null}\n </div>\n </Section>\n </div>\n );\n}\n","// Settings > Data: the version and updates, the board's name, its snapshot\n// (export, and import as a new board), then the two danger sections:\n// replacing it from a snapshot, and deleting it. Replacing and deleting each\n// wait for the board's slug to be typed back.\n\nimport { useState } from \"react\";\nimport type { ChangeEvent, SubmitEvent, ReactNode } from \"react\";\nimport type { ImportResult } from \"../../../src/core/snapshots.ts\";\nimport type { Board } from \"../../../src/core/model.ts\";\nimport { backUpAllBoards, importNotes } from \"../lib/board-export.ts\";\nimport type { OrbitApp } from \"../orbit/app.ts\";\nimport { useOrbit } from \"../orbit/context.tsx\";\nimport { downloadJson, toast } from \"../ui/toast.ts\";\nimport { CheckRow, CodeBlock, More, Section, copyText } from \"./parts.tsx\";\nimport { fetchVersionInfo, useVersionInfo } from \"./update-check.ts\";\n\n/** A chosen file's snapshot: an Orbit snapshot or a Trello board export, as JSON. */\nfunction parseImportSnapshotText(text: string): unknown {\n if (text.trimStart().startsWith(\"<\")) {\n throw new Error(\"That file looks like an HTML page instead of JSON. In Trello, use Export JSON/download the board JSON, not Save Page As.\");\n }\n try {\n return JSON.parse(text) as unknown;\n } catch (error) {\n throw new Error(error instanceof Error && error.message ? error.message : \"invalid JSON\");\n }\n}\n\n/** A failure's own words, or `fallback` when it has none. */\nfunction messageOr(error: unknown, fallback: string): string {\n return error instanceof Error && error.message ? error.message : fallback;\n}\n\n/** \" (12 cards)\" when the import counted its cards. */\nfunction cardCount(result: ImportResult): string {\n const tickets = Number(result.imported_counts.tickets);\n return Number.isFinite(tickets) ? ` (${tickets} cards)` : \"\";\n}\n\nasync function exportSnapshot(app: OrbitApp, board: Board, includeAttachments: boolean): Promise<void> {\n const snapshot = await app.call(() => app.client.boards.export(board.id, includeAttachments ? { include_attachments: true } : undefined));\n downloadJson(includeAttachments ? `${board.slug}.with-images.orbit.json` : `${board.slug}.orbit.json`, snapshot);\n}\n\n/** Imports a file as a new board and goes to it. */\nasync function importAsNewBoard(app: OrbitApp, board: Board, file: File): Promise<void> {\n const snapshot = parseImportSnapshotText(await file.text());\n const result = await app.client.boards.import({ snapshot, create_new: true, board_id: board.id });\n app.board.setState({ boardId: result.imported_board_id, boardSlug: result.imported_board_slug });\n await app.load();\n await app.navigate({ boardId: result.imported_board_id, view: \"board\" });\n toast.success(`${result.source_format === \"trello-board-export\" ? `Trello board imported as new board${cardCount(result)}` : \"Board imported as new board\"}${importNotes([result])}`);\n}\n\n/** Replaces this board from a file. */\nasync function replaceBoard(app: OrbitApp, board: Board, file: File): Promise<void> {\n const snapshot = parseImportSnapshotText(await file.text());\n const result = await app.client.boards.import({ snapshot, replace_existing: true, board_id: board.id });\n await app.load();\n toast.success(`${result.source_format === \"trello-board-export\" ? `Trello board replaced from Trello import${cardCount(result)}` : \"Board replaced from snapshot\"}${importNotes([result])}`);\n}\n\nexport function DataTab({ board }: { board: Board }) {\n const app = useOrbit();\n const [includeImages, setIncludeImages] = useState(false);\n const exportNow = (): Promise<void> => exportSnapshot(app, board, includeImages);\n\n const importAsNew = (event: ChangeEvent<HTMLInputElement>): void => {\n const input = event.currentTarget;\n const file = input.files?.[0];\n if (!file) return;\n importAsNewBoard(app, board, file)\n .catch((error: unknown) => toast.error(`Import failed: ${messageOr(error, \"invalid JSON\")}`))\n .finally(() => {\n input.value = \"\";\n });\n };\n\n return (\n <div className=\"settings-sheet\">\n <UpdateSection />\n\n <BoardRename board={board} />\n\n <Section id=\"boardSnapshot\" title=\"Snapshot\" lead=\"Saves this board as a file, or brings one in as a new board, leaving this one as it is. Import takes an Orbit snapshot or a Trello board's JSON export.\">\n <CheckRow id=\"exportProjectImages\" checked={includeImages} onChange={(event) => setIncludeImages(event.currentTarget.checked)} title=\"Include attached images\" />\n <div className=\"sheet-actions\">\n <button type=\"button\" data-variant=\"primary\" id=\"exportProject\" onClick={() => void exportNow().catch(() => undefined)}>\n Export\n </button>\n <ImportButton id=\"importSnapshotAsNew\" label=\"Import as new board\" onFile={importAsNew} />\n </div>\n </Section>\n\n <ReplaceBoard board={board} />\n\n <DeleteBoard key={board.id} board={board} exportNow={exportNow} />\n </div>\n );\n}\n\n/** A file input, hidden, and the button that opens it. */\nfunction ImportButton({ id, label, onFile, disabled: off, danger: red }: { id: string; label: string; onFile: (event: ChangeEvent<HTMLInputElement>) => void; disabled?: boolean; danger?: boolean }) {\n const disabled = off ?? false;\n const danger = red ?? false;\n return (\n <>\n <input type=\"file\" id={`${id}File`} className=\"import-file-input\" accept=\".orbit.json,.json,application/json\" disabled={disabled} onChange={onFile} />\n <button\n type=\"button\"\n data-variant=\"primary\"\n data-arc={danger ? \"danger\" : undefined}\n id={`${id}Button`}\n disabled={disabled}\n onClick={(event) => {\n const input = event.currentTarget.previousElementSibling;\n if (input instanceof HTMLInputElement && !input.disabled) input.click();\n }}\n >\n {label}\n </button>\n </>\n );\n}\n\nfunction BoardRename({ board }: { board: Board }) {\n const app = useOrbit();\n // What the person typed; null shows the board's name as Orbit has it.\n const [draft, setDraft] = useState<string | null>(null);\n\n const submit = (event: SubmitEvent<HTMLFormElement>): void => {\n event.preventDefault();\n const nextName = (draft ?? board.name).trim();\n if (!nextName || nextName === board.name) return;\n void (async () => {\n await app.call(() => app.client.boards.update(board.id, { name: nextName }));\n setDraft(null);\n await app.load();\n toast.success(`Renamed board to ${nextName}. Canonical slug unchanged: ${board.slug}`);\n })().catch(() => undefined);\n };\n\n return (\n <Section\n id=\"boardName\"\n title=\"Board name\"\n lead={\n <>\n Changes the name people see. The address keeps <strong>{board.slug}</strong>, so links to this board keep working.\n </>\n }\n >\n <form id=\"boardRenameForm\" className=\"sheet-inline-form\" onSubmit={submit}>\n <label className=\"control-field\">\n <span className=\"control-field-label\">Display name</span>\n <input name=\"name\" value={draft ?? board.name} maxLength={120} required onChange={(event) => setDraft(event.currentTarget.value)} />\n </label>\n <button type=\"submit\" data-variant=\"primary\">\n Rename board\n </button>\n </form>\n </Section>\n );\n}\n\nfunction ReplaceBoard({ board }: { board: Board }) {\n const app = useOrbit();\n const [typed, setTyped] = useState(\"\");\n const confirmed = typed.trim() === board.slug;\n\n const replace = (event: ChangeEvent<HTMLInputElement>): void => {\n const input = event.currentTarget;\n const file = input.files?.[0];\n if (!file) return;\n if (!confirmed) {\n toast.error(\"Type the board slug before replacing this board.\");\n input.value = \"\";\n return;\n }\n replaceBoard(app, board, file)\n .catch((error: unknown) => toast.error(`Import failed: ${messageOr(error, \"invalid JSON\")}`))\n .finally(() => {\n input.value = \"\";\n });\n };\n\n return (\n <Section\n id=\"replaceBoard\"\n title=\"Replace this board\"\n danger\n lead={\n <>\n Replaces everything on this board with a snapshot or a Trello export. Orbit backs it up first, as before any import. Type <strong>{board.slug}</strong> to turn this on.\n </>\n }\n >\n <div className=\"sheet-inline-form\">\n <label className=\"control-field\">\n <span className=\"control-field-label\">Board slug</span>\n <input id=\"replaceImportConfirmInput\" autoComplete=\"off\" spellCheck={false} placeholder={board.slug} value={typed} onChange={(event) => setTyped(event.currentTarget.value)} />\n </label>\n <ImportButton id=\"replaceCurrentBoardImport\" label=\"Replace this board…\" onFile={replace} disabled={!confirmed} danger />\n </div>\n </Section>\n );\n}\n\ntype DeleteStep = { step: \"idle\" } | { step: \"choice\" } | { step: \"confirm\"; exported: boolean };\n\nfunction DeleteBoard({ board, exportNow }: { board: Board; exportNow: () => Promise<void> }) {\n const app = useOrbit();\n const [state, setState] = useState<DeleteStep>({ step: \"idle\" });\n const [typed, setTyped] = useState(\"\");\n const cancel = (): void => {\n setState({ step: \"idle\" });\n setTyped(\"\");\n };\n\n const remove = (): void => {\n void (async () => {\n await app.call(() => app.client.boards.remove(board.id, { confirm_slug: board.slug, delete_files: true }));\n // The deleted board is gone: read whichever board Orbit opens now.\n app.board.setState({ boardId: \"\", boardSlug: \"\" });\n await app.load();\n toast.success(`Deleted board: ${board.name}`);\n await app.navigate({ boardId: app.board.getState().boardId, view: \"board\" }, { replace: true });\n })().catch(() => undefined);\n };\n\n const lead = \"Removes this board from Orbit. Without an exported snapshot, it can't be undone.\";\n\n if (state.step === \"choice\") {\n return (\n <Section id=\"deleteBoard\" title=\"Delete this board\" danger lead={lead}>\n <p className=\"sheet-lead\">Export a snapshot first if you may need this board again.</p>\n <div className=\"sheet-actions\">\n <button\n type=\"button\"\n data-variant=\"primary\"\n id=\"deleteBoardExportFirst\"\n onClick={() =>\n void exportNow().then(\n () => setState({ step: \"confirm\", exported: true }),\n () => undefined\n )\n }\n >\n Export first\n </button>\n <button type=\"button\" data-variant=\"primary\" data-arc=\"danger\" id=\"deleteBoardSkipExport\" onClick={() => setState({ step: \"confirm\", exported: false })}>\n Delete without exporting\n </button>\n <button type=\"button\" data-variant=\"ghost\" id=\"deleteBoardCancel\" onClick={cancel}>\n Cancel\n </button>\n </div>\n </Section>\n );\n }\n\n if (state.step === \"confirm\") {\n return (\n <Section id=\"deleteBoard\" title=\"Delete this board\" danger lead={lead}>\n <p className=\"sheet-lead\">\n {state.exported ? \"Snapshot exported. \" : \"\"}Type <strong>{board.slug}</strong> to delete this board for good.\n </p>\n <div className=\"sheet-inline-form\">\n <label className=\"control-field\">\n <span className=\"control-field-label\">Board slug</span>\n <input id=\"deleteBoardConfirmInput\" autoComplete=\"off\" spellCheck={false} placeholder={board.slug} autoFocus value={typed} onChange={(event) => setTyped(event.currentTarget.value)} />\n </label>\n <button type=\"button\" data-variant=\"primary\" data-arc=\"danger\" id=\"deleteBoardConfirm\" disabled={typed.trim() !== board.slug} onClick={remove}>\n Delete board permanently\n </button>\n <button type=\"button\" data-variant=\"ghost\" id=\"deleteBoardCancel\" onClick={cancel}>\n Cancel\n </button>\n </div>\n </Section>\n );\n }\n\n return (\n <Section id=\"deleteBoard\" title=\"Delete this board\" danger lead={lead}>\n <div className=\"sheet-actions\">\n <button type=\"button\" data-variant=\"primary\" data-arc=\"danger\" id=\"deleteBoardStart\" onClick={() => setState({ step: \"choice\" })}>\n Delete board…\n </button>\n </div>\n </Section>\n );\n}\n\nconst UPDATE_INSTRUCTIONS: Record<string, string> = {\n source: \"git pull\\npnpm install\\npnpm run build:bundle\\n# then restart Orbit\",\n docker: \"git pull\\ndocker compose build\\ndocker compose up -d\",\n dist: \"npm install -g @starlove/orbit@latest\\n# then restart Orbit\"\n};\n\nconst UPDATE_MODE_LABEL: Record<string, string> = {\n source: \"local / server\",\n docker: \"Docker\",\n dist: \"npm\"\n};\n\n/**\n * \"Version and updates\": the version this Orbit runs and whether a newer one\n * is out, from the check at start (update-check.ts). With no answer (a host\n * with no version check) or the checks turned off, it reads \"Not checked\".\n * The new version takes the accent when an update is out, so it reads at a\n * glance.\n */\nfunction UpdateSection() {\n const app = useOrbit();\n const info = useVersionInfo();\n const [checking, setChecking] = useState(false);\n const [backingUp, setBackingUp] = useState(false);\n const [updating, setUpdating] = useState(false);\n const mode = info?.deployMode || \"source\";\n const available = Boolean(info?.updateAvailable);\n const current = info?.current ? `v${info.current}` : \"unknown\";\n const showSelfUpdate = Boolean(info?.selfUpdate && available);\n const commands = UPDATE_INSTRUCTIONS[mode] ?? UPDATE_INSTRUCTIONS.source ?? \"\";\n\n const checkNow = (): void => {\n setChecking(true);\n void fetchVersionInfo(app, { force: true }).finally(() => setChecking(false));\n };\n\n const backUp = (): void => {\n setBackingUp(true);\n backUpAllBoards(app)\n .catch((error: unknown) => toast.error(`Backup failed: ${messageOr(error, \"request failed\")}`))\n .finally(() => setBackingUp(false));\n };\n\n const copyCommands = (): void => {\n copyText(commands).then(\n () => toast.success(\"Update commands copied\"),\n () => toast.error(\"Couldn't copy. Select the commands and copy them yourself.\")\n );\n };\n\n const updateNow = (): void => {\n if (!confirm(\"Update Orbit now? It will pull the latest code, rebuild, and restart. Back up your boards first.\")) return;\n setUpdating(true);\n app.client.update().then(\n () => toast.success(\"Update started. Orbit will restart shortly; reload in a minute.\", { duration: 9000 }),\n (error: unknown) => {\n toast.error(`Update failed to start: ${messageOr(error, \"request failed\")}`);\n setUpdating(false);\n }\n );\n };\n\n let chip: ReactNode;\n let statusLine: string;\n // Checks off (ORBIT_UPDATE_CHECK=0) or no answer: nothing was checked, so nothing is claimed.\n if (!info?.enabled) {\n chip = <span className=\"update-status-chip update-status-chip--idle\">Not checked</span>;\n statusLine = \"Check whether a newer version of Orbit has shipped.\";\n } else if (info.error) {\n chip = <span className=\"update-status-chip update-status-chip--warn\">Couldn't check</span>;\n statusLine = `Couldn't reach GitHub (${info.error}). Try again in a moment.`;\n } else if (available) {\n chip = (\n <span className=\"update-status-chip update-status-chip--available\">\n <span className=\"update-status-dot\" aria-hidden=\"true\" />\n Update available\n </span>\n );\n statusLine = \"Back up your boards, then update with the steps below.\";\n } else {\n chip = (\n <span className=\"update-status-chip update-status-chip--current\">\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fillRule=\"evenodd\" d=\"M16.7 5.3a1 1 0 0 1 0 1.4l-7.5 7.5a1 1 0 0 1-1.4 0L4.3 10.7a1 1 0 1 1 1.4-1.4l2.8 2.8 6.8-6.8a1 1 0 0 1 1.4 0z\" clipRule=\"evenodd\" />\n </svg>{\" \"}\n Up to date\n </span>\n );\n statusLine = \"You have the latest version of Orbit.\";\n }\n\n return (\n <Section id=\"versionUpdates\" title=\"Version and updates\">\n <p className=\"sheet-version\">\n <span>{current}</span>\n {available && info?.latest ? (\n <>\n {\" \"}\n <span className=\"sheet-version-arrow\" aria-hidden=\"true\">\n →\n </span>{\" \"}\n <span className=\"sheet-version-next\">v{info.latest}</span>\n </>\n ) : null}{\" \"}\n {chip}\n </p>\n <p className=\"sheet-lead\" id=\"updateStatusLine\">\n {statusLine}\n </p>\n <div className=\"sheet-actions\">\n <button type=\"button\" data-variant={available ? \"secondary\" : \"primary\"} id=\"updateCheckNow\" disabled={checking} onClick={checkNow}>\n {checking ? \"Checking…\" : \"Check now\"}\n </button>\n <button type=\"button\" data-variant=\"secondary\" id=\"updateBackupBoards\" disabled={backingUp} onClick={backUp}>\n {backingUp ? \"Backing up…\" : \"Back up all boards\"}\n </button>\n {showSelfUpdate ? (\n <button type=\"button\" data-variant=\"primary\" id=\"updateRunNow\" disabled={updating} onClick={updateNow}>\n {updating ? \"Updating…\" : \"Update now\"}\n </button>\n ) : null}\n </div>\n {available ? (\n <More\n open\n title={\n <>\n How to update <span className=\"sheet-mode\">{UPDATE_MODE_LABEL[mode] ?? mode}</span>\n </>\n }\n >\n <CodeBlock text={commands} what=\"the update commands\" onCopy={copyCommands} copyAttrs={{ id: \"updateCopyCommands\" }} codeAttrs={{ id: \"updateCommands\" }} />\n {info?.changesUrl ? (\n <p className=\"sheet-lead\">\n <a href={info.changesUrl} target=\"_blank\" rel=\"noopener\">\n View changes ↗\n </a>\n </p>\n ) : null}\n </More>\n ) : null}\n </Section>\n );\n}\n","// Settings > Journal: the board's decisions and lessons, which agents read\n// as its memory. A struck entry stays listed here and leaves agents' context;\n// Strike and Restore move it, and a struck entry can be deleted for good after\n// one inline question (only a person deletes; an agent can only strike). The\n// form adds an entry.\n\nimport { useEffect, useRef, useState } from \"react\";\nimport type { KeyboardEvent, SubmitEvent } from \"react\";\nimport type { BoardEntry } from \"../../../src/core/model.ts\";\nimport { formatDate } from \"../lib/format.ts\";\nimport { useBoard, useCurrentBoard, useOrbit } from \"../orbit/context.tsx\";\nimport { toast } from \"../ui/toast.ts\";\nimport { Section } from \"./parts.tsx\";\nimport { useShallow } from \"zustand/shallow\";\n\nexport function JournalTab() {\n const app = useOrbit();\n const board = useCurrentBoard();\n const entries = useBoard(useShallow((s) => (s.data?.board_entries ?? []).filter((entry) => entry.board_id === s.boardId)));\n const aiEnabled = board?.ai_enabled !== 0;\n\n const toggleStruck = (entry: BoardEntry): void => {\n const struck = Boolean(entry.struck_at);\n void (async () => {\n await app.call(() => app.client.entries.update(entry.id, { struck: !struck }, app.hint()));\n await app.load();\n toast.info(struck ? \"Project entry restored\" : \"Project entry struck\");\n })().catch(() => undefined);\n };\n\n const remove = (entry: BoardEntry): void => {\n void (async () => {\n await app.call(() => app.client.entries.remove(entry.id, app.hint()));\n await app.load();\n toast.success(\"Project entry deleted\");\n })().catch(() => undefined);\n };\n\n const add = (event: SubmitEvent<HTMLFormElement>): void => {\n event.preventDefault();\n if (!board) return;\n const form = event.currentTarget;\n const fields = Object.fromEntries(new FormData(form).entries());\n void (async () => {\n await app.call(() => app.client.entries.create(board.id, fields));\n form.reset();\n await app.load();\n toast.success(\"Project entry added\");\n })().catch(() => undefined);\n };\n\n return (\n <div className=\"settings-sheet\">\n <Section id=\"journalEntries\" title=\"Journal\" lead={aiEnabled ? \"Decisions to follow and lessons to apply: agents read them as this board's memory. A struck entry stays here and leaves their context.\" : undefined}>\n <div className=\"sheet-entries\">{entries.length ? entries.map((entry) => <Entry key={entry.id} entry={entry} aiEnabled={aiEnabled} onToggleStruck={() => toggleStruck(entry)} onDelete={() => remove(entry)} />) : <p className=\"sheet-note\">No entries yet.</p>}</div>\n </Section>\n <Section id=\"journalAdd\" title=\"Add an entry\">\n <form id=\"projectEntryForm\" className=\"sheet-form\" onSubmit={add}>\n <label className=\"control-field\">\n <span className=\"control-field-label\">Type</span>\n <select name=\"type\" className=\"select-chevron-field\" defaultValue=\"decision\">\n <option value=\"decision\">Decision</option>\n <option value=\"lesson\">Lesson</option>\n </select>\n </label>\n <label className=\"control-field\">\n <span className=\"control-field-label\">Title</span>\n <input name=\"title\" placeholder=\"Entry title...\" required />\n </label>\n <label className=\"control-field\">\n <span className=\"control-field-label\">What to do</span>\n <textarea name=\"body\" rows={3} placeholder=\"Decision rationale or lesson: do X instead of Y when working with Z.\" required />\n </label>\n <div className=\"sheet-actions\">\n <button type=\"submit\" data-variant=\"primary\">\n Add entry\n </button>\n </div>\n </form>\n </Section>\n </div>\n );\n}\n\ninterface EntryProps {\n entry: BoardEntry;\n aiEnabled: boolean;\n onToggleStruck: () => void;\n onDelete: () => void;\n}\n\n/** Where a struck entry's Delete is: asking, or back after a Cancel (focus returns to Delete). */\ntype DeleteStep = \"idle\" | \"asking\" | \"cancelled\";\n\nfunction Entry({ entry, aiEnabled, onToggleStruck, onDelete }: EntryProps) {\n const isStruck = Boolean(entry.struck_at);\n const showStruckState = aiEnabled && isStruck;\n const [step, setStep] = useState<DeleteStep>(\"idle\");\n const deleteButton = useRef<HTMLButtonElement>(null);\n const cancelButton = useRef<HTMLButtonElement>(null);\n // The question takes focus on its safe answer; a Cancel gives it back to Delete.\n useEffect(() => {\n if (step === \"asking\") cancelButton.current?.focus();\n else if (step === \"cancelled\") deleteButton.current?.focus();\n }, [step]);\n const asking = step === \"asking\" && showStruckState;\n const questionId = `entryDeleteQuestion-${entry.id}`;\n const keyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\n if (event.key !== \"Escape\") return;\n // Escape answers the question only, not the drawer around it.\n event.preventDefault();\n event.stopPropagation();\n setStep(\"cancelled\");\n };\n return (\n <div className={`comment project-entry ${entry.type}${showStruckState ? \" is-struck\" : \"\"}`}>\n <div className=\"comment-head\">\n <div className=\"comment-head-main\">\n <div className=\"comment-head-title\">\n <span className={`entry-type-pill ${entry.type}`}>{entry.type}</span>\n <strong className=\"entry-title\">{entry.title}</strong>\n </div>\n {showStruckState ? <span className=\"project-entry-status\">Excluded from agent context</span> : null}\n </div>\n </div>\n <div className=\"comment-body\">{entry.body}</div>\n <div className=\"comment-footer\">\n <span className=\"comment-footer-meta\">\n {entry.created_by} · {formatDate(entry.created_at)}\n </span>\n {asking ? (\n <div className=\"project-entry-actions project-entry-confirm\" role=\"group\" aria-labelledby={questionId} onKeyDown={keyDown}>\n <span className=\"project-entry-question\" id={questionId}>\n Delete this entry for good?\n </span>\n <button type=\"button\" data-variant=\"ghost\" className=\"project-entry-delete detail-action-btn\" data-entry-action=\"confirm-delete\" data-entry-id={entry.id} onClick={onDelete}>\n Delete entry\n </button>\n <button ref={cancelButton} type=\"button\" data-variant=\"ghost\" className=\"detail-action-btn\" data-entry-action=\"cancel-delete\" onClick={() => setStep(\"cancelled\")}>\n Cancel\n </button>\n </div>\n ) : aiEnabled ? (\n <div className=\"project-entry-actions\">\n {isStruck ? (\n <button ref={deleteButton} type=\"button\" data-variant=\"ghost\" className=\"project-entry-delete detail-action-btn\" data-entry-action=\"delete\" data-entry-id={entry.id} onClick={() => setStep(\"asking\")}>\n Delete\n </button>\n ) : null}\n <button type=\"button\" data-variant=\"ghost\" className=\"project-entry-strike detail-action-btn\" data-entry-action=\"toggle-struck\" data-entry-id={entry.id} data-struck={isStruck ? \"true\" : \"false\"} aria-pressed={isStruck} onClick={onToggleStruck}>\n {isStruck ? \"Restore\" : \"Strike\"}\n </button>\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n","// Settings > Lanes: the priority switch, then each lane (move it left or\n// right, rename it, make it where new cards land, delete it) and a form to\n// add one. A lane's name being typed is its row's own draft: a live change\n// to the lanes shows once the person leaves the field.\n\nimport { useRef, useState } from \"react\";\nimport type { SubmitEvent } from \"react\";\nimport type { State } from \"../../../src/core/model.ts\";\nimport { useBoardStates, useBoardTickets, useCurrentBoard, useOrbit, useUi } from \"../orbit/context.tsx\";\nimport { CloseIcon } from \"../ui/icons.tsx\";\nimport { toast } from \"../ui/toast.ts\";\nimport { CheckRow, Section } from \"./parts.tsx\";\n\n// In Progress and Review are core kanban lanes, undeletable regardless of\n// AI. AI Ready is only locked while AI is enabled; disabling AI hides it from\n// the board without moving its cards.\nconst CORE_LANE_ROLES = new Set([\"in_progress\", \"review\"]);\n\n/**\n * Why a lane can't be deleted, or null when it can: it has cards (they'd be\n * orphaned), it's where new cards land (a board keeps exactly one), it's a\n * core kanban lane, or it's AI Ready while AI is on.\n */\nfunction deleteBlock(lane: State, count: number, aiEnabled: boolean): string | null {\n if (count > 0) return `Can't delete: ${count} card${count === 1 ? \"\" : \"s\"} in this lane`;\n if (lane.is_default) return \"Can't delete: new cards land here (choose another lane for them first)\";\n if (lane.role && CORE_LANE_ROLES.has(lane.role)) return \"Can't delete: a core kanban lane\";\n if (aiEnabled && lane.role === \"ai_ready\") return \"Can't delete: agents need it while AI is on\";\n return null;\n}\n\nexport function LanesTab() {\n const app = useOrbit();\n const board = useCurrentBoard();\n const lanes = useBoardStates();\n const tickets = useBoardTickets();\n const showPriority = useUi((s) => s.showPriority);\n // The lane just chosen for new cards, shown as chosen until the board reads it back.\n const [pendingDefault, setPendingDefault] = useState<string | null>(null);\n const aiEnabled = board?.ai_enabled !== 0;\n const counts = new Map<string, number>();\n for (const ticket of tickets) counts.set(ticket.state_id, (counts.get(ticket.state_id) ?? 0) + 1);\n const defaultId = pendingDefault ?? lanes.find((lane) => lane.is_default)?.id ?? \"\";\n\n const updateLane = async (lane: State, name: string, isDefault: boolean): Promise<void> => {\n await app.call(() => app.client.states.update(lane.id, { name, is_default: isDefault }, app.hint()));\n await app.load();\n };\n\n const rename = async (lane: State, name: string): Promise<void> => {\n await updateLane(lane, name, lane.id === defaultId);\n toast.success(\"Lane updated\");\n };\n\n // Radio-style: one lane is always the default. Pressing the current default\n // does nothing; to move it, press another lane. New cards always have\n // somewhere to land.\n const makeDefault = (lane: State, name: string): void => {\n if (lane.id === defaultId) return;\n setPendingDefault(lane.id);\n updateLane(lane, name, true).then(\n () => toast.success(\"Default lane updated\"),\n () => undefined\n ).finally(() => setPendingDefault(null));\n };\n\n const move = (lane: State, step: -1 | 1): void => {\n if (!board) return;\n const ids = lanes.map((l) => l.id);\n const index = ids.indexOf(lane.id);\n const swapWith = index + step;\n const other = ids[swapWith];\n if (index < 0 || other === undefined) return;\n ids[swapWith] = lane.id;\n ids[index] = other;\n void (async () => {\n await app.call(() => app.client.states.reorder(board.id, { state_ids: ids }));\n await app.load();\n toast.success(\"Lanes reordered\");\n })().catch(() => undefined);\n };\n\n const remove = (lane: State): void => {\n void (async () => {\n await app.call(() => app.client.states.remove(lane.id, app.hint()));\n await app.load();\n toast.success(\"Lane deleted\");\n })().catch(() => undefined);\n };\n\n const create = (event: SubmitEvent<HTMLFormElement>): void => {\n event.preventDefault();\n if (!board) return;\n const form = event.currentTarget;\n const name = new FormData(form).get(\"name\");\n void (async () => {\n await app.call(() => app.client.states.create(board.id, { name }));\n form.reset();\n await app.load();\n toast.success(\"Lane added\");\n })().catch(() => undefined);\n };\n\n return (\n <div className=\"settings-sheet\">\n <Section id=\"cardPriority\" label=\"Priority on cards\">\n <CheckRow id=\"showPriorityToggle\" withFor checked={showPriority} onChange={(event) => app.setShowPriority(event.currentTarget.checked)} title=\"Show priority label on cards\" />\n </Section>\n <Section id=\"boardLanes\" title=\"Lanes\" lead=\"Rename, reorder, add or remove lanes, and choose where new cards land.\">\n <div className=\"lane-list\">\n {lanes.map((lane, index) => (\n <LaneRow\n key={lane.id}\n lane={lane}\n first={index === 0}\n last={index === lanes.length - 1}\n isDefault={lane.id === defaultId}\n deleteBlocked={deleteBlock({ ...lane, is_default: lane.id === defaultId ? 1 : 0 }, counts.get(lane.id) ?? 0, aiEnabled)}\n onMove={(step) => move(lane, step)}\n onRename={(name) => rename(lane, name)}\n onMakeDefault={(name) => makeDefault(lane, name)}\n onDelete={() => remove(lane)}\n />\n ))}\n </div>\n <form id=\"laneCreateForm\" className=\"lane-create-form\" onSubmit={create}>\n <input name=\"name\" placeholder=\"New lane name...\" aria-label=\"New lane name\" required />\n <button type=\"submit\" data-variant=\"primary\">\n Add lane\n </button>\n </form>\n </Section>\n </div>\n );\n}\n\ninterface LaneRowProps {\n lane: State;\n first: boolean;\n last: boolean;\n isDefault: boolean;\n deleteBlocked: string | null;\n onMove: (step: -1 | 1) => void;\n onRename: (name: string) => Promise<void>;\n onMakeDefault: (name: string) => void;\n onDelete: () => void;\n}\n\nfunction LaneRow({ lane, first, last, isDefault, deleteBlocked, onMove, onRename, onMakeDefault, onDelete }: LaneRowProps) {\n // What the person is typing; null shows the lane's saved name.\n const [draft, setDraft] = useState<string | null>(null);\n // The name being saved, so Enter and the blur after it save once.\n const saving = useRef<string | null>(null);\n const isAiReady = lane.role === \"ai_ready\";\n\n // A text field's change: on Enter, or on leaving it with its text changed.\n const commit = (): void => {\n if (draft === null || draft === saving.current) return;\n if (draft === lane.name) {\n setDraft(null);\n return;\n }\n const name = draft;\n saving.current = name;\n onRename(name)\n .catch(() => undefined)\n .finally(() => {\n saving.current = null;\n setDraft((now) => (now === name ? null : now));\n });\n };\n\n return (\n <div className={`lane-row${isAiReady ? \" lane-row--locked\" : \"\"}`} data-lane-id={lane.id}>\n <button type=\"button\" data-variant=\"ghost\" className=\"settings-lane-icon-btn\" data-lane-action=\"up\" disabled={first} title=\"Move lane left\" aria-label=\"Move lane left\" onClick={() => onMove(-1)}>\n ↑\n </button>\n <button type=\"button\" data-variant=\"ghost\" className=\"settings-lane-icon-btn\" data-lane-action=\"down\" disabled={last} title=\"Move lane right\" aria-label=\"Move lane right\" onClick={() => onMove(1)}>\n ↓\n </button>\n <input\n name=\"name\"\n value={draft ?? lane.name}\n aria-label=\"Lane name\"\n readOnly={isAiReady}\n title={isAiReady ? \"The AI Ready lane keeps its name. Turn AI off to hide it.\" : undefined}\n onChange={(event) => setDraft(event.currentTarget.value)}\n onBlur={commit}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") commit();\n }}\n />\n <button\n type=\"button\"\n data-variant={isDefault ? \"secondary\" : \"ghost\"}\n className={`settings-lane-new-toggle${isDefault ? \" is-on\" : \"\"}`}\n data-lane-action=\"toggle-default\"\n aria-pressed={isDefault}\n title={isDefault ? \"New cards land here. Click another lane to move it.\" : \"Make this the default lane for new cards\"}\n aria-label=\"Default lane for new cards\"\n onClick={() => onMakeDefault(draft ?? lane.name)}\n >\n <span className=\"lane-new-sun\" aria-hidden=\"true\" />\n <span className=\"lane-new-label\">New cards</span>\n </button>\n <button type=\"button\" data-variant=\"ghost\" className=\"settings-lane-delete-btn danger-button\" data-lane-action=\"delete\" disabled={deleteBlocked !== null} title={deleteBlocked ?? \"Delete lane\"} aria-label=\"Delete lane\" onClick={onDelete}>\n <CloseIcon />\n </button>\n </div>\n );\n}\n","// Settings > Notes: Notes For You, the board's notes for its people (agents\n// never see them), read as text; \"Edit notes\" or a click on them edits in\n// place; a live change to the notes shows once the person leaves the editor.\n\nimport { cleanText, escapeHtml, renderPreservedText } from \"../lib/format.ts\";\nimport { useCurrentBoard, useOrbit } from \"../orbit/context.tsx\";\nimport { EditableTextView, useEditableText } from \"../ui/EditableText.tsx\";\nimport { toast } from \"../ui/toast.ts\";\nimport { Section } from \"./parts.tsx\";\n\nconst NOTES_PLACEHOLDER = \"Reminders for yourself. Agents can't see these notes.\";\n\nexport function NotesTab() {\n const app = useOrbit();\n const board = useCurrentBoard();\n const notes = board?.project_notes ?? \"\";\n const boardId = board?.id ?? \"\";\n const field = useEditableText({\n value: notes,\n fieldName: \"project_notes\",\n multiline: true,\n ariaLabel: \"Edit Notes For You\",\n onCommit: async (next) => {\n if (!boardId) return;\n try {\n await app.call(() => app.client.boards.update(boardId, { project_notes: cleanText(next) }));\n await app.load();\n toast.success(\"Saved\");\n } catch {\n // Said in a toast already.\n }\n }\n });\n const hasNotes = Boolean(notes.trim());\n\n return (\n <div className=\"settings-sheet\">\n <Section id=\"notesForYou\" label=\"Notes For You\">\n <div className=\"inline-md-field\">\n <EditableTextView\n field={field}\n noun=\"notes\"\n has={hasNotes}\n fieldName=\"project_notes\"\n lead={<p className=\"sheet-lead\">Reminders for the people on this board. Agents can't see them.</p>}\n html={hasNotes ? renderPreservedText(notes) : escapeHtml(NOTES_PLACEHOLDER)}\n bodyClassName={`inline-md-field-body preserved-text-body editable-field settings-notes-body${hasNotes ? \"\" : \" is-placeholder\"}`}\n />\n </div>\n </Section>\n </div>\n );\n}\n","// Settings, in the drawer: a tab strip (Lanes, Appearance, Card Archive,\n// Notes, Journal, AI on a computer's Orbit, Data) over the chosen tab. The\n// tab is in the address (#/b/<slug>/settings/<tab>); pressing one goes there.\n\nimport { features } from \"../config.ts\";\nimport type { SettingsTab } from \"../lib/routes.ts\";\nimport { useCurrentBoard, useOrbit, useUi } from \"../orbit/context.tsx\";\nimport { DrawerShell } from \"../drawer/Drawer.tsx\";\nimport type { DrawerTab } from \"../drawer/Drawer.tsx\";\nimport { AiTab } from \"./AiTab.tsx\";\nimport { AppearanceTab } from \"./AppearanceTab.tsx\";\nimport { ArchiveTab } from \"./ArchiveTab.tsx\";\nimport { DataTab } from \"./DataTab.tsx\";\nimport { JournalTab } from \"./JournalTab.tsx\";\nimport { LanesTab } from \"./LanesTab.tsx\";\nimport { NotesTab } from \"./NotesTab.tsx\";\n\nconst TABS: (DrawerTab & { id: SettingsTab })[] = [\n { id: \"lanes\", label: \"Lanes\" },\n { id: \"appearance\", label: \"Appearance\" },\n { id: \"archive\", label: \"Card Archive\" },\n { id: \"notes\", label: \"Notes\" },\n { id: \"journal\", label: \"Journal\" },\n ...(features.ai ? [{ id: \"ai\" as const, label: \"AI\" }] : []),\n { id: \"data\", label: \"Data\" }\n];\n\nexport function SettingsPanel() {\n const app = useOrbit();\n const board = useCurrentBoard();\n const routeTab = useUi((s) => s.route.tab);\n const savedTab = useUi((s) => s.settingsTab);\n const asked = routeTab || savedTab;\n // AI has no tab where agents can't connect (the browser edition).\n const tab: SettingsTab = asked === \"ai\" && !features.ai ? \"lanes\" : asked;\n\n return (\n <DrawerShell\n titleBlock={<h2 className=\"drawer-eyebrow\">SETTINGS</h2>}\n tabs={TABS}\n activeTab={tab}\n onTabSelect={(id) => {\n const next = TABS.find((t) => t.id === id);\n if (next) void app.openSettings(next.id);\n }}\n >\n {board ? <TabBody key={board.id} tab={tab} /> : null}\n </DrawerShell>\n );\n}\n\nfunction TabBody({ tab }: { tab: SettingsTab }) {\n const board = useCurrentBoard();\n if (!board) return null;\n switch (tab) {\n case \"lanes\":\n return <LanesTab />;\n case \"appearance\":\n return <AppearanceTab />;\n case \"archive\":\n return <ArchiveTab />;\n case \"notes\":\n return <NotesTab />;\n case \"journal\":\n return <JournalTab />;\n case \"ai\":\n return <AiTab board={board} />;\n case \"data\":\n return <DataTab board={board} />;\n }\n}\n"],"ignoreList":[3,4,5,6,7,8,9,10,11,12,13,14,15],"mappings":"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"}