camox 0.44.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 (411) hide show
  1. package/dist/components/AuthGate.js +0 -6
  2. package/dist/components/DeviceSelector.js +96 -0
  3. package/dist/components/PlatformLabel.js +20 -24
  4. package/dist/core/components/lexical/HighlightNode.js +1 -1
  5. package/dist/core/components/lexical/InlineContentEditable.js +15 -19
  6. package/dist/core/components/lexical/InlineLexicalEditor.js +54 -74
  7. package/dist/core/components/lexical/InlineStylesPlugin.js +53 -53
  8. package/dist/core/components/lexical/MaxLengthPlugin.js +59 -0
  9. package/dist/core/components/lexical/SelectionBroadcaster.js +53 -54
  10. package/dist/core/components/lexical/SidebarLexicalEditor.js +322 -229
  11. package/dist/core/components/lexical/SummaryToggleGuard.js +42 -0
  12. package/dist/core/components/lexical/TextLinkPopover.js +169 -180
  13. package/dist/core/createApp.d.ts +241 -312
  14. package/dist/core/createApp.js +123 -29
  15. package/dist/core/createBlock.d.ts +5 -5
  16. package/dist/core/createBlock.js +385 -152
  17. package/dist/core/createCollection.d.ts +55 -0
  18. package/dist/core/createCollection.js +93 -0
  19. package/dist/core/createLayout.d.ts +197 -61
  20. package/dist/core/createLayout.js +114 -56
  21. package/dist/core/defineDocument.d.ts +3 -5
  22. package/dist/core/derivedRoutes.js +49 -1
  23. package/dist/core/dom.d.ts +13 -4
  24. package/dist/core/dom.js +44 -1
  25. package/dist/core/editing/BlockEditingRuntime.d.ts +16 -0
  26. package/dist/core/editing/BlockEditingRuntime.js +6 -15
  27. package/dist/core/editing/CompleteBlockEditingRuntime.js +28 -23
  28. package/dist/core/editing/createEditableBlock.d.ts +754 -633
  29. package/dist/core/editing/createEditableBlock.js +2113 -1066
  30. package/dist/core/editing/referenceWrites.js +51 -0
  31. package/dist/core/editing/useLatestRecord.js +90 -0
  32. package/dist/core/hooks/useArtifactHost.js +139 -0
  33. package/dist/core/hooks/useFieldSelection.js +43 -18
  34. package/dist/core/hooks/useIsEditable.js +12 -10
  35. package/dist/core/hooks/useOverlayMessage.js +15 -19
  36. package/dist/core/lib/artifact.d.ts +21 -0
  37. package/dist/core/lib/artifact.js +154 -0
  38. package/dist/core/lib/artifactColors.js +123 -0
  39. package/dist/core/lib/artifactData.d.ts +1 -0
  40. package/dist/core/lib/artifactData.js +131 -0
  41. package/dist/core/lib/artifactHost.js +205 -0
  42. package/dist/core/lib/artifactRuntime.js +36 -0
  43. package/dist/core/lib/artifactTheme.js +57 -0
  44. package/dist/core/lib/contentType.d.ts +302 -106
  45. package/dist/core/lib/contentType.js +201 -173
  46. package/dist/core/lib/fieldTypes.js +3 -0
  47. package/dist/core/lib/iconTypes.d.ts +3 -3
  48. package/dist/core/lib/icons.d.ts +4 -4
  49. package/dist/core/lib/icons.js +40 -44
  50. package/dist/core/lib/imagePlaceholder.js +177 -0
  51. package/dist/core/lib/imageTransform.js +1 -1
  52. package/dist/core/lib/lexicalReact.d.ts +3 -1
  53. package/dist/core/lib/lexicalState.js +1 -1
  54. package/dist/core/lib/previewPaused.js +9 -0
  55. package/dist/core/lib/recordScope.js +316 -0
  56. package/dist/core/lib/reference.d.ts +81 -0
  57. package/dist/core/lib/reference.js +29 -0
  58. package/dist/core/lib/textLinks.js +7 -5
  59. package/dist/core/lib/textStyles.d.ts +5 -7
  60. package/dist/core/lib/textStyles.js +2 -2
  61. package/dist/core/notFound.d.ts +7 -0
  62. package/dist/core/notFound.js +11 -0
  63. package/dist/core/pageDestinations.js +6 -3
  64. package/dist/core/recordItem.js +34 -0
  65. package/dist/core/requestContext.d.ts +26 -0
  66. package/dist/core/requestContext.js +20 -0
  67. package/dist/features/canvas/CamoxCanvas.js +1734 -0
  68. package/dist/features/canvas/CanvasBlockFrame.js +353 -0
  69. package/dist/features/canvas/CanvasBlockHeader.js +55 -0
  70. package/dist/features/canvas/CanvasLoadingScreen.js +35 -0
  71. package/dist/features/canvas/CanvasOverlays.js +254 -0
  72. package/dist/features/canvas/CanvasPageEdge.js +87 -0
  73. package/dist/features/canvas/CanvasPageFrame.js +335 -0
  74. package/dist/features/canvas/CanvasPageHeader.js +125 -0
  75. package/dist/features/canvas/CanvasPreviewPageSlot.js +103 -0
  76. package/dist/features/canvas/CanvasShelfMarker.js +255 -0
  77. package/dist/features/canvas/DerivedPagePathInput.js +238 -0
  78. package/dist/features/canvas/canvasCamera.js +229 -0
  79. package/dist/features/canvas/canvasFlight.js +104 -0
  80. package/dist/features/canvas/canvasFrameCapture.js +364 -0
  81. package/dist/features/canvas/canvasFrameDocument.js +317 -0
  82. package/dist/features/canvas/canvasFrameMode.js +53 -0
  83. package/dist/features/canvas/canvasInsertionSeams.js +44 -0
  84. package/dist/features/canvas/canvasItems.js +120 -0
  85. package/dist/features/canvas/canvasOverlayGeometry.js +240 -0
  86. package/dist/features/canvas/canvasPages.js +79 -0
  87. package/dist/features/canvas/canvasScreenSpace.js +26 -0
  88. package/dist/features/canvas/canvasSelection.js +18 -0
  89. package/dist/features/canvas/canvasStore.js +149 -0
  90. package/dist/features/canvas/canvasThumbnails.js +304 -0
  91. package/dist/features/canvas/canvasZoom.js +10 -0
  92. package/dist/features/canvas/sidebar/CanvasInspector.js +202 -0
  93. package/dist/features/canvas/sidebar/CanvasNavigator.js +226 -0
  94. package/dist/features/canvas/sidebar/CanvasSidebar.js +60 -0
  95. package/dist/features/canvas/sidebar/CanvasSidebarFrame.js +48 -0
  96. package/dist/features/canvas/sidebar/CanvasSidebarSkeleton.js +39 -0
  97. package/dist/features/canvas/sidebar/CatalogBlockInspector.js +189 -0
  98. package/dist/features/canvas/sidebar/CuratedPageInspector.js +69 -0
  99. package/dist/features/canvas/sidebar/DerivedPageInspector.js +37 -0
  100. package/dist/features/canvas/sidebar/LayoutPageBlocks.js +78 -0
  101. package/dist/features/canvas/sidebar/LayoutPageOverview.js +71 -0
  102. package/dist/features/canvas/sidebar/PageInspector.js +157 -0
  103. package/dist/features/canvas/sidebar/PageInspectorSkeleton.js +90 -0
  104. package/dist/features/canvas/sidebar/PageOverview.js +27 -0
  105. package/dist/features/canvas/sidebar/SingletonPageInspector.js +31 -0
  106. package/dist/features/canvas/useCanvasCamera.js +803 -0
  107. package/dist/features/canvas/useCanvasFrame.js +149 -0
  108. package/dist/features/canvas/useCanvasFrameInput.js +97 -0
  109. package/dist/features/canvas/useCanvasNearness.js +57 -0
  110. package/dist/features/canvas/useDiscoveredPreviewPaths.js +62 -0
  111. package/dist/features/content/CamoxContent.d.ts +2 -5
  112. package/dist/features/content/CamoxContent.js +174 -271
  113. package/dist/features/content/CollectionItemSheetContext.js +106 -0
  114. package/dist/features/content/ContentAssets.js +315 -0
  115. package/dist/features/content/ContentCollection.js +663 -0
  116. package/dist/features/content/collection-form.js +58 -0
  117. package/dist/features/content/components/AssetCard.js +80 -84
  118. package/dist/features/content/components/AssetCardSkeleton.js +4 -8
  119. package/dist/features/content/components/ContentSidebar.js +129 -18
  120. package/dist/features/content/components/ContentSidebarGroup.js +37 -0
  121. package/dist/features/content/components/DeleteCollectionItemButton.js +202 -0
  122. package/dist/features/content/components/MissingFromLocale.js +282 -0
  123. package/dist/features/content/components/UploadDropZone.js +27 -31
  124. package/dist/features/content/components/UploadProgressDrawer.js +90 -98
  125. package/dist/features/navigation/navigation.d.ts +66 -20
  126. package/dist/features/navigation/navigation.js +257 -90
  127. package/dist/features/og/defaultFonts.js +8 -8
  128. package/dist/features/og/geist-variable-ttf-base64.js +1 -1
  129. package/dist/features/og/imageResponse.d.ts +8 -0
  130. package/dist/features/og/imageResponse.js +26 -0
  131. package/dist/features/page/CuratedPageContent.js +167 -0
  132. package/dist/features/page/DerivedPageContent.js +26 -30
  133. package/dist/features/page/SharedLayoutContent.js +25 -27
  134. package/dist/features/preview/CamoxPreview.d.ts +23 -61
  135. package/dist/features/preview/CamoxPreview.js +816 -537
  136. package/dist/features/preview/EditablePageContent.js +1 -1
  137. package/dist/features/preview/EditablePageExperience.js +16 -22
  138. package/dist/features/preview/components/AddBlockDialog.js +270 -0
  139. package/dist/features/preview/components/AssetFieldEditor.js +173 -154
  140. package/dist/features/preview/components/AssetLightbox.js +181 -134
  141. package/dist/features/preview/components/AssetPickerModal.js +153 -170
  142. package/dist/features/preview/components/BlockActionsPopover.js +150 -149
  143. package/dist/features/preview/components/BlockErrorBoundary.js +8 -12
  144. package/dist/features/preview/components/BlockThumbnail.js +176 -100
  145. package/dist/features/preview/components/CanvasPreview.js +243 -0
  146. package/dist/features/preview/components/CreatePageModal.js +128 -137
  147. package/dist/features/preview/components/DebouncedFieldEditor.js +29 -33
  148. package/dist/features/preview/components/DerivedLayoutDialog.js +21 -19
  149. package/dist/features/preview/components/DrillRow.js +150 -0
  150. package/dist/features/preview/components/FieldOverlayStyles.js +11 -8
  151. package/dist/features/preview/components/FieldToolbar.js +160 -110
  152. package/dist/features/preview/components/Frame.js +108 -20
  153. package/dist/features/preview/components/IconFieldEditor.js +62 -66
  154. package/dist/features/preview/components/ItemFieldsEditor.js +231 -205
  155. package/dist/features/preview/components/LinkFieldEditor.js +135 -139
  156. package/dist/features/preview/components/Metadata.js +22 -30
  157. package/dist/features/preview/components/MobilePreviewDrawer.js +89 -108
  158. package/dist/features/preview/components/MultipleAssetFieldEditor.js +334 -246
  159. package/dist/features/preview/components/OverlayTracker.js +9 -41
  160. package/dist/features/preview/components/Overlays.js +81 -69
  161. package/dist/features/preview/components/PageInfo.js +1748 -0
  162. package/dist/features/preview/components/PageInfoSkeleton.js +51 -0
  163. package/dist/features/preview/components/PageLocationFieldset.js +112 -116
  164. package/dist/features/preview/components/PageNavigatorHeader.js +24 -0
  165. package/dist/features/preview/components/PageNicknameField.js +22 -26
  166. package/dist/features/preview/components/PagePicker.js +128 -130
  167. package/dist/features/preview/components/PageTree.js +525 -532
  168. package/dist/features/preview/components/PreviewActivation.js +28 -32
  169. package/dist/features/preview/components/PreviewPanel.js +620 -319
  170. package/dist/features/preview/components/PreviewToolbar.js +105 -333
  171. package/dist/features/preview/components/RecordCard.js +80 -0
  172. package/dist/features/preview/components/RecordCombobox.js +178 -0
  173. package/dist/features/preview/components/ReferenceFieldEditor.js +149 -0
  174. package/dist/features/preview/components/ReferenceListFieldEditor.js +432 -0
  175. package/dist/features/preview/components/RemovedBlockPlaceholder.js +95 -0
  176. package/dist/features/preview/components/RepeatableItemsList.js +125 -138
  177. package/dist/features/preview/components/SelectionEditor.js +993 -0
  178. package/dist/features/preview/components/ShikiMarkdown.js +14 -18
  179. package/dist/features/preview/components/SidebarSection.js +52 -64
  180. package/dist/features/preview/components/StudioEditingFallback.js +56 -0
  181. package/dist/features/preview/components/UnlinkAssetButton.js +104 -107
  182. package/dist/features/preview/components/blockGridNavigation.js +15 -0
  183. package/dist/features/preview/components/contentFieldSchema.js +8 -0
  184. package/dist/features/preview/components/useFieldWriter.js +200 -0
  185. package/dist/features/preview/components/useRecordView.js +383 -0
  186. package/dist/features/preview/components/useRepeatableItemActions.js +35 -37
  187. package/dist/features/preview/components/useUpdateBlockPosition.js +37 -37
  188. package/dist/features/preview/editingFrame.js +197 -0
  189. package/dist/features/preview/overlayHighlights.js +17 -44
  190. package/dist/features/preview/overlayMessages.js +72 -1
  191. package/dist/features/preview/pageRecord.js +189 -0
  192. package/dist/features/preview/previewConstants.js +6 -2
  193. package/dist/features/preview/previewPageFrame.js +95 -0
  194. package/dist/features/preview/previewPreparation.js +7 -0
  195. package/dist/features/preview/previewSelection.js +32 -63
  196. package/dist/features/preview/previewStore.js +225 -123
  197. package/dist/features/preview/referencePickerFocus.js +29 -0
  198. package/dist/features/preview/repeatableItemTargets.js +56 -0
  199. package/dist/features/preview/selectionReveal.js +21 -0
  200. package/dist/features/preview/usePreviewViewportActions.js +114 -0
  201. package/dist/features/preview/viewportContinuity.js +109 -0
  202. package/dist/features/provider/AuthenticatedCamoxProvider.js +69 -44
  203. package/dist/features/provider/CamoxProvider.d.ts +3 -6
  204. package/dist/features/provider/CamoxProvider.js +38 -50
  205. package/dist/features/provider/CoreCamoxProvider.js +66 -50
  206. package/dist/features/provider/LocalhostPreviewProvider.js +78 -114
  207. package/dist/features/provider/PreviewSignInPage.js +54 -0
  208. package/dist/features/provider/components/CamoxAppContext.js +11 -11
  209. package/dist/features/provider/components/CommandPalette.js +75 -82
  210. package/dist/features/provider/useAdminShortcuts.js +7 -11
  211. package/dist/features/routes/pageRuntime.d.ts +44 -4
  212. package/dist/features/routes/pageRuntime.js +244 -137
  213. package/dist/features/runtime/RuntimeChrome.js +117 -115
  214. package/dist/features/runtime/alternates.js +64 -0
  215. package/dist/features/runtime/analytics.d.ts +7 -0
  216. package/dist/features/runtime/analytics.js +66 -0
  217. package/dist/features/runtime/artifactSources.js +87 -0
  218. package/dist/features/runtime/editingFallback.js +20 -0
  219. package/dist/features/runtime/linkPrefetch.js +97 -0
  220. package/dist/features/runtime/livePages.js +62 -0
  221. package/dist/features/runtime/llmsTxt.js +40 -0
  222. package/dist/features/runtime/loopbackFetch.js +18 -0
  223. package/dist/features/runtime/navigationAccessibility.js +51 -0
  224. package/dist/features/runtime/navigationTarget.js +23 -2
  225. package/dist/features/runtime/pageApp.js +229 -158
  226. package/dist/features/runtime/pageBlockTypes.js +20 -0
  227. package/dist/features/runtime/pageClient.d.ts +2 -4
  228. package/dist/features/runtime/pageClient.js +18 -3
  229. package/dist/features/runtime/pageNavigation.js +254 -32
  230. package/dist/features/runtime/pageServer.d.ts +2 -4
  231. package/dist/features/runtime/pageServer.js +6 -2
  232. package/dist/features/runtime/pageViewport.js +7 -0
  233. package/dist/features/runtime/runtime.d.ts +59 -24
  234. package/dist/features/runtime/runtime.js +779 -191
  235. package/dist/features/runtime/runtimeChromeLoader.js +58 -0
  236. package/dist/features/runtime/runtimeRoutes.d.ts +19 -0
  237. package/dist/features/runtime/runtimeRoutes.js +25 -0
  238. package/dist/features/runtime/scrollRestoration.js +133 -0
  239. package/dist/features/runtime/studioApp.d.ts +4 -3
  240. package/dist/features/runtime/studioApp.js +5 -9
  241. package/dist/features/runtime/studioClient.d.ts +2 -4
  242. package/dist/features/runtime/studioClient.js +12 -3
  243. package/dist/features/runtime/studioServer.d.ts +2 -4
  244. package/dist/features/runtime/studioServer.js +6 -1
  245. package/dist/features/runtime/worker.d.ts +6 -0
  246. package/dist/features/runtime/worker.js +23 -0
  247. package/dist/features/runtime/workerRequest.js +44 -0
  248. package/dist/features/studio/CamoxStudio.d.ts +2 -6
  249. package/dist/features/studio/CamoxStudio.js +34 -49
  250. package/dist/features/studio/FollowAgentProvider.js +338 -0
  251. package/dist/features/studio/components/ChatSidebar.js +356 -0
  252. package/dist/features/studio/components/DraftsControl.js +676 -0
  253. package/dist/features/studio/components/FaviconDialog.js +318 -0
  254. package/dist/features/studio/components/LocalePicker.js +785 -0
  255. package/dist/features/studio/components/Navbar.js +123 -103
  256. package/dist/features/studio/components/ProjectMenu.js +239 -260
  257. package/dist/features/studio/components/RenameDraftDialog.js +206 -0
  258. package/dist/features/studio/components/ReviewDraftSheet.js +1472 -0
  259. package/dist/features/studio/components/ThreadComposer.js +157 -0
  260. package/dist/features/studio/components/ThreadMarkdown.js +113 -0
  261. package/dist/features/studio/components/ThreadMessages.js +270 -0
  262. package/dist/features/studio/components/UserButton.js +34 -23
  263. package/dist/features/studio/draftLabel.js +33 -0
  264. package/dist/features/studio/draftNotice.js +13 -0
  265. package/dist/features/studio/followAgent.js +250 -0
  266. package/dist/features/studio/followAgentContext.js +7 -0
  267. package/dist/features/studio/localeOptions.js +118 -0
  268. package/dist/features/studio/localeSwitch.js +19 -0
  269. package/dist/features/studio/routes.js +48 -1
  270. package/dist/features/studio/studioStore.js +64 -1
  271. package/dist/features/studio/useTheme.js +24 -27
  272. package/dist/features/vite/artifactRuntimeMinification.js +36 -0
  273. package/dist/features/vite/blockBoilerplate.js +6 -5
  274. package/dist/features/vite/blockChunks.js +31 -0
  275. package/dist/features/vite/bundlerLogs.js +17 -0
  276. package/dist/features/vite/definitionsSync.js +158 -226
  277. package/dist/features/vite/devAuthentication.js +4 -16
  278. package/dist/features/vite/devSignIn.js +87 -0
  279. package/dist/features/vite/iconGeneration.js +1 -1
  280. package/dist/features/vite/layoutGeneration.js +11 -1
  281. package/dist/features/vite/publishSeededContent.js +30 -0
  282. package/dist/features/vite/routeGeneration.js +6 -7
  283. package/dist/features/vite/runtimeDev.js +80 -99
  284. package/dist/features/vite/vite.d.ts +51 -31
  285. package/dist/features/vite/vite.js +224 -127
  286. package/dist/features/vite/workerBuild.js +39 -0
  287. package/dist/hooks/use-debounced-field.js +116 -47
  288. package/dist/hooks/use-file-upload.js +114 -67
  289. package/dist/hooks/use-marquee-selection.js +32 -36
  290. package/dist/hooks/use-page-destinations.js +69 -37
  291. package/dist/lib/api-client-server.d.ts +5 -0
  292. package/dist/lib/api-client-server.js +10 -4
  293. package/dist/lib/api-client.d.ts +6 -0
  294. package/dist/lib/api-client.js +51 -16
  295. package/dist/lib/api-socket.js +17 -0
  296. package/dist/lib/auth-page-styles.js +39 -0
  297. package/dist/lib/auth.js +117 -61
  298. package/dist/lib/collection-cache.js +23 -0
  299. package/dist/lib/draft-scope.d.ts +4 -0
  300. package/dist/lib/draft-scope.js +222 -0
  301. package/dist/lib/html.js +12 -0
  302. package/dist/lib/link-pages.js +154 -0
  303. package/dist/lib/locale-path.d.ts +22 -0
  304. package/dist/lib/locale-path.js +57 -0
  305. package/dist/lib/normalized-data.js +252 -152
  306. package/dist/lib/preview-handoff.js +2 -2
  307. package/dist/lib/queries.d.ts +11 -0
  308. package/dist/lib/queries.js +70 -141
  309. package/dist/lib/studio-reads.d.ts +14 -0
  310. package/dist/lib/studio-reads.js +574 -0
  311. package/dist/lib/use-project-room.js +50 -50
  312. package/dist/lib/use-thread.js +310 -0
  313. package/dist/lib/utils.js +25 -29
  314. package/dist/lib/view-locale-context.js +22 -0
  315. package/dist/lib/view-locale.js +46 -0
  316. package/dist/package.js +5 -0
  317. package/dist/studio-overlays.css +41 -151
  318. package/dist/studio.css +2 -2
  319. package/package.json +70 -73
  320. package/skills/camox/SKILL.md +16 -11
  321. package/skills/camox/references/artifacts.md +179 -0
  322. package/skills/camox/references/block-definitions.md +75 -59
  323. package/skills/camox/references/cli-common.md +9 -11
  324. package/skills/camox/references/cli-content.md +92 -69
  325. package/skills/camox/references/cli-publishing.md +26 -0
  326. package/skills/camox/references/dom-integrations.md +27 -0
  327. package/skills/camox/references/field-styling.md +4 -4
  328. package/skills/camox/references/layout-definitions.md +16 -14
  329. package/skills/camox/references/localization.md +56 -0
  330. package/skills/camox/references/routed-layouts.md +133 -15
  331. package/skills/camox-expand/SKILL.md +69 -0
  332. package/skills/camox-expand/references/jobs.md +39 -0
  333. package/skills/camoxify/SKILL.md +29 -7
  334. package/dist/core/components/AddBlockControlBar.js +0 -78
  335. package/dist/core/hooks/useRequireDraftSource.js +0 -23
  336. package/dist/features/metadata/sitemap.d.ts +0 -8
  337. package/dist/features/metadata/sitemap.js +0 -17
  338. package/dist/features/og/imageResponse.node.d.ts +0 -12
  339. package/dist/features/og/imageResponse.node.js +0 -49
  340. package/dist/features/og/imageResponse.workerd.d.ts +0 -12
  341. package/dist/features/og/imageResponse.workerd.js +0 -40
  342. package/dist/features/page/PublishedPageContent.js +0 -205
  343. package/dist/features/page/PublishedPageExperience.js +0 -23
  344. package/dist/features/preview/DerivedPreview.js +0 -134
  345. package/dist/features/preview/commentsEnabled.js +0 -8
  346. package/dist/features/preview/components/AddBlockSidebar.js +0 -381
  347. package/dist/features/preview/components/AttachedComments.js +0 -331
  348. package/dist/features/preview/components/CommentHeader.js +0 -122
  349. package/dist/features/preview/components/CommentSidebar.js +0 -29
  350. package/dist/features/preview/components/CommentTargetQuote.js +0 -167
  351. package/dist/features/preview/components/DerivedLayoutSidebar.d.ts +0 -5
  352. package/dist/features/preview/components/DerivedLayoutSidebar.js +0 -179
  353. package/dist/features/preview/components/DerivedPageInfoSidebar.js +0 -69
  354. package/dist/features/preview/components/LeftSidebar.js +0 -68
  355. package/dist/features/preview/components/PageEditorSidebar.js +0 -563
  356. package/dist/features/preview/components/PageInfoSidebar.js +0 -1551
  357. package/dist/features/preview/components/PageNavigatorSidebar.js +0 -78
  358. package/dist/features/preview/components/PageStatusBadge.js +0 -97
  359. package/dist/features/preview/components/PeekedBlock.js +0 -217
  360. package/dist/features/preview/components/PreviewComments.js +0 -56
  361. package/dist/features/preview/components/PreviewToolbarSpacer.js +0 -43
  362. package/dist/features/preview/components/PublicationRow.js +0 -422
  363. package/dist/features/preview/components/PublishDialog.js +0 -194
  364. package/dist/features/preview/components/RightSidebar.js +0 -59
  365. package/dist/features/preview/components/SendFeedbackDialog.js +0 -83
  366. package/dist/features/preview/previewCommentsStore.js +0 -135
  367. package/dist/features/preview/publication.js +0 -81
  368. package/dist/features/preview/usePageComments.js +0 -39
  369. package/dist/features/runtime/SharedChromeContext.js +0 -7
  370. package/dist/features/studio/components/EnvironmentMenu.js +0 -425
  371. package/dist/features/vite/appGeneration.js +0 -89
  372. package/dist/lib/view-queries.js +0 -28
  373. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/Matches.d.ts +0 -114
  374. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/RouterProvider.d.ts +0 -25
  375. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/config.d.ts +0 -1
  376. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/defer.d.ts +0 -1
  377. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/fileRoute.d.ts +0 -20
  378. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/global.d.ts +0 -8
  379. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/hash-scroll.d.ts +0 -1
  380. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/index.d.ts +0 -18
  381. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/link.d.ts +0 -161
  382. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/load-matches.d.ts +0 -6
  383. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/location.d.ts +0 -54
  384. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/lru-cache.d.ts +0 -8
  385. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/manifest.d.ts +0 -32
  386. 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
  387. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/not-found.d.ts +0 -1
  388. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/redirect.d.ts +0 -49
  389. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/rewrite.d.ts +0 -1
  390. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/root.d.ts +0 -6
  391. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/route.d.ts +0 -343
  392. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/routeInfo.d.ts +0 -48
  393. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/router.d.ts +0 -695
  394. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/scroll-restoration.d.ts +0 -1
  395. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/searchMiddleware.d.ts +0 -1
  396. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/searchParams.d.ts +0 -5
  397. 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
  398. 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
  399. 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
  400. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/stores.d.ts +0 -69
  401. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/structuralSharing.d.ts +0 -1
  402. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/typePrimitives.d.ts +0 -1
  403. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useLoaderData.d.ts +0 -1
  404. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useLoaderDeps.d.ts +0 -1
  405. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useNavigate.d.ts +0 -10
  406. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useParams.d.ts +0 -1
  407. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useRouteContext.d.ts +0 -1
  408. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useSearch.d.ts +0 -1
  409. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/utils.d.ts +0 -28
  410. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/validators.d.ts +0 -49
  411. package/skills/camox/references/cli-environments.md +0 -37
@@ -0,0 +1,177 @@
1
+ import { getImagePlaceholderTitle, isImagePlaceholder } from "./contentType.js";
2
+ import { c } from "react/compiler-runtime";
3
+ import * as React from "react";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+
6
+ //#region src/core/lib/imagePlaceholder.tsx
7
+ const presentationProps = /* @__PURE__ */ new Set([
8
+ "id",
9
+ "className",
10
+ "style",
11
+ "width",
12
+ "height",
13
+ "title",
14
+ "role",
15
+ "tabIndex",
16
+ "hidden",
17
+ "dir",
18
+ "lang"
19
+ ]);
20
+ const landscapeLayers = [
21
+ {
22
+ path: "M0 680 190 470 280 520 560 180 650 330 720 290 1020 610 1200 550V800H0Z",
23
+ shade: 5
24
+ },
25
+ {
26
+ path: "M0 500Q180 350 380 470T780 490Q1000 350 1200 460V800H0Z",
27
+ shade: 9
28
+ },
29
+ {
30
+ path: "M0 590Q200 690 440 550T850 570Q1040 650 1200 530V800H0Z",
31
+ shade: 14
32
+ },
33
+ {
34
+ path: "M0 650Q160 580 330 660T660 650Q850 590 1010 480L1200 390V800H0Z",
35
+ shade: 20
36
+ }
37
+ ];
38
+ const placeholderFill = "var(--camox-placeholder, #f1f3f5)";
39
+ const placeholderInk = "var(--camox-placeholder-ink, #64748b)";
40
+ function PlaceholderLandscape() {
41
+ const $ = c(10);
42
+ const id = React.useId();
43
+ let t0;
44
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
45
+ t0 = { color: placeholderFill };
46
+ $[0] = t0;
47
+ } else t0 = $[0];
48
+ let t1;
49
+ if ($[1] !== id) {
50
+ t1 = landscapeLayers.map((t2, index) => {
51
+ const { shade } = t2;
52
+ return /* @__PURE__ */ jsxs("linearGradient", {
53
+ id: `${id}-hill-${index}`,
54
+ x1: "0",
55
+ y1: "0",
56
+ x2: "0",
57
+ y2: "1",
58
+ children: [/* @__PURE__ */ jsx("stop", {
59
+ offset: "0",
60
+ stopColor: `color-mix(in oklab, currentColor ${100 - shade}%, #64748b)`
61
+ }), /* @__PURE__ */ jsx("stop", {
62
+ offset: "1",
63
+ stopColor: `color-mix(in oklab, currentColor ${104 - shade}%, #64748b)`
64
+ })]
65
+ }, index);
66
+ });
67
+ $[1] = id;
68
+ $[2] = t1;
69
+ } else t1 = $[2];
70
+ let t2;
71
+ if ($[3] !== t1) {
72
+ t2 = /* @__PURE__ */ jsx("defs", { children: t1 });
73
+ $[3] = t1;
74
+ $[4] = t2;
75
+ } else t2 = $[4];
76
+ let t3;
77
+ if ($[5] !== id) {
78
+ t3 = landscapeLayers.map((t4, index_0) => {
79
+ const { path } = t4;
80
+ return /* @__PURE__ */ jsx("path", {
81
+ d: path,
82
+ fill: `url(#${id}-hill-${index_0})`
83
+ }, index_0);
84
+ });
85
+ $[5] = id;
86
+ $[6] = t3;
87
+ } else t3 = $[6];
88
+ let t4;
89
+ if ($[7] !== t2 || $[8] !== t3) {
90
+ t4 = /* @__PURE__ */ jsxs("g", {
91
+ style: t0,
92
+ children: [t2, t3]
93
+ });
94
+ $[7] = t2;
95
+ $[8] = t3;
96
+ $[9] = t4;
97
+ } else t4 = $[9];
98
+ return t4;
99
+ }
100
+ /**
101
+ * Run after the author's callback. Only direct images of explicitly synthesized
102
+ * assets are replaced; picture elements, wrappers and custom components retain
103
+ * their URL fallback. Refs and event handlers also keep the image intact rather
104
+ * than silently dropping behavior or handing callers an incompatible SVG node.
105
+ */
106
+ function renderImagePlaceholder(value, rendered) {
107
+ if (!isImagePlaceholder(value)) return rendered;
108
+ if (!React.isValidElement(rendered)) return rendered;
109
+ if (rendered.type !== "img") return rendered;
110
+ const props = rendered.props;
111
+ if (Object.entries(props).some(([name, value]) => value != null && (name === "ref" || /^on[A-Z]/.test(name) || name === "useMap" || name === "isMap"))) return rendered;
112
+ const svgProps = {};
113
+ for (const [name, value] of Object.entries(props)) if (presentationProps.has(name) || name.startsWith("aria-") || name.startsWith("data-")) svgProps[name] = value;
114
+ const hasLabel = Boolean(props["aria-label"] || props["aria-labelledby"] || props.alt);
115
+ const decorative = props["aria-hidden"] === true || props["aria-hidden"] === "true" || !hasLabel;
116
+ return /* @__PURE__ */ jsxs("svg", {
117
+ xmlns: "http://www.w3.org/2000/svg",
118
+ width: 1200,
119
+ height: "auto",
120
+ viewBox: "0 0 1200 800",
121
+ preserveAspectRatio: "xMidYMid slice",
122
+ role: decorative ? void 0 : "img",
123
+ "aria-label": props["aria-labelledby"] ? void 0 : props.alt || void 0,
124
+ "aria-hidden": decorative ? true : void 0,
125
+ focusable: "false",
126
+ ...svgProps,
127
+ children: [
128
+ /* @__PURE__ */ jsx("rect", {
129
+ width: "1200",
130
+ height: "800",
131
+ style: { fill: placeholderFill }
132
+ }),
133
+ /* @__PURE__ */ jsx(PlaceholderLandscape, {}),
134
+ /* @__PURE__ */ jsx("foreignObject", {
135
+ x: "60",
136
+ y: "300",
137
+ width: "1080",
138
+ height: "200",
139
+ children: /* @__PURE__ */ jsx("div", {
140
+ style: {
141
+ display: "flex",
142
+ alignItems: "center",
143
+ justifyContent: "center",
144
+ height: "100%",
145
+ fontFamily: "inherit",
146
+ fontSize: 48
147
+ },
148
+ children: /* @__PURE__ */ jsx("span", {
149
+ style: {
150
+ display: "block",
151
+ maxWidth: "100%",
152
+ color: placeholderFill,
153
+ background: "currentColor",
154
+ borderRadius: 16,
155
+ padding: "16px 28px"
156
+ },
157
+ children: /* @__PURE__ */ jsx("span", {
158
+ style: {
159
+ color: placeholderInk,
160
+ display: "block",
161
+ overflow: "hidden",
162
+ textOverflow: "ellipsis",
163
+ whiteSpace: "nowrap",
164
+ lineHeight: 1.25,
165
+ userSelect: "none"
166
+ },
167
+ children: getImagePlaceholderTitle(value)
168
+ })
169
+ })
170
+ })
171
+ })
172
+ ]
173
+ }, rendered.key);
174
+ }
175
+
176
+ //#endregion
177
+ export { renderImagePlaceholder };
@@ -9,7 +9,7 @@ const DEFAULT_SRCSET_WIDTHS = [
9
9
  ];
10
10
  const DEFAULT_SRC_WIDTH = 1280;
11
11
  const DEFAULT_SIZES = "100vw";
12
- const MIN_OPTIMIZE_SIZE = 50 * 1024;
12
+ const MIN_OPTIMIZE_SIZE = 51200;
13
13
  function isNonProxiedHostname(hostname) {
14
14
  if (hostname === "localhost") return true;
15
15
  if (hostname === "127.0.0.1") return true;
@@ -1 +1,3 @@
1
- import { InlineStyle, InlineTextStyles, TextLinkStyleData, TextStyleData } from "./textStyles.js";
1
+ import { InlineStyle, InlineTextStyles, TextLinkStyleData, TextStyleData } from "./textStyles.js";
2
+ import "react";
3
+ export type { InlineStyle, InlineTextStyles, TextLinkStyleData, TextStyleData };
@@ -240,4 +240,4 @@ function parseTokens(tokens, format) {
240
240
  }
241
241
 
242
242
  //#endregion
243
- export { isLexicalState, lexicalStateToMarkdown, lexicalStateToPlainText, markdownToLexicalState };
243
+ export { isLexicalState, lexicalStateToMarkdown, lexicalStateToPlainText, markdownToLexicalState, parseInlineMarkdown };
@@ -0,0 +1,9 @@
1
+ //#region src/core/lib/previewPaused.ts
2
+ /**
3
+ * Set on the root of a preview document while Camox pauses it, such as a
4
+ * Canvas frame nobody is looking at.
5
+ */
6
+ const PREVIEW_PAUSED_ATTRIBUTE = "data-camox-paused";
7
+
8
+ //#endregion
9
+ export { PREVIEW_PAUSED_ATTRIBUTE };
@@ -0,0 +1,316 @@
1
+ import { useProjectUuid } from "../../lib/auth.js";
2
+ import { useLocation } from "../../features/navigation/navigation.js";
3
+ import { resolveAssetValue, useNormalizedData } from "../../lib/normalized-data.js";
4
+ import { useLinkPages } from "../../lib/link-pages.js";
5
+ import { renderImagePlaceholder } from "./imagePlaceholder.js";
6
+ import { buildImageSrcSet, getDefaultImageSizes, getDefaultImageWidth, transformImageUrl } from "./imageTransform.js";
7
+ import { markdownToReactNodes } from "./lexicalReact.js";
8
+ import { fieldPlainText } from "../recordItem.js";
9
+ import { c } from "react/compiler-runtime";
10
+ import * as React from "react";
11
+ import { jsx } from "react/jsx-runtime";
12
+
13
+ //#region src/core/lib/recordScope.tsx
14
+ const RecordContext = React.createContext(null);
15
+ function useFieldValue(name) {
16
+ const record = React.use(RecordContext);
17
+ if (!record) throw new Error("Record fields must be used within layout.Item");
18
+ return record.content[name];
19
+ }
20
+ const Field = (t0) => {
21
+ const $ = c(8);
22
+ const { name, textStyle, linkStyle, children } = t0;
23
+ const value = useFieldValue(name);
24
+ const pages = useLinkPages(useProjectUuid());
25
+ let t1;
26
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
27
+ t1 = { select: _temp };
28
+ $[0] = t1;
29
+ } else t1 = $[0];
30
+ const pathname = useLocation(t1);
31
+ let t2;
32
+ if ($[1] !== children || $[2] !== linkStyle || $[3] !== pages || $[4] !== pathname || $[5] !== textStyle || $[6] !== value) {
33
+ t2 = children({ children: markdownToReactNodes(value, {
34
+ pages,
35
+ fallbackHref: pathname,
36
+ textStyle,
37
+ linkStyle
38
+ }) }, { text: fieldPlainText(value) });
39
+ $[1] = children;
40
+ $[2] = linkStyle;
41
+ $[3] = pages;
42
+ $[4] = pathname;
43
+ $[5] = textStyle;
44
+ $[6] = value;
45
+ $[7] = t2;
46
+ } else t2 = $[7];
47
+ return t2;
48
+ };
49
+ function renderImage(value, children) {
50
+ return renderImagePlaceholder(value, children({
51
+ src: transformImageUrl(value.url, {
52
+ width: getDefaultImageWidth(),
53
+ mimeType: value.mimeType,
54
+ size: value.size
55
+ }),
56
+ srcSet: buildImageSrcSet(value.url, value.mimeType, value.size),
57
+ sizes: getDefaultImageSizes(),
58
+ alt: value.alt
59
+ }, value));
60
+ }
61
+ function renderFile(value, children) {
62
+ return children({
63
+ href: value.url,
64
+ download: value.filename
65
+ }, value);
66
+ }
67
+ /** An asset field's value; unset assets render nothing rather than a fabricated default. */
68
+ function useAsset(name) {
69
+ const $ = c(3);
70
+ const { filesMap } = useNormalizedData();
71
+ const value = useFieldValue(name);
72
+ let t0;
73
+ if ($[0] !== filesMap || $[1] !== value) {
74
+ t0 = value == null ? null : resolveAssetValue(value, filesMap);
75
+ $[0] = filesMap;
76
+ $[1] = value;
77
+ $[2] = t0;
78
+ } else t0 = $[2];
79
+ return t0;
80
+ }
81
+ const Image = (t0) => {
82
+ const $ = c(3);
83
+ const { name, children } = t0;
84
+ const value = useAsset(name);
85
+ let t1;
86
+ if ($[0] !== children || $[1] !== value) {
87
+ t1 = value ? renderImage(value, children) : null;
88
+ $[0] = children;
89
+ $[1] = value;
90
+ $[2] = t1;
91
+ } else t1 = $[2];
92
+ return t1;
93
+ };
94
+ const File = (t0) => {
95
+ const $ = c(3);
96
+ const { name, children } = t0;
97
+ const value = useAsset(name);
98
+ let t1;
99
+ if ($[0] !== children || $[1] !== value) {
100
+ t1 = value ? renderFile(value, children) : null;
101
+ $[0] = children;
102
+ $[1] = value;
103
+ $[2] = t1;
104
+ } else t1 = $[2];
105
+ return t1;
106
+ };
107
+ const Embed = (t0) => {
108
+ const $ = c(3);
109
+ const { name, children } = t0;
110
+ const value = useFieldValue(name);
111
+ const url = typeof value === "string" ? value : "";
112
+ let t1;
113
+ if ($[0] !== children || $[1] !== url) {
114
+ t1 = children({ src: url }, { url });
115
+ $[0] = children;
116
+ $[1] = url;
117
+ $[2] = t1;
118
+ } else t1 = $[2];
119
+ return t1;
120
+ };
121
+ function useAssetList(name) {
122
+ const $ = c(6);
123
+ const { filesMap } = useNormalizedData();
124
+ const value = useFieldValue(name);
125
+ if (!Array.isArray(value)) {
126
+ let t0;
127
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
128
+ t0 = [];
129
+ $[0] = t0;
130
+ } else t0 = $[0];
131
+ return t0;
132
+ }
133
+ let t0;
134
+ if ($[1] !== filesMap || $[2] !== value) {
135
+ let t1;
136
+ if ($[4] !== filesMap) {
137
+ t1 = (asset) => resolveAssetValue(asset, filesMap);
138
+ $[4] = filesMap;
139
+ $[5] = t1;
140
+ } else t1 = $[5];
141
+ t0 = value.map(t1).filter(Boolean);
142
+ $[1] = filesMap;
143
+ $[2] = value;
144
+ $[3] = t0;
145
+ } else t0 = $[3];
146
+ return t0;
147
+ }
148
+ const ImageList = (t0) => {
149
+ const $ = c(5);
150
+ const { name, children } = t0;
151
+ const t1 = useAssetList(name);
152
+ let t2;
153
+ if ($[0] !== children || $[1] !== t1) {
154
+ let t3;
155
+ if ($[3] !== children) {
156
+ t3 = (value, index) => /* @__PURE__ */ jsx(React.Fragment, { children: renderImage(value, children) }, index);
157
+ $[3] = children;
158
+ $[4] = t3;
159
+ } else t3 = $[4];
160
+ t2 = t1.map(t3);
161
+ $[0] = children;
162
+ $[1] = t1;
163
+ $[2] = t2;
164
+ } else t2 = $[2];
165
+ return t2;
166
+ };
167
+ const FileList = (t0) => {
168
+ const $ = c(5);
169
+ const { name, children } = t0;
170
+ const t1 = useAssetList(name);
171
+ let t2;
172
+ if ($[0] !== children || $[1] !== t1) {
173
+ let t3;
174
+ if ($[3] !== children) {
175
+ t3 = (value, index) => /* @__PURE__ */ jsx(React.Fragment, { children: renderFile(value, children) }, index);
176
+ $[3] = children;
177
+ $[4] = t3;
178
+ } else t3 = $[4];
179
+ t2 = t1.map(t3);
180
+ $[0] = children;
181
+ $[1] = t1;
182
+ $[2] = t2;
183
+ } else t2 = $[2];
184
+ return t2;
185
+ };
186
+ const LinksContext = React.createContext(void 0);
187
+ function useLinked(name) {
188
+ const record = React.use(RecordContext);
189
+ const links = React.use(LinksContext);
190
+ return {
191
+ schema: record?.properties[name],
192
+ linked: links?.[name]
193
+ };
194
+ }
195
+ const Reference = (t0) => {
196
+ const $ = c(4);
197
+ const { name, children } = t0;
198
+ const { schema, linked } = useLinked(name);
199
+ if (!linked || Array.isArray(linked) || linked.collectionId !== schema?.collectionId) return null;
200
+ let t1;
201
+ if ($[0] !== children || $[1] !== linked || $[2] !== schema.referenceSchema.properties) {
202
+ t1 = /* @__PURE__ */ jsx(RecordScope, {
203
+ record: linked,
204
+ properties: schema.referenceSchema.properties,
205
+ hop: 2,
206
+ children
207
+ });
208
+ $[0] = children;
209
+ $[1] = linked;
210
+ $[2] = schema.referenceSchema.properties;
211
+ $[3] = t1;
212
+ } else t1 = $[3];
213
+ return t1;
214
+ };
215
+ const ReferenceList = (t0) => {
216
+ const $ = c(9);
217
+ const { name, children } = t0;
218
+ const { schema, linked } = useLinked(name);
219
+ if (!Array.isArray(linked)) return null;
220
+ let t1;
221
+ if ($[0] !== children || $[1] !== linked || $[2] !== schema) {
222
+ let t2;
223
+ if ($[4] !== schema?.collectionId) {
224
+ t2 = (record) => record.collectionId === schema?.collectionId;
225
+ $[4] = schema?.collectionId;
226
+ $[5] = t2;
227
+ } else t2 = $[5];
228
+ let t3;
229
+ if ($[6] !== children || $[7] !== schema) {
230
+ t3 = (record_0) => /* @__PURE__ */ jsx(RecordScope, {
231
+ record: record_0,
232
+ properties: schema.referenceSchema.properties,
233
+ hop: 2,
234
+ children
235
+ }, record_0.id);
236
+ $[6] = children;
237
+ $[7] = schema;
238
+ $[8] = t3;
239
+ } else t3 = $[8];
240
+ t1 = linked.filter(t2).map(t3);
241
+ $[0] = children;
242
+ $[1] = linked;
243
+ $[2] = schema;
244
+ $[3] = t1;
245
+ } else t1 = $[3];
246
+ return t1;
247
+ };
248
+ /**
249
+ * Renders `record` with its typed scope. The first hop also renders the records it links
250
+ * (the second hop), which link nothing further.
251
+ */
252
+ function RecordScope(t0) {
253
+ const $ = c(14);
254
+ const { record, properties, hop, children } = t0;
255
+ let t1;
256
+ if ($[0] !== properties || $[1] !== record.content) {
257
+ t1 = {
258
+ content: record.content,
259
+ properties
260
+ };
261
+ $[0] = properties;
262
+ $[1] = record.content;
263
+ $[2] = t1;
264
+ } else t1 = $[2];
265
+ const value = t1;
266
+ const t2 = hop === 1 ? record.references : void 0;
267
+ let t3;
268
+ if ($[3] !== children || $[4] !== hop || $[5] !== record.id || $[6] !== record.label) {
269
+ t3 = children({
270
+ id: record.id,
271
+ label: record.label,
272
+ Field,
273
+ Image,
274
+ File,
275
+ Embed,
276
+ ImageList,
277
+ FileList,
278
+ ...hop === 1 ? {
279
+ Reference,
280
+ ReferenceList
281
+ } : {}
282
+ });
283
+ $[3] = children;
284
+ $[4] = hop;
285
+ $[5] = record.id;
286
+ $[6] = record.label;
287
+ $[7] = t3;
288
+ } else t3 = $[7];
289
+ let t4;
290
+ if ($[8] !== t2 || $[9] !== t3) {
291
+ t4 = /* @__PURE__ */ jsx(LinksContext.Provider, {
292
+ value: t2,
293
+ children: t3
294
+ });
295
+ $[8] = t2;
296
+ $[9] = t3;
297
+ $[10] = t4;
298
+ } else t4 = $[10];
299
+ let t5;
300
+ if ($[11] !== t4 || $[12] !== value) {
301
+ t5 = /* @__PURE__ */ jsx(RecordContext.Provider, {
302
+ value,
303
+ children: t4
304
+ });
305
+ $[11] = t4;
306
+ $[12] = value;
307
+ $[13] = t5;
308
+ } else t5 = $[13];
309
+ return t5;
310
+ }
311
+ function _temp(location) {
312
+ return location.pathname;
313
+ }
314
+
315
+ //#endregion
316
+ export { RecordScope };
@@ -0,0 +1,81 @@
1
+ import { InlineTextStyles } from "./textStyles.js";
2
+ import "./lexicalReact.js";
3
+ import { EmbedURL, FileValue, ImageValue, ReferenceListSchema, ReferenceSchema } from "./contentType.js";
4
+ import * as React from "react";
5
+ import { Static, TSchema } from "@sinclair/typebox";
6
+ //#region src/core/lib/reference.d.ts
7
+ type Keys<T extends Record<string, TSchema>, V> = { [K in keyof T & string]: Static<T[K]> extends V ? K : never; }[keyof T & string];
8
+ type TextKeys<T extends Record<string, TSchema>> = { [K in keyof T & string]: T[K] extends {
9
+ fieldType: "String";
10
+ } ? K : never; }[keyof T & string];
11
+ type Primitive<K, P, D> = (props: {
12
+ name: K;
13
+ children: (props: P, data: D) => React.ReactNode;
14
+ }) => React.ReactNode;
15
+ /**
16
+ * The typed scope of a placed record. A record placed by a block or item (the first hop) also
17
+ * renders the records it links; those (the second hop) link nothing further.
18
+ */
19
+ export type ReferenceScope<T extends Record<string, TSchema>, Nested extends boolean = true> = RecordFields<T> & (Nested extends true ? LinkedRecords<T> : unknown);
20
+ type LinkedRecords<T extends Record<string, TSchema>> = {
21
+ Reference: <K extends ReferenceKeys<T>>(props: {
22
+ name: K;
23
+ children: (scope: ReferenceScope<ReferenceContent<T[K]>, false>) => React.ReactNode;
24
+ }) => React.ReactNode;
25
+ ReferenceList: <K extends ReferenceListKeys<T>>(props: {
26
+ name: K;
27
+ children: (scope: ReferenceScope<ReferenceContent<T[K]>, false>) => React.ReactNode;
28
+ }) => React.ReactNode;
29
+ };
30
+ type RecordFields<T extends Record<string, TSchema>> = {
31
+ id: string;
32
+ label: string;
33
+ Field: (props: InlineTextStyles & {
34
+ name: TextKeys<T>;
35
+ children: (props: React.HTMLAttributes<HTMLElement> & {
36
+ ref?: React.Ref<any>;
37
+ }, data: {
38
+ text: string;
39
+ }) => React.ReactNode;
40
+ }) => React.ReactNode;
41
+ Image: Primitive<Keys<T, ImageValue>, {
42
+ src: string;
43
+ alt: string;
44
+ srcSet?: string;
45
+ sizes?: string;
46
+ }, ImageValue>;
47
+ File: Primitive<Keys<T, FileValue>, {
48
+ href: string;
49
+ download: string;
50
+ }, FileValue>;
51
+ Embed: Primitive<Keys<T, EmbedURL>, {
52
+ src: string;
53
+ }, {
54
+ url: string;
55
+ }>;
56
+ ImageList: Primitive<Keys<T, ImageValue[]>, {
57
+ src: string;
58
+ alt: string;
59
+ srcSet?: string;
60
+ sizes?: string;
61
+ }, ImageValue>;
62
+ FileList: Primitive<Keys<T, FileValue[]>, {
63
+ href: string;
64
+ download: string;
65
+ }, FileValue>;
66
+ };
67
+ export type ReferenceKeys<T extends Record<string, TSchema>> = { [K in keyof T & string]: T[K] extends ReferenceSchema<any> ? K : never; }[keyof T & string];
68
+ export type ReferenceListKeys<T extends Record<string, TSchema>> = { [K in keyof T & string]: T[K] extends ReferenceListSchema<any> ? K : never; }[keyof T & string];
69
+ export type ReferenceContent<T extends TSchema> = T extends ReferenceSchema<infer C> ? C : T extends ReferenceListSchema<infer C> ? C : never;
70
+ export type ReferenceRecord = {
71
+ id: string;
72
+ collectionId: string;
73
+ label: string;
74
+ content: Record<string, unknown>;
75
+ /** When its content last changed, for a record page's record. */
76
+ updatedAt?: number;
77
+ /** The records this record links, when it was placed at the first hop. */
78
+ references?: Record<string, ReferenceRecord | ReferenceRecord[] | null>;
79
+ };
80
+ //#endregion
81
+ export {};
@@ -0,0 +1,29 @@
1
+ //#region src/core/lib/reference.ts
2
+ /**
3
+ * A record page's record: as its loader returned it, or as a later save through any placement
4
+ * stored it, whichever changed last.
5
+ */
6
+ function latestContent(loaded, saved) {
7
+ if (!saved || loaded.updatedAt == null || saved.updatedAt <= loaded.updatedAt) return loaded;
8
+ return {
9
+ content: saved.content,
10
+ updatedAt: saved.updatedAt
11
+ };
12
+ }
13
+ function resolveReference(value, collectionId, records) {
14
+ if (typeof value !== "string") return null;
15
+ const record = records.get(value);
16
+ return record?.collectionId === collectionId ? record : null;
17
+ }
18
+ /** The record ids a reference list value links, in stored order; anything else links none. */
19
+ function referenceListIds(value) {
20
+ if (!Array.isArray(value)) return [];
21
+ return value.filter((id) => typeof id === "string" && id !== "");
22
+ }
23
+ /** The records a reference list links, in stored order; unresolved ids are skipped. */
24
+ function resolveReferenceList(value, collectionId, records) {
25
+ return referenceListIds(value).map((id) => resolveReference(id, collectionId, records)).filter((record) => record !== null);
26
+ }
27
+
28
+ //#endregion
29
+ export { latestContent, referenceListIds, resolveReference, resolveReferenceList };
@@ -1,8 +1,9 @@
1
+ import { PAGE_TEXT_LINK_PREFIX } from "@camox/api-contract/ids";
2
+
1
3
  //#region src/core/lib/textLinks.ts
2
- const PAGE_TEXT_LINK_PREFIX = "camox:page:";
3
4
  function getPageIdFromTextLinkTarget(target) {
4
- if (!target.startsWith("camox:page:")) return null;
5
- const pageId = target.slice(11);
5
+ if (!target.startsWith(PAGE_TEXT_LINK_PREFIX)) return null;
6
+ const pageId = target.slice(PAGE_TEXT_LINK_PREFIX.length);
6
7
  if (!pageId) return null;
7
8
  return pageId;
8
9
  }
@@ -21,11 +22,12 @@ function isValidTextLinkTarget(target) {
21
22
  function resolveTextLinkHref(target, pages, fallbackHref) {
22
23
  const pageId = getPageIdFromTextLinkTarget(target);
23
24
  if (pageId == null) return isValidTextLinkTarget(target) ? target : null;
24
- return (pages?.find((p) => String(p.id) === pageId))?.fullPath ?? fallbackHref;
25
+ if (!pages) return fallbackHref;
26
+ return pages.find((p) => p.id === pageId)?.fullPath ?? null;
25
27
  }
26
28
  function shouldOpenTextLinkInNewTab(target) {
27
29
  return isHttpTextLinkTarget(target);
28
30
  }
29
31
 
30
32
  //#endregion
31
- export { createPageTextLinkTarget, getPageIdFromTextLinkTarget, isHttpTextLinkTarget, isValidTextLinkTarget, resolveTextLinkHref, shouldOpenTextLinkInNewTab };
33
+ export { createPageTextLinkTarget, getPageIdFromTextLinkTarget, isHttpTextLinkTarget, isInternalTextLinkTarget, isValidTextLinkTarget, resolveTextLinkHref, shouldOpenTextLinkInNewTab };
@@ -1,27 +1,25 @@
1
1
  import { CSSProperties } from "react";
2
-
3
2
  //#region src/core/lib/textStyles.d.ts
4
- interface InlineStyle {
3
+ export interface InlineStyle {
5
4
  className?: string;
6
5
  style?: CSSProperties;
7
6
  }
8
- interface TextStyleData {
7
+ export interface TextStyleData {
9
8
  /** True when styling the shared highlight wrapper. Other flags are false for this call. */
10
9
  highlight: boolean;
11
10
  bold: boolean;
12
11
  italic: boolean;
13
12
  strikethrough: boolean;
14
13
  }
15
- interface TextLinkStyleData {
14
+ export interface TextLinkStyleData {
16
15
  target: string;
17
16
  href: string;
18
17
  external: boolean;
19
18
  pageId?: string;
20
19
  }
21
20
  /** Appearance only: Camox owns inline elements in both rendering modes. */
22
- interface InlineTextStyles {
21
+ export interface InlineTextStyles {
23
22
  textStyle?: (format: TextStyleData) => InlineStyle | undefined;
24
23
  linkStyle?: (link: TextLinkStyleData) => InlineStyle | undefined;
25
24
  }
26
- //#endregion
27
- export { InlineStyle, InlineTextStyles, TextLinkStyleData, TextStyleData };
25
+ //#endregion