astro-tractstack 2.0.0-rc.3 → 2.0.0-rc.31

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 (429) hide show
  1. package/LICENSE +0 -0
  2. package/README.md +227 -98
  3. package/astro.d.ts +0 -0
  4. package/bin/create-tractstack.js +125 -45
  5. package/dist/index.js +21 -1
  6. package/package.json +10 -5
  7. package/templates/artpacks/kCz/captainBreakfast_1080px.webp +0 -0
  8. package/templates/artpacks/kCz/captainBreakfast_1920px.webp +0 -0
  9. package/templates/artpacks/kCz/captainBreakfast_600px.webp +0 -0
  10. package/templates/artpacks/kCz/cleanDrips_1080px.webp +0 -0
  11. package/templates/artpacks/kCz/cleanDrips_1920px.webp +0 -0
  12. package/templates/artpacks/kCz/cleanDrips_600px.webp +0 -0
  13. package/templates/artpacks/kCz/crispwaves_1080px.webp +0 -0
  14. package/templates/artpacks/kCz/crispwaves_1920px.webp +0 -0
  15. package/templates/artpacks/kCz/crispwaves_600px.webp +0 -0
  16. package/templates/artpacks/kCz/dragonSkin_1080px.webp +0 -0
  17. package/templates/artpacks/kCz/dragonSkin_1920px.webp +0 -0
  18. package/templates/artpacks/kCz/dragonSkin_600px.webp +0 -0
  19. package/templates/artpacks/kCz/dragon_1080px.webp +0 -0
  20. package/templates/artpacks/kCz/dragon_1920px.webp +0 -0
  21. package/templates/artpacks/kCz/dragon_600px.webp +0 -0
  22. package/templates/artpacks/kCz/nightcity_1080px.webp +0 -0
  23. package/templates/artpacks/kCz/nightcity_1920px.webp +0 -0
  24. package/templates/artpacks/kCz/nightcity_600px.webp +0 -0
  25. package/templates/artpacks/kCz/pattern1_1080px.webp +0 -0
  26. package/templates/artpacks/kCz/pattern1_1920px.webp +0 -0
  27. package/templates/artpacks/kCz/pattern1_600px.webp +0 -0
  28. package/templates/artpacks/kCz/pattern2_1080px.webp +0 -0
  29. package/templates/artpacks/kCz/pattern2_1920px.webp +0 -0
  30. package/templates/artpacks/kCz/pattern2_600px.webp +0 -0
  31. package/templates/artpacks/kCz/skindrips_1080px.webp +0 -0
  32. package/templates/artpacks/kCz/skindrips_1920px.webp +0 -0
  33. package/templates/artpacks/kCz/skindrips_600px.webp +0 -0
  34. package/templates/artpacks/kCz/slimetime_1080px.webp +0 -0
  35. package/templates/artpacks/kCz/slimetime_1920px.webp +0 -0
  36. package/templates/artpacks/kCz/slimetime_600px.webp +0 -0
  37. package/templates/artpacks/kCz/snake_1080px.webp +0 -0
  38. package/templates/artpacks/kCz/snake_1920px.webp +0 -0
  39. package/templates/artpacks/kCz/snake_600px.webp +0 -0
  40. package/templates/artpacks/kCz/toxicshock_1080px.webp +0 -0
  41. package/templates/artpacks/kCz/toxicshock_1920px.webp +0 -0
  42. package/templates/artpacks/kCz/toxicshock_600px.webp +0 -0
  43. package/templates/artpacks/kCz/tractstack_1080px.webp +0 -0
  44. package/templates/artpacks/kCz/tractstack_1920px.webp +0 -0
  45. package/templates/artpacks/kCz/tractstack_600px.webp +0 -0
  46. package/templates/artpacks/kCz/tripdrips_1080px.webp +0 -0
  47. package/templates/artpacks/kCz/tripdrips_1920px.webp +0 -0
  48. package/templates/artpacks/kCz/tripdrips_600px.webp +0 -0
  49. package/templates/artpacks/kCz/wavedrips_1080px.webp +0 -0
  50. package/templates/artpacks/kCz/wavedrips_1920px.webp +0 -0
  51. package/templates/artpacks/kCz/wavedrips_600px.webp +0 -0
  52. package/templates/artpacks/t8k/beach_1080px.webp +0 -0
  53. package/templates/artpacks/t8k/beach_1920px.webp +0 -0
  54. package/templates/artpacks/t8k/beach_600px.webp +0 -0
  55. package/templates/artpacks/t8k/blast_1080px.webp +0 -0
  56. package/templates/artpacks/t8k/blast_1920px.webp +0 -0
  57. package/templates/artpacks/t8k/blast_600px.webp +0 -0
  58. package/templates/artpacks/t8k/bokeh_1080px.webp +0 -0
  59. package/templates/artpacks/t8k/bokeh_1920px.webp +0 -0
  60. package/templates/artpacks/t8k/bokeh_600px.webp +0 -0
  61. package/templates/artpacks/t8k/cartoon_1080px.webp +0 -0
  62. package/templates/artpacks/t8k/cartoon_1920px.webp +0 -0
  63. package/templates/artpacks/t8k/cartoon_600px.webp +0 -0
  64. package/templates/artpacks/t8k/darkeggshell_1080px.webp +0 -0
  65. package/templates/artpacks/t8k/darkeggshell_1920px.webp +0 -0
  66. package/templates/artpacks/t8k/darkeggshell_600px.webp +0 -0
  67. package/templates/artpacks/t8k/explosion_1080px.webp +0 -0
  68. package/templates/artpacks/t8k/explosion_1920px.webp +0 -0
  69. package/templates/artpacks/t8k/explosion_600px.webp +0 -0
  70. package/templates/artpacks/t8k/floral_1080px.webp +0 -0
  71. package/templates/artpacks/t8k/floral_1920px.webp +0 -0
  72. package/templates/artpacks/t8k/floral_600px.webp +0 -0
  73. package/templates/artpacks/t8k/flower_1080px.webp +0 -0
  74. package/templates/artpacks/t8k/flower_1920px.webp +0 -0
  75. package/templates/artpacks/t8k/flower_600px.webp +0 -0
  76. package/templates/artpacks/t8k/foliage_1080px.webp +0 -0
  77. package/templates/artpacks/t8k/foliage_1920px.webp +0 -0
  78. package/templates/artpacks/t8k/foliage_600px.webp +0 -0
  79. package/templates/artpacks/t8k/mist_1080px.webp +0 -0
  80. package/templates/artpacks/t8k/mist_1920px.webp +0 -0
  81. package/templates/artpacks/t8k/mist_600px.webp +0 -0
  82. package/templates/artpacks/t8k/portal_1080px.webp +0 -0
  83. package/templates/artpacks/t8k/portal_1920px.webp +0 -0
  84. package/templates/artpacks/t8k/portal_600px.webp +0 -0
  85. package/templates/artpacks/t8k/storytime_1080px.webp +0 -0
  86. package/templates/artpacks/t8k/storytime_1920px.webp +0 -0
  87. package/templates/artpacks/t8k/storytime_600px.webp +0 -0
  88. package/templates/artpacks/t8k/tacky_1080px.webp +0 -0
  89. package/templates/artpacks/t8k/tacky_1920px.webp +0 -0
  90. package/templates/artpacks/t8k/tacky_600px.webp +0 -0
  91. package/templates/artpacks/t8k/wallpaper_1080px.webp +0 -0
  92. package/templates/artpacks/t8k/wallpaper_1920px.webp +0 -0
  93. package/templates/artpacks/t8k/wallpaper_600px.webp +0 -0
  94. package/templates/brand/favicon.ico +0 -0
  95. package/templates/brand/logo.svg +0 -0
  96. package/templates/brand/og.png +0 -0
  97. package/templates/brand/oglogo.png +0 -0
  98. package/templates/brand/static.jpg +0 -0
  99. package/templates/brand/wordmark.svg +0 -0
  100. package/templates/css/custom.css +0 -0
  101. package/templates/css/frontend.css +1 -3519
  102. package/templates/css/storykeep.css +0 -0
  103. package/templates/custom/minimal/CodeHook.astro +7 -6
  104. package/templates/custom/minimal/CustomRoutes.astro +25 -31
  105. package/templates/custom/with-examples/CodeHook.astro +7 -6
  106. package/templates/custom/with-examples/CustomHero.astro +0 -0
  107. package/templates/custom/with-examples/CustomRoutes.astro +4 -8
  108. package/templates/custom/with-examples/pages/Collections.astro +58 -98
  109. package/templates/env.example +0 -0
  110. package/templates/fonts/Inter-Black.woff2 +0 -0
  111. package/templates/fonts/Inter-Bold.woff2 +0 -0
  112. package/templates/fonts/Inter-Regular.woff2 +0 -0
  113. package/templates/gitignore +42 -0
  114. package/templates/icons/h2.svg +0 -0
  115. package/templates/icons/h3.svg +0 -0
  116. package/templates/icons/h4.svg +0 -0
  117. package/templates/icons/h5.svg +0 -0
  118. package/templates/icons/image.svg +0 -0
  119. package/templates/icons/text.svg +0 -0
  120. package/templates/prettierignore +5 -0
  121. package/templates/prettierrc +19 -0
  122. package/templates/socials/codepen.svg +0 -0
  123. package/templates/socials/discord.svg +0 -0
  124. package/templates/socials/facebook.svg +0 -0
  125. package/templates/socials/github.svg +0 -0
  126. package/templates/socials/instagram.svg +0 -0
  127. package/templates/socials/linkedin.svg +0 -0
  128. package/templates/socials/mail.svg +0 -0
  129. package/templates/socials/rumble.svg +0 -0
  130. package/templates/socials/tiktok.svg +0 -0
  131. package/templates/socials/twitch.svg +0 -0
  132. package/templates/socials/twitter.svg +0 -0
  133. package/templates/socials/x.svg +0 -0
  134. package/templates/socials/youtube.svg +0 -0
  135. package/templates/src/client/htmx.min.js +3519 -0
  136. package/templates/src/components/Footer.astro +1 -1
  137. package/templates/src/components/Fragment.astro +0 -0
  138. package/templates/src/components/Header.astro +55 -52
  139. package/templates/src/components/Menu.tsx +0 -0
  140. package/templates/src/components/codehooks/BunnyVideoSetup.tsx +0 -0
  141. package/templates/src/components/codehooks/BunnyVideoWrapper.astro +0 -0
  142. package/templates/src/components/codehooks/EpinetDurationSelector.tsx +9 -13
  143. package/templates/src/components/codehooks/EpinetTableView.tsx +11 -7
  144. package/templates/src/components/codehooks/EpinetWrapper.tsx +0 -0
  145. package/templates/src/components/codehooks/FeaturedContent.astro +0 -0
  146. package/templates/src/components/codehooks/FeaturedContentSetup.tsx +0 -0
  147. package/templates/src/components/codehooks/ListContent.astro +0 -0
  148. package/templates/src/components/codehooks/ListContentSetup.tsx +0 -0
  149. package/templates/src/components/codehooks/SankeyDiagram.tsx +4 -3
  150. package/templates/src/components/compositor/Compositor.tsx +0 -0
  151. package/templates/src/components/compositor/Node.tsx +1 -1
  152. package/templates/src/components/compositor/NodeWithGuid.tsx +0 -0
  153. package/templates/src/components/compositor/PanelVisibilityWrapper.tsx +25 -11
  154. package/templates/src/components/compositor/elements/Belief.tsx +0 -0
  155. package/templates/src/components/compositor/elements/BgImage.tsx +0 -0
  156. package/templates/src/components/compositor/elements/BgVisualBreak.tsx +0 -0
  157. package/templates/src/components/compositor/elements/BunnyVideo.tsx +0 -0
  158. package/templates/src/components/compositor/elements/IdentifyAs.tsx +0 -0
  159. package/templates/src/components/compositor/elements/PlayButton.tsx +0 -0
  160. package/templates/src/components/compositor/elements/SignUp.tsx +0 -0
  161. package/templates/src/components/compositor/elements/Svg.tsx +0 -0
  162. package/templates/src/components/compositor/elements/ToggleBelief.tsx +0 -0
  163. package/templates/src/components/compositor/elements/YouTubeWrapper.tsx +0 -0
  164. package/templates/src/components/compositor/nodes/BgPaneWrapper.tsx +0 -0
  165. package/templates/src/components/compositor/nodes/GhostInsertBlock.tsx +0 -0
  166. package/templates/src/components/compositor/nodes/Markdown.tsx +0 -0
  167. package/templates/src/components/compositor/nodes/Pane.tsx +13 -6
  168. package/templates/src/components/compositor/nodes/Pane_eraser.tsx +0 -0
  169. package/templates/src/components/compositor/nodes/Pane_layout.tsx +0 -0
  170. package/templates/src/components/compositor/nodes/RenderChildren.tsx +0 -0
  171. package/templates/src/components/compositor/nodes/StoryFragment.tsx +0 -0
  172. package/templates/src/components/compositor/nodes/TagElement.tsx +0 -0
  173. package/templates/src/components/compositor/nodes/Widget.tsx +0 -0
  174. package/templates/src/components/compositor/nodes/tagElements/NodeA.tsx +0 -0
  175. package/templates/src/components/compositor/nodes/tagElements/NodeA_eraser.tsx +0 -0
  176. package/templates/src/components/compositor/nodes/tagElements/NodeAnchorComponent.tsx +0 -0
  177. package/templates/src/components/compositor/nodes/tagElements/NodeBasicTag.tsx +0 -0
  178. package/templates/src/components/compositor/nodes/tagElements/NodeBasicTag_eraser.tsx +0 -0
  179. package/templates/src/components/compositor/nodes/tagElements/NodeBasicTag_insert.tsx +0 -0
  180. package/templates/src/components/compositor/nodes/tagElements/NodeBasicTag_settings.tsx +0 -0
  181. package/templates/src/components/compositor/nodes/tagElements/NodeButton.tsx +0 -0
  182. package/templates/src/components/compositor/nodes/tagElements/NodeButton_eraser.tsx +0 -0
  183. package/templates/src/components/compositor/nodes/tagElements/NodeImg.tsx +0 -0
  184. package/templates/src/components/compositor/nodes/tagElements/NodeText.tsx +0 -0
  185. package/templates/src/components/compositor/nodes/tagElements/TabIndicator.tsx +0 -0
  186. package/templates/src/components/compositor/preview/FeaturedContentPreview.tsx +0 -0
  187. package/templates/src/components/compositor/preview/ListContentPreview.tsx +0 -0
  188. package/templates/src/components/compositor/preview/OgImagePreview.tsx +0 -0
  189. package/templates/src/components/compositor/preview/PaneSnapshotGenerator.tsx +0 -0
  190. package/templates/src/components/compositor/preview/PanesPreviewGenerator.tsx +0 -0
  191. package/templates/src/components/compositor/preview/VisualBreakPreview.tsx +0 -0
  192. package/templates/src/components/edit/Header.tsx +9 -3
  193. package/templates/src/components/edit/PanelSwitch.tsx +4 -8
  194. package/templates/src/components/edit/SettingsPanel.tsx +24 -17
  195. package/templates/src/components/edit/ToolBar.tsx +0 -0
  196. package/templates/src/components/edit/ToolMode.tsx +93 -33
  197. package/templates/src/components/edit/context/ContextPaneConfig.tsx +0 -0
  198. package/templates/src/components/edit/context/ContextPaneConfig_slug.tsx +0 -0
  199. package/templates/src/components/edit/context/ContextPaneConfig_title.tsx +0 -0
  200. package/templates/src/components/edit/pane/AddPanePanel.tsx +0 -0
  201. package/templates/src/components/edit/pane/AddPanePanel_break.tsx +0 -0
  202. package/templates/src/components/edit/pane/AddPanePanel_codehook.tsx +2 -1
  203. package/templates/src/components/edit/pane/AddPanePanel_new.tsx +1 -1
  204. package/templates/src/components/edit/pane/AddPanePanel_newAICopy.tsx +0 -0
  205. package/templates/src/components/edit/pane/AddPanePanel_newAICopy_modal.tsx +1 -1
  206. package/templates/src/components/edit/pane/AddPanePanel_newCopyMode.tsx +0 -0
  207. package/templates/src/components/edit/pane/AddPanePanel_newCustomCopy.tsx +0 -0
  208. package/templates/src/components/edit/pane/AddPanePanel_reuse.tsx +0 -0
  209. package/templates/src/components/edit/pane/ConfigPanePanel.tsx +1 -0
  210. package/templates/src/components/edit/pane/PageGen.tsx +0 -0
  211. package/templates/src/components/edit/pane/PageGenSelector.tsx +0 -0
  212. package/templates/src/components/edit/pane/PageGenSpecial.tsx +0 -0
  213. package/templates/src/components/edit/pane/PageGen_preview.tsx +0 -0
  214. package/templates/src/components/edit/pane/PanePanel_impression.tsx +0 -0
  215. package/templates/src/components/edit/pane/PanePanel_path.tsx +2 -2
  216. package/templates/src/components/edit/pane/PanePanel_slug.tsx +0 -0
  217. package/templates/src/components/edit/pane/PanePanel_title.tsx +0 -0
  218. package/templates/src/components/edit/panels/StyleBreakPanel.tsx +0 -0
  219. package/templates/src/components/edit/panels/StyleCodeHookPanel.tsx +0 -0
  220. package/templates/src/components/edit/panels/StyleElementPanel.tsx +0 -0
  221. package/templates/src/components/edit/panels/StyleElementPanel_add.tsx +1 -1
  222. package/templates/src/components/edit/panels/StyleElementPanel_remove.tsx +0 -0
  223. package/templates/src/components/edit/panels/StyleElementPanel_update.tsx +0 -0
  224. package/templates/src/components/edit/panels/StyleImagePanel.tsx +0 -0
  225. package/templates/src/components/edit/panels/StyleImagePanel_add.tsx +1 -1
  226. package/templates/src/components/edit/panels/StyleImagePanel_remove.tsx +0 -0
  227. package/templates/src/components/edit/panels/StyleImagePanel_update.tsx +0 -0
  228. package/templates/src/components/edit/panels/StyleLiElementPanel.tsx +0 -0
  229. package/templates/src/components/edit/panels/StyleLiElementPanel_add.tsx +1 -1
  230. package/templates/src/components/edit/panels/StyleLiElementPanel_remove.tsx +0 -0
  231. package/templates/src/components/edit/panels/StyleLiElementPanel_update.tsx +0 -0
  232. package/templates/src/components/edit/panels/StyleLinkPanel.tsx +0 -0
  233. package/templates/src/components/edit/panels/StyleLinkPanel_add.tsx +1 -1
  234. package/templates/src/components/edit/panels/StyleLinkPanel_config.tsx +1 -1
  235. package/templates/src/components/edit/panels/StyleLinkPanel_remove.tsx +0 -0
  236. package/templates/src/components/edit/panels/StyleLinkPanel_update.tsx +0 -0
  237. package/templates/src/components/edit/panels/StyleParentPanel.tsx +0 -0
  238. package/templates/src/components/edit/panels/StyleParentPanel_add.tsx +1 -1
  239. package/templates/src/components/edit/panels/StyleParentPanel_deleteLayer.tsx +0 -0
  240. package/templates/src/components/edit/panels/StyleParentPanel_remove.tsx +0 -0
  241. package/templates/src/components/edit/panels/StyleParentPanel_update.tsx +0 -0
  242. package/templates/src/components/edit/panels/StyleWidgetPanel.tsx +2 -0
  243. package/templates/src/components/edit/panels/StyleWidgetPanel_add.tsx +1 -1
  244. package/templates/src/components/edit/panels/StyleWidgetPanel_config.tsx +0 -0
  245. package/templates/src/components/edit/panels/StyleWidgetPanel_remove.tsx +0 -0
  246. package/templates/src/components/edit/panels/StyleWidgetPanel_update.tsx +0 -0
  247. package/templates/src/components/edit/state/SaveModal.tsx +156 -48
  248. package/templates/src/components/edit/state/StylesMemory.tsx +0 -0
  249. package/templates/src/components/edit/storyfragment/StoryFragmentConfigPanel.tsx +0 -0
  250. package/templates/src/components/edit/storyfragment/StoryFragmentPanel_menu.tsx +0 -0
  251. package/templates/src/components/edit/storyfragment/StoryFragmentPanel_og.tsx +0 -0
  252. package/templates/src/components/edit/storyfragment/StoryFragmentPanel_slug.tsx +56 -55
  253. package/templates/src/components/edit/storyfragment/StoryFragmentPanel_title.tsx +0 -0
  254. package/templates/src/components/edit/widgets/BeliefWidget.tsx +0 -0
  255. package/templates/src/components/edit/widgets/BunnyWidget.tsx +0 -0
  256. package/templates/src/components/edit/widgets/IdentifyAsWidget.tsx +0 -0
  257. package/templates/src/components/edit/widgets/SignupWidget.tsx +0 -0
  258. package/templates/src/components/edit/widgets/ToggleWidget.tsx +0 -0
  259. package/templates/src/components/edit/widgets/YouTubeWidget.tsx +0 -0
  260. package/templates/src/components/fields/ActionBuilderTimeSelector.tsx +0 -0
  261. package/templates/src/components/fields/ArtpackImage.tsx +0 -0
  262. package/templates/src/components/fields/BackgroundImage.tsx +0 -0
  263. package/templates/src/components/fields/BackgroundImageWrapper.tsx +1 -1
  264. package/templates/src/components/fields/BooleanParam.tsx +0 -0
  265. package/templates/src/components/fields/BunnyMomentSelector.tsx +0 -0
  266. package/templates/src/components/fields/ColorPickerCombo.tsx +0 -0
  267. package/templates/src/components/fields/ImageUpload.tsx +0 -0
  268. package/templates/src/components/fields/MultiParam.tsx +0 -0
  269. package/templates/src/components/fields/PaneBreakCollectionSelector.tsx +0 -0
  270. package/templates/src/components/fields/PaneBreakShapeSelector.tsx +0 -0
  271. package/templates/src/components/fields/SelectedTailwindClass.tsx +0 -0
  272. package/templates/src/components/fields/SingleParam.tsx +0 -0
  273. package/templates/src/components/fields/ViewportComboBox.tsx +10 -3
  274. package/templates/src/components/form/ActionBuilderField.tsx +0 -0
  275. package/templates/src/components/form/ActionBuilderSlugSelector.tsx +0 -0
  276. package/templates/src/components/form/BooleanToggle.tsx +0 -0
  277. package/templates/src/components/form/ColorPicker.tsx +0 -0
  278. package/templates/src/components/form/DateTimeInput.tsx +0 -0
  279. package/templates/src/components/form/EnumSelect.tsx +0 -0
  280. package/templates/src/components/form/FileUpload.tsx +0 -0
  281. package/templates/src/components/form/MagicPathBuilder.tsx +0 -0
  282. package/templates/src/components/form/NumberInput.tsx +0 -0
  283. package/templates/src/components/form/ParagraphArrayInput.tsx +0 -0
  284. package/templates/src/components/form/StringArrayInput.tsx +0 -0
  285. package/templates/src/components/form/StringInput.tsx +0 -0
  286. package/templates/src/components/form/UnsavedChangesBar.tsx +0 -0
  287. package/templates/src/components/form/advanced/APIConfigSection.tsx +0 -0
  288. package/templates/src/components/form/advanced/AuthConfigSection.tsx +0 -0
  289. package/templates/src/components/form/brand/BrandAssetsSection.tsx +0 -0
  290. package/templates/src/components/form/brand/BrandColorsSection.tsx +0 -0
  291. package/templates/src/components/form/brand/SEOSection.tsx +0 -0
  292. package/templates/src/components/form/brand/SiteConfigSection.tsx +0 -0
  293. package/templates/src/components/form/brand/SocialLinksSection.tsx +0 -0
  294. package/templates/src/components/profile/ProfileConsent.tsx +0 -0
  295. package/templates/src/components/profile/ProfileCreate.tsx +0 -0
  296. package/templates/src/components/profile/ProfileEdit.tsx +0 -0
  297. package/templates/src/components/profile/ProfileSwitch.tsx +0 -0
  298. package/templates/src/components/profile/ProfileUnlock.tsx +0 -0
  299. package/templates/src/components/storykeep/Dashboard.tsx +0 -0
  300. package/templates/src/components/storykeep/Dashboard_Activity.tsx +0 -0
  301. package/templates/src/components/storykeep/Dashboard_Advanced.tsx +1 -1
  302. package/templates/src/components/storykeep/Dashboard_Analytics.tsx +34 -8
  303. package/templates/src/components/storykeep/Dashboard_Branding.tsx +0 -0
  304. package/templates/src/components/storykeep/Dashboard_Content.tsx +6 -0
  305. package/templates/src/components/storykeep/controls/UsageCell.tsx +0 -0
  306. package/templates/src/components/storykeep/controls/content/BeliefForm.tsx +0 -0
  307. package/templates/src/components/storykeep/controls/content/BeliefTable.tsx +0 -0
  308. package/templates/src/components/storykeep/controls/content/ContentBrowser.tsx +0 -0
  309. package/templates/src/components/storykeep/controls/content/ContentSummary.tsx +0 -0
  310. package/templates/src/components/storykeep/controls/content/KnownResourceForm.tsx +0 -0
  311. package/templates/src/components/storykeep/controls/content/KnownResourceTable.tsx +0 -0
  312. package/templates/src/components/storykeep/controls/content/ManageContent.tsx +0 -0
  313. package/templates/src/components/storykeep/controls/content/MenuForm.tsx +0 -0
  314. package/templates/src/components/storykeep/controls/content/MenuTable.tsx +0 -0
  315. package/templates/src/components/storykeep/controls/content/ResourceBulkIngest.tsx +0 -0
  316. package/templates/src/components/storykeep/controls/content/ResourceForm.tsx +0 -0
  317. package/templates/src/components/storykeep/controls/content/ResourceTable.tsx +0 -0
  318. package/templates/src/components/storykeep/controls/content/StoryFragmentTable.tsx +5 -8
  319. package/templates/src/components/storykeep/state/BrandingWrapper.tsx +0 -0
  320. package/templates/src/components/storykeep/state/FetchAnalytics.tsx +274 -228
  321. package/templates/src/components/storykeep/widgets/ResponsiveLine.tsx +0 -0
  322. package/templates/src/components/storykeep/widgets/Wizard.tsx +13 -6
  323. package/templates/src/components/tenant/RegistrationForm.tsx +5 -3
  324. package/templates/src/components/widgets/BunnyVideoHero.astro +0 -0
  325. package/templates/src/components/widgets/Impression.tsx +0 -0
  326. package/templates/src/components/widgets/ImpressionWrapper.tsx +0 -0
  327. package/templates/src/constants/beliefs.ts +0 -0
  328. package/templates/src/constants/brandThemes.ts +0 -0
  329. package/templates/src/constants/prompts.json +0 -0
  330. package/templates/src/constants/shapes.ts +0 -0
  331. package/templates/src/constants/stopWords.ts +0 -0
  332. package/templates/src/constants/tailwindColors.json +0 -0
  333. package/templates/src/constants.ts +0 -0
  334. package/templates/src/hooks/useFormState.ts +0 -0
  335. package/templates/src/layouts/Layout.astro +129 -20
  336. package/templates/src/lib/session.ts +0 -0
  337. package/templates/src/lib/storyData.ts +2 -1
  338. package/templates/src/middleware.ts +0 -0
  339. package/templates/src/pages/404.astro +0 -0
  340. package/templates/src/pages/[...slug]/edit.astro +18 -5
  341. package/templates/src/pages/[...slug].astro +10 -3
  342. package/templates/src/pages/api/auth/decode.ts +0 -0
  343. package/templates/src/pages/api/auth/login.ts +0 -0
  344. package/templates/src/pages/api/auth/logout.ts +0 -0
  345. package/templates/src/pages/api/auth/profile.ts +0 -0
  346. package/templates/src/pages/api/orphan-analysis.ts +0 -1
  347. package/templates/src/pages/api/tailwind.ts +23 -21
  348. package/templates/src/pages/collections/[param1].astro +0 -0
  349. package/templates/src/pages/context/[...contextSlug]/edit.astro +18 -5
  350. package/templates/src/pages/context/[...contextSlug].astro +7 -2
  351. package/templates/src/pages/llms.txt.ts +0 -0
  352. package/templates/src/pages/maint.astro +0 -0
  353. package/templates/src/pages/media/[...slug].astro +0 -0
  354. package/templates/src/pages/robots.txt.ts +0 -0
  355. package/templates/src/pages/sandbox/activate.astro +0 -0
  356. package/templates/src/pages/sandbox/register.astro +0 -0
  357. package/templates/src/pages/sandbox/success.astro +0 -0
  358. package/templates/src/pages/sitemap.xml.ts +0 -0
  359. package/templates/src/pages/storykeep/advanced.astro +2 -3
  360. package/templates/src/pages/storykeep/branding.astro +2 -3
  361. package/templates/src/pages/storykeep/content.astro +2 -3
  362. package/templates/src/pages/storykeep/init.astro +40 -1
  363. package/templates/src/pages/storykeep/login.astro +0 -0
  364. package/templates/src/pages/storykeep/logout.astro +0 -0
  365. package/templates/src/pages/storykeep/profile.astro +0 -0
  366. package/templates/src/pages/storykeep.astro +2 -3
  367. package/templates/src/stores/analytics.ts +0 -0
  368. package/templates/src/stores/backend.ts +0 -0
  369. package/templates/src/stores/navigation.ts +0 -0
  370. package/templates/src/stores/nodes.ts +32 -1
  371. package/templates/src/stores/nodesHistory.ts +0 -0
  372. package/templates/src/stores/notificationSystem.ts +0 -0
  373. package/templates/src/stores/orphanAnalysis.ts +19 -21
  374. package/templates/src/stores/storykeep.ts +7 -0
  375. package/templates/src/types/astro.ts +0 -0
  376. package/templates/src/types/compositorTypes.ts +0 -0
  377. package/templates/src/types/formTypes.ts +0 -0
  378. package/templates/src/types/multiTenant.ts +0 -0
  379. package/templates/src/types/nodeProps.ts +0 -0
  380. package/templates/src/types/tractstack.ts +0 -0
  381. package/templates/src/utils/aai/getTitleSlug.ts +0 -0
  382. package/templates/src/utils/actions/actionButton.ts +0 -0
  383. package/templates/src/utils/actions/lispLexer.ts +0 -0
  384. package/templates/src/utils/actions/preParse_Action.ts +0 -0
  385. package/templates/src/utils/actions/preParse_Bunny.ts +0 -0
  386. package/templates/src/utils/actions/preParse_Clicked.ts +0 -0
  387. package/templates/src/utils/actions/preParse_Impression.ts +0 -0
  388. package/templates/src/utils/api/advancedConfig.ts +0 -0
  389. package/templates/src/utils/api/advancedHelpers.ts +0 -0
  390. package/templates/src/utils/api/beliefConfig.ts +0 -0
  391. package/templates/src/utils/api/beliefHelpers.ts +0 -0
  392. package/templates/src/utils/api/brandConfig.ts +0 -0
  393. package/templates/src/utils/api/brandHelpers.ts +0 -0
  394. package/templates/src/utils/api/fileHelpers.ts +0 -0
  395. package/templates/src/utils/api/menuConfig.ts +0 -0
  396. package/templates/src/utils/api/menuHelpers.ts +0 -0
  397. package/templates/src/utils/api/resourceConfig.ts +0 -0
  398. package/templates/src/utils/api/resourceHelpers.ts +0 -0
  399. package/templates/src/utils/api/tenantConfig.ts +0 -0
  400. package/templates/src/utils/api/tenantHelpers.ts +0 -0
  401. package/templates/src/utils/api.ts +0 -0
  402. package/templates/src/utils/auth.ts +0 -0
  403. package/templates/src/utils/backend.ts +0 -0
  404. package/templates/src/utils/compositor/TemplateMarkdowns.ts +0 -0
  405. package/templates/src/utils/compositor/TemplateNodes.ts +0 -0
  406. package/templates/src/utils/compositor/TemplatePanes.ts +0 -0
  407. package/templates/src/utils/compositor/allowInsert.ts +0 -0
  408. package/templates/src/utils/compositor/domHelpers.ts +0 -0
  409. package/templates/src/utils/compositor/handleClickEvent.ts +0 -0
  410. package/templates/src/utils/compositor/nodesHelper.ts +0 -0
  411. package/templates/src/utils/compositor/nodesMarkdownGenerator.ts +0 -0
  412. package/templates/src/utils/compositor/processMarkdown.ts +0 -0
  413. package/templates/src/utils/compositor/reduceNodesClassNames.ts +0 -0
  414. package/templates/src/utils/compositor/tailwindClasses.ts +0 -0
  415. package/templates/src/utils/compositor/tailwindColors.ts +0 -0
  416. package/templates/src/utils/compositor/templateMarkdownStyles.ts +8 -0
  417. package/templates/src/utils/compositor/typeGuards.ts +0 -0
  418. package/templates/src/utils/etl/extractor.ts +0 -0
  419. package/templates/src/utils/etl/index.ts +0 -0
  420. package/templates/src/utils/etl/loader.ts +0 -0
  421. package/templates/src/utils/etl/transformer.ts +0 -0
  422. package/templates/src/utils/helpers.ts +1 -0
  423. package/templates/src/utils/layout.ts +66 -121
  424. package/templates/src/utils/profileStorage.ts +0 -0
  425. package/templates/src/utils/useInterval.ts +0 -0
  426. package/templates/tailwind.config.cjs +0 -0
  427. package/utils/create-resolver.ts +0 -0
  428. package/utils/inject-files.ts +21 -1
  429. package/utils/validate-config.ts +0 -0
@@ -176,7 +176,7 @@ const createdDate = created ? new Date(created) : new Date();
176
176
  >
177
177
  Tract Stack</a
178
178
  >
179
- &ndash; no-code community engine from{` `}
179
+ &ndash; the &#8220;free web press&#8221; by{` `}
180
180
  <a
181
181
  href="https://atriskmedia.com/?utm_source=tractstack&utm_medium=www&utm_campaign=community"
182
182
  class="font-bold underline hover:text-black"
File without changes
@@ -160,12 +160,13 @@ const authStatus = {
160
160
 
161
161
  {/* Edit Icon */}
162
162
  {
163
- isEditable ? (
163
+ isEditable &&
164
+ (authStatus.isAdmin || authStatus.userRole === 'editor') ? (
164
165
  <a
165
166
  data-astro-reload
166
167
  href={!isContext ? `/${slug}/edit` : `/context/${slug}/edit`}
167
168
  class="text-myblue/80 hover:text-myblue hover:rotate-6"
168
- title={!isContext ? 'Edit this story' : 'Edit this pane'}
169
+ title={!isContext ? 'Edit this story' : 'Edit this page'}
169
170
  >
170
171
  <svg
171
172
  class="h-6 w-6"
@@ -335,7 +336,13 @@ const authStatus = {
335
336
  }
336
337
 
337
338
  <script>
338
- document.addEventListener('DOMContentLoaded', function () {
339
+ if (document.readyState === 'loading') {
340
+ document.addEventListener('DOMContentLoaded', setupAdminModal);
341
+ } else {
342
+ setupAdminModal();
343
+ }
344
+
345
+ function setupAdminModal() {
339
346
  const logoutBtn = document.getElementById(
340
347
  'logout-btn'
341
348
  ) as HTMLButtonElement | null;
@@ -394,65 +401,61 @@ const authStatus = {
394
401
  });
395
402
  }
396
403
 
397
- // Admin Modal JavaScript - Only runs when admin elements exist
398
- const heartBtn = document.getElementById('admin-heart-btn');
399
- const modal = document.getElementById('admin-modal');
400
- const closeBtn = document.getElementById('admin-modal-close');
401
- const iframe = document.getElementById('admin-sysop-iframe');
402
-
403
- if (heartBtn && modal && closeBtn && iframe) {
404
- // Open modal when heart icon is clicked
405
- heartBtn.addEventListener('click', function (e) {
404
+ // Admin Modal JavaScript - Use event delegation
405
+ document.addEventListener('click', function (e) {
406
+ if (e.target && (e.target as Element).closest('#admin-heart-btn')) {
406
407
  e.preventDefault();
407
- modal.classList.remove('hidden');
408
- modal.setAttribute('aria-hidden', 'false');
409
-
410
- // Focus management for accessibility
411
- closeBtn.focus();
412
-
413
- // Prevent body scroll when modal is open
414
- document.body.style.overflow = 'hidden';
415
- });
408
+ const modal = document.getElementById('admin-modal');
409
+ const closeBtn = document.getElementById('admin-modal-close');
410
+
411
+ if (modal && closeBtn) {
412
+ modal.classList.remove('hidden');
413
+ modal.setAttribute('aria-hidden', 'false');
414
+ closeBtn.focus();
415
+ document.body.style.overflow = 'hidden';
416
+ }
417
+ return;
418
+ }
416
419
 
417
- // Close modal when X button is clicked
418
- closeBtn.addEventListener('click', function (e) {
420
+ if (e.target && (e.target as Element).closest('#admin-modal-close')) {
419
421
  e.preventDefault();
420
422
  closeModal();
421
- });
423
+ return;
424
+ }
422
425
 
423
- // Close modal when clicking outside the iframe
424
- modal.addEventListener('click', function (e) {
425
- if (e.target === modal) {
426
- closeModal();
427
- }
428
- });
426
+ if (e.target && (e.target as Element).id === 'admin-modal') {
427
+ closeModal();
428
+ return;
429
+ }
430
+ });
429
431
 
430
- // Close modal with Escape key
431
- document.addEventListener('keydown', function (e) {
432
- if (e.key === 'Escape' && !modal.classList.contains('hidden')) {
432
+ document.addEventListener('keydown', function (e) {
433
+ if (e.key === 'Escape') {
434
+ const modal = document.getElementById('admin-modal');
435
+ if (modal && !modal.classList.contains('hidden')) {
433
436
  closeModal();
434
437
  }
435
- });
436
-
437
- function closeModal() {
438
- modal?.classList.add('hidden');
439
- modal?.setAttribute('aria-hidden', 'true');
440
-
441
- // Restore body scroll
442
- document.body.style.overflow = '';
443
-
444
- // Return focus to heart button for accessibility
445
- heartBtn?.focus();
446
438
  }
439
+ });
447
440
 
448
- // Handle iframe load events for better UX
449
- //iframe.addEventListener('load', function () {
450
- // console.log('Admin panel loaded successfully');
451
- //});
441
+ function closeModal() {
442
+ const modal = document.getElementById('admin-modal');
443
+ const heartBtn = document.getElementById('admin-heart-btn');
452
444
 
453
- iframe.addEventListener('error', function () {
454
- console.error('Failed to load admin panel');
455
- });
445
+ modal?.classList.add('hidden');
446
+ modal?.setAttribute('aria-hidden', 'true');
447
+ document.body.style.overflow = '';
448
+ heartBtn?.focus();
456
449
  }
457
- });
450
+
451
+ // iframe error handling
452
+ document.addEventListener('DOMContentLoaded', function () {
453
+ const iframe = document.getElementById('admin-sysop-iframe');
454
+ if (iframe) {
455
+ iframe.addEventListener('error', function () {
456
+ console.error('Failed to load admin panel');
457
+ });
458
+ }
459
+ });
460
+ }
458
461
  </script>
File without changes
@@ -45,11 +45,13 @@ interface ContentMapItem {
45
45
  interface EpinetDurationSelectorProps {
46
46
  fullContentMap?: ContentMapItem[];
47
47
  isLoading?: boolean;
48
+ hourlyNodeActivity?: any;
48
49
  }
49
50
 
50
51
  const EpinetDurationSelector = ({
51
52
  fullContentMap,
52
53
  isLoading,
54
+ hourlyNodeActivity,
53
55
  }: EpinetDurationSelectorProps = {}) => {
54
56
  const [startDate, setStartDate] = useState<Date | null>(null);
55
57
  const [endDate, setEndDate] = useState<Date | null>(null);
@@ -185,22 +187,12 @@ const EpinetDurationSelector = ({
185
187
  const startUTCTime = createUTCDateTime(startDate, localFilters.startHour);
186
188
  const endUTCTime = createUTCDateTime(endDate, localFilters.endHour);
187
189
 
188
- if (endUTCTime <= startUTCTime) {
190
+ if (endUTCTime < startUTCTime) {
189
191
  setErrorMessage('End time must be after start time.');
190
192
  return;
191
193
  }
192
194
 
193
195
  const nowUTC = new Date();
194
- const maxPastTime = new Date(
195
- nowUTC.getTime() - MAX_ANALYTICS_HOURS * 60 * 60 * 1000
196
- );
197
-
198
- if (startUTCTime < maxPastTime) {
199
- setErrorMessage(
200
- `Start time cannot be more than ${MAX_ANALYTICS_HOURS} hours in the past.`
201
- );
202
- return;
203
- }
204
196
 
205
197
  if (endUTCTime > nowUTC) {
206
198
  setErrorMessage('End time cannot be in the future.');
@@ -549,7 +541,7 @@ const EpinetDurationSelector = ({
549
541
 
550
542
  return (
551
543
  <>
552
- <div className="space-y-4">
544
+ <div className="space-y-4 overflow-visible">
553
545
  {$epinetCustomFilters.enabled && (
554
546
  <div
555
547
  className={`space-y-4 rounded-lg border-2 border-dashed border-gray-200 bg-gray-50 p-4`}
@@ -865,7 +857,10 @@ const EpinetDurationSelector = ({
865
857
  </Select.Control>
866
858
  <Portal>
867
859
  <Select.Positioner>
868
- <Select.Content className="z-10 mt-2 max-h-96 w-[var(--trigger-width)] overflow-auto rounded-md bg-white text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none">
860
+ <Select.Content
861
+ className="z-10 mt-2 max-h-96 overflow-auto rounded-md bg-white text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none"
862
+ style={{ width: 'var(--trigger-width)' }}
863
+ >
869
864
  {paginatedUserCounts.length > 0 ? (
870
865
  [
871
866
  <Select.Item
@@ -930,6 +925,7 @@ const EpinetDurationSelector = ({
930
925
  <EpinetTableView
931
926
  fullContentMap={fullContentMap || []}
932
927
  isLoading={isLoading}
928
+ hourlyNodeActivity={hourlyNodeActivity}
933
929
  />
934
930
  )}
935
931
  </div>
@@ -53,13 +53,17 @@ interface ContentMapItem {
53
53
  type: string;
54
54
  }
55
55
 
56
+ interface Props {
57
+ fullContentMap: ContentMapItem[];
58
+ isLoading?: boolean;
59
+ hourlyNodeActivity?: any;
60
+ }
61
+
56
62
  const EpinetTableView = ({
57
63
  fullContentMap,
58
64
  isLoading = false,
59
- }: {
60
- fullContentMap: ContentMapItem[];
61
- isLoading?: boolean;
62
- }) => {
65
+ hourlyNodeActivity,
66
+ }: Props) => {
63
67
  const $epinetCustomFilters = useStore(epinetCustomFilters);
64
68
  const [currentDay, setCurrentDay] = useState<string | null>(null);
65
69
  const [availableDays, setAvailableDays] = useState<string[]>([]);
@@ -174,7 +178,7 @@ const EpinetTableView = ({
174
178
  };
175
179
 
176
180
  useEffect(() => {
177
- const hourlyActivity = $epinetCustomFilters.hourlyNodeActivity || {};
181
+ const hourlyActivity = hourlyNodeActivity || {};
178
182
  const hourKeys = Object.keys(hourlyActivity);
179
183
 
180
184
  if (hourKeys.length === 0) {
@@ -192,7 +196,7 @@ const EpinetTableView = ({
192
196
  setAvailableDays(days);
193
197
  setCurrentDay(days[0] || null);
194
198
  setCurrentDayIndex(0);
195
- }, [$epinetCustomFilters.hourlyNodeActivity]);
199
+ }, [hourlyNodeActivity]);
196
200
 
197
201
  const navigateDay = (direction: 'prev' | 'next') => {
198
202
  const newIndex =
@@ -213,7 +217,7 @@ const EpinetTableView = ({
213
217
  if (!currentDay)
214
218
  return { data: [], dailyTotal: 0, dailyVisitors: 0, maxHourlyTotal: 0 };
215
219
 
216
- const hourlyActivity = $epinetCustomFilters.hourlyNodeActivity || {};
220
+ const hourlyActivity = hourlyNodeActivity || {};
217
221
  const result: HourData[] = [];
218
222
  let emptyRangeStart: number | null = null;
219
223
  let dailyTotal = 0;
@@ -234,9 +234,10 @@ const SankeyDiagram = ({ data, isLoading = false }: SankeyDiagramProps) => {
234
234
  }
235
235
  }, [data, dimensions]);
236
236
 
237
- const compressedHeight = COMPRESSED_HEIGHT;
238
- const needsCompression = compressedHeight && !isExpanded;
239
- const displayHeight = needsCompression ? compressedHeight : dimensions.height;
237
+ const needsCompression = !isExpanded && dimensions.height > COMPRESSED_HEIGHT;
238
+ const displayHeight = needsCompression
239
+ ? COMPRESSED_HEIGHT
240
+ : dimensions.height;
240
241
 
241
242
  const handleExpand = () => {
242
243
  setIsExpanded(!isExpanded);
@@ -312,7 +312,7 @@ const getElement = (
312
312
  case 'impression':
313
313
  return <></>;
314
314
  default:
315
- console.warn(`Node.tsx miss on ${type}`);
315
+ console.warn(`Node.tsx miss on ${type}`, node);
316
316
  return <></>;
317
317
  }
318
318
  };
@@ -51,26 +51,40 @@ const PanelVisibilityWrapper = ({
51
51
  const currentWrapper = wrapperRef.current;
52
52
  if (!currentWrapper) return;
53
53
 
54
- // Always observe the panel, regardless of active state
54
+ // Skip intersection observer for 'add' panels - they behave differently
55
+ if (panelType === 'add') {
56
+ return;
57
+ }
58
+
55
59
  const observer = new IntersectionObserver(
56
60
  (entries) => {
57
- // Only take action if this panel is currently active and not intersecting
58
- if (!entries[0].isIntersecting && isActive) {
59
- nodesCtx.closeAllPanels();
61
+ // Add delay to prevent immediate closing during panel activation
62
+ if (isActive) {
63
+ setTimeout(() => {
64
+ // Double-check the panel is still active before closing
65
+ const currentActiveMode = nodesCtx.activePaneMode.get();
66
+ const stillActive =
67
+ currentActiveMode.panel === panelType &&
68
+ currentActiveMode.paneId === nodeId;
69
+ if (!entries[0].isIntersecting && stillActive) {
70
+ console.log('❌ CLOSING PANEL DUE TO INTERSECTION OBSERVER!', {
71
+ panelType,
72
+ nodeId,
73
+ });
74
+ nodesCtx.closeAllPanels();
75
+ }
76
+ }, 100); // Small delay to allow panel to render
60
77
  }
61
78
  },
62
79
  {
63
- threshold: 0.1, // Close when 90% of the panel is out of view
64
- rootMargin: '-10px', // Small margin to make detection a bit more forgiving
80
+ threshold: 0.1,
81
+ rootMargin: '-10px',
65
82
  }
66
83
  );
67
84
 
68
85
  observer.observe(currentWrapper);
69
-
70
- return () => {
71
- observer.disconnect();
72
- };
73
- }, [nodeId, panelType, nodesCtx, isActive]); // Include isActive in dependencies
86
+ return () => observer.disconnect();
87
+ }, [nodeId, panelType, nodesCtx, isActive]);
74
88
 
75
89
  return (
76
90
  <div
@@ -1,4 +1,4 @@
1
- import { useEffect, useState, memo, type CSSProperties } from 'react';
1
+ import { useEffect, useState, memo, Fragment, type CSSProperties } from 'react';
2
2
  import { getCtx } from '@/stores/nodes';
3
3
  import { viewportKeyStore } from '@/stores/storykeep';
4
4
  import { RenderChildren } from './RenderChildren';
@@ -27,12 +27,19 @@ const CodeHookContainer = ({
27
27
  {Object.entries(payload.params).map(
28
28
  ([key, value]) =>
29
29
  value && (
30
- <div key={key} className="flex items-start">
30
+ <Fragment key={key}>
31
31
  <span className="min-w-24 font-bold text-gray-600">{key}:</span>
32
- <span className="ml-2 text-gray-800">
33
- {JSON.stringify(value)}
34
- </span>
35
- </div>
32
+ <div className="ml-2 flex flex-wrap gap-1">
33
+ {value.split('|').map((item, index) => (
34
+ <span
35
+ key={index}
36
+ className="inline-block rounded bg-gray-200 px-2 py-0.5 text-xs text-gray-800"
37
+ >
38
+ {item}
39
+ </span>
40
+ ))}
41
+ </div>
42
+ </Fragment>
36
43
  )
37
44
  )}
38
45
  </div>
@@ -13,6 +13,7 @@ import {
13
13
  viewportModeStore,
14
14
  setViewportMode,
15
15
  settingsPanelStore,
16
+ pendingHomePageSlugStore,
16
17
  } from '@/stores/storykeep';
17
18
  import { getCtx, ROOT_NODE_NAME } from '@/stores/nodes';
18
19
  import SaveModal from '@/components/edit/state/SaveModal';
@@ -24,6 +25,7 @@ interface StoryKeepHeaderProps {
24
25
 
25
26
  const StoryKeepHeader = ({ slug, isContext = false }: StoryKeepHeaderProps) => {
26
27
  const viewport = useStore(viewportModeStore);
28
+ const pendingHomePageSlug = useStore(pendingHomePageSlugStore);
27
29
  const ctx = getCtx();
28
30
  const hasTitle = useStore(ctx.hasTitle);
29
31
  const hasPanes = useStore(ctx.hasPanes);
@@ -61,7 +63,8 @@ const StoryKeepHeader = ({ slug, isContext = false }: StoryKeepHeaderProps) => {
61
63
  };
62
64
 
63
65
  const handleVisitPage = () => {
64
- if (canUndo) {
66
+ const hasChanges = canUndo || pendingHomePageSlug;
67
+ if (hasChanges) {
65
68
  if (
66
69
  confirm(
67
70
  'You have unsaved changes. Do you want to visit the page anyway?'
@@ -89,6 +92,9 @@ const StoryKeepHeader = ({ slug, isContext = false }: StoryKeepHeaderProps) => {
89
92
  { value: 'desktop', Icon: ComputerDesktopIcon, title: 'Desktop Viewport' },
90
93
  ];
91
94
 
95
+ // Show save button if there are undo changes OR pending home page change
96
+ const shouldShowSave = canUndo || pendingHomePageSlug;
97
+
92
98
  if (!hasTitle && !hasPanes) return null;
93
99
 
94
100
  return (
@@ -127,7 +133,7 @@ const StoryKeepHeader = ({ slug, isContext = false }: StoryKeepHeaderProps) => {
127
133
  className={`${iconClassName} relative`}
128
134
  >
129
135
  <GlobeAltIcon />
130
- {canUndo && (
136
+ {shouldShowSave && (
131
137
  <ExclamationTriangleIcon className="absolute -right-1 -top-1 h-3 w-3 rounded-full bg-white text-amber-500" />
132
138
  )}
133
139
  </button>
@@ -156,7 +162,7 @@ const StoryKeepHeader = ({ slug, isContext = false }: StoryKeepHeaderProps) => {
156
162
  </div>
157
163
  )}
158
164
 
159
- {canUndo && (
165
+ {shouldShowSave && (
160
166
  <div className="flex flex-wrap items-center justify-center gap-2 text-sm">
161
167
  <button
162
168
  onClick={handleSave}
@@ -110,13 +110,9 @@ const PanelSwitch = ({
110
110
  break;
111
111
 
112
112
  case 'style-parent-add':
113
- if (markdownNode && signal.className)
113
+ if (markdownNode)
114
114
  return (
115
- <StyleParentAddPanel
116
- node={markdownNode}
117
- layer={signal.layer || 0}
118
- className={signal.className}
119
- />
115
+ <StyleParentAddPanel node={markdownNode} layer={signal.layer || 0} />
120
116
  );
121
117
  break;
122
118
 
@@ -200,12 +196,11 @@ const PanelSwitch = ({
200
196
  break;
201
197
 
202
198
  case 'style-element-add':
203
- if (clickedNode && markdownNode && signal.className)
199
+ if (clickedNode && markdownNode)
204
200
  return (
205
201
  <StyleElementAddPanel
206
202
  node={clickedNode}
207
203
  parentNode={markdownNode}
208
- className={signal.className}
209
204
  onTitleChange={onTitleChange}
210
205
  />
211
206
  );
@@ -317,6 +312,7 @@ const PanelSwitch = ({
317
312
 
318
313
  case 'style-code-config':
319
314
  if (clickedNode) return <StyleWidgetConfigPanel node={clickedNode} />;
315
+ break;
320
316
 
321
317
  case 'style-code-add':
322
318
  case 'style-code-container-add':