@storyshelf/core 0.3.2 → 0.5.3

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 (393) hide show
  1. package/README.md +38 -31
  2. package/dist/adapter/capture-queue.d.mts +29 -1
  3. package/dist/adapter/capture-runner.d.mts +18 -2
  4. package/dist/adapter/capture-runner.mjs +12 -1
  5. package/dist/adapter/capture-runner.mjs.map +1 -0
  6. package/dist/adapter/database.d.mts +67 -17
  7. package/dist/adapter/database.mjs +22 -55
  8. package/dist/adapter/database.mjs.map +1 -1
  9. package/dist/adapter/email-sender.d.mts +27 -0
  10. package/dist/adapter/email-sender.mjs +4 -0
  11. package/dist/adapter/metadata.d.mts +21 -15
  12. package/dist/adapter/notifier.d.mts +7 -0
  13. package/dist/adapter/notifier.mjs +6 -0
  14. package/dist/adapter/setup.d.mts +61 -0
  15. package/dist/adapter/setup.mjs +29 -0
  16. package/dist/adapter/setup.mjs.map +1 -0
  17. package/dist/adapter/webhook-events.d.mts +29 -0
  18. package/dist/adapter/webhook-events.mjs +83 -0
  19. package/dist/adapter/webhook-events.mjs.map +1 -0
  20. package/dist/adapters/notifier/events.d.mts +26 -0
  21. package/dist/adapters/notifier/events.mjs +66 -0
  22. package/dist/adapters/notifier/events.mjs.map +1 -0
  23. package/dist/adapters/notifier/format.d.mts +14 -0
  24. package/dist/adapters/notifier/format.mjs +96 -0
  25. package/dist/adapters/notifier/format.mjs.map +1 -0
  26. package/dist/adapters/notifier/provider.d.mts +32 -0
  27. package/dist/adapters/notifier/types.d.mts +56 -0
  28. package/dist/adapters/setup-runner.d.mts +23 -0
  29. package/dist/adapters/setup-runner.mjs +149 -0
  30. package/dist/adapters/setup-runner.mjs.map +1 -0
  31. package/dist/adapters/validate.d.mts +30 -0
  32. package/dist/adapters/validate.mjs +313 -0
  33. package/dist/adapters/validate.mjs.map +1 -0
  34. package/dist/auth.d.mts +94 -0
  35. package/dist/auth.mjs +4 -0
  36. package/dist/brand-packs.d.mts +16 -0
  37. package/dist/brand-packs.mjs +130 -0
  38. package/dist/brand-packs.mjs.map +1 -0
  39. package/dist/capture/adapter.d.mts +51 -1
  40. package/dist/capture/adapter.mjs.map +1 -1
  41. package/dist/capture/affected.d.mts +16 -0
  42. package/dist/capture/affected.mjs +64 -0
  43. package/dist/capture/affected.mjs.map +1 -0
  44. package/dist/capture/diff-record.mjs +30 -0
  45. package/dist/capture/diff-record.mjs.map +1 -0
  46. package/dist/capture/dispatch.d.mts +36 -0
  47. package/dist/capture/dispatch.mjs +88 -31
  48. package/dist/capture/dispatch.mjs.map +1 -1
  49. package/dist/capture/guards.mjs +31 -0
  50. package/dist/capture/guards.mjs.map +1 -0
  51. package/dist/capture/orchestrator.d.mts +41 -6
  52. package/dist/capture/orchestrator.mjs +151 -28
  53. package/dist/capture/orchestrator.mjs.map +1 -1
  54. package/dist/capture/pipeline.d.mts +30 -16
  55. package/dist/capture/pipeline.mjs +143 -39
  56. package/dist/capture/pipeline.mjs.map +1 -1
  57. package/dist/capture/recovery.d.mts +21 -0
  58. package/dist/capture/recovery.mjs +83 -0
  59. package/dist/capture/recovery.mjs.map +1 -0
  60. package/dist/capture/rediff.d.mts +35 -0
  61. package/dist/capture/rediff.mjs +77 -0
  62. package/dist/capture/rediff.mjs.map +1 -0
  63. package/dist/capture/sizing.d.mts +58 -0
  64. package/dist/capture/sizing.mjs +119 -0
  65. package/dist/capture/sizing.mjs.map +1 -0
  66. package/dist/capture/skip-checks.mjs +3 -3
  67. package/dist/capture/skip-checks.mjs.map +1 -1
  68. package/dist/capture/statics.d.mts +38 -0
  69. package/dist/capture/statics.mjs +38 -4
  70. package/dist/capture/statics.mjs.map +1 -1
  71. package/dist/capture/status-fanout.mjs +7 -2
  72. package/dist/capture/status-fanout.mjs.map +1 -1
  73. package/dist/capture/storybook.d.mts +31 -2
  74. package/dist/capture/storybook.mjs +77 -2
  75. package/dist/capture/storybook.mjs.map +1 -1
  76. package/dist/capture.d.mts +10 -4
  77. package/dist/capture.mjs +7 -2
  78. package/dist/config.d.mts +121 -4
  79. package/dist/config.mjs +55 -8
  80. package/dist/config.mjs.map +1 -1
  81. package/dist/index.d.mts +5 -56
  82. package/dist/index.mjs +4 -284
  83. package/dist/logger.d.mts +26 -17
  84. package/dist/logger.mjs +10 -5
  85. package/dist/logger.mjs.map +1 -1
  86. package/dist/models/baseline-status.d.mts +29 -0
  87. package/dist/models/baseline-status.mjs +26 -0
  88. package/dist/models/baseline-status.mjs.map +1 -0
  89. package/dist/models/baseline.d.mts +33 -0
  90. package/dist/models/baseline.mjs +35 -13
  91. package/dist/models/baseline.mjs.map +1 -1
  92. package/dist/models/build.d.mts +87 -0
  93. package/dist/models/build.mjs +83 -35
  94. package/dist/models/build.mjs.map +1 -1
  95. package/dist/models/capture-attempt.d.mts +40 -0
  96. package/dist/models/capture-attempt.mjs +85 -0
  97. package/dist/models/capture-attempt.mjs.map +1 -0
  98. package/dist/models/capture-log.d.mts +21 -0
  99. package/dist/models/capture-log.mjs +44 -0
  100. package/dist/models/capture-log.mjs.map +1 -0
  101. package/dist/models/comment.d.mts +29 -0
  102. package/dist/models/comment.mjs +11 -8
  103. package/dist/models/comment.mjs.map +1 -1
  104. package/dist/models/content-ref.d.mts +21 -0
  105. package/dist/models/content-ref.mjs +49 -0
  106. package/dist/models/content-ref.mjs.map +1 -0
  107. package/dist/models/credentials.d.mts +36 -0
  108. package/dist/models/credentials.mjs +103 -0
  109. package/dist/models/credentials.mjs.map +1 -0
  110. package/dist/models/label.d.mts +58 -0
  111. package/dist/models/label.mjs +32 -27
  112. package/dist/models/label.mjs.map +1 -1
  113. package/dist/models/member.d.mts +34 -0
  114. package/dist/models/member.mjs +20 -11
  115. package/dist/models/member.mjs.map +1 -1
  116. package/dist/models/notification-channel.d.mts +52 -0
  117. package/dist/models/notification-channel.mjs +93 -0
  118. package/dist/models/notification-channel.mjs.map +1 -0
  119. package/dist/models/notification-subscription.d.mts +44 -0
  120. package/dist/models/notification-subscription.mjs +89 -0
  121. package/dist/models/notification-subscription.mjs.map +1 -0
  122. package/dist/models/project-group-mapping.d.mts +30 -0
  123. package/dist/models/project-group-mapping.mjs +46 -0
  124. package/dist/models/project-group-mapping.mjs.map +1 -0
  125. package/dist/models/project.d.mts +54 -0
  126. package/dist/models/project.mjs +15 -11
  127. package/dist/models/project.mjs.map +1 -1
  128. package/dist/models/snapshot.d.mts +58 -0
  129. package/dist/models/snapshot.mjs +13 -7
  130. package/dist/models/snapshot.mjs.map +1 -1
  131. package/dist/models/status-config.d.mts +38 -0
  132. package/dist/models/status-config.mjs +12 -11
  133. package/dist/models/status-config.mjs.map +1 -1
  134. package/dist/models/token.d.mts +44 -0
  135. package/dist/models/token.mjs +18 -15
  136. package/dist/models/token.mjs.map +1 -1
  137. package/dist/models/user.d.mts +42 -0
  138. package/dist/models/user.mjs +65 -0
  139. package/dist/models/user.mjs.map +1 -0
  140. package/dist/models/webhook.d.mts +50 -0
  141. package/dist/models/webhook.mjs +12 -10
  142. package/dist/models/webhook.mjs.map +1 -1
  143. package/dist/models.d.mts +22 -0
  144. package/dist/models.mjs +23 -0
  145. package/dist/paths.mjs +29 -0
  146. package/dist/paths.mjs.map +1 -1
  147. package/dist/retention.d.mts +45 -0
  148. package/dist/retention.mjs +145 -0
  149. package/dist/retention.mjs.map +1 -0
  150. package/dist/schema/baseline.d.mts +1 -0
  151. package/dist/schema/build.d.mts +8 -0
  152. package/dist/schema/capture-attempt.d.mts +38 -0
  153. package/dist/schema/comment.d.mts +1 -1
  154. package/dist/schema/content-ref.d.mts +13 -0
  155. package/dist/schema/member.d.mts +2 -0
  156. package/dist/schema/notification.d.mts +35 -0
  157. package/dist/schema/project-group-mapping.d.mts +15 -0
  158. package/dist/schema/project.d.mts +4 -0
  159. package/dist/schema/snapshot.d.mts +7 -0
  160. package/dist/schema/token.d.mts +2 -0
  161. package/dist/schema/user.d.mts +11 -1
  162. package/dist/schema.d.mts +9 -46
  163. package/dist/schema.mjs +1 -55
  164. package/dist/test-helpers/create-project.d.mts +15 -0
  165. package/dist/test-helpers/create-project.mjs +28 -0
  166. package/dist/test-helpers/create-project.mjs.map +1 -0
  167. package/dist/test-helpers/database-contract.d.mts +13 -0
  168. package/dist/test-helpers/database-contract.mjs +58 -0
  169. package/dist/test-helpers/database-contract.mjs.map +1 -0
  170. package/dist/test-helpers/fake-adapters.d.mts +14 -0
  171. package/dist/test-helpers/fake-adapters.mjs +20 -0
  172. package/dist/test-helpers/fake-adapters.mjs.map +1 -0
  173. package/dist/test-helpers/fake-database.d.mts +11 -0
  174. package/dist/test-helpers/fake-database.mjs +104 -0
  175. package/dist/test-helpers/fake-database.mjs.map +1 -0
  176. package/dist/test-helpers/fake-storage.d.mts +14 -0
  177. package/dist/test-helpers/fake-storage.mjs +49 -0
  178. package/dist/test-helpers/fake-storage.mjs.map +1 -0
  179. package/dist/test-helpers/fake-tables.mjs +276 -0
  180. package/dist/test-helpers/fake-tables.mjs.map +1 -0
  181. package/dist/test-helpers/git-contract.d.mts +11 -0
  182. package/dist/test-helpers/git-contract.mjs +34 -0
  183. package/dist/test-helpers/git-contract.mjs.map +1 -0
  184. package/dist/test-helpers/notifier-contract.d.mts +11 -0
  185. package/dist/test-helpers/notifier-contract.mjs +34 -0
  186. package/dist/test-helpers/notifier-contract.mjs.map +1 -0
  187. package/dist/test-helpers/queue-contract.d.mts +11 -0
  188. package/dist/test-helpers/queue-contract.mjs +64 -0
  189. package/dist/test-helpers/queue-contract.mjs.map +1 -0
  190. package/dist/test-helpers/runner-contract.d.mts +11 -0
  191. package/dist/test-helpers/runner-contract.mjs +32 -0
  192. package/dist/test-helpers/runner-contract.mjs.map +1 -0
  193. package/dist/test-helpers/sql-chunks.mjs +138 -0
  194. package/dist/test-helpers/sql-chunks.mjs.map +1 -0
  195. package/dist/test-helpers/storage-contract.d.mts +11 -0
  196. package/dist/test-helpers/storage-contract.mjs +87 -0
  197. package/dist/test-helpers/storage-contract.mjs.map +1 -0
  198. package/dist/test-helpers.d.mts +13 -0
  199. package/dist/test-helpers.mjs +14 -0
  200. package/dist/tracing.mjs +63 -0
  201. package/dist/tracing.mjs.map +1 -0
  202. package/dist/types.d.mts +38 -5
  203. package/dist/types.mjs +18 -5
  204. package/dist/types.mjs.map +1 -1
  205. package/dist/urls.d.mts +12 -1
  206. package/dist/urls.mjs +22 -3
  207. package/dist/urls.mjs.map +1 -1
  208. package/dist/utils/encrypt.d.mts +48 -0
  209. package/dist/utils/encrypt.mjs +67 -13
  210. package/dist/utils/encrypt.mjs.map +1 -1
  211. package/dist/utils/hash.d.mts +17 -0
  212. package/dist/utils/hash.mjs +8 -2
  213. package/dist/utils/hash.mjs.map +1 -1
  214. package/dist/utils/http.d.mts +58 -0
  215. package/dist/utils/http.mjs +147 -0
  216. package/dist/utils/http.mjs.map +1 -0
  217. package/dist/utils/mime.d.mts +9 -0
  218. package/dist/utils/mime.mjs +33 -0
  219. package/dist/utils/mime.mjs.map +1 -0
  220. package/dist/utils/path-security.d.mts +12 -0
  221. package/dist/utils/path-security.mjs +24 -0
  222. package/dist/utils/path-security.mjs.map +1 -0
  223. package/dist/utils/redact.d.mts +17 -0
  224. package/dist/utils/redact.mjs +42 -0
  225. package/dist/utils/redact.mjs.map +1 -0
  226. package/dist/utils/timing.d.mts +19 -0
  227. package/dist/utils/timing.mjs +46 -0
  228. package/dist/utils/timing.mjs.map +1 -0
  229. package/dist/utils/ulid.d.mts +10 -0
  230. package/dist/utils/ulid.mjs +8 -8
  231. package/dist/utils/ulid.mjs.map +1 -1
  232. package/dist/utils.d.mts +12 -0
  233. package/dist/utils.mjs +13 -0
  234. package/package.json +69 -28
  235. package/dist/adapter/auth.d.mts +0 -50
  236. package/dist/adapter/auth.mjs +0 -10
  237. package/dist/adapter/auth.mjs.map +0 -1
  238. package/dist/adapter/init.d.mts +0 -58
  239. package/dist/adapter/init.mjs +0 -93
  240. package/dist/adapter/init.mjs.map +0 -1
  241. package/dist/adapters/webhook-events.mjs +0 -55
  242. package/dist/adapters/webhook-events.mjs.map +0 -1
  243. package/dist/ddl.d.mts +0 -8
  244. package/dist/ddl.mjs +0 -158
  245. package/dist/ddl.mjs.map +0 -1
  246. package/dist/index.mjs.map +0 -1
  247. package/dist/middleware/auth-gate.mjs +0 -36
  248. package/dist/middleware/auth-gate.mjs.map +0 -1
  249. package/dist/middleware/csrf.mjs +0 -40
  250. package/dist/middleware/csrf.mjs.map +0 -1
  251. package/dist/middleware/rate-limit.mjs +0 -39
  252. package/dist/middleware/rate-limit.mjs.map +0 -1
  253. package/dist/middleware/request-log.mjs +0 -28
  254. package/dist/middleware/request-log.mjs.map +0 -1
  255. package/dist/middleware/store-scope.mjs +0 -29
  256. package/dist/middleware/store-scope.mjs.map +0 -1
  257. package/dist/pages/build-detail.mjs +0 -339
  258. package/dist/pages/build-detail.mjs.map +0 -1
  259. package/dist/pages/build-diff-comments.mjs +0 -113
  260. package/dist/pages/build-diff-comments.mjs.map +0 -1
  261. package/dist/pages/build-diff-header.mjs +0 -163
  262. package/dist/pages/build-diff-header.mjs.map +0 -1
  263. package/dist/pages/build-diff-nav.mjs +0 -66
  264. package/dist/pages/build-diff-nav.mjs.map +0 -1
  265. package/dist/pages/build-diff-viewer.mjs +0 -197
  266. package/dist/pages/build-diff-viewer.mjs.map +0 -1
  267. package/dist/pages/build-diff.mjs +0 -90
  268. package/dist/pages/build-diff.mjs.map +0 -1
  269. package/dist/pages/compute-jobs.mjs +0 -198
  270. package/dist/pages/compute-jobs.mjs.map +0 -1
  271. package/dist/pages/label-detail.mjs +0 -228
  272. package/dist/pages/label-detail.mjs.map +0 -1
  273. package/dist/pages/login.mjs +0 -78
  274. package/dist/pages/login.mjs.map +0 -1
  275. package/dist/pages/project-builds.mjs +0 -231
  276. package/dist/pages/project-builds.mjs.map +0 -1
  277. package/dist/pages/project-create.mjs +0 -169
  278. package/dist/pages/project-create.mjs.map +0 -1
  279. package/dist/pages/project-settings.mjs +0 -102
  280. package/dist/pages/project-settings.mjs.map +0 -1
  281. package/dist/pages/projects.mjs +0 -184
  282. package/dist/pages/projects.mjs.map +0 -1
  283. package/dist/pages/root.mjs +0 -94
  284. package/dist/pages/root.mjs.map +0 -1
  285. package/dist/pages/settings-general.mjs +0 -192
  286. package/dist/pages/settings-general.mjs.map +0 -1
  287. package/dist/pages/settings-labels.mjs +0 -150
  288. package/dist/pages/settings-labels.mjs.map +0 -1
  289. package/dist/pages/settings-members.mjs +0 -125
  290. package/dist/pages/settings-members.mjs.map +0 -1
  291. package/dist/pages/settings-status.mjs +0 -152
  292. package/dist/pages/settings-status.mjs.map +0 -1
  293. package/dist/pages/settings-tests.mjs +0 -149
  294. package/dist/pages/settings-tests.mjs.map +0 -1
  295. package/dist/pages/settings-tokens.mjs +0 -96
  296. package/dist/pages/settings-tokens.mjs.map +0 -1
  297. package/dist/pages/settings-webhooks.mjs +0 -150
  298. package/dist/pages/settings-webhooks.mjs.map +0 -1
  299. package/dist/pages/storybook.mjs +0 -96
  300. package/dist/pages/storybook.mjs.map +0 -1
  301. package/dist/retention/purge.mjs +0 -70
  302. package/dist/retention/purge.mjs.map +0 -1
  303. package/dist/routers/admin.mjs +0 -42
  304. package/dist/routers/admin.mjs.map +0 -1
  305. package/dist/routers/assets.mjs +0 -25
  306. package/dist/routers/assets.mjs.map +0 -1
  307. package/dist/routers/auth.mjs +0 -78
  308. package/dist/routers/auth.mjs.map +0 -1
  309. package/dist/routers/builds.handlers.mjs +0 -184
  310. package/dist/routers/builds.handlers.mjs.map +0 -1
  311. package/dist/routers/builds.mjs +0 -185
  312. package/dist/routers/builds.mjs.map +0 -1
  313. package/dist/routers/comments.mjs +0 -90
  314. package/dist/routers/comments.mjs.map +0 -1
  315. package/dist/routers/health.mjs +0 -137
  316. package/dist/routers/health.mjs.map +0 -1
  317. package/dist/routers/helpers.mjs +0 -82
  318. package/dist/routers/helpers.mjs.map +0 -1
  319. package/dist/routers/htmx.mjs +0 -20
  320. package/dist/routers/htmx.mjs.map +0 -1
  321. package/dist/routers/labels.mjs +0 -110
  322. package/dist/routers/labels.mjs.map +0 -1
  323. package/dist/routers/media.mjs +0 -55
  324. package/dist/routers/media.mjs.map +0 -1
  325. package/dist/routers/members.mjs +0 -102
  326. package/dist/routers/members.mjs.map +0 -1
  327. package/dist/routers/projects.mjs +0 -122
  328. package/dist/routers/projects.mjs.map +0 -1
  329. package/dist/routers/schemas.mjs +0 -224
  330. package/dist/routers/schemas.mjs.map +0 -1
  331. package/dist/routers/settings-general.mjs +0 -95
  332. package/dist/routers/settings-general.mjs.map +0 -1
  333. package/dist/routers/settings-labels.mjs +0 -49
  334. package/dist/routers/settings-labels.mjs.map +0 -1
  335. package/dist/routers/settings-members.mjs +0 -30
  336. package/dist/routers/settings-members.mjs.map +0 -1
  337. package/dist/routers/settings-status.mjs +0 -73
  338. package/dist/routers/settings-status.mjs.map +0 -1
  339. package/dist/routers/settings-tokens.mjs +0 -40
  340. package/dist/routers/settings-tokens.mjs.map +0 -1
  341. package/dist/routers/settings-webhooks.mjs +0 -63
  342. package/dist/routers/settings-webhooks.mjs.map +0 -1
  343. package/dist/routers/settings.handlers.mjs +0 -93
  344. package/dist/routers/settings.handlers.mjs.map +0 -1
  345. package/dist/routers/settings.mjs +0 -23
  346. package/dist/routers/settings.mjs.map +0 -1
  347. package/dist/routers/snapshots.mjs +0 -144
  348. package/dist/routers/snapshots.mjs.map +0 -1
  349. package/dist/routers/status-configs.mjs +0 -101
  350. package/dist/routers/status-configs.mjs.map +0 -1
  351. package/dist/routers/storybook.mjs +0 -120
  352. package/dist/routers/storybook.mjs.map +0 -1
  353. package/dist/routers/tokens.mjs +0 -81
  354. package/dist/routers/tokens.mjs.map +0 -1
  355. package/dist/routers/ui.mjs +0 -165
  356. package/dist/routers/ui.mjs.map +0 -1
  357. package/dist/routers/webhooks.mjs +0 -90
  358. package/dist/routers/webhooks.mjs.map +0 -1
  359. package/dist/schema/baseline.mjs +0 -22
  360. package/dist/schema/baseline.mjs.map +0 -1
  361. package/dist/schema/build.mjs +0 -29
  362. package/dist/schema/build.mjs.map +0 -1
  363. package/dist/schema/comment.mjs +0 -26
  364. package/dist/schema/comment.mjs.map +0 -1
  365. package/dist/schema/label.mjs +0 -30
  366. package/dist/schema/label.mjs.map +0 -1
  367. package/dist/schema/member.mjs +0 -19
  368. package/dist/schema/member.mjs.map +0 -1
  369. package/dist/schema/project.mjs +0 -25
  370. package/dist/schema/project.mjs.map +0 -1
  371. package/dist/schema/snapshot.mjs +0 -34
  372. package/dist/schema/snapshot.mjs.map +0 -1
  373. package/dist/schema/status-config.mjs +0 -20
  374. package/dist/schema/status-config.mjs.map +0 -1
  375. package/dist/schema/token.mjs +0 -19
  376. package/dist/schema/token.mjs.map +0 -1
  377. package/dist/schema/user.mjs +0 -19
  378. package/dist/schema/user.mjs.map +0 -1
  379. package/dist/schema/webhook.mjs +0 -20
  380. package/dist/schema/webhook.mjs.map +0 -1
  381. package/dist/schema.mjs.map +0 -1
  382. package/dist/store.mjs +0 -20
  383. package/dist/store.mjs.map +0 -1
  384. package/dist/ui/document.mjs +0 -348
  385. package/dist/ui/document.mjs.map +0 -1
  386. package/dist/ui/feedback.mjs +0 -24
  387. package/dist/ui/feedback.mjs.map +0 -1
  388. package/dist/ui/forms.mjs +0 -117
  389. package/dist/ui/forms.mjs.map +0 -1
  390. package/dist/ui/styles.mjs +0 -174
  391. package/dist/ui/styles.mjs.map +0 -1
  392. package/dist/ui/theme.mjs +0 -44
  393. package/dist/ui/theme.mjs.map +0 -1
@@ -1,192 +0,0 @@
1
- import "node:path";
2
- import "node:url";
3
- import.meta.url;
4
- import { jsx, jsxs } from "hono/jsx/jsx-runtime";
5
- //#region src/pages/settings-general.tsx
6
- /** General settings tab: project metadata, diff thresholds, and danger zone. */
7
- function renderSettingsGeneral(project, formState, isAdmin) {
8
- const errors = formState?.errors ?? {};
9
- return /* @__PURE__ */ jsxs("div", {
10
- class: "grid",
11
- style: "max-width: 720px;",
12
- children: [
13
- formState?.globalError ? /* @__PURE__ */ jsx("div", {
14
- class: "alert alert--danger",
15
- role: "alert",
16
- children: formState.globalError
17
- }) : null,
18
- /* @__PURE__ */ jsxs("div", {
19
- class: "card card--padded",
20
- children: [/* @__PURE__ */ jsx("h2", {
21
- style: "margin:0 0 .5rem;",
22
- children: "General"
23
- }), /* @__PURE__ */ jsxs("form", {
24
- method: "post",
25
- action: `/projects/${project.slug}/settings`,
26
- "hx-post": `/projects/${project.slug}/settings`,
27
- "hx-target": "body",
28
- "hx-swap": "outerHTML",
29
- children: [
30
- /* @__PURE__ */ jsxs("div", {
31
- class: "field",
32
- children: [
33
- /* @__PURE__ */ jsx("label", {
34
- class: "field__label",
35
- for: "name",
36
- children: "Name"
37
- }),
38
- /* @__PURE__ */ jsx("input", {
39
- class: `field__input ${errors["name"] ? "field__input--error" : ""}`,
40
- id: "name",
41
- name: "name",
42
- value: project.name
43
- }),
44
- errors["name"] ? /* @__PURE__ */ jsx("p", {
45
- class: "field__error",
46
- role: "alert",
47
- children: errors["name"]
48
- }) : null
49
- ]
50
- }),
51
- /* @__PURE__ */ jsxs("div", {
52
- class: "field",
53
- children: [/* @__PURE__ */ jsx("label", {
54
- class: "field__label",
55
- for: "gitRepository",
56
- children: "Git repository"
57
- }), /* @__PURE__ */ jsx("input", {
58
- class: "field__input",
59
- id: "gitRepository",
60
- name: "gitRepository",
61
- value: project.gitRepository ?? "",
62
- placeholder: "owner/repo"
63
- })]
64
- }),
65
- /* @__PURE__ */ jsxs("div", {
66
- class: "field",
67
- children: [/* @__PURE__ */ jsx("label", {
68
- class: "field__label",
69
- for: "gitDefaultBranch",
70
- children: "Default branch"
71
- }), /* @__PURE__ */ jsx("input", {
72
- class: "field__input",
73
- id: "gitDefaultBranch",
74
- name: "gitDefaultBranch",
75
- value: project.gitDefaultBranch
76
- })]
77
- }),
78
- /* @__PURE__ */ jsxs("div", {
79
- class: "grid grid--2",
80
- children: [/* @__PURE__ */ jsxs("div", {
81
- class: "field",
82
- children: [
83
- /* @__PURE__ */ jsx("label", {
84
- class: "field__label",
85
- for: "pixelThreshold",
86
- children: "Pixel threshold"
87
- }),
88
- /* @__PURE__ */ jsx("input", {
89
- class: "field__input",
90
- id: "pixelThreshold",
91
- name: "pixelThreshold",
92
- type: "number",
93
- step: "0.01",
94
- min: "0",
95
- max: "1",
96
- value: String(project.pixelThreshold)
97
- }),
98
- /* @__PURE__ */ jsx("p", {
99
- class: "field__hint",
100
- children: "Per-pixel color distance 0–1"
101
- })
102
- ]
103
- }), /* @__PURE__ */ jsxs("div", {
104
- class: "field",
105
- children: [
106
- /* @__PURE__ */ jsx("label", {
107
- class: "field__label",
108
- for: "maxDiffRatio",
109
- children: "Max diff ratio"
110
- }),
111
- /* @__PURE__ */ jsx("input", {
112
- class: "field__input",
113
- id: "maxDiffRatio",
114
- name: "maxDiffRatio",
115
- type: "number",
116
- step: "0.001",
117
- min: "0",
118
- max: "1",
119
- value: String(project.maxDiffRatio)
120
- }),
121
- /* @__PURE__ */ jsx("p", {
122
- class: "field__hint",
123
- children: "Allowed diff ratio 0–1"
124
- })
125
- ]
126
- })]
127
- }),
128
- /* @__PURE__ */ jsxs("div", {
129
- class: "field",
130
- children: [
131
- /* @__PURE__ */ jsx("label", {
132
- class: "field__label",
133
- for: "publicBranchRegex",
134
- children: "Public branch regex"
135
- }),
136
- /* @__PURE__ */ jsx("input", {
137
- class: "field__input",
138
- id: "publicBranchRegex",
139
- name: "publicBranchRegex",
140
- value: project.publicBranchRegex ?? "",
141
- placeholder: "^main$"
142
- }),
143
- /* @__PURE__ */ jsx("p", {
144
- class: "field__hint",
145
- children: "Branches matching this regex are publicly viewable."
146
- })
147
- ]
148
- }),
149
- isAdmin ? /* @__PURE__ */ jsx("button", {
150
- class: "btn btn--primary",
151
- type: "submit",
152
- children: "Save changes"
153
- }) : /* @__PURE__ */ jsx("p", {
154
- class: "field__hint",
155
- children: "You need admin access to edit settings."
156
- })
157
- ]
158
- })]
159
- }),
160
- isAdmin ? /* @__PURE__ */ jsxs("div", {
161
- class: "card card--padded",
162
- style: "border-color: var(--status-rejected);",
163
- children: [
164
- /* @__PURE__ */ jsx("h3", {
165
- style: "margin:0 0 .4rem; color: var(--status-rejected);",
166
- children: "Danger zone"
167
- }),
168
- /* @__PURE__ */ jsx("p", {
169
- class: "field__hint",
170
- children: "Deleting a project removes all builds, snapshots, baselines and tokens. This cannot be undone."
171
- }),
172
- /* @__PURE__ */ jsx("form", {
173
- method: "post",
174
- action: `/projects/${project.slug}/delete`,
175
- "hx-post": `/projects/${project.slug}/delete`,
176
- "hx-target": "body",
177
- "hx-confirm": "Delete this project? This cannot be undone.",
178
- children: /* @__PURE__ */ jsx("button", {
179
- class: "btn btn--danger",
180
- type: "submit",
181
- children: "Delete project"
182
- })
183
- })
184
- ]
185
- }) : null
186
- ]
187
- });
188
- }
189
- //#endregion
190
- export { renderSettingsGeneral };
191
-
192
- //# sourceMappingURL=settings-general.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"settings-general.mjs","names":[],"sources":["../../src/pages/settings-general.tsx"],"sourcesContent":["import type { Project } from \"../schema/project.ts\";\n\n/** Form state for the settings tabs (field errors and global error). */\nexport interface SettingsFormState {\n errors?: Record<string, string>;\n globalError?: string;\n}\n\n/** General settings tab: project metadata, diff thresholds, and danger zone. */\nexport function renderSettingsGeneral(\n project: Project,\n formState: SettingsFormState | undefined,\n isAdmin: boolean,\n): unknown {\n const errors = formState?.errors ?? {};\n return (\n <div class=\"grid\" style=\"max-width: 720px;\">\n {formState?.globalError ? (\n <div class=\"alert alert--danger\" role=\"alert\">\n {formState.globalError}\n </div>\n ) : null}\n <div class=\"card card--padded\">\n <h2 style=\"margin:0 0 .5rem;\">General</h2>\n <form\n method=\"post\"\n action={`/projects/${project.slug}/settings`}\n hx-post={`/projects/${project.slug}/settings`}\n hx-target=\"body\"\n hx-swap=\"outerHTML\"\n >\n <div class=\"field\">\n <label class=\"field__label\" for=\"name\">\n Name\n </label>\n <input\n class={`field__input ${errors[\"name\"] ? \"field__input--error\" : \"\"}`}\n id=\"name\"\n name=\"name\"\n value={project.name}\n />\n {errors[\"name\"] ? (\n <p class=\"field__error\" role=\"alert\">\n {errors[\"name\"]}\n </p>\n ) : null}\n </div>\n <div class=\"field\">\n <label class=\"field__label\" for=\"gitRepository\">\n Git repository\n </label>\n <input\n class=\"field__input\"\n id=\"gitRepository\"\n name=\"gitRepository\"\n value={project.gitRepository ?? \"\"}\n placeholder=\"owner/repo\"\n />\n </div>\n <div class=\"field\">\n <label class=\"field__label\" for=\"gitDefaultBranch\">\n Default branch\n </label>\n <input\n class=\"field__input\"\n id=\"gitDefaultBranch\"\n name=\"gitDefaultBranch\"\n value={project.gitDefaultBranch}\n />\n </div>\n <div class=\"grid grid--2\">\n <div class=\"field\">\n <label class=\"field__label\" for=\"pixelThreshold\">\n Pixel threshold\n </label>\n <input\n class=\"field__input\"\n id=\"pixelThreshold\"\n name=\"pixelThreshold\"\n type=\"number\"\n step=\"0.01\"\n min=\"0\"\n max=\"1\"\n value={String(project.pixelThreshold)}\n />\n <p class=\"field__hint\">Per-pixel color distance 0–1</p>\n </div>\n <div class=\"field\">\n <label class=\"field__label\" for=\"maxDiffRatio\">\n Max diff ratio\n </label>\n <input\n class=\"field__input\"\n id=\"maxDiffRatio\"\n name=\"maxDiffRatio\"\n type=\"number\"\n step=\"0.001\"\n min=\"0\"\n max=\"1\"\n value={String(project.maxDiffRatio)}\n />\n <p class=\"field__hint\">Allowed diff ratio 0–1</p>\n </div>\n </div>\n <div class=\"field\">\n <label class=\"field__label\" for=\"publicBranchRegex\">\n Public branch regex\n </label>\n <input\n class=\"field__input\"\n id=\"publicBranchRegex\"\n name=\"publicBranchRegex\"\n value={project.publicBranchRegex ?? \"\"}\n placeholder=\"^main$\"\n />\n <p class=\"field__hint\">Branches matching this regex are publicly viewable.</p>\n </div>\n {isAdmin ? (\n <button class=\"btn btn--primary\" type=\"submit\">\n Save changes\n </button>\n ) : (\n <p class=\"field__hint\">You need admin access to edit settings.</p>\n )}\n </form>\n </div>\n\n {isAdmin ? (\n <div class=\"card card--padded\" style=\"border-color: var(--status-rejected);\">\n <h3 style=\"margin:0 0 .4rem; color: var(--status-rejected);\">Danger zone</h3>\n <p class=\"field__hint\">\n Deleting a project removes all builds, snapshots, baselines and tokens. This cannot be\n undone.\n </p>\n <form\n method=\"post\"\n action={`/projects/${project.slug}/delete`}\n hx-post={`/projects/${project.slug}/delete`}\n hx-target=\"body\"\n hx-confirm=\"Delete this project? This cannot be undone.\"\n >\n <button class=\"btn btn--danger\" type=\"submit\">\n Delete project\n </button>\n </form>\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,150 +0,0 @@
1
- import "node:path";
2
- import "node:url";
3
- import.meta.url;
4
- import { Badge } from "../ui/feedback.mjs";
5
- import { jsx, jsxs } from "hono/jsx/jsx-runtime";
6
- //#region src/pages/settings-labels.tsx
7
- /** Labels settings tab: label-type table plus the create-type form. */
8
- function renderSettingsLabels(project, labelTypes, isAdmin) {
9
- return /* @__PURE__ */ jsxs("div", {
10
- class: "grid",
11
- style: "max-width: 880px;",
12
- children: [/* @__PURE__ */ jsxs("div", {
13
- class: "card card--padded",
14
- children: [
15
- /* @__PURE__ */ jsx("h2", {
16
- style: "margin:0 0 .3rem;",
17
- children: "Label types"
18
- }),
19
- /* @__PURE__ */ jsx("p", {
20
- class: "field__hint",
21
- children: "Labels attach typed values to builds (e.g. pr=123, jira=ABC-123). Values link out via the template."
22
- }),
23
- /* @__PURE__ */ jsx("div", {
24
- class: "table-wrap",
25
- style: "margin-top:.75rem;",
26
- children: /* @__PURE__ */ jsxs("table", { children: [/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
27
- /* @__PURE__ */ jsx("th", { children: "Key" }),
28
- /* @__PURE__ */ jsx("th", { children: "Name" }),
29
- /* @__PURE__ */ jsx("th", { children: "Template" }),
30
- /* @__PURE__ */ jsx("th", {})
31
- ] }) }), /* @__PURE__ */ jsx("tbody", { children: labelTypes.map((labelType) => /* @__PURE__ */ jsxs("tr", { children: [
32
- /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx(Badge, {
33
- tone: "neutral",
34
- children: labelType.key
35
- }) }),
36
- /* @__PURE__ */ jsx("td", { children: labelType.name }),
37
- /* @__PURE__ */ jsx("td", {
38
- style: "max-width:32ch; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;",
39
- children: labelType.linkTemplate ?? "—"
40
- }),
41
- /* @__PURE__ */ jsx("td", { children: isAdmin && labelType.key !== "persistent" && labelType.key !== "branch" ? /* @__PURE__ */ jsx("form", {
42
- method: "post",
43
- action: `/projects/${project.slug}/settings/labels/${labelType.key}/delete`,
44
- "hx-post": `/projects/${project.slug}/settings/labels/${labelType.key}/delete`,
45
- "hx-target": "body",
46
- children: /* @__PURE__ */ jsx("button", {
47
- class: "btn btn--ghost",
48
- type: "submit",
49
- "aria-label": `Delete ${labelType.key}`,
50
- children: "Delete"
51
- })
52
- }) : /* @__PURE__ */ jsx("span", {
53
- class: "field__hint",
54
- children: "built-in"
55
- }) })
56
- ] }, labelType.id)) })] })
57
- }),
58
- labelTypes.length === 0 ? /* @__PURE__ */ jsx("p", {
59
- class: "field__hint",
60
- style: "margin-top:.5rem;",
61
- children: "No label types configured."
62
- }) : null
63
- ]
64
- }), isAdmin ? /* @__PURE__ */ jsxs("div", {
65
- class: "card card--padded",
66
- children: [/* @__PURE__ */ jsx("h3", {
67
- style: "margin:0 0 .5rem;",
68
- children: "Create label type"
69
- }), /* @__PURE__ */ jsxs("form", {
70
- method: "post",
71
- action: `/projects/${project.slug}/settings/labels`,
72
- "hx-post": `/projects/${project.slug}/settings/labels`,
73
- "hx-target": "body",
74
- children: [
75
- /* @__PURE__ */ jsxs("div", {
76
- class: "grid grid--2",
77
- children: [/* @__PURE__ */ jsxs("div", {
78
- class: "field",
79
- children: [
80
- /* @__PURE__ */ jsx("label", {
81
- class: "field__label",
82
- for: "key",
83
- children: "Key"
84
- }),
85
- /* @__PURE__ */ jsx("input", {
86
- class: "field__input",
87
- id: "key",
88
- name: "key",
89
- required: true,
90
- placeholder: "jira",
91
- pattern: "^[a-z0-9_-]+$"
92
- }),
93
- /* @__PURE__ */ jsx("p", {
94
- class: "field__hint",
95
- children: "Lowercase, no spaces."
96
- })
97
- ]
98
- }), /* @__PURE__ */ jsxs("div", {
99
- class: "field",
100
- children: [/* @__PURE__ */ jsx("label", {
101
- class: "field__label",
102
- for: "labelName",
103
- children: "Name"
104
- }), /* @__PURE__ */ jsx("input", {
105
- class: "field__input",
106
- id: "labelName",
107
- name: "labelName",
108
- required: true,
109
- placeholder: "Jira issue"
110
- })]
111
- })]
112
- }),
113
- /* @__PURE__ */ jsxs("div", {
114
- class: "field",
115
- children: [
116
- /* @__PURE__ */ jsx("label", {
117
- class: "field__label",
118
- for: "linkTemplate",
119
- children: "Link template"
120
- }),
121
- /* @__PURE__ */ jsx("input", {
122
- class: "field__input",
123
- id: "linkTemplate",
124
- name: "linkTemplate",
125
- placeholder: "https://jira.example.com/browse/{value}"
126
- }),
127
- /* @__PURE__ */ jsxs("p", {
128
- class: "field__hint",
129
- children: [
130
- "Use ",
131
- "{value}",
132
- " placeholder. Optional."
133
- ]
134
- })
135
- ]
136
- }),
137
- /* @__PURE__ */ jsx("button", {
138
- class: "btn btn--primary",
139
- type: "submit",
140
- children: "Add label type"
141
- })
142
- ]
143
- })]
144
- }) : null]
145
- });
146
- }
147
- //#endregion
148
- export { renderSettingsLabels };
149
-
150
- //# sourceMappingURL=settings-labels.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"settings-labels.mjs","names":[],"sources":["../../src/pages/settings-labels.tsx"],"sourcesContent":["import type { HtmlEscapedString } from \"hono/utils/html\";\nimport type { LabelType } from \"../schema/label.ts\";\nimport type { Project } from \"../schema/project.ts\";\nimport { Badge } from \"../ui/components.tsx\";\n\n/** Labels settings tab: label-type table plus the create-type form. */\nexport function renderSettingsLabels(\n project: Project,\n labelTypes: LabelType[],\n isAdmin: boolean,\n): unknown {\n return (\n <div class=\"grid\" style=\"max-width: 880px;\">\n <div class=\"card card--padded\">\n <h2 style=\"margin:0 0 .3rem;\">Label types</h2>\n <p class=\"field__hint\">\n Labels attach typed values to builds (e.g. pr=123, jira=ABC-123). Values link out via the\n template.\n </p>\n <div class=\"table-wrap\" style=\"margin-top:.75rem;\">\n <table>\n <thead>\n <tr>\n <th>Key</th>\n <th>Name</th>\n <th>Template</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n {labelTypes.map((labelType): HtmlEscapedString | Promise<HtmlEscapedString> => (\n <tr key={labelType.id}>\n <td>\n <Badge tone=\"neutral\">{labelType.key}</Badge>\n </td>\n <td>{labelType.name}</td>\n <td style=\"max-width:32ch; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;\">\n {labelType.linkTemplate ?? \"—\"}\n </td>\n <td>\n {isAdmin && labelType.key !== \"persistent\" && labelType.key !== \"branch\" ? (\n <form\n method=\"post\"\n action={`/projects/${project.slug}/settings/labels/${labelType.key}/delete`}\n hx-post={`/projects/${project.slug}/settings/labels/${labelType.key}/delete`}\n hx-target=\"body\"\n >\n <button\n class=\"btn btn--ghost\"\n type=\"submit\"\n aria-label={`Delete ${labelType.key}`}\n >\n Delete\n </button>\n </form>\n ) : (\n <span class=\"field__hint\">built-in</span>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {labelTypes.length === 0 ? (\n <p class=\"field__hint\" style=\"margin-top:.5rem;\">\n No label types configured.\n </p>\n ) : null}\n </div>\n\n {isAdmin ? (\n <div class=\"card card--padded\">\n <h3 style=\"margin:0 0 .5rem;\">Create label type</h3>\n <form\n method=\"post\"\n action={`/projects/${project.slug}/settings/labels`}\n hx-post={`/projects/${project.slug}/settings/labels`}\n hx-target=\"body\"\n >\n <div class=\"grid grid--2\">\n <div class=\"field\">\n <label class=\"field__label\" for=\"key\">\n Key\n </label>\n <input\n class=\"field__input\"\n id=\"key\"\n name=\"key\"\n required\n placeholder=\"jira\"\n pattern=\"^[a-z0-9_-]+$\"\n />\n <p class=\"field__hint\">Lowercase, no spaces.</p>\n </div>\n <div class=\"field\">\n <label class=\"field__label\" for=\"labelName\">\n Name\n </label>\n <input\n class=\"field__input\"\n id=\"labelName\"\n name=\"labelName\"\n required\n placeholder=\"Jira issue\"\n />\n </div>\n </div>\n <div class=\"field\">\n <label class=\"field__label\" for=\"linkTemplate\">\n Link template\n </label>\n <input\n class=\"field__input\"\n id=\"linkTemplate\"\n name=\"linkTemplate\"\n placeholder=\"https://jira.example.com/browse/{value}\"\n />\n <p class=\"field__hint\">Use {\"{value}\"} placeholder. Optional.</p>\n </div>\n <button class=\"btn btn--primary\" type=\"submit\">\n Add label type\n </button>\n </form>\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,125 +0,0 @@
1
- import "node:path";
2
- import "node:url";
3
- import.meta.url;
4
- import { Badge } from "../ui/feedback.mjs";
5
- import { jsx, jsxs } from "hono/jsx/jsx-runtime";
6
- //#region src/pages/settings-members.tsx
7
- /** Members settings tab: member roster plus the add-member form. */
8
- function renderSettingsMembers(project, members, isAdmin) {
9
- return /* @__PURE__ */ jsxs("div", {
10
- class: "grid",
11
- style: "max-width: 880px;",
12
- children: [/* @__PURE__ */ jsxs("div", {
13
- class: "card card--padded",
14
- children: [
15
- /* @__PURE__ */ jsx("h2", {
16
- style: "margin:0 0 .3rem;",
17
- children: "Members"
18
- }),
19
- /* @__PURE__ */ jsx("p", {
20
- class: "field__hint",
21
- children: "Project members and their roles. Site admins have implicit admin access."
22
- }),
23
- /* @__PURE__ */ jsx("div", {
24
- class: "table-wrap",
25
- style: "margin-top:.75rem;",
26
- children: /* @__PURE__ */ jsxs("table", { children: [/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
27
- /* @__PURE__ */ jsx("th", { children: "User" }),
28
- /* @__PURE__ */ jsx("th", { children: "Role" }),
29
- /* @__PURE__ */ jsx("th", { children: "Since" }),
30
- /* @__PURE__ */ jsx("th", {})
31
- ] }) }), /* @__PURE__ */ jsx("tbody", { children: members.map((member) => /* @__PURE__ */ jsxs("tr", { children: [
32
- /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("code", { children: member.userId }) }),
33
- /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx(Badge, {
34
- tone: member.role === "admin" ? "danger" : member.role === "viewer" ? "neutral" : "info",
35
- children: member.role
36
- }) }),
37
- /* @__PURE__ */ jsx("td", { children: new Date(member.createdAt).toLocaleDateString() }),
38
- /* @__PURE__ */ jsx("td", { children: isAdmin ? /* @__PURE__ */ jsx("form", {
39
- method: "post",
40
- action: `/projects/${project.slug}/settings/members/${member.userId}/remove`,
41
- "hx-post": `/projects/${project.slug}/settings/members/${member.userId}/remove`,
42
- "hx-target": "body",
43
- children: /* @__PURE__ */ jsx("button", {
44
- class: "btn btn--ghost",
45
- type: "submit",
46
- children: "Remove"
47
- })
48
- }) : null })
49
- ] }, member.id)) })] })
50
- }),
51
- members.length === 0 ? /* @__PURE__ */ jsx("p", {
52
- class: "field__hint",
53
- style: "margin-top:.5rem;",
54
- children: "No members yet."
55
- }) : null
56
- ]
57
- }), isAdmin ? /* @__PURE__ */ jsxs("div", {
58
- class: "card card--padded",
59
- children: [/* @__PURE__ */ jsx("h3", {
60
- style: "margin:0 0 .5rem;",
61
- children: "Add member"
62
- }), /* @__PURE__ */ jsxs("form", {
63
- method: "post",
64
- action: `/projects/${project.slug}/settings/members`,
65
- "hx-post": `/projects/${project.slug}/settings/members`,
66
- "hx-target": "body",
67
- children: [
68
- /* @__PURE__ */ jsxs("div", {
69
- class: "field",
70
- children: [/* @__PURE__ */ jsx("label", {
71
- class: "field__label",
72
- for: "userId",
73
- children: "User ID"
74
- }), /* @__PURE__ */ jsx("input", {
75
- class: "field__input",
76
- id: "userId",
77
- name: "userId",
78
- required: true,
79
- placeholder: "user_..."
80
- })]
81
- }),
82
- /* @__PURE__ */ jsxs("div", {
83
- class: "field",
84
- children: [/* @__PURE__ */ jsx("label", {
85
- class: "field__label",
86
- for: "role",
87
- children: "Role"
88
- }), /* @__PURE__ */ jsxs("select", {
89
- class: "field__input",
90
- id: "role",
91
- name: "role",
92
- children: [
93
- /* @__PURE__ */ jsx("option", {
94
- value: "viewer",
95
- children: "viewer"
96
- }),
97
- /* @__PURE__ */ jsx("option", {
98
- value: "developer",
99
- children: "developer"
100
- }),
101
- /* @__PURE__ */ jsx("option", {
102
- value: "approver",
103
- children: "approver"
104
- }),
105
- /* @__PURE__ */ jsx("option", {
106
- value: "admin",
107
- children: "admin"
108
- })
109
- ]
110
- })]
111
- }),
112
- /* @__PURE__ */ jsx("button", {
113
- class: "btn btn--primary",
114
- type: "submit",
115
- children: "Add member"
116
- })
117
- ]
118
- })]
119
- }) : null]
120
- });
121
- }
122
- //#endregion
123
- export { renderSettingsMembers };
124
-
125
- //# sourceMappingURL=settings-members.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"settings-members.mjs","names":[],"sources":["../../src/pages/settings-members.tsx"],"sourcesContent":["import type { HtmlEscapedString } from \"hono/utils/html\";\nimport type { Project } from \"../schema/project.ts\";\nimport { Badge } from \"../ui/components.tsx\";\n\n/** Project member row as rendered in the members settings tab. */\nexport interface SettingsMember {\n id: string;\n projectId: string;\n userId: string;\n role: string;\n createdAt: string;\n}\n\n/** Members settings tab: member roster plus the add-member form. */\nexport function renderSettingsMembers(\n project: Project,\n members: SettingsMember[],\n isAdmin: boolean,\n): unknown {\n return (\n <div class=\"grid\" style=\"max-width: 880px;\">\n <div class=\"card card--padded\">\n <h2 style=\"margin:0 0 .3rem;\">Members</h2>\n <p class=\"field__hint\">\n Project members and their roles. Site admins have implicit admin access.\n </p>\n <div class=\"table-wrap\" style=\"margin-top:.75rem;\">\n <table>\n <thead>\n <tr>\n <th>User</th>\n <th>Role</th>\n <th>Since</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n {members.map((member): HtmlEscapedString | Promise<HtmlEscapedString> => (\n <tr key={member.id}>\n <td>\n <code>{member.userId}</code>\n </td>\n <td>\n <Badge\n tone={\n member.role === \"admin\"\n ? \"danger\"\n : member.role === \"viewer\"\n ? \"neutral\"\n : \"info\"\n }\n >\n {member.role}\n </Badge>\n </td>\n <td>{new Date(member.createdAt).toLocaleDateString()}</td>\n <td>\n {isAdmin ? (\n <form\n method=\"post\"\n action={`/projects/${project.slug}/settings/members/${member.userId}/remove`}\n hx-post={`/projects/${project.slug}/settings/members/${member.userId}/remove`}\n hx-target=\"body\"\n >\n <button class=\"btn btn--ghost\" type=\"submit\">\n Remove\n </button>\n </form>\n ) : null}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {members.length === 0 ? (\n <p class=\"field__hint\" style=\"margin-top:.5rem;\">\n No members yet.\n </p>\n ) : null}\n </div>\n\n {isAdmin ? (\n <div class=\"card card--padded\">\n <h3 style=\"margin:0 0 .5rem;\">Add member</h3>\n <form\n method=\"post\"\n action={`/projects/${project.slug}/settings/members`}\n hx-post={`/projects/${project.slug}/settings/members`}\n hx-target=\"body\"\n >\n <div class=\"field\">\n <label class=\"field__label\" for=\"userId\">\n User ID\n </label>\n <input\n class=\"field__input\"\n id=\"userId\"\n name=\"userId\"\n required\n placeholder=\"user_...\"\n />\n </div>\n <div class=\"field\">\n <label class=\"field__label\" for=\"role\">\n Role\n </label>\n <select class=\"field__input\" id=\"role\" name=\"role\">\n <option value=\"viewer\">viewer</option>\n <option value=\"developer\">developer</option>\n <option value=\"approver\">approver</option>\n <option value=\"admin\">admin</option>\n </select>\n </div>\n <button class=\"btn btn--primary\" type=\"submit\">\n Add member\n </button>\n </form>\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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"}