astro-tractstack 2.0.0-rc.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 (427) hide show
  1. package/LICENSE +110 -0
  2. package/README.md +56 -0
  3. package/astro.d.ts +64 -0
  4. package/bin/create-tractstack.js +483 -0
  5. package/dist/config.js +80 -0
  6. package/dist/index.js +2129 -0
  7. package/package.json +89 -0
  8. package/templates/artpacks/kCz/captainBreakfast_1080px.webp +0 -0
  9. package/templates/artpacks/kCz/captainBreakfast_1920px.webp +0 -0
  10. package/templates/artpacks/kCz/captainBreakfast_600px.webp +0 -0
  11. package/templates/artpacks/kCz/cleanDrips_1080px.webp +0 -0
  12. package/templates/artpacks/kCz/cleanDrips_1920px.webp +0 -0
  13. package/templates/artpacks/kCz/cleanDrips_600px.webp +0 -0
  14. package/templates/artpacks/kCz/crispwaves_1080px.webp +0 -0
  15. package/templates/artpacks/kCz/crispwaves_1920px.webp +0 -0
  16. package/templates/artpacks/kCz/crispwaves_600px.webp +0 -0
  17. package/templates/artpacks/kCz/dragonSkin_1080px.webp +0 -0
  18. package/templates/artpacks/kCz/dragonSkin_1920px.webp +0 -0
  19. package/templates/artpacks/kCz/dragonSkin_600px.webp +0 -0
  20. package/templates/artpacks/kCz/dragon_1080px.webp +0 -0
  21. package/templates/artpacks/kCz/dragon_1920px.webp +0 -0
  22. package/templates/artpacks/kCz/dragon_600px.webp +0 -0
  23. package/templates/artpacks/kCz/nightcity_1080px.webp +0 -0
  24. package/templates/artpacks/kCz/nightcity_1920px.webp +0 -0
  25. package/templates/artpacks/kCz/nightcity_600px.webp +0 -0
  26. package/templates/artpacks/kCz/pattern1_1080px.webp +0 -0
  27. package/templates/artpacks/kCz/pattern1_1920px.webp +0 -0
  28. package/templates/artpacks/kCz/pattern1_600px.webp +0 -0
  29. package/templates/artpacks/kCz/pattern2_1080px.webp +0 -0
  30. package/templates/artpacks/kCz/pattern2_1920px.webp +0 -0
  31. package/templates/artpacks/kCz/pattern2_600px.webp +0 -0
  32. package/templates/artpacks/kCz/skindrips_1080px.webp +0 -0
  33. package/templates/artpacks/kCz/skindrips_1920px.webp +0 -0
  34. package/templates/artpacks/kCz/skindrips_600px.webp +0 -0
  35. package/templates/artpacks/kCz/slimetime_1080px.webp +0 -0
  36. package/templates/artpacks/kCz/slimetime_1920px.webp +0 -0
  37. package/templates/artpacks/kCz/slimetime_600px.webp +0 -0
  38. package/templates/artpacks/kCz/snake_1080px.webp +0 -0
  39. package/templates/artpacks/kCz/snake_1920px.webp +0 -0
  40. package/templates/artpacks/kCz/snake_600px.webp +0 -0
  41. package/templates/artpacks/kCz/toxicshock_1080px.webp +0 -0
  42. package/templates/artpacks/kCz/toxicshock_1920px.webp +0 -0
  43. package/templates/artpacks/kCz/toxicshock_600px.webp +0 -0
  44. package/templates/artpacks/kCz/tractstack_1080px.webp +0 -0
  45. package/templates/artpacks/kCz/tractstack_1920px.webp +0 -0
  46. package/templates/artpacks/kCz/tractstack_600px.webp +0 -0
  47. package/templates/artpacks/kCz/tripdrips_1080px.webp +0 -0
  48. package/templates/artpacks/kCz/tripdrips_1920px.webp +0 -0
  49. package/templates/artpacks/kCz/tripdrips_600px.webp +0 -0
  50. package/templates/artpacks/kCz/wavedrips_1080px.webp +0 -0
  51. package/templates/artpacks/kCz/wavedrips_1920px.webp +0 -0
  52. package/templates/artpacks/kCz/wavedrips_600px.webp +0 -0
  53. package/templates/artpacks/t8k/beach_1080px.webp +0 -0
  54. package/templates/artpacks/t8k/beach_1920px.webp +0 -0
  55. package/templates/artpacks/t8k/beach_600px.webp +0 -0
  56. package/templates/artpacks/t8k/blast_1080px.webp +0 -0
  57. package/templates/artpacks/t8k/blast_1920px.webp +0 -0
  58. package/templates/artpacks/t8k/blast_600px.webp +0 -0
  59. package/templates/artpacks/t8k/bokeh_1080px.webp +0 -0
  60. package/templates/artpacks/t8k/bokeh_1920px.webp +0 -0
  61. package/templates/artpacks/t8k/bokeh_600px.webp +0 -0
  62. package/templates/artpacks/t8k/cartoon_1080px.webp +0 -0
  63. package/templates/artpacks/t8k/cartoon_1920px.webp +0 -0
  64. package/templates/artpacks/t8k/cartoon_600px.webp +0 -0
  65. package/templates/artpacks/t8k/darkeggshell_1080px.webp +0 -0
  66. package/templates/artpacks/t8k/darkeggshell_1920px.webp +0 -0
  67. package/templates/artpacks/t8k/darkeggshell_600px.webp +0 -0
  68. package/templates/artpacks/t8k/explosion_1080px.webp +0 -0
  69. package/templates/artpacks/t8k/explosion_1920px.webp +0 -0
  70. package/templates/artpacks/t8k/explosion_600px.webp +0 -0
  71. package/templates/artpacks/t8k/floral_1080px.webp +0 -0
  72. package/templates/artpacks/t8k/floral_1920px.webp +0 -0
  73. package/templates/artpacks/t8k/floral_600px.webp +0 -0
  74. package/templates/artpacks/t8k/flower_1080px.webp +0 -0
  75. package/templates/artpacks/t8k/flower_1920px.webp +0 -0
  76. package/templates/artpacks/t8k/flower_600px.webp +0 -0
  77. package/templates/artpacks/t8k/foliage_1080px.webp +0 -0
  78. package/templates/artpacks/t8k/foliage_1920px.webp +0 -0
  79. package/templates/artpacks/t8k/foliage_600px.webp +0 -0
  80. package/templates/artpacks/t8k/mist_1080px.webp +0 -0
  81. package/templates/artpacks/t8k/mist_1920px.webp +0 -0
  82. package/templates/artpacks/t8k/mist_600px.webp +0 -0
  83. package/templates/artpacks/t8k/portal_1080px.webp +0 -0
  84. package/templates/artpacks/t8k/portal_1920px.webp +0 -0
  85. package/templates/artpacks/t8k/portal_600px.webp +0 -0
  86. package/templates/artpacks/t8k/storytime_1080px.webp +0 -0
  87. package/templates/artpacks/t8k/storytime_1920px.webp +0 -0
  88. package/templates/artpacks/t8k/storytime_600px.webp +0 -0
  89. package/templates/artpacks/t8k/tacky_1080px.webp +0 -0
  90. package/templates/artpacks/t8k/tacky_1920px.webp +0 -0
  91. package/templates/artpacks/t8k/tacky_600px.webp +0 -0
  92. package/templates/artpacks/t8k/wallpaper_1080px.webp +0 -0
  93. package/templates/artpacks/t8k/wallpaper_1920px.webp +0 -0
  94. package/templates/artpacks/t8k/wallpaper_600px.webp +0 -0
  95. package/templates/brand/favicon.ico +0 -0
  96. package/templates/brand/logo.svg +19 -0
  97. package/templates/brand/static.jpg +0 -0
  98. package/templates/brand/wordmark.svg +4 -0
  99. package/templates/css/custom.css +51 -0
  100. package/templates/css/frontend.css +3519 -0
  101. package/templates/css/storykeep.css +92872 -0
  102. package/templates/custom/minimal/CodeHook.astro +53 -0
  103. package/templates/custom/minimal/CustomRoutes.astro +46 -0
  104. package/templates/custom/with-examples/CodeHook.astro +49 -0
  105. package/templates/custom/with-examples/CustomHero.astro +13 -0
  106. package/templates/custom/with-examples/CustomRoutes.astro +39 -0
  107. package/templates/custom/with-examples/pages/Collections.astro +110 -0
  108. package/templates/env.example +8 -0
  109. package/templates/fonts/Inter-Black.woff2 +0 -0
  110. package/templates/fonts/Inter-Bold.woff2 +0 -0
  111. package/templates/fonts/Inter-Regular.woff2 +0 -0
  112. package/templates/icons/h2.svg +1 -0
  113. package/templates/icons/h3.svg +1 -0
  114. package/templates/icons/h4.svg +1 -0
  115. package/templates/icons/h5.svg +1 -0
  116. package/templates/icons/image.svg +7 -0
  117. package/templates/icons/text.svg +6 -0
  118. package/templates/socials/codepen.svg +1 -0
  119. package/templates/socials/discord.svg +1 -0
  120. package/templates/socials/facebook.svg +1 -0
  121. package/templates/socials/github.svg +1 -0
  122. package/templates/socials/instagram.svg +1 -0
  123. package/templates/socials/linkedin.svg +1 -0
  124. package/templates/socials/mail.svg +1 -0
  125. package/templates/socials/rumble.svg +1 -0
  126. package/templates/socials/tiktok.svg +1 -0
  127. package/templates/socials/twitch.svg +1 -0
  128. package/templates/socials/twitter.svg +1 -0
  129. package/templates/socials/x.svg +1 -0
  130. package/templates/socials/youtube.svg +1 -0
  131. package/templates/src/client/analytics-events.ts +213 -0
  132. package/templates/src/client/belief-events.ts +205 -0
  133. package/templates/src/client/sse.ts +667 -0
  134. package/templates/src/components/Footer.astro +246 -0
  135. package/templates/src/components/Fragment.astro +70 -0
  136. package/templates/src/components/Header.astro +458 -0
  137. package/templates/src/components/Menu.tsx +196 -0
  138. package/templates/src/components/codehooks/BunnyVideoSetup.tsx +692 -0
  139. package/templates/src/components/codehooks/BunnyVideoWrapper.astro +78 -0
  140. package/templates/src/components/codehooks/EpinetDurationSelector.tsx +1020 -0
  141. package/templates/src/components/codehooks/EpinetTableView.tsx +594 -0
  142. package/templates/src/components/codehooks/EpinetWrapper.tsx +424 -0
  143. package/templates/src/components/codehooks/FeaturedContent.astro +273 -0
  144. package/templates/src/components/codehooks/FeaturedContentSetup.tsx +738 -0
  145. package/templates/src/components/codehooks/ListContent.astro +460 -0
  146. package/templates/src/components/codehooks/ListContentSetup.tsx +649 -0
  147. package/templates/src/components/codehooks/SankeyDiagram.tsx +359 -0
  148. package/templates/src/components/compositor/Compositor.tsx +144 -0
  149. package/templates/src/components/compositor/Node.tsx +415 -0
  150. package/templates/src/components/compositor/NodeWithGuid.tsx +25 -0
  151. package/templates/src/components/compositor/PanelVisibilityWrapper.tsx +87 -0
  152. package/templates/src/components/compositor/elements/Belief.tsx +148 -0
  153. package/templates/src/components/compositor/elements/BgImage.tsx +118 -0
  154. package/templates/src/components/compositor/elements/BgVisualBreak.tsx +102 -0
  155. package/templates/src/components/compositor/elements/BunnyVideo.tsx +63 -0
  156. package/templates/src/components/compositor/elements/IdentifyAs.tsx +66 -0
  157. package/templates/src/components/compositor/elements/PlayButton.tsx +19 -0
  158. package/templates/src/components/compositor/elements/SignUp.tsx +179 -0
  159. package/templates/src/components/compositor/elements/Svg.tsx +33 -0
  160. package/templates/src/components/compositor/elements/ToggleBelief.tsx +36 -0
  161. package/templates/src/components/compositor/elements/YouTubeWrapper.tsx +33 -0
  162. package/templates/src/components/compositor/nodes/BgPaneWrapper.tsx +35 -0
  163. package/templates/src/components/compositor/nodes/GhostInsertBlock.tsx +189 -0
  164. package/templates/src/components/compositor/nodes/Markdown.tsx +179 -0
  165. package/templates/src/components/compositor/nodes/Pane.tsx +277 -0
  166. package/templates/src/components/compositor/nodes/Pane_eraser.tsx +69 -0
  167. package/templates/src/components/compositor/nodes/Pane_layout.tsx +77 -0
  168. package/templates/src/components/compositor/nodes/RenderChildren.tsx +19 -0
  169. package/templates/src/components/compositor/nodes/StoryFragment.tsx +35 -0
  170. package/templates/src/components/compositor/nodes/TagElement.tsx +14 -0
  171. package/templates/src/components/compositor/nodes/Widget.tsx +115 -0
  172. package/templates/src/components/compositor/nodes/tagElements/NodeA.tsx +4 -0
  173. package/templates/src/components/compositor/nodes/tagElements/NodeA_eraser.tsx +26 -0
  174. package/templates/src/components/compositor/nodes/tagElements/NodeAnchorComponent.tsx +248 -0
  175. package/templates/src/components/compositor/nodes/tagElements/NodeBasicTag.tsx +684 -0
  176. package/templates/src/components/compositor/nodes/tagElements/NodeBasicTag_eraser.tsx +62 -0
  177. package/templates/src/components/compositor/nodes/tagElements/NodeBasicTag_insert.tsx +120 -0
  178. package/templates/src/components/compositor/nodes/tagElements/NodeBasicTag_settings.tsx +62 -0
  179. package/templates/src/components/compositor/nodes/tagElements/NodeButton.tsx +5 -0
  180. package/templates/src/components/compositor/nodes/tagElements/NodeButton_eraser.tsx +26 -0
  181. package/templates/src/components/compositor/nodes/tagElements/NodeImg.tsx +28 -0
  182. package/templates/src/components/compositor/nodes/tagElements/NodeText.tsx +18 -0
  183. package/templates/src/components/compositor/nodes/tagElements/TabIndicator.tsx +51 -0
  184. package/templates/src/components/compositor/preview/FeaturedContentPreview.tsx +128 -0
  185. package/templates/src/components/compositor/preview/ListContentPreview.tsx +213 -0
  186. package/templates/src/components/compositor/preview/OgImagePreview.tsx +223 -0
  187. package/templates/src/components/compositor/preview/PaneSnapshotGenerator.tsx +199 -0
  188. package/templates/src/components/compositor/preview/PanesPreviewGenerator.tsx +123 -0
  189. package/templates/src/components/compositor/preview/VisualBreakPreview.tsx +154 -0
  190. package/templates/src/components/edit/Header.tsx +181 -0
  191. package/templates/src/components/edit/PanelSwitch.tsx +446 -0
  192. package/templates/src/components/edit/SettingsPanel.tsx +70 -0
  193. package/templates/src/components/edit/ToolBar.tsx +101 -0
  194. package/templates/src/components/edit/ToolMode.tsx +121 -0
  195. package/templates/src/components/edit/context/ContextPaneConfig.tsx +91 -0
  196. package/templates/src/components/edit/context/ContextPaneConfig_slug.tsx +174 -0
  197. package/templates/src/components/edit/context/ContextPaneConfig_title.tsx +186 -0
  198. package/templates/src/components/edit/pane/AddPanePanel.tsx +136 -0
  199. package/templates/src/components/edit/pane/AddPanePanel_break.tsx +470 -0
  200. package/templates/src/components/edit/pane/AddPanePanel_codehook.tsx +264 -0
  201. package/templates/src/components/edit/pane/AddPanePanel_new.tsx +623 -0
  202. package/templates/src/components/edit/pane/AddPanePanel_newAICopy.tsx +107 -0
  203. package/templates/src/components/edit/pane/AddPanePanel_newAICopy_modal.tsx +217 -0
  204. package/templates/src/components/edit/pane/AddPanePanel_newCopyMode.tsx +109 -0
  205. package/templates/src/components/edit/pane/AddPanePanel_newCustomCopy.tsx +39 -0
  206. package/templates/src/components/edit/pane/AddPanePanel_reuse.tsx +445 -0
  207. package/templates/src/components/edit/pane/ConfigPanePanel.tsx +245 -0
  208. package/templates/src/components/edit/pane/PageGen.tsx +485 -0
  209. package/templates/src/components/edit/pane/PageGenSelector.tsx +238 -0
  210. package/templates/src/components/edit/pane/PageGenSpecial.tsx +362 -0
  211. package/templates/src/components/edit/pane/PageGen_preview.tsx +495 -0
  212. package/templates/src/components/edit/pane/PanePanel_impression.tsx +258 -0
  213. package/templates/src/components/edit/pane/PanePanel_path.tsx +268 -0
  214. package/templates/src/components/edit/pane/PanePanel_slug.tsx +219 -0
  215. package/templates/src/components/edit/pane/PanePanel_title.tsx +142 -0
  216. package/templates/src/components/edit/panels/StyleBreakPanel.tsx +182 -0
  217. package/templates/src/components/edit/panels/StyleCodeHookPanel.tsx +439 -0
  218. package/templates/src/components/edit/panels/StyleElementPanel.tsx +177 -0
  219. package/templates/src/components/edit/panels/StyleElementPanel_add.tsx +349 -0
  220. package/templates/src/components/edit/panels/StyleElementPanel_remove.tsx +159 -0
  221. package/templates/src/components/edit/panels/StyleElementPanel_update.tsx +320 -0
  222. package/templates/src/components/edit/panels/StyleImagePanel.tsx +460 -0
  223. package/templates/src/components/edit/panels/StyleImagePanel_add.tsx +296 -0
  224. package/templates/src/components/edit/panels/StyleImagePanel_remove.tsx +153 -0
  225. package/templates/src/components/edit/panels/StyleImagePanel_update.tsx +312 -0
  226. package/templates/src/components/edit/panels/StyleLiElementPanel.tsx +273 -0
  227. package/templates/src/components/edit/panels/StyleLiElementPanel_add.tsx +301 -0
  228. package/templates/src/components/edit/panels/StyleLiElementPanel_remove.tsx +132 -0
  229. package/templates/src/components/edit/panels/StyleLiElementPanel_update.tsx +313 -0
  230. package/templates/src/components/edit/panels/StyleLinkPanel.tsx +346 -0
  231. package/templates/src/components/edit/panels/StyleLinkPanel_add.tsx +265 -0
  232. package/templates/src/components/edit/panels/StyleLinkPanel_config.tsx +240 -0
  233. package/templates/src/components/edit/panels/StyleLinkPanel_remove.tsx +94 -0
  234. package/templates/src/components/edit/panels/StyleLinkPanel_update.tsx +110 -0
  235. package/templates/src/components/edit/panels/StyleParentPanel.tsx +263 -0
  236. package/templates/src/components/edit/panels/StyleParentPanel_add.tsx +275 -0
  237. package/templates/src/components/edit/panels/StyleParentPanel_deleteLayer.tsx +112 -0
  238. package/templates/src/components/edit/panels/StyleParentPanel_remove.tsx +87 -0
  239. package/templates/src/components/edit/panels/StyleParentPanel_update.tsx +141 -0
  240. package/templates/src/components/edit/panels/StyleWidgetPanel.tsx +428 -0
  241. package/templates/src/components/edit/panels/StyleWidgetPanel_add.tsx +292 -0
  242. package/templates/src/components/edit/panels/StyleWidgetPanel_config.tsx +190 -0
  243. package/templates/src/components/edit/panels/StyleWidgetPanel_remove.tsx +152 -0
  244. package/templates/src/components/edit/panels/StyleWidgetPanel_update.tsx +308 -0
  245. package/templates/src/components/edit/state/SaveModal.tsx +811 -0
  246. package/templates/src/components/edit/state/StylesMemory.tsx +310 -0
  247. package/templates/src/components/edit/storyfragment/StoryFragmentConfigPanel.tsx +289 -0
  248. package/templates/src/components/edit/storyfragment/StoryFragmentPanel_menu.tsx +320 -0
  249. package/templates/src/components/edit/storyfragment/StoryFragmentPanel_og.tsx +888 -0
  250. package/templates/src/components/edit/storyfragment/StoryFragmentPanel_slug.tsx +269 -0
  251. package/templates/src/components/edit/storyfragment/StoryFragmentPanel_title.tsx +190 -0
  252. package/templates/src/components/edit/widgets/BeliefWidget.tsx +183 -0
  253. package/templates/src/components/edit/widgets/BunnyWidget.tsx +134 -0
  254. package/templates/src/components/edit/widgets/IdentifyAsWidget.tsx +193 -0
  255. package/templates/src/components/edit/widgets/SignupWidget.tsx +177 -0
  256. package/templates/src/components/edit/widgets/ToggleWidget.tsx +152 -0
  257. package/templates/src/components/edit/widgets/YouTubeWidget.tsx +65 -0
  258. package/templates/src/components/fields/ActionBuilderTimeSelector.tsx +353 -0
  259. package/templates/src/components/fields/ArtpackImage.tsx +480 -0
  260. package/templates/src/components/fields/BackgroundImage.tsx +530 -0
  261. package/templates/src/components/fields/BackgroundImageWrapper.tsx +192 -0
  262. package/templates/src/components/fields/BooleanParam.tsx +67 -0
  263. package/templates/src/components/fields/BunnyMomentSelector.tsx +56 -0
  264. package/templates/src/components/fields/ColorPickerCombo.tsx +284 -0
  265. package/templates/src/components/fields/ImageUpload.tsx +405 -0
  266. package/templates/src/components/fields/MultiParam.tsx +75 -0
  267. package/templates/src/components/fields/PaneBreakCollectionSelector.tsx +97 -0
  268. package/templates/src/components/fields/PaneBreakShapeSelector.tsx +134 -0
  269. package/templates/src/components/fields/SelectedTailwindClass.tsx +44 -0
  270. package/templates/src/components/fields/SingleParam.tsx +73 -0
  271. package/templates/src/components/fields/ViewportComboBox.tsx +252 -0
  272. package/templates/src/components/form/ActionBuilderField.tsx +282 -0
  273. package/templates/src/components/form/ActionBuilderSlugSelector.tsx +182 -0
  274. package/templates/src/components/form/BooleanToggle.tsx +94 -0
  275. package/templates/src/components/form/ColorPicker.tsx +153 -0
  276. package/templates/src/components/form/DateTimeInput.tsx +638 -0
  277. package/templates/src/components/form/EnumSelect.tsx +88 -0
  278. package/templates/src/components/form/FileUpload.tsx +465 -0
  279. package/templates/src/components/form/MagicPathBuilder.tsx +546 -0
  280. package/templates/src/components/form/NumberInput.tsx +101 -0
  281. package/templates/src/components/form/ParagraphArrayInput.tsx +207 -0
  282. package/templates/src/components/form/StringArrayInput.tsx +163 -0
  283. package/templates/src/components/form/StringInput.tsx +88 -0
  284. package/templates/src/components/form/UnsavedChangesBar.tsx +295 -0
  285. package/templates/src/components/form/advanced/APIConfigSection.tsx +69 -0
  286. package/templates/src/components/form/advanced/AuthConfigSection.tsx +97 -0
  287. package/templates/src/components/form/brand/BrandAssetsSection.tsx +93 -0
  288. package/templates/src/components/form/brand/BrandColorsSection.tsx +201 -0
  289. package/templates/src/components/form/brand/SEOSection.tsx +101 -0
  290. package/templates/src/components/form/brand/SiteConfigSection.tsx +61 -0
  291. package/templates/src/components/form/brand/SocialLinksSection.tsx +393 -0
  292. package/templates/src/components/profile/ProfileConsent.tsx +65 -0
  293. package/templates/src/components/profile/ProfileCreate.tsx +462 -0
  294. package/templates/src/components/profile/ProfileEdit.tsx +409 -0
  295. package/templates/src/components/profile/ProfileSwitch.tsx +255 -0
  296. package/templates/src/components/profile/ProfileUnlock.tsx +221 -0
  297. package/templates/src/components/storykeep/Dashboard.tsx +160 -0
  298. package/templates/src/components/storykeep/Dashboard_Activity.tsx +56 -0
  299. package/templates/src/components/storykeep/Dashboard_Advanced.tsx +165 -0
  300. package/templates/src/components/storykeep/Dashboard_Analytics.tsx +451 -0
  301. package/templates/src/components/storykeep/Dashboard_Branding.tsx +95 -0
  302. package/templates/src/components/storykeep/Dashboard_Content.tsx +191 -0
  303. package/templates/src/components/storykeep/controls/UsageCell.tsx +71 -0
  304. package/templates/src/components/storykeep/controls/content/BeliefForm.tsx +378 -0
  305. package/templates/src/components/storykeep/controls/content/BeliefTable.tsx +329 -0
  306. package/templates/src/components/storykeep/controls/content/ContentBrowser.tsx +385 -0
  307. package/templates/src/components/storykeep/controls/content/ContentSummary.tsx +149 -0
  308. package/templates/src/components/storykeep/controls/content/KnownResourceForm.tsx +397 -0
  309. package/templates/src/components/storykeep/controls/content/KnownResourceTable.tsx +260 -0
  310. package/templates/src/components/storykeep/controls/content/ManageContent.tsx +439 -0
  311. package/templates/src/components/storykeep/controls/content/MenuForm.tsx +239 -0
  312. package/templates/src/components/storykeep/controls/content/MenuTable.tsx +332 -0
  313. package/templates/src/components/storykeep/controls/content/ResourceBulkIngest.tsx +724 -0
  314. package/templates/src/components/storykeep/controls/content/ResourceForm.tsx +355 -0
  315. package/templates/src/components/storykeep/controls/content/ResourceTable.tsx +222 -0
  316. package/templates/src/components/storykeep/controls/content/StoryFragmentTable.tsx +482 -0
  317. package/templates/src/components/storykeep/state/BrandingWrapper.tsx +42 -0
  318. package/templates/src/components/storykeep/state/FetchAnalytics.tsx +350 -0
  319. package/templates/src/components/storykeep/widgets/ResponsiveLine.tsx +319 -0
  320. package/templates/src/components/storykeep/widgets/Wizard.tsx +278 -0
  321. package/templates/src/components/tenant/RegistrationForm.tsx +447 -0
  322. package/templates/src/components/widgets/BunnyVideoHero.astro +775 -0
  323. package/templates/src/components/widgets/Impression.tsx +102 -0
  324. package/templates/src/components/widgets/ImpressionWrapper.tsx +214 -0
  325. package/templates/src/constants/beliefs.ts +61 -0
  326. package/templates/src/constants/brandThemes.ts +133 -0
  327. package/templates/src/constants/prompts.json +55 -0
  328. package/templates/src/constants/shapes.ts +556 -0
  329. package/templates/src/constants/stopWords.ts +116 -0
  330. package/templates/src/constants/tailwindColors.json +344 -0
  331. package/templates/src/constants.ts +274 -0
  332. package/templates/src/hooks/useFormState.ts +203 -0
  333. package/templates/src/layouts/Layout.astro +290 -0
  334. package/templates/src/lib/session.ts +126 -0
  335. package/templates/src/lib/storyData.ts +56 -0
  336. package/templates/src/middleware.ts +52 -0
  337. package/templates/src/pages/404.astro +54 -0
  338. package/templates/src/pages/[...slug]/edit.astro +216 -0
  339. package/templates/src/pages/[...slug].astro +148 -0
  340. package/templates/src/pages/api/auth/decode.ts +101 -0
  341. package/templates/src/pages/api/auth/login.ts +122 -0
  342. package/templates/src/pages/api/auth/logout.ts +37 -0
  343. package/templates/src/pages/api/auth/profile.ts +76 -0
  344. package/templates/src/pages/api/orphan-analysis.ts +106 -0
  345. package/templates/src/pages/api/tailwind.ts +116 -0
  346. package/templates/src/pages/collections/[param1].astro +65 -0
  347. package/templates/src/pages/context/[...contextSlug]/edit.astro +207 -0
  348. package/templates/src/pages/context/[...contextSlug].astro +161 -0
  349. package/templates/src/pages/llms.txt.ts +122 -0
  350. package/templates/src/pages/maint.astro +183 -0
  351. package/templates/src/pages/media/[...slug].astro +67 -0
  352. package/templates/src/pages/robots.txt.ts +36 -0
  353. package/templates/src/pages/sandbox/activate.astro +258 -0
  354. package/templates/src/pages/sandbox/register.astro +44 -0
  355. package/templates/src/pages/sandbox/success.astro +179 -0
  356. package/templates/src/pages/sitemap.xml.ts +119 -0
  357. package/templates/src/pages/storykeep/advanced.astro +69 -0
  358. package/templates/src/pages/storykeep/branding.astro +57 -0
  359. package/templates/src/pages/storykeep/content.astro +71 -0
  360. package/templates/src/pages/storykeep/init.astro +36 -0
  361. package/templates/src/pages/storykeep/login.astro +266 -0
  362. package/templates/src/pages/storykeep/logout.astro +84 -0
  363. package/templates/src/pages/storykeep/profile.astro +98 -0
  364. package/templates/src/pages/storykeep.astro +81 -0
  365. package/templates/src/stores/analytics.ts +171 -0
  366. package/templates/src/stores/backend.ts +16 -0
  367. package/templates/src/stores/navigation.ts +149 -0
  368. package/templates/src/stores/nodes.ts +2390 -0
  369. package/templates/src/stores/nodesHistory.ts +85 -0
  370. package/templates/src/stores/notificationSystem.ts +41 -0
  371. package/templates/src/stores/orphanAnalysis.ts +409 -0
  372. package/templates/src/stores/storykeep.ts +247 -0
  373. package/templates/src/types/astro.ts +86 -0
  374. package/templates/src/types/compositorTypes.ts +456 -0
  375. package/templates/src/types/formTypes.ts +281 -0
  376. package/templates/src/types/multiTenant.ts +77 -0
  377. package/templates/src/types/nodeProps.ts +66 -0
  378. package/templates/src/types/tractstack.ts +445 -0
  379. package/templates/src/utils/aai/getTitleSlug.ts +72 -0
  380. package/templates/src/utils/actions/actionButton.ts +101 -0
  381. package/templates/src/utils/actions/lispLexer.ts +57 -0
  382. package/templates/src/utils/actions/preParse_Action.ts +85 -0
  383. package/templates/src/utils/actions/preParse_Bunny.ts +50 -0
  384. package/templates/src/utils/actions/preParse_Clicked.ts +87 -0
  385. package/templates/src/utils/actions/preParse_Impression.ts +71 -0
  386. package/templates/src/utils/api/advancedConfig.ts +66 -0
  387. package/templates/src/utils/api/advancedHelpers.ts +134 -0
  388. package/templates/src/utils/api/beliefConfig.ts +87 -0
  389. package/templates/src/utils/api/beliefHelpers.ts +196 -0
  390. package/templates/src/utils/api/brandConfig.ts +126 -0
  391. package/templates/src/utils/api/brandHelpers.ts +155 -0
  392. package/templates/src/utils/api/fileHelpers.ts +306 -0
  393. package/templates/src/utils/api/menuConfig.ts +57 -0
  394. package/templates/src/utils/api/menuHelpers.ts +156 -0
  395. package/templates/src/utils/api/resourceConfig.ts +158 -0
  396. package/templates/src/utils/api/resourceHelpers.ts +72 -0
  397. package/templates/src/utils/api/tenantConfig.ts +97 -0
  398. package/templates/src/utils/api/tenantHelpers.ts +172 -0
  399. package/templates/src/utils/api.ts +183 -0
  400. package/templates/src/utils/auth.ts +150 -0
  401. package/templates/src/utils/backend.ts +243 -0
  402. package/templates/src/utils/compositor/TemplateMarkdowns.ts +118 -0
  403. package/templates/src/utils/compositor/TemplateNodes.ts +138 -0
  404. package/templates/src/utils/compositor/TemplatePanes.ts +100 -0
  405. package/templates/src/utils/compositor/allowInsert.ts +100 -0
  406. package/templates/src/utils/compositor/domHelpers.ts +37 -0
  407. package/templates/src/utils/compositor/handleClickEvent.ts +131 -0
  408. package/templates/src/utils/compositor/nodesHelper.ts +491 -0
  409. package/templates/src/utils/compositor/nodesMarkdownGenerator.ts +292 -0
  410. package/templates/src/utils/compositor/processMarkdown.ts +431 -0
  411. package/templates/src/utils/compositor/reduceNodesClassNames.ts +192 -0
  412. package/templates/src/utils/compositor/tailwindClasses.ts +1795 -0
  413. package/templates/src/utils/compositor/tailwindColors.ts +227 -0
  414. package/templates/src/utils/compositor/templateMarkdownStyles.ts +1265 -0
  415. package/templates/src/utils/compositor/typeGuards.ts +193 -0
  416. package/templates/src/utils/etl/extractor.ts +119 -0
  417. package/templates/src/utils/etl/index.ts +88 -0
  418. package/templates/src/utils/etl/loader.ts +36 -0
  419. package/templates/src/utils/etl/transformer.ts +286 -0
  420. package/templates/src/utils/helpers.ts +435 -0
  421. package/templates/src/utils/layout.ts +209 -0
  422. package/templates/src/utils/profileStorage.ts +306 -0
  423. package/templates/src/utils/useInterval.ts +27 -0
  424. package/templates/tailwind.config.cjs +169 -0
  425. package/utils/create-resolver.ts +10 -0
  426. package/utils/inject-files.ts +2140 -0
  427. package/utils/validate-config.ts +43 -0
@@ -0,0 +1,482 @@
1
+ import { useState, useMemo, useEffect } from 'react';
2
+ import { useStore } from '@nanostores/react';
3
+ import PencilIcon from '@heroicons/react/24/outline/PencilIcon';
4
+ import TrashIcon from '@heroicons/react/24/outline/TrashIcon';
5
+ import { classNames } from '@/utils/helpers';
6
+ import {
7
+ orphanAnalysisStore,
8
+ loadOrphanAnalysis,
9
+ } from '@/stores/orphanAnalysis';
10
+ import UsageCell from '../UsageCell';
11
+ import type { FullContentMapItem } from '@/types/tractstack';
12
+
13
+ interface StoryFragmentTableProps {
14
+ fullContentMap: FullContentMapItem[];
15
+ homeSlug: string;
16
+ }
17
+
18
+ const StoryFragmentTable = ({
19
+ fullContentMap,
20
+ homeSlug,
21
+ }: StoryFragmentTableProps) => {
22
+ const [isLoading, setIsLoading] = useState(false);
23
+ const [currentPage, setCurrentPage] = useState(1);
24
+ const [searchTerm, setSearchTerm] = useState('');
25
+
26
+ const itemsPerPage = 20;
27
+
28
+ // Helper function to get status display
29
+ const getStatus = (item: FullContentMapItem): string => {
30
+ if (item.slug === homeSlug) return 'Home';
31
+ return 'Published'; // Assuming all fragments are published for now
32
+ };
33
+
34
+ // Subscribe to orphan analysis store
35
+ const orphanState = useStore(orphanAnalysisStore);
36
+
37
+ // Load orphan analysis on component mount
38
+ useEffect(() => {
39
+ loadOrphanAnalysis();
40
+ }, []);
41
+
42
+ // Filter story fragments from fullContentMap
43
+ const storyFragments = useMemo(() => {
44
+ return fullContentMap.filter((item) => item.type === 'StoryFragment');
45
+ }, [fullContentMap]);
46
+
47
+ // Apply search filter
48
+ const filteredFragments = useMemo(() => {
49
+ if (!searchTerm.trim()) return storyFragments;
50
+
51
+ const search = searchTerm.toLowerCase();
52
+ return storyFragments.filter(
53
+ (item) =>
54
+ item.title.toLowerCase().includes(search) ||
55
+ item.slug.toLowerCase().includes(search)
56
+ );
57
+ }, [storyFragments, searchTerm]);
58
+
59
+ // Calculate pagination
60
+ const totalPages = Math.ceil(filteredFragments.length / itemsPerPage);
61
+ const startIndex = (currentPage - 1) * itemsPerPage;
62
+ const paginatedFragments = filteredFragments.slice(
63
+ startIndex,
64
+ startIndex + itemsPerPage
65
+ );
66
+
67
+ // Helper function to get usage information
68
+ const getUsageInfo = (storyFragmentId: string): string[] => {
69
+ if (!orphanState?.data || !orphanState.data.storyFragments) {
70
+ return [];
71
+ }
72
+ return orphanState.data.storyFragments[storyFragmentId] || [];
73
+ };
74
+
75
+ // Helper function to check if delete should be disabled
76
+ const shouldDisableDelete = (item: FullContentMapItem): boolean => {
77
+ // ALWAYS disable if orphan analysis is not complete
78
+ if (
79
+ !orphanState ||
80
+ !orphanState.data ||
81
+ !orphanState.data.storyFragments ||
82
+ orphanState.isLoading ||
83
+ orphanState.data.status !== 'complete'
84
+ ) {
85
+ return true;
86
+ }
87
+
88
+ // Disable if item is home page
89
+ if (item.slug === homeSlug) {
90
+ return true;
91
+ }
92
+
93
+ // Disable if item has usage dependencies
94
+ const usage = getUsageInfo(item.id);
95
+ return usage.length > 0;
96
+ };
97
+
98
+ // Helper function to get delete tooltip
99
+ const getDeleteTooltip = (item: FullContentMapItem): string => {
100
+ if (
101
+ !orphanState ||
102
+ !orphanState.data ||
103
+ !orphanState.data.storyFragments ||
104
+ orphanState.isLoading ||
105
+ orphanState.data.status !== 'complete'
106
+ ) {
107
+ return 'Loading usage analysis...';
108
+ }
109
+
110
+ if (item.slug === homeSlug) {
111
+ return 'Cannot delete the home page';
112
+ }
113
+
114
+ const usage = getUsageInfo(item.id);
115
+ if (usage.length > 0) {
116
+ return `Cannot delete: story fragment has ${usage.length} dependent(s)`;
117
+ }
118
+
119
+ return 'Delete story fragment';
120
+ };
121
+
122
+ // Handle page change
123
+ const handlePageChange = (page: number) => {
124
+ if (page >= 1 && page <= totalPages) {
125
+ setCurrentPage(page);
126
+ }
127
+ };
128
+
129
+ // Handle delete story fragment
130
+ const handleDelete = async (id: string, title: string) => {
131
+ if (
132
+ !confirm(
133
+ `Are you sure you want to delete "${title}"? This action cannot be undone.`
134
+ )
135
+ ) {
136
+ return;
137
+ }
138
+
139
+ setIsLoading(true);
140
+ try {
141
+ const response = await fetch(`/api/storyfragments/${id}`, {
142
+ method: 'DELETE',
143
+ headers: {
144
+ 'Content-Type': 'application/json',
145
+ },
146
+ });
147
+
148
+ if (!response.ok) {
149
+ throw new Error('Failed to delete story fragment');
150
+ }
151
+
152
+ // Reload the page to refresh the data
153
+ window.location.reload();
154
+ } catch (error) {
155
+ console.error('Delete failed:', error);
156
+ alert('Failed to delete story fragment. Please try again.');
157
+ } finally {
158
+ setIsLoading(false);
159
+ }
160
+ };
161
+
162
+ return (
163
+ <div className="space-y-6">
164
+ {/* Header */}
165
+ <div className="flex items-center justify-between">
166
+ <div>
167
+ <h2 className="text-2xl font-bold text-gray-900">Story Fragments</h2>
168
+ <p className="mt-1 text-sm text-gray-600">
169
+ Manage pages and content on your site
170
+ </p>
171
+ </div>
172
+ <a
173
+ href="/create/edit"
174
+ className="flex items-center rounded-md border border-transparent bg-cyan-700 px-4 py-2 text-sm font-bold text-white hover:bg-cyan-800 focus:outline-none focus:ring-2 focus:ring-cyan-500"
175
+ >
176
+ <svg
177
+ className="mr-2 h-4 w-4"
178
+ fill="none"
179
+ stroke="currentColor"
180
+ viewBox="0 0 24 24"
181
+ >
182
+ <path
183
+ strokeLinecap="round"
184
+ strokeLinejoin="round"
185
+ strokeWidth={2}
186
+ d="M12 4v16m8-8H4"
187
+ />
188
+ </svg>
189
+ Create Story Fragment
190
+ </a>
191
+ </div>
192
+
193
+ {/* Search */}
194
+ <div className="max-w-md">
195
+ <input
196
+ type="text"
197
+ placeholder="Search story fragments..."
198
+ value={searchTerm}
199
+ onChange={(e) => setSearchTerm(e.target.value)}
200
+ className="w-full rounded-md border border-gray-300 px-3 py-2 shadow-sm focus:border-cyan-700 focus:ring-cyan-700"
201
+ />
202
+ </div>
203
+
204
+ {/* Table Container */}
205
+ <div className="overflow-hidden rounded-lg border border-gray-200 bg-white shadow">
206
+ {filteredFragments.length === 0 ? (
207
+ <div className="px-6 py-12 text-center">
208
+ <svg
209
+ className="mx-auto h-12 w-12 text-gray-400"
210
+ fill="none"
211
+ stroke="currentColor"
212
+ viewBox="0 0 24 24"
213
+ >
214
+ <path
215
+ strokeLinecap="round"
216
+ strokeLinejoin="round"
217
+ strokeWidth={1}
218
+ d="M9 5H7a2 2 0 00-2 2v10a2 2 0 002 2h8a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"
219
+ />
220
+ </svg>
221
+ <h3 className="mt-2 text-sm font-bold text-gray-900">
222
+ {searchTerm
223
+ ? 'No matching story fragments found'
224
+ : 'No story fragments'}
225
+ </h3>
226
+ <p className="mt-1 text-sm text-gray-500">
227
+ {searchTerm
228
+ ? 'Try adjusting your search terms.'
229
+ : 'Get started by creating your first story fragment.'}
230
+ </p>
231
+ {!searchTerm && (
232
+ <>
233
+ <p className="mt-2 text-sm text-gray-500">
234
+ Story fragments are the pages and content sections of your
235
+ site.
236
+ </p>
237
+ <a
238
+ href="/create/edit"
239
+ className="mt-4 rounded-md bg-cyan-600 px-4 py-2 text-sm font-bold text-white hover:bg-cyan-700"
240
+ >
241
+ Create Story Fragment
242
+ </a>
243
+ </>
244
+ )}
245
+ </div>
246
+ ) : (
247
+ <div className="overflow-x-auto">
248
+ <table className="min-w-full divide-y divide-gray-200">
249
+ <thead className="bg-gray-50">
250
+ <tr>
251
+ <th className="px-3 py-3 text-left text-xs font-bold uppercase tracking-wider text-gray-500 md:px-6">
252
+ Title
253
+ </th>
254
+ <th className="hidden px-3 py-3 text-left text-xs font-bold uppercase tracking-wider text-gray-500 md:table-cell md:px-6">
255
+ Slug
256
+ </th>
257
+ <th className="hidden px-3 py-3 text-left text-xs font-bold uppercase tracking-wider text-gray-500 md:table-cell md:px-6">
258
+ Status
259
+ </th>
260
+ <th className="hidden px-3 py-3 text-left text-xs font-bold uppercase tracking-wider text-gray-500 xl:table-cell xl:px-6">
261
+ Usage
262
+ </th>
263
+ <th className="px-3 py-3 text-right md:px-6">
264
+ <span className="sr-only">Actions</span>
265
+ </th>
266
+ </tr>
267
+ </thead>
268
+ <tbody className="divide-y divide-gray-200 bg-white">
269
+ {paginatedFragments.map((item) => {
270
+ const canDelete = !shouldDisableDelete(item);
271
+ const deleteTooltip = getDeleteTooltip(item);
272
+
273
+ return (
274
+ <tr key={item.id} className="hover:bg-gray-50">
275
+ <td className="px-3 py-4 md:px-6">
276
+ <div className="flex flex-col">
277
+ <div className="text-sm font-bold text-gray-900">
278
+ {item.title}
279
+ </div>
280
+ <div className="text-sm text-gray-500 md:hidden">
281
+ /{item.slug}
282
+ </div>
283
+ </div>
284
+ </td>
285
+ <td className="hidden whitespace-nowrap px-3 py-4 text-sm text-gray-500 md:table-cell md:px-6">
286
+ /{item.slug}
287
+ </td>
288
+ <td className="hidden whitespace-nowrap px-3 py-4 text-sm md:table-cell md:px-6">
289
+ <span
290
+ className={classNames(
291
+ 'inline-flex rounded-full px-2 text-xs font-bold leading-5',
292
+ item.slug === homeSlug
293
+ ? 'bg-blue-100 text-blue-800'
294
+ : 'bg-green-100 text-green-800'
295
+ )}
296
+ >
297
+ {getStatus(item)}
298
+ </span>
299
+ </td>
300
+ <td className="hidden whitespace-nowrap px-3 py-4 text-sm text-gray-500 xl:table-cell xl:px-6">
301
+ <UsageCell
302
+ itemId={item.id}
303
+ fullContentMap={fullContentMap}
304
+ usageType="storyFragments"
305
+ />
306
+ </td>
307
+ <td className="whitespace-nowrap px-3 py-4 text-right text-sm font-bold md:px-6">
308
+ <div className="flex items-center justify-end space-x-2">
309
+ <a
310
+ href={`/${item.slug}`}
311
+ className="text-gray-600 hover:text-gray-900"
312
+ title="View story fragment"
313
+ >
314
+ View
315
+ </a>
316
+ <a
317
+ href={`/${item.slug}/edit`}
318
+ className="text-cyan-600 hover:text-cyan-900"
319
+ title="Edit story fragment"
320
+ >
321
+ <PencilIcon className="h-5 w-5" />
322
+ </a>
323
+ <button
324
+ onClick={() =>
325
+ canDelete && handleDelete(item.id, item.title)
326
+ }
327
+ disabled={!canDelete}
328
+ title={deleteTooltip}
329
+ className={classNames(
330
+ canDelete
331
+ ? 'text-red-600 hover:text-red-900'
332
+ : 'cursor-not-allowed text-gray-300',
333
+ 'transition-colors'
334
+ )}
335
+ >
336
+ <TrashIcon className="h-5 w-5" />
337
+ </button>
338
+ </div>
339
+ </td>
340
+ </tr>
341
+ );
342
+ })}
343
+ </tbody>
344
+ </table>
345
+
346
+ {/* Pagination */}
347
+ {totalPages > 1 && (
348
+ <div className="border-t border-gray-200 bg-white px-4 py-3 md:px-6">
349
+ <div className="flex items-center justify-between">
350
+ <div className="flex flex-1 justify-between md:hidden">
351
+ <button
352
+ onClick={() => handlePageChange(currentPage - 1)}
353
+ disabled={currentPage === 1}
354
+ className={classNames(
355
+ 'relative inline-flex items-center rounded-md px-4 py-2 text-sm font-bold',
356
+ currentPage === 1
357
+ ? 'cursor-not-allowed bg-gray-100 text-gray-400'
358
+ : 'border border-gray-300 bg-white text-gray-700 hover:bg-gray-50'
359
+ )}
360
+ >
361
+ Previous
362
+ </button>
363
+ <button
364
+ onClick={() => handlePageChange(currentPage + 1)}
365
+ disabled={currentPage === totalPages}
366
+ className={classNames(
367
+ 'relative ml-3 inline-flex items-center rounded-md px-4 py-2 text-sm font-bold',
368
+ currentPage === totalPages
369
+ ? 'cursor-not-allowed bg-gray-100 text-gray-400'
370
+ : 'border border-gray-300 bg-white text-gray-700 hover:bg-gray-50'
371
+ )}
372
+ >
373
+ Next
374
+ </button>
375
+ </div>
376
+ <div className="hidden md:flex md:flex-1 md:items-center md:justify-between">
377
+ <div>
378
+ <p className="text-sm text-gray-700">
379
+ Showing{' '}
380
+ <span className="font-bold">{startIndex + 1}</span> to{' '}
381
+ <span className="font-bold">
382
+ {Math.min(
383
+ startIndex + itemsPerPage,
384
+ filteredFragments.length
385
+ )}
386
+ </span>{' '}
387
+ of{' '}
388
+ <span className="font-bold">
389
+ {filteredFragments.length}
390
+ </span>{' '}
391
+ results
392
+ </p>
393
+ </div>
394
+ <div>
395
+ <nav className="isolate inline-flex -space-x-px rounded-md shadow-sm">
396
+ <button
397
+ onClick={() => handlePageChange(currentPage - 1)}
398
+ disabled={currentPage === 1}
399
+ className={classNames(
400
+ 'relative inline-flex items-center rounded-l-md px-2 py-2 text-gray-400 ring-1 ring-inset ring-gray-300 hover:bg-gray-50 focus:outline-offset-0',
401
+ currentPage === 1
402
+ ? 'cursor-not-allowed'
403
+ : 'hover:bg-gray-50'
404
+ )}
405
+ >
406
+ <span className="sr-only">Previous</span>
407
+ <svg
408
+ className="h-5 w-5"
409
+ viewBox="0 0 20 20"
410
+ fill="currentColor"
411
+ >
412
+ <path
413
+ fillRule="evenodd"
414
+ d="M12.79 5.23a.75.75 0 01-.02 1.06L8.832 10l3.938 3.71a.75.75 0 11-1.04 1.08l-4.5-4.25a.75.75 0 010-1.08l4.5-4.25a.75.75 0 011.06.02z"
415
+ clipRule="evenodd"
416
+ />
417
+ </svg>
418
+ </button>
419
+
420
+ {/* Page numbers */}
421
+ {Array.from(
422
+ { length: totalPages },
423
+ (_, i) => i + 1
424
+ ).map((page) => (
425
+ <button
426
+ key={page}
427
+ onClick={() => handlePageChange(page)}
428
+ className={classNames(
429
+ 'relative inline-flex items-center px-4 py-2 text-sm font-bold focus:outline-offset-0',
430
+ page === currentPage
431
+ ? 'z-10 bg-cyan-600 text-white focus:ring-2 focus:ring-cyan-500'
432
+ : 'text-gray-900 ring-1 ring-inset ring-gray-300 hover:bg-gray-50'
433
+ )}
434
+ >
435
+ {page}
436
+ </button>
437
+ ))}
438
+
439
+ <button
440
+ onClick={() => handlePageChange(currentPage + 1)}
441
+ disabled={currentPage === totalPages}
442
+ className={classNames(
443
+ 'relative inline-flex items-center rounded-r-md px-2 py-2 text-gray-400 ring-1 ring-inset ring-gray-300 hover:bg-gray-50 focus:outline-offset-0',
444
+ currentPage === totalPages
445
+ ? 'cursor-not-allowed'
446
+ : 'hover:bg-gray-50'
447
+ )}
448
+ >
449
+ <span className="sr-only">Next</span>
450
+ <svg
451
+ className="h-5 w-5"
452
+ viewBox="0 0 20 20"
453
+ fill="currentColor"
454
+ >
455
+ <path
456
+ fillRule="evenodd"
457
+ d="M7.21 14.77a.75.75 0 01.02-1.06L11.168 10 7.23 6.29a.75.75 0 111.04-1.08l4.5 4.25a.75.75 0 010 1.08l-4.5 4.25a.75.75 0 01-1.06-.02z"
458
+ clipRule="evenodd"
459
+ />
460
+ </svg>
461
+ </button>
462
+ </nav>
463
+ </div>
464
+ </div>
465
+ </div>
466
+ </div>
467
+ )}
468
+ </div>
469
+ )}
470
+ </div>
471
+
472
+ {/* Loading State */}
473
+ {isLoading && (
474
+ <div className="rounded-lg bg-white p-8 text-center shadow">
475
+ <div className="text-lg text-gray-600">Processing...</div>
476
+ </div>
477
+ )}
478
+ </div>
479
+ );
480
+ };
481
+
482
+ export default StoryFragmentTable;
@@ -0,0 +1,42 @@
1
+ import { useState } from 'react';
2
+ import StoryKeepDashboard from '../Dashboard';
3
+ import StoryKeepDashboard_Branding from '../Dashboard_Branding';
4
+ import type { FullContentMapItem, BrandConfig } from '@/types/tractstack';
5
+
6
+ interface BrandingPageWrapperProps {
7
+ fullContentMap: FullContentMapItem[];
8
+ homeSlug: string;
9
+ role: string | null;
10
+ initializing: boolean;
11
+ initialBrandConfig: BrandConfig;
12
+ }
13
+
14
+ export default function BrandingPageWrapper({
15
+ fullContentMap,
16
+ homeSlug,
17
+ role,
18
+ initializing,
19
+ initialBrandConfig,
20
+ }: BrandingPageWrapperProps) {
21
+ // Manage shared brandConfig state at this level
22
+ const [brandConfig, setBrandConfig] =
23
+ useState<BrandConfig>(initialBrandConfig);
24
+
25
+ return (
26
+ <>
27
+ <StoryKeepDashboard
28
+ fullContentMap={fullContentMap}
29
+ homeSlug={homeSlug}
30
+ activeTab="branding"
31
+ role={role}
32
+ initializing={initializing}
33
+ brandConfig={brandConfig}
34
+ onBrandConfigUpdate={setBrandConfig}
35
+ />
36
+ <StoryKeepDashboard_Branding
37
+ brandConfig={brandConfig}
38
+ onBrandConfigUpdate={setBrandConfig}
39
+ />
40
+ </>
41
+ );
42
+ }