@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,15 @@
1
+ import { Select as SelectPrimitive } from '@base-ui/react/select';
2
+ import * as React from "react";
3
+ declare const Select: typeof SelectPrimitive.Root;
4
+ declare function SelectGroup({ className, ...props }: SelectPrimitive.Group.Props): React.JSX.Element;
5
+ declare function SelectValue({ className, ...props }: SelectPrimitive.Value.Props): React.JSX.Element;
6
+ declare function SelectTrigger({ className, size, children, ...props }: SelectPrimitive.Trigger.Props & {
7
+ size?: "sm" | "default";
8
+ }): React.JSX.Element;
9
+ declare function SelectContent({ className, children, side, sideOffset, align, alignOffset, alignItemWithTrigger, ...props }: SelectPrimitive.Popup.Props & Pick<SelectPrimitive.Positioner.Props, "align" | "alignOffset" | "side" | "sideOffset" | "alignItemWithTrigger">): React.JSX.Element;
10
+ declare function SelectLabel({ className, ...props }: SelectPrimitive.GroupLabel.Props): React.JSX.Element;
11
+ declare function SelectItem({ className, children, ...props }: SelectPrimitive.Item.Props): React.JSX.Element;
12
+ declare function SelectSeparator({ className, ...props }: SelectPrimitive.Separator.Props): React.JSX.Element;
13
+ declare function SelectScrollUpButton({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.ScrollUpArrow>): React.JSX.Element;
14
+ declare function SelectScrollDownButton({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.ScrollDownArrow>): React.JSX.Element;
15
+ export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, };
@@ -0,0 +1,98 @@
1
+ "use client";
2
+ import { useScopeProps as e } from "../scope.js";
3
+ import "react";
4
+ import { jsx as t, jsxs as n } from "react/jsx-runtime";
5
+ import { cn as r } from "cn";
6
+ import { ArrowDown01Icon as i, ArrowUp01Icon as a, Tick02Icon as o, UnfoldMoreIcon as s } from "@hugeicons/core-free-icons";
7
+ import { HugeiconsIcon as c } from "@hugeicons/react";
8
+ import { Select as l } from "@base-ui/react/select";
9
+ //#region src/ui/select.tsx
10
+ var u = l.Root;
11
+ function d({ className: e, ...n }) {
12
+ return /* @__PURE__ */ t(l.Value, {
13
+ "data-slot": "select-value",
14
+ className: r("flex flex-1 text-left", e),
15
+ ...n
16
+ });
17
+ }
18
+ function f({ className: e, size: i = "default", children: a, ...o }) {
19
+ return /* @__PURE__ */ n(l.Trigger, {
20
+ "data-slot": "select-trigger",
21
+ "data-size": i,
22
+ className: r("flex w-fit items-center justify-between gap-1.5 rounded-md border border-input bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", e),
23
+ ...o,
24
+ children: [a, /* @__PURE__ */ t(l.Icon, { render: /* @__PURE__ */ t(c, {
25
+ icon: s,
26
+ strokeWidth: 2,
27
+ className: "pointer-events-none size-4 text-muted-foreground"
28
+ }) })]
29
+ });
30
+ }
31
+ function p({ className: i, children: a, side: o = "bottom", sideOffset: s = 4, align: c = "center", alignOffset: u = 0, alignItemWithTrigger: d = !0, ...f }) {
32
+ return /* @__PURE__ */ t(l.Portal, {
33
+ ...e(),
34
+ children: /* @__PURE__ */ t(l.Positioner, {
35
+ side: o,
36
+ sideOffset: s,
37
+ align: c,
38
+ alignOffset: u,
39
+ alignItemWithTrigger: d,
40
+ className: "isolate z-50",
41
+ children: /* @__PURE__ */ n(l.Popup, {
42
+ "data-slot": "select-content",
43
+ "data-align-trigger": d,
44
+ className: r("relative isolate z-50 max-h-(--available-height) w-(--anchor-width) min-w-36 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-md bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", i),
45
+ ...f,
46
+ children: [
47
+ /* @__PURE__ */ t(h, {}),
48
+ /* @__PURE__ */ t(l.List, { children: a }),
49
+ /* @__PURE__ */ t(g, {})
50
+ ]
51
+ })
52
+ })
53
+ });
54
+ }
55
+ function m({ className: e, children: i, ...a }) {
56
+ return /* @__PURE__ */ n(l.Item, {
57
+ "data-slot": "select-item",
58
+ className: r("relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2", e),
59
+ ...a,
60
+ children: [/* @__PURE__ */ t(l.ItemText, {
61
+ className: "flex flex-1 shrink-0 gap-2 whitespace-nowrap",
62
+ children: i
63
+ }), /* @__PURE__ */ t(l.ItemIndicator, {
64
+ render: /* @__PURE__ */ t("span", { className: "pointer-events-none absolute right-2 flex size-4 items-center justify-center" }),
65
+ children: /* @__PURE__ */ t(c, {
66
+ icon: o,
67
+ strokeWidth: 2,
68
+ className: "pointer-events-none"
69
+ })
70
+ })]
71
+ });
72
+ }
73
+ function h({ className: e, ...n }) {
74
+ return /* @__PURE__ */ t(l.ScrollUpArrow, {
75
+ "data-slot": "select-scroll-up-button",
76
+ className: r("top-0 z-10 flex w-full cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4", e),
77
+ ...n,
78
+ children: /* @__PURE__ */ t(c, {
79
+ icon: a,
80
+ strokeWidth: 2
81
+ })
82
+ });
83
+ }
84
+ function g({ className: e, ...n }) {
85
+ return /* @__PURE__ */ t(l.ScrollDownArrow, {
86
+ "data-slot": "select-scroll-down-button",
87
+ className: r("bottom-0 z-10 flex w-full cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4", e),
88
+ ...n,
89
+ children: /* @__PURE__ */ t(c, {
90
+ icon: i,
91
+ strokeWidth: 2
92
+ })
93
+ });
94
+ }
95
+ //#endregion
96
+ export { u as Select, p as SelectContent, m as SelectItem, g as SelectScrollDownButton, h as SelectScrollUpButton, f as SelectTrigger, d as SelectValue };
97
+
98
+ //# sourceMappingURL=select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.js","names":[],"sources":["../../src/ui/select.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { Select as SelectPrimitive } from \"@base-ui/react/select\"\nimport { cn } from \"cn\"\n\nimport { useScopeProps } from \"#ckui/scope\"\nimport { HugeiconsIcon } from \"@hugeicons/react\"\nimport { UnfoldMoreIcon, Tick02Icon, ArrowUp01Icon, ArrowDown01Icon } from \"@hugeicons/core-free-icons\"\n\nconst Select = SelectPrimitive.Root\n\nfunction SelectGroup({ className, ...props }: SelectPrimitive.Group.Props) {\n return (\n <SelectPrimitive.Group\n data-slot=\"select-group\"\n className={cn(\"scroll-my-1 p-1\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectValue({ className, ...props }: SelectPrimitive.Value.Props) {\n return (\n <SelectPrimitive.Value\n data-slot=\"select-value\"\n className={cn(\"flex flex-1 text-left\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: SelectPrimitive.Trigger.Props & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"flex w-fit items-center justify-between gap-1.5 rounded-md border border-input bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon\n render={\n <HugeiconsIcon icon={UnfoldMoreIcon} strokeWidth={2} className=\"pointer-events-none size-4 text-muted-foreground\" />\n }\n />\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n side = \"bottom\",\n sideOffset = 4,\n align = \"center\",\n alignOffset = 0,\n alignItemWithTrigger = true,\n ...props\n}: SelectPrimitive.Popup.Props &\n Pick<\n SelectPrimitive.Positioner.Props,\n \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\" | \"alignItemWithTrigger\"\n >) {\n return (\n <SelectPrimitive.Portal {...useScopeProps()} /* Local: the portal carries the `.ckui` scope. */>\n <SelectPrimitive.Positioner\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset}\n alignItemWithTrigger={alignItemWithTrigger}\n className=\"isolate z-50\"\n >\n <SelectPrimitive.Popup\n data-slot=\"select-content\"\n data-align-trigger={alignItemWithTrigger}\n className={cn(\"relative isolate z-50 max-h-(--available-height) w-(--anchor-width) min-w-36 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-md bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", className )}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.List>{children}</SelectPrimitive.List>\n <SelectScrollDownButton />\n </SelectPrimitive.Popup>\n </SelectPrimitive.Positioner>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: SelectPrimitive.GroupLabel.Props) {\n return (\n <SelectPrimitive.GroupLabel\n data-slot=\"select-label\"\n className={cn(\"px-2 py-1.5 text-xs text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: SelectPrimitive.Item.Props) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className\n )}\n {...props}\n >\n <SelectPrimitive.ItemText className=\"flex flex-1 shrink-0 gap-2 whitespace-nowrap\">\n {children}\n </SelectPrimitive.ItemText>\n <SelectPrimitive.ItemIndicator\n render={\n <span className=\"pointer-events-none absolute right-2 flex size-4 items-center justify-center\" />\n }\n >\n <HugeiconsIcon icon={Tick02Icon} strokeWidth={2} className=\"pointer-events-none\" />\n </SelectPrimitive.ItemIndicator>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: SelectPrimitive.Separator.Props) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"pointer-events-none -mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpArrow>) {\n return (\n <SelectPrimitive.ScrollUpArrow\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"top-0 z-10 flex w-full cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <HugeiconsIcon icon={ArrowUp01Icon} strokeWidth={2} />\n </SelectPrimitive.ScrollUpArrow>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownArrow>) {\n return (\n <SelectPrimitive.ScrollDownArrow\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"bottom-0 z-10 flex w-full cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <HugeiconsIcon icon={ArrowDown01Icon} strokeWidth={2} />\n </SelectPrimitive.ScrollDownArrow>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n"],"mappings":";;;;;;;;;AAUA,IAAM,IAAS,EAAgB;AAY/B,SAAS,EAAY,EAAE,cAAW,GAAG,KAAsC;CACzE,OACE,kBAAC,EAAgB,OAAjB;EACE,aAAU;EACV,WAAW,EAAG,yBAAyB,CAAS;EAChD,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAc,EACrB,cACA,UAAO,WACP,aACA,GAAG,KAGF;CACD,OACE,kBAAC,EAAgB,SAAjB;EACE,aAAU;EACV,aAAW;EACX,WAAW,EACT,6zBACA,CACF;EACA,GAAI;EAPN,UAAA,CASG,GACD,kBAAC,EAAgB,MAAjB,EACE,QACE,kBAAC,GAAD;GAAe,MAAM;GAAgB,aAAa;GAAG,WAAU;EAAoD,CAAA,EAEtH,CAAA,CACsB;;AAE7B;AAEA,SAAS,EAAc,EACrB,cACA,aACA,UAAO,UACP,gBAAa,GACb,WAAQ,UACR,iBAAc,GACd,0BAAuB,IACvB,GAAG,KAKA;CACH,OACE,kBAAC,EAAgB,QAAjB;EAAwB,GAAI,EAAc;EACxC,UAAA,kBAAC,EAAgB,YAAjB;GACQ;GACM;GACL;GACM;GACS;GACtB,WAAU;GAEV,UAAA,kBAAC,EAAgB,OAAjB;IACE,aAAU;IACV,sBAAoB;IACpB,WAAW,EAAG,gpBAAgpB,CAAU;IACxqB,GAAI;IAJN,UAAA;KAME,kBAAC,GAAD,CAAuB,CAAA;KACvB,kBAAC,EAAgB,MAAjB,EAAuB,YAA+B,CAAA;KACtD,kBAAC,GAAD,CAAyB,CAAA;IACJ;;EACG,CAAA;CACN,CAAA;AAE5B;AAeA,SAAS,EAAW,EAClB,cACA,aACA,GAAG,KAC0B;CAC7B,OACE,kBAAC,EAAgB,MAAjB;EACE,aAAU;EACV,WAAW,EACT,obACA,CACF;EACA,GAAI;EANN,UAAA,CAQE,kBAAC,EAAgB,UAAjB;GAA0B,WAAU;GACjC;EACuB,CAAA,GAC1B,kBAAC,EAAgB,eAAjB;GACE,QACE,kBAAC,QAAD,EAAM,WAAU,+EAAgF,CAAA;GAGlG,UAAA,kBAAC,GAAD;IAAe,MAAM;IAAY,aAAa;IAAG,WAAU;GAAuB,CAAA;EACrD,CAAA,CACX;;AAE1B;AAeA,SAAS,EAAqB,EAC5B,cACA,GAAG,KAC0D;CAC7D,OACE,kBAAC,EAAgB,eAAjB;EACE,aAAU;EACV,WAAW,EACT,0HACA,CACF;EACA,GAAI;EAEJ,UAAA,kBAAC,GAAD;GAAe,MAAM;GAAe,aAAa;EAAI,CAAA;CACxB,CAAA;AAEnC;AAEA,SAAS,EAAuB,EAC9B,cACA,GAAG,KAC4D;CAC/D,OACE,kBAAC,EAAgB,iBAAjB;EACE,aAAU;EACV,WAAW,EACT,6HACA,CACF;EACA,GAAI;EAEJ,UAAA,kBAAC,GAAD;GAAe,MAAM;GAAiB,aAAa;EAAI,CAAA;CACxB,CAAA;AAErC"}
@@ -0,0 +1,2 @@
1
+ declare function Skeleton({ className, ...props }: React.ComponentProps<"div">): import('react').JSX.Element;
2
+ export { Skeleton };
@@ -0,0 +1,14 @@
1
+ import { jsx as e } from "react/jsx-runtime";
2
+ import { cn as t } from "cn";
3
+ //#region src/ui/skeleton.tsx
4
+ function n({ className: n, ...r }) {
5
+ return /* @__PURE__ */ e("div", {
6
+ "data-slot": "skeleton",
7
+ className: t("animate-pulse rounded-md bg-muted", n),
8
+ ...r
9
+ });
10
+ }
11
+ //#endregion
12
+ export { n as Skeleton };
13
+
14
+ //# sourceMappingURL=skeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.js","names":[],"sources":["../../src/ui/skeleton.tsx"],"sourcesContent":["import { cn } from \"cn\"\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(\"animate-pulse rounded-md bg-muted\", className)}\n {...props}\n />\n )\n}\n\nexport { Skeleton }\n"],"mappings":";;;AAEA,SAAS,EAAS,EAAE,cAAW,GAAG,KAAsC;CACtE,OACE,kBAAC,OAAD;EACE,aAAU;EACV,WAAW,EAAG,qCAAqC,CAAS;EAC5D,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,3 @@
1
+ import { Slider as SliderPrimitive } from '@base-ui/react/slider';
2
+ declare function Slider({ className, defaultValue, value, min, max, ...props }: SliderPrimitive.Root.Props): import('react').JSX.Element;
3
+ export { Slider };
@@ -0,0 +1,35 @@
1
+ import { jsx as e, jsxs as t } from "react/jsx-runtime";
2
+ import { cn as n } from "cn";
3
+ import { Slider as r } from "@base-ui/react/slider";
4
+ //#region src/ui/slider.tsx
5
+ function i({ className: i, defaultValue: a, value: o, min: s = 0, max: c = 100, ...l }) {
6
+ let u = Array.isArray(o) ? o : Array.isArray(a) ? a : [s, c];
7
+ return /* @__PURE__ */ e(r.Root, {
8
+ className: n("data-horizontal:w-full data-vertical:h-full", i),
9
+ "data-slot": "slider",
10
+ defaultValue: a,
11
+ value: o,
12
+ min: s,
13
+ max: c,
14
+ thumbAlignment: "edge",
15
+ ...l,
16
+ children: /* @__PURE__ */ t(r.Control, {
17
+ className: "relative flex w-full touch-none items-center select-none data-disabled:opacity-50 data-vertical:h-full data-vertical:min-h-40 data-vertical:w-auto data-vertical:flex-col",
18
+ children: [/* @__PURE__ */ e(r.Track, {
19
+ "data-slot": "slider-track",
20
+ className: "relative grow overflow-hidden rounded-full bg-muted select-none data-horizontal:h-1.5 data-horizontal:w-full data-vertical:h-full data-vertical:w-1.5",
21
+ children: /* @__PURE__ */ e(r.Indicator, {
22
+ "data-slot": "slider-range",
23
+ className: "bg-primary select-none data-horizontal:h-full data-vertical:w-full"
24
+ })
25
+ }), Array.from({ length: u.length }, (t, n) => /* @__PURE__ */ e(r.Thumb, {
26
+ "data-slot": "slider-thumb",
27
+ className: "block size-4 shrink-0 rounded-full border border-primary bg-white shadow-sm ring-ring/50 transition-[color,box-shadow] select-none hover:ring-4 focus-visible:ring-4 focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50"
28
+ }, n))]
29
+ })
30
+ });
31
+ }
32
+ //#endregion
33
+ export { i as Slider };
34
+
35
+ //# sourceMappingURL=slider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider.js","names":[],"sources":["../../src/ui/slider.tsx"],"sourcesContent":["import { Slider as SliderPrimitive } from \"@base-ui/react/slider\"\nimport { cn } from \"cn\"\n\nfunction Slider({\n className,\n defaultValue,\n value,\n min = 0,\n max = 100,\n ...props\n}: SliderPrimitive.Root.Props) {\n const _values = Array.isArray(value)\n ? value\n : Array.isArray(defaultValue)\n ? defaultValue\n : [min, max]\n\n return (\n <SliderPrimitive.Root\n className={cn(\"data-horizontal:w-full data-vertical:h-full\", className)}\n data-slot=\"slider\"\n defaultValue={defaultValue}\n value={value}\n min={min}\n max={max}\n thumbAlignment=\"edge\"\n {...props}\n >\n <SliderPrimitive.Control className=\"relative flex w-full touch-none items-center select-none data-disabled:opacity-50 data-vertical:h-full data-vertical:min-h-40 data-vertical:w-auto data-vertical:flex-col\">\n <SliderPrimitive.Track\n data-slot=\"slider-track\"\n className=\"relative grow overflow-hidden rounded-full bg-muted select-none data-horizontal:h-1.5 data-horizontal:w-full data-vertical:h-full data-vertical:w-1.5\"\n >\n <SliderPrimitive.Indicator\n data-slot=\"slider-range\"\n className=\"bg-primary select-none data-horizontal:h-full data-vertical:w-full\"\n />\n </SliderPrimitive.Track>\n {Array.from({ length: _values.length }, (_, index) => (\n <SliderPrimitive.Thumb\n data-slot=\"slider-thumb\"\n key={index}\n className=\"block size-4 shrink-0 rounded-full border border-primary bg-white shadow-sm ring-ring/50 transition-[color,box-shadow] select-none hover:ring-4 focus-visible:ring-4 focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50\"\n />\n ))}\n </SliderPrimitive.Control>\n </SliderPrimitive.Root>\n )\n}\n\nexport { Slider }\n"],"mappings":";;;;AAGA,SAAS,EAAO,EACd,cACA,iBACA,UACA,SAAM,GACN,SAAM,KACN,GAAG,KAC0B;CAC7B,IAAM,IAAU,MAAM,QAAQ,CAAK,IAC/B,IACA,MAAM,QAAQ,CAAY,IACxB,IACA,CAAC,GAAK,CAAG;CAEf,OACE,kBAAC,EAAgB,MAAjB;EACE,WAAW,EAAG,+CAA+C,CAAS;EACtE,aAAU;EACI;EACP;EACF;EACA;EACL,gBAAe;EACf,GAAI;EAEJ,UAAA,kBAAC,EAAgB,SAAjB;GAAyB,WAAU;GAAnC,UAAA,CACE,kBAAC,EAAgB,OAAjB;IACE,aAAU;IACV,WAAU;IAEV,UAAA,kBAAC,EAAgB,WAAjB;KACE,aAAU;KACV,WAAU;IACX,CAAA;GACoB,CAAA,GACtB,MAAM,KAAK,EAAE,QAAQ,EAAQ,OAAO,IAAI,GAAG,MAC1C,kBAAC,EAAgB,OAAjB;IACE,aAAU;IAEV,WAAU;GACX,GAFM,CAEN,CACF,CACsB;;CACL,CAAA;AAE1B"}
@@ -0,0 +1,5 @@
1
+ import { Switch as SwitchPrimitive } from '@base-ui/react/switch';
2
+ declare function Switch({ className, size, ...props }: SwitchPrimitive.Root.Props & {
3
+ size?: "sm" | "default";
4
+ }): import('react').JSX.Element;
5
+ export { Switch };
@@ -0,0 +1,20 @@
1
+ import { jsx as e } from "react/jsx-runtime";
2
+ import { cn as t } from "cn";
3
+ import { Switch as n } from "@base-ui/react/switch";
4
+ //#region src/ui/switch.tsx
5
+ function r({ className: r, size: i = "default", ...a }) {
6
+ return /* @__PURE__ */ e(n.Root, {
7
+ "data-slot": "switch",
8
+ "data-size": i,
9
+ className: t("peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none group-has-[:focus-visible]/field-label:border-transparent group-has-[:focus-visible]/field-label:ring-0 after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:bg-primary data-unchecked:bg-input dark:data-unchecked:bg-input/80 data-disabled:cursor-not-allowed data-disabled:opacity-50", r),
10
+ ...a,
11
+ children: /* @__PURE__ */ e(n.Thumb, {
12
+ "data-slot": "switch-thumb",
13
+ className: "pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] dark:data-checked:bg-primary-foreground group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 dark:data-unchecked:bg-foreground"
14
+ })
15
+ });
16
+ }
17
+ //#endregion
18
+ export { r as Switch };
19
+
20
+ //# sourceMappingURL=switch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch.js","names":[],"sources":["../../src/ui/switch.tsx"],"sourcesContent":["import { Switch as SwitchPrimitive } from \"@base-ui/react/switch\"\nimport { cn } from \"cn\"\n\nfunction Switch({\n className,\n size = \"default\",\n ...props\n}: SwitchPrimitive.Root.Props & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n data-size={size}\n className={cn(\n \"peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none group-has-[:focus-visible]/field-label:border-transparent group-has-[:focus-visible]/field-label:ring-0 after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:bg-primary data-unchecked:bg-input dark:data-unchecked:bg-input/80 data-disabled:cursor-not-allowed data-disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className=\"pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] dark:data-checked:bg-primary-foreground group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 dark:data-unchecked:bg-foreground\"\n />\n </SwitchPrimitive.Root>\n )\n}\n\nexport { Switch }\n"],"mappings":";;;;AAGA,SAAS,EAAO,EACd,cACA,UAAO,WACP,GAAG,KAGF;CACD,OACE,kBAAC,EAAgB,MAAjB;EACE,aAAU;EACV,aAAW;EACX,WAAW,EACT,ywBACA,CACF;EACA,GAAI;EAEJ,UAAA,kBAAC,EAAgB,OAAjB;GACE,aAAU;GACV,WAAU;EACX,CAAA;CACmB,CAAA;AAE1B"}
@@ -0,0 +1,10 @@
1
+ import { Tabs as TabsPrimitive } from '@base-ui/react/tabs';
2
+ import { VariantProps } from 'class-variance-authority';
3
+ declare function Tabs({ className, orientation, ...props }: TabsPrimitive.Root.Props): import('react').JSX.Element;
4
+ declare const tabsListVariants: (props?: ({
5
+ variant?: "line" | "default" | null | undefined;
6
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string;
7
+ declare function TabsList({ className, variant, ...props }: TabsPrimitive.List.Props & VariantProps<typeof tabsListVariants>): import('react').JSX.Element;
8
+ declare function TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props): import('react').JSX.Element;
9
+ declare function TabsContent({ className, ...props }: TabsPrimitive.Panel.Props): import('react').JSX.Element;
10
+ export { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants };
@@ -0,0 +1,47 @@
1
+ "use client";
2
+ import { jsx as e } from "react/jsx-runtime";
3
+ import { cn as t } from "cn";
4
+ import { cva as n } from "class-variance-authority";
5
+ import { Tabs as r } from "@base-ui/react/tabs";
6
+ //#region src/ui/tabs.tsx
7
+ function i({ className: n, orientation: i = "horizontal", ...a }) {
8
+ return /* @__PURE__ */ e(r.Root, {
9
+ "data-slot": "tabs",
10
+ "data-orientation": i,
11
+ className: t("group/tabs flex gap-2 data-horizontal:flex-col", n),
12
+ ...a
13
+ });
14
+ }
15
+ var a = n("group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-horizontal/tabs:h-9 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col data-[variant=line]:rounded-none", {
16
+ variants: { variant: {
17
+ default: "bg-muted",
18
+ line: "gap-1 bg-transparent"
19
+ } },
20
+ defaultVariants: { variant: "default" }
21
+ });
22
+ function o({ className: n, variant: i = "default", ...o }) {
23
+ return /* @__PURE__ */ e(r.List, {
24
+ "data-slot": "tabs-list",
25
+ "data-variant": i,
26
+ className: t(a({ variant: i }), n),
27
+ ...o
28
+ });
29
+ }
30
+ function s({ className: n, ...i }) {
31
+ return /* @__PURE__ */ e(r.Tab, {
32
+ "data-slot": "tabs-trigger",
33
+ className: t("relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-disabled:pointer-events-none aria-disabled:opacity-50 dark:text-muted-foreground dark:hover:text-foreground group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", "group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent", "data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground", "after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100", n),
34
+ ...i
35
+ });
36
+ }
37
+ function c({ className: n, ...i }) {
38
+ return /* @__PURE__ */ e(r.Panel, {
39
+ "data-slot": "tabs-content",
40
+ className: t("flex-1 text-sm outline-none", n),
41
+ ...i
42
+ });
43
+ }
44
+ //#endregion
45
+ export { i as Tabs, c as TabsContent, o as TabsList, s as TabsTrigger, a as tabsListVariants };
46
+
47
+ //# sourceMappingURL=tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.js","names":[],"sources":["../../src/ui/tabs.tsx"],"sourcesContent":["\"use client\"\n\nimport { Tabs as TabsPrimitive } from \"@base-ui/react/tabs\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\n\nfunction Tabs({\n className,\n orientation = \"horizontal\",\n ...props\n}: TabsPrimitive.Root.Props) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-orientation={orientation}\n className={cn(\n \"group/tabs flex gap-2 data-horizontal:flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst tabsListVariants = cva(\n \"group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-horizontal/tabs:h-9 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col data-[variant=line]:rounded-none\",\n {\n variants: {\n variant: {\n default: \"bg-muted\",\n line: \"gap-1 bg-transparent\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction TabsList({\n className,\n variant = \"default\",\n ...props\n}: TabsPrimitive.List.Props & VariantProps<typeof tabsListVariants>) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n data-variant={variant}\n className={cn(tabsListVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) {\n return (\n <TabsPrimitive.Tab\n data-slot=\"tabs-trigger\"\n className={cn(\n \"relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-disabled:pointer-events-none aria-disabled:opacity-50 dark:text-muted-foreground dark:hover:text-foreground group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n \"group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent\",\n \"data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground\",\n \"after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TabsContent({ className, ...props }: TabsPrimitive.Panel.Props) {\n return (\n <TabsPrimitive.Panel\n data-slot=\"tabs-content\"\n className={cn(\"flex-1 text-sm outline-none\", className)}\n {...props}\n />\n )\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants }\n"],"mappings":";;;;;;AAMA,SAAS,EAAK,EACZ,cACA,iBAAc,cACd,GAAG,KACwB;CAC3B,OACE,kBAAC,EAAc,MAAf;EACE,aAAU;EACV,oBAAkB;EAClB,WAAW,EACT,kDACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,IAAM,IAAmB,EACvB,2OACA;CACE,UAAU,EACR,SAAS;EACP,SAAS;EACT,MAAM;CACR,EACF;CACA,iBAAiB,EACf,SAAS,UACX;AACF,CACF;AAEA,SAAS,EAAS,EAChB,cACA,aAAU,WACV,GAAG,KACgE;CACnE,OACE,kBAAC,EAAc,MAAf;EACE,aAAU;EACV,gBAAc;EACd,WAAW,EAAG,EAAiB,EAAE,WAAQ,CAAC,GAAG,CAAS;EACtD,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAY,EAAE,cAAW,GAAG,KAAkC;CACrE,OACE,kBAAC,EAAc,KAAf;EACE,aAAU;EACV,WAAW,EACT,81BACA,iQACA,qJACA,wYACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAY,EAAE,cAAW,GAAG,KAAoC;CACvE,OACE,kBAAC,EAAc,OAAf;EACE,aAAU;EACV,WAAW,EAAG,+BAA+B,CAAS;EACtD,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,3 @@
1
+ import * as React from "react";
2
+ declare function Textarea({ className, ...props }: React.ComponentProps<"textarea">): React.JSX.Element;
3
+ export { Textarea };
@@ -0,0 +1,15 @@
1
+ import "react";
2
+ import { jsx as e } from "react/jsx-runtime";
3
+ import { cn as t } from "cn";
4
+ //#region src/ui/textarea.tsx
5
+ function n({ className: n, ...r }) {
6
+ return /* @__PURE__ */ e("textarea", {
7
+ "data-slot": "textarea",
8
+ className: t("flex field-sizing-content min-h-16 w-full rounded-md border border-input bg-transparent px-2.5 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40", n),
9
+ ...r
10
+ });
11
+ }
12
+ //#endregion
13
+ export { n as Textarea };
14
+
15
+ //# sourceMappingURL=textarea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.js","names":[],"sources":["../../src/ui/textarea.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { cn } from \"cn\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"flex field-sizing-content min-h-16 w-full rounded-md border border-input bg-transparent px-2.5 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n"],"mappings":";;;;AAGA,SAAS,EAAS,EAAE,cAAW,GAAG,KAA2C;CAC3E,OACE,kBAAC,YAAD;EACE,aAAU;EACV,WAAW,EACT,igBACA,CACF;EACA,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,5 @@
1
+ import { Toggle as TogglePrimitive } from '@base-ui/react/toggle';
2
+ import { ToggleGroup as ToggleGroupPrimitive } from '@base-ui/react/toggle-group';
3
+ declare function ToggleGroup({ className, ...props }: ToggleGroupPrimitive.Props): import('react').JSX.Element;
4
+ declare function ToggleGroupItem({ className, ...props }: TogglePrimitive.Props): import('react').JSX.Element;
5
+ export { ToggleGroup, ToggleGroupItem };
@@ -0,0 +1,23 @@
1
+ import { jsx as e } from "react/jsx-runtime";
2
+ import { cn as t } from "cn";
3
+ import { Toggle as n } from "@base-ui/react/toggle";
4
+ import { ToggleGroup as r } from "@base-ui/react/toggle-group";
5
+ //#region src/ui/toggle-group.tsx
6
+ function i({ className: n, ...i }) {
7
+ return /* @__PURE__ */ e(r, {
8
+ "data-slot": "toggle-group",
9
+ className: t("flex w-fit items-center gap-0.5 rounded-lg bg-muted p-0.5", n),
10
+ ...i
11
+ });
12
+ }
13
+ function a({ className: r, ...i }) {
14
+ return /* @__PURE__ */ e(n, {
15
+ "data-slot": "toggle-group-item",
16
+ className: t("inline-flex size-7 items-center justify-center rounded-md text-muted-foreground transition-colors outline-none hover:text-foreground focus-visible:ring-3 focus-visible:ring-ring/50 data-pressed:bg-background data-pressed:text-foreground data-pressed:shadow-xs dark:data-pressed:bg-input/50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", r),
17
+ ...i
18
+ });
19
+ }
20
+ //#endregion
21
+ export { i as ToggleGroup, a as ToggleGroupItem };
22
+
23
+ //# sourceMappingURL=toggle-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggle-group.js","names":[],"sources":["../../src/ui/toggle-group.tsx"],"sourcesContent":["import { Toggle as TogglePrimitive } from \"@base-ui/react/toggle\"\nimport { ToggleGroup as ToggleGroupPrimitive } from \"@base-ui/react/toggle-group\"\nimport { cn } from \"cn\"\n\nfunction ToggleGroup({ className, ...props }: ToggleGroupPrimitive.Props) {\n return (\n <ToggleGroupPrimitive\n data-slot=\"toggle-group\"\n className={cn(\"flex w-fit items-center gap-0.5 rounded-lg bg-muted p-0.5\", className)}\n {...props}\n />\n )\n}\n\nfunction ToggleGroupItem({ className, ...props }: TogglePrimitive.Props) {\n return (\n <TogglePrimitive\n data-slot=\"toggle-group-item\"\n className={cn(\n \"inline-flex size-7 items-center justify-center rounded-md text-muted-foreground transition-colors outline-none hover:text-foreground focus-visible:ring-3 focus-visible:ring-ring/50 data-pressed:bg-background data-pressed:text-foreground data-pressed:shadow-xs dark:data-pressed:bg-input/50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { ToggleGroup, ToggleGroupItem }\n"],"mappings":";;;;;AAIA,SAAS,EAAY,EAAE,cAAW,GAAG,KAAqC;CACxE,OACE,kBAAC,GAAD;EACE,aAAU;EACV,WAAW,EAAG,6DAA6D,CAAS;EACpF,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAgB,EAAE,cAAW,GAAG,KAAgC;CACvE,OACE,kBAAC,GAAD;EACE,aAAU;EACV,WAAW,EACT,uXACA,CACF;EACA,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,100 @@
1
+ export declare const CODE_LENGTH = 9;
2
+ /** Crockford base32: digits and uppercase letters without I, L, O, U. */
3
+ export declare const CODE_ALPHABET = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
4
+ /**
5
+ * Reads a code with Crockford's decoding rules (any case, O as 0, I and L as 1,
6
+ * hyphens ignored) and returns its canonical form, or null when the input is
7
+ * not a code. An all-digit result is never a code (it reads as a legacy id).
8
+ */
9
+ export declare function parseCode(input: string): string | null;
10
+ /** Reports whether input is a code in canonical form. */
11
+ export declare function isCode(input: string): boolean;
12
+ /** A resolved content link, as ContentKit and host APIs return it. */
13
+ export interface ContentLink {
14
+ content_kind: string;
15
+ code: string;
16
+ slug: string;
17
+ /** Localized slugs keyed by language; the default slug applies otherwise. */
18
+ slugs?: Record<string, string>;
19
+ }
20
+ /** The slug for language, falling back to the default slug. */
21
+ export declare function slugFor(link: Pick<ContentLink, "slug" | "slugs">, language?: string): string;
22
+ export type QueryInit = string | URLSearchParams | Record<string, string | number | boolean | null | undefined>;
23
+ export interface PathOptions {
24
+ /** Language prefix segment; omitted when empty. */
25
+ language?: string;
26
+ /** Query string for sub-pages, e.g. { p: 12 }. Null and undefined values are dropped. */
27
+ query?: QueryInit;
28
+ }
29
+ /** Joins [/{language}]/{route}/{code}[/{slug}][?query]. */
30
+ export declare function contentPath(route: string, code: string, slug?: string, options?: PathOptions): string;
31
+ export interface ContentURLConfig {
32
+ /** Content kind -> the host's route segment ({ video: "watch", gallery: "g" }). */
33
+ routes: Record<string, string>;
34
+ /** Language segments a path may start with; kept in canonical paths. */
35
+ languages?: string[];
36
+ /** The site's origin ("https://example.com") for absolute URLs (canonical links, og:url). */
37
+ origin?: string;
38
+ }
39
+ export interface ParsedContentPath {
40
+ /** "" when unprefixed. */
41
+ language: string;
42
+ route: string;
43
+ /** Canonical form. */
44
+ code: string;
45
+ rawCode: string;
46
+ /** As written; "" when absent. */
47
+ slug: string;
48
+ }
49
+ export interface CanonicalResult {
50
+ /** The canonical path. */
51
+ path: string;
52
+ /** path plus the location's query. */
53
+ location: string;
54
+ /** The location's path is not canonical: replace it with location. */
55
+ redirect: boolean;
56
+ }
57
+ export interface HreflangOptions {
58
+ /** Languages the content exists in; default every configured language. */
59
+ languages?: readonly string[];
60
+ /** The language x-default points at. */
61
+ defaultLanguage?: string;
62
+ /** The origin for absolute URLs; default the configured one (throws without either). */
63
+ origin?: string;
64
+ }
65
+ export interface ContentURLs {
66
+ /** The configured language segments. */
67
+ readonly languages: readonly string[];
68
+ /** The configured origin, without a trailing slash. */
69
+ readonly origin?: string;
70
+ /** The canonical path of link; throws when its kind has no route. */
71
+ path(link: ContentLink, options?: PathOptions): string;
72
+ /** path() on the configured origin; throws without one. */
73
+ url(link: ContentLink, options?: PathOptions): string;
74
+ /** Splits a pathname; null when it is not a content path (or its code is invalid). */
75
+ parse(pathname: string): ParsedContentPath | null;
76
+ /**
77
+ * Compares a location (pathname plus optional ?query and #hash) with link's
78
+ * canonical path, for a client-side history.replaceState after the page's
79
+ * data arrives. null when the location is not a content path or link's kind
80
+ * has no route.
81
+ */
82
+ canonical(location: string, link: ContentLink): CanonicalResult | null;
83
+ /**
84
+ * hreflang alternates: each language's absolute URL of link (its own
85
+ * slug), plus x-default; empty when no language is configured.
86
+ */
87
+ hreflang(link: ContentLink, options?: HreflangOptions): Record<string, string>;
88
+ }
89
+ /** Query parameters that only track a visit: never part of a canonical URL. */
90
+ export declare const TRACKING_PARAMS: string[];
91
+ /**
92
+ * href without tracking parameters (utm_* and TRACKING_PARAMS, plus drop),
93
+ * its fragment or a trailing slash: the canonical URL of a page that is not
94
+ * a content page.
95
+ */
96
+ export declare function canonicalURL(href: string, options?: {
97
+ drop?: readonly string[];
98
+ }): string;
99
+ /** Builds the URL helpers for one host's routes. */
100
+ export declare function createContentURLs(config: ContentURLConfig): ContentURLs;
package/dist/urls.js ADDED
@@ -0,0 +1,118 @@
1
+ //#region src/urls/index.ts
2
+ var e = 9, t = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
3
+ function n(e) {
4
+ let t = "";
5
+ for (let n of e) {
6
+ if (n === "-") continue;
7
+ if (n.length !== 1 || n.charCodeAt(0) > 127) return null;
8
+ let e = n.toUpperCase();
9
+ if (e === "O" ? e = "0" : (e === "I" || e === "L") && (e = "1"), !"0123456789ABCDEFGHJKMNPQRSTVWXYZ".includes(e) || t.length === 9) return null;
10
+ t += e;
11
+ }
12
+ return t.length !== 9 || !/[A-Z]/.test(t) ? null : t;
13
+ }
14
+ function r(e) {
15
+ return n(e) === e;
16
+ }
17
+ function i(e, t = "") {
18
+ return t && e.slugs?.[t] || e.slug;
19
+ }
20
+ function a(e) {
21
+ if (e === void 0) return "";
22
+ let t;
23
+ if (typeof e == "string" || e instanceof URLSearchParams) t = new URLSearchParams(e);
24
+ else {
25
+ t = new URLSearchParams();
26
+ for (let [n, r] of Object.entries(e)) r != null && t.append(n, String(r));
27
+ }
28
+ let n = t.toString();
29
+ return n ? `?${n}` : "";
30
+ }
31
+ function o(e, t, n = "", r = {}) {
32
+ return `${r.language ? `/${r.language}` : ""}/${e}/${t}${n ? `/${n}` : ""}${a(r.query)}`;
33
+ }
34
+ var s = [
35
+ "gclid",
36
+ "gbraid",
37
+ "wbraid",
38
+ "dclid",
39
+ "fbclid",
40
+ "msclkid",
41
+ "yclid",
42
+ "twclid",
43
+ "igshid",
44
+ "mc_cid",
45
+ "mc_eid",
46
+ "_ga",
47
+ "_gl"
48
+ ];
49
+ function c(e, t = {}) {
50
+ let n = new URL(e), r = /* @__PURE__ */ new Set([...s, ...t.drop ?? []]);
51
+ for (let e of [...n.searchParams.keys()]) (e.startsWith("utm_") || r.has(e)) && n.searchParams.delete(e);
52
+ return n.hash = "", n.pathname.length > 1 && n.pathname.endsWith("/") && (n.pathname = n.pathname.replace(/\/+$/, "")), n.toString();
53
+ }
54
+ var l = /^[a-z0-9][a-z0-9_-]*$/;
55
+ function u(e) {
56
+ let t = { ...e.routes }, r = e.origin?.replace(/\/+$/, "");
57
+ if (r !== void 0 && !/^https?:\/\/[^/?#]+$/.test(r)) throw Error(`contentkit-ui/urls: origin ${JSON.stringify(e.origin)} is not an http(s) origin`);
58
+ let a = [...e.languages ?? []], s = new Set(Object.values(t));
59
+ if (s.size === 0) throw Error("contentkit-ui/urls: routes is empty");
60
+ for (let e of [...s, ...a]) if (!l.test(e)) throw Error(`contentkit-ui/urls: ${JSON.stringify(e)} is not one lowercase path segment`);
61
+ for (let e of a) if (s.has(e)) throw Error(`contentkit-ui/urls: language ${JSON.stringify(e)} is also a route`);
62
+ let c = (e, n) => {
63
+ let r = t[e.content_kind];
64
+ return r === void 0 ? null : o(r, e.code, i(e, n), { language: n });
65
+ }, u = (e) => {
66
+ if (!e.startsWith("/")) return null;
67
+ let t = e.slice(1);
68
+ t.endsWith("/") && (t = t.slice(0, -1));
69
+ let r = t.split("/");
70
+ if (r.some((e) => e === "")) return null;
71
+ let i = "";
72
+ if (r.length > 2 && a.includes(r[0]) && (i = r[0], r = r.slice(1)), r.length < 2 || r.length > 3 || !s.has(r[0])) return null;
73
+ let o = n(r[1]);
74
+ return o === null ? null : {
75
+ language: i,
76
+ route: r[0],
77
+ code: o,
78
+ rawCode: r[1],
79
+ slug: r[2] ?? ""
80
+ };
81
+ }, d = (e, n = {}) => {
82
+ let r = t[e.content_kind];
83
+ if (r === void 0) throw Error(`contentkit-ui/urls: no route for kind ${JSON.stringify(e.content_kind)}`);
84
+ return o(r, e.code, i(e, n.language), n);
85
+ };
86
+ return {
87
+ languages: a,
88
+ origin: r,
89
+ path: d,
90
+ url(e, t) {
91
+ if (r === void 0) throw Error("contentkit-ui/urls: url() needs ContentURLConfig.origin");
92
+ return r + d(e, t);
93
+ },
94
+ parse: u,
95
+ canonical(e, t) {
96
+ let n = e.split("#", 1)[0], r = n.indexOf("?"), i = r < 0 ? n : n.slice(0, r), a = r < 0 ? "" : n.slice(r + 1), o = u(i);
97
+ if (o === null) return null;
98
+ let s = c(t, o.language);
99
+ return s === null ? null : {
100
+ path: s,
101
+ location: a ? `${s}?${a}` : s,
102
+ redirect: i !== s
103
+ };
104
+ },
105
+ hreflang(e, t = {}) {
106
+ let n = t.origin?.replace(/\/+$/, "") ?? r;
107
+ if (n === void 0) throw Error("contentkit-ui/urls: hreflang() needs an origin");
108
+ let i = {}, o = (t.languages ?? a).filter((e) => a.includes(e));
109
+ for (let t of o) i[t] = n + d(e, { language: t });
110
+ let s = t.defaultLanguage;
111
+ return s && i[s] && (i["x-default"] = i[s]), i;
112
+ }
113
+ };
114
+ }
115
+ //#endregion
116
+ export { t as CODE_ALPHABET, e as CODE_LENGTH, s as TRACKING_PARAMS, c as canonicalURL, o as contentPath, u as createContentURLs, r as isCode, n as parseCode, i as slugFor };
117
+
118
+ //# sourceMappingURL=urls.js.map