astro-tractstack 2.0.0-rc.2 → 2.0.0-rc.21

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 (428) 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 +103 -45
  5. package/dist/index.js +17 -1
  6. package/package.json +8 -3
  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 +3 -4
  104. package/templates/custom/minimal/CustomRoutes.astro +25 -31
  105. package/templates/custom/with-examples/CodeHook.astro +3 -4
  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/components/Footer.astro +1 -1
  136. package/templates/src/components/Fragment.astro +0 -0
  137. package/templates/src/components/Header.astro +55 -52
  138. package/templates/src/components/Menu.tsx +0 -0
  139. package/templates/src/components/codehooks/BunnyVideoSetup.tsx +0 -0
  140. package/templates/src/components/codehooks/BunnyVideoWrapper.astro +0 -0
  141. package/templates/src/components/codehooks/EpinetDurationSelector.tsx +6 -3
  142. package/templates/src/components/codehooks/EpinetTableView.tsx +0 -0
  143. package/templates/src/components/codehooks/EpinetWrapper.tsx +0 -0
  144. package/templates/src/components/codehooks/FeaturedContent.astro +0 -0
  145. package/templates/src/components/codehooks/FeaturedContentSetup.tsx +0 -0
  146. package/templates/src/components/codehooks/ListContent.astro +0 -0
  147. package/templates/src/components/codehooks/ListContentSetup.tsx +0 -0
  148. package/templates/src/components/codehooks/SankeyDiagram.tsx +4 -3
  149. package/templates/src/components/compositor/Compositor.tsx +0 -0
  150. package/templates/src/components/compositor/Node.tsx +0 -0
  151. package/templates/src/components/compositor/NodeWithGuid.tsx +0 -0
  152. package/templates/src/components/compositor/PanelVisibilityWrapper.tsx +25 -11
  153. package/templates/src/components/compositor/elements/Belief.tsx +0 -0
  154. package/templates/src/components/compositor/elements/BgImage.tsx +0 -0
  155. package/templates/src/components/compositor/elements/BgVisualBreak.tsx +0 -0
  156. package/templates/src/components/compositor/elements/BunnyVideo.tsx +0 -0
  157. package/templates/src/components/compositor/elements/IdentifyAs.tsx +0 -0
  158. package/templates/src/components/compositor/elements/PlayButton.tsx +0 -0
  159. package/templates/src/components/compositor/elements/SignUp.tsx +0 -0
  160. package/templates/src/components/compositor/elements/Svg.tsx +0 -0
  161. package/templates/src/components/compositor/elements/ToggleBelief.tsx +0 -0
  162. package/templates/src/components/compositor/elements/YouTubeWrapper.tsx +0 -0
  163. package/templates/src/components/compositor/nodes/BgPaneWrapper.tsx +0 -0
  164. package/templates/src/components/compositor/nodes/GhostInsertBlock.tsx +0 -0
  165. package/templates/src/components/compositor/nodes/Markdown.tsx +0 -0
  166. package/templates/src/components/compositor/nodes/Pane.tsx +12 -5
  167. package/templates/src/components/compositor/nodes/Pane_eraser.tsx +0 -0
  168. package/templates/src/components/compositor/nodes/Pane_layout.tsx +0 -0
  169. package/templates/src/components/compositor/nodes/RenderChildren.tsx +0 -0
  170. package/templates/src/components/compositor/nodes/StoryFragment.tsx +0 -0
  171. package/templates/src/components/compositor/nodes/TagElement.tsx +0 -0
  172. package/templates/src/components/compositor/nodes/Widget.tsx +0 -0
  173. package/templates/src/components/compositor/nodes/tagElements/NodeA.tsx +0 -0
  174. package/templates/src/components/compositor/nodes/tagElements/NodeA_eraser.tsx +0 -0
  175. package/templates/src/components/compositor/nodes/tagElements/NodeAnchorComponent.tsx +0 -0
  176. package/templates/src/components/compositor/nodes/tagElements/NodeBasicTag.tsx +0 -0
  177. package/templates/src/components/compositor/nodes/tagElements/NodeBasicTag_eraser.tsx +0 -0
  178. package/templates/src/components/compositor/nodes/tagElements/NodeBasicTag_insert.tsx +0 -0
  179. package/templates/src/components/compositor/nodes/tagElements/NodeBasicTag_settings.tsx +0 -0
  180. package/templates/src/components/compositor/nodes/tagElements/NodeButton.tsx +0 -0
  181. package/templates/src/components/compositor/nodes/tagElements/NodeButton_eraser.tsx +0 -0
  182. package/templates/src/components/compositor/nodes/tagElements/NodeImg.tsx +0 -0
  183. package/templates/src/components/compositor/nodes/tagElements/NodeText.tsx +0 -0
  184. package/templates/src/components/compositor/nodes/tagElements/TabIndicator.tsx +0 -0
  185. package/templates/src/components/compositor/preview/FeaturedContentPreview.tsx +0 -0
  186. package/templates/src/components/compositor/preview/ListContentPreview.tsx +0 -0
  187. package/templates/src/components/compositor/preview/OgImagePreview.tsx +0 -0
  188. package/templates/src/components/compositor/preview/PaneSnapshotGenerator.tsx +0 -0
  189. package/templates/src/components/compositor/preview/PanesPreviewGenerator.tsx +0 -0
  190. package/templates/src/components/compositor/preview/VisualBreakPreview.tsx +0 -0
  191. package/templates/src/components/edit/Header.tsx +0 -0
  192. package/templates/src/components/edit/PanelSwitch.tsx +4 -8
  193. package/templates/src/components/edit/SettingsPanel.tsx +4 -1
  194. package/templates/src/components/edit/ToolBar.tsx +0 -0
  195. package/templates/src/components/edit/ToolMode.tsx +0 -0
  196. package/templates/src/components/edit/context/ContextPaneConfig.tsx +0 -0
  197. package/templates/src/components/edit/context/ContextPaneConfig_slug.tsx +0 -0
  198. package/templates/src/components/edit/context/ContextPaneConfig_title.tsx +0 -0
  199. package/templates/src/components/edit/pane/AddPanePanel.tsx +0 -0
  200. package/templates/src/components/edit/pane/AddPanePanel_break.tsx +0 -0
  201. package/templates/src/components/edit/pane/AddPanePanel_codehook.tsx +2 -1
  202. package/templates/src/components/edit/pane/AddPanePanel_new.tsx +1 -1
  203. package/templates/src/components/edit/pane/AddPanePanel_newAICopy.tsx +0 -0
  204. package/templates/src/components/edit/pane/AddPanePanel_newAICopy_modal.tsx +1 -1
  205. package/templates/src/components/edit/pane/AddPanePanel_newCopyMode.tsx +0 -0
  206. package/templates/src/components/edit/pane/AddPanePanel_newCustomCopy.tsx +0 -0
  207. package/templates/src/components/edit/pane/AddPanePanel_reuse.tsx +0 -0
  208. package/templates/src/components/edit/pane/ConfigPanePanel.tsx +1 -0
  209. package/templates/src/components/edit/pane/PageGen.tsx +0 -0
  210. package/templates/src/components/edit/pane/PageGenSelector.tsx +0 -0
  211. package/templates/src/components/edit/pane/PageGenSpecial.tsx +0 -0
  212. package/templates/src/components/edit/pane/PageGen_preview.tsx +0 -0
  213. package/templates/src/components/edit/pane/PanePanel_impression.tsx +0 -0
  214. package/templates/src/components/edit/pane/PanePanel_path.tsx +2 -2
  215. package/templates/src/components/edit/pane/PanePanel_slug.tsx +0 -0
  216. package/templates/src/components/edit/pane/PanePanel_title.tsx +0 -0
  217. package/templates/src/components/edit/panels/StyleBreakPanel.tsx +0 -0
  218. package/templates/src/components/edit/panels/StyleCodeHookPanel.tsx +0 -0
  219. package/templates/src/components/edit/panels/StyleElementPanel.tsx +0 -0
  220. package/templates/src/components/edit/panels/StyleElementPanel_add.tsx +1 -1
  221. package/templates/src/components/edit/panels/StyleElementPanel_remove.tsx +0 -0
  222. package/templates/src/components/edit/panels/StyleElementPanel_update.tsx +0 -0
  223. package/templates/src/components/edit/panels/StyleImagePanel.tsx +0 -0
  224. package/templates/src/components/edit/panels/StyleImagePanel_add.tsx +1 -1
  225. package/templates/src/components/edit/panels/StyleImagePanel_remove.tsx +0 -0
  226. package/templates/src/components/edit/panels/StyleImagePanel_update.tsx +0 -0
  227. package/templates/src/components/edit/panels/StyleLiElementPanel.tsx +0 -0
  228. package/templates/src/components/edit/panels/StyleLiElementPanel_add.tsx +1 -1
  229. package/templates/src/components/edit/panels/StyleLiElementPanel_remove.tsx +0 -0
  230. package/templates/src/components/edit/panels/StyleLiElementPanel_update.tsx +0 -0
  231. package/templates/src/components/edit/panels/StyleLinkPanel.tsx +0 -0
  232. package/templates/src/components/edit/panels/StyleLinkPanel_add.tsx +1 -1
  233. package/templates/src/components/edit/panels/StyleLinkPanel_config.tsx +1 -1
  234. package/templates/src/components/edit/panels/StyleLinkPanel_remove.tsx +0 -0
  235. package/templates/src/components/edit/panels/StyleLinkPanel_update.tsx +0 -0
  236. package/templates/src/components/edit/panels/StyleParentPanel.tsx +0 -0
  237. package/templates/src/components/edit/panels/StyleParentPanel_add.tsx +1 -1
  238. package/templates/src/components/edit/panels/StyleParentPanel_deleteLayer.tsx +0 -0
  239. package/templates/src/components/edit/panels/StyleParentPanel_remove.tsx +0 -0
  240. package/templates/src/components/edit/panels/StyleParentPanel_update.tsx +0 -0
  241. package/templates/src/components/edit/panels/StyleWidgetPanel.tsx +2 -0
  242. package/templates/src/components/edit/panels/StyleWidgetPanel_add.tsx +1 -1
  243. package/templates/src/components/edit/panels/StyleWidgetPanel_config.tsx +0 -0
  244. package/templates/src/components/edit/panels/StyleWidgetPanel_remove.tsx +0 -0
  245. package/templates/src/components/edit/panels/StyleWidgetPanel_update.tsx +0 -0
  246. package/templates/src/components/edit/state/SaveModal.tsx +43 -49
  247. package/templates/src/components/edit/state/StylesMemory.tsx +0 -0
  248. package/templates/src/components/edit/storyfragment/StoryFragmentConfigPanel.tsx +0 -0
  249. package/templates/src/components/edit/storyfragment/StoryFragmentPanel_menu.tsx +0 -0
  250. package/templates/src/components/edit/storyfragment/StoryFragmentPanel_og.tsx +0 -0
  251. package/templates/src/components/edit/storyfragment/StoryFragmentPanel_slug.tsx +0 -0
  252. package/templates/src/components/edit/storyfragment/StoryFragmentPanel_title.tsx +0 -0
  253. package/templates/src/components/edit/widgets/BeliefWidget.tsx +0 -0
  254. package/templates/src/components/edit/widgets/BunnyWidget.tsx +0 -0
  255. package/templates/src/components/edit/widgets/IdentifyAsWidget.tsx +0 -0
  256. package/templates/src/components/edit/widgets/SignupWidget.tsx +0 -0
  257. package/templates/src/components/edit/widgets/ToggleWidget.tsx +0 -0
  258. package/templates/src/components/edit/widgets/YouTubeWidget.tsx +0 -0
  259. package/templates/src/components/fields/ActionBuilderTimeSelector.tsx +0 -0
  260. package/templates/src/components/fields/ArtpackImage.tsx +0 -0
  261. package/templates/src/components/fields/BackgroundImage.tsx +0 -0
  262. package/templates/src/components/fields/BackgroundImageWrapper.tsx +1 -1
  263. package/templates/src/components/fields/BooleanParam.tsx +0 -0
  264. package/templates/src/components/fields/BunnyMomentSelector.tsx +0 -0
  265. package/templates/src/components/fields/ColorPickerCombo.tsx +0 -0
  266. package/templates/src/components/fields/ImageUpload.tsx +0 -0
  267. package/templates/src/components/fields/MultiParam.tsx +0 -0
  268. package/templates/src/components/fields/PaneBreakCollectionSelector.tsx +0 -0
  269. package/templates/src/components/fields/PaneBreakShapeSelector.tsx +0 -0
  270. package/templates/src/components/fields/SelectedTailwindClass.tsx +0 -0
  271. package/templates/src/components/fields/SingleParam.tsx +0 -0
  272. package/templates/src/components/fields/ViewportComboBox.tsx +10 -3
  273. package/templates/src/components/form/ActionBuilderField.tsx +0 -0
  274. package/templates/src/components/form/ActionBuilderSlugSelector.tsx +0 -0
  275. package/templates/src/components/form/BooleanToggle.tsx +0 -0
  276. package/templates/src/components/form/ColorPicker.tsx +0 -0
  277. package/templates/src/components/form/DateTimeInput.tsx +0 -0
  278. package/templates/src/components/form/EnumSelect.tsx +0 -0
  279. package/templates/src/components/form/FileUpload.tsx +0 -0
  280. package/templates/src/components/form/MagicPathBuilder.tsx +0 -0
  281. package/templates/src/components/form/NumberInput.tsx +0 -0
  282. package/templates/src/components/form/ParagraphArrayInput.tsx +0 -0
  283. package/templates/src/components/form/StringArrayInput.tsx +0 -0
  284. package/templates/src/components/form/StringInput.tsx +0 -0
  285. package/templates/src/components/form/UnsavedChangesBar.tsx +0 -0
  286. package/templates/src/components/form/advanced/APIConfigSection.tsx +0 -0
  287. package/templates/src/components/form/advanced/AuthConfigSection.tsx +0 -0
  288. package/templates/src/components/form/brand/BrandAssetsSection.tsx +0 -0
  289. package/templates/src/components/form/brand/BrandColorsSection.tsx +0 -0
  290. package/templates/src/components/form/brand/SEOSection.tsx +0 -0
  291. package/templates/src/components/form/brand/SiteConfigSection.tsx +0 -0
  292. package/templates/src/components/form/brand/SocialLinksSection.tsx +0 -0
  293. package/templates/src/components/profile/ProfileConsent.tsx +0 -0
  294. package/templates/src/components/profile/ProfileCreate.tsx +0 -0
  295. package/templates/src/components/profile/ProfileEdit.tsx +0 -0
  296. package/templates/src/components/profile/ProfileSwitch.tsx +0 -0
  297. package/templates/src/components/profile/ProfileUnlock.tsx +0 -0
  298. package/templates/src/components/storykeep/Dashboard.tsx +0 -0
  299. package/templates/src/components/storykeep/Dashboard_Activity.tsx +0 -0
  300. package/templates/src/components/storykeep/Dashboard_Advanced.tsx +1 -1
  301. package/templates/src/components/storykeep/Dashboard_Analytics.tsx +30 -7
  302. package/templates/src/components/storykeep/Dashboard_Branding.tsx +0 -0
  303. package/templates/src/components/storykeep/Dashboard_Content.tsx +6 -0
  304. package/templates/src/components/storykeep/controls/UsageCell.tsx +0 -0
  305. package/templates/src/components/storykeep/controls/content/BeliefForm.tsx +0 -0
  306. package/templates/src/components/storykeep/controls/content/BeliefTable.tsx +0 -0
  307. package/templates/src/components/storykeep/controls/content/ContentBrowser.tsx +0 -0
  308. package/templates/src/components/storykeep/controls/content/ContentSummary.tsx +0 -0
  309. package/templates/src/components/storykeep/controls/content/KnownResourceForm.tsx +0 -0
  310. package/templates/src/components/storykeep/controls/content/KnownResourceTable.tsx +0 -0
  311. package/templates/src/components/storykeep/controls/content/ManageContent.tsx +0 -0
  312. package/templates/src/components/storykeep/controls/content/MenuForm.tsx +0 -0
  313. package/templates/src/components/storykeep/controls/content/MenuTable.tsx +0 -0
  314. package/templates/src/components/storykeep/controls/content/ResourceBulkIngest.tsx +0 -0
  315. package/templates/src/components/storykeep/controls/content/ResourceForm.tsx +0 -0
  316. package/templates/src/components/storykeep/controls/content/ResourceTable.tsx +0 -0
  317. package/templates/src/components/storykeep/controls/content/StoryFragmentTable.tsx +0 -0
  318. package/templates/src/components/storykeep/state/BrandingWrapper.tsx +0 -0
  319. package/templates/src/components/storykeep/state/FetchAnalytics.tsx +0 -0
  320. package/templates/src/components/storykeep/widgets/ResponsiveLine.tsx +0 -0
  321. package/templates/src/components/storykeep/widgets/Wizard.tsx +13 -6
  322. package/templates/src/components/tenant/RegistrationForm.tsx +5 -3
  323. package/templates/src/components/widgets/BunnyVideoHero.astro +0 -0
  324. package/templates/src/components/widgets/Impression.tsx +0 -0
  325. package/templates/src/components/widgets/ImpressionWrapper.tsx +0 -0
  326. package/templates/src/constants/beliefs.ts +0 -0
  327. package/templates/src/constants/brandThemes.ts +0 -0
  328. package/templates/src/constants/prompts.json +0 -0
  329. package/templates/src/constants/shapes.ts +0 -0
  330. package/templates/src/constants/stopWords.ts +0 -0
  331. package/templates/src/constants/tailwindColors.json +0 -0
  332. package/templates/src/constants.ts +0 -0
  333. package/templates/src/hooks/useFormState.ts +0 -0
  334. package/templates/src/layouts/Layout.astro +120 -11
  335. package/templates/src/lib/session.ts +0 -0
  336. package/templates/src/lib/storyData.ts +2 -1
  337. package/templates/src/middleware.ts +0 -0
  338. package/templates/src/pages/404.astro +0 -0
  339. package/templates/src/pages/[...slug]/edit.astro +9 -3
  340. package/templates/src/pages/[...slug].astro +3 -1
  341. package/templates/src/pages/api/auth/decode.ts +0 -0
  342. package/templates/src/pages/api/auth/login.ts +0 -0
  343. package/templates/src/pages/api/auth/logout.ts +0 -0
  344. package/templates/src/pages/api/auth/profile.ts +0 -0
  345. package/templates/src/pages/api/orphan-analysis.ts +0 -0
  346. package/templates/src/pages/api/tailwind.ts +10 -1
  347. package/templates/src/pages/collections/[param1].astro +0 -0
  348. package/templates/src/pages/context/[...contextSlug]/edit.astro +8 -2
  349. package/templates/src/pages/context/[...contextSlug].astro +7 -2
  350. package/templates/src/pages/llms.txt.ts +0 -0
  351. package/templates/src/pages/maint.astro +0 -0
  352. package/templates/src/pages/media/[...slug].astro +0 -0
  353. package/templates/src/pages/robots.txt.ts +0 -0
  354. package/templates/src/pages/sandbox/activate.astro +0 -0
  355. package/templates/src/pages/sandbox/register.astro +0 -0
  356. package/templates/src/pages/sandbox/success.astro +0 -0
  357. package/templates/src/pages/sitemap.xml.ts +0 -0
  358. package/templates/src/pages/storykeep/advanced.astro +1 -1
  359. package/templates/src/pages/storykeep/branding.astro +1 -1
  360. package/templates/src/pages/storykeep/content.astro +1 -1
  361. package/templates/src/pages/storykeep/init.astro +40 -1
  362. package/templates/src/pages/storykeep/login.astro +0 -0
  363. package/templates/src/pages/storykeep/logout.astro +0 -0
  364. package/templates/src/pages/storykeep/profile.astro +0 -0
  365. package/templates/src/pages/storykeep.astro +1 -1
  366. package/templates/src/stores/analytics.ts +0 -0
  367. package/templates/src/stores/backend.ts +0 -0
  368. package/templates/src/stores/navigation.ts +0 -0
  369. package/templates/src/stores/nodes.ts +32 -1
  370. package/templates/src/stores/nodesHistory.ts +0 -0
  371. package/templates/src/stores/notificationSystem.ts +0 -0
  372. package/templates/src/stores/orphanAnalysis.ts +0 -0
  373. package/templates/src/stores/storykeep.ts +5 -0
  374. package/templates/src/types/astro.ts +0 -0
  375. package/templates/src/types/compositorTypes.ts +0 -0
  376. package/templates/src/types/formTypes.ts +0 -0
  377. package/templates/src/types/multiTenant.ts +0 -0
  378. package/templates/src/types/nodeProps.ts +0 -0
  379. package/templates/src/types/tractstack.ts +0 -0
  380. package/templates/src/utils/aai/getTitleSlug.ts +0 -0
  381. package/templates/src/utils/actions/actionButton.ts +0 -0
  382. package/templates/src/utils/actions/lispLexer.ts +0 -0
  383. package/templates/src/utils/actions/preParse_Action.ts +0 -0
  384. package/templates/src/utils/actions/preParse_Bunny.ts +0 -0
  385. package/templates/src/utils/actions/preParse_Clicked.ts +0 -0
  386. package/templates/src/utils/actions/preParse_Impression.ts +0 -0
  387. package/templates/src/utils/api/advancedConfig.ts +0 -0
  388. package/templates/src/utils/api/advancedHelpers.ts +0 -0
  389. package/templates/src/utils/api/beliefConfig.ts +0 -0
  390. package/templates/src/utils/api/beliefHelpers.ts +0 -0
  391. package/templates/src/utils/api/brandConfig.ts +0 -0
  392. package/templates/src/utils/api/brandHelpers.ts +0 -0
  393. package/templates/src/utils/api/fileHelpers.ts +0 -0
  394. package/templates/src/utils/api/menuConfig.ts +0 -0
  395. package/templates/src/utils/api/menuHelpers.ts +0 -0
  396. package/templates/src/utils/api/resourceConfig.ts +0 -0
  397. package/templates/src/utils/api/resourceHelpers.ts +0 -0
  398. package/templates/src/utils/api/tenantConfig.ts +0 -0
  399. package/templates/src/utils/api/tenantHelpers.ts +0 -0
  400. package/templates/src/utils/api.ts +0 -0
  401. package/templates/src/utils/auth.ts +0 -0
  402. package/templates/src/utils/backend.ts +0 -0
  403. package/templates/src/utils/compositor/TemplateMarkdowns.ts +0 -0
  404. package/templates/src/utils/compositor/TemplateNodes.ts +0 -0
  405. package/templates/src/utils/compositor/TemplatePanes.ts +0 -0
  406. package/templates/src/utils/compositor/allowInsert.ts +0 -0
  407. package/templates/src/utils/compositor/domHelpers.ts +0 -0
  408. package/templates/src/utils/compositor/handleClickEvent.ts +0 -0
  409. package/templates/src/utils/compositor/nodesHelper.ts +0 -0
  410. package/templates/src/utils/compositor/nodesMarkdownGenerator.ts +0 -0
  411. package/templates/src/utils/compositor/processMarkdown.ts +0 -0
  412. package/templates/src/utils/compositor/reduceNodesClassNames.ts +0 -0
  413. package/templates/src/utils/compositor/tailwindClasses.ts +0 -0
  414. package/templates/src/utils/compositor/tailwindColors.ts +0 -0
  415. package/templates/src/utils/compositor/templateMarkdownStyles.ts +8 -0
  416. package/templates/src/utils/compositor/typeGuards.ts +0 -0
  417. package/templates/src/utils/etl/extractor.ts +0 -0
  418. package/templates/src/utils/etl/index.ts +0 -0
  419. package/templates/src/utils/etl/loader.ts +0 -0
  420. package/templates/src/utils/etl/transformer.ts +0 -0
  421. package/templates/src/utils/helpers.ts +1 -0
  422. package/templates/src/utils/layout.ts +6 -6
  423. package/templates/src/utils/profileStorage.ts +0 -0
  424. package/templates/src/utils/useInterval.ts +0 -0
  425. package/templates/tailwind.config.cjs +0 -0
  426. package/utils/create-resolver.ts +0 -0
  427. package/utils/inject-files.ts +17 -1
  428. package/utils/validate-config.ts +0 -0
File without changes
@@ -1,17 +1,16 @@
1
1
  ---
2
- // CodeHook Dispatcher - Minimal Version
3
- // Framework components are always available, custom components are commented for guidance
4
-
5
2
  import FeaturedContent from '@/components/codehooks/FeaturedContent.astro';
6
3
  import ListContent from '@/components/codehooks/ListContent.astro';
7
4
  import BunnyVideoWrapper from '@/components/codehooks/BunnyVideoWrapper.astro';
8
5
  import EpinetWrapper from '@/components/codehooks/EpinetWrapper';
9
6
  import type { FullContentMapItem } from '@/types/tractstack';
7
+ import type { ResourceNode } from '@/types/compositorTypes';
10
8
  // import CustomHero from './CustomHero.astro'; // Uncomment to add custom components
11
9
 
12
10
  export interface Props {
13
11
  target: string;
14
12
  fullContentMap: FullContentMapItem[];
13
+ resourcesPayload?: Record<string, ResourceNode[]>;
15
14
  options?: {
16
15
  params?: {
17
16
  options?: string;
@@ -19,7 +18,7 @@ export interface Props {
19
18
  };
20
19
  }
21
20
 
22
- const { target, options, fullContentMap } = Astro.props;
21
+ const { target, options, fullContentMap /*, resourcesPayload */ } = Astro.props;
23
22
 
24
23
  export const components = {
25
24
  'featured-content': true,
@@ -1,46 +1,40 @@
1
1
  ---
2
- // V2 Custom Routes - Minimal Version
3
- // This is a stub - implement your custom routes here
2
+ //import Collections from './pages/Collections.astro';
3
+ import type { ResourceNode } from '@/types/compositorTypes';
4
4
 
5
5
  export interface Props {
6
6
  route: string;
7
7
  slug: string;
8
- resources: any[];
8
+ resources: ResourceNode[];
9
9
  variation?: string;
10
10
  }
11
11
 
12
- const { route, slug, resources } = Astro.props;
12
+ const { route, slug /*, resources */ } = Astro.props;
13
13
 
14
- // Define available routes here
15
- export const routes = {
16
- // collections: true, // Uncomment to enable collections route
17
- };
18
-
19
- // Example implementation for collections:
20
- // const payload = resources; // V2 resources are already filtered by backend
14
+ // list all here !
15
+ export const routes = {};
21
16
  ---
22
17
 
23
18
  {
24
- (
25
- /*
26
- Uncomment and customize routes as needed:
27
-
28
- route === "collections" ? (
19
+ /*
20
+ route === 'collections' ? (
29
21
  <Collections route={route} slug={slug} resources={payload} />
30
- ) :
22
+ ) : (
31
23
  */
32
- <div class="rounded-lg bg-gray-50 p-8 text-center">
33
- <p class="text-gray-600">Custom route "{route}" not implemented</p>
34
- <p class="mt-2 text-sm text-gray-500">
35
- Edit <code>src/custom/CustomRoutes.astro</code> to add your custom
36
- routes
37
- </p>
38
- <div class="mt-4 rounded border bg-white p-4 text-left text-xs">
39
- <p class="mb-2 font-bold">Route Data:</p>
40
- <p>Route: {route}</p>
41
- <p>Slug: {slug}</p>
42
- <p>Resources: {resources.length} items</p>
43
- </div>
44
- </div>
45
- )
24
+ }
25
+
26
+ <div class="rounded-lg bg-gray-50 p-8 text-center">
27
+ <p class="text-gray-600">Custom route "{route}" not found</p>
28
+ <p class="mt-2 text-sm text-gray-500">Available routes: collections</p>
29
+ <div class="mt-4 rounded border bg-white p-4 text-left text-xs">
30
+ <p class="mb-2 font-bold">Route Data:</p>
31
+ <p>Route: {route}</p>
32
+ <p>Slug: {slug}</p>
33
+ </div>
34
+ </div>
35
+
36
+ {
37
+ /*
38
+ ) }
39
+ */
46
40
  }
@@ -1,17 +1,16 @@
1
1
  ---
2
- // V2 CodeHook Dispatcher - With Examples
3
- // Framework components and custom examples are available
4
-
5
2
  import CustomHero from './CustomHero.astro';
6
3
  import FeaturedContent from '@/components/codehooks/FeaturedContent.astro';
7
4
  import ListContent from '@/components/codehooks/ListContent.astro';
8
5
  import BunnyVideoWrapper from '@/components/codehooks/BunnyVideoWrapper.astro';
9
6
  import EpinetWrapper from '@/components/codehooks/EpinetWrapper';
10
7
  import type { FullContentMapItem } from '@/types/tractstack';
8
+ import type { ResourceNode } from '@/types/compositorTypes';
11
9
 
12
10
  export interface Props {
13
11
  target: string;
14
12
  fullContentMap: FullContentMapItem[];
13
+ resourcesPayload?: Record<string, ResourceNode[]>;
15
14
  options?: {
16
15
  params?: {
17
16
  options?: string;
@@ -19,7 +18,7 @@ export interface Props {
19
18
  };
20
19
  }
21
20
 
22
- const { target, options, fullContentMap } = Astro.props;
21
+ const { target, options, fullContentMap /*, resourcesPayload */ } = Astro.props;
23
22
 
24
23
  export const components = {
25
24
  'custom-hero': true,
File without changes
@@ -1,29 +1,25 @@
1
1
  ---
2
- // V2 Custom Routes - With Examples
3
- // Full Collections implementation included
4
-
5
2
  import Collections from './pages/Collections.astro';
3
+ import type { ResourceNode } from '@/types/compositorTypes';
6
4
 
7
5
  export interface Props {
8
6
  route: string;
9
7
  slug: string;
10
- resources: any[];
8
+ resources: ResourceNode[];
11
9
  variation?: string;
12
10
  }
13
11
 
14
12
  const { route, slug, resources } = Astro.props;
15
13
 
14
+ // list all here !
16
15
  export const routes = {
17
16
  collections: true,
18
17
  };
19
-
20
- // V2: Resources are already filtered by backend, no client-side extraction needed
21
- const payload = resources;
22
18
  ---
23
19
 
24
20
  {
25
21
  route === 'collections' ? (
26
- <Collections route={route} slug={slug} resources={payload} />
22
+ <Collections route={route} slug={slug} resources={resources} />
27
23
  ) : (
28
24
  <div class="rounded-lg bg-gray-50 p-8 text-center">
29
25
  <p class="text-gray-600">Custom route "{route}" not found</p>
@@ -1,110 +1,70 @@
1
1
  ---
2
- import Layout from '@/layouts/Layout.astro';
3
- //import type { MenuNode } from '@/types/tractstack';
2
+ import CustomRoutes, { routes } from '@/custom/CustomRoutes.astro';
3
+ import { preHealthCheck } from '@/utils/backend';
4
+ //import type { ResourceNode } from '@/types/compositorTypes';
4
5
 
5
- export interface Props {
6
- route: string;
7
- slug: string;
8
- variation?: string;
9
- resources: any[];
6
+ const tenantId =
7
+ Astro.locals.tenant?.id || import.meta.env.PUBLIC_TENANTID || 'default';
8
+
9
+ const healthCheckRedirect = await preHealthCheck(tenantId);
10
+ if (healthCheckRedirect !== undefined) {
11
+ return healthCheckRedirect;
10
12
  }
11
13
 
12
- const { route, slug, resources } = Astro.props;
14
+ const { param1 } = Astro.params;
15
+ // this needs to match the url path
16
+ const route = `collections`;
13
17
 
14
- // uncomment if you add a menu id
15
- //
16
- //let menuPayload: MenuNode | null = null;
17
- //const hardcodedMenuId = '';
18
- //const goBackend = import.meta.env.PUBLIC_GO_BACKEND || 'http://localhost:8080';
19
- //try {
20
- // const menuResponse = await fetch(`${goBackend}/api/v1/nodes/menus/${hardcodedMenuId}`);
21
- // if (menuResponse.ok) {
22
- // menuPayload = await menuResponse.json();
23
- // }
24
- //} catch (error) {
25
- // console.error('Error fetching menu:', error);
26
- //}
18
+ // Check if route is enabled
19
+ if (!param1 || !routes[route]) {
20
+ return new Response(null, {
21
+ status: 404,
22
+ statusText: 'Not Found',
23
+ });
24
+ }
27
25
 
28
- const targetSlug = `${route}-${slug}`;
29
- const categoryResources = resources || [];
30
- const activeResource = categoryResources.find(
31
- (resource: any) => resource.slug === targetSlug
32
- );
26
+ // include all resource categories here
27
+ const CATEGORIES = [`collections`];
33
28
 
34
- const pageTitle = `${route}=${slug}`;
35
- ---
29
+ let resources = [];
30
+ const goBackend = import.meta.env.PUBLIC_GO_BACKEND || 'http://localhost:8080';
36
31
 
37
- <Layout title={pageTitle}>
38
- <div class="border-b bg-gray-100 p-4">
39
- <h1 class="text-2xl font-bold">{pageTitle}</h1>
40
- <p class="text-sm text-gray-600">
41
- Collections page - slug: {slug}
42
- </p>
43
- </div>
32
+ try {
33
+ const resourcesResponse = await fetch(`${goBackend}/api/v1/nodes/resources`, {
34
+ method: 'POST',
35
+ headers: { 'Content-Type': 'application/json', 'X-Tenant-ID': tenantId },
36
+ body: JSON.stringify({ categories: CATEGORIES }),
37
+ });
44
38
 
45
- <main id="main-content" class="min-h-screen w-full">
46
- <div class="bg-white p-8">
47
- {
48
- slug ? (
49
- <div class="mx-auto max-w-4xl">
50
- <h2 class="mb-4 text-xl font-bold">
51
- Collection: {route}={slug}
52
- </h2>
39
+ if (resourcesResponse.ok) {
40
+ const responseData = await resourcesResponse.json();
41
+ if (responseData.resources) {
42
+ resources = responseData.resources;
43
+ }
44
+ }
45
+ } catch (error) {
46
+ console.error('Error fetching resources:', error);
47
+ return new Response(null, {
48
+ status: 500,
49
+ statusText: 'Internal Server Error',
50
+ });
51
+ }
53
52
 
54
- {activeResource ? (
55
- <div class="mb-6 rounded-lg bg-blue-50 p-6">
56
- <h3 class="mb-2 text-lg font-bold text-blue-900">
57
- {activeResource.title}
58
- </h3>
59
- <p class="mb-2 text-blue-800">{activeResource.oneliner}</p>
60
- <div class="text-sm text-blue-600">
61
- <p>ID: {activeResource.id}</p>
62
- <p>Slug: {activeResource.slug}</p>
63
- <p>Category: {activeResource.categorySlug || 'none'}</p>
64
- </div>
65
- </div>
66
- ) : (
67
- <div class="mb-6 rounded-lg bg-yellow-50 p-6">
68
- <p class="text-yellow-800">
69
- No active resource found for slug: {targetSlug}
70
- </p>
71
- </div>
72
- )}
53
+ /*
54
+ if (!resources.length) {
55
+ return new Response(null, {
56
+ status: 404,
57
+ statusText: 'Not Found',
58
+ });
59
+ }
60
+ */
73
61
 
74
- <div class="rounded-lg bg-gray-50 p-6">
75
- <h3 class="mb-4 text-lg font-bold">
76
- All Resources in Category ({categoryResources.length})
77
- </h3>
78
- {categoryResources.length > 0 ? (
79
- <div class="grid gap-4 md:grid-cols-2">
80
- {categoryResources.map((resource: any) => (
81
- <div class="rounded border bg-white p-4">
82
- <h4 class="font-bold text-gray-900">{resource.title}</h4>
83
- <p class="mt-1 text-sm text-gray-600">
84
- {resource.oneliner}
85
- </p>
86
- <div class="mt-2 text-xs text-gray-500">
87
- <p>Slug: {resource.slug}</p>
88
- {resource.categorySlug && (
89
- <p>Category: {resource.categorySlug}</p>
90
- )}
91
- </div>
92
- </div>
93
- ))}
94
- </div>
95
- ) : (
96
- <p class="text-gray-500">
97
- No resources found in this category.
98
- </p>
99
- )}
100
- </div>
101
- </div>
102
- ) : null
103
- }
104
- </div>
105
- </main>
62
+ const pageTitle = `${route} collection`;
63
+ ---
106
64
 
107
- <div class="border-t bg-gray-100 p-4">
108
- <p class="text-sm text-gray-600">Collections footer</p>
109
- </div>
110
- </Layout>
65
+ <div class="border-b bg-gray-100 p-4">
66
+ <h1 class="text-2xl font-bold">{pageTitle}</h1>
67
+ <p class="text-sm text-gray-600">
68
+ Collections page - slug: {param1}
69
+ </p>
70
+ </div>
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,42 @@
1
+ # Build output
2
+ dist/
3
+ *.tgz
4
+ #*.d.ts
5
+
6
+ # Dependencies
7
+ node_modules/
8
+
9
+ # Environment
10
+ .env
11
+ .env.local
12
+ .env.*.local
13
+
14
+ # IDE
15
+ .vscode/
16
+ .idea/
17
+ *.swp
18
+ *.swo
19
+
20
+ # OS
21
+ .DS_Store
22
+ Thumbs.db
23
+
24
+ # Logs
25
+ *.log
26
+ npm-debug.log*
27
+ yarn-debug.log*
28
+ yarn-error.log*
29
+ pnpm-debug.log*
30
+
31
+ # Runtime data
32
+ pids
33
+ *.pid
34
+ *.seed
35
+ *.pid.lock
36
+
37
+ # Coverage directory used by tools like istanbul
38
+ coverage/
39
+
40
+ # Temporary folders
41
+ tmp/
42
+ temp/
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,5 @@
1
+ node_modules/
2
+ dist/
3
+ .astro/
4
+ templates/css/
5
+ templates/fonts/
@@ -0,0 +1,19 @@
1
+ {
2
+ "semi": true,
3
+ "singleQuote": true,
4
+ "tabWidth": 2,
5
+ "trailingComma": "es5",
6
+ "printWidth": 80,
7
+ "plugins": [
8
+ "prettier-plugin-astro",
9
+ "prettier-plugin-tailwindcss"
10
+ ],
11
+ "overrides": [
12
+ {
13
+ "files": "*.astro",
14
+ "options": {
15
+ "parser": "astro"
16
+ }
17
+ }
18
+ ]
19
+ }
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
File without changes
File without changes
File without changes
File without changes
@@ -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