camox 0.43.0 → 0.45.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 (412) hide show
  1. package/bin/camox.mjs +9 -1
  2. package/dist/components/AuthGate.js +0 -6
  3. package/dist/components/DeviceSelector.js +96 -0
  4. package/dist/components/PlatformLabel.js +20 -24
  5. package/dist/core/components/lexical/HighlightNode.js +1 -1
  6. package/dist/core/components/lexical/InlineContentEditable.js +15 -19
  7. package/dist/core/components/lexical/InlineLexicalEditor.js +54 -74
  8. package/dist/core/components/lexical/InlineStylesPlugin.js +57 -41
  9. package/dist/core/components/lexical/MaxLengthPlugin.js +59 -0
  10. package/dist/core/components/lexical/SelectionBroadcaster.js +55 -56
  11. package/dist/core/components/lexical/SidebarLexicalEditor.js +327 -234
  12. package/dist/core/components/lexical/SummaryToggleGuard.js +42 -0
  13. package/dist/core/components/lexical/TextLinkPopover.js +169 -180
  14. package/dist/core/createApp.d.ts +254 -299
  15. package/dist/core/createApp.js +123 -29
  16. package/dist/core/createBlock.d.ts +5 -5
  17. package/dist/core/createBlock.js +399 -152
  18. package/dist/core/createCollection.d.ts +55 -0
  19. package/dist/core/createCollection.js +93 -0
  20. package/dist/core/createLayout.d.ts +197 -61
  21. package/dist/core/createLayout.js +114 -56
  22. package/dist/core/defineDocument.d.ts +3 -5
  23. package/dist/core/derivedRoutes.js +49 -1
  24. package/dist/core/dom.d.ts +13 -4
  25. package/dist/core/dom.js +44 -1
  26. package/dist/core/editing/BlockEditingRuntime.d.ts +16 -0
  27. package/dist/core/editing/BlockEditingRuntime.js +6 -15
  28. package/dist/core/editing/CompleteBlockEditingRuntime.js +28 -23
  29. package/dist/core/editing/createEditableBlock.d.ts +820 -565
  30. package/dist/core/editing/createEditableBlock.js +2153 -971
  31. package/dist/core/editing/referenceWrites.js +51 -0
  32. package/dist/core/editing/useLatestRecord.js +90 -0
  33. package/dist/core/hooks/useArtifactHost.js +139 -0
  34. package/dist/core/hooks/useFieldSelection.js +43 -18
  35. package/dist/core/hooks/useIsEditable.js +12 -10
  36. package/dist/core/hooks/useOverlayMessage.js +15 -19
  37. package/dist/core/lib/artifact.d.ts +21 -0
  38. package/dist/core/lib/artifact.js +154 -0
  39. package/dist/core/lib/artifactColors.js +123 -0
  40. package/dist/core/lib/artifactData.d.ts +1 -0
  41. package/dist/core/lib/artifactData.js +131 -0
  42. package/dist/core/lib/artifactHost.js +205 -0
  43. package/dist/core/lib/artifactRuntime.js +36 -0
  44. package/dist/core/lib/artifactTheme.js +57 -0
  45. package/dist/core/lib/contentType.d.ts +304 -103
  46. package/dist/core/lib/contentType.js +207 -168
  47. package/dist/core/lib/fieldTypes.js +4 -0
  48. package/dist/core/lib/iconTypes.d.ts +13 -0
  49. package/dist/core/lib/icons.d.ts +6 -0
  50. package/dist/core/lib/icons.js +126 -0
  51. package/dist/core/lib/imagePlaceholder.js +177 -0
  52. package/dist/core/lib/imageTransform.js +1 -1
  53. package/dist/core/lib/lexicalReact.d.ts +3 -1
  54. package/dist/core/lib/lexicalState.js +7 -7
  55. package/dist/core/lib/modifierFormats.js +1 -1
  56. package/dist/core/lib/previewPaused.js +9 -0
  57. package/dist/core/lib/recordScope.js +316 -0
  58. package/dist/core/lib/reference.d.ts +81 -0
  59. package/dist/core/lib/reference.js +29 -0
  60. package/dist/core/lib/textLinks.js +7 -5
  61. package/dist/core/lib/textStyles.d.ts +6 -8
  62. package/dist/core/lib/textStyles.js +5 -5
  63. package/dist/core/notFound.d.ts +7 -0
  64. package/dist/core/notFound.js +11 -0
  65. package/dist/core/pageDestinations.js +6 -3
  66. package/dist/core/recordItem.js +34 -0
  67. package/dist/core/requestContext.d.ts +26 -0
  68. package/dist/core/requestContext.js +20 -0
  69. package/dist/features/canvas/CamoxCanvas.js +1734 -0
  70. package/dist/features/canvas/CanvasBlockFrame.js +353 -0
  71. package/dist/features/canvas/CanvasBlockHeader.js +55 -0
  72. package/dist/features/canvas/CanvasLoadingScreen.js +35 -0
  73. package/dist/features/canvas/CanvasOverlays.js +254 -0
  74. package/dist/features/canvas/CanvasPageEdge.js +87 -0
  75. package/dist/features/canvas/CanvasPageFrame.js +335 -0
  76. package/dist/features/canvas/CanvasPageHeader.js +125 -0
  77. package/dist/features/canvas/CanvasPreviewPageSlot.js +103 -0
  78. package/dist/features/canvas/CanvasShelfMarker.js +255 -0
  79. package/dist/features/canvas/DerivedPagePathInput.js +238 -0
  80. package/dist/features/canvas/canvasCamera.js +229 -0
  81. package/dist/features/canvas/canvasFlight.js +104 -0
  82. package/dist/features/canvas/canvasFrameCapture.js +364 -0
  83. package/dist/features/canvas/canvasFrameDocument.js +317 -0
  84. package/dist/features/canvas/canvasFrameMode.js +53 -0
  85. package/dist/features/canvas/canvasInsertionSeams.js +44 -0
  86. package/dist/features/canvas/canvasItems.js +120 -0
  87. package/dist/features/canvas/canvasOverlayGeometry.js +240 -0
  88. package/dist/features/canvas/canvasPages.js +79 -0
  89. package/dist/features/canvas/canvasScreenSpace.js +26 -0
  90. package/dist/features/canvas/canvasSelection.js +18 -0
  91. package/dist/features/canvas/canvasStore.js +149 -0
  92. package/dist/features/canvas/canvasThumbnails.js +304 -0
  93. package/dist/features/canvas/canvasZoom.js +10 -0
  94. package/dist/features/canvas/sidebar/CanvasInspector.js +202 -0
  95. package/dist/features/canvas/sidebar/CanvasNavigator.js +226 -0
  96. package/dist/features/canvas/sidebar/CanvasSidebar.js +60 -0
  97. package/dist/features/canvas/sidebar/CanvasSidebarFrame.js +48 -0
  98. package/dist/features/canvas/sidebar/CanvasSidebarSkeleton.js +39 -0
  99. package/dist/features/canvas/sidebar/CatalogBlockInspector.js +189 -0
  100. package/dist/features/canvas/sidebar/CuratedPageInspector.js +69 -0
  101. package/dist/features/canvas/sidebar/DerivedPageInspector.js +37 -0
  102. package/dist/features/canvas/sidebar/LayoutPageBlocks.js +78 -0
  103. package/dist/features/canvas/sidebar/LayoutPageOverview.js +71 -0
  104. package/dist/features/canvas/sidebar/PageInspector.js +157 -0
  105. package/dist/features/canvas/sidebar/PageInspectorSkeleton.js +90 -0
  106. package/dist/features/canvas/sidebar/PageOverview.js +27 -0
  107. package/dist/features/canvas/sidebar/SingletonPageInspector.js +31 -0
  108. package/dist/features/canvas/useCanvasCamera.js +803 -0
  109. package/dist/features/canvas/useCanvasFrame.js +149 -0
  110. package/dist/features/canvas/useCanvasFrameInput.js +97 -0
  111. package/dist/features/canvas/useCanvasNearness.js +57 -0
  112. package/dist/features/canvas/useDiscoveredPreviewPaths.js +62 -0
  113. package/dist/features/content/CamoxContent.d.ts +2 -5
  114. package/dist/features/content/CamoxContent.js +174 -271
  115. package/dist/features/content/CollectionItemSheetContext.js +106 -0
  116. package/dist/features/content/ContentAssets.js +315 -0
  117. package/dist/features/content/ContentCollection.js +663 -0
  118. package/dist/features/content/collection-form.js +58 -0
  119. package/dist/features/content/components/AssetCard.js +101 -69
  120. package/dist/features/content/components/AssetCardSkeleton.js +4 -8
  121. package/dist/features/content/components/ContentSidebar.js +129 -18
  122. package/dist/features/content/components/ContentSidebarGroup.js +37 -0
  123. package/dist/features/content/components/DeleteCollectionItemButton.js +202 -0
  124. package/dist/features/content/components/MissingFromLocale.js +282 -0
  125. package/dist/features/content/components/UploadDropZone.js +27 -31
  126. package/dist/features/content/components/UploadProgressDrawer.js +90 -98
  127. package/dist/features/navigation/navigation.d.ts +66 -20
  128. package/dist/features/navigation/navigation.js +257 -90
  129. package/dist/features/og/defaultFonts.js +8 -8
  130. package/dist/features/og/geist-variable-ttf-base64.js +1 -1
  131. package/dist/features/og/imageResponse.d.ts +8 -0
  132. package/dist/features/og/imageResponse.js +26 -0
  133. package/dist/features/page/CuratedPageContent.js +167 -0
  134. package/dist/features/page/DerivedPageContent.js +26 -30
  135. package/dist/features/page/SharedLayoutContent.js +25 -27
  136. package/dist/features/preview/CamoxPreview.d.ts +23 -61
  137. package/dist/features/preview/CamoxPreview.js +811 -507
  138. package/dist/features/preview/EditablePageContent.js +1 -1
  139. package/dist/features/preview/EditablePageExperience.js +16 -22
  140. package/dist/features/preview/components/AddBlockDialog.js +270 -0
  141. package/dist/features/preview/components/AssetFieldEditor.js +173 -154
  142. package/dist/features/preview/components/AssetLightbox.js +194 -136
  143. package/dist/features/preview/components/AssetPickerModal.js +153 -170
  144. package/dist/features/preview/components/BlockActionsPopover.js +150 -149
  145. package/dist/features/preview/components/BlockErrorBoundary.js +8 -12
  146. package/dist/features/preview/components/BlockThumbnail.js +176 -100
  147. package/dist/features/preview/components/CanvasPreview.js +243 -0
  148. package/dist/features/preview/components/CreatePageModal.js +128 -137
  149. package/dist/features/preview/components/DebouncedFieldEditor.js +29 -33
  150. package/dist/features/preview/components/DerivedLayoutDialog.js +46 -29
  151. package/dist/features/preview/components/DrillRow.js +150 -0
  152. package/dist/features/preview/components/FieldOverlayStyles.js +33 -10
  153. package/dist/features/preview/components/FieldToolbar.js +166 -116
  154. package/dist/features/preview/components/Frame.js +108 -20
  155. package/dist/features/preview/components/IconFieldEditor.js +227 -0
  156. package/dist/features/preview/components/ItemFieldsEditor.js +238 -205
  157. package/dist/features/preview/components/LinkFieldEditor.js +135 -139
  158. package/dist/features/preview/components/Metadata.js +22 -30
  159. package/dist/features/preview/components/MobilePreviewDrawer.js +89 -108
  160. package/dist/features/preview/components/MultipleAssetFieldEditor.js +334 -246
  161. package/dist/features/preview/components/OverlayTracker.js +10 -42
  162. package/dist/features/preview/components/Overlays.js +81 -69
  163. package/dist/features/preview/components/PageInfo.js +1748 -0
  164. package/dist/features/preview/components/PageInfoSkeleton.js +51 -0
  165. package/dist/features/preview/components/PageLocationFieldset.js +112 -116
  166. package/dist/features/preview/components/PageNavigatorHeader.js +24 -0
  167. package/dist/features/preview/components/PageNicknameField.js +22 -26
  168. package/dist/features/preview/components/PagePicker.js +145 -147
  169. package/dist/features/preview/components/PageTree.js +525 -532
  170. package/dist/features/preview/components/PreviewActivation.js +28 -32
  171. package/dist/features/preview/components/PreviewPanel.js +620 -319
  172. package/dist/features/preview/components/PreviewToolbar.js +111 -340
  173. package/dist/features/preview/components/RecordCard.js +80 -0
  174. package/dist/features/preview/components/RecordCombobox.js +178 -0
  175. package/dist/features/preview/components/ReferenceFieldEditor.js +149 -0
  176. package/dist/features/preview/components/ReferenceListFieldEditor.js +432 -0
  177. package/dist/features/preview/components/RemovedBlockPlaceholder.js +95 -0
  178. package/dist/features/preview/components/RepeatableItemsList.js +125 -138
  179. package/dist/features/preview/components/SelectionEditor.js +993 -0
  180. package/dist/features/preview/components/ShikiMarkdown.js +14 -18
  181. package/dist/features/preview/components/SidebarSection.js +52 -64
  182. package/dist/features/preview/components/StudioEditingFallback.js +56 -0
  183. package/dist/features/preview/components/UnlinkAssetButton.js +104 -107
  184. package/dist/features/preview/components/blockGridNavigation.js +15 -0
  185. package/dist/features/preview/components/contentFieldSchema.js +8 -0
  186. package/dist/features/preview/components/useFieldWriter.js +200 -0
  187. package/dist/features/preview/components/useRecordView.js +383 -0
  188. package/dist/features/preview/components/useRepeatableItemActions.js +35 -37
  189. package/dist/features/preview/components/useUpdateBlockPosition.js +37 -37
  190. package/dist/features/preview/editingFrame.js +197 -0
  191. package/dist/features/preview/overlayHighlights.js +27 -0
  192. package/dist/features/preview/overlayMessages.js +72 -1
  193. package/dist/features/preview/pageRecord.js +189 -0
  194. package/dist/features/preview/previewConstants.js +6 -2
  195. package/dist/features/preview/previewPageFrame.js +95 -0
  196. package/dist/features/preview/previewPreparation.js +7 -0
  197. package/dist/features/preview/previewSelection.js +33 -59
  198. package/dist/features/preview/previewStore.js +225 -123
  199. package/dist/features/preview/referencePickerFocus.js +29 -0
  200. package/dist/features/preview/repeatableItemTargets.js +56 -0
  201. package/dist/features/preview/selectionReveal.js +21 -0
  202. package/dist/features/preview/usePreviewViewportActions.js +114 -0
  203. package/dist/features/preview/viewportContinuity.js +109 -0
  204. package/dist/features/provider/AuthenticatedCamoxProvider.js +69 -44
  205. package/dist/features/provider/CamoxProvider.d.ts +3 -6
  206. package/dist/features/provider/CamoxProvider.js +38 -50
  207. package/dist/features/provider/CoreCamoxProvider.js +71 -23
  208. package/dist/features/provider/LocalhostPreviewProvider.js +73 -73
  209. package/dist/features/provider/PreviewSignInPage.js +54 -0
  210. package/dist/features/provider/components/CamoxAppContext.js +11 -11
  211. package/dist/features/provider/components/CommandPalette.js +87 -143
  212. package/dist/features/provider/useAdminShortcuts.js +7 -11
  213. package/dist/features/routes/pageRuntime.d.ts +44 -4
  214. package/dist/features/routes/pageRuntime.js +244 -137
  215. package/dist/features/runtime/RuntimeChrome.js +117 -115
  216. package/dist/features/runtime/alternates.js +64 -0
  217. package/dist/features/runtime/analytics.d.ts +7 -0
  218. package/dist/features/runtime/analytics.js +66 -0
  219. package/dist/features/runtime/artifactSources.js +87 -0
  220. package/dist/features/runtime/editingFallback.js +20 -0
  221. package/dist/features/runtime/linkPrefetch.js +97 -0
  222. package/dist/features/runtime/livePages.js +62 -0
  223. package/dist/features/runtime/llmsTxt.js +40 -0
  224. package/dist/features/runtime/loopbackFetch.js +18 -0
  225. package/dist/features/runtime/navigationAccessibility.js +51 -0
  226. package/dist/features/runtime/navigationTarget.js +23 -2
  227. package/dist/features/runtime/pageApp.js +216 -141
  228. package/dist/features/runtime/pageBlockTypes.js +20 -0
  229. package/dist/features/runtime/pageClient.d.ts +2 -4
  230. package/dist/features/runtime/pageClient.js +18 -3
  231. package/dist/features/runtime/pageNavigation.js +254 -32
  232. package/dist/features/runtime/pageServer.d.ts +2 -4
  233. package/dist/features/runtime/pageServer.js +8 -1
  234. package/dist/features/runtime/pageViewport.js +7 -0
  235. package/dist/features/runtime/runtime.d.ts +60 -23
  236. package/dist/features/runtime/runtime.js +779 -166
  237. package/dist/features/runtime/runtimeChromeLoader.js +58 -0
  238. package/dist/features/runtime/runtimeRoutes.d.ts +19 -0
  239. package/dist/features/runtime/runtimeRoutes.js +25 -0
  240. package/dist/features/runtime/scrollRestoration.js +133 -0
  241. package/dist/features/runtime/studioApp.d.ts +4 -3
  242. package/dist/features/runtime/studioApp.js +5 -9
  243. package/dist/features/runtime/studioClient.d.ts +2 -4
  244. package/dist/features/runtime/studioClient.js +12 -3
  245. package/dist/features/runtime/studioServer.d.ts +2 -4
  246. package/dist/features/runtime/studioServer.js +6 -1
  247. package/dist/features/runtime/worker.d.ts +6 -0
  248. package/dist/features/runtime/worker.js +23 -0
  249. package/dist/features/runtime/workerRequest.js +44 -0
  250. package/dist/features/studio/CamoxStudio.d.ts +2 -6
  251. package/dist/features/studio/CamoxStudio.js +34 -49
  252. package/dist/features/studio/FollowAgentProvider.js +338 -0
  253. package/dist/features/studio/components/ChatSidebar.js +356 -0
  254. package/dist/features/studio/components/DraftsControl.js +676 -0
  255. package/dist/features/studio/components/FaviconDialog.js +318 -0
  256. package/dist/features/studio/components/LocalePicker.js +785 -0
  257. package/dist/features/studio/components/Navbar.js +123 -103
  258. package/dist/features/studio/components/ProjectMenu.js +239 -260
  259. package/dist/features/studio/components/RenameDraftDialog.js +206 -0
  260. package/dist/features/studio/components/ReviewDraftSheet.js +1472 -0
  261. package/dist/features/studio/components/ThreadComposer.js +157 -0
  262. package/dist/features/studio/components/ThreadMarkdown.js +113 -0
  263. package/dist/features/studio/components/ThreadMessages.js +270 -0
  264. package/dist/features/studio/components/UserButton.js +34 -23
  265. package/dist/features/studio/draftLabel.js +33 -0
  266. package/dist/features/studio/draftNotice.js +13 -0
  267. package/dist/features/studio/followAgent.js +250 -0
  268. package/dist/features/studio/followAgentContext.js +7 -0
  269. package/dist/features/studio/localeOptions.js +118 -0
  270. package/dist/features/studio/localeSwitch.js +19 -0
  271. package/dist/features/studio/routes.js +48 -1
  272. package/dist/features/studio/studioStore.js +64 -1
  273. package/dist/features/studio/useTheme.js +24 -27
  274. package/dist/features/vite/artifactRuntimeMinification.js +36 -0
  275. package/dist/features/vite/auth.js +1 -50
  276. package/dist/features/vite/blockBoilerplate.js +6 -5
  277. package/dist/features/vite/blockChunks.js +31 -0
  278. package/dist/features/vite/bundlerLogs.js +17 -0
  279. package/dist/features/vite/definitionsSync.js +158 -226
  280. package/dist/features/vite/devAuthentication.js +4 -16
  281. package/dist/features/vite/devSignIn.js +87 -0
  282. package/dist/features/vite/iconGeneration.js +16 -0
  283. package/dist/features/vite/layoutGeneration.js +11 -1
  284. package/dist/features/vite/publishSeededContent.js +30 -0
  285. package/dist/features/vite/routeGeneration.js +6 -7
  286. package/dist/features/vite/runtimeDev.js +80 -99
  287. package/dist/features/vite/vite.d.ts +53 -31
  288. package/dist/features/vite/vite.js +230 -116
  289. package/dist/features/vite/workerBuild.js +39 -0
  290. package/dist/hooks/use-debounced-field.js +116 -47
  291. package/dist/hooks/use-file-upload.js +114 -67
  292. package/dist/hooks/use-marquee-selection.js +32 -36
  293. package/dist/hooks/use-page-destinations.js +69 -37
  294. package/dist/lib/api-client-server.d.ts +5 -0
  295. package/dist/lib/api-client-server.js +10 -4
  296. package/dist/lib/api-client.d.ts +6 -0
  297. package/dist/lib/api-client.js +51 -16
  298. package/dist/lib/api-socket.js +17 -0
  299. package/dist/lib/auth-page-styles.js +39 -0
  300. package/dist/lib/auth.js +139 -60
  301. package/dist/lib/collection-cache.js +23 -0
  302. package/dist/lib/draft-scope.d.ts +4 -0
  303. package/dist/lib/draft-scope.js +222 -0
  304. package/dist/lib/html.js +12 -0
  305. package/dist/lib/link-pages.js +154 -0
  306. package/dist/lib/locale-path.d.ts +22 -0
  307. package/dist/lib/locale-path.js +57 -0
  308. package/dist/lib/normalized-data.js +252 -152
  309. package/dist/lib/preview-handoff.js +13 -0
  310. package/dist/lib/queries.d.ts +11 -0
  311. package/dist/lib/queries.js +71 -131
  312. package/dist/lib/studio-reads.d.ts +14 -0
  313. package/dist/lib/studio-reads.js +574 -0
  314. package/dist/lib/use-project-room.js +50 -47
  315. package/dist/lib/use-thread.js +310 -0
  316. package/dist/lib/utils.js +25 -29
  317. package/dist/lib/view-locale-context.js +22 -0
  318. package/dist/lib/view-locale.js +46 -0
  319. package/dist/package.js +5 -0
  320. package/dist/studio-overlays.css +41 -147
  321. package/dist/studio.css +2 -2
  322. package/package.json +70 -72
  323. package/skills/camox/SKILL.md +16 -5
  324. package/skills/camox/references/artifacts.md +179 -0
  325. package/skills/camox/references/block-definitions.md +98 -55
  326. package/skills/camox/references/cli-common.md +18 -6
  327. package/skills/camox/references/cli-content.md +92 -58
  328. package/skills/camox/references/cli-publishing.md +26 -0
  329. package/skills/camox/references/dom-integrations.md +27 -0
  330. package/skills/camox/references/field-styling.md +7 -7
  331. package/skills/camox/references/layout-definitions.md +16 -14
  332. package/skills/camox/references/localization.md +56 -0
  333. package/skills/camox/references/routed-layouts.md +133 -15
  334. package/skills/camox-expand/SKILL.md +69 -0
  335. package/skills/camox-expand/references/jobs.md +39 -0
  336. package/skills/camoxify/SKILL.md +38 -2
  337. package/dist/core/components/AddBlockControlBar.js +0 -78
  338. package/dist/core/hooks/useRequireDraftSource.js +0 -23
  339. package/dist/features/metadata/sitemap.d.ts +0 -8
  340. package/dist/features/metadata/sitemap.js +0 -17
  341. package/dist/features/og/imageResponse.node.d.ts +0 -12
  342. package/dist/features/og/imageResponse.node.js +0 -49
  343. package/dist/features/og/imageResponse.workerd.d.ts +0 -12
  344. package/dist/features/og/imageResponse.workerd.js +0 -40
  345. package/dist/features/page/PublishedPageContent.js +0 -205
  346. package/dist/features/page/PublishedPageExperience.js +0 -23
  347. package/dist/features/preview/DerivedPreview.js +0 -134
  348. package/dist/features/preview/commentsEnabled.js +0 -8
  349. package/dist/features/preview/components/AddBlockSidebar.js +0 -381
  350. package/dist/features/preview/components/AttachedComments.js +0 -194
  351. package/dist/features/preview/components/CommentHeader.js +0 -122
  352. package/dist/features/preview/components/CommentSidebar.js +0 -29
  353. package/dist/features/preview/components/CommentTargetQuote.js +0 -166
  354. package/dist/features/preview/components/DerivedLayoutSidebar.d.ts +0 -5
  355. package/dist/features/preview/components/DerivedLayoutSidebar.js +0 -179
  356. package/dist/features/preview/components/DerivedPageInfoSidebar.js +0 -69
  357. package/dist/features/preview/components/LeftSidebar.js +0 -68
  358. package/dist/features/preview/components/PageEditorSidebar.js +0 -563
  359. package/dist/features/preview/components/PageInfoSidebar.js +0 -1551
  360. package/dist/features/preview/components/PageNavigatorSidebar.js +0 -78
  361. package/dist/features/preview/components/PageStatusBadge.js +0 -97
  362. package/dist/features/preview/components/PeekedBlock.js +0 -217
  363. package/dist/features/preview/components/PreviewComments.js +0 -56
  364. package/dist/features/preview/components/PreviewToolbarSpacer.js +0 -43
  365. package/dist/features/preview/components/PublicationRow.js +0 -422
  366. package/dist/features/preview/components/PublishDialog.js +0 -194
  367. package/dist/features/preview/components/RightSidebar.js +0 -59
  368. package/dist/features/preview/previewCommentsStore.js +0 -115
  369. package/dist/features/preview/publication.js +0 -81
  370. package/dist/features/runtime/SharedChromeContext.js +0 -7
  371. package/dist/features/studio/components/EnvironmentMenu.js +0 -413
  372. package/dist/features/vite/appGeneration.js +0 -89
  373. package/dist/lib/view-queries.js +0 -28
  374. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/Matches.d.ts +0 -114
  375. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/RouterProvider.d.ts +0 -25
  376. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/config.d.ts +0 -1
  377. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/defer.d.ts +0 -1
  378. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/fileRoute.d.ts +0 -20
  379. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/global.d.ts +0 -8
  380. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/hash-scroll.d.ts +0 -1
  381. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/index.d.ts +0 -18
  382. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/link.d.ts +0 -161
  383. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/load-matches.d.ts +0 -6
  384. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/location.d.ts +0 -54
  385. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/lru-cache.d.ts +0 -8
  386. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/manifest.d.ts +0 -32
  387. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/new-process-route-tree.d.ts +0 -115
  388. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/not-found.d.ts +0 -1
  389. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/redirect.d.ts +0 -49
  390. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/rewrite.d.ts +0 -1
  391. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/root.d.ts +0 -6
  392. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/route.d.ts +0 -343
  393. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/routeInfo.d.ts +0 -48
  394. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/router.d.ts +0 -695
  395. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/scroll-restoration.d.ts +0 -1
  396. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/searchMiddleware.d.ts +0 -1
  397. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/searchParams.d.ts +0 -5
  398. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/RawStream.d.ts +0 -38
  399. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/seroval-plugins.d.ts +0 -1
  400. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/transformer.d.ts +0 -65
  401. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/stores.d.ts +0 -69
  402. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/structuralSharing.d.ts +0 -1
  403. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/typePrimitives.d.ts +0 -1
  404. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useLoaderData.d.ts +0 -1
  405. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useLoaderDeps.d.ts +0 -1
  406. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useNavigate.d.ts +0 -10
  407. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useParams.d.ts +0 -1
  408. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useRouteContext.d.ts +0 -1
  409. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useSearch.d.ts +0 -1
  410. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/utils.d.ts +0 -28
  411. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/validators.d.ts +0 -49
  412. package/skills/camox/references/cli-environments.md +0 -37
@@ -1,7 +1,16 @@
1
+ import { attachArtifactData } from "./artifactData.js";
2
+ import { referenceQueryProblem } from "@camox/api-contract";
1
3
  import { Type } from "@sinclair/typebox";
4
+ import { uuidv7JsonSchema } from "@camox/api-contract/ids";
2
5
 
3
6
  //#region src/core/lib/contentType.ts
7
+ /** A collection's content field named `key`, if it has one. */
8
+ function collectionField(collection, key) {
9
+ const properties = collection?._internal.contentSchema.properties;
10
+ return properties && Object.hasOwn(properties, key) ? properties[key] : void 0;
11
+ }
4
12
  var FieldToken = class {
13
+ fieldName;
5
14
  constructor(fieldName) {
6
15
  this.fieldName = fieldName;
7
16
  }
@@ -15,6 +24,10 @@ var FieldToken = class {
15
24
  * server-side resolver knows whether to read from `settings` or `itemSettings`.
16
25
  */
17
26
  var Conditional = class {
27
+ scope;
28
+ settingName;
29
+ enumValue;
30
+ children;
18
31
  constructor(scope, settingName, enumValue, children) {
19
32
  this.scope = scope;
20
33
  this.settingName = settingName;
@@ -30,10 +43,13 @@ var Conditional = class {
30
43
  return "{{/if}}";
31
44
  }
32
45
  };
33
- function createContentProxy() {
46
+ function createContentProxy(shape, prefix = "") {
34
47
  return new Proxy({}, { get(_target, prop) {
35
48
  if (typeof prop !== "string") return void 0;
36
- return new FieldToken(prop);
49
+ const path = prefix ? `${prefix}.${prop}` : prop;
50
+ const field = shape?.[prop];
51
+ if (field?.fieldType === "Reference") return createContentProxy(field.referenceSchema.properties, path);
52
+ return new FieldToken(path);
37
53
  } });
38
54
  }
39
55
  function createSettingsProxy(settingsShape, scope) {
@@ -52,13 +68,22 @@ function serializeConditional(cond) {
52
68
  else out.push(`${cond.openTag}${String(child)}${cond.closeTag}`);
53
69
  return out;
54
70
  }
55
- function resolveToMarkdown(builder, settingsShape, scope) {
56
- const entries = builder(createContentProxy(), createSettingsProxy(settingsShape, scope));
71
+ function resolveToMarkdown(builder, settingsShape, scope, contentShape) {
72
+ const entries = builder(createContentProxy(contentShape), createSettingsProxy(settingsShape, scope));
57
73
  const out = [];
58
74
  for (const entry of entries) if (entry instanceof Conditional) out.push(...serializeConditional(entry));
59
75
  else out.push(entry instanceof FieldToken ? entry.toString() : String(entry));
60
76
  return out;
61
77
  }
78
+ /** The longest artifact source content writes accept (256 KB). */
79
+ const ARTIFACT_MAX_LENGTH = 262144;
80
+ const IMAGE_PLACEHOLDER = Symbol("camox.imagePlaceholder");
81
+ function isImagePlaceholder(value) {
82
+ return typeof Reflect.get(value, IMAGE_PLACEHOLDER) === "string" && !value._fileId;
83
+ }
84
+ function getImagePlaceholderTitle(value) {
85
+ return Reflect.get(value, IMAGE_PLACEHOLDER);
86
+ }
62
87
  function _imageSingle(options) {
63
88
  return Type.Unsafe({
64
89
  type: "object",
@@ -69,11 +94,13 @@ function _imageSingle(options) {
69
94
  mimeType: { type: "string" }
70
95
  },
71
96
  accept: ["image/*"],
97
+ required: options.required ?? false,
72
98
  default: {
73
99
  url: `https://placehold.co/1200x800/f4f4f5/a1a1aa.png?text=${options?.title || "image"}`,
74
100
  alt: "",
75
101
  filename: "placeholder.png",
76
- mimeType: "image/png"
102
+ mimeType: "image/png",
103
+ [IMAGE_PLACEHOLDER]: options.title || "image"
77
104
  },
78
105
  title: options.title,
79
106
  fieldType: "Image"
@@ -99,6 +126,7 @@ function _fileSingle(options) {
99
126
  mimeType: { type: "string" }
100
127
  },
101
128
  accept: options.accept,
129
+ required: options.required ?? false,
102
130
  default: {
103
131
  url: "https://placehold.co/file-placeholder",
104
132
  alt: "",
@@ -123,186 +151,197 @@ function _fileList(options) {
123
151
  });
124
152
  }
125
153
  /**
126
- * Type builders for createBlock content schemas.
127
- * All fields must have default values.
154
+ * Checks a query against its collection, for callers that bypass the types (computed limits
155
+ * included); definition sync applies the same rules.
128
156
  */
129
- const Type$1 = {
130
- /**
131
- * Creates a string field with a required default value.
132
- *
133
- * @example
134
- * Type.String({ default: 'Hello' })
135
- * Type.String({ default: 'Hello', maxLength: 100, title: 'Title' })
136
- */
137
- String: (options) => {
157
+ function validateQuery(query, collection) {
158
+ const problem = referenceQueryProblem(query, (key) => collectionField(collection, key)?.fieldType);
159
+ if (problem) throw new Error(`Query on "${collection._internal.id}": ${problem}`);
160
+ return query;
161
+ }
162
+ const settingKinds = /* @__PURE__ */ new Set(["Enum", "Boolean"]);
163
+ /** Builders are typed per context; this guards callers that bypass the types. */
164
+ function assertFieldKinds(shape, context, owner) {
165
+ for (const [key, field] of Object.entries(shape)) {
166
+ const isSetting = settingKinds.has(field.fieldType);
167
+ if (context === "settings" && !isSetting) throw new Error(`${owner} setting "${key}" must be an enum or a boolean`);
168
+ if (context === "content" && isSetting) throw new Error(`${owner} field "${key}": ${field.fieldType} is a setting, not content`);
169
+ }
170
+ }
171
+ function collectSchemaDefaults(properties) {
172
+ const defaults = {};
173
+ for (const [key, prop] of Object.entries(properties)) if ("default" in prop) defaults[key] = prop.default;
174
+ return defaults;
175
+ }
176
+ const enumSetting = (options) => Type.Unsafe({
177
+ type: "string",
178
+ enum: Object.keys(options.options),
179
+ default: options.default,
180
+ title: options.title,
181
+ enumLabels: options.options,
182
+ fieldType: "Enum"
183
+ });
184
+ const booleanSetting = (options) => Type.Boolean({
185
+ default: options.default,
186
+ title: options.title,
187
+ fieldType: "Boolean"
188
+ });
189
+ const settingBuilder = {
190
+ enum: enumSetting,
191
+ boolean: booleanSetting
192
+ };
193
+ const contentFieldBuilder = {
194
+ string: (options) => Type.Unsafe({
195
+ type: "string",
196
+ ...options,
197
+ fieldType: "String"
198
+ }),
199
+ link: (options) => Type.Unsafe({
200
+ type: "object",
201
+ properties: {
202
+ type: {
203
+ type: "string",
204
+ enum: ["external", "page"]
205
+ },
206
+ text: { type: "string" },
207
+ href: { type: "string" },
208
+ pageId: { anyOf: [{ const: "" }, uuidv7JsonSchema] },
209
+ newTab: { type: "boolean" }
210
+ },
211
+ default: {
212
+ ...options.default,
213
+ type: "external"
214
+ },
215
+ title: options.title,
216
+ fieldType: "Link"
217
+ }),
218
+ image: (options = {}) => _imageSingle(options),
219
+ imageList: (options = {}) => _imageList(options),
220
+ file: (options) => _fileSingle(options),
221
+ fileList: (options) => _fileList(options),
222
+ embed: (options) => {
223
+ if (!new RegExp(options.pattern).test(options.default)) throw new Error(`Embed default value "${options.default}" does not match pattern "${options.pattern}"`);
138
224
  return Type.Unsafe({
139
225
  type: "string",
140
- ...options,
226
+ pattern: options.pattern,
141
227
  default: options.default,
142
- fieldType: "String"
228
+ title: options.title,
229
+ fieldType: "Embed"
143
230
  });
144
231
  },
145
- /**
146
- * Creates a repeatable array of object items.
147
- * The default array is auto-generated based on minItems.
148
- *
149
- * Items may also declare per-item `settings` (Enum/Boolean only) — not
150
- * inline-editable; they appear in the sidebar when the item is selected,
151
- * similar to block-level settings.
152
- *
153
- * @example
154
- * Type.Repeater({
155
- * content: {
156
- * title: Type.String({ default: 'Item' }),
157
- * description: Type.String({ default: 'Description' }),
158
- * },
159
- * settings: {
160
- * highlighted: Type.Boolean({ default: false, title: 'Highlighted' }),
161
- * },
162
- * minItems: 1,
163
- * maxItems: 10,
164
- * title: 'Items',
165
- * toMarkdown: (c) => [`### ${c.title}`, c.description],
166
- * })
167
- */
168
- Repeater: (options) => {
232
+ artifact: (options) => Type.Unsafe({
233
+ type: "string",
234
+ maxLength: ARTIFACT_MAX_LENGTH,
235
+ size: options.size,
236
+ ...options.data?.length ? { data: [...options.data] } : {},
237
+ default: options.default ?? "",
238
+ title: options.title,
239
+ fieldType: "Artifact"
240
+ }),
241
+ icon: (options) => {
242
+ const ids = typeof __CAMOX_ICON_IDS__ === "undefined" ? [] : __CAMOX_ICON_IDS__;
243
+ if (!ids.includes(options.default)) throw new Error(`Invalid icon default "${String(options.default)}". Configure icons in camox() first.`);
244
+ return Type.Unsafe({
245
+ type: "string",
246
+ fieldType: "Icon",
247
+ enum: [...ids],
248
+ default: options.default,
249
+ title: options.title
250
+ });
251
+ },
252
+ reference: (collection, options = {}) => Type.Unsafe({
253
+ anyOf: [{
254
+ type: "string",
255
+ format: "uuid"
256
+ }, { type: "null" }],
257
+ fieldType: "Reference",
258
+ collectionId: collection._internal.id,
259
+ required: options.required ?? false,
260
+ title: options.title ?? collection._internal.title,
261
+ default: null,
262
+ referenceSchema: collection._internal.contentSchema,
263
+ labelField: collection._internal.label
264
+ }),
265
+ referenceList: (collection, options = {}) => Type.Unsafe({
266
+ type: "array",
267
+ items: {
268
+ type: "string",
269
+ format: "uuid"
270
+ },
271
+ fieldType: "ReferenceList",
272
+ collectionId: collection._internal.id,
273
+ title: options.title ?? collection._internal.title,
274
+ ...options.description === void 0 ? {} : { description: options.description },
275
+ ...options.maxItems === void 0 ? {} : { maxItems: options.maxItems },
276
+ ...options.query === void 0 ? { default: [] } : { query: validateQuery(options.query, collection) },
277
+ ...options.toMarkdown === void 0 ? {} : { toMarkdown: resolveToMarkdown(options.toMarkdown, void 0, "item", collection._internal.contentSchema.properties) },
278
+ referenceSchema: collection._internal.contentSchema,
279
+ labelField: collection._internal.label
280
+ }),
281
+ repeater: (options) => {
169
282
  if (options.minItems < 1) throw new Error("Repeater requires minItems to be at least 1");
170
- const objectSchema = Type.Object(options.content);
171
- const defaultItem = {};
172
- for (const [key, prop] of Object.entries(objectSchema.properties)) if ("default" in prop) defaultItem[key] = prop.default;
283
+ const content = options.content(contentFieldBuilder);
284
+ const settings = options.settings?.(settingBuilder);
285
+ const owner = `Repeater${options.title ? ` "${options.title}"` : ""}`;
286
+ assertFieldKinds(content, "content", owner);
287
+ if (settings) assertFieldKinds(settings, "settings", owner);
288
+ attachArtifactData(content, settings, owner);
289
+ const objectSchema = Type.Object(content);
290
+ const defaultItem = collectSchemaDefaults(objectSchema.properties);
173
291
  const defaultArray = Array(options.minItems).fill(null).map(() => ({ ...defaultItem }));
174
- const settingsTypeboxSchema = options.settings ? Type.Object(options.settings) : null;
175
- const itemSettingsSchema = settingsTypeboxSchema ? {
292
+ const settingsObjectSchema = settings ? Type.Object(settings) : null;
293
+ const itemSettingsSchema = settingsObjectSchema ? {
176
294
  type: "object",
177
- properties: settingsTypeboxSchema.properties,
178
- required: Object.keys(options.settings)
295
+ properties: settingsObjectSchema.properties,
296
+ required: Object.keys(settingsObjectSchema.properties)
179
297
  } : void 0;
180
- const defaultItemSettings = {};
181
- if (settingsTypeboxSchema) {
182
- for (const [key, prop] of Object.entries(settingsTypeboxSchema.properties)) if ("default" in prop) defaultItemSettings[key] = prop.default;
183
- }
184
298
  return Type.Array(objectSchema, {
185
299
  minItems: options.minItems,
186
- maxItems: options.maxItems,
300
+ ...Number.isFinite(options.maxItems) ? { maxItems: options.maxItems } : {},
187
301
  default: defaultArray,
188
302
  title: options.title,
189
303
  fieldType: "Repeater",
190
- toMarkdown: resolveToMarkdown(options.toMarkdown, options.settings, "item"),
304
+ toMarkdown: resolveToMarkdown(options.toMarkdown, settings, "item", content),
191
305
  itemSettingsSchema,
192
- defaultItemSettings: settingsTypeboxSchema ? defaultItemSettings : void 0
306
+ defaultItemSettings: settingsObjectSchema ? collectSchemaDefaults(settingsObjectSchema.properties) : void 0
193
307
  });
194
- },
195
- /**
196
- * Creates an enum field with a set of predefined options.
197
- *
198
- * @example
199
- * Type.Enum({
200
- * default: 'left',
201
- * options: { left: 'Left', center: 'Center', right: 'Right' },
202
- * title: 'Alignment'
203
- * })
204
- */
205
- Enum: (options) => {
206
- const enumValues = Object.keys(options.options);
207
- return Type.Unsafe({
208
- type: "string",
209
- enum: enumValues,
210
- default: options.default,
211
- title: options.title,
212
- enumLabels: options.options,
213
- fieldType: "Enum"
214
- });
215
- },
216
- /**
217
- * Creates a boolean toggle field.
218
- *
219
- * @example
220
- * Type.Boolean({ default: false, title: 'Show background' })
221
- */
222
- Boolean: (options) => {
223
- return Type.Boolean({
224
- default: options.default,
225
- title: options.title,
226
- fieldType: "Boolean"
227
- });
228
- },
229
- /**
230
- * Creates an embed field for URLs matching a specific pattern.
231
- *
232
- * @example
233
- * Type.Embed({
234
- * pattern: 'https:\\/\\/(www\\.)?youtube\\.com\\/watch\\?v=.+',
235
- * default: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
236
- * title: 'YouTube URL'
237
- * })
238
- */
239
- Embed: (options) => {
240
- if (!new RegExp(options.pattern).test(options.default)) throw new Error(`Embed default value "${options.default}" does not match pattern "${options.pattern}"`);
241
- return Type.Unsafe({
242
- type: "string",
243
- pattern: options.pattern,
244
- default: options.default,
245
- title: options.title,
246
- fieldType: "Embed"
247
- });
248
- },
249
- /**
250
- * Creates a link field with text, href/pageId, and newTab properties.
251
- * Supports both external URLs and internal page links.
252
- *
253
- * @example
254
- * Type.Link({ default: { text: 'Learn more', href: '/', newTab: false }, title: 'CTA' })
255
- */
256
- Link: (options) => {
257
- return Type.Unsafe({
258
- type: "object",
259
- properties: {
260
- type: {
261
- type: "string",
262
- enum: ["external", "page"]
263
- },
264
- text: { type: "string" },
265
- href: { type: "string" },
266
- pageId: { type: "string" },
267
- newTab: { type: "boolean" }
268
- },
269
- default: {
270
- ...options.default,
271
- type: "external"
272
- },
273
- title: options.title,
274
- fieldType: "Link"
275
- });
276
- },
277
- /**
278
- * Creates an image asset field.
279
- *
280
- * @example
281
- * Type.Image({ title: 'Hero' })
282
- */
283
- Image: (options = {}) => _imageSingle(options),
284
- /**
285
- * Creates a file asset field.
286
- *
287
- * @example
288
- * Type.File({ accept: ['application/pdf'], title: 'Datasheet' })
289
- */
290
- File: (options) => _fileSingle(options),
291
- /**
292
- * Creates an array of image assets.
293
- *
294
- * @example
295
- * Type.ImageList({ title: 'Gallery', defaultItems: 3 })
296
- */
297
- ImageList: (options = {}) => _imageList(options),
298
- /**
299
- * Creates an array of file assets.
300
- *
301
- * @example
302
- * Type.FileList({ accept: ['application/pdf'], title: 'Attachments' })
303
- */
304
- FileList: (options) => _fileList(options)
308
+ }
305
309
  };
310
+ const collectionFieldBuilder = {
311
+ string: (options = {}) => Type.Unsafe({
312
+ type: "string",
313
+ ...options,
314
+ fieldType: "String"
315
+ }),
316
+ enum: enumSetting,
317
+ boolean: booleanSetting,
318
+ image: (options = {}) => contentFieldBuilder.image({ title: options.title }),
319
+ imageList: contentFieldBuilder.imageList,
320
+ file: (options) => contentFieldBuilder.file({
321
+ accept: options.accept,
322
+ title: options.title
323
+ }),
324
+ fileList: contentFieldBuilder.fileList,
325
+ embed: contentFieldBuilder.embed,
326
+ reference: (collection, options = {}) => contentFieldBuilder.reference(collection, { title: options.title }),
327
+ referenceList: (collection, options = {}) => {
328
+ if ("query" in options) throw new Error("Collections cannot hold query-backed reference lists");
329
+ return contentFieldBuilder.referenceList(collection, options);
330
+ }
331
+ };
332
+ /** Runs a block's builders so the rest of its definition works with plain schemas. */
333
+ function resolveBlockFields(options) {
334
+ const content = options.content(contentFieldBuilder);
335
+ const settings = options.settings?.(settingBuilder);
336
+ const owner = `Block "${options.id}"`;
337
+ assertFieldKinds(content, "content", owner);
338
+ if (settings) assertFieldKinds(settings, "settings", owner);
339
+ attachArtifactData(content, settings, owner);
340
+ return {
341
+ content,
342
+ settings
343
+ };
344
+ }
306
345
 
307
346
  //#endregion
308
- export { Type$1 as Type, resolveToMarkdown };
347
+ export { ARTIFACT_MAX_LENGTH, Conditional, FieldToken, assertFieldKinds, collectionField, collectionFieldBuilder, contentFieldBuilder, getImagePlaceholderTitle, isImagePlaceholder, resolveBlockFields, resolveToMarkdown, settingBuilder };
@@ -1,10 +1,14 @@
1
1
  //#region src/core/lib/fieldTypes.tsx
2
2
  const fieldTypesDictionary = {
3
+ Reference: { hasOwnView: true },
4
+ ReferenceList: { hasOwnView: true },
5
+ Icon: { hasOwnView: true },
3
6
  String: { hasOwnView: true },
4
7
  Repeater: { hasOwnView: true },
5
8
  Enum: { hasOwnView: true },
6
9
  Boolean: { hasOwnView: true },
7
10
  Embed: { hasOwnView: true },
11
+ Artifact: { hasOwnView: true },
8
12
  Link: { hasOwnView: true },
9
13
  Image: { hasOwnView: true },
10
14
  File: { hasOwnView: true },
@@ -0,0 +1,13 @@
1
+ //#region src/core/lib/iconTypes.d.ts
2
+ declare global {
3
+ interface CamoxIconRegistry {}
4
+ }
5
+ export type IconId = CamoxIconRegistry extends {
6
+ ids: infer IDs extends string;
7
+ } ? IDs : never;
8
+ declare const iconBrand: unique symbol;
9
+ export type IconValue = string & {
10
+ readonly [iconBrand]: true;
11
+ };
12
+ //#endregion
13
+ export {};
@@ -0,0 +1,6 @@
1
+ import { SVGProps } from "react";
2
+ import "@camox/api-contract";
3
+ import { QueryClient } from "@tanstack/react-query";
4
+ //#region src/core/lib/icons.d.ts
5
+ export type IconProps = Omit<SVGProps<SVGSVGElement>, "children" | "dangerouslySetInnerHTML" | "name">;
6
+ //#endregion
@@ -0,0 +1,126 @@
1
+ import { c } from "react/compiler-runtime";
2
+ import { useId } from "react";
3
+ import { ICON_CATALOG_VERSION, scopeIconSvgIds } from "@camox/api-contract";
4
+ import { jsx } from "react/jsx-runtime";
5
+ import { useQuery } from "@tanstack/react-query";
6
+
7
+ //#region src/core/lib/icons.tsx
8
+ const iconQuery = (id) => ({
9
+ queryKey: [
10
+ "camox-icon",
11
+ ICON_CATALOG_VERSION,
12
+ id
13
+ ],
14
+ staleTime: Infinity,
15
+ queryFn: async () => {
16
+ if (!/^[a-z0-9-]+:[a-z0-9-]+$/.test(id)) throw new Error("Invalid icon ID");
17
+ const response = await fetch(`${__CAMOX_API_URL__}/icons/${ICON_CATALOG_VERSION}/${id.replace(":", "/")}`);
18
+ if (!response.ok) throw new Error(`Unable to resolve icon ${id}`);
19
+ return response.json();
20
+ }
21
+ });
22
+ function IconSvg(t0) {
23
+ const $ = c(21);
24
+ let iconId;
25
+ let props;
26
+ if ($[0] !== t0) {
27
+ ({iconId, ...props} = t0);
28
+ $[0] = t0;
29
+ $[1] = iconId;
30
+ $[2] = props;
31
+ } else {
32
+ iconId = $[1];
33
+ props = $[2];
34
+ }
35
+ let t1;
36
+ if ($[3] !== iconId) {
37
+ t1 = iconQuery(iconId);
38
+ $[3] = iconId;
39
+ $[4] = t1;
40
+ } else t1 = $[4];
41
+ const { data } = useQuery(t1);
42
+ const t2 = useId();
43
+ let t3;
44
+ if ($[5] !== t2) {
45
+ let t4;
46
+ if ($[7] === Symbol.for("react.memo_cache_sentinel")) {
47
+ t4 = /[^a-zA-Z0-9_-]/g;
48
+ $[7] = t4;
49
+ } else t4 = $[7];
50
+ t3 = t2.replace(t4, "");
51
+ $[5] = t2;
52
+ $[6] = t3;
53
+ } else t3 = $[6];
54
+ const instance = t3;
55
+ const t4 = data?.body ?? "";
56
+ const t5 = `camox-${instance}-`;
57
+ let t6;
58
+ if ($[8] !== t4 || $[9] !== t5) {
59
+ t6 = scopeIconSvgIds(t4, t5);
60
+ $[8] = t4;
61
+ $[9] = t5;
62
+ $[10] = t6;
63
+ } else t6 = $[10];
64
+ const body = t6;
65
+ const labeled = !!(props["aria-label"] || props["aria-labelledby"]);
66
+ const t7 = data?.attributes;
67
+ const t8 = labeled ? void 0 : true;
68
+ const t9 = labeled ? "img" : void 0;
69
+ const t10 = data?.attribution?.url ?? data?.attribution?.license;
70
+ const t11 = data?.attribution?.author;
71
+ let t12;
72
+ if ($[11] !== body) {
73
+ t12 = { __html: body };
74
+ $[11] = body;
75
+ $[12] = t12;
76
+ } else t12 = $[12];
77
+ let t13;
78
+ if ($[13] !== props || $[14] !== t10 || $[15] !== t11 || $[16] !== t12 || $[17] !== t7 || $[18] !== t8 || $[19] !== t9) {
79
+ t13 = /* @__PURE__ */ jsx("svg", {
80
+ ...t7,
81
+ "aria-hidden": t8,
82
+ role: t9,
83
+ focusable: "false",
84
+ "data-icon-license": t10,
85
+ "data-icon-author": t11,
86
+ ...props,
87
+ dangerouslySetInnerHTML: t12
88
+ });
89
+ $[13] = props;
90
+ $[14] = t10;
91
+ $[15] = t11;
92
+ $[16] = t12;
93
+ $[17] = t7;
94
+ $[18] = t8;
95
+ $[19] = t9;
96
+ $[20] = t13;
97
+ } else t13 = $[20];
98
+ return t13;
99
+ }
100
+ async function prefetchIcons(client, ...sources) {
101
+ const ids = /* @__PURE__ */ new Set();
102
+ const allowed = /* @__PURE__ */ new Set();
103
+ const collectSchemas = (value) => {
104
+ if (!value || typeof value !== "object") return;
105
+ const schema = value;
106
+ if (schema.fieldType === "Icon" && Array.isArray(schema.enum)) {
107
+ for (const id of schema.enum) if (typeof id === "string") allowed.add(id);
108
+ return;
109
+ }
110
+ Object.values(value).forEach(collectSchemas);
111
+ };
112
+ sources.forEach(collectSchemas);
113
+ const walk = (value) => {
114
+ if (!value || typeof value !== "object") return;
115
+ for (const [key, child] of Object.entries(value)) {
116
+ if (key === "enum") continue;
117
+ if (typeof child === "string" && allowed.has(child)) ids.add(child);
118
+ else walk(child);
119
+ }
120
+ };
121
+ sources.forEach(walk);
122
+ await Promise.all([...ids].map((id) => client.fetchQuery(iconQuery(id))));
123
+ }
124
+
125
+ //#endregion
126
+ export { IconSvg, iconQuery, prefetchIcons };