@openrails/contentkit-ui 0.0.0-placeholder → 0.68.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (367) hide show
  1. package/README.md +424 -1
  2. package/dist/appearance.d.ts +38 -0
  3. package/dist/appearance.js +15 -0
  4. package/dist/appearance.js.map +1 -0
  5. package/dist/assets/hash.worker-BYfo-7MQ.js.map +1 -0
  6. package/dist/client/aspect.d.ts +6 -0
  7. package/dist/client/aspect.js +17 -0
  8. package/dist/client/aspect.js.map +1 -0
  9. package/dist/client/client.d.ts +51 -0
  10. package/dist/client/client.js +35 -0
  11. package/dist/client/client.js.map +1 -0
  12. package/dist/client/codes.d.ts +12 -0
  13. package/dist/client/codes.js +19 -0
  14. package/dist/client/codes.js.map +1 -0
  15. package/dist/client/content/bans.d.ts +15 -0
  16. package/dist/client/content/bans.js +40 -0
  17. package/dist/client/content/bans.js.map +1 -0
  18. package/dist/client/content/comments.d.ts +36 -0
  19. package/dist/client/content/comments.js +93 -0
  20. package/dist/client/content/comments.js.map +1 -0
  21. package/dist/client/content/favorites.d.ts +14 -0
  22. package/dist/client/content/favorites.js +42 -0
  23. package/dist/client/content/favorites.js.map +1 -0
  24. package/dist/client/content/moderation.d.ts +18 -0
  25. package/dist/client/content/moderation.js +37 -0
  26. package/dist/client/content/moderation.js.map +1 -0
  27. package/dist/client/content/polls.d.ts +47 -0
  28. package/dist/client/content/polls.js +148 -0
  29. package/dist/client/content/polls.js.map +1 -0
  30. package/dist/client/content/posts.d.ts +44 -0
  31. package/dist/client/content/posts.js +91 -0
  32. package/dist/client/content/posts.js.map +1 -0
  33. package/dist/client/content/reactions.d.ts +12 -0
  34. package/dist/client/content/reactions.js +36 -0
  35. package/dist/client/content/reactions.js.map +1 -0
  36. package/dist/client/content/types.d.ts +91 -0
  37. package/dist/client/content/types.js +8 -0
  38. package/dist/client/content/types.js.map +1 -0
  39. package/dist/client/crop.d.ts +32 -0
  40. package/dist/client/crop.js +103 -0
  41. package/dist/client/crop.js.map +1 -0
  42. package/dist/client/errors.d.ts +54 -0
  43. package/dist/client/errors.js +80 -0
  44. package/dist/client/errors.js.map +1 -0
  45. package/dist/client/gallery.d.ts +43 -0
  46. package/dist/client/gallery.js +86 -0
  47. package/dist/client/gallery.js.map +1 -0
  48. package/dist/client/generated/error-codes.d.ts +5 -0
  49. package/dist/client/generated/error-codes.js +131 -0
  50. package/dist/client/generated/error-codes.js.map +1 -0
  51. package/dist/client/generated/routes.d.ts +1086 -0
  52. package/dist/client/generated/routes.js +1400 -0
  53. package/dist/client/generated/routes.js.map +1 -0
  54. package/dist/client/generated/wire.d.ts +630 -0
  55. package/dist/client/generated/wire.js +6 -0
  56. package/dist/client/generated/wire.js.map +1 -0
  57. package/dist/client/http.d.ts +79 -0
  58. package/dist/client/http.js +74 -0
  59. package/dist/client/http.js.map +1 -0
  60. package/dist/client/image.d.ts +24 -0
  61. package/dist/client/image.js +65 -0
  62. package/dist/client/image.js.map +1 -0
  63. package/dist/client/index.d.ts +33 -0
  64. package/dist/client/media/api.d.ts +36 -0
  65. package/dist/client/media/api.js +61 -0
  66. package/dist/client/media/api.js.map +1 -0
  67. package/dist/client/media/client.d.ts +247 -0
  68. package/dist/client/media/client.js +407 -0
  69. package/dist/client/media/client.js.map +1 -0
  70. package/dist/client/media/encode.d.ts +3 -0
  71. package/dist/client/media/encode.js +8 -0
  72. package/dist/client/media/encode.js.map +1 -0
  73. package/dist/client/media/hash-stream.d.ts +6 -0
  74. package/dist/client/media/hash-stream.js +16 -0
  75. package/dist/client/media/hash-stream.js.map +1 -0
  76. package/dist/client/media/hash.d.ts +12 -0
  77. package/dist/client/media/hash.js +48 -0
  78. package/dist/client/media/hash.js.map +1 -0
  79. package/dist/client/media/hash.worker-inline.js +18 -0
  80. package/dist/client/media/hash.worker-inline.js.map +1 -0
  81. package/dist/client/media/pacer.d.ts +21 -0
  82. package/dist/client/media/pacer.js +25 -0
  83. package/dist/client/media/pacer.js.map +1 -0
  84. package/dist/client/media/queue.d.ts +112 -0
  85. package/dist/client/media/queue.js +274 -0
  86. package/dist/client/media/queue.js.map +1 -0
  87. package/dist/client/media/ref.d.ts +6 -0
  88. package/dist/client/media/ref.js +10 -0
  89. package/dist/client/media/ref.js.map +1 -0
  90. package/dist/client/media/rules.d.ts +52 -0
  91. package/dist/client/media/rules.js +139 -0
  92. package/dist/client/media/rules.js.map +1 -0
  93. package/dist/client/media/transport.d.ts +13 -0
  94. package/dist/client/media/transport.js +33 -0
  95. package/dist/client/media/transport.js.map +1 -0
  96. package/dist/client/media/windows.d.ts +15 -0
  97. package/dist/client/media/windows.js +39 -0
  98. package/dist/client/media/windows.js.map +1 -0
  99. package/dist/client/playback.d.ts +200 -0
  100. package/dist/client/playback.js +142 -0
  101. package/dist/client/playback.js.map +1 -0
  102. package/dist/client/player.d.ts +102 -0
  103. package/dist/client/player.js +155 -0
  104. package/dist/client/player.js.map +1 -0
  105. package/dist/client/public.d.ts +25 -0
  106. package/dist/client/public.js +18 -0
  107. package/dist/client/public.js.map +1 -0
  108. package/dist/client/rendition.d.ts +19 -0
  109. package/dist/client/rendition.js +16 -0
  110. package/dist/client/rendition.js.map +1 -0
  111. package/dist/client/route.d.ts +39 -0
  112. package/dist/client/route.js +31 -0
  113. package/dist/client/route.js.map +1 -0
  114. package/dist/client/taxonomy.d.ts +30 -0
  115. package/dist/client/taxonomy.js +77 -0
  116. package/dist/client/taxonomy.js.map +1 -0
  117. package/dist/client.js +33 -0
  118. package/dist/components/encode-progress.d.ts +15 -0
  119. package/dist/components/encode-progress.js +49 -0
  120. package/dist/components/encode-progress.js.map +1 -0
  121. package/dist/components/hover-preview.d.ts +29 -0
  122. package/dist/components/hover-preview.js +49 -0
  123. package/dist/components/hover-preview.js.map +1 -0
  124. package/dist/components/image-crop-dialog.d.ts +48 -0
  125. package/dist/components/image-crop-dialog.js +359 -0
  126. package/dist/components/image-crop-dialog.js.map +1 -0
  127. package/dist/components/lazy-mount.d.ts +10 -0
  128. package/dist/components/lazy-mount.js +22 -0
  129. package/dist/components/lazy-mount.js.map +1 -0
  130. package/dist/components/media-folder-editor.d.ts +45 -0
  131. package/dist/components/media-folder-editor.js +564 -0
  132. package/dist/components/media-folder-editor.js.map +1 -0
  133. package/dist/components/media-gallery.d.ts +54 -0
  134. package/dist/components/media-gallery.js +597 -0
  135. package/dist/components/media-gallery.js.map +1 -0
  136. package/dist/components/media-readiness-notice.d.ts +24 -0
  137. package/dist/components/media-readiness-notice.js +61 -0
  138. package/dist/components/media-readiness-notice.js.map +1 -0
  139. package/dist/components/player-controls.d.ts +71 -0
  140. package/dist/components/player-controls.js +264 -0
  141. package/dist/components/player-controls.js.map +1 -0
  142. package/dist/components/progress.d.ts +5 -0
  143. package/dist/components/progress.js +14 -0
  144. package/dist/components/progress.js.map +1 -0
  145. package/dist/components/rendition-img.d.ts +34 -0
  146. package/dist/components/rendition-img.js +78 -0
  147. package/dist/components/rendition-img.js.map +1 -0
  148. package/dist/components/slot-editor.d.ts +95 -0
  149. package/dist/components/slot-editor.js +182 -0
  150. package/dist/components/slot-editor.js.map +1 -0
  151. package/dist/components/slot-image.d.ts +23 -0
  152. package/dist/components/slot-image.js +48 -0
  153. package/dist/components/slot-image.js.map +1 -0
  154. package/dist/components/slot-upload.d.ts +41 -0
  155. package/dist/components/slot-upload.js +213 -0
  156. package/dist/components/slot-upload.js.map +1 -0
  157. package/dist/components/social/bans.d.ts +42 -0
  158. package/dist/components/social/bans.js +300 -0
  159. package/dist/components/social/bans.js.map +1 -0
  160. package/dist/components/social/comments.d.ts +42 -0
  161. package/dist/components/social/comments.js +517 -0
  162. package/dist/components/social/comments.js.map +1 -0
  163. package/dist/components/social/engagement.d.ts +45 -0
  164. package/dist/components/social/engagement.js +129 -0
  165. package/dist/components/social/engagement.js.map +1 -0
  166. package/dist/components/social/index.d.ts +6 -0
  167. package/dist/components/social/moderation.d.ts +32 -0
  168. package/dist/components/social/moderation.js +383 -0
  169. package/dist/components/social/moderation.js.map +1 -0
  170. package/dist/components/social/parts.d.ts +50 -0
  171. package/dist/components/social/parts.js +106 -0
  172. package/dist/components/social/parts.js.map +1 -0
  173. package/dist/components/social/poll-editor.d.ts +34 -0
  174. package/dist/components/social/poll-editor.js +567 -0
  175. package/dist/components/social/poll-editor.js.map +1 -0
  176. package/dist/components/social/poll.d.ts +30 -0
  177. package/dist/components/social/poll.js +252 -0
  178. package/dist/components/social/poll.js.map +1 -0
  179. package/dist/components/sortable-list.d.ts +29 -0
  180. package/dist/components/sortable-list.js +121 -0
  181. package/dist/components/sortable-list.js.map +1 -0
  182. package/dist/components/video-mini-player.d.ts +35 -0
  183. package/dist/components/video-mini-player.js +236 -0
  184. package/dist/components/video-mini-player.js.map +1 -0
  185. package/dist/components/video-player.d.ts +146 -0
  186. package/dist/components/video-player.js +630 -0
  187. package/dist/components/video-player.js.map +1 -0
  188. package/dist/components/video-poster-picker.d.ts +59 -0
  189. package/dist/components/video-poster-picker.js +335 -0
  190. package/dist/components/video-poster-picker.js.map +1 -0
  191. package/dist/components/video-poster.d.ts +24 -0
  192. package/dist/components/video-poster.js +46 -0
  193. package/dist/components/video-poster.js.map +1 -0
  194. package/dist/i18n/context.d.ts +4 -0
  195. package/dist/i18n/context.js +11 -0
  196. package/dist/i18n/context.js.map +1 -0
  197. package/dist/i18n/messages.d.ts +40 -0
  198. package/dist/i18n/messages.js +94 -0
  199. package/dist/i18n/messages.js.map +1 -0
  200. package/dist/index.d.ts +23 -0
  201. package/dist/index.js +41 -0
  202. package/dist/locales/de.d.ts +2 -0
  203. package/dist/locales/de.js +271 -0
  204. package/dist/locales/de.js.map +1 -0
  205. package/dist/locales/en.d.ts +457 -0
  206. package/dist/locales/en.js +271 -0
  207. package/dist/locales/en.js.map +1 -0
  208. package/dist/locales/es.d.ts +2 -0
  209. package/dist/locales/es.js +271 -0
  210. package/dist/locales/es.js.map +1 -0
  211. package/dist/locales/ja.d.ts +2 -0
  212. package/dist/locales/ja.js +271 -0
  213. package/dist/locales/ja.js.map +1 -0
  214. package/dist/locales/ko.d.ts +2 -0
  215. package/dist/locales/ko.js +271 -0
  216. package/dist/locales/ko.js.map +1 -0
  217. package/dist/locales/social/de.d.ts +2 -0
  218. package/dist/locales/social/de.js +198 -0
  219. package/dist/locales/social/de.js.map +1 -0
  220. package/dist/locales/social/en.d.ts +195 -0
  221. package/dist/locales/social/en.js +198 -0
  222. package/dist/locales/social/en.js.map +1 -0
  223. package/dist/locales/social/es.d.ts +2 -0
  224. package/dist/locales/social/es.js +198 -0
  225. package/dist/locales/social/es.js.map +1 -0
  226. package/dist/locales/social/ja.d.ts +2 -0
  227. package/dist/locales/social/ja.js +198 -0
  228. package/dist/locales/social/ja.js.map +1 -0
  229. package/dist/locales/social/ko.d.ts +2 -0
  230. package/dist/locales/social/ko.js +198 -0
  231. package/dist/locales/social/ko.js.map +1 -0
  232. package/dist/locales/social/zh.d.ts +2 -0
  233. package/dist/locales/social/zh.js +198 -0
  234. package/dist/locales/social/zh.js.map +1 -0
  235. package/dist/locales/zh.d.ts +2 -0
  236. package/dist/locales/zh.js +271 -0
  237. package/dist/locales/zh.js.map +1 -0
  238. package/dist/provider.d.ts +22 -0
  239. package/dist/provider.js +59 -0
  240. package/dist/provider.js.map +1 -0
  241. package/dist/react/canonical.d.ts +33 -0
  242. package/dist/react/canonical.js +88 -0
  243. package/dist/react/canonical.js.map +1 -0
  244. package/dist/react/comments.d.ts +82 -0
  245. package/dist/react/comments.js +147 -0
  246. package/dist/react/comments.js.map +1 -0
  247. package/dist/react/config.d.ts +13 -0
  248. package/dist/react/config.js +14 -0
  249. package/dist/react/config.js.map +1 -0
  250. package/dist/react/context.d.ts +48 -0
  251. package/dist/react/context.js +37 -0
  252. package/dist/react/context.js.map +1 -0
  253. package/dist/react/crop.d.ts +49 -0
  254. package/dist/react/crop.js +107 -0
  255. package/dist/react/crop.js.map +1 -0
  256. package/dist/react/engagement.d.ts +38 -0
  257. package/dist/react/engagement.js +88 -0
  258. package/dist/react/engagement.js.map +1 -0
  259. package/dist/react/folder.d.ts +83 -0
  260. package/dist/react/folder.js +183 -0
  261. package/dist/react/folder.js.map +1 -0
  262. package/dist/react/gallery.d.ts +140 -0
  263. package/dist/react/gallery.js +477 -0
  264. package/dist/react/gallery.js.map +1 -0
  265. package/dist/react/index.d.ts +21 -0
  266. package/dist/react/inline-preview.d.ts +24 -0
  267. package/dist/react/inline-preview.js +76 -0
  268. package/dist/react/inline-preview.js.map +1 -0
  269. package/dist/react/player.d.ts +70 -0
  270. package/dist/react/player.js +214 -0
  271. package/dist/react/player.js.map +1 -0
  272. package/dist/react/polls.d.ts +74 -0
  273. package/dist/react/polls.js +176 -0
  274. package/dist/react/polls.js.map +1 -0
  275. package/dist/react/posts.d.ts +59 -0
  276. package/dist/react/posts.js +149 -0
  277. package/dist/react/posts.js.map +1 -0
  278. package/dist/react/provider.d.ts +23 -0
  279. package/dist/react/provider.js +35 -0
  280. package/dist/react/provider.js.map +1 -0
  281. package/dist/react/public.d.ts +39 -0
  282. package/dist/react/public.js +70 -0
  283. package/dist/react/public.js.map +1 -0
  284. package/dist/react/read.d.ts +52 -0
  285. package/dist/react/read.js +143 -0
  286. package/dist/react/read.js.map +1 -0
  287. package/dist/react/resources.d.ts +70 -0
  288. package/dist/react/resources.js +247 -0
  289. package/dist/react/resources.js.map +1 -0
  290. package/dist/react/slot.d.ts +102 -0
  291. package/dist/react/slot.js +181 -0
  292. package/dist/react/slot.js.map +1 -0
  293. package/dist/react/store.d.ts +51 -0
  294. package/dist/react/store.js +164 -0
  295. package/dist/react/store.js.map +1 -0
  296. package/dist/react/upload.d.ts +85 -0
  297. package/dist/react/upload.js +150 -0
  298. package/dist/react/upload.js.map +1 -0
  299. package/dist/react/use-resource.d.ts +43 -0
  300. package/dist/react/use-resource.js +66 -0
  301. package/dist/react/use-resource.js.map +1 -0
  302. package/dist/react/video.d.ts +118 -0
  303. package/dist/react/video.js +184 -0
  304. package/dist/react/video.js.map +1 -0
  305. package/dist/react/viewport.d.ts +19 -0
  306. package/dist/react/viewport.js +30 -0
  307. package/dist/react/viewport.js.map +1 -0
  308. package/dist/react.js +21 -0
  309. package/dist/scope.d.ts +14 -0
  310. package/dist/scope.js +30 -0
  311. package/dist/scope.js.map +1 -0
  312. package/dist/styles.css +3 -0
  313. package/dist/ui/alert-dialog.d.ts +18 -0
  314. package/dist/ui/alert-dialog.js +86 -0
  315. package/dist/ui/alert-dialog.js.map +1 -0
  316. package/dist/ui/alert.d.ts +10 -0
  317. package/dist/ui/alert.js +38 -0
  318. package/dist/ui/alert.js.map +1 -0
  319. package/dist/ui/avatar.d.ts +11 -0
  320. package/dist/ui/avatar.js +31 -0
  321. package/dist/ui/avatar.js.map +1 -0
  322. package/dist/ui/badge.d.ts +7 -0
  323. package/dist/ui/badge.js +31 -0
  324. package/dist/ui/badge.js.map +1 -0
  325. package/dist/ui/button.d.ts +8 -0
  326. package/dist/ui/button.js +46 -0
  327. package/dist/ui/button.js.map +1 -0
  328. package/dist/ui/dialog.d.ts +17 -0
  329. package/dist/ui/dialog.js +91 -0
  330. package/dist/ui/dialog.js.map +1 -0
  331. package/dist/ui/dropdown-menu.d.ts +15 -0
  332. package/dist/ui/dropdown-menu.js +105 -0
  333. package/dist/ui/dropdown-menu.js.map +1 -0
  334. package/dist/ui/input.d.ts +3 -0
  335. package/dist/ui/input.js +17 -0
  336. package/dist/ui/input.js.map +1 -0
  337. package/dist/ui/label.d.ts +3 -0
  338. package/dist/ui/label.js +15 -0
  339. package/dist/ui/label.js.map +1 -0
  340. package/dist/ui/progress.d.ts +7 -0
  341. package/dist/ui/progress.js +31 -0
  342. package/dist/ui/progress.js.map +1 -0
  343. package/dist/ui/select.d.ts +15 -0
  344. package/dist/ui/select.js +98 -0
  345. package/dist/ui/select.js.map +1 -0
  346. package/dist/ui/skeleton.d.ts +2 -0
  347. package/dist/ui/skeleton.js +14 -0
  348. package/dist/ui/skeleton.js.map +1 -0
  349. package/dist/ui/slider.d.ts +3 -0
  350. package/dist/ui/slider.js +35 -0
  351. package/dist/ui/slider.js.map +1 -0
  352. package/dist/ui/switch.d.ts +5 -0
  353. package/dist/ui/switch.js +20 -0
  354. package/dist/ui/switch.js.map +1 -0
  355. package/dist/ui/tabs.d.ts +10 -0
  356. package/dist/ui/tabs.js +47 -0
  357. package/dist/ui/tabs.js.map +1 -0
  358. package/dist/ui/textarea.d.ts +3 -0
  359. package/dist/ui/textarea.js +15 -0
  360. package/dist/ui/textarea.js.map +1 -0
  361. package/dist/ui/toggle-group.d.ts +5 -0
  362. package/dist/ui/toggle-group.js +23 -0
  363. package/dist/ui/toggle-group.js.map +1 -0
  364. package/dist/urls/index.d.ts +100 -0
  365. package/dist/urls.js +118 -0
  366. package/dist/urls.js.map +1 -0
  367. package/package.json +113 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urls.js","names":[],"sources":["../src/urls/index.ts"],"sourcesContent":["// ContentKit content URLs: [/{lang}]/{route}/{CODE}[/{slug}]. The code is the\n// only part the server reads; the slug is decoration. Mirrors Go's contenturl\n// (the two share contenturl/testdata/vectors.json).\n\nexport const CODE_LENGTH = 9;\n\n/** Crockford base32: digits and uppercase letters without I, L, O, U. */\nexport const CODE_ALPHABET = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\";\n\n/**\n * Reads a code with Crockford's decoding rules (any case, O as 0, I and L as 1,\n * hyphens ignored) and returns its canonical form, or null when the input is\n * not a code. An all-digit result is never a code (it reads as a legacy id).\n */\nexport function parseCode(input: string): string | null {\n let out = \"\";\n for (const ch of input) {\n if (ch === \"-\") continue;\n if (ch.length !== 1 || ch.charCodeAt(0) > 0x7f) return null;\n let c = ch.toUpperCase();\n if (c === \"O\") c = \"0\";\n else if (c === \"I\" || c === \"L\") c = \"1\";\n if (!CODE_ALPHABET.includes(c) || out.length === CODE_LENGTH) return null;\n out += c;\n }\n if (out.length !== CODE_LENGTH || !/[A-Z]/.test(out)) return null;\n return out;\n}\n\n/** Reports whether input is a code in canonical form. */\nexport function isCode(input: string): boolean {\n return parseCode(input) === input;\n}\n\n/** A resolved content link, as ContentKit and host APIs return it. */\nexport interface ContentLink {\n content_kind: string;\n code: string;\n slug: string;\n /** Localized slugs keyed by language; the default slug applies otherwise. */\n slugs?: Record<string, string>;\n}\n\n/** The slug for language, falling back to the default slug. */\nexport function slugFor(link: Pick<ContentLink, \"slug\" | \"slugs\">, language = \"\"): string {\n return (language && link.slugs?.[language]) || link.slug;\n}\n\nexport type QueryInit = string | URLSearchParams | Record<string, string | number | boolean | null | undefined>;\n\nexport interface PathOptions {\n /** Language prefix segment; omitted when empty. */\n language?: string;\n /** Query string for sub-pages, e.g. { p: 12 }. Null and undefined values are dropped. */\n query?: QueryInit;\n}\n\nfunction queryString(query: QueryInit | undefined): string {\n if (query === undefined) return \"\";\n let params: URLSearchParams;\n if (typeof query === \"string\" || query instanceof URLSearchParams) {\n params = new URLSearchParams(query);\n } else {\n params = new URLSearchParams();\n for (const [k, v] of Object.entries(query)) {\n if (v !== null && v !== undefined) params.append(k, String(v));\n }\n }\n const s = params.toString();\n return s ? `?${s}` : \"\";\n}\n\n/** Joins [/{language}]/{route}/{code}[/{slug}][?query]. */\nexport function contentPath(route: string, code: string, slug = \"\", options: PathOptions = {}): string {\n const prefix = options.language ? `/${options.language}` : \"\";\n return `${prefix}/${route}/${code}${slug ? `/${slug}` : \"\"}${queryString(options.query)}`;\n}\n\nexport interface ContentURLConfig {\n /** Content kind -> the host's route segment ({ video: \"watch\", gallery: \"g\" }). */\n routes: Record<string, string>;\n /** Language segments a path may start with; kept in canonical paths. */\n languages?: string[];\n /** The site's origin (\"https://example.com\") for absolute URLs (canonical links, og:url). */\n origin?: string;\n}\n\nexport interface ParsedContentPath {\n /** \"\" when unprefixed. */\n language: string;\n route: string;\n /** Canonical form. */\n code: string;\n rawCode: string;\n /** As written; \"\" when absent. */\n slug: string;\n}\n\nexport interface CanonicalResult {\n /** The canonical path. */\n path: string;\n /** path plus the location's query. */\n location: string;\n /** The location's path is not canonical: replace it with location. */\n redirect: boolean;\n}\n\nexport interface HreflangOptions {\n /** Languages the content exists in; default every configured language. */\n languages?: readonly string[];\n /** The language x-default points at. */\n defaultLanguage?: string;\n /** The origin for absolute URLs; default the configured one (throws without either). */\n origin?: string;\n}\n\nexport interface ContentURLs {\n /** The configured language segments. */\n readonly languages: readonly string[];\n /** The configured origin, without a trailing slash. */\n readonly origin?: string;\n /** The canonical path of link; throws when its kind has no route. */\n path(link: ContentLink, options?: PathOptions): string;\n /** path() on the configured origin; throws without one. */\n url(link: ContentLink, options?: PathOptions): string;\n /** Splits a pathname; null when it is not a content path (or its code is invalid). */\n parse(pathname: string): ParsedContentPath | null;\n /**\n * Compares a location (pathname plus optional ?query and #hash) with link's\n * canonical path, for a client-side history.replaceState after the page's\n * data arrives. null when the location is not a content path or link's kind\n * has no route.\n */\n canonical(location: string, link: ContentLink): CanonicalResult | null;\n /**\n * hreflang alternates: each language's absolute URL of link (its own\n * slug), plus x-default; empty when no language is configured.\n */\n hreflang(link: ContentLink, options?: HreflangOptions): Record<string, string>;\n}\n\n/** Query parameters that only track a visit: never part of a canonical URL. */\nexport const TRACKING_PARAMS = [\"gclid\", \"gbraid\", \"wbraid\", \"dclid\", \"fbclid\", \"msclkid\", \"yclid\", \"twclid\", \"igshid\", \"mc_cid\", \"mc_eid\", \"_ga\", \"_gl\"];\n\n/**\n * href without tracking parameters (utm_* and TRACKING_PARAMS, plus drop),\n * its fragment or a trailing slash: the canonical URL of a page that is not\n * a content page.\n */\nexport function canonicalURL(href: string, options: { drop?: readonly string[] } = {}): string {\n const url = new URL(href);\n const drop = new Set([...TRACKING_PARAMS, ...(options.drop ?? [])]);\n for (const key of [...url.searchParams.keys()]) if (key.startsWith(\"utm_\") || drop.has(key)) url.searchParams.delete(key);\n url.hash = \"\";\n if (url.pathname.length > 1 && url.pathname.endsWith(\"/\")) url.pathname = url.pathname.replace(/\\/+$/, \"\");\n return url.toString();\n}\n\nconst SEGMENT = /^[a-z0-9][a-z0-9_-]*$/;\n\n/** Builds the URL helpers for one host's routes. */\nexport function createContentURLs(config: ContentURLConfig): ContentURLs {\n const routes = { ...config.routes };\n const origin = config.origin?.replace(/\\/+$/, \"\");\n if (origin !== undefined && !/^https?:\\/\\/[^/?#]+$/.test(origin)) throw new Error(`contentkit-ui/urls: origin ${JSON.stringify(config.origin)} is not an http(s) origin`);\n const languages = [...(config.languages ?? [])];\n const routeSet = new Set(Object.values(routes));\n if (routeSet.size === 0) throw new Error(\"contentkit-ui/urls: routes is empty\");\n for (const r of [...routeSet, ...languages]) {\n if (!SEGMENT.test(r)) throw new Error(`contentkit-ui/urls: ${JSON.stringify(r)} is not one lowercase path segment`);\n }\n for (const l of languages) {\n if (routeSet.has(l)) throw new Error(`contentkit-ui/urls: language ${JSON.stringify(l)} is also a route`);\n }\n\n const canonicalPath = (link: ContentLink, language: string): string | null => {\n const route = routes[link.content_kind];\n return route === undefined ? null : contentPath(route, link.code, slugFor(link, language), { language });\n };\n\n const parse = (pathname: string): ParsedContentPath | null => {\n if (!pathname.startsWith(\"/\")) return null;\n let rest = pathname.slice(1);\n if (rest.endsWith(\"/\")) rest = rest.slice(0, -1);\n let segs = rest.split(\"/\");\n if (segs.some((s) => s === \"\")) return null;\n let language = \"\";\n if (segs.length > 2 && languages.includes(segs[0]!)) {\n language = segs[0]!;\n segs = segs.slice(1);\n }\n if (segs.length < 2 || segs.length > 3 || !routeSet.has(segs[0]!)) return null;\n const code = parseCode(segs[1]!);\n if (code === null) return null;\n return { language, route: segs[0]!, code, rawCode: segs[1]!, slug: segs[2] ?? \"\" };\n };\n\n const path = (link: ContentLink, options: PathOptions = {}): string => {\n const route = routes[link.content_kind];\n if (route === undefined) throw new Error(`contentkit-ui/urls: no route for kind ${JSON.stringify(link.content_kind)}`);\n return contentPath(route, link.code, slugFor(link, options.language), options);\n };\n\n return {\n languages,\n origin,\n path,\n url(link, options) {\n if (origin === undefined) throw new Error(\"contentkit-ui/urls: url() needs ContentURLConfig.origin\");\n return origin + path(link, options);\n },\n parse,\n canonical(location, link) {\n const noHash = location.split(\"#\", 1)[0]!;\n const q = noHash.indexOf(\"?\");\n const pathname = q < 0 ? noHash : noHash.slice(0, q);\n const search = q < 0 ? \"\" : noHash.slice(q + 1);\n const parsed = parse(pathname);\n if (parsed === null) return null;\n const path = canonicalPath(link, parsed.language);\n if (path === null) return null;\n return { path, location: search ? `${path}?${search}` : path, redirect: pathname !== path };\n },\n hreflang(link, options = {}) {\n const base = options.origin?.replace(/\\/+$/, \"\") ?? origin;\n if (base === undefined) throw new Error(\"contentkit-ui/urls: hreflang() needs an origin\");\n const out: Record<string, string> = {};\n const langs = (options.languages ?? languages).filter((l) => languages.includes(l));\n for (const language of langs) out[language] = base + path(link, { language });\n const def = options.defaultLanguage;\n if (def && out[def]) out[\"x-default\"] = out[def];\n return out;\n },\n };\n}\n"],"mappings":";AAIA,IAAa,IAAc,GAGd,IAAgB;AAO7B,SAAgB,EAAU,GAA8B;CACtD,IAAI,IAAM;CACV,KAAK,IAAM,KAAM,GAAO;EACtB,IAAI,MAAO,KAAK;EAChB,IAAI,EAAG,WAAW,KAAK,EAAG,WAAW,CAAC,IAAI,KAAM,OAAO;EACvD,IAAI,IAAI,EAAG,YAAY;EAGvB,IAFI,MAAM,MAAK,IAAI,OACV,MAAM,OAAO,MAAM,SAAK,IAAI,MACjC,CAAA,mCAAe,SAAS,CAAC,KAAK,EAAI,WAAA,GAAwB,OAAO;EACrE,KAAO;CACT;CAEA,OADI,EAAI,WAAA,KAA0B,CAAC,QAAQ,KAAK,CAAG,IAAU,OACtD;AACT;AAGA,SAAgB,EAAO,GAAwB;CAC7C,OAAO,EAAU,CAAK,MAAM;AAC9B;AAYA,SAAgB,EAAQ,GAA2C,IAAW,IAAY;CACxF,OAAQ,KAAY,EAAK,QAAQ,MAAc,EAAK;AACtD;AAWA,SAAS,EAAY,GAAsC;CACzD,IAAI,MAAU,KAAA,GAAW,OAAO;CAChC,IAAI;CACJ,IAAI,OAAO,KAAU,YAAY,aAAiB,iBAChD,IAAS,IAAI,gBAAgB,CAAK;MAC7B;EACL,IAAS,IAAI,gBAAgB;EAC7B,KAAK,IAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,CAAK,GACvC,AAAI,KAAM,QAAyB,EAAO,OAAO,GAAG,OAAO,CAAC,CAAC;CAEjE;CACA,IAAM,IAAI,EAAO,SAAS;CAC1B,OAAO,IAAI,IAAI,MAAM;AACvB;AAGA,SAAgB,EAAY,GAAe,GAAc,IAAO,IAAI,IAAuB,CAAC,GAAW;CAErG,OAAO,GADQ,EAAQ,WAAW,IAAI,EAAQ,aAAa,GAC1C,GAAG,EAAM,GAAG,IAAO,IAAO,IAAI,MAAS,KAAK,EAAY,EAAQ,KAAK;AACxF;AAkEA,IAAa,IAAkB;CAAC;CAAS;CAAU;CAAU;CAAS;CAAU;CAAW;CAAS;CAAU;CAAU;CAAU;CAAU;CAAO;AAAK;AAOxJ,SAAgB,EAAa,GAAc,IAAwC,CAAC,GAAW;CAC7F,IAAM,IAAM,IAAI,IAAI,CAAI,GAClB,oBAAO,IAAI,IAAI,CAAC,GAAG,GAAiB,GAAI,EAAQ,QAAQ,CAAC,CAAE,CAAC;CAClE,KAAK,IAAM,KAAO,CAAC,GAAG,EAAI,aAAa,KAAK,CAAC,GAAG,CAAI,EAAI,WAAW,MAAM,KAAK,EAAK,IAAI,CAAG,MAAG,EAAI,aAAa,OAAO,CAAG;CAGxH,OAFA,EAAI,OAAO,IACP,EAAI,SAAS,SAAS,KAAK,EAAI,SAAS,SAAS,GAAG,MAAG,EAAI,WAAW,EAAI,SAAS,QAAQ,QAAQ,EAAE,IAClG,EAAI,SAAS;AACtB;AAEA,IAAM,IAAU;AAGhB,SAAgB,EAAkB,GAAuC;CACvE,IAAM,IAAS,EAAE,GAAG,EAAO,OAAO,GAC5B,IAAS,EAAO,QAAQ,QAAQ,QAAQ,EAAE;CAChD,IAAI,MAAW,KAAA,KAAa,CAAC,uBAAuB,KAAK,CAAM,GAAG,MAAU,MAAM,8BAA8B,KAAK,UAAU,EAAO,MAAM,EAAE,0BAA0B;CACxK,IAAM,IAAY,CAAC,GAAI,EAAO,aAAa,CAAC,CAAE,GACxC,IAAW,IAAI,IAAI,OAAO,OAAO,CAAM,CAAC;CAC9C,IAAI,EAAS,SAAS,GAAG,MAAU,MAAM,qCAAqC;CAC9E,KAAK,IAAM,KAAK,CAAC,GAAG,GAAU,GAAG,CAAS,GACxC,IAAI,CAAC,EAAQ,KAAK,CAAC,GAAG,MAAU,MAAM,uBAAuB,KAAK,UAAU,CAAC,EAAE,mCAAmC;CAEpH,KAAK,IAAM,KAAK,GACd,IAAI,EAAS,IAAI,CAAC,GAAG,MAAU,MAAM,gCAAgC,KAAK,UAAU,CAAC,EAAE,iBAAiB;CAG1G,IAAM,KAAiB,GAAmB,MAAoC;EAC5E,IAAM,IAAQ,EAAO,EAAK;EAC1B,OAAO,MAAU,KAAA,IAAY,OAAO,EAAY,GAAO,EAAK,MAAM,EAAQ,GAAM,CAAQ,GAAG,EAAE,YAAS,CAAC;CACzG,GAEM,KAAS,MAA+C;EAC5D,IAAI,CAAC,EAAS,WAAW,GAAG,GAAG,OAAO;EACtC,IAAI,IAAO,EAAS,MAAM,CAAC;EAC3B,AAAI,EAAK,SAAS,GAAG,MAAG,IAAO,EAAK,MAAM,GAAG,EAAE;EAC/C,IAAI,IAAO,EAAK,MAAM,GAAG;EACzB,IAAI,EAAK,MAAM,MAAM,MAAM,EAAE,GAAG,OAAO;EACvC,IAAI,IAAW;EAKf,IAJI,EAAK,SAAS,KAAK,EAAU,SAAS,EAAK,EAAG,MAChD,IAAW,EAAK,IAChB,IAAO,EAAK,MAAM,CAAC,IAEjB,EAAK,SAAS,KAAK,EAAK,SAAS,KAAK,CAAC,EAAS,IAAI,EAAK,EAAG,GAAG,OAAO;EAC1E,IAAM,IAAO,EAAU,EAAK,EAAG;EAE/B,OADI,MAAS,OAAa,OACnB;GAAE;GAAU,OAAO,EAAK;GAAK;GAAM,SAAS,EAAK;GAAK,MAAM,EAAK,MAAM;EAAG;CACnF,GAEM,KAAQ,GAAmB,IAAuB,CAAC,MAAc;EACrE,IAAM,IAAQ,EAAO,EAAK;EAC1B,IAAI,MAAU,KAAA,GAAW,MAAU,MAAM,yCAAyC,KAAK,UAAU,EAAK,YAAY,GAAG;EACrH,OAAO,EAAY,GAAO,EAAK,MAAM,EAAQ,GAAM,EAAQ,QAAQ,GAAG,CAAO;CAC/E;CAEA,OAAO;EACL;EACA;EACA;EACA,IAAI,GAAM,GAAS;GACjB,IAAI,MAAW,KAAA,GAAW,MAAU,MAAM,yDAAyD;GACnG,OAAO,IAAS,EAAK,GAAM,CAAO;EACpC;EACA;EACA,UAAU,GAAU,GAAM;GACxB,IAAM,IAAS,EAAS,MAAM,KAAK,CAAC,CAAC,CAAC,IAChC,IAAI,EAAO,QAAQ,GAAG,GACtB,IAAW,IAAI,IAAI,IAAS,EAAO,MAAM,GAAG,CAAC,GAC7C,IAAS,IAAI,IAAI,KAAK,EAAO,MAAM,IAAI,CAAC,GACxC,IAAS,EAAM,CAAQ;GAC7B,IAAI,MAAW,MAAM,OAAO;GAC5B,IAAM,IAAO,EAAc,GAAM,EAAO,QAAQ;GAEhD,OADI,MAAS,OAAa,OACnB;IAAE;IAAM,UAAU,IAAS,GAAG,EAAK,GAAG,MAAW;IAAM,UAAU,MAAa;GAAK;EAC5F;EACA,SAAS,GAAM,IAAU,CAAC,GAAG;GAC3B,IAAM,IAAO,EAAQ,QAAQ,QAAQ,QAAQ,EAAE,KAAK;GACpD,IAAI,MAAS,KAAA,GAAW,MAAU,MAAM,gDAAgD;GACxF,IAAM,IAA8B,CAAC,GAC/B,KAAS,EAAQ,aAAa,EAAA,CAAW,QAAQ,MAAM,EAAU,SAAS,CAAC,CAAC;GAClF,KAAK,IAAM,KAAY,GAAO,EAAI,KAAY,IAAO,EAAK,GAAM,EAAE,YAAS,CAAC;GAC5E,IAAM,IAAM,EAAQ;GAEpB,OADI,KAAO,EAAI,OAAM,EAAI,eAAe,EAAI,KACrC;EACT;CACF;AACF"}
package/package.json CHANGED
@@ -1,11 +1,121 @@
1
1
  {
2
2
  "name": "@openrails/contentkit-ui",
3
- "version": "0.0.0-placeholder",
4
- "description": "Placeholder; real releases come from the ContentKit repository",
3
+ "version": "0.68.0",
4
+ "description": "ContentKit in the browser: client, React hooks and styled components for media, uploads and content URLs.",
5
+ "type": "module",
5
6
  "license": "MIT",
6
7
  "repository": {
7
8
  "type": "git",
8
9
  "url": "git+https://github.com/open-rails/contentkit.git",
9
10
  "directory": "sdk/ui"
11
+ },
12
+ "homepage": "https://github.com/open-rails/contentkit/tree/master/sdk/ui#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/open-rails/contentkit/issues"
15
+ },
16
+ "engines": {
17
+ "node": ">=22.12.0"
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "README.md"
22
+ ],
23
+ "sideEffects": [
24
+ "./dist/index.js",
25
+ "**/*.css"
26
+ ],
27
+ "exports": {
28
+ ".": {
29
+ "types": "./dist/index.d.ts",
30
+ "import": "./dist/index.js"
31
+ },
32
+ "./client": {
33
+ "types": "./dist/client/index.d.ts",
34
+ "import": "./dist/client.js"
35
+ },
36
+ "./react": {
37
+ "types": "./dist/react/index.d.ts",
38
+ "import": "./dist/react.js"
39
+ },
40
+ "./urls": {
41
+ "types": "./dist/urls/index.d.ts",
42
+ "import": "./dist/urls.js"
43
+ },
44
+ "./locales/*": {
45
+ "types": "./dist/locales/*.d.ts",
46
+ "import": "./dist/locales/*.js"
47
+ },
48
+ "./styles.css": "./dist/styles.css",
49
+ "./package.json": "./package.json"
50
+ },
51
+ "types": "./dist/index.d.ts",
52
+ "style": "./dist/styles.css",
53
+ "publishConfig": {
54
+ "access": "public",
55
+ "provenance": true
56
+ },
57
+ "peerDependencies": {
58
+ "react": ">=19 <20",
59
+ "react-dom": ">=19 <20"
60
+ },
61
+ "peerDependenciesMeta": {
62
+ "react": {
63
+ "optional": true
64
+ },
65
+ "react-dom": {
66
+ "optional": true
67
+ }
68
+ },
69
+ "dependencies": {
70
+ "@base-ui/react": "1.8.0",
71
+ "@dnd-kit/core": "6.3.1",
72
+ "@dnd-kit/sortable": "10.0.0",
73
+ "@dnd-kit/utilities": "3.2.2",
74
+ "@hugeicons/core-free-icons": "4.3.5",
75
+ "@hugeicons/react": "1.1.10",
76
+ "@noble/hashes": "^2.4.0",
77
+ "class-variance-authority": "0.7.1",
78
+ "cn": "0.4.0",
79
+ "hls.js": "1.7.3",
80
+ "react-easy-crop": "6.2.3"
81
+ },
82
+ "devDependencies": {
83
+ "@eslint/js": "^10.0.1",
84
+ "@playwright/test": "1.60.0",
85
+ "@tailwindcss/vite": "4.3.3",
86
+ "@testing-library/dom": "10.4.2",
87
+ "@testing-library/jest-dom": "6.9.1",
88
+ "@testing-library/react": "^16.3.3",
89
+ "@testing-library/user-event": "14.6.7",
90
+ "@types/node": "^24.13.6",
91
+ "@types/react": "^19.3.0",
92
+ "@types/react-dom": "^19.3.0",
93
+ "@vitejs/plugin-react": "6.1.1",
94
+ "eslint": "^10.12.0",
95
+ "eslint-plugin-react-hooks": "^7.1.1",
96
+ "globals": "^17.13.0",
97
+ "jsdom": "^29.1.1",
98
+ "postcss": "8.5.26",
99
+ "react": "^19.3.0",
100
+ "react-dom": "^19.3.0",
101
+ "tailwindcss": "4.3.3",
102
+ "tw-animate-css": "1.4.0",
103
+ "typescript": "^6.0.3",
104
+ "typescript-eslint": "^8.71.1",
105
+ "vite": "8.3.0",
106
+ "vite-plugin-dts": "5.1.1",
107
+ "vitest": "^4.1.11"
108
+ },
109
+ "scripts": {
110
+ "build": "vite build",
111
+ "typecheck": "tsc --noEmit",
112
+ "contract": "cd ../.. && GOWORK=off go generate ./internal/contract",
113
+ "contract:check": "pnpm contract && git diff --exit-code -- src/client/generated ../../api ../../docs/api && test -z \"$(git status --porcelain -- src/client/generated ../../api ../../docs/api)\"",
114
+ "lint": "eslint .",
115
+ "test": "vitest run --project unit",
116
+ "test:integration": "vitest run --project integration",
117
+ "demo": "vite --config demo/vite.config.ts",
118
+ "screenshots": "playwright test",
119
+ "check": "pnpm typecheck && pnpm lint && pnpm test && pnpm build"
10
120
  }
11
- }
121
+ }