@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,169 +0,0 @@
1
- import "node:path";
2
- import "node:url";
3
- import.meta.url;
4
- import { DocumentLayout } from "../ui/document.mjs";
5
- import { jsx, jsxs } from "hono/jsx/jsx-runtime";
6
- //#region src/pages/project-create.tsx
7
- /** New-project form page (one project corresponds to one Storybook). */
8
- function renderProjectCreatePage(state = {}) {
9
- const values = state.values ?? {};
10
- const errors = state.errors ?? {};
11
- return /* @__PURE__ */ jsxs(DocumentLayout, {
12
- title: "New project",
13
- nav: { active: "projects" },
14
- children: [
15
- /* @__PURE__ */ jsxs("div", {
16
- class: "page-header",
17
- children: [/* @__PURE__ */ jsx("nav", {
18
- class: "breadcrumbs",
19
- "aria-label": "Breadcrumb",
20
- children: /* @__PURE__ */ jsxs("ol", { children: [/* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx("a", {
21
- href: "/projects",
22
- children: "Projects"
23
- }) }), /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx("span", {
24
- "aria-current": "page",
25
- children: "New project"
26
- }) })] })
27
- }), /* @__PURE__ */ jsx("div", {
28
- class: "page-header__row",
29
- children: /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h1", {
30
- class: "page-header__title",
31
- children: "Create project"
32
- }), /* @__PURE__ */ jsx("p", {
33
- class: "page-header__desc",
34
- children: "A project corresponds to one Storybook. You can have multiple projects per repository."
35
- })] })
36
- })]
37
- }),
38
- state.globalError ? /* @__PURE__ */ jsxs("div", {
39
- class: "alert alert--danger",
40
- role: "alert",
41
- children: [/* @__PURE__ */ jsx("strong", {
42
- class: "alert__title",
43
- children: "Could not create project"
44
- }), /* @__PURE__ */ jsx("div", {
45
- class: "alert__body",
46
- children: state.globalError
47
- })]
48
- }) : null,
49
- /* @__PURE__ */ jsx("div", {
50
- class: "card card--padded",
51
- style: "max-width: 640px;",
52
- children: /* @__PURE__ */ jsxs("form", {
53
- method: "post",
54
- action: "/projects/new",
55
- "hx-post": "/projects/new",
56
- "hx-target": "body",
57
- "hx-swap": "outerHTML",
58
- novalidate: true,
59
- children: [
60
- /* @__PURE__ */ jsxs("div", {
61
- class: "field",
62
- children: [
63
- /* @__PURE__ */ jsxs("label", {
64
- class: "field__label",
65
- for: "name",
66
- children: ["Name ", /* @__PURE__ */ jsx("span", {
67
- "aria-hidden": "true",
68
- children: "*"
69
- })]
70
- }),
71
- /* @__PURE__ */ jsx("input", {
72
- class: `field__input ${errors["name"] ? "field__input--error" : ""}`,
73
- id: "name",
74
- name: "name",
75
- type: "text",
76
- required: true,
77
- autofocus: true,
78
- value: values.name ?? "",
79
- placeholder: "Design System",
80
- "aria-invalid": errors["name"] ? "true" : void 0,
81
- "aria-describedby": errors["name"] ? "name-error" : "name-hint",
82
- autocomplete: "off"
83
- }),
84
- errors["name"] ? /* @__PURE__ */ jsx("p", {
85
- class: "field__error",
86
- id: "name-error",
87
- role: "alert",
88
- children: errors["name"]
89
- }) : /* @__PURE__ */ jsx("p", {
90
- class: "field__hint",
91
- id: "name-hint",
92
- children: "Human readable name. A URL-friendly slug is generated automatically."
93
- })
94
- ]
95
- }),
96
- /* @__PURE__ */ jsxs("div", {
97
- class: "field",
98
- children: [
99
- /* @__PURE__ */ jsx("label", {
100
- class: "field__label",
101
- for: "gitRepository",
102
- children: "Git repository"
103
- }),
104
- /* @__PURE__ */ jsx("input", {
105
- class: `field__input ${errors["gitRepository"] ? "field__input--error" : ""}`,
106
- id: "gitRepository",
107
- name: "gitRepository",
108
- type: "text",
109
- value: values.gitRepository ?? "",
110
- placeholder: "acme/design-system",
111
- "aria-invalid": errors["gitRepository"] ? "true" : void 0,
112
- "aria-describedby": errors["gitRepository"] ? "gitRepository-error" : "gitRepository-hint"
113
- }),
114
- errors["gitRepository"] ? /* @__PURE__ */ jsx("p", {
115
- class: "field__error",
116
- id: "gitRepository-error",
117
- role: "alert",
118
- children: errors["gitRepository"]
119
- }) : /* @__PURE__ */ jsx("p", {
120
- class: "field__hint",
121
- id: "gitRepository-hint",
122
- children: "Optional owner/repo for status checks and links."
123
- })
124
- ]
125
- }),
126
- /* @__PURE__ */ jsxs("div", {
127
- class: "field",
128
- children: [
129
- /* @__PURE__ */ jsx("label", {
130
- class: "field__label",
131
- for: "gitDefaultBranch",
132
- children: "Default branch"
133
- }),
134
- /* @__PURE__ */ jsx("input", {
135
- class: "field__input",
136
- id: "gitDefaultBranch",
137
- name: "gitDefaultBranch",
138
- type: "text",
139
- value: values.gitDefaultBranch ?? "main",
140
- placeholder: "main"
141
- }),
142
- /* @__PURE__ */ jsx("p", {
143
- class: "field__hint",
144
- children: "Baselines fall back to this branch when no branch-specific baseline exists."
145
- })
146
- ]
147
- }),
148
- /* @__PURE__ */ jsxs("div", {
149
- style: "display:flex; gap:.5rem; margin-top:1rem;",
150
- children: [/* @__PURE__ */ jsx("button", {
151
- class: "btn btn--primary",
152
- type: "submit",
153
- children: "Create project"
154
- }), /* @__PURE__ */ jsx("a", {
155
- class: "btn btn--secondary",
156
- href: "/projects",
157
- children: "Cancel"
158
- })]
159
- })
160
- ]
161
- })
162
- })
163
- ]
164
- });
165
- }
166
- //#endregion
167
- export { renderProjectCreatePage };
168
-
169
- //# sourceMappingURL=project-create.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"project-create.mjs","names":[],"sources":["../../src/pages/project-create.tsx"],"sourcesContent":["import { DocumentLayout, type RenderedContent } from \"../ui/document.tsx\";\n\n/** Form state for the project creation page (values and validation errors). */\nexport interface ProjectCreateFormState {\n values?: { name?: string; gitRepository?: string; gitDefaultBranch?: string };\n errors?: Record<string, string>;\n globalError?: string;\n}\n\n/** New-project form page (one project corresponds to one Storybook). */\nexport function renderProjectCreatePage(state: ProjectCreateFormState = {}): RenderedContent {\n const values = state.values ?? {};\n const errors = state.errors ?? {};\n return (\n <DocumentLayout title=\"New project\" nav={{ active: \"projects\" }}>\n <div class=\"page-header\">\n <nav class=\"breadcrumbs\" aria-label=\"Breadcrumb\">\n <ol>\n <li>\n <a href=\"/projects\">Projects</a>\n </li>\n <li>\n <span aria-current=\"page\">New project</span>\n </li>\n </ol>\n </nav>\n <div class=\"page-header__row\">\n <div>\n <h1 class=\"page-header__title\">Create project</h1>\n <p class=\"page-header__desc\">\n A project corresponds to one Storybook. You can have multiple projects per repository.\n </p>\n </div>\n </div>\n </div>\n\n {state.globalError ? (\n <div class=\"alert alert--danger\" role=\"alert\">\n <strong class=\"alert__title\">Could not create project</strong>\n <div class=\"alert__body\">{state.globalError}</div>\n </div>\n ) : null}\n\n <div class=\"card card--padded\" style=\"max-width: 640px;\">\n <form\n method=\"post\"\n action=\"/projects/new\"\n hx-post=\"/projects/new\"\n hx-target=\"body\"\n hx-swap=\"outerHTML\"\n novalidate\n >\n <div class=\"field\">\n <label class=\"field__label\" for=\"name\">\n Name <span aria-hidden=\"true\">*</span>\n </label>\n <input\n class={`field__input ${errors[\"name\"] ? \"field__input--error\" : \"\"}`}\n id=\"name\"\n name=\"name\"\n type=\"text\"\n required\n autofocus\n value={values.name ?? \"\"}\n placeholder=\"Design System\"\n aria-invalid={errors[\"name\"] ? \"true\" : undefined}\n aria-describedby={errors[\"name\"] ? \"name-error\" : \"name-hint\"}\n autocomplete=\"off\"\n />\n {errors[\"name\"] ? (\n <p class=\"field__error\" id=\"name-error\" role=\"alert\">\n {errors[\"name\"]}\n </p>\n ) : (\n <p class=\"field__hint\" id=\"name-hint\">\n Human readable name. A URL-friendly slug is generated automatically.\n </p>\n )}\n </div>\n\n <div class=\"field\">\n <label class=\"field__label\" for=\"gitRepository\">\n Git repository\n </label>\n <input\n class={`field__input ${errors[\"gitRepository\"] ? \"field__input--error\" : \"\"}`}\n id=\"gitRepository\"\n name=\"gitRepository\"\n type=\"text\"\n value={values.gitRepository ?? \"\"}\n placeholder=\"acme/design-system\"\n aria-invalid={errors[\"gitRepository\"] ? \"true\" : undefined}\n aria-describedby={\n errors[\"gitRepository\"] ? \"gitRepository-error\" : \"gitRepository-hint\"\n }\n />\n {errors[\"gitRepository\"] ? (\n <p class=\"field__error\" id=\"gitRepository-error\" role=\"alert\">\n {errors[\"gitRepository\"]}\n </p>\n ) : (\n <p class=\"field__hint\" id=\"gitRepository-hint\">\n Optional owner/repo for status checks and links.\n </p>\n )}\n </div>\n\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 type=\"text\"\n value={values.gitDefaultBranch ?? \"main\"}\n placeholder=\"main\"\n />\n <p class=\"field__hint\">\n Baselines fall back to this branch when no branch-specific baseline exists.\n </p>\n </div>\n\n <div style=\"display:flex; gap:.5rem; margin-top:1rem;\">\n <button class=\"btn btn--primary\" type=\"submit\">\n Create project\n </button>\n <a class=\"btn btn--secondary\" href=\"/projects\">\n Cancel\n </a>\n </div>\n </form>\n </div>\n </DocumentLayout>\n );\n}\n"],"mappings":"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"}
@@ -1,102 +0,0 @@
1
- import "node:path";
2
- import "node:url";
3
- import.meta.url;
4
- import { DocumentLayout } from "../ui/document.mjs";
5
- import { renderSettingsGeneral } from "./settings-general.mjs";
6
- import { renderSettingsLabels } from "./settings-labels.mjs";
7
- import { renderSettingsMembers } from "./settings-members.mjs";
8
- import { renderSettingsStatus } from "./settings-status.mjs";
9
- import { renderSettingsTests } from "./settings-tests.mjs";
10
- import { renderSettingsTokens } from "./settings-tokens.mjs";
11
- import { renderSettingsWebhooks } from "./settings-webhooks.mjs";
12
- import { jsx, jsxs } from "hono/jsx/jsx-runtime";
13
- //#region src/pages/project-settings.tsx
14
- function tabHref(project, tab) {
15
- return tab === "general" ? `/projects/${project.slug}/settings` : `/projects/${project.slug}/settings/${tab}`;
16
- }
17
- function renderTabLink(project, activeTab, tab, label) {
18
- const active = activeTab === tab;
19
- return /* @__PURE__ */ jsx("a", {
20
- class: `tabs__link ${active ? "tabs__link--active" : ""}`,
21
- href: tabHref(project, tab),
22
- "aria-current": active ? "page" : void 0,
23
- children: label
24
- });
25
- }
26
- function renderActiveTab(data, formState) {
27
- const { project, activeTab } = data;
28
- if (activeTab === "general") return renderSettingsGeneral(project, formState, data.isAdmin);
29
- if (activeTab === "tests") return renderSettingsTests(project, data.isAdmin, formState);
30
- if (activeTab === "labels") return renderSettingsLabels(project, data.labelTypes, data.isAdmin);
31
- if (activeTab === "tokens") return renderSettingsTokens(project, data.tokens, data.isAdmin);
32
- if (activeTab === "webhooks") return renderSettingsWebhooks(project, data.webhooks, data.isAdmin, formState);
33
- if (activeTab === "members") return renderSettingsMembers(project, data.members, data.isAdmin);
34
- if (activeTab === "status") return renderSettingsStatus(project, data.statusConfigs, data.gitHosts, data.isAdmin);
35
- return null;
36
- }
37
- /** Project settings shell: tab navigation plus the active settings tab. */
38
- function renderProjectSettingsPage(data, formState) {
39
- const { project, activeTab } = data;
40
- return /* @__PURE__ */ jsxs(DocumentLayout, {
41
- title: `${project.name} · Settings`,
42
- nav: {
43
- active: "settings",
44
- projectSlug: project.slug,
45
- projectName: project.name
46
- },
47
- children: [
48
- /* @__PURE__ */ jsxs("div", {
49
- class: "page-header",
50
- children: [/* @__PURE__ */ jsx("nav", {
51
- class: "breadcrumbs",
52
- "aria-label": "Breadcrumb",
53
- children: /* @__PURE__ */ jsxs("ol", { children: [
54
- /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx("a", {
55
- href: "/projects",
56
- children: "Projects"
57
- }) }),
58
- /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx("a", {
59
- href: `/projects/${project.slug}/builds`,
60
- children: project.name
61
- }) }),
62
- /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx("span", {
63
- "aria-current": "page",
64
- children: "Settings"
65
- }) })
66
- ] })
67
- }), /* @__PURE__ */ jsx("div", {
68
- class: "page-header__row",
69
- children: /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h1", {
70
- class: "page-header__title",
71
- children: "Project settings"
72
- }), /* @__PURE__ */ jsxs("p", {
73
- class: "page-header__desc",
74
- children: [
75
- "Manage general settings, labels, tokens, webhooks and members for ",
76
- project.name,
77
- "."
78
- ]
79
- })] })
80
- })]
81
- }),
82
- /* @__PURE__ */ jsxs("nav", {
83
- class: "tabs",
84
- "aria-label": "Settings sections",
85
- children: [
86
- renderTabLink(project, activeTab, "general", "General"),
87
- renderTabLink(project, activeTab, "tests", "Tests"),
88
- renderTabLink(project, activeTab, "labels", "Labels"),
89
- renderTabLink(project, activeTab, "tokens", "Tokens"),
90
- renderTabLink(project, activeTab, "webhooks", "Webhooks"),
91
- renderTabLink(project, activeTab, "members", "Members"),
92
- renderTabLink(project, activeTab, "status", "Git status")
93
- ]
94
- }),
95
- renderActiveTab(data, formState)
96
- ]
97
- });
98
- }
99
- //#endregion
100
- export { renderProjectSettingsPage };
101
-
102
- //# sourceMappingURL=project-settings.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"project-settings.mjs","names":[],"sources":["../../src/pages/project-settings.tsx"],"sourcesContent":["import type { GitHostProvider } from \"../adapters/git-host/index.ts\";\nimport type { LabelType } from \"../schema/label.ts\";\nimport type { Project } from \"../schema/project.ts\";\nimport type { Token } from \"../schema/token.ts\";\nimport { DocumentLayout, type RenderedContent } from \"../ui/document.tsx\";\nimport { renderSettingsGeneral } from \"./settings-general.tsx\";\nimport { renderSettingsLabels } from \"./settings-labels.tsx\";\nimport { renderSettingsMembers, type SettingsMember } from \"./settings-members.tsx\";\nimport { renderSettingsStatus, type SettingsStatusConfig } from \"./settings-status.tsx\";\nimport { renderSettingsTests } from \"./settings-tests.tsx\";\nimport { renderSettingsTokens } from \"./settings-tokens.tsx\";\nimport { renderSettingsWebhooks, type SettingsWebhook } from \"./settings-webhooks.tsx\";\n\n/** Tabs available in the project settings section. */\nexport type SettingsTab =\n | \"general\"\n | \"tests\"\n | \"labels\"\n | \"tokens\"\n | \"webhooks\"\n | \"members\"\n | \"status\";\n\n/** Data required to render the project settings page with its active tab. */\nexport interface ProjectSettingsData {\n project: Project;\n activeTab: SettingsTab;\n labelTypes: LabelType[];\n tokens: Omit<Token, \"hash\">[];\n members: SettingsMember[];\n webhooks: SettingsWebhook[];\n statusConfigs: SettingsStatusConfig[];\n gitHosts: GitHostProvider[];\n isAdmin: boolean;\n}\n\n/** Form state shared by the settings tabs (field errors, global error, one-time secret). */\nexport interface SettingsFormState {\n errors?: Record<string, string>;\n globalError?: string;\n secret?: string;\n}\n\nfunction tabHref(project: Project, tab: SettingsTab): string {\n return tab === \"general\"\n ? `/projects/${project.slug}/settings`\n : `/projects/${project.slug}/settings/${tab}`;\n}\n\nfunction renderTabLink(\n project: Project,\n activeTab: SettingsTab,\n tab: SettingsTab,\n label: string,\n): unknown {\n const active = activeTab === tab;\n return (\n <a\n class={`tabs__link ${active ? \"tabs__link--active\" : \"\"}`}\n href={tabHref(project, tab)}\n aria-current={active ? \"page\" : undefined}\n >\n {label}\n </a>\n );\n}\n\nfunction renderActiveTab(data: ProjectSettingsData, formState?: SettingsFormState): unknown {\n const { project, activeTab } = data;\n if (activeTab === \"general\") return renderSettingsGeneral(project, formState, data.isAdmin);\n if (activeTab === \"tests\") return renderSettingsTests(project, data.isAdmin, formState);\n if (activeTab === \"labels\") return renderSettingsLabels(project, data.labelTypes, data.isAdmin);\n if (activeTab === \"tokens\") return renderSettingsTokens(project, data.tokens, data.isAdmin);\n if (activeTab === \"webhooks\")\n return renderSettingsWebhooks(project, data.webhooks, data.isAdmin, formState);\n if (activeTab === \"members\") return renderSettingsMembers(project, data.members, data.isAdmin);\n if (activeTab === \"status\")\n return renderSettingsStatus(project, data.statusConfigs, data.gitHosts, data.isAdmin);\n return null;\n}\n\n/** Project settings shell: tab navigation plus the active settings tab. */\nexport function renderProjectSettingsPage(\n data: ProjectSettingsData,\n formState?: SettingsFormState,\n): RenderedContent {\n const { project, activeTab } = data;\n return (\n <DocumentLayout\n title={`${project.name} · Settings`}\n nav={{ active: \"settings\", projectSlug: project.slug, projectName: project.name }}\n >\n <div class=\"page-header\">\n <nav class=\"breadcrumbs\" aria-label=\"Breadcrumb\">\n <ol>\n <li>\n <a href=\"/projects\">Projects</a>\n </li>\n <li>\n <a href={`/projects/${project.slug}/builds`}>{project.name}</a>\n </li>\n <li>\n <span aria-current=\"page\">Settings</span>\n </li>\n </ol>\n </nav>\n <div class=\"page-header__row\">\n <div>\n <h1 class=\"page-header__title\">Project settings</h1>\n <p class=\"page-header__desc\">\n Manage general settings, labels, tokens, webhooks and members for {project.name}.\n </p>\n </div>\n </div>\n </div>\n\n <nav class=\"tabs\" aria-label=\"Settings sections\">\n {renderTabLink(project, activeTab, \"general\", \"General\")}\n {renderTabLink(project, activeTab, \"tests\", \"Tests\")}\n {renderTabLink(project, activeTab, \"labels\", \"Labels\")}\n {renderTabLink(project, activeTab, \"tokens\", \"Tokens\")}\n {renderTabLink(project, activeTab, \"webhooks\", \"Webhooks\")}\n {renderTabLink(project, activeTab, \"members\", \"Members\")}\n {renderTabLink(project, activeTab, \"status\", \"Git status\")}\n </nav>\n\n {renderActiveTab(data, formState)}\n </DocumentLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AA2CA,SAAS,QAAQ,SAAkB,KAA0B;CAC3D,OAAO,QAAQ,YACX,aAAa,QAAQ,KAAK,aAC1B,aAAa,QAAQ,KAAK,YAAY;AAC5C;AAEA,SAAS,cACP,SACA,WACA,KACA,OACS;CACT,MAAM,SAAS,cAAc;CAC7B,OACE,oBAAC,KAAD;EACE,OAAO,cAAc,SAAS,uBAAuB;EACrD,MAAM,QAAQ,SAAS,GAAG;EAC1B,gBAAc,SAAS,SAAS,KAAA;EAE/B,UAAA;CACA,CAAA;AAEP;AAEA,SAAS,gBAAgB,MAA2B,WAAwC;CAC1F,MAAM,EAAE,SAAS,cAAc;CAC/B,IAAI,cAAc,WAAW,OAAO,sBAAsB,SAAS,WAAW,KAAK,OAAO;CAC1F,IAAI,cAAc,SAAS,OAAO,oBAAoB,SAAS,KAAK,SAAS,SAAS;CACtF,IAAI,cAAc,UAAU,OAAO,qBAAqB,SAAS,KAAK,YAAY,KAAK,OAAO;CAC9F,IAAI,cAAc,UAAU,OAAO,qBAAqB,SAAS,KAAK,QAAQ,KAAK,OAAO;CAC1F,IAAI,cAAc,YAChB,OAAO,uBAAuB,SAAS,KAAK,UAAU,KAAK,SAAS,SAAS;CAC/E,IAAI,cAAc,WAAW,OAAO,sBAAsB,SAAS,KAAK,SAAS,KAAK,OAAO;CAC7F,IAAI,cAAc,UAChB,OAAO,qBAAqB,SAAS,KAAK,eAAe,KAAK,UAAU,KAAK,OAAO;CACtF,OAAO;AACT;;AAGA,SAAgB,0BACd,MACA,WACiB;CACjB,MAAM,EAAE,SAAS,cAAc;CAC/B,OACE,qBAAC,gBAAD;EACE,OAAO,GAAG,QAAQ,KAAK;EACvB,KAAK;GAAE,QAAQ;GAAY,aAAa,QAAQ;GAAM,aAAa,QAAQ;EAAK;EAFlF,UAAA;GAIE,qBAAC,OAAD;IAAK,OAAM;IAAX,UAAA,CACE,oBAAC,OAAD;KAAK,OAAM;KAAc,cAAW;KAClC,UAAA,qBAAC,MAAD,EAAA,UAAA;MACE,oBAAC,MAAD,EAAA,UACE,oBAAC,KAAD;OAAG,MAAK;OAAY,UAAA;MAAW,CAAA,EAC7B,CAAA;MACJ,oBAAC,MAAD,EAAA,UACE,oBAAC,KAAD;OAAG,MAAM,aAAa,QAAQ,KAAK;OAAW,UAAA,QAAQ;MAAQ,CAAA,EAC5D,CAAA;MACJ,oBAAC,MAAD,EAAA,UACE,oBAAC,QAAD;OAAM,gBAAa;OAAO,UAAA;MAAc,CAAA,EACtC,CAAA;KACF,EAAA,CAAA;IACD,CAAA,GACL,oBAAC,OAAD;KAAK,OAAM;KACT,UAAA,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,MAAD;MAAI,OAAM;MAAqB,UAAA;KAAoB,CAAA,GACnD,qBAAC,KAAD;MAAG,OAAM;MAAT,UAAA;OAA6B;OACwC,QAAQ;OAAK;MAC/E;KACA,CAAA,CAAA,EAAA,CAAA;IACF,CAAA,CACF;;GAEL,qBAAC,OAAD;IAAK,OAAM;IAAO,cAAW;IAA7B,UAAA;KACG,cAAc,SAAS,WAAW,WAAW,SAAS;KACtD,cAAc,SAAS,WAAW,SAAS,OAAO;KAClD,cAAc,SAAS,WAAW,UAAU,QAAQ;KACpD,cAAc,SAAS,WAAW,UAAU,QAAQ;KACpD,cAAc,SAAS,WAAW,YAAY,UAAU;KACxD,cAAc,SAAS,WAAW,WAAW,SAAS;KACtD,cAAc,SAAS,WAAW,UAAU,YAAY;IACtD;;GAEJ,gBAAgB,MAAM,SAAS;EAClB;;AAEpB"}
@@ -1,184 +0,0 @@
1
- import "node:path";
2
- import "node:url";
3
- import.meta.url;
4
- import { BuildModel } from "../models/build.mjs";
5
- import { ProjectModel } from "../models/project.mjs";
6
- import { getStore } from "../store.mjs";
7
- import { DocumentLayout } from "../ui/document.mjs";
8
- import { Badge } from "../ui/feedback.mjs";
9
- import { jsx, jsxs } from "hono/jsx/jsx-runtime";
10
- //#region src/pages/projects.tsx
11
- /** Projects overview page: project cards with latest build plus next steps. */
12
- async function renderProjectsPage() {
13
- const { db, user } = getStore();
14
- const projects = await new ProjectModel(db).list();
15
- const canCreate = !user || user.role === "admin" || user.role === "member";
16
- const recentCounts = await Promise.all(projects.map(async (project) => {
17
- const builds = await new BuildModel(db).list(project.id);
18
- return {
19
- slug: project.slug,
20
- count: builds.length,
21
- latest: builds[0] ?? null
22
- };
23
- }));
24
- const countsBySlug = new Map(recentCounts.map((entry) => [entry.slug, entry]));
25
- return /* @__PURE__ */ jsxs(DocumentLayout, {
26
- title: "Projects",
27
- nav: { active: "projects" },
28
- children: [
29
- /* @__PURE__ */ jsx("div", {
30
- class: "page-header",
31
- children: /* @__PURE__ */ jsxs("div", {
32
- class: "page-header__row",
33
- children: [/* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h1", {
34
- class: "page-header__title",
35
- children: "Projects"
36
- }), /* @__PURE__ */ jsx("p", {
37
- class: "page-header__desc",
38
- children: "Each project is one Storybook. Create a project, then upload builds from CI."
39
- })] }), /* @__PURE__ */ jsx("div", {
40
- class: "page-header__actions",
41
- children: canCreate ? /* @__PURE__ */ jsx("a", {
42
- class: "btn btn--primary",
43
- href: "/projects/new",
44
- children: "New project"
45
- }) : null
46
- })]
47
- })
48
- }),
49
- projects.length === 0 ? /* @__PURE__ */ jsxs("div", {
50
- class: "empty",
51
- children: [
52
- /* @__PURE__ */ jsx("h2", {
53
- class: "empty__title",
54
- children: "No projects yet"
55
- }),
56
- /* @__PURE__ */ jsx("p", {
57
- class: "empty__desc",
58
- children: "Create your first project to start visual testing. Projects are free and unlimited."
59
- }),
60
- canCreate ? /* @__PURE__ */ jsx("div", {
61
- class: "empty__action",
62
- children: /* @__PURE__ */ jsx("a", {
63
- class: "btn btn--primary",
64
- href: "/projects/new",
65
- children: "Create project"
66
- })
67
- }) : null
68
- ]
69
- }) : /* @__PURE__ */ jsx("div", {
70
- class: "grid",
71
- style: "gap:.75rem;",
72
- children: projects.map((project) => {
73
- const info = countsBySlug.get(project.slug);
74
- return /* @__PURE__ */ jsx("div", {
75
- class: "card card--padded",
76
- children: /* @__PURE__ */ jsxs("div", {
77
- style: "display:flex; justify-content:space-between; gap:1rem; flex-wrap:wrap; align-items:flex-start;",
78
- children: [/* @__PURE__ */ jsxs("div", {
79
- style: "min-width:0;",
80
- children: [
81
- /* @__PURE__ */ jsx("h2", {
82
- style: "margin:0; font-size:1.15rem;",
83
- children: /* @__PURE__ */ jsx("a", {
84
- href: `/projects/${project.slug}/builds`,
85
- children: project.name
86
- })
87
- }),
88
- /* @__PURE__ */ jsxs("p", {
89
- class: "field__hint",
90
- style: "margin:.2rem 0 0;",
91
- children: [
92
- /* @__PURE__ */ jsx("code", { children: project.slug }),
93
- " ",
94
- project.gitRepository ? `· ${project.gitRepository}` : "",
95
- " · default",
96
- " ",
97
- /* @__PURE__ */ jsx(Badge, {
98
- tone: "neutral",
99
- children: project.gitDefaultBranch
100
- })
101
- ]
102
- }),
103
- info?.latest ? /* @__PURE__ */ jsxs("p", {
104
- class: "field__hint",
105
- style: "margin:.3rem 0 0;",
106
- children: [
107
- "Latest: ",
108
- info.latest.gitBranch,
109
- " · ",
110
- info.latest.gitSha.slice(0, 7),
111
- " ·",
112
- " ",
113
- /* @__PURE__ */ jsx(Badge, {
114
- tone: info.latest.status === "approved" ? "success" : info.latest.status === "reviewing" ? "warning" : "neutral",
115
- children: info.latest.status
116
- })
117
- ]
118
- }) : /* @__PURE__ */ jsx("p", {
119
- class: "field__hint",
120
- style: "margin:.3rem 0 0;",
121
- children: "No builds yet."
122
- })
123
- ]
124
- }), /* @__PURE__ */ jsxs("div", {
125
- style: "display:flex; gap:.5rem; flex-wrap:wrap;",
126
- children: [/* @__PURE__ */ jsxs("a", {
127
- class: "btn btn--secondary",
128
- href: `/projects/${project.slug}/builds`,
129
- children: ["Builds ", info?.count ? `(${info.count})` : ""]
130
- }), /* @__PURE__ */ jsx("a", {
131
- class: "btn btn--ghost",
132
- href: `/projects/${project.slug}/settings`,
133
- children: "Settings"
134
- })]
135
- })]
136
- })
137
- }, project.id);
138
- })
139
- }),
140
- /* @__PURE__ */ jsxs("div", {
141
- class: "card card--padded",
142
- style: "margin-top:1rem;",
143
- children: [/* @__PURE__ */ jsx("h3", {
144
- style: "margin:0 0 .4rem;",
145
- children: "Next steps"
146
- }), /* @__PURE__ */ jsxs("ol", {
147
- style: "margin:.4rem 0 0; padding-left:1.2rem; color:var(--text-secondary);",
148
- children: [
149
- /* @__PURE__ */ jsxs("li", { children: [
150
- "Create a project (or run",
151
- " ",
152
- /* @__PURE__ */ jsx("code", { children: "npx @storyshelf/cli create --url http://localhost:3000 --name \"My Storybook\" --token $STORYSHELF_ADMIN_TOKEN" }),
153
- ", or ",
154
- /* @__PURE__ */ jsx("code", { children: "init --url --slug" }),
155
- " to write ",
156
- /* @__PURE__ */ jsx("code", { children: ".storybook/storyshelf.json" }),
157
- ")"
158
- ] }),
159
- /* @__PURE__ */ jsxs("li", { children: [
160
- "Generate a token in ",
161
- /* @__PURE__ */ jsx("strong", { children: "Settings → Tokens" }),
162
- " and set",
163
- " ",
164
- /* @__PURE__ */ jsx("code", { children: "STORYSHELF_TOKEN" }),
165
- " in CI."
166
- ] }),
167
- /* @__PURE__ */ jsxs("li", { children: [
168
- "Upload: ",
169
- /* @__PURE__ */ jsx("code", { children: "npx @storyshelf/cli upload" }),
170
- " (or ",
171
- /* @__PURE__ */ jsx("code", { children: "npx @storyshelf/cli" }),
172
- " ",
173
- "defaults to upload when config exists)"
174
- ] })
175
- ]
176
- })]
177
- })
178
- ]
179
- });
180
- }
181
- //#endregion
182
- export { renderProjectsPage };
183
-
184
- //# sourceMappingURL=projects.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"projects.mjs","names":[],"sources":["../../src/pages/projects.tsx"],"sourcesContent":["import type { HtmlEscapedString } from \"hono/utils/html\";\nimport { BuildModel } from \"../models/build.ts\";\nimport { ProjectModel } from \"../models/project.ts\";\nimport { getStore } from \"../store.ts\";\nimport { Badge } from \"../ui/components.tsx\";\nimport { DocumentLayout, type RenderedContent } from \"../ui/document.tsx\";\n\n/** Projects overview page: project cards with latest build plus next steps. */\nexport async function renderProjectsPage(): Promise<RenderedContent> {\n const { db, user } = getStore();\n const projects = await new ProjectModel(db).list();\n const canCreate = !user || user.role === \"admin\" || user.role === \"member\";\n\n const recentCounts = await Promise.all(\n projects.map(async (project) => {\n const builds = await new BuildModel(db).list(project.id);\n return { slug: project.slug, count: builds.length, latest: builds[0] ?? null };\n }),\n );\n const countsBySlug = new Map(recentCounts.map((entry) => [entry.slug, entry]));\n\n return (\n <DocumentLayout title=\"Projects\" nav={{ active: \"projects\" }}>\n <div class=\"page-header\">\n <div class=\"page-header__row\">\n <div>\n <h1 class=\"page-header__title\">Projects</h1>\n <p class=\"page-header__desc\">\n Each project is one Storybook. Create a project, then upload builds from CI.\n </p>\n </div>\n <div class=\"page-header__actions\">\n {canCreate ? (\n <a class=\"btn btn--primary\" href=\"/projects/new\">\n New project\n </a>\n ) : null}\n </div>\n </div>\n </div>\n\n {projects.length === 0 ? (\n <div class=\"empty\">\n <h2 class=\"empty__title\">No projects yet</h2>\n <p class=\"empty__desc\">\n Create your first project to start visual testing. Projects are free and unlimited.\n </p>\n {canCreate ? (\n <div class=\"empty__action\">\n <a class=\"btn btn--primary\" href=\"/projects/new\">\n Create project\n </a>\n </div>\n ) : null}\n </div>\n ) : (\n <div class=\"grid\" style=\"gap:.75rem;\">\n {projects.map((project): HtmlEscapedString | Promise<HtmlEscapedString> => {\n const info = countsBySlug.get(project.slug);\n return (\n <div key={project.id} class=\"card card--padded\">\n <div style=\"display:flex; justify-content:space-between; gap:1rem; flex-wrap:wrap; align-items:flex-start;\">\n <div style=\"min-width:0;\">\n <h2 style=\"margin:0; font-size:1.15rem;\">\n <a href={`/projects/${project.slug}/builds`}>{project.name}</a>\n </h2>\n <p class=\"field__hint\" style=\"margin:.2rem 0 0;\">\n <code>{project.slug}</code>{\" \"}\n {project.gitRepository ? `· ${project.gitRepository}` : \"\"} · default{\" \"}\n <Badge tone=\"neutral\">{project.gitDefaultBranch}</Badge>\n </p>\n {info?.latest ? (\n <p class=\"field__hint\" style=\"margin:.3rem 0 0;\">\n Latest: {info.latest.gitBranch} · {info.latest.gitSha.slice(0, 7)} ·{\" \"}\n <Badge\n tone={\n info.latest.status === \"approved\"\n ? \"success\"\n : info.latest.status === \"reviewing\"\n ? \"warning\"\n : \"neutral\"\n }\n >\n {info.latest.status}\n </Badge>\n </p>\n ) : (\n <p class=\"field__hint\" style=\"margin:.3rem 0 0;\">\n No builds yet.\n </p>\n )}\n </div>\n <div style=\"display:flex; gap:.5rem; flex-wrap:wrap;\">\n <a class=\"btn btn--secondary\" href={`/projects/${project.slug}/builds`}>\n Builds {info?.count ? `(${info.count})` : \"\"}\n </a>\n <a class=\"btn btn--ghost\" href={`/projects/${project.slug}/settings`}>\n Settings\n </a>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n )}\n\n <div class=\"card card--padded\" style=\"margin-top:1rem;\">\n <h3 style=\"margin:0 0 .4rem;\">Next steps</h3>\n <ol style=\"margin:.4rem 0 0; padding-left:1.2rem; color:var(--text-secondary);\">\n <li>\n Create a project (or run{\" \"}\n <code>\n npx @storyshelf/cli create --url http://localhost:3000 --name \"My Storybook\" --token\n $STORYSHELF_ADMIN_TOKEN\n </code>\n , or <code>init --url --slug</code> to write <code>.storybook/storyshelf.json</code>)\n </li>\n <li>\n Generate a token in <strong>Settings → Tokens</strong> and set{\" \"}\n <code>STORYSHELF_TOKEN</code> in CI.\n </li>\n <li>\n Upload: <code>npx @storyshelf/cli upload</code> (or <code>npx @storyshelf/cli</code>{\" \"}\n defaults to upload when config exists)\n </li>\n </ol>\n </div>\n </DocumentLayout>\n );\n}\n"],"mappings":"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"}
@@ -1,94 +0,0 @@
1
- import "node:path";
2
- import "node:url";
3
- import.meta.url;
4
- import { DocumentLayout } from "../ui/document.mjs";
5
- import { jsx, jsxs } from "hono/jsx/jsx-runtime";
6
- //#region src/pages/root.tsx
7
- /** Landing page introducing capture, diff, and review. */
8
- function renderRootPage() {
9
- return /* @__PURE__ */ jsxs(DocumentLayout, {
10
- title: "Welcome",
11
- nav: { active: "projects" },
12
- children: [/* @__PURE__ */ jsxs("div", {
13
- class: "card card--padded",
14
- style: "text-align:center; padding:2rem 1.5rem;",
15
- children: [
16
- /* @__PURE__ */ jsx("h1", {
17
- style: "margin:0 0 .4rem; font-size:1.9rem; letter-spacing:-0.02em;",
18
- children: "Welcome to StoryShelf"
19
- }),
20
- /* @__PURE__ */ jsx("p", {
21
- style: "color:var(--text-secondary); max-width:60ch; margin:0 auto 1rem;",
22
- children: "Self-hosted visual testing for Storybook. Capture every story, diff against baselines, and review changes before they ship."
23
- }),
24
- /* @__PURE__ */ jsxs("div", {
25
- style: "display:flex; gap:.5rem; justify-content:center; flex-wrap:wrap;",
26
- children: [/* @__PURE__ */ jsx("a", {
27
- class: "btn btn--primary",
28
- href: "/projects",
29
- children: "View projects"
30
- }), /* @__PURE__ */ jsx("a", {
31
- class: "btn btn--secondary",
32
- href: "/projects/new",
33
- children: "Create project"
34
- })]
35
- }),
36
- /* @__PURE__ */ jsxs("p", {
37
- class: "field__hint",
38
- style: "margin-top:1rem;",
39
- children: [
40
- "Tip: use",
41
- " ",
42
- /* @__PURE__ */ jsx("code", { children: "npx @storyshelf/cli create --url <url> --name <name> --token $STORYSHELF_ADMIN_TOKEN" }),
43
- " ",
44
- "to create a project and token for CI, or ",
45
- /* @__PURE__ */ jsx("code", { children: "npx @storyshelf/cli init" }),
46
- " to write",
47
- " ",
48
- /* @__PURE__ */ jsx("code", { children: ".storybook/storyshelf.json" }),
49
- "."
50
- ]
51
- })
52
- ]
53
- }), /* @__PURE__ */ jsxs("div", {
54
- class: "grid grid--3",
55
- style: "margin-top:1rem;",
56
- children: [
57
- /* @__PURE__ */ jsxs("div", {
58
- class: "card card--padded",
59
- children: [/* @__PURE__ */ jsx("h3", {
60
- style: "margin:0 0 .3rem;",
61
- children: "Capture"
62
- }), /* @__PURE__ */ jsx("p", {
63
- class: "field__hint",
64
- children: "Upload your Storybook build. Server renders stories with Playwright — deterministic, no repo cloning."
65
- })]
66
- }),
67
- /* @__PURE__ */ jsxs("div", {
68
- class: "card card--padded",
69
- children: [/* @__PURE__ */ jsx("h3", {
70
- style: "margin:0 0 .3rem;",
71
- children: "Diff"
72
- }), /* @__PURE__ */ jsx("p", {
73
- class: "field__hint",
74
- children: "Pixel-perfect diff with pixelmatch. Configurable thresholds, overlay images stored on disk."
75
- })]
76
- }),
77
- /* @__PURE__ */ jsxs("div", {
78
- class: "card card--padded",
79
- children: [/* @__PURE__ */ jsx("h3", {
80
- style: "margin:0 0 .3rem;",
81
- children: "Review"
82
- }), /* @__PURE__ */ jsx("p", {
83
- class: "field__hint",
84
- children: "Per-branch baselines with fallback to default. Approve changes per-story or bulk."
85
- })]
86
- })
87
- ]
88
- })]
89
- });
90
- }
91
- //#endregion
92
- export { renderRootPage };
93
-
94
- //# sourceMappingURL=root.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"root.mjs","names":[],"sources":["../../src/pages/root.tsx"],"sourcesContent":["import { DocumentLayout, type RenderedContent } from \"../ui/document.tsx\";\n\n/** Landing page introducing capture, diff, and review. */\nexport function renderRootPage(): RenderedContent {\n return (\n <DocumentLayout title=\"Welcome\" nav={{ active: \"projects\" }}>\n <div class=\"card card--padded\" style=\"text-align:center; padding:2rem 1.5rem;\">\n <h1 style=\"margin:0 0 .4rem; font-size:1.9rem; letter-spacing:-0.02em;\">\n Welcome to StoryShelf\n </h1>\n <p style=\"color:var(--text-secondary); max-width:60ch; margin:0 auto 1rem;\">\n Self-hosted visual testing for Storybook. Capture every story, diff against baselines, and\n review changes before they ship.\n </p>\n <div style=\"display:flex; gap:.5rem; justify-content:center; flex-wrap:wrap;\">\n <a class=\"btn btn--primary\" href=\"/projects\">\n View projects\n </a>\n <a class=\"btn btn--secondary\" href=\"/projects/new\">\n Create project\n </a>\n </div>\n <p class=\"field__hint\" style=\"margin-top:1rem;\">\n Tip: use{\" \"}\n <code>\n npx @storyshelf/cli create --url &lt;url&gt; --name &lt;name&gt; --token\n $STORYSHELF_ADMIN_TOKEN\n </code>{\" \"}\n to create a project and token for CI, or <code>npx @storyshelf/cli init</code> to write{\" \"}\n <code>.storybook/storyshelf.json</code>.\n </p>\n </div>\n\n <div class=\"grid grid--3\" style=\"margin-top:1rem;\">\n <div class=\"card card--padded\">\n <h3 style=\"margin:0 0 .3rem;\">Capture</h3>\n <p class=\"field__hint\">\n Upload your Storybook build. Server renders stories with Playwright — deterministic, no\n repo cloning.\n </p>\n </div>\n <div class=\"card card--padded\">\n <h3 style=\"margin:0 0 .3rem;\">Diff</h3>\n <p class=\"field__hint\">\n Pixel-perfect diff with pixelmatch. Configurable thresholds, overlay images stored on\n disk.\n </p>\n </div>\n <div class=\"card card--padded\">\n <h3 style=\"margin:0 0 .3rem;\">Review</h3>\n <p class=\"field__hint\">\n Per-branch baselines with fallback to default. Approve changes per-story or bulk.\n </p>\n </div>\n </div>\n </DocumentLayout>\n );\n}\n"],"mappings":";;;;;;;AAGA,SAAgB,iBAAkC;CAChD,OACE,qBAAC,gBAAD;EAAgB,OAAM;EAAU,KAAK,EAAE,QAAQ,WAAW;EAA1D,UAAA,CACE,qBAAC,OAAD;GAAK,OAAM;GAAoB,OAAM;GAArC,UAAA;IACE,oBAAC,MAAD;KAAI,OAAM;KAA8D,UAAA;IAEpE,CAAA;IACJ,oBAAC,KAAD;KAAG,OAAM;KAAmE,UAAA;IAGzE,CAAA;IACH,qBAAC,OAAD;KAAK,OAAM;KAAX,UAAA,CACE,oBAAC,KAAD;MAAG,OAAM;MAAmB,MAAK;MAAY,UAAA;KAE1C,CAAA,GACH,oBAAC,KAAD;MAAG,OAAM;MAAqB,MAAK;MAAgB,UAAA;KAEhD,CAAA,CACA;;IACL,qBAAC,KAAD;KAAG,OAAM;KAAc,OAAM;KAA7B,UAAA;MAAgD;MACrC;MACT,oBAAC,QAAD,EAAA,UAAM,uFAGA,CAAA;MAAE;MAAI;MAC6B,oBAAC,QAAD,EAAA,UAAM,2BAA8B,CAAA;MAAC;MAAU;MACxF,oBAAC,QAAD,EAAA,UAAM,6BAAgC,CAAA;MAAC;KACtC;;GACA;EAEL,CAAA,GAAA,qBAAC,OAAD;GAAK,OAAM;GAAe,OAAM;GAAhC,UAAA;IACE,qBAAC,OAAD;KAAK,OAAM;KAAX,UAAA,CACE,oBAAC,MAAD;MAAI,OAAM;MAAoB,UAAA;KAAW,CAAA,GACzC,oBAAC,KAAD;MAAG,OAAM;MAAc,UAAA;KAGpB,CAAA,CACA;;IACL,qBAAC,OAAD;KAAK,OAAM;KAAX,UAAA,CACE,oBAAC,MAAD;MAAI,OAAM;MAAoB,UAAA;KAAQ,CAAA,GACtC,oBAAC,KAAD;MAAG,OAAM;MAAc,UAAA;KAGpB,CAAA,CACA;;IACL,qBAAC,OAAD;KAAK,OAAM;KAAX,UAAA,CACE,oBAAC,MAAD;MAAI,OAAM;MAAoB,UAAA;KAAU,CAAA,GACxC,oBAAC,KAAD;MAAG,OAAM;MAAc,UAAA;KAEpB,CAAA,CACA;;GACF;EACS,CAAA,CAAA;;AAEpB"}