@tetherto/dev-websites-core 0.2.1 → 0.3.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 (304) hide show
  1. package/README.md +62 -9
  2. package/dist/cms/index.d.mts +2 -2
  3. package/dist/cms/index.mjs +2 -2
  4. package/dist/{cms-5bS91IRZ.mjs → cms.mjs} +2 -2
  5. package/dist/cms.mjs.map +1 -0
  6. package/dist/i18n/index.d.mts +1 -1
  7. package/dist/i18n/index.mjs +1 -1
  8. package/dist/{i18n-Dy3VrbBw.mjs → i18n.mjs} +1 -1
  9. package/dist/i18n.mjs.map +1 -0
  10. package/dist/index.d.mts +214 -6
  11. package/dist/index.d.mts.map +1 -0
  12. package/dist/index.mjs +6 -6
  13. package/dist/{index-D36IEwUg.d.mts → index2.d.mts} +1 -1
  14. package/dist/index2.d.mts.map +1 -0
  15. package/dist/{index-tTs9h9BS.d.mts → index3.d.mts} +2 -2
  16. package/dist/index3.d.mts.map +1 -0
  17. package/dist/{index-Dyi7DDoO.d.mts → index4.d.mts} +1 -1
  18. package/dist/index4.d.mts.map +1 -0
  19. package/dist/index5.d.mts +6 -0
  20. package/dist/{logger-BPURnavq.mjs → logger.mjs} +1 -1
  21. package/dist/logger.mjs.map +1 -0
  22. package/dist/{readMediaBuffer-1C3QTpkO.d.mts → readMediaBuffer.d.mts} +1 -1
  23. package/dist/readMediaBuffer.d.mts.map +1 -0
  24. package/dist/{readMediaBuffer-DWkTbYVn.mjs → readMediaBuffer.mjs} +2 -2
  25. package/dist/readMediaBuffer.mjs.map +1 -0
  26. package/dist/seo/index.d.mts +1 -1
  27. package/dist/seo/index.mjs +1 -1
  28. package/dist/{seo-e5XjgQ7l.mjs → seo.mjs} +3 -3
  29. package/dist/seo.mjs.map +1 -0
  30. package/dist/ui/a11y/focus.d.mts +6 -0
  31. package/dist/ui/a11y/focus.d.mts.map +1 -0
  32. package/dist/ui/a11y/focus.mjs +7 -0
  33. package/dist/ui/a11y/focus.mjs.map +1 -0
  34. package/dist/ui/a11y/index.d.mts +4 -0
  35. package/dist/ui/a11y/index.mjs +4 -0
  36. package/dist/ui/carousel/index.d.mts +3 -0
  37. package/dist/ui/carousel/index.mjs +3 -0
  38. package/dist/ui/components/Accordion/Accordion.d.mts +16 -0
  39. package/dist/ui/components/Accordion/Accordion.d.mts.map +1 -0
  40. package/dist/ui/components/Accordion/Accordion.mjs +51 -0
  41. package/dist/ui/components/Accordion/Accordion.mjs.map +1 -0
  42. package/dist/ui/components/Accordion/index.d.mts +2 -0
  43. package/dist/ui/components/Accordion/index.mjs +2 -0
  44. package/dist/ui/components/Avatar/Avatar.d.mts +9 -0
  45. package/dist/ui/components/Avatar/Avatar.d.mts.map +1 -0
  46. package/dist/ui/components/Avatar/Avatar.mjs +15 -0
  47. package/dist/ui/components/Avatar/Avatar.mjs.map +1 -0
  48. package/dist/ui/components/Avatar/index.d.mts +2 -0
  49. package/dist/ui/components/Avatar/index.mjs +2 -0
  50. package/dist/ui/components/Badge/Badge.d.mts +14 -0
  51. package/dist/ui/components/Badge/Badge.d.mts.map +1 -0
  52. package/dist/ui/components/Badge/Badge.mjs +30 -0
  53. package/dist/ui/components/Badge/Badge.mjs.map +1 -0
  54. package/dist/ui/components/Badge/index.d.mts +2 -0
  55. package/dist/ui/components/Badge/index.mjs +2 -0
  56. package/dist/ui/components/BadgeVersion/BadgeVersion.d.mts +24 -0
  57. package/dist/ui/components/BadgeVersion/BadgeVersion.d.mts.map +1 -0
  58. package/dist/ui/components/BadgeVersion/BadgeVersion.mjs +66 -0
  59. package/dist/ui/components/BadgeVersion/BadgeVersion.mjs.map +1 -0
  60. package/dist/ui/components/BadgeVersion/index.d.mts +2 -0
  61. package/dist/ui/components/BadgeVersion/index.mjs +2 -0
  62. package/dist/ui/components/Button/Button.d.mts +14 -0
  63. package/dist/ui/components/Button/Button.d.mts.map +1 -0
  64. package/dist/ui/components/Button/Button.mjs +48 -0
  65. package/dist/ui/components/Button/Button.mjs.map +1 -0
  66. package/dist/ui/components/Button/index.d.mts +2 -0
  67. package/dist/ui/components/Button/index.mjs +2 -0
  68. package/dist/ui/components/Card/Card.d.mts +14 -0
  69. package/dist/ui/components/Card/Card.d.mts.map +1 -0
  70. package/dist/ui/components/Card/Card.mjs +40 -0
  71. package/dist/ui/components/Card/Card.mjs.map +1 -0
  72. package/dist/ui/components/Card/index.d.mts +2 -0
  73. package/dist/ui/components/Card/index.mjs +2 -0
  74. package/dist/ui/components/Carousel/Carousel.d.mts +42 -0
  75. package/dist/ui/components/Carousel/Carousel.d.mts.map +1 -0
  76. package/dist/ui/components/Carousel/Carousel.mjs +164 -0
  77. package/dist/ui/components/Carousel/Carousel.mjs.map +1 -0
  78. package/dist/ui/components/Carousel/index.d.mts +2 -0
  79. package/dist/ui/components/Carousel/index.mjs +2 -0
  80. package/dist/ui/components/Checkbox/Checkbox.d.mts +8 -0
  81. package/dist/ui/components/Checkbox/Checkbox.d.mts.map +1 -0
  82. package/dist/ui/components/Checkbox/Checkbox.mjs +39 -0
  83. package/dist/ui/components/Checkbox/Checkbox.mjs.map +1 -0
  84. package/dist/ui/components/Checkbox/index.d.mts +2 -0
  85. package/dist/ui/components/Checkbox/index.mjs +2 -0
  86. package/dist/ui/components/CodeBlock/CodeBlock.d.mts +22 -0
  87. package/dist/ui/components/CodeBlock/CodeBlock.d.mts.map +1 -0
  88. package/dist/ui/components/CodeBlock/CodeBlock.mjs +66 -0
  89. package/dist/ui/components/CodeBlock/CodeBlock.mjs.map +1 -0
  90. package/dist/ui/components/CodeBlock/index.d.mts +2 -0
  91. package/dist/ui/components/CodeBlock/index.mjs +2 -0
  92. package/dist/ui/components/CodeBlockTabs/CodeBlockTabs.d.mts +19 -0
  93. package/dist/ui/components/CodeBlockTabs/CodeBlockTabs.d.mts.map +1 -0
  94. package/dist/ui/components/CodeBlockTabs/CodeBlockTabs.mjs +59 -0
  95. package/dist/ui/components/CodeBlockTabs/CodeBlockTabs.mjs.map +1 -0
  96. package/dist/ui/components/CodeBlockTabs/index.d.mts +2 -0
  97. package/dist/ui/components/CodeBlockTabs/index.mjs +2 -0
  98. package/dist/ui/components/CollapsibleSection/CollapsibleSection.d.mts +13 -0
  99. package/dist/ui/components/CollapsibleSection/CollapsibleSection.d.mts.map +1 -0
  100. package/dist/ui/components/CollapsibleSection/CollapsibleSection.mjs +55 -0
  101. package/dist/ui/components/CollapsibleSection/CollapsibleSection.mjs.map +1 -0
  102. package/dist/ui/components/CollapsibleSection/index.d.mts +2 -0
  103. package/dist/ui/components/CollapsibleSection/index.mjs +2 -0
  104. package/dist/ui/components/CopyButton/CopyButton.d.mts +12 -0
  105. package/dist/ui/components/CopyButton/CopyButton.d.mts.map +1 -0
  106. package/dist/ui/components/CopyButton/CopyButton.mjs +45 -0
  107. package/dist/ui/components/CopyButton/CopyButton.mjs.map +1 -0
  108. package/dist/ui/components/CopyButton/index.d.mts +2 -0
  109. package/dist/ui/components/CopyButton/index.mjs +2 -0
  110. package/dist/ui/components/Dialog/Dialog.d.mts +26 -0
  111. package/dist/ui/components/Dialog/Dialog.d.mts.map +1 -0
  112. package/dist/ui/components/Dialog/Dialog.mjs +79 -0
  113. package/dist/ui/components/Dialog/Dialog.mjs.map +1 -0
  114. package/dist/ui/components/Dialog/index.d.mts +2 -0
  115. package/dist/ui/components/Dialog/index.mjs +2 -0
  116. package/dist/ui/components/EmptyState/EmptyState.d.mts +18 -0
  117. package/dist/ui/components/EmptyState/EmptyState.d.mts.map +1 -0
  118. package/dist/ui/components/EmptyState/EmptyState.mjs +36 -0
  119. package/dist/ui/components/EmptyState/EmptyState.mjs.map +1 -0
  120. package/dist/ui/components/EmptyState/index.d.mts +2 -0
  121. package/dist/ui/components/EmptyState/index.mjs +2 -0
  122. package/dist/ui/components/FieldError/FieldError.d.mts +14 -0
  123. package/dist/ui/components/FieldError/FieldError.d.mts.map +1 -0
  124. package/dist/ui/components/FieldError/FieldError.mjs +19 -0
  125. package/dist/ui/components/FieldError/FieldError.mjs.map +1 -0
  126. package/dist/ui/components/FieldError/index.d.mts +2 -0
  127. package/dist/ui/components/FieldError/index.mjs +2 -0
  128. package/dist/ui/components/FormattedDate/FormattedDate.d.mts +15 -0
  129. package/dist/ui/components/FormattedDate/FormattedDate.d.mts.map +1 -0
  130. package/dist/ui/components/FormattedDate/FormattedDate.mjs +23 -0
  131. package/dist/ui/components/FormattedDate/FormattedDate.mjs.map +1 -0
  132. package/dist/ui/components/FormattedDate/index.d.mts +2 -0
  133. package/dist/ui/components/FormattedDate/index.mjs +2 -0
  134. package/dist/ui/components/IconButton/IconButton.d.mts +10 -0
  135. package/dist/ui/components/IconButton/IconButton.d.mts.map +1 -0
  136. package/dist/ui/components/IconButton/IconButton.mjs +19 -0
  137. package/dist/ui/components/IconButton/IconButton.mjs.map +1 -0
  138. package/dist/ui/components/IconButton/index.d.mts +2 -0
  139. package/dist/ui/components/IconButton/index.mjs +2 -0
  140. package/dist/ui/components/Input/Input.d.mts +12 -0
  141. package/dist/ui/components/Input/Input.d.mts.map +1 -0
  142. package/dist/ui/components/Input/Input.mjs +43 -0
  143. package/dist/ui/components/Input/Input.mjs.map +1 -0
  144. package/dist/ui/components/Input/index.d.mts +2 -0
  145. package/dist/ui/components/Input/index.mjs +2 -0
  146. package/dist/ui/components/Label/Label.d.mts +11 -0
  147. package/dist/ui/components/Label/Label.d.mts.map +1 -0
  148. package/dist/ui/components/Label/Label.mjs +18 -0
  149. package/dist/ui/components/Label/Label.mjs.map +1 -0
  150. package/dist/ui/components/Label/index.d.mts +2 -0
  151. package/dist/ui/components/Label/index.mjs +2 -0
  152. package/dist/ui/components/LazyVideo/LazyVideo.d.mts +23 -0
  153. package/dist/ui/components/LazyVideo/LazyVideo.d.mts.map +1 -0
  154. package/dist/ui/components/LazyVideo/LazyVideo.mjs +57 -0
  155. package/dist/ui/components/LazyVideo/LazyVideo.mjs.map +1 -0
  156. package/dist/ui/components/LazyVideo/index.d.mts +2 -0
  157. package/dist/ui/components/LazyVideo/index.mjs +2 -0
  158. package/dist/ui/components/Pagination/Pagination.d.mts +38 -0
  159. package/dist/ui/components/Pagination/Pagination.d.mts.map +1 -0
  160. package/dist/ui/components/Pagination/Pagination.mjs +110 -0
  161. package/dist/ui/components/Pagination/Pagination.mjs.map +1 -0
  162. package/dist/ui/components/Pagination/index.d.mts +2 -0
  163. package/dist/ui/components/Pagination/index.mjs +2 -0
  164. package/dist/ui/components/PaginationItem/PaginationItem.d.mts +15 -0
  165. package/dist/ui/components/PaginationItem/PaginationItem.d.mts.map +1 -0
  166. package/dist/ui/components/PaginationItem/PaginationItem.mjs +34 -0
  167. package/dist/ui/components/PaginationItem/PaginationItem.mjs.map +1 -0
  168. package/dist/ui/components/PaginationItem/index.d.mts +2 -0
  169. package/dist/ui/components/PaginationItem/index.mjs +2 -0
  170. package/dist/ui/components/PasswordInput/PasswordInput.d.mts +10 -0
  171. package/dist/ui/components/PasswordInput/PasswordInput.d.mts.map +1 -0
  172. package/dist/ui/components/PasswordInput/PasswordInput.mjs +39 -0
  173. package/dist/ui/components/PasswordInput/PasswordInput.mjs.map +1 -0
  174. package/dist/ui/components/PasswordInput/index.d.mts +2 -0
  175. package/dist/ui/components/PasswordInput/index.mjs +2 -0
  176. package/dist/ui/components/ProgressStepper/ProgressStepper.d.mts +20 -0
  177. package/dist/ui/components/ProgressStepper/ProgressStepper.d.mts.map +1 -0
  178. package/dist/ui/components/ProgressStepper/ProgressStepper.mjs +39 -0
  179. package/dist/ui/components/ProgressStepper/ProgressStepper.mjs.map +1 -0
  180. package/dist/ui/components/ProgressStepper/index.d.mts +2 -0
  181. package/dist/ui/components/ProgressStepper/index.mjs +2 -0
  182. package/dist/ui/components/Prose/Prose.d.mts +10 -0
  183. package/dist/ui/components/Prose/Prose.d.mts.map +1 -0
  184. package/dist/ui/components/Prose/Prose.mjs +19 -0
  185. package/dist/ui/components/Prose/Prose.mjs.map +1 -0
  186. package/dist/ui/components/Prose/index.d.mts +2 -0
  187. package/dist/ui/components/Prose/index.mjs +2 -0
  188. package/dist/ui/components/Radio/Radio.d.mts +8 -0
  189. package/dist/ui/components/Radio/Radio.d.mts.map +1 -0
  190. package/dist/ui/components/Radio/Radio.mjs +25 -0
  191. package/dist/ui/components/Radio/Radio.mjs.map +1 -0
  192. package/dist/ui/components/Radio/index.d.mts +2 -0
  193. package/dist/ui/components/Radio/index.mjs +2 -0
  194. package/dist/ui/components/Reveal/Reveal.d.mts +10 -0
  195. package/dist/ui/components/Reveal/Reveal.d.mts.map +1 -0
  196. package/dist/ui/components/Reveal/Reveal.mjs +18 -0
  197. package/dist/ui/components/Reveal/Reveal.mjs.map +1 -0
  198. package/dist/ui/components/Reveal/index.d.mts +2 -0
  199. package/dist/ui/components/Reveal/index.mjs +2 -0
  200. package/dist/ui/components/SearchInput/SearchInput.d.mts +15 -0
  201. package/dist/ui/components/SearchInput/SearchInput.d.mts.map +1 -0
  202. package/dist/ui/components/SearchInput/SearchInput.mjs +28 -0
  203. package/dist/ui/components/SearchInput/SearchInput.mjs.map +1 -0
  204. package/dist/ui/components/SearchInput/index.d.mts +2 -0
  205. package/dist/ui/components/SearchInput/index.mjs +2 -0
  206. package/dist/ui/components/Select/Select.d.mts +34 -0
  207. package/dist/ui/components/Select/Select.d.mts.map +1 -0
  208. package/dist/ui/components/Select/Select.mjs +167 -0
  209. package/dist/ui/components/Select/Select.mjs.map +1 -0
  210. package/dist/ui/components/Select/index.d.mts +2 -0
  211. package/dist/ui/components/Select/index.mjs +2 -0
  212. package/dist/ui/components/Sheet/Sheet.d.mts +19 -0
  213. package/dist/ui/components/Sheet/Sheet.d.mts.map +1 -0
  214. package/dist/ui/components/Sheet/Sheet.mjs +59 -0
  215. package/dist/ui/components/Sheet/Sheet.mjs.map +1 -0
  216. package/dist/ui/components/Sheet/index.d.mts +2 -0
  217. package/dist/ui/components/Sheet/index.mjs +2 -0
  218. package/dist/ui/components/StaggerReveal/StaggerReveal.d.mts +10 -0
  219. package/dist/ui/components/StaggerReveal/StaggerReveal.d.mts.map +1 -0
  220. package/dist/ui/components/StaggerReveal/StaggerReveal.mjs +31 -0
  221. package/dist/ui/components/StaggerReveal/StaggerReveal.mjs.map +1 -0
  222. package/dist/ui/components/StaggerReveal/index.d.mts +2 -0
  223. package/dist/ui/components/StaggerReveal/index.mjs +2 -0
  224. package/dist/ui/components/Stepper/Stepper.d.mts +15 -0
  225. package/dist/ui/components/Stepper/Stepper.d.mts.map +1 -0
  226. package/dist/ui/components/Stepper/Stepper.mjs +38 -0
  227. package/dist/ui/components/Stepper/Stepper.mjs.map +1 -0
  228. package/dist/ui/components/Stepper/index.d.mts +2 -0
  229. package/dist/ui/components/Stepper/index.mjs +2 -0
  230. package/dist/ui/components/Switch/Switch.d.mts +12 -0
  231. package/dist/ui/components/Switch/Switch.d.mts.map +1 -0
  232. package/dist/ui/components/Switch/Switch.mjs +34 -0
  233. package/dist/ui/components/Switch/Switch.mjs.map +1 -0
  234. package/dist/ui/components/Switch/index.d.mts +2 -0
  235. package/dist/ui/components/Switch/index.mjs +2 -0
  236. package/dist/ui/components/TextButton/TextButton.d.mts +9 -0
  237. package/dist/ui/components/TextButton/TextButton.d.mts.map +1 -0
  238. package/dist/ui/components/TextButton/TextButton.mjs +16 -0
  239. package/dist/ui/components/TextButton/TextButton.mjs.map +1 -0
  240. package/dist/ui/components/TextButton/index.d.mts +2 -0
  241. package/dist/ui/components/TextButton/index.mjs +2 -0
  242. package/dist/ui/components/Textarea/Textarea.d.mts +9 -0
  243. package/dist/ui/components/Textarea/Textarea.d.mts.map +1 -0
  244. package/dist/ui/components/Textarea/Textarea.mjs +27 -0
  245. package/dist/ui/components/Textarea/Textarea.mjs.map +1 -0
  246. package/dist/ui/components/Textarea/index.d.mts +2 -0
  247. package/dist/ui/components/Textarea/index.mjs +2 -0
  248. package/dist/ui/components/Toast/Toast.d.mts +20 -0
  249. package/dist/ui/components/Toast/Toast.d.mts.map +1 -0
  250. package/dist/ui/components/Toast/Toast.mjs +128 -0
  251. package/dist/ui/components/Toast/Toast.mjs.map +1 -0
  252. package/dist/ui/components/Toast/index.d.mts +2 -0
  253. package/dist/ui/components/Toast/index.mjs +2 -0
  254. package/dist/ui/components/Tooltip/Tooltip.d.mts +11 -0
  255. package/dist/ui/components/Tooltip/Tooltip.d.mts.map +1 -0
  256. package/dist/ui/components/Tooltip/Tooltip.mjs +20 -0
  257. package/dist/ui/components/Tooltip/Tooltip.mjs.map +1 -0
  258. package/dist/ui/components/Tooltip/index.d.mts +2 -0
  259. package/dist/ui/components/Tooltip/index.mjs +2 -0
  260. package/dist/ui/components/VisuallyHidden/VisuallyHidden.d.mts +7 -0
  261. package/dist/ui/components/VisuallyHidden/VisuallyHidden.d.mts.map +1 -0
  262. package/dist/ui/components/VisuallyHidden/VisuallyHidden.mjs +13 -0
  263. package/dist/ui/components/VisuallyHidden/VisuallyHidden.mjs.map +1 -0
  264. package/dist/ui/components/VisuallyHidden/index.d.mts +2 -0
  265. package/dist/ui/components/VisuallyHidden/index.mjs +2 -0
  266. package/dist/ui/hooks/index.d.mts +2 -0
  267. package/dist/ui/hooks/index.mjs +2 -0
  268. package/dist/ui/hooks/useInView.d.mts +13 -0
  269. package/dist/ui/hooks/useInView.d.mts.map +1 -0
  270. package/dist/ui/hooks/useInView.mjs +37 -0
  271. package/dist/ui/hooks/useInView.mjs.map +1 -0
  272. package/dist/ui/index.d.mts +81 -0
  273. package/dist/ui/index.mjs +40 -0
  274. package/dist/ui/theme/preset.d.mts +170 -0
  275. package/dist/ui/theme/preset.d.mts.map +1 -0
  276. package/dist/ui/theme/preset.mjs +143 -0
  277. package/dist/ui/theme/preset.mjs.map +1 -0
  278. package/dist/ui/utils/cn.d.mts +6 -0
  279. package/dist/ui/utils/cn.d.mts.map +1 -0
  280. package/dist/ui/utils/cn.mjs +42 -0
  281. package/dist/ui/utils/cn.mjs.map +1 -0
  282. package/dist/ui/utils/index.d.mts +2 -0
  283. package/dist/ui/utils/index.mjs +2 -0
  284. package/dist/utils/index.d.mts +1 -1
  285. package/dist/utils/index.mjs +2 -2
  286. package/dist/{utils-CVVQQltg.mjs → utils.mjs} +1 -1
  287. package/dist/utils.mjs.map +1 -0
  288. package/package.json +66 -7
  289. package/src/ui/theme/preset.css +53 -0
  290. package/src/ui/theme/preset.ts +131 -0
  291. package/src/ui/theme/theme.css +12 -0
  292. package/src/ui/theme/tokens.css +57 -0
  293. package/dist/cms-5bS91IRZ.mjs.map +0 -1
  294. package/dist/i18n-Dy3VrbBw.mjs.map +0 -1
  295. package/dist/index-9B8SfwdR.d.mts +0 -214
  296. package/dist/index-9B8SfwdR.d.mts.map +0 -1
  297. package/dist/index-D36IEwUg.d.mts.map +0 -1
  298. package/dist/index-Dyi7DDoO.d.mts.map +0 -1
  299. package/dist/index-tTs9h9BS.d.mts.map +0 -1
  300. package/dist/logger-BPURnavq.mjs.map +0 -1
  301. package/dist/readMediaBuffer-1C3QTpkO.d.mts.map +0 -1
  302. package/dist/readMediaBuffer-DWkTbYVn.mjs.map +0 -1
  303. package/dist/seo-e5XjgQ7l.mjs.map +0 -1
  304. package/dist/utils-CVVQQltg.mjs.map +0 -1
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tetherto/dev-websites-core",
3
- "version": "0.2.1",
4
- "description": "Shared non-UI libraries (Payload CMS, SEO, i18n, utils) for the WDK / QVAC websites.",
3
+ "version": "0.3.0",
4
+ "description": "Shared CMS, SEO, i18n, utils, and UI primitives for the WDK / QVAC websites.",
5
5
  "license": "Apache-2.0",
6
6
  "publishConfig": {
7
7
  "access": "public",
@@ -12,7 +12,9 @@
12
12
  "url": "git+https://github.com/tetherto/dev-websites-core.git"
13
13
  },
14
14
  "type": "module",
15
- "sideEffects": false,
15
+ "sideEffects": [
16
+ "**/*.css"
17
+ ],
16
18
  "main": "./dist/index.mjs",
17
19
  "types": "./dist/index.d.mts",
18
20
  "exports": {
@@ -40,19 +42,41 @@
40
42
  "types": "./dist/utils/index.d.mts",
41
43
  "import": "./dist/utils/index.mjs",
42
44
  "default": "./dist/utils/index.mjs"
43
- }
45
+ },
46
+ "./ui": {
47
+ "types": "./dist/ui/index.d.mts",
48
+ "import": "./dist/ui/index.mjs",
49
+ "default": "./dist/ui/index.mjs"
50
+ },
51
+ "./ui/a11y": {
52
+ "types": "./dist/ui/a11y/index.d.mts",
53
+ "import": "./dist/ui/a11y/index.mjs",
54
+ "default": "./dist/ui/a11y/index.mjs"
55
+ },
56
+ "./ui/carousel": {
57
+ "types": "./dist/ui/carousel/index.d.mts",
58
+ "import": "./dist/ui/carousel/index.mjs",
59
+ "default": "./dist/ui/carousel/index.mjs"
60
+ },
61
+ "./ui/theme.css": "./src/ui/theme/theme.css",
62
+ "./ui/theme/tokens.css": "./src/ui/theme/tokens.css",
63
+ "./ui/theme/preset.css": "./src/ui/theme/preset.css",
64
+ "./ui/theme/preset": "./src/ui/theme/preset.ts",
65
+ "./package.json": "./package.json"
44
66
  },
45
67
  "files": [
46
- "dist"
68
+ "dist",
69
+ "src/ui/theme"
47
70
  ],
48
71
  "scripts": {
49
72
  "build": "tsdown",
50
73
  "dev": "tsdown --watch",
51
74
  "prepare": "tsdown",
75
+ "prepublishOnly": "npm run typecheck && npm run build",
52
76
  "typecheck": "tsc --noEmit",
53
77
  "lint": "eslint",
54
78
  "lint:fix": "eslint --fix",
55
- "format": "prettier --write \"src/**/*.ts\" \"*.{json,mjs,md}\""
79
+ "format": "prettier --write \"src/**/*.{ts,tsx,css}\" \"*.{json,mjs,md}\""
56
80
  },
57
81
  "engines": {
58
82
  "node": ">=20"
@@ -61,22 +85,57 @@
61
85
  "@aws-sdk/client-s3": "^3.0.0",
62
86
  "@payloadcms/richtext-lexical": "^3.85.1",
63
87
  "@payloadcms/storage-s3": "^3.85.1",
88
+ "@radix-ui/react-dialog": "^1.1.0",
89
+ "@radix-ui/react-dropdown-menu": "^2.1.0",
90
+ "@radix-ui/react-primitive": "^2.0.0",
91
+ "@radix-ui/react-slot": "^1.1.0",
92
+ "@radix-ui/react-tooltip": "^1.1.0",
93
+ "class-variance-authority": "^0.7.0",
94
+ "clsx": "^2.1.0",
95
+ "embla-carousel-react": "^8.0.0",
64
96
  "next": ">=15",
65
- "payload": "^3.85.1"
97
+ "payload": "^3.85.1",
98
+ "react": ">=19",
99
+ "react-dom": ">=19",
100
+ "react-icons": "^5.0.0",
101
+ "tailwind-merge": "^3.0.0"
102
+ },
103
+ "peerDependenciesMeta": {
104
+ "embla-carousel-react": {
105
+ "optional": true
106
+ },
107
+ "react-icons": {
108
+ "optional": true
109
+ }
66
110
  },
67
111
  "devDependencies": {
68
112
  "@aws-sdk/client-s3": "^3.787.0",
69
113
  "@eslint/js": "^9.39.0",
70
114
  "@payloadcms/richtext-lexical": "3.88.0",
71
115
  "@payloadcms/storage-s3": "3.88.0",
116
+ "@radix-ui/react-dialog": "^1.1.15",
117
+ "@radix-ui/react-dropdown-menu": "^2.1.16",
118
+ "@radix-ui/react-primitive": "^2.1.4",
119
+ "@radix-ui/react-slot": "^1.2.4",
120
+ "@radix-ui/react-tooltip": "^1.2.16",
72
121
  "@types/node": "^22.20.1",
122
+ "@types/react": "^19.2.0",
123
+ "@types/react-dom": "^19.2.0",
124
+ "class-variance-authority": "^0.7.1",
125
+ "clsx": "^2.1.1",
126
+ "embla-carousel-react": "^8.6.0",
73
127
  "eslint": "9.39.4",
74
128
  "eslint-config-prettier": "^10.1.8",
75
129
  "eslint-plugin-import": "^2.32.0",
76
130
  "eslint-plugin-prettier": "^5.5.5",
131
+ "eslint-plugin-react-hooks": "^5.2.0",
77
132
  "next": "^16.2.6",
78
133
  "payload": "3.88.0",
79
134
  "prettier": "^3.8.1",
135
+ "react": "^19.2.0",
136
+ "react-dom": "^19.2.0",
137
+ "react-icons": "^5.5.0",
138
+ "tailwind-merge": "^3.3.1",
80
139
  "tsdown": "^0.22.14",
81
140
  "typescript": "^5.8.0",
82
141
  "typescript-eslint": "^8.67.0",
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Tailwind v4 theme preset for `@tetherto/dev-websites-core/ui`.
3
+ *
4
+ * Maps CSS variables from `tokens.css` → utilities (`bg-accent`, `rounded-btn`, …).
5
+ *
6
+ * One-shot (CSS):
7
+ * @import '@tetherto/dev-websites-core/ui/theme.css';
8
+ *
9
+ * Or stepwise:
10
+ * @import '@tetherto/dev-websites-core/ui/theme/tokens.css';
11
+ * @import './my-brand.css'; // override --accent, etc.
12
+ * @import '@tetherto/dev-websites-core/ui/theme/preset.css';
13
+ *
14
+ * If the app already defines the same utilities in `tailwind.config.ts`
15
+ * (WDK / QVAC today), you do NOT need this file — just keep your config.
16
+ */
17
+
18
+ @theme inline {
19
+ /* Colors */
20
+ --color-background: hsl(var(--background) / <alpha-value>);
21
+ --color-surface: hsl(var(--surface) / <alpha-value>);
22
+ --color-surface-elevated: hsl(var(--surface-elevated) / <alpha-value>);
23
+ --color-card: hsl(var(--card) / <alpha-value>);
24
+ --color-card-elevated: hsl(var(--card-elevated) / <alpha-value>);
25
+
26
+ --color-foreground: hsl(var(--foreground) / <alpha-value>);
27
+ --color-secondary: hsl(var(--secondary) / <alpha-value>);
28
+ --color-muted: hsl(var(--muted) / <alpha-value>);
29
+
30
+ --color-accent: hsl(var(--accent) / <alpha-value>);
31
+ --color-accent-foreground: hsl(var(--accent-foreground) / <alpha-value>);
32
+ --color-accent-hover: hsl(var(--accent-hover) / <alpha-value>);
33
+ --color-accent-dim: hsl(var(--accent-dim) / <alpha-value>);
34
+
35
+ --color-border: hsl(var(--border) / <alpha-value>);
36
+ --color-border-subtle: hsl(var(--border-subtle) / <alpha-value>);
37
+ --color-destructive: hsl(var(--destructive) / <alpha-value>);
38
+ --color-success: hsl(var(--success) / <alpha-value>);
39
+ --color-warning: hsl(var(--warning) / <alpha-value>);
40
+ --color-ring: hsl(var(--ring) / <alpha-value>);
41
+
42
+ /* Radius → rounded-btn | rounded-control | rounded-card */
43
+ --radius-btn: var(--btn-radius);
44
+ --radius-control: var(--control-radius);
45
+ --radius-card: var(--card-radius);
46
+
47
+ /* Sizing → h-btn | h-btn-sm | px-btn | px-btn-sm | size-btn-sm */
48
+ --height-btn: var(--btn-h);
49
+ --height-btn-sm: var(--btn-h-sm);
50
+ --spacing-btn: var(--btn-px);
51
+ --spacing-btn-sm: var(--btn-px-sm);
52
+ --size-btn-sm: var(--btn-h-sm);
53
+ }
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Shared websites UI Tailwind preset — full theme contract, WDK defaults.
3
+ *
4
+ * Same utility names everywhere (`bg-accent`, `text-foreground`, `text-display-1`,
5
+ * `rounded-btn`, `h-btn`, …). Apps point CSS variables at their brand palette.
6
+ *
7
+ * // WDK — defaults already match site tokens
8
+ * presets: [uiPreset]
9
+ *
10
+ * // QVAC — same keys, override color (and any other) values
11
+ * presets: [uiPreset]
12
+ * theme: { extend: { colors: { accent: { DEFAULT: '…' }, … } } }
13
+ *
14
+ * CSS: define the `--color-*` / `--primitive-*` / `--btn-*` vars the preset
15
+ * references (see WDK `globals.css`), or remap them in the app `:root`.
16
+ */
17
+
18
+ const hsl = (name: string) => `hsl(var(${name}) / <alpha-value>)`
19
+ const cssVar = (name: string) => `var(${name})`
20
+
21
+ const preset = {
22
+ theme: {
23
+ extend: {
24
+ colors: {
25
+ 'background': hsl('--color-bg-base'),
26
+ 'recessed': hsl('--color-bg-recessed'),
27
+ 'surface': hsl('--color-bg-surface'),
28
+ 'surface-elevated': hsl('--color-bg-card-elevated'),
29
+ 'card': hsl('--color-bg-card'),
30
+ 'card-elevated': hsl('--color-bg-card-elevated'),
31
+ 'foreground': hsl('--color-text-primary'),
32
+ 'secondary': hsl('--color-text-secondary'),
33
+ 'muted': hsl('--color-text-muted'),
34
+ 'landing-text': hsl('--color-landing-text'),
35
+ 'landing-text-light': hsl('--color-landing-text-light'),
36
+ 'landing-text-light-30': cssVar('--landing-text-light-30'),
37
+
38
+ 'accent': {
39
+ DEFAULT: hsl('--color-accent'),
40
+ foreground: hsl('--color-text-primary'),
41
+ hover: hsl('--color-accent-hover'),
42
+ dim: hsl('--color-accent-dim'),
43
+ },
44
+ 'border': {
45
+ DEFAULT: hsl('--color-border-default'),
46
+ subtle: hsl('--color-border-subtle'),
47
+ },
48
+ 'success': hsl('--color-success'),
49
+ 'warning': hsl('--color-warning'),
50
+ 'error': hsl('--color-error'),
51
+ 'destructive': hsl('--color-error'),
52
+ 'info': hsl('--color-info'),
53
+ 'ring': hsl('--color-accent'),
54
+
55
+ 'teal': hsl('--color-teal'),
56
+ 'amber': hsl('--color-amber'),
57
+ 'purple': hsl('--color-purple'),
58
+ 'green': hsl('--color-green'),
59
+
60
+ 'blog-primary': hsl('--color-blog-primary'),
61
+ 'blog-body': hsl('--color-blog-body'),
62
+ 'blog-meta': hsl('--color-blog-meta'),
63
+
64
+ 'primitive': {
65
+ 'black': hsl('--primitive-black'),
66
+ 'dark-grey': hsl('--primitive-dark-grey'),
67
+ 'grey': hsl('--primitive-grey'),
68
+ 'light-grey': hsl('--primitive-light-grey'),
69
+ 'white': hsl('--primitive-white'),
70
+ 'orange': hsl('--primitive-orange'),
71
+ 'orange-dark': hsl('--primitive-orange-dark'),
72
+ 'purple': hsl('--primitive-purple'),
73
+ },
74
+ },
75
+
76
+ fontFamily: {
77
+ sans: ['var(--font-sans)', 'sans-serif'],
78
+ display: ['var(--font-sharp)', 'sans-serif'],
79
+ mono: ['var(--font-mono)', 'monospace'],
80
+ },
81
+
82
+ fontSize: {
83
+ 'display-1': ['60px', { lineHeight: '1.05', letterSpacing: '0' }],
84
+ 'display-2': ['50px', { lineHeight: '1.05', letterSpacing: '0' }],
85
+ 'heading-3': ['38px', { lineHeight: '40px', letterSpacing: '0' }],
86
+ 'subhead-1': ['28px', { lineHeight: '32px', letterSpacing: '0' }],
87
+ 'subhead-2': ['22px', { lineHeight: '26px', letterSpacing: '0' }],
88
+ 'subhead-3': ['13px', { lineHeight: '1', letterSpacing: '2px' }],
89
+ 'body-1': ['22px', { lineHeight: '32px' }],
90
+ 'body-2': ['18px', { lineHeight: '28px' }],
91
+ 'body-sm': ['15px', { lineHeight: '20px' }],
92
+ 'body-md': ['14px', { lineHeight: '20px' }],
93
+ 'body-xs': ['13px', { lineHeight: '18px' }],
94
+ 'btn': ['14px', { lineHeight: '19px', letterSpacing: '0.5px' }],
95
+ 'btn-cta': ['15px', { lineHeight: '1' }],
96
+ 'code': ['17px', { lineHeight: '20px' }],
97
+ 'label': ['11px', { lineHeight: '16px', letterSpacing: '0.3px' }],
98
+ 'badge': ['10px', { lineHeight: '1', letterSpacing: '0.4px' }],
99
+ 'caption': ['12px', { lineHeight: '16px' }],
100
+ 'inter-h1': ['50px', { lineHeight: '60px' }],
101
+ 'inter-h2': ['30px', { lineHeight: '38px' }],
102
+ 'inter-h3': ['26px', { lineHeight: '36px' }],
103
+ 'blog-mob': ['16px', { lineHeight: '24px' }],
104
+ },
105
+
106
+ borderRadius: {
107
+ btn: '5px',
108
+ card: '10px',
109
+ badge: '5px',
110
+ control: 'var(--control-radius)',
111
+ pill: '9999px',
112
+ },
113
+
114
+ height: {
115
+ 'btn': 'var(--btn-primary-height)',
116
+ 'btn-sm': 'var(--btn-sm-height)',
117
+ },
118
+
119
+ size: {
120
+ 'btn-sm': 'var(--btn-sm-height)',
121
+ },
122
+
123
+ padding: {
124
+ 'btn': 'var(--btn-primary-px)',
125
+ 'btn-sm': 'var(--btn-sm-px)',
126
+ },
127
+ },
128
+ },
129
+ }
130
+
131
+ export default preset
@@ -0,0 +1,12 @@
1
+ /**
2
+ * One-shot theme bootstrap for Tailwind v4 CSS pipelines.
3
+ *
4
+ * @import 'tailwindcss';
5
+ * @import '@tetherto/dev-websites-core/ui/theme.css';
6
+ *
7
+ * Then override brand in your own CSS:
8
+ * :root { --accent: 180 100% 40%; }
9
+ */
10
+
11
+ @import './tokens.css';
12
+ @import './preset.css';
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Shared UI semantic tokens — CSS custom properties (HSL channels, no `hsl()` wrapper).
3
+ *
4
+ * Used by `@tetherto/dev-websites-core/ui/theme/preset.css` (Tailwind v4 `@theme`)
5
+ * and `@tetherto/dev-websites-core/ui/theme/preset` (JS Tailwind preset).
6
+ *
7
+ * Apps own brand: override any of these in your `:root` (or import this file
8
+ * first, then set brand values). Values below are neutral dark defaults so the
9
+ * package can be previewed without a host app.
10
+ *
11
+ * Utilities that components expect (via the preset):
12
+ * bg-background | bg-surface | bg-surface-elevated | bg-card | bg-card-elevated
13
+ * text-foreground | text-secondary | text-muted
14
+ * bg-accent | text-accent-foreground | accent-hover | accent-dim
15
+ * border-border | border-border-subtle | destructive | success | ring
16
+ * rounded-btn | rounded-control | rounded-card
17
+ * h-btn | h-btn-sm | px-btn | px-btn-sm | size-btn-sm
18
+ */
19
+
20
+ :root {
21
+ /* ── Surfaces ─────────────────────────────────────────────── */
22
+ --background: 40 12% 5%; /* page */
23
+ --surface: 30 8% 9%;
24
+ --surface-elevated: 33 11% 16%;
25
+ --card: 24 7% 14%;
26
+ --card-elevated: 33 11% 16%;
27
+
28
+ /* ── Text ────────────────────────────────────────────────── */
29
+ --foreground: 0 0% 100%;
30
+ --secondary: 37 10% 65%;
31
+ --muted: 38 8% 41%;
32
+
33
+ /* ── Brand ────────────────────────────────────────────────── */
34
+ --accent: 18 100% 50%;
35
+ --accent-foreground: 0 0% 100%;
36
+ --accent-hover: 18 100% 45%;
37
+ --accent-dim: 18 100% 50%;
38
+
39
+ /* ── Borders & feedback ───────────────────────────────────── */
40
+ --border: 30 10% 15%;
41
+ --border-subtle: 24 7% 18%;
42
+ --destructive: 0 100% 64%;
43
+ --success: 160 60% 45%;
44
+ --warning: 38 92% 50%;
45
+ --ring: var(--accent);
46
+
47
+ /* ── Radius (raw) → mapped to rounded-* in the preset ─────── */
48
+ --btn-radius: 0.3125rem; /* 5px */
49
+ --control-radius: 0.375rem; /* 6px */
50
+ --card-radius: 0.625rem; /* 10px */
51
+
52
+ /* ── Control sizing ───────────────────────────────────────── */
53
+ --btn-h: 2.25rem; /* 36px */
54
+ --btn-h-sm: 1.875rem; /* 30px */
55
+ --btn-px: 1.5rem; /* 24px */
56
+ --btn-px-sm: 0.75rem; /* 12px */
57
+ }
@@ -1 +0,0 @@
1
- {"version":3,"file":"cms-5bS91IRZ.mjs","names":[],"sources":["../src/cms/shared/access.ts","../src/cms/collections/createApiTokens.ts","../src/cms/hooks/slugify.ts","../src/cms/shared/seo-fields.ts","../src/cms/collections/createAuthors.ts","../src/cms/blocks/language-options.ts","../src/cms/blocks/code.ts","../src/cms/blocks/code-tabs.ts","../src/cms/blocks/download-cta.ts","../src/cms/blocks/image.ts","../src/cms/blocks/video.ts","../src/cms/lexical/editor.ts","../src/cms/blocks/rich-text.ts","../src/cms/blocks/steps.ts","../src/cms/blocks/leaf-blocks.ts","../src/cms/blocks/accordion.ts","../src/cms/blocks/section-heading.ts","../src/cms/blocks/index.ts","../src/cms/hooks/set-published-at.ts","../src/cms/shared/drafts-with-autosave.ts","../src/cms/collections/createBlogPosts.ts","../src/cms/collections/createCategories.ts","../src/cms/collections/createChangelog.ts","../src/cms/collections/createChangelogTags.ts","../src/cms/collections/createMedia.ts","../src/cms/collections/createPages.ts","../src/cms/collections/createUsers.ts","../src/cms/globals/createSiteSettings.ts","../src/cms/applyOverride.ts","../src/cms/overrides.ts","../src/cms/buildCmsConfig.ts","../src/cms/requireEnv.ts","../src/cms/createS3MediaPlugin.ts"],"sourcesContent":["import type { Access, FieldAccess, PayloadRequest } from 'payload'\n\nexport type AccessOptions = {\n /**\n * When true, disabled `api-tokens` users are denied public reads.\n * Defaults to on when the stock `api-tokens` collection is enabled.\n */\n apiTokens?: boolean\n}\n\nexport type AccessHelpers = {\n adminOnly: ({ req }: { req: PayloadRequest }) => boolean\n adminOrPublished: Access\n publicRead: Access\n adminOnlyField: FieldAccess\n}\n\nconst isAdminUser = (req: PayloadRequest): boolean => req.user?.collection === 'users'\n\nconst isDisabledApiToken = (req: PayloadRequest): boolean =>\n req.user?.collection === 'api-tokens' && req.user?.enabled === false\n\n/**\n * Build access helpers. Pass `{ apiTokens: true }` when the `api-tokens`\n * collection is registered (stock by default via `buildCmsConfig`).\n */\nexport function createAccessHelpers(options: AccessOptions = {}): AccessHelpers {\n const apiTokens = options.apiTokens === true\n\n const adminOnly = ({ req }: { req: PayloadRequest }): boolean => isAdminUser(req)\n\n const adminOrPublished: Access = ({ req }) => {\n if (isAdminUser(req)) return true\n if (apiTokens && isDisabledApiToken(req)) return false\n return { _status: { equals: 'published' } }\n }\n\n const publicRead: Access = ({ req }) => {\n if (apiTokens && isDisabledApiToken(req)) return false\n return true\n }\n\n const adminOnlyField: FieldAccess = ({ req }) => isAdminUser(req)\n\n return { adminOnly, adminOrPublished, publicRead, adminOnlyField }\n}\n","import type { AccessHelpers } from '../shared/access.js'\nimport type { Access, CollectionConfig } from 'payload'\n\nconst adminOrSelf: Access = ({ req }) => {\n if (req.user?.collection === 'users') return true\n if (req.user?.collection === 'api-tokens') return { id: { equals: req.user.id } }\n return false\n}\n\n/**\n * Stock API-key auth collection for server-to-server Payload REST/GraphQL clients.\n * Disable per site with `overrides['api-tokens'] = false`.\n */\nexport function createApiTokens(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'api-tokens',\n labels: {\n singular: 'API Token',\n plural: 'API Tokens',\n },\n admin: {\n useAsTitle: 'name',\n defaultColumns: ['name', 'description', 'enabled', 'createdAt'],\n description:\n 'Server-to-server tokens for non-admin clients calling the Payload REST/GraphQL API. ' +\n 'Each token authenticates as an api-tokens user and is restricted to published, public-readable content.',\n },\n auth: {\n useAPIKey: true,\n disableLocalStrategy: true,\n },\n access: {\n read: adminOrSelf,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n admin: access.adminOnly,\n },\n fields: [\n {\n name: 'name',\n type: 'text',\n required: true,\n admin: {\n description: 'Human-readable label, e.g. \"mobile-app-prod\" or \"partner-foo\".',\n },\n },\n {\n name: 'description',\n type: 'textarea',\n admin: {\n description: 'Who is this token for and what is it used for? Free-form notes.',\n },\n },\n {\n name: 'enabled',\n type: 'checkbox',\n defaultValue: true,\n admin: {\n position: 'sidebar',\n description:\n 'Disable to soft-revoke. To hard-revoke, clear the API Key field or delete the document.',\n },\n },\n ],\n }\n}\n","import type { FieldHook } from 'payload'\n\nexport const slugify: FieldHook = ({ value }) =>\n typeof value === 'string'\n ? value\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '')\n : value\n","import type { GroupField, Validate } from 'payload'\n\nconst MAX_META_TITLE = 60\nconst MAX_META_DESCRIPTION = 160\n\nconst validateMetaTitle: Validate<string | null | undefined> = (value) => {\n if (!value || value.trim().length === 0) return 'Meta title is required.'\n if (value.length > MAX_META_TITLE)\n return `Meta title must be ${MAX_META_TITLE} characters or fewer (currently ${value.length}).`\n return true\n}\n\nconst validateMetaDescription: Validate<string | null | undefined> = (value) => {\n if (!value || value.trim().length === 0) return 'Meta description is required.'\n if (value.length > MAX_META_DESCRIPTION)\n return `Meta description must be ${MAX_META_DESCRIPTION} characters or fewer (currently ${value.length}).`\n return true\n}\n\nconst validateUrl: Validate<string | null | undefined> = (value) => {\n if (!value) return true\n try {\n new URL(value)\n return true\n } catch {\n return 'Must be a valid URL (e.g. https://example.com/page).'\n }\n}\n\nexport const seoFields: GroupField = {\n name: 'seo',\n type: 'group',\n label: 'SEO',\n fields: [\n {\n name: 'metaTitle',\n type: 'text',\n required: true,\n localized: true,\n maxLength: MAX_META_TITLE,\n validate: validateMetaTitle,\n admin: {\n description: `Required. ${MAX_META_TITLE} characters max — shown in browser tabs and search results.`,\n },\n },\n {\n name: 'metaDescription',\n type: 'textarea',\n required: true,\n localized: true,\n validate: validateMetaDescription,\n admin: {\n description: `Required. ${MAX_META_DESCRIPTION} characters max — shown in search result snippets.`,\n },\n },\n {\n name: 'ogImage',\n type: 'upload',\n relationTo: 'media',\n admin: {\n description:\n 'Used when the page is shared on social media (1200×630 recommended). Falls back to cover image if empty.',\n },\n },\n {\n name: 'canonicalUrl',\n type: 'text',\n validate: validateUrl,\n admin: {\n description: 'Override for syndicated content. Leave empty to auto-derive from slug.',\n },\n },\n {\n name: 'noIndex',\n type: 'checkbox',\n defaultValue: false,\n admin: {\n description: 'When checked, search engines will not index this page.',\n },\n },\n {\n name: 'noFollow',\n type: 'checkbox',\n defaultValue: false,\n admin: {\n description:\n 'When checked, search engines will not follow links on this page (paired with noIndex if needed).',\n },\n },\n ],\n}\n","import { slugify } from '../hooks/slugify.js'\nimport { seoFields } from '../shared/seo-fields.js'\n\nimport type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig } from 'payload'\n\nexport function createAuthors(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'authors',\n admin: {\n useAsTitle: 'name',\n defaultColumns: ['name', 'slug', 'role'],\n },\n access: {\n read: access.publicRead,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n },\n fields: [\n {\n name: 'name',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'slug',\n type: 'text',\n required: true,\n unique: true,\n admin: { position: 'sidebar' },\n hooks: { beforeValidate: [slugify] },\n },\n {\n name: 'avatar',\n type: 'upload',\n relationTo: 'media',\n },\n {\n name: 'role',\n type: 'text',\n localized: true,\n admin: {\n description: 'Job title or role (e.g. \"Lead Engineer\")',\n },\n },\n {\n name: 'bio',\n type: 'textarea',\n localized: true,\n },\n {\n name: 'social',\n type: 'group',\n label: 'Social Profiles',\n admin: { position: 'sidebar' },\n fields: [\n { name: 'website', type: 'text' },\n { name: 'twitter', type: 'text', admin: { description: '@handle or full URL' } },\n { name: 'linkedin', type: 'text' },\n { name: 'github', type: 'text' },\n ],\n },\n {\n ...seoFields,\n fields: [\n ...seoFields.fields,\n {\n name: 'jsonLd',\n type: 'group',\n label: 'Structured Data Overrides',\n admin: {\n description: 'Used in JSON-LD Person schema on author pages and article bylines.',\n },\n fields: [\n {\n name: 'jobTitle',\n type: 'text',\n admin: { description: 'schema.org jobTitle (defaults to role if empty)' },\n },\n {\n name: 'worksFor',\n type: 'text',\n admin: { description: 'Organization name for schema.org worksFor' },\n },\n {\n name: 'sameAs',\n type: 'array',\n admin: {\n description: 'Extra canonical URLs for this person (Wikipedia, Crunchbase, etc.)',\n },\n fields: [{ name: 'url', type: 'text', required: true }],\n },\n ],\n },\n ],\n },\n ],\n }\n}\n","/** Shared language options for CMS code blocks and Lexical CodeBlock feature. */\nexport const languageOptions = [\n { label: 'TypeScript', value: 'typescript' },\n { label: 'JavaScript', value: 'javascript' },\n { label: 'Python', value: 'python' },\n { label: 'Bash / Shell', value: 'bash' },\n { label: 'Shell', value: 'shell' },\n { label: 'JSON', value: 'json' },\n { label: 'CSS', value: 'css' },\n { label: 'HTML', value: 'html' },\n { label: 'Rust', value: 'rust' },\n { label: 'Go', value: 'go' },\n { label: 'YAML', value: 'yaml' },\n { label: 'Markdown', value: 'markdown' },\n { label: 'Plain Text', value: 'plaintext' },\n]\n\nexport const codeBlockLanguages: Record<string, string> = Object.fromEntries(\n languageOptions.map((opt) => [opt.value, opt.label])\n)\n\nexport const defaultCodeLanguage = 'plaintext'\n","import { languageOptions } from './language-options.js'\n\nimport type { Block } from 'payload'\n\nexport const codeBlock: Block = {\n slug: 'code',\n labels: { singular: 'Code Block', plural: 'Code Blocks' },\n fields: [\n {\n name: 'language',\n type: 'select',\n defaultValue: 'typescript',\n options: languageOptions,\n },\n {\n name: 'filename',\n type: 'text',\n admin: { description: 'Optional filename label shown above the block' },\n },\n {\n name: 'code',\n type: 'code',\n required: true,\n admin: { language: 'typescript' },\n },\n ],\n}\n","import { languageOptions } from './language-options.js'\n\nimport type { Block } from 'payload'\n\nexport const codeTabsBlock: Block = {\n slug: 'code-tabs',\n labels: { singular: 'Code Tabs', plural: 'Code Tabs' },\n fields: [\n {\n name: 'tabs',\n type: 'array',\n required: true,\n minRows: 1,\n fields: [\n {\n name: 'label',\n type: 'text',\n required: true,\n admin: { description: 'Tab label (e.g. Windows, Linux, Android)' },\n },\n {\n name: 'language',\n type: 'select',\n defaultValue: 'bash',\n options: languageOptions,\n },\n {\n name: 'code',\n type: 'code',\n required: true,\n admin: { language: 'bash' },\n },\n ],\n },\n ],\n}\n","import type { Block } from 'payload'\n\nexport const downloadCtaBlock: Block = {\n slug: 'download-cta',\n labels: { singular: 'Download CTA', plural: 'Download CTAs' },\n fields: [\n {\n name: 'eyebrow',\n type: 'text',\n localized: true,\n },\n {\n name: 'heading',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'headingAccent',\n type: 'text',\n localized: true,\n },\n {\n name: 'description',\n type: 'textarea',\n localized: true,\n },\n {\n name: 'submitLabel',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'downloadUrl',\n type: 'text',\n required: true,\n },\n {\n name: 'downloadLabel',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'successMessage',\n type: 'textarea',\n localized: true,\n },\n {\n name: 'consent',\n type: 'textarea',\n localized: true,\n },\n {\n name: 'footnote',\n type: 'textarea',\n localized: true,\n },\n ],\n}\n","import type { Block } from 'payload'\n\nexport const imageBlock: Block = {\n slug: 'image',\n labels: { singular: 'Image', plural: 'Images' },\n fields: [\n {\n name: 'image',\n type: 'upload',\n relationTo: 'media',\n required: true,\n },\n {\n name: 'caption',\n type: 'text',\n localized: true,\n },\n {\n name: 'size',\n type: 'select',\n defaultValue: 'full',\n options: [\n { label: 'Full Width', value: 'full' },\n { label: 'Wide', value: 'wide' },\n { label: 'Medium', value: 'medium' },\n ],\n },\n ],\n}\n","import type { Block } from 'payload'\n\nexport const videoBlock: Block = {\n slug: 'video',\n labels: { singular: 'Video', plural: 'Videos' },\n fields: [\n {\n name: 'video',\n type: 'upload',\n relationTo: 'media',\n required: true,\n filterOptions: {\n mimeType: { contains: 'video' },\n },\n },\n {\n name: 'caption',\n type: 'text',\n localized: true,\n },\n {\n name: 'size',\n type: 'select',\n defaultValue: 'full',\n options: [\n { label: 'Full Width', value: 'full' },\n { label: 'Wide', value: 'wide' },\n { label: 'Medium', value: 'medium' },\n ],\n },\n ],\n}\n","import {\n BlocksFeature,\n CodeBlock,\n EXPERIMENTAL_TableFeature,\n UploadFeature,\n editorConfigFactory,\n lexicalEditor,\n} from '@payloadcms/richtext-lexical'\n\nimport { codeBlockLanguages, defaultCodeLanguage } from '../blocks/language-options.js'\nimport { videoBlock } from '../blocks/video.js'\n\nimport type { FeatureProviderServer } from '@payloadcms/richtext-lexical'\nimport type { SanitizedConfig } from 'payload'\n\nconst richTextFeatures = ({\n defaultFeatures,\n}: {\n defaultFeatures: FeatureProviderServer[]\n rootFeatures: FeatureProviderServer[]\n}) => [\n ...defaultFeatures.filter((feature) => feature.key !== 'upload'),\n UploadFeature({\n collections: {\n media: {\n fields: [\n {\n name: 'caption',\n type: 'text',\n },\n ],\n },\n },\n }),\n BlocksFeature({\n blocks: [\n CodeBlock({\n languages: codeBlockLanguages,\n defaultLanguage: defaultCodeLanguage,\n }),\n videoBlock,\n ],\n }),\n EXPERIMENTAL_TableFeature(),\n]\n\n/**\n * Shared Lexical editor for every `richText` field.\n *\n * Adds `CodeBlock`, inline `video` block, media upload captions, and\n * `EXPERIMENTAL_TableFeature` on top of Payload defaults.\n */\n// Return type is derived from `lexicalEditor` (a public export) rather than the\n// inferred `LexicalRichTextAdapterProvider` (not re-exported), so the generated\n// declaration stays portable while keeping the narrow Lexical adapter type that\n// consumers like `editorConfigFactory.fromEditor` require.\nexport const richTextEditor = (): ReturnType<typeof lexicalEditor> =>\n lexicalEditor({\n features: richTextFeatures,\n })\n\n/** Resolve Lexical editor config for seed scripts / markdown conversion. */\nexport async function getRichTextEditorConfig(config: SanitizedConfig) {\n return editorConfigFactory.fromFeatures({\n config,\n features: richTextFeatures,\n })\n}\n","import { richTextEditor } from '../lexical/editor.js'\n\nimport type { Block } from 'payload'\n\nexport const richTextBlock: Block = {\n slug: 'rich-text',\n labels: { singular: 'Rich Text', plural: 'Rich Text Blocks' },\n fields: [\n {\n name: 'content',\n type: 'richText',\n localized: true,\n editor: richTextEditor(),\n },\n ],\n}\n","import type { Block } from 'payload'\n\nexport const stepsBlock: Block = {\n slug: 'steps',\n labels: { singular: 'Steps List', plural: 'Steps Lists' },\n fields: [\n {\n name: 'items',\n type: 'array',\n required: true,\n minRows: 1,\n fields: [\n {\n name: 'title',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'description',\n type: 'textarea',\n localized: true,\n },\n {\n name: 'avatar',\n type: 'upload',\n relationTo: 'media',\n admin: { description: 'Optional avatar or icon shown next to the step' },\n },\n ],\n },\n ],\n}\n","import { codeBlock } from './code.js'\nimport { codeTabsBlock } from './code-tabs.js'\nimport { downloadCtaBlock } from './download-cta.js'\nimport { imageBlock } from './image.js'\nimport { richTextBlock } from './rich-text.js'\nimport { stepsBlock } from './steps.js'\nimport { videoBlock } from './video.js'\n\nimport type { Block } from 'payload'\n\nexport const leafBlocks: Block[] = [\n richTextBlock,\n codeBlock,\n codeTabsBlock,\n imageBlock,\n videoBlock,\n downloadCtaBlock,\n stepsBlock,\n]\n","import { leafBlocks } from './leaf-blocks.js'\n\nimport type { Block } from 'payload'\n\nexport const accordionBlock: Block = {\n slug: 'accordion',\n labels: { singular: 'Accordion', plural: 'Accordions' },\n fields: [\n {\n name: 'items',\n type: 'array',\n required: true,\n minRows: 1,\n fields: [\n {\n name: 'title',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'defaultOpen',\n type: 'checkbox',\n defaultValue: false,\n },\n {\n name: 'content',\n type: 'blocks',\n blocks: leafBlocks,\n localized: true,\n },\n ],\n },\n ],\n}\n","import type { Block } from 'payload'\n\nexport const sectionHeadingBlock: Block = {\n slug: 'section-heading',\n labels: { singular: 'Section Heading', plural: 'Section Headings' },\n fields: [\n {\n name: 'text',\n type: 'text',\n required: true,\n localized: true,\n },\n ],\n}\n","import { accordionBlock } from './accordion.js'\nimport { codeBlock } from './code.js'\nimport { codeTabsBlock } from './code-tabs.js'\nimport { downloadCtaBlock } from './download-cta.js'\nimport { imageBlock } from './image.js'\nimport { richTextBlock } from './rich-text.js'\nimport { sectionHeadingBlock } from './section-heading.js'\nimport { stepsBlock } from './steps.js'\nimport { videoBlock } from './video.js'\n\nimport type { Block } from 'payload'\n\nexport { richTextBlock } from './rich-text.js'\nexport { codeBlock } from './code.js'\nexport { codeTabsBlock } from './code-tabs.js'\nexport { imageBlock } from './image.js'\nexport { videoBlock } from './video.js'\nexport { downloadCtaBlock } from './download-cta.js'\nexport { stepsBlock } from './steps.js'\nexport { accordionBlock } from './accordion.js'\nexport { sectionHeadingBlock } from './section-heading.js'\nexport { leafBlocks } from './leaf-blocks.js'\nexport { languageOptions, codeBlockLanguages, defaultCodeLanguage } from './language-options.js'\n\nexport const blogContentBlocks: Block[] = [\n richTextBlock,\n codeBlock,\n codeTabsBlock,\n imageBlock,\n videoBlock,\n downloadCtaBlock,\n stepsBlock,\n accordionBlock,\n]\n\nexport const pageContentBlocks: Block[] = [\n richTextBlock,\n codeBlock,\n codeTabsBlock,\n imageBlock,\n stepsBlock,\n accordionBlock,\n]\n\nexport const showcaseContentBlocks: Block[] = [\n sectionHeadingBlock,\n richTextBlock,\n codeBlock,\n imageBlock,\n]\n","import type { CollectionBeforeChangeHook } from 'payload'\n\nexport const setPublishedAt: CollectionBeforeChangeHook = ({ data }) => {\n if (data && !data.publishedAt && data._status === 'published') {\n data.publishedAt = new Date().toISOString()\n }\n return data\n}\n","import type { CollectionConfig } from 'payload'\n\nexport const draftsWithAutosave: CollectionConfig['versions'] = {\n maxPerDoc: 25,\n drafts: {\n autosave: {\n interval: 800,\n },\n schedulePublish: true,\n },\n}\n","import { blogContentBlocks } from '../blocks/index.js'\nimport { setPublishedAt } from '../hooks/set-published-at.js'\nimport { slugify } from '../hooks/slugify.js'\nimport { draftsWithAutosave } from '../shared/drafts-with-autosave.js'\nimport { seoFields } from '../shared/seo-fields.js'\n\nimport type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig } from 'payload'\n\n/** Stock blog-posts collection (no site revalidation — add via overrides.hooks). */\nexport function createBlogPosts(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'blog-posts',\n defaultSort: '-publishedAt',\n admin: {\n useAsTitle: 'title',\n defaultColumns: ['title', 'slug', 'author', 'publishedAt', '_status'],\n },\n access: {\n read: access.adminOrPublished,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n },\n versions: draftsWithAutosave,\n hooks: {\n beforeChange: [setPublishedAt],\n },\n fields: [\n {\n name: 'title',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'slug',\n type: 'text',\n required: true,\n unique: true,\n admin: {\n position: 'sidebar',\n description: 'URL-friendly identifier. Not localized — one slug per post.',\n },\n hooks: { beforeValidate: [slugify] },\n },\n {\n name: 'coverImage',\n type: 'upload',\n relationTo: 'media',\n },\n {\n name: 'imageAlt',\n type: 'text',\n localized: true,\n admin: {\n description:\n 'Alt text used for the auto-generated social/OG image (`og:image:alt`). Should describe the post for screen readers.',\n },\n },\n {\n name: 'excerpt',\n type: 'textarea',\n localized: true,\n admin: {\n description: 'Short summary shown in listing cards and meta description fallback.',\n },\n },\n {\n name: 'content',\n type: 'blocks',\n localized: true,\n blocks: blogContentBlocks,\n },\n {\n name: 'author',\n type: 'relationship',\n relationTo: 'authors',\n admin: { position: 'sidebar' },\n },\n {\n name: 'category',\n type: 'relationship',\n relationTo: 'categories',\n admin: { position: 'sidebar' },\n },\n {\n name: 'readingTime',\n type: 'number',\n min: 1,\n admin: {\n position: 'sidebar',\n description: 'Estimated reading time in minutes.',\n },\n },\n {\n name: 'publishedAt',\n type: 'date',\n admin: {\n position: 'sidebar',\n date: { pickerAppearance: 'dayAndTime' },\n description: 'Auto-filled on first publish if left empty.',\n },\n },\n {\n name: 'showLatestNews',\n type: 'checkbox',\n defaultValue: true,\n admin: {\n position: 'sidebar',\n description: 'Show a \"Latest News\" section at the bottom of this post.',\n },\n },\n seoFields,\n ],\n }\n}\n","import { slugify } from '../hooks/slugify.js'\n\nimport type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig } from 'payload'\n\nexport function createCategories(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'categories',\n admin: {\n useAsTitle: 'name',\n defaultColumns: ['name', 'slug'],\n },\n access: {\n read: access.publicRead,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n },\n fields: [\n {\n name: 'name',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'slug',\n type: 'text',\n required: true,\n unique: true,\n admin: { position: 'sidebar' },\n hooks: { beforeValidate: [slugify] },\n },\n {\n name: 'description',\n type: 'textarea',\n localized: true,\n },\n ],\n }\n}\n","import { slugify } from '../hooks/slugify.js'\nimport { draftsWithAutosave } from '../shared/drafts-with-autosave.js'\n\nimport type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig } from 'payload'\n\n/**\n * Stock changelog collection (shared fields only).\n * Site-specific body / GitHub / related-block fields — add via `overrides.fields`.\n * Revalidation — add via `overrides.hooks`.\n */\nexport function createChangelog(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'changelog',\n labels: { singular: 'Changelog', plural: 'Changelog' },\n defaultSort: '-releaseDate',\n admin: {\n useAsTitle: 'title',\n defaultColumns: ['title', 'version', 'versionType', 'tags', 'releaseDate', '_status'],\n },\n access: {\n read: access.adminOrPublished,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n },\n versions: draftsWithAutosave,\n fields: [\n {\n name: 'title',\n type: 'text',\n required: true,\n localized: true,\n admin: {\n description:\n 'Release headline shown on the changelog detail page (e.g. \"Added Solana Support\").',\n },\n },\n {\n name: 'slug',\n type: 'text',\n required: true,\n unique: true,\n admin: {\n position: 'sidebar',\n description: 'URL-friendly identifier. Not localized — one slug per entry.',\n },\n hooks: { beforeValidate: [slugify] },\n },\n {\n name: 'version',\n type: 'text',\n admin: {\n position: 'sidebar',\n description:\n 'Optional semantic version label shown in the badge, e.g. v1.1.0 or 2.3.0. Omit for non-versioned announcements.',\n },\n },\n {\n name: 'versionType',\n type: 'select',\n options: [\n { label: 'Major', value: 'major' },\n { label: 'Minor', value: 'minor' },\n { label: 'Patch', value: 'patch' },\n ],\n admin: {\n position: 'sidebar',\n description:\n 'Release line for badge styling (major / minor / patch). Editors set this explicitly.',\n },\n },\n {\n name: 'releaseDate',\n type: 'date',\n required: true,\n admin: {\n position: 'sidebar',\n date: { pickerAppearance: 'dayOnly', displayFormat: 'MMM d, yyyy' },\n },\n },\n {\n name: 'tags',\n type: 'relationship',\n relationTo: 'changelog-tags',\n hasMany: true,\n label: 'Tags',\n admin: {\n position: 'sidebar',\n description: 'Editor-managed tags from the Changelog Tags collection.',\n },\n },\n {\n name: 'heroImage',\n type: 'upload',\n relationTo: 'media',\n admin: {\n description: 'Large visual above the article body on the changelog detail page.',\n },\n },\n {\n name: 'summary',\n type: 'textarea',\n localized: true,\n admin: {\n description: 'Short excerpt for listing cards and previews.',\n },\n },\n ],\n }\n}\n","import { slugify } from '../hooks/slugify.js'\n\nimport type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig } from 'payload'\n\n/** Stock changelog-tags (no site revalidation — add via overrides.hooks). */\nexport function createChangelogTags(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'changelog-tags',\n defaultSort: 'order',\n admin: {\n useAsTitle: 'name',\n defaultColumns: ['name', 'slug', 'order'],\n description: 'Tags shown on changelog entries.',\n },\n access: {\n read: access.publicRead,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n },\n fields: [\n {\n name: 'name',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'slug',\n type: 'text',\n required: true,\n unique: true,\n admin: {\n position: 'sidebar',\n description: 'URL-friendly identifier used by listing filters.',\n },\n hooks: { beforeValidate: [slugify] },\n },\n {\n name: 'order',\n type: 'number',\n defaultValue: 0,\n admin: {\n position: 'sidebar',\n description: 'Display order in admin lists (ascending). Ties broken by name.',\n },\n },\n {\n name: 'description',\n type: 'textarea',\n localized: true,\n admin: { description: 'Optional context shown to editors. Not rendered publicly yet.' },\n },\n ],\n }\n}\n","import type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig } from 'payload'\n\n/** Stock media upload collection (always publicly readable once uploaded). */\nexport function createMedia(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'media',\n admin: {\n useAsTitle: 'filename',\n defaultColumns: ['filename', 'alt', 'updatedAt'],\n },\n access: {\n read: access.publicRead,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n },\n upload: {\n imageSizes: [\n {\n name: 'thumbnail',\n width: 400,\n height: 300,\n position: 'centre',\n },\n {\n name: 'card',\n width: 768,\n height: 512,\n position: 'centre',\n },\n {\n name: 'tablet',\n width: 1024,\n height: undefined,\n position: 'centre',\n },\n ],\n adminThumbnail: 'thumbnail',\n mimeTypes: ['image/*', 'video/*', 'application/pdf'],\n },\n fields: [\n {\n name: 'alt',\n type: 'text',\n required: true,\n localized: true,\n },\n ],\n }\n}\n","import { pageContentBlocks } from '../blocks/index.js'\nimport { setPublishedAt } from '../hooks/set-published-at.js'\nimport { slugify } from '../hooks/slugify.js'\nimport { draftsWithAutosave } from '../shared/drafts-with-autosave.js'\nimport { seoFields } from '../shared/seo-fields.js'\n\nimport type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig } from 'payload'\n\nfunction createContentPageCollection(\n access: AccessHelpers,\n slug: 'pages' | 'legal-pages'\n): CollectionConfig {\n return {\n slug,\n admin: {\n useAsTitle: 'title',\n defaultColumns: ['title', 'slug', 'publishedAt', '_status'],\n },\n access: {\n read: access.adminOrPublished,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n },\n versions: draftsWithAutosave,\n hooks: {\n beforeChange: [setPublishedAt],\n },\n fields: [\n {\n name: 'title',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'slug',\n type: 'text',\n required: true,\n unique: true,\n admin: {\n position: 'sidebar',\n description: 'URL-friendly identifier. Not localized — one slug per page.',\n },\n hooks: { beforeValidate: [slugify] },\n },\n {\n name: 'content',\n type: 'blocks',\n localized: true,\n blocks: pageContentBlocks,\n },\n {\n name: 'publishedAt',\n type: 'date',\n admin: {\n position: 'sidebar',\n date: { pickerAppearance: 'dayAndTime' },\n description: 'Auto-filled on first publish if left empty.',\n },\n },\n seoFields,\n ],\n }\n}\n\nexport function createPages(access: AccessHelpers): CollectionConfig {\n return createContentPageCollection(access, 'pages')\n}\n\nexport function createLegalPages(access: AccessHelpers): CollectionConfig {\n return createContentPageCollection(access, 'legal-pages')\n}\n","import type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig } from 'payload'\n\nexport function createUsers(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'users',\n admin: {\n useAsTitle: 'email',\n },\n auth: true,\n access: {\n read: access.adminOnly,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n admin: access.adminOnly,\n },\n fields: [],\n }\n}\n","import type { AccessHelpers } from '../shared/access.js'\nimport type { GlobalConfig } from 'payload'\n\nexport function createSiteSettings(access: AccessHelpers): GlobalConfig {\n return {\n slug: 'site-settings',\n label: 'Site Settings',\n access: {\n read: access.publicRead,\n update: access.adminOnly,\n },\n fields: [\n {\n name: 'name',\n type: 'text',\n required: true,\n localized: true,\n admin: {\n description: 'Public site name used in titles and structured data.',\n },\n },\n {\n name: 'defaultDescription',\n type: 'textarea',\n required: true,\n localized: true,\n admin: {\n description: 'Fallback meta description when a page does not define its own.',\n },\n },\n {\n name: 'defaultOgImage',\n type: 'upload',\n relationTo: 'media',\n admin: {\n description: 'Default Open Graph image (1200×630 recommended).',\n },\n },\n {\n name: 'organization',\n type: 'group',\n label: 'Organization',\n fields: [\n {\n name: 'name',\n type: 'text',\n required: true,\n },\n {\n name: 'legalName',\n type: 'text',\n },\n {\n name: 'description',\n type: 'textarea',\n localized: true,\n },\n {\n name: 'logo',\n type: 'upload',\n relationTo: 'media',\n },\n {\n name: 'foundingDate',\n type: 'text',\n admin: { description: 'Year or ISO date for schema.org structured data.' },\n },\n ],\n },\n {\n name: 'social',\n type: 'group',\n label: 'Social Profiles',\n fields: [\n { name: 'twitter', type: 'text' },\n { name: 'github', type: 'text' },\n { name: 'linkedin', type: 'text' },\n ],\n },\n ],\n }\n}\n","import type { CollectionConfig, Field, GlobalConfig } from 'payload'\n\ntype OverridableConfig = CollectionConfig | GlobalConfig\n\ntype Override<TConfig extends OverridableConfig> =\n | false\n | {\n fields?: (base: Field[]) => Field[]\n hooks?: Partial<TConfig['hooks']>\n admin?: Partial<TConfig['admin']>\n access?: Partial<TConfig['access']>\n config?: (base: TConfig) => TConfig\n }\n\nexport type CollectionOverride = Override<CollectionConfig>\nexport type GlobalOverride = Override<GlobalConfig>\n\ntype HookArrays = Record<string, unknown[] | undefined>\n\n// Payload collection/global hooks are all arrays of functions, so overrides are\n// appended to the base hooks rather than replacing them.\nfunction mergeHooks(base: HookArrays | undefined, extra: HookArrays | undefined): HookArrays {\n const keys = new Set([...Object.keys(base ?? {}), ...Object.keys(extra ?? {})])\n const merged: HookArrays = {}\n keys.forEach((key) => {\n const combined = [...(base?.[key] ?? []), ...(extra?.[key] ?? [])]\n if (combined.length) merged[key] = combined\n })\n return merged\n}\n\nfunction applyOverride<TConfig extends OverridableConfig>(\n base: TConfig,\n override: Override<TConfig> | undefined\n): TConfig | null {\n if (override === false) return null\n if (!override) return base\n\n const next = {\n ...base,\n ...(override.admin && { admin: { ...base.admin, ...override.admin } }),\n ...(override.access && { access: { ...base.access, ...override.access } }),\n ...(override.fields && { fields: override.fields(base.fields ?? []) }),\n ...(override.hooks && { hooks: mergeHooks(base.hooks, override.hooks as HookArrays) }),\n } as TConfig\n\n return override.config ? override.config(next) : next\n}\n\nexport const applyCollectionOverride = (\n base: CollectionConfig,\n override: CollectionOverride | undefined\n): CollectionConfig | null => applyOverride(base, override)\n\nexport const applyGlobalOverride = (\n base: GlobalConfig,\n override: GlobalOverride | undefined\n): GlobalConfig | null => applyOverride(base, override)\n","import type { CollectionOverride, GlobalOverride } from './applyOverride.js'\n\n/** Slugs of the stock collections shipped by `buildCmsConfig`, in registration order. */\nexport const STOCK_COLLECTION_SLUGS = [\n 'users',\n 'api-tokens',\n 'media',\n 'authors',\n 'categories',\n 'blog-posts',\n 'pages',\n 'legal-pages',\n 'changelog-tags',\n 'changelog',\n] as const\n\nexport type StockCollectionSlug = (typeof STOCK_COLLECTION_SLUGS)[number]\n\n/** Typed map of collection/global overrides for `buildCmsConfig`. */\nexport type Overrides = Partial<Record<StockCollectionSlug, CollectionOverride>> & {\n 'site-settings'?: GlobalOverride\n}\n","import { buildConfig } from 'payload'\n\nimport { createAccessHelpers, type AccessOptions } from './shared/access.js'\nimport { createApiTokens } from './collections/createApiTokens.js'\nimport { createAuthors } from './collections/createAuthors.js'\nimport { createBlogPosts } from './collections/createBlogPosts.js'\nimport { createCategories } from './collections/createCategories.js'\nimport { createChangelog } from './collections/createChangelog.js'\nimport { createChangelogTags } from './collections/createChangelogTags.js'\nimport { createMedia } from './collections/createMedia.js'\nimport { createLegalPages, createPages } from './collections/createPages.js'\nimport { createUsers } from './collections/createUsers.js'\nimport { createSiteSettings } from './globals/createSiteSettings.js'\nimport { richTextEditor } from './lexical/editor.js'\nimport { applyCollectionOverride, applyGlobalOverride } from './applyOverride.js'\nimport { STOCK_COLLECTION_SLUGS, type Overrides, type StockCollectionSlug } from './overrides.js'\n\nimport type { CollectionConfig, Config, GlobalConfig, Plugin } from 'payload'\n\nexport type BuildCmsConfigOptions<TLocale extends string = string> = {\n secret: string\n // Payload DB adapter instance (e.g. mongooseAdapter({ url }))\n db: Config['db']\n /** Sharp instance from the `sharp` package. */\n sharp?: Config['sharp']\n cors?: Config['cors']\n csrf?: Config['csrf']\n locales: readonly TLocale[]\n /** Must be one of `locales`. */\n defaultLocale: TLocale\n admin?: Config['admin']\n plugins?: Plugin[]\n /** Defaults to the package Lexical editor. */\n editor?: Config['editor']\n access?: AccessOptions\n /** Collection/global slug → override | false. */\n overrides?: Overrides\n extraCollections?: CollectionConfig[]\n extraGlobals?: GlobalConfig[]\n typescript?: Config['typescript']\n /** Extra top-level Payload config keys (e.g. endpoints, graphQL). */\n payload?: Partial<\n Omit<\n Config,\n | 'secret'\n | 'db'\n | 'sharp'\n | 'cors'\n | 'csrf'\n | 'admin'\n | 'plugins'\n | 'editor'\n | 'collections'\n | 'globals'\n | 'localization'\n | 'typescript'\n >\n >\n}\n\n/** Drop keys whose value is `undefined` so they don't clobber Payload defaults. */\nfunction defined<T extends Record<string, unknown>>(obj: T): Partial<T> {\n return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as Partial<T>\n}\n\n/**\n * Build a Payload config from shared stock collections/globals plus site\n * overrides and extras. Types are still generated in the consuming app.\n */\nexport function buildCmsConfig<const TLocale extends string>(\n options: BuildCmsConfigOptions<TLocale>\n) {\n const overrides = options.overrides ?? {}\n const access = createAccessHelpers({\n ...options.access,\n apiTokens: options.access?.apiTokens ?? overrides['api-tokens'] !== false,\n })\n\n const stock: Record<StockCollectionSlug, CollectionConfig> = {\n 'users': createUsers(access),\n 'api-tokens': createApiTokens(access),\n 'media': createMedia(access),\n 'authors': createAuthors(access),\n 'categories': createCategories(access),\n 'blog-posts': createBlogPosts(access),\n 'pages': createPages(access),\n 'legal-pages': createLegalPages(access),\n 'changelog-tags': createChangelogTags(access),\n 'changelog': createChangelog(access),\n }\n\n const collections = [\n ...STOCK_COLLECTION_SLUGS.map((slug) =>\n applyCollectionOverride(stock[slug], overrides[slug])\n ).filter((c): c is CollectionConfig => c !== null),\n ...(options.extraCollections ?? []),\n ]\n\n const siteSettings = applyGlobalOverride(createSiteSettings(access), overrides['site-settings'])\n const globals = [...(siteSettings ? [siteSettings] : []), ...(options.extraGlobals ?? [])]\n\n return buildConfig({\n ...options.payload,\n ...defined({\n sharp: options.sharp,\n cors: options.cors,\n csrf: options.csrf,\n plugins: options.plugins,\n }),\n secret: options.secret,\n db: options.db,\n admin: {\n user: 'users',\n ...options.admin,\n },\n editor: options.editor ?? richTextEditor(),\n collections,\n ...(globals.length ? { globals } : {}),\n localization: {\n locales: options.locales.map((code) => ({\n code,\n label: code.toUpperCase(),\n })),\n defaultLocale: options.defaultLocale,\n fallback: true,\n },\n typescript: options.typescript ?? {\n outputFile: 'src/payload-types.ts',\n },\n })\n}\n","import { createLogger } from '../utils/logger/logger.js'\n\nconst log = createLogger('env')\n\n/**\n * Read a required env var. During Next.js `phase-production-build` and\n * `generate:importmap` (when NEXT_PHASE is unset) returns \"\" instead of throwing,\n * because those phases do not connect to the DB.\n */\nexport function requireEnvAtRuntime(name: string): string {\n const value = process.env[name]\n const isBuildTime = !process.env.NEXT_PHASE || process.env.NEXT_PHASE === 'phase-production-build'\n if (!value && !isBuildTime) {\n log.error(`Missing required environment variable: ${name}`)\n throw new Error(`Missing required environment variable: ${name}`)\n }\n return value ?? ''\n}\n","import { s3Storage } from '@payloadcms/storage-s3'\n\nimport type { Plugin } from 'payload'\n\nexport type CreateS3MediaPluginOptions = {\n /** Defaults to `process.env.AWS_S3_BUCKET`. */\n bucket?: string\n accessKeyId?: string\n secretAccessKey?: string\n region?: string\n /** Custom S3-compatible endpoint (MinIO, etc.). Defaults to `AWS_S3_ENDPOINT`. */\n endpoint?: string\n /** Defaults to `AWS_S3_FORCE_PATH_STYLE === 'true'`. */\n forcePathStyle?: boolean\n /** Collection slug that owns uploads. Defaults to `media`. */\n collection?: string\n}\n\n/** Payload S3 storage plugin wired for the stock `media` collection. */\nexport function createS3MediaPlugin(options: CreateS3MediaPluginOptions = {}): Plugin {\n const bucket = options.bucket ?? process.env.AWS_S3_BUCKET ?? ''\n const endpoint = options.endpoint ?? process.env.AWS_S3_ENDPOINT ?? ''\n const forcePathStyle = options.forcePathStyle ?? process.env.AWS_S3_FORCE_PATH_STYLE === 'true'\n\n return s3Storage({\n enabled: Boolean(bucket),\n collections: {\n [options.collection ?? 'media']: true,\n },\n bucket,\n config: {\n credentials: {\n accessKeyId: options.accessKeyId ?? process.env.AWS_ACCESS_KEY_ID ?? '',\n secretAccessKey: options.secretAccessKey ?? process.env.AWS_SECRET_ACCESS_KEY ?? '',\n },\n region: options.region ?? process.env.AWS_S3_REGION ?? 'us-east-1',\n ...(endpoint ? { endpoint } : {}),\n ...(forcePathStyle ? { forcePathStyle: true } : {}),\n },\n })\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"i18n-Dy3VrbBw.mjs","names":[],"sources":["../src/i18n/languages.ts"],"sourcesContent":["export enum Languages {\n English = 'en',\n}\n\nexport const LanguageLabel: Record<Languages, string> = {\n [Languages.English]: 'En',\n}\n"],"mappings":";AAAA,IAAY,YAAL,yBAAA,WAAA;CACL,UAAA,aAAA;;AACF,EAAA,CAAA,CAAA;AAEA,MAAa,gBAA2C,GAAA,OACjC,KACvB"}