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
@@ -11,12 +11,15 @@ import {
11
11
  fullContentMapStore,
12
12
  getPendingImageOperation,
13
13
  clearPendingImageOperation,
14
+ pendingHomePageSlugStore,
14
15
  } from '@/stores/storykeep';
15
16
  import { startLoadingAnimation } from '@/utils/helpers';
16
17
  import type {
18
+ FlatNode,
17
19
  BaseNode,
18
20
  PaneNode,
19
21
  StoryFragmentNode,
22
+ MarkdownPaneFragmentNode,
20
23
  } from '@/types/compositorTypes';
21
24
 
22
25
  type SaveStage =
@@ -27,6 +30,7 @@ type SaveStage =
27
30
  | 'SAVING_STORY_FRAGMENTS'
28
31
  | 'LINKING_FILES'
29
32
  | 'PROCESSING_STYLES'
33
+ | 'UPDATING_HOME_PAGE'
30
34
  | 'COMPLETED'
31
35
  | 'ERROR';
32
36
 
@@ -59,13 +63,9 @@ export default function SaveModal({
59
63
  const [debugMessages, setDebugMessages] = useState<string[]>([]);
60
64
  const isSaving = useRef(false);
61
65
  const [isNavigating, setIsNavigating] = useState(false);
62
-
63
- // Determine if we're in create mode
64
66
  const isCreateMode = slug === 'create';
65
-
66
67
  const contentMap = fullContentMapStore.get();
67
-
68
- // Get backend URL
68
+ const pendingHomePageSlug = pendingHomePageSlugStore.get();
69
69
  const goBackend =
70
70
  import.meta.env.PUBLIC_GO_BACKEND || 'http://localhost:8080';
71
71
  const tenantId = import.meta.env.PUBLIC_TENANTID || 'default';
@@ -143,7 +143,8 @@ export default function SaveModal({
143
143
  if (
144
144
  relevantNodeCount === 0 &&
145
145
  nodesWithPendingFiles.length === 0 &&
146
- storyFragmentsWithPendingImages.length === 0
146
+ storyFragmentsWithPendingImages.length === 0 &&
147
+ !pendingHomePageSlug
147
148
  ) {
148
149
  addDebugMessage('No changes to save');
149
150
  setStage('COMPLETED');
@@ -317,6 +318,56 @@ export default function SaveModal({
317
318
  isContext
318
319
  );
319
320
 
321
+ // This ensures css generation in the next phase uses fresh values
322
+ payload.optionsPayload.nodes.forEach((transformedNode) => {
323
+ const liveNode = ctx.allNodes.get().get(transformedNode.id);
324
+ if (!liveNode) return;
325
+
326
+ let needsUpdate = false;
327
+ let updatedNode: BaseNode = { ...liveNode };
328
+
329
+ // Update elementCss for TagElement nodes (FlatNode)
330
+ if (
331
+ transformedNode.nodeType === 'TagElement' &&
332
+ transformedNode.elementCss
333
+ ) {
334
+ const flatNode = liveNode as FlatNode;
335
+ if (flatNode.elementCss !== transformedNode.elementCss) {
336
+ (updatedNode as FlatNode).elementCss =
337
+ transformedNode.elementCss;
338
+ needsUpdate = true;
339
+ }
340
+ }
341
+
342
+ // Update parentCss for Markdown nodes (MarkdownPaneFragmentNode)
343
+ if (
344
+ transformedNode.nodeType === 'Markdown' &&
345
+ transformedNode.parentCss
346
+ ) {
347
+ const markdownNode = liveNode as MarkdownPaneFragmentNode;
348
+ const currentParentCss = markdownNode.parentCss;
349
+ const newParentCss = transformedNode.parentCss as string[];
350
+
351
+ const isDifferent =
352
+ !currentParentCss ||
353
+ currentParentCss.length !== newParentCss.length ||
354
+ currentParentCss.some(
355
+ (css, index) => css !== newParentCss[index]
356
+ );
357
+
358
+ if (isDifferent) {
359
+ (updatedNode as MarkdownPaneFragmentNode).parentCss =
360
+ newParentCss;
361
+ needsUpdate = true;
362
+ }
363
+ }
364
+
365
+ // Only update the live node if there are actual changes
366
+ if (needsUpdate) {
367
+ ctx.allNodes.get().set(transformedNode.id, updatedNode);
368
+ }
369
+ });
370
+
320
371
  // Check if this pane exists or is new
321
372
  const paneExistsInBackend = contentMap.some(
322
373
  (item) => item.type === 'Pane' && item.id === paneNode.id
@@ -505,67 +556,122 @@ export default function SaveModal({
505
556
  const { dirtyPaneIds, classes: dirtyClasses } =
506
557
  ctx.getDirtyNodesClassData();
507
558
 
508
- if (dirtyClasses.length === 0) {
509
- addDebugMessage(
510
- 'No dirty classes to process, skipping Tailwind update'
559
+ // STEP 1: Generate CSS using Astro API
560
+ const astroEndpoint = `/api/tailwind`;
561
+ const astroPayload = { dirtyPaneIds, dirtyClasses };
562
+ const astroResponse = await fetch(astroEndpoint, {
563
+ method: 'POST',
564
+ headers: {
565
+ 'Content-Type': 'application/json',
566
+ 'X-Tenant-ID': tenantId,
567
+ },
568
+ credentials: 'include',
569
+ body: JSON.stringify(astroPayload),
570
+ });
571
+
572
+ if (!astroResponse.ok) {
573
+ throw new Error(
574
+ `CSS generation failed! status: ${astroResponse.status}`
511
575
  );
512
- } else {
513
- // STEP 1: Generate CSS using Astro API
514
- const astroEndpoint = `/api/tailwind`;
515
- const astroPayload = { dirtyPaneIds, dirtyClasses };
516
- const astroResponse = await fetch(astroEndpoint, {
517
- method: 'POST',
576
+ }
577
+
578
+ const astroResult = await astroResponse.json();
579
+
580
+ if (!astroResult.success || !astroResult.generatedCss) {
581
+ throw new Error('CSS generation failed: no CSS returned');
582
+ }
583
+
584
+ addDebugMessage(
585
+ `CSS generated: ${astroResult.generatedCss.length} bytes for ${dirtyClasses.length} classes`
586
+ );
587
+
588
+ // STEP 2: Save CSS to Go backend
589
+ const goEndpoint = `${goBackend}/api/v1/tailwind/update`;
590
+ const goPayload = { frontendCss: astroResult.generatedCss };
591
+ const goResponse = await fetch(goEndpoint, {
592
+ method: 'POST',
593
+ headers: {
594
+ 'Content-Type': 'application/json',
595
+ 'X-Tenant-ID': tenantId,
596
+ },
597
+ credentials: 'include',
598
+ body: JSON.stringify(goPayload),
599
+ });
600
+
601
+ if (!goResponse.ok) {
602
+ throw new Error(`CSS save failed! status: ${goResponse.status}`);
603
+ }
604
+
605
+ const goResult = await goResponse.json();
606
+ addDebugMessage(
607
+ `CSS saved successfully: stylesVer ${goResult.stylesVer}`
608
+ );
609
+ } catch (error) {
610
+ const errorMsg =
611
+ error instanceof Error ? error.message : 'Unknown error';
612
+ addDebugMessage(`Styles processing failed: ${errorMsg}`);
613
+ throw new Error(`Failed to process styles: ${errorMsg}`);
614
+ }
615
+
616
+ // Check if we need to update home page
617
+ if (pendingHomePageSlug) {
618
+ setStage('UPDATING_HOME_PAGE');
619
+ setProgress(98);
620
+ addDebugMessage(`Updating home page to: ${pendingHomePageSlug}`);
621
+
622
+ try {
623
+ // First get current brand config
624
+ const response = await fetch(`${goBackend}/api/v1/config/brand`, {
625
+ method: 'GET',
518
626
  headers: {
519
627
  'Content-Type': 'application/json',
520
628
  'X-Tenant-ID': tenantId,
521
629
  },
522
630
  credentials: 'include',
523
- body: JSON.stringify(astroPayload),
524
631
  });
525
632
 
526
- if (!astroResponse.ok) {
633
+ if (!response.ok) {
527
634
  throw new Error(
528
- `CSS generation failed! status: ${astroResponse.status}`
635
+ `Failed to get current brand config: ${response.status}`
529
636
  );
530
637
  }
531
638
 
532
- const astroResult = await astroResponse.json();
639
+ const currentBrandConfig = await response.json();
533
640
 
534
- if (!astroResult.success || !astroResult.generatedCss) {
535
- throw new Error('CSS generation failed: no CSS returned');
536
- }
641
+ // Update HOME_SLUG
642
+ const updatedBrandConfig = {
643
+ ...currentBrandConfig,
644
+ HOME_SLUG: pendingHomePageSlug,
645
+ };
537
646
 
538
- addDebugMessage(
539
- `CSS generated: ${astroResult.generatedCss.length} bytes for ${dirtyClasses.length} classes`
647
+ const updateResponse = await fetch(
648
+ `${goBackend}/api/v1/config/brand`,
649
+ {
650
+ method: 'PUT',
651
+ headers: {
652
+ 'Content-Type': 'application/json',
653
+ 'X-Tenant-ID': tenantId,
654
+ },
655
+ credentials: 'include',
656
+ body: JSON.stringify(updatedBrandConfig),
657
+ }
540
658
  );
541
659
 
542
- // STEP 2: Save CSS to Go backend
543
- const goEndpoint = `${goBackend}/api/v1/tailwind/update`;
544
- const goPayload = { frontendCss: astroResult.generatedCss };
545
- const goResponse = await fetch(goEndpoint, {
546
- method: 'POST',
547
- headers: {
548
- 'Content-Type': 'application/json',
549
- 'X-Tenant-ID': tenantId,
550
- },
551
- credentials: 'include',
552
- body: JSON.stringify(goPayload),
553
- });
554
-
555
- if (!goResponse.ok) {
556
- throw new Error(`CSS save failed! status: ${goResponse.status}`);
660
+ if (!updateResponse.ok) {
661
+ throw new Error(
662
+ `Failed to update home page: ${updateResponse.status}`
663
+ );
557
664
  }
558
665
 
559
- const goResult = await goResponse.json();
560
- addDebugMessage(
561
- `CSS saved successfully: stylesVer ${goResult.stylesVer}`
562
- );
666
+ // Clear the pending operation
667
+ pendingHomePageSlugStore.set(null);
668
+ addDebugMessage('Home page updated successfully');
669
+ } catch (error) {
670
+ const errorMsg =
671
+ error instanceof Error ? error.message : 'Unknown error';
672
+ addDebugMessage(`Home page update failed: ${errorMsg}`);
673
+ throw new Error(`Failed to update home page: ${errorMsg}`);
563
674
  }
564
- } catch (error) {
565
- const errorMsg =
566
- error instanceof Error ? error.message : 'Unknown error';
567
- addDebugMessage(`Styles processing failed: ${errorMsg}`);
568
- throw new Error(`Failed to process styles: ${errorMsg}`);
569
675
  }
570
676
 
571
677
  // Success!
@@ -612,6 +718,8 @@ export default function SaveModal({
612
718
  return 'Linking file relationships...';
613
719
  case 'PROCESSING_STYLES':
614
720
  return 'Processing styles...';
721
+ case 'UPDATING_HOME_PAGE':
722
+ return 'Updating home page...';
615
723
  case 'COMPLETED':
616
724
  return `${actionText} ${modeText.toLowerCase()} completed successfully!`;
617
725
  case 'ERROR':
@@ -1,8 +1,11 @@
1
1
  import { useState, useEffect, type ChangeEvent } from 'react';
2
+ import { useStore } from '@nanostores/react';
2
3
  import ExclamationTriangleIcon from '@heroicons/react/24/outline/ExclamationTriangleIcon';
3
4
  import CheckIcon from '@heroicons/react/24/outline/CheckIcon';
4
5
  import LockClosedIcon from '@heroicons/react/24/outline/LockClosedIcon';
6
+ import { Switch } from '@ark-ui/react/switch';
5
7
  import { getCtx } from '@/stores/nodes';
8
+ import { pendingHomePageSlugStore } from '@/stores/storykeep';
6
9
  import { cloneDeep } from '@/utils/helpers';
7
10
  import type { BrandConfig } from '@/types/tractstack';
8
11
  import {
@@ -28,6 +31,8 @@ const StoryFragmentSlugPanel = ({
28
31
  const [validationError, setValidationError] = useState<string | null>(null);
29
32
  const [canSave, setCanSave] = useState(false);
30
33
  const isHomeSlug = slug === config.HOME_SLUG;
34
+ const pendingHomePageSlug = useStore(pendingHomePageSlugStore);
35
+ const isSetAsHomePage = pendingHomePageSlug === slug;
31
36
 
32
37
  const ctx = getCtx();
33
38
  const allNodes = ctx.allNodes.get();
@@ -129,6 +134,14 @@ const StoryFragmentSlugPanel = ({
129
134
  }
130
135
  };
131
136
 
137
+ const handleSetAsHomePageChange = (details: { checked: boolean }) => {
138
+ if (details.checked) {
139
+ pendingHomePageSlugStore.set(slug);
140
+ } else {
141
+ pendingHomePageSlugStore.set(null);
142
+ }
143
+ };
144
+
132
145
  return (
133
146
  <div className="group mb-4 w-full rounded-b-md bg-white px-1.5 py-6">
134
147
  <div className="px-3.5">
@@ -194,72 +207,60 @@ const StoryFragmentSlugPanel = ({
194
207
  </span>
195
208
  </div>
196
209
  </div>
210
+
197
211
  {validationError && (
198
212
  <div className="mt-2 text-sm text-red-600">
199
213
  <ExclamationTriangleIcon className="mr-1 inline h-4 w-4" />
200
214
  {validationError}
201
215
  </div>
202
216
  )}
217
+
203
218
  {isHomeSlug && (
204
- <div className="mt-2 text-sm text-gray-600">
205
- <LockClosedIcon className="mr-1 inline h-4 w-4" />
206
- This is your home page slug and cannot be modified
219
+ <div className="mt-4">
220
+ <div className="inline-flex items-center rounded-full bg-blue-100 px-3 py-1.5 text-sm font-medium text-blue-800">
221
+ <LockClosedIcon className="mr-1.5 h-4 w-4" />
222
+ Home Page
223
+ </div>
224
+ <div className="mt-2 text-sm text-gray-600">
225
+ This is your current home page
226
+ </div>
207
227
  </div>
208
228
  )}
209
- <div className="mt-4 text-lg">
210
- <div className="text-gray-600">
211
- Create a clean, descriptive URL slug that helps users and search
212
- engines understand the page content.
213
- <ul className="ml-4 mt-1">
214
- <li>
215
- <CheckIcon className="inline h-4 w-4" /> Use hyphens to separate
216
- words
217
- </li>
218
- <li>
219
- <CheckIcon className="inline h-4 w-4" /> Keep it short and
220
- descriptive
221
- </li>
222
- <li>
223
- <CheckIcon className="inline h-4 w-4" /> Use only lowercase
224
- letters, numbers, and hyphens
225
- </li>
226
- <li>
227
- <CheckIcon className="inline h-4 w-4" /> Must start and end with
228
- a letter or number
229
- </li>
230
- </ul>
231
- </div>
232
- <div className="py-4">
233
- {!isHomeSlug && (
234
- <>
235
- {charCount < 3 && (
236
- <span className="text-red-500">
237
- Slug must be at least 3 characters
238
- </span>
239
- )}
240
- {charCount >= 3 && charCount < 5 && !validationError && (
241
- <span className="text-gray-500">
242
- Consider adding more characters for better description
243
- </span>
244
- )}
245
- {warning && !validationError && (
246
- <span className="text-yellow-500">
247
- Slug is getting long - consider shortening it
248
- </span>
249
- )}
250
- {isValid && canSave && charCount >= 5 && !validationError && (
251
- <span className="text-green-500">
252
- Good URL length and format!
253
- </span>
254
- )}
255
- {isValid && !canSave && !validationError && (
256
- <span className="text-gray-500">
257
- Valid characters but needs proper formatting to save
258
- </span>
259
- )}
260
- </>
229
+
230
+ {!isHomeSlug && isValid && canSave && (
231
+ <div className="mt-4">
232
+ <div className="flex items-center space-x-3">
233
+ <Switch.Root
234
+ checked={isSetAsHomePage}
235
+ onCheckedChange={handleSetAsHomePageChange}
236
+ className="flex items-center"
237
+ >
238
+ <Switch.Control
239
+ className={`relative inline-flex h-6 w-11 shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none ${
240
+ isSetAsHomePage ? 'bg-cyan-600' : 'bg-gray-200'
241
+ }`}
242
+ >
243
+ <Switch.Thumb
244
+ className={`pointer-events-none inline-block h-5 w-5 transform rounded-full bg-white shadow-lg ring-0 transition duration-200 ease-in-out ${
245
+ isSetAsHomePage ? 'translate-x-5' : 'translate-x-0'
246
+ }`}
247
+ />
248
+ </Switch.Control>
249
+ <Switch.HiddenInput />
250
+ </Switch.Root>
251
+ <span className="text-sm text-gray-700">Set as Home Page</span>
252
+ </div>
253
+ {isSetAsHomePage && (
254
+ <div className="mt-2 text-sm text-cyan-600">
255
+ Will be set as home page when saved
256
+ </div>
261
257
  )}
262
258
  </div>
259
+ )}
260
+
261
+ <div className="mt-4 text-sm text-gray-600">
262
+ Create a clean, descriptive URL slug that helps users and search
263
+ engines understand the page content.
263
264
  </div>
264
265
  </div>
265
266
  </div>
File without changes
@@ -120,7 +120,7 @@ const BackgroundImageWrapper = ({
120
120
  <label className="block text-sm font-bold text-gray-700">
121
121
  Position
122
122
  </label>
123
- <div className="flex space-x-4">
123
+ <div className="flex flex-wrap space-x-4">
124
124
  {(
125
125
  [
126
126
  'background',
File without changes
File without changes
File without changes
File without changes
@@ -13,7 +13,7 @@ import CheckIcon from '@heroicons/react/24/outline/CheckIcon';
13
13
  import DevicePhoneMobileIcon from '@heroicons/react/24/outline/DevicePhoneMobileIcon';
14
14
  import DeviceTabletIcon from '@heroicons/react/24/outline/DeviceTabletIcon';
15
15
  import ComputerDesktopIcon from '@heroicons/react/24/outline/ComputerDesktopIcon';
16
- import { classNames } from '@/utils/helpers';
16
+ import { classNames, useDropdownDirection } from '@/utils/helpers';
17
17
  import { tailwindToHex, colorValues } from '@/utils/compositor/tailwindColors';
18
18
  import type { BrandConfig } from '@/types/tractstack';
19
19
 
@@ -46,6 +46,8 @@ const ViewportComboBox = ({
46
46
  const [query, setQuery] = useState('');
47
47
  const [isNowNegative, setIsNowNegative] = useState(isNegative);
48
48
  const inputRef = useRef<HTMLInputElement>(null);
49
+ const comboboxRef = useRef<HTMLDivElement>(null);
50
+ const { openAbove, maxHeight } = useDropdownDirection(comboboxRef);
49
51
 
50
52
  const Icon =
51
53
  viewport === 'mobile'
@@ -155,7 +157,7 @@ const ViewportComboBox = ({
155
157
  openOnKeyPress={true}
156
158
  composite={true}
157
159
  >
158
- <div className="relative">
160
+ <div ref={comboboxRef} className="relative">
159
161
  <div className="relative flex items-center">
160
162
  {isColorValue && (
161
163
  <div
@@ -187,7 +189,12 @@ const ViewportComboBox = ({
187
189
  </Combobox.Trigger>
188
190
  </div>
189
191
  </div>
190
- <Combobox.Content className="absolute z-50 mt-1 max-h-32 w-full overflow-auto rounded-md bg-white py-1 text-xl shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none">
192
+ <Combobox.Content
193
+ className={`absolute z-50 mt-1 w-full overflow-auto rounded-md bg-white py-1 text-xl shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none ${
194
+ openAbove ? 'bottom-full mb-1' : 'top-full'
195
+ }`}
196
+ style={{ maxHeight: `${maxHeight}px` }}
197
+ >
191
198
  {collection.items.length === 0 ? (
192
199
  <div className="text-mydarkgrey relative cursor-default select-none px-4 py-2">
193
200
  Nothing found.
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -131,7 +131,7 @@ export default function StoryKeepDashboard_Advanced({
131
131
  };
132
132
 
133
133
  return (
134
- <div className="space-y-6">
134
+ <div className="space-y-8">
135
135
  {initialize && (
136
136
  <div className="rounded-md border border-blue-200 bg-blue-50 p-4">
137
137
  <div className="flex">