astro-tractstack 2.0.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (427) hide show
  1. package/LICENSE +110 -0
  2. package/README.md +56 -0
  3. package/astro.d.ts +64 -0
  4. package/bin/create-tractstack.js +483 -0
  5. package/dist/config.js +80 -0
  6. package/dist/index.js +2129 -0
  7. package/package.json +89 -0
  8. package/templates/artpacks/kCz/captainBreakfast_1080px.webp +0 -0
  9. package/templates/artpacks/kCz/captainBreakfast_1920px.webp +0 -0
  10. package/templates/artpacks/kCz/captainBreakfast_600px.webp +0 -0
  11. package/templates/artpacks/kCz/cleanDrips_1080px.webp +0 -0
  12. package/templates/artpacks/kCz/cleanDrips_1920px.webp +0 -0
  13. package/templates/artpacks/kCz/cleanDrips_600px.webp +0 -0
  14. package/templates/artpacks/kCz/crispwaves_1080px.webp +0 -0
  15. package/templates/artpacks/kCz/crispwaves_1920px.webp +0 -0
  16. package/templates/artpacks/kCz/crispwaves_600px.webp +0 -0
  17. package/templates/artpacks/kCz/dragonSkin_1080px.webp +0 -0
  18. package/templates/artpacks/kCz/dragonSkin_1920px.webp +0 -0
  19. package/templates/artpacks/kCz/dragonSkin_600px.webp +0 -0
  20. package/templates/artpacks/kCz/dragon_1080px.webp +0 -0
  21. package/templates/artpacks/kCz/dragon_1920px.webp +0 -0
  22. package/templates/artpacks/kCz/dragon_600px.webp +0 -0
  23. package/templates/artpacks/kCz/nightcity_1080px.webp +0 -0
  24. package/templates/artpacks/kCz/nightcity_1920px.webp +0 -0
  25. package/templates/artpacks/kCz/nightcity_600px.webp +0 -0
  26. package/templates/artpacks/kCz/pattern1_1080px.webp +0 -0
  27. package/templates/artpacks/kCz/pattern1_1920px.webp +0 -0
  28. package/templates/artpacks/kCz/pattern1_600px.webp +0 -0
  29. package/templates/artpacks/kCz/pattern2_1080px.webp +0 -0
  30. package/templates/artpacks/kCz/pattern2_1920px.webp +0 -0
  31. package/templates/artpacks/kCz/pattern2_600px.webp +0 -0
  32. package/templates/artpacks/kCz/skindrips_1080px.webp +0 -0
  33. package/templates/artpacks/kCz/skindrips_1920px.webp +0 -0
  34. package/templates/artpacks/kCz/skindrips_600px.webp +0 -0
  35. package/templates/artpacks/kCz/slimetime_1080px.webp +0 -0
  36. package/templates/artpacks/kCz/slimetime_1920px.webp +0 -0
  37. package/templates/artpacks/kCz/slimetime_600px.webp +0 -0
  38. package/templates/artpacks/kCz/snake_1080px.webp +0 -0
  39. package/templates/artpacks/kCz/snake_1920px.webp +0 -0
  40. package/templates/artpacks/kCz/snake_600px.webp +0 -0
  41. package/templates/artpacks/kCz/toxicshock_1080px.webp +0 -0
  42. package/templates/artpacks/kCz/toxicshock_1920px.webp +0 -0
  43. package/templates/artpacks/kCz/toxicshock_600px.webp +0 -0
  44. package/templates/artpacks/kCz/tractstack_1080px.webp +0 -0
  45. package/templates/artpacks/kCz/tractstack_1920px.webp +0 -0
  46. package/templates/artpacks/kCz/tractstack_600px.webp +0 -0
  47. package/templates/artpacks/kCz/tripdrips_1080px.webp +0 -0
  48. package/templates/artpacks/kCz/tripdrips_1920px.webp +0 -0
  49. package/templates/artpacks/kCz/tripdrips_600px.webp +0 -0
  50. package/templates/artpacks/kCz/wavedrips_1080px.webp +0 -0
  51. package/templates/artpacks/kCz/wavedrips_1920px.webp +0 -0
  52. package/templates/artpacks/kCz/wavedrips_600px.webp +0 -0
  53. package/templates/artpacks/t8k/beach_1080px.webp +0 -0
  54. package/templates/artpacks/t8k/beach_1920px.webp +0 -0
  55. package/templates/artpacks/t8k/beach_600px.webp +0 -0
  56. package/templates/artpacks/t8k/blast_1080px.webp +0 -0
  57. package/templates/artpacks/t8k/blast_1920px.webp +0 -0
  58. package/templates/artpacks/t8k/blast_600px.webp +0 -0
  59. package/templates/artpacks/t8k/bokeh_1080px.webp +0 -0
  60. package/templates/artpacks/t8k/bokeh_1920px.webp +0 -0
  61. package/templates/artpacks/t8k/bokeh_600px.webp +0 -0
  62. package/templates/artpacks/t8k/cartoon_1080px.webp +0 -0
  63. package/templates/artpacks/t8k/cartoon_1920px.webp +0 -0
  64. package/templates/artpacks/t8k/cartoon_600px.webp +0 -0
  65. package/templates/artpacks/t8k/darkeggshell_1080px.webp +0 -0
  66. package/templates/artpacks/t8k/darkeggshell_1920px.webp +0 -0
  67. package/templates/artpacks/t8k/darkeggshell_600px.webp +0 -0
  68. package/templates/artpacks/t8k/explosion_1080px.webp +0 -0
  69. package/templates/artpacks/t8k/explosion_1920px.webp +0 -0
  70. package/templates/artpacks/t8k/explosion_600px.webp +0 -0
  71. package/templates/artpacks/t8k/floral_1080px.webp +0 -0
  72. package/templates/artpacks/t8k/floral_1920px.webp +0 -0
  73. package/templates/artpacks/t8k/floral_600px.webp +0 -0
  74. package/templates/artpacks/t8k/flower_1080px.webp +0 -0
  75. package/templates/artpacks/t8k/flower_1920px.webp +0 -0
  76. package/templates/artpacks/t8k/flower_600px.webp +0 -0
  77. package/templates/artpacks/t8k/foliage_1080px.webp +0 -0
  78. package/templates/artpacks/t8k/foliage_1920px.webp +0 -0
  79. package/templates/artpacks/t8k/foliage_600px.webp +0 -0
  80. package/templates/artpacks/t8k/mist_1080px.webp +0 -0
  81. package/templates/artpacks/t8k/mist_1920px.webp +0 -0
  82. package/templates/artpacks/t8k/mist_600px.webp +0 -0
  83. package/templates/artpacks/t8k/portal_1080px.webp +0 -0
  84. package/templates/artpacks/t8k/portal_1920px.webp +0 -0
  85. package/templates/artpacks/t8k/portal_600px.webp +0 -0
  86. package/templates/artpacks/t8k/storytime_1080px.webp +0 -0
  87. package/templates/artpacks/t8k/storytime_1920px.webp +0 -0
  88. package/templates/artpacks/t8k/storytime_600px.webp +0 -0
  89. package/templates/artpacks/t8k/tacky_1080px.webp +0 -0
  90. package/templates/artpacks/t8k/tacky_1920px.webp +0 -0
  91. package/templates/artpacks/t8k/tacky_600px.webp +0 -0
  92. package/templates/artpacks/t8k/wallpaper_1080px.webp +0 -0
  93. package/templates/artpacks/t8k/wallpaper_1920px.webp +0 -0
  94. package/templates/artpacks/t8k/wallpaper_600px.webp +0 -0
  95. package/templates/brand/favicon.ico +0 -0
  96. package/templates/brand/logo.svg +19 -0
  97. package/templates/brand/static.jpg +0 -0
  98. package/templates/brand/wordmark.svg +4 -0
  99. package/templates/css/custom.css +51 -0
  100. package/templates/css/frontend.css +3519 -0
  101. package/templates/css/storykeep.css +92872 -0
  102. package/templates/custom/minimal/CodeHook.astro +53 -0
  103. package/templates/custom/minimal/CustomRoutes.astro +46 -0
  104. package/templates/custom/with-examples/CodeHook.astro +49 -0
  105. package/templates/custom/with-examples/CustomHero.astro +13 -0
  106. package/templates/custom/with-examples/CustomRoutes.astro +39 -0
  107. package/templates/custom/with-examples/pages/Collections.astro +110 -0
  108. package/templates/env.example +8 -0
  109. package/templates/fonts/Inter-Black.woff2 +0 -0
  110. package/templates/fonts/Inter-Bold.woff2 +0 -0
  111. package/templates/fonts/Inter-Regular.woff2 +0 -0
  112. package/templates/icons/h2.svg +1 -0
  113. package/templates/icons/h3.svg +1 -0
  114. package/templates/icons/h4.svg +1 -0
  115. package/templates/icons/h5.svg +1 -0
  116. package/templates/icons/image.svg +7 -0
  117. package/templates/icons/text.svg +6 -0
  118. package/templates/socials/codepen.svg +1 -0
  119. package/templates/socials/discord.svg +1 -0
  120. package/templates/socials/facebook.svg +1 -0
  121. package/templates/socials/github.svg +1 -0
  122. package/templates/socials/instagram.svg +1 -0
  123. package/templates/socials/linkedin.svg +1 -0
  124. package/templates/socials/mail.svg +1 -0
  125. package/templates/socials/rumble.svg +1 -0
  126. package/templates/socials/tiktok.svg +1 -0
  127. package/templates/socials/twitch.svg +1 -0
  128. package/templates/socials/twitter.svg +1 -0
  129. package/templates/socials/x.svg +1 -0
  130. package/templates/socials/youtube.svg +1 -0
  131. package/templates/src/client/analytics-events.ts +213 -0
  132. package/templates/src/client/belief-events.ts +205 -0
  133. package/templates/src/client/sse.ts +667 -0
  134. package/templates/src/components/Footer.astro +246 -0
  135. package/templates/src/components/Fragment.astro +70 -0
  136. package/templates/src/components/Header.astro +458 -0
  137. package/templates/src/components/Menu.tsx +196 -0
  138. package/templates/src/components/codehooks/BunnyVideoSetup.tsx +692 -0
  139. package/templates/src/components/codehooks/BunnyVideoWrapper.astro +78 -0
  140. package/templates/src/components/codehooks/EpinetDurationSelector.tsx +1020 -0
  141. package/templates/src/components/codehooks/EpinetTableView.tsx +594 -0
  142. package/templates/src/components/codehooks/EpinetWrapper.tsx +424 -0
  143. package/templates/src/components/codehooks/FeaturedContent.astro +273 -0
  144. package/templates/src/components/codehooks/FeaturedContentSetup.tsx +738 -0
  145. package/templates/src/components/codehooks/ListContent.astro +460 -0
  146. package/templates/src/components/codehooks/ListContentSetup.tsx +649 -0
  147. package/templates/src/components/codehooks/SankeyDiagram.tsx +359 -0
  148. package/templates/src/components/compositor/Compositor.tsx +144 -0
  149. package/templates/src/components/compositor/Node.tsx +415 -0
  150. package/templates/src/components/compositor/NodeWithGuid.tsx +25 -0
  151. package/templates/src/components/compositor/PanelVisibilityWrapper.tsx +87 -0
  152. package/templates/src/components/compositor/elements/Belief.tsx +148 -0
  153. package/templates/src/components/compositor/elements/BgImage.tsx +118 -0
  154. package/templates/src/components/compositor/elements/BgVisualBreak.tsx +102 -0
  155. package/templates/src/components/compositor/elements/BunnyVideo.tsx +63 -0
  156. package/templates/src/components/compositor/elements/IdentifyAs.tsx +66 -0
  157. package/templates/src/components/compositor/elements/PlayButton.tsx +19 -0
  158. package/templates/src/components/compositor/elements/SignUp.tsx +179 -0
  159. package/templates/src/components/compositor/elements/Svg.tsx +33 -0
  160. package/templates/src/components/compositor/elements/ToggleBelief.tsx +36 -0
  161. package/templates/src/components/compositor/elements/YouTubeWrapper.tsx +33 -0
  162. package/templates/src/components/compositor/nodes/BgPaneWrapper.tsx +35 -0
  163. package/templates/src/components/compositor/nodes/GhostInsertBlock.tsx +189 -0
  164. package/templates/src/components/compositor/nodes/Markdown.tsx +179 -0
  165. package/templates/src/components/compositor/nodes/Pane.tsx +277 -0
  166. package/templates/src/components/compositor/nodes/Pane_eraser.tsx +69 -0
  167. package/templates/src/components/compositor/nodes/Pane_layout.tsx +77 -0
  168. package/templates/src/components/compositor/nodes/RenderChildren.tsx +19 -0
  169. package/templates/src/components/compositor/nodes/StoryFragment.tsx +35 -0
  170. package/templates/src/components/compositor/nodes/TagElement.tsx +14 -0
  171. package/templates/src/components/compositor/nodes/Widget.tsx +115 -0
  172. package/templates/src/components/compositor/nodes/tagElements/NodeA.tsx +4 -0
  173. package/templates/src/components/compositor/nodes/tagElements/NodeA_eraser.tsx +26 -0
  174. package/templates/src/components/compositor/nodes/tagElements/NodeAnchorComponent.tsx +248 -0
  175. package/templates/src/components/compositor/nodes/tagElements/NodeBasicTag.tsx +684 -0
  176. package/templates/src/components/compositor/nodes/tagElements/NodeBasicTag_eraser.tsx +62 -0
  177. package/templates/src/components/compositor/nodes/tagElements/NodeBasicTag_insert.tsx +120 -0
  178. package/templates/src/components/compositor/nodes/tagElements/NodeBasicTag_settings.tsx +62 -0
  179. package/templates/src/components/compositor/nodes/tagElements/NodeButton.tsx +5 -0
  180. package/templates/src/components/compositor/nodes/tagElements/NodeButton_eraser.tsx +26 -0
  181. package/templates/src/components/compositor/nodes/tagElements/NodeImg.tsx +28 -0
  182. package/templates/src/components/compositor/nodes/tagElements/NodeText.tsx +18 -0
  183. package/templates/src/components/compositor/nodes/tagElements/TabIndicator.tsx +51 -0
  184. package/templates/src/components/compositor/preview/FeaturedContentPreview.tsx +128 -0
  185. package/templates/src/components/compositor/preview/ListContentPreview.tsx +213 -0
  186. package/templates/src/components/compositor/preview/OgImagePreview.tsx +223 -0
  187. package/templates/src/components/compositor/preview/PaneSnapshotGenerator.tsx +199 -0
  188. package/templates/src/components/compositor/preview/PanesPreviewGenerator.tsx +123 -0
  189. package/templates/src/components/compositor/preview/VisualBreakPreview.tsx +154 -0
  190. package/templates/src/components/edit/Header.tsx +181 -0
  191. package/templates/src/components/edit/PanelSwitch.tsx +446 -0
  192. package/templates/src/components/edit/SettingsPanel.tsx +70 -0
  193. package/templates/src/components/edit/ToolBar.tsx +101 -0
  194. package/templates/src/components/edit/ToolMode.tsx +121 -0
  195. package/templates/src/components/edit/context/ContextPaneConfig.tsx +91 -0
  196. package/templates/src/components/edit/context/ContextPaneConfig_slug.tsx +174 -0
  197. package/templates/src/components/edit/context/ContextPaneConfig_title.tsx +186 -0
  198. package/templates/src/components/edit/pane/AddPanePanel.tsx +136 -0
  199. package/templates/src/components/edit/pane/AddPanePanel_break.tsx +470 -0
  200. package/templates/src/components/edit/pane/AddPanePanel_codehook.tsx +264 -0
  201. package/templates/src/components/edit/pane/AddPanePanel_new.tsx +623 -0
  202. package/templates/src/components/edit/pane/AddPanePanel_newAICopy.tsx +107 -0
  203. package/templates/src/components/edit/pane/AddPanePanel_newAICopy_modal.tsx +217 -0
  204. package/templates/src/components/edit/pane/AddPanePanel_newCopyMode.tsx +109 -0
  205. package/templates/src/components/edit/pane/AddPanePanel_newCustomCopy.tsx +39 -0
  206. package/templates/src/components/edit/pane/AddPanePanel_reuse.tsx +445 -0
  207. package/templates/src/components/edit/pane/ConfigPanePanel.tsx +245 -0
  208. package/templates/src/components/edit/pane/PageGen.tsx +485 -0
  209. package/templates/src/components/edit/pane/PageGenSelector.tsx +238 -0
  210. package/templates/src/components/edit/pane/PageGenSpecial.tsx +362 -0
  211. package/templates/src/components/edit/pane/PageGen_preview.tsx +495 -0
  212. package/templates/src/components/edit/pane/PanePanel_impression.tsx +258 -0
  213. package/templates/src/components/edit/pane/PanePanel_path.tsx +268 -0
  214. package/templates/src/components/edit/pane/PanePanel_slug.tsx +219 -0
  215. package/templates/src/components/edit/pane/PanePanel_title.tsx +142 -0
  216. package/templates/src/components/edit/panels/StyleBreakPanel.tsx +182 -0
  217. package/templates/src/components/edit/panels/StyleCodeHookPanel.tsx +439 -0
  218. package/templates/src/components/edit/panels/StyleElementPanel.tsx +177 -0
  219. package/templates/src/components/edit/panels/StyleElementPanel_add.tsx +349 -0
  220. package/templates/src/components/edit/panels/StyleElementPanel_remove.tsx +159 -0
  221. package/templates/src/components/edit/panels/StyleElementPanel_update.tsx +320 -0
  222. package/templates/src/components/edit/panels/StyleImagePanel.tsx +460 -0
  223. package/templates/src/components/edit/panels/StyleImagePanel_add.tsx +296 -0
  224. package/templates/src/components/edit/panels/StyleImagePanel_remove.tsx +153 -0
  225. package/templates/src/components/edit/panels/StyleImagePanel_update.tsx +312 -0
  226. package/templates/src/components/edit/panels/StyleLiElementPanel.tsx +273 -0
  227. package/templates/src/components/edit/panels/StyleLiElementPanel_add.tsx +301 -0
  228. package/templates/src/components/edit/panels/StyleLiElementPanel_remove.tsx +132 -0
  229. package/templates/src/components/edit/panels/StyleLiElementPanel_update.tsx +313 -0
  230. package/templates/src/components/edit/panels/StyleLinkPanel.tsx +346 -0
  231. package/templates/src/components/edit/panels/StyleLinkPanel_add.tsx +265 -0
  232. package/templates/src/components/edit/panels/StyleLinkPanel_config.tsx +240 -0
  233. package/templates/src/components/edit/panels/StyleLinkPanel_remove.tsx +94 -0
  234. package/templates/src/components/edit/panels/StyleLinkPanel_update.tsx +110 -0
  235. package/templates/src/components/edit/panels/StyleParentPanel.tsx +263 -0
  236. package/templates/src/components/edit/panels/StyleParentPanel_add.tsx +275 -0
  237. package/templates/src/components/edit/panels/StyleParentPanel_deleteLayer.tsx +112 -0
  238. package/templates/src/components/edit/panels/StyleParentPanel_remove.tsx +87 -0
  239. package/templates/src/components/edit/panels/StyleParentPanel_update.tsx +141 -0
  240. package/templates/src/components/edit/panels/StyleWidgetPanel.tsx +428 -0
  241. package/templates/src/components/edit/panels/StyleWidgetPanel_add.tsx +292 -0
  242. package/templates/src/components/edit/panels/StyleWidgetPanel_config.tsx +190 -0
  243. package/templates/src/components/edit/panels/StyleWidgetPanel_remove.tsx +152 -0
  244. package/templates/src/components/edit/panels/StyleWidgetPanel_update.tsx +308 -0
  245. package/templates/src/components/edit/state/SaveModal.tsx +811 -0
  246. package/templates/src/components/edit/state/StylesMemory.tsx +310 -0
  247. package/templates/src/components/edit/storyfragment/StoryFragmentConfigPanel.tsx +289 -0
  248. package/templates/src/components/edit/storyfragment/StoryFragmentPanel_menu.tsx +320 -0
  249. package/templates/src/components/edit/storyfragment/StoryFragmentPanel_og.tsx +888 -0
  250. package/templates/src/components/edit/storyfragment/StoryFragmentPanel_slug.tsx +269 -0
  251. package/templates/src/components/edit/storyfragment/StoryFragmentPanel_title.tsx +190 -0
  252. package/templates/src/components/edit/widgets/BeliefWidget.tsx +183 -0
  253. package/templates/src/components/edit/widgets/BunnyWidget.tsx +134 -0
  254. package/templates/src/components/edit/widgets/IdentifyAsWidget.tsx +193 -0
  255. package/templates/src/components/edit/widgets/SignupWidget.tsx +177 -0
  256. package/templates/src/components/edit/widgets/ToggleWidget.tsx +152 -0
  257. package/templates/src/components/edit/widgets/YouTubeWidget.tsx +65 -0
  258. package/templates/src/components/fields/ActionBuilderTimeSelector.tsx +353 -0
  259. package/templates/src/components/fields/ArtpackImage.tsx +480 -0
  260. package/templates/src/components/fields/BackgroundImage.tsx +530 -0
  261. package/templates/src/components/fields/BackgroundImageWrapper.tsx +192 -0
  262. package/templates/src/components/fields/BooleanParam.tsx +67 -0
  263. package/templates/src/components/fields/BunnyMomentSelector.tsx +56 -0
  264. package/templates/src/components/fields/ColorPickerCombo.tsx +284 -0
  265. package/templates/src/components/fields/ImageUpload.tsx +405 -0
  266. package/templates/src/components/fields/MultiParam.tsx +75 -0
  267. package/templates/src/components/fields/PaneBreakCollectionSelector.tsx +97 -0
  268. package/templates/src/components/fields/PaneBreakShapeSelector.tsx +134 -0
  269. package/templates/src/components/fields/SelectedTailwindClass.tsx +44 -0
  270. package/templates/src/components/fields/SingleParam.tsx +73 -0
  271. package/templates/src/components/fields/ViewportComboBox.tsx +252 -0
  272. package/templates/src/components/form/ActionBuilderField.tsx +282 -0
  273. package/templates/src/components/form/ActionBuilderSlugSelector.tsx +182 -0
  274. package/templates/src/components/form/BooleanToggle.tsx +94 -0
  275. package/templates/src/components/form/ColorPicker.tsx +153 -0
  276. package/templates/src/components/form/DateTimeInput.tsx +638 -0
  277. package/templates/src/components/form/EnumSelect.tsx +88 -0
  278. package/templates/src/components/form/FileUpload.tsx +465 -0
  279. package/templates/src/components/form/MagicPathBuilder.tsx +546 -0
  280. package/templates/src/components/form/NumberInput.tsx +101 -0
  281. package/templates/src/components/form/ParagraphArrayInput.tsx +207 -0
  282. package/templates/src/components/form/StringArrayInput.tsx +163 -0
  283. package/templates/src/components/form/StringInput.tsx +88 -0
  284. package/templates/src/components/form/UnsavedChangesBar.tsx +295 -0
  285. package/templates/src/components/form/advanced/APIConfigSection.tsx +69 -0
  286. package/templates/src/components/form/advanced/AuthConfigSection.tsx +97 -0
  287. package/templates/src/components/form/brand/BrandAssetsSection.tsx +93 -0
  288. package/templates/src/components/form/brand/BrandColorsSection.tsx +201 -0
  289. package/templates/src/components/form/brand/SEOSection.tsx +101 -0
  290. package/templates/src/components/form/brand/SiteConfigSection.tsx +61 -0
  291. package/templates/src/components/form/brand/SocialLinksSection.tsx +393 -0
  292. package/templates/src/components/profile/ProfileConsent.tsx +65 -0
  293. package/templates/src/components/profile/ProfileCreate.tsx +462 -0
  294. package/templates/src/components/profile/ProfileEdit.tsx +409 -0
  295. package/templates/src/components/profile/ProfileSwitch.tsx +255 -0
  296. package/templates/src/components/profile/ProfileUnlock.tsx +221 -0
  297. package/templates/src/components/storykeep/Dashboard.tsx +160 -0
  298. package/templates/src/components/storykeep/Dashboard_Activity.tsx +56 -0
  299. package/templates/src/components/storykeep/Dashboard_Advanced.tsx +165 -0
  300. package/templates/src/components/storykeep/Dashboard_Analytics.tsx +451 -0
  301. package/templates/src/components/storykeep/Dashboard_Branding.tsx +95 -0
  302. package/templates/src/components/storykeep/Dashboard_Content.tsx +191 -0
  303. package/templates/src/components/storykeep/controls/UsageCell.tsx +71 -0
  304. package/templates/src/components/storykeep/controls/content/BeliefForm.tsx +378 -0
  305. package/templates/src/components/storykeep/controls/content/BeliefTable.tsx +329 -0
  306. package/templates/src/components/storykeep/controls/content/ContentBrowser.tsx +385 -0
  307. package/templates/src/components/storykeep/controls/content/ContentSummary.tsx +149 -0
  308. package/templates/src/components/storykeep/controls/content/KnownResourceForm.tsx +397 -0
  309. package/templates/src/components/storykeep/controls/content/KnownResourceTable.tsx +260 -0
  310. package/templates/src/components/storykeep/controls/content/ManageContent.tsx +439 -0
  311. package/templates/src/components/storykeep/controls/content/MenuForm.tsx +239 -0
  312. package/templates/src/components/storykeep/controls/content/MenuTable.tsx +332 -0
  313. package/templates/src/components/storykeep/controls/content/ResourceBulkIngest.tsx +724 -0
  314. package/templates/src/components/storykeep/controls/content/ResourceForm.tsx +355 -0
  315. package/templates/src/components/storykeep/controls/content/ResourceTable.tsx +222 -0
  316. package/templates/src/components/storykeep/controls/content/StoryFragmentTable.tsx +482 -0
  317. package/templates/src/components/storykeep/state/BrandingWrapper.tsx +42 -0
  318. package/templates/src/components/storykeep/state/FetchAnalytics.tsx +350 -0
  319. package/templates/src/components/storykeep/widgets/ResponsiveLine.tsx +319 -0
  320. package/templates/src/components/storykeep/widgets/Wizard.tsx +278 -0
  321. package/templates/src/components/tenant/RegistrationForm.tsx +447 -0
  322. package/templates/src/components/widgets/BunnyVideoHero.astro +775 -0
  323. package/templates/src/components/widgets/Impression.tsx +102 -0
  324. package/templates/src/components/widgets/ImpressionWrapper.tsx +214 -0
  325. package/templates/src/constants/beliefs.ts +61 -0
  326. package/templates/src/constants/brandThemes.ts +133 -0
  327. package/templates/src/constants/prompts.json +55 -0
  328. package/templates/src/constants/shapes.ts +556 -0
  329. package/templates/src/constants/stopWords.ts +116 -0
  330. package/templates/src/constants/tailwindColors.json +344 -0
  331. package/templates/src/constants.ts +274 -0
  332. package/templates/src/hooks/useFormState.ts +203 -0
  333. package/templates/src/layouts/Layout.astro +290 -0
  334. package/templates/src/lib/session.ts +126 -0
  335. package/templates/src/lib/storyData.ts +56 -0
  336. package/templates/src/middleware.ts +52 -0
  337. package/templates/src/pages/404.astro +54 -0
  338. package/templates/src/pages/[...slug]/edit.astro +216 -0
  339. package/templates/src/pages/[...slug].astro +148 -0
  340. package/templates/src/pages/api/auth/decode.ts +101 -0
  341. package/templates/src/pages/api/auth/login.ts +122 -0
  342. package/templates/src/pages/api/auth/logout.ts +37 -0
  343. package/templates/src/pages/api/auth/profile.ts +76 -0
  344. package/templates/src/pages/api/orphan-analysis.ts +106 -0
  345. package/templates/src/pages/api/tailwind.ts +116 -0
  346. package/templates/src/pages/collections/[param1].astro +65 -0
  347. package/templates/src/pages/context/[...contextSlug]/edit.astro +207 -0
  348. package/templates/src/pages/context/[...contextSlug].astro +161 -0
  349. package/templates/src/pages/llms.txt.ts +122 -0
  350. package/templates/src/pages/maint.astro +183 -0
  351. package/templates/src/pages/media/[...slug].astro +67 -0
  352. package/templates/src/pages/robots.txt.ts +36 -0
  353. package/templates/src/pages/sandbox/activate.astro +258 -0
  354. package/templates/src/pages/sandbox/register.astro +44 -0
  355. package/templates/src/pages/sandbox/success.astro +179 -0
  356. package/templates/src/pages/sitemap.xml.ts +119 -0
  357. package/templates/src/pages/storykeep/advanced.astro +69 -0
  358. package/templates/src/pages/storykeep/branding.astro +57 -0
  359. package/templates/src/pages/storykeep/content.astro +71 -0
  360. package/templates/src/pages/storykeep/init.astro +36 -0
  361. package/templates/src/pages/storykeep/login.astro +266 -0
  362. package/templates/src/pages/storykeep/logout.astro +84 -0
  363. package/templates/src/pages/storykeep/profile.astro +98 -0
  364. package/templates/src/pages/storykeep.astro +81 -0
  365. package/templates/src/stores/analytics.ts +171 -0
  366. package/templates/src/stores/backend.ts +16 -0
  367. package/templates/src/stores/navigation.ts +149 -0
  368. package/templates/src/stores/nodes.ts +2390 -0
  369. package/templates/src/stores/nodesHistory.ts +85 -0
  370. package/templates/src/stores/notificationSystem.ts +41 -0
  371. package/templates/src/stores/orphanAnalysis.ts +409 -0
  372. package/templates/src/stores/storykeep.ts +247 -0
  373. package/templates/src/types/astro.ts +86 -0
  374. package/templates/src/types/compositorTypes.ts +456 -0
  375. package/templates/src/types/formTypes.ts +281 -0
  376. package/templates/src/types/multiTenant.ts +77 -0
  377. package/templates/src/types/nodeProps.ts +66 -0
  378. package/templates/src/types/tractstack.ts +445 -0
  379. package/templates/src/utils/aai/getTitleSlug.ts +72 -0
  380. package/templates/src/utils/actions/actionButton.ts +101 -0
  381. package/templates/src/utils/actions/lispLexer.ts +57 -0
  382. package/templates/src/utils/actions/preParse_Action.ts +85 -0
  383. package/templates/src/utils/actions/preParse_Bunny.ts +50 -0
  384. package/templates/src/utils/actions/preParse_Clicked.ts +87 -0
  385. package/templates/src/utils/actions/preParse_Impression.ts +71 -0
  386. package/templates/src/utils/api/advancedConfig.ts +66 -0
  387. package/templates/src/utils/api/advancedHelpers.ts +134 -0
  388. package/templates/src/utils/api/beliefConfig.ts +87 -0
  389. package/templates/src/utils/api/beliefHelpers.ts +196 -0
  390. package/templates/src/utils/api/brandConfig.ts +126 -0
  391. package/templates/src/utils/api/brandHelpers.ts +155 -0
  392. package/templates/src/utils/api/fileHelpers.ts +306 -0
  393. package/templates/src/utils/api/menuConfig.ts +57 -0
  394. package/templates/src/utils/api/menuHelpers.ts +156 -0
  395. package/templates/src/utils/api/resourceConfig.ts +158 -0
  396. package/templates/src/utils/api/resourceHelpers.ts +72 -0
  397. package/templates/src/utils/api/tenantConfig.ts +97 -0
  398. package/templates/src/utils/api/tenantHelpers.ts +172 -0
  399. package/templates/src/utils/api.ts +183 -0
  400. package/templates/src/utils/auth.ts +150 -0
  401. package/templates/src/utils/backend.ts +243 -0
  402. package/templates/src/utils/compositor/TemplateMarkdowns.ts +118 -0
  403. package/templates/src/utils/compositor/TemplateNodes.ts +138 -0
  404. package/templates/src/utils/compositor/TemplatePanes.ts +100 -0
  405. package/templates/src/utils/compositor/allowInsert.ts +100 -0
  406. package/templates/src/utils/compositor/domHelpers.ts +37 -0
  407. package/templates/src/utils/compositor/handleClickEvent.ts +131 -0
  408. package/templates/src/utils/compositor/nodesHelper.ts +491 -0
  409. package/templates/src/utils/compositor/nodesMarkdownGenerator.ts +292 -0
  410. package/templates/src/utils/compositor/processMarkdown.ts +431 -0
  411. package/templates/src/utils/compositor/reduceNodesClassNames.ts +192 -0
  412. package/templates/src/utils/compositor/tailwindClasses.ts +1795 -0
  413. package/templates/src/utils/compositor/tailwindColors.ts +227 -0
  414. package/templates/src/utils/compositor/templateMarkdownStyles.ts +1265 -0
  415. package/templates/src/utils/compositor/typeGuards.ts +193 -0
  416. package/templates/src/utils/etl/extractor.ts +119 -0
  417. package/templates/src/utils/etl/index.ts +88 -0
  418. package/templates/src/utils/etl/loader.ts +36 -0
  419. package/templates/src/utils/etl/transformer.ts +286 -0
  420. package/templates/src/utils/helpers.ts +435 -0
  421. package/templates/src/utils/layout.ts +209 -0
  422. package/templates/src/utils/profileStorage.ts +306 -0
  423. package/templates/src/utils/useInterval.ts +27 -0
  424. package/templates/tailwind.config.cjs +169 -0
  425. package/utils/create-resolver.ts +10 -0
  426. package/utils/inject-files.ts +2140 -0
  427. package/utils/validate-config.ts +43 -0
@@ -0,0 +1,102 @@
1
+ import { navigate } from 'astro:transitions/client';
2
+ import { lispLexer } from '@/utils/actions/lispLexer';
3
+ import { preParseAction } from '@/utils/actions/preParse_Action';
4
+ import { preParseImpression } from '@/utils/actions/preParse_Impression';
5
+ import type { ImpressionNode } from '@/types/compositorTypes';
6
+ import type { BrandConfig } from '@/types/tractstack';
7
+
8
+ interface ImpressionProps {
9
+ payload: ImpressionNode;
10
+ currentPage: {
11
+ id: string;
12
+ slug: string;
13
+ title: string;
14
+ };
15
+ config: BrandConfig;
16
+ }
17
+
18
+ const Impression = ({ payload, currentPage, config }: ImpressionProps) => {
19
+ // Parse the actionsLisp to get button payload and action URL
20
+ const thisButtonPayload = lispLexer(payload.actionsLisp);
21
+ const actionPayload = preParseAction(
22
+ thisButtonPayload,
23
+ currentPage.slug,
24
+ false, // isContext - using false as default
25
+ config
26
+ );
27
+
28
+ // Create impression event using legacy logic
29
+ const event = preParseImpression(
30
+ payload.id,
31
+ payload.title,
32
+ currentPage.id, // using currentPage.id as parentId equivalent
33
+ thisButtonPayload,
34
+ config
35
+ );
36
+
37
+ const pushEvent = async function (): Promise<void> {
38
+ if (!event) return;
39
+
40
+ // Send analytics event (simplified V2 pattern)
41
+ try {
42
+ const tractStackConfig = window.TRACTSTACK_CONFIG;
43
+ if (tractStackConfig?.sessionId) {
44
+ const formData: { [key: string]: string } = {
45
+ beliefId: payload.id,
46
+ beliefType: 'Impression',
47
+ beliefValue: 'CLICKED',
48
+ paneId: payload.parentId || '',
49
+ };
50
+
51
+ await fetch(`${tractStackConfig.backendUrl}/api/v1/state`, {
52
+ method: 'POST',
53
+ headers: {
54
+ 'Content-Type': 'application/x-www-form-urlencoded',
55
+ 'X-Tenant-ID': tractStackConfig.tenantId,
56
+ 'X-TractStack-Session-ID': tractStackConfig.sessionId,
57
+ 'X-StoryFragment-ID': tractStackConfig.storyfragmentId,
58
+ },
59
+ body: new URLSearchParams(formData),
60
+ });
61
+ }
62
+ } catch (error) {
63
+ console.error('Failed to send impression analytics event:', error);
64
+ }
65
+
66
+ // Navigate to action URL if available
67
+ if (actionPayload) {
68
+ navigate(actionPayload);
69
+ }
70
+ };
71
+
72
+ // Validate payload
73
+ if (typeof payload !== 'object' || !payload) {
74
+ return <div className="hidden" />;
75
+ }
76
+
77
+ // Legacy styling: simple container with inline text and link
78
+ return (
79
+ <div className="p-3">
80
+ <h3 className="text-md font-action leading-6 text-black">
81
+ {payload.title}
82
+ </h3>
83
+ <div className="xs:flex xs:items-start xs:justify-between mt-2">
84
+ <div className="max-w-xl text-sm text-black">
85
+ <p>
86
+ {payload.body}
87
+ {` `}
88
+ <a
89
+ onClick={() => pushEvent()}
90
+ className="hover:text-myorange cursor-pointer text-black underline underline-offset-4"
91
+ href={actionPayload || '#'}
92
+ >
93
+ {payload.buttonText}
94
+ </a>
95
+ </p>
96
+ </div>
97
+ </div>
98
+ </div>
99
+ );
100
+ };
101
+
102
+ export default Impression;
@@ -0,0 +1,214 @@
1
+ import { useState, useEffect, useRef } from 'react';
2
+ import { XMarkIcon } from '@heroicons/react/24/outline';
3
+ import Impression from './Impression';
4
+ import type { ImpressionNode } from '@/types/compositorTypes';
5
+ import type { BrandConfig } from '@/types/tractstack';
6
+
7
+ interface ImpressionWrapperProps {
8
+ payload: ImpressionNode[];
9
+ currentPage: {
10
+ id: string;
11
+ slug: string;
12
+ title: string;
13
+ };
14
+ config: BrandConfig;
15
+ icon?: boolean;
16
+ }
17
+
18
+ const ImpressionWrapper = ({
19
+ payload,
20
+ currentPage,
21
+ config,
22
+ icon = true,
23
+ }: ImpressionWrapperProps) => {
24
+ const [visibleImpressions, setVisibleImpressions] = useState<
25
+ ImpressionNode[]
26
+ >([]);
27
+ const [seenPaneIds, setSeenPaneIds] = useState<Set<string>>(new Set());
28
+ const [isExpanded, setIsExpanded] = useState(false);
29
+ const [currentImpressionIndex, setCurrentImpressionIndex] = useState(0);
30
+ const intervalRef = useRef<NodeJS.Timeout | null>(null);
31
+
32
+ // Pane visibility tracking (existing logic)
33
+ useEffect(() => {
34
+ if (payload.length === 0) return;
35
+
36
+ const impressionPaneIds = new Set(
37
+ payload
38
+ .map((impression) => impression.parentId)
39
+ .filter((id): id is string => Boolean(id))
40
+ );
41
+
42
+ const unseenPaneIds = Array.from(impressionPaneIds).filter(
43
+ (paneId) => !seenPaneIds.has(paneId)
44
+ );
45
+
46
+ if (unseenPaneIds.length === 0) return;
47
+
48
+ const observer = new IntersectionObserver(
49
+ (entries) => {
50
+ entries.forEach((entry) => {
51
+ if (entry.isIntersecting) {
52
+ const paneId = entry.target.getAttribute('data-pane-id');
53
+ if (paneId && impressionPaneIds.has(paneId)) {
54
+ setSeenPaneIds((prev) => new Set(prev).add(paneId));
55
+ observer.unobserve(entry.target);
56
+ }
57
+ }
58
+ });
59
+ },
60
+ {
61
+ threshold: 0.1,
62
+ rootMargin: '0px',
63
+ }
64
+ );
65
+
66
+ unseenPaneIds.forEach((paneId) => {
67
+ const paneElement = document.querySelector(`[data-pane-id="${paneId}"]`);
68
+ if (paneElement) {
69
+ observer.observe(paneElement);
70
+ }
71
+ });
72
+
73
+ return () => {
74
+ observer.disconnect();
75
+ };
76
+ }, [payload, seenPaneIds]);
77
+
78
+ // Update visible impressions when seen panes change
79
+ useEffect(() => {
80
+ const newVisibleImpressions = payload.filter(
81
+ (impression) =>
82
+ impression.parentId && seenPaneIds.has(impression.parentId)
83
+ );
84
+ setVisibleImpressions(newVisibleImpressions);
85
+
86
+ // Reset index when impressions change
87
+ if (
88
+ newVisibleImpressions.length > 0 &&
89
+ currentImpressionIndex >= newVisibleImpressions.length
90
+ ) {
91
+ setCurrentImpressionIndex(0);
92
+ }
93
+ }, [payload, seenPaneIds, currentImpressionIndex]);
94
+
95
+ // Cycling logic for multiple impressions
96
+ useEffect(() => {
97
+ if (isExpanded && visibleImpressions.length > 1) {
98
+ intervalRef.current = setInterval(() => {
99
+ setCurrentImpressionIndex(
100
+ (prevIndex) => (prevIndex + 1) % visibleImpressions.length
101
+ );
102
+ }, 5000); // 5 second interval
103
+ } else {
104
+ if (intervalRef.current) {
105
+ clearInterval(intervalRef.current);
106
+ intervalRef.current = null;
107
+ }
108
+ }
109
+
110
+ return () => {
111
+ if (intervalRef.current) {
112
+ clearInterval(intervalRef.current);
113
+ }
114
+ };
115
+ }, [isExpanded, visibleImpressions.length]);
116
+
117
+ // No impressions to show
118
+ if (visibleImpressions.length === 0) {
119
+ return null;
120
+ }
121
+
122
+ // Header icon mode (when icon=true and not expanded)
123
+ if (icon && !isExpanded) {
124
+ return (
125
+ <div className="impression-header-icon">
126
+ <button
127
+ type="button"
128
+ title="Click for notifications"
129
+ className="bg-brand-1 hover:bg-brand-3 flex h-6 w-6 items-center justify-center rounded-full text-sm font-bold text-white transition-colors motion-safe:animate-bounce"
130
+ onClick={() => setIsExpanded(true)}
131
+ >
132
+ <span className="sr-only">Show impressions</span>
133
+ <span>{visibleImpressions.length}</span>
134
+ </button>
135
+ </div>
136
+ );
137
+ }
138
+
139
+ // Expanded overlay mode (bottom-right)
140
+ if (isExpanded) {
141
+ const currentImpression = visibleImpressions[currentImpressionIndex];
142
+
143
+ return (
144
+ <div className="impression-overlay fixed bottom-4 right-4 z-50 w-96 max-w-[calc(100vw-2rem)]">
145
+ <div className="relative rounded-lg border border-gray-200 bg-white shadow-lg">
146
+ {/* Close button */}
147
+ <button
148
+ type="button"
149
+ className="focus:ring-brand-1 absolute right-2 top-2 z-10 rounded-md bg-white text-gray-400 hover:text-gray-600 focus:outline-none focus:ring-2 focus:ring-offset-2"
150
+ onClick={() => setIsExpanded(false)}
151
+ >
152
+ <span className="sr-only">Close impressions</span>
153
+ <XMarkIcon className="h-5 w-5" aria-hidden="true" />
154
+ </button>
155
+
156
+ {/* Impression content */}
157
+ {currentImpression && (
158
+ <div className="p-4">
159
+ <Impression
160
+ payload={currentImpression}
161
+ currentPage={currentPage}
162
+ config={config}
163
+ />
164
+ </div>
165
+ )}
166
+
167
+ {/* Multiple impressions indicator */}
168
+ {visibleImpressions.length > 1 && (
169
+ <div className="flex justify-center space-x-1 border-t border-gray-100 px-4 py-2">
170
+ {visibleImpressions.map((_, index) => (
171
+ <button
172
+ key={index}
173
+ className={`h-2 w-2 rounded-full transition-colors ${
174
+ index === currentImpressionIndex
175
+ ? 'bg-brand-1'
176
+ : 'bg-gray-300 hover:bg-gray-400'
177
+ }`}
178
+ onClick={() => setCurrentImpressionIndex(index)}
179
+ aria-label={`Show impression ${index + 1}`}
180
+ />
181
+ ))}
182
+ </div>
183
+ )}
184
+ </div>
185
+ </div>
186
+ );
187
+ }
188
+
189
+ // Fallback to existing behavior when icon=false
190
+ return (
191
+ <div
192
+ className="impressions-wrapper pointer-events-none fixed z-50"
193
+ style={{
194
+ bottom: 'var(--bottom-right-controls-bottom-offset, 16px)',
195
+ right: '16px',
196
+ }}
197
+ >
198
+ <div className="impressions-container pointer-events-auto">
199
+ <div className="impressions-list space-y-3">
200
+ {visibleImpressions.map((impression) => (
201
+ <Impression
202
+ key={impression.id}
203
+ payload={impression}
204
+ currentPage={currentPage}
205
+ config={config}
206
+ />
207
+ ))}
208
+ </div>
209
+ </div>
210
+ </div>
211
+ );
212
+ };
213
+
214
+ export default ImpressionWrapper;
@@ -0,0 +1,61 @@
1
+ import type { BeliefOptionDatum } from '@/types/compositorTypes';
2
+
3
+ const likert: BeliefOptionDatum[] = [
4
+ {
5
+ id: 1,
6
+ slug: `STRONGLY_AGREES`,
7
+ name: `Strongly agree`,
8
+ color: `bg-teal-400`,
9
+ },
10
+ { id: 2, slug: `AGREES`, name: `Agree`, color: `bg-lime-400` },
11
+ {
12
+ id: 3,
13
+ slug: `NEITHER_AGREES_NOR_DISAGREES`,
14
+ name: `Neither agree nor disagree`,
15
+ color: `bg-slate-200`,
16
+ },
17
+ { id: 4, slug: `DISAGREES`, name: `Disagree`, color: `bg-amber-400` },
18
+ {
19
+ id: 5,
20
+ slug: `STRONGLY_DISAGREES`,
21
+ name: `Strongly disagree`,
22
+ color: `bg-red-400`,
23
+ },
24
+ ];
25
+
26
+ const agreement: BeliefOptionDatum[] = [
27
+ { id: 1, slug: `AGREES`, name: `Agree`, color: `bg-lime-400` },
28
+ { id: 2, slug: `DISAGREES`, name: `Disagree`, color: `bg-amber-400` },
29
+ ];
30
+
31
+ const interest: BeliefOptionDatum[] = [
32
+ { id: 1, slug: `INTERESTED`, name: `Interested`, color: `bg-lime-400` },
33
+ {
34
+ id: 2,
35
+ slug: `NOT_INTERESTED`,
36
+ name: `Not Interested`,
37
+ color: `bg-amber-400`,
38
+ },
39
+ ];
40
+
41
+ const yn: BeliefOptionDatum[] = [
42
+ { id: 1, slug: `BELIEVES_YES`, name: `Yes`, color: `bg-lime-400` },
43
+ { id: 2, slug: `BELIEVES_NO`, name: `No`, color: `bg-amber-400` },
44
+ ];
45
+
46
+ const tf: BeliefOptionDatum[] = [
47
+ { id: 1, slug: `BELIEVES_TRUE`, name: `True`, color: `bg-lime-400` },
48
+ { id: 2, slug: `BELIEVES_FALSE`, name: `False`, color: `bg-amber-400` },
49
+ ];
50
+
51
+ const heldBeliefsTitles: { [key: string]: string } = {
52
+ likert: `Agree or Disagree?`,
53
+ agreement: `Agree or Disagree?`,
54
+ interest: `Are you Interested?`,
55
+ yn: `Yes or No?`,
56
+ tf: `True or False?`,
57
+ };
58
+
59
+ const heldBeliefsScales = { likert, agreement, interest, yn, tf };
60
+
61
+ export { heldBeliefsScales, heldBeliefsTitles };
@@ -0,0 +1,133 @@
1
+ import type { ArtpacksStore } from '@/types/tractstack';
2
+
3
+ // Brand Colors --> POSITIONAL MAPPING SYSTEM:
4
+ // Position 1: Very dark (primary black) - pairs with 2,8 for text contrast
5
+ // Position 2: Very light (primary white) - pairs with 1,5,7 for background contrast
6
+ // Position 3: Bright foreground/background color (accent)
7
+ // Position 4: Bright foreground/background color (secondary accent)
8
+ // Position 5: Darker background color - pairs with 2,6,8 for content areas
9
+ // Position 6: Middle color - general purpose, pairs with 1,5 for subtle contrast
10
+ // Position 7: Dark utility color
11
+ // Position 8: Off-white - pairs with 1,5,7 for softer contrast than position 2
12
+
13
+ export const PUBLIC_THEME = 'light-bold';
14
+
15
+ export const THEME_OPTIONS = [
16
+ 'Default',
17
+ 'Monet',
18
+ 'Dali',
19
+ 'Hiphop',
20
+ 'Grey',
21
+ 'Custom',
22
+ ] as const;
23
+
24
+ export type ThemeOption = (typeof THEME_OPTIONS)[number];
25
+
26
+ // Theme presets with exactly 8 brand colors each - using YOUR actual selections
27
+ export const THEME_PRESETS: Record<string, string[]> = {
28
+ Default: [
29
+ '10120d',
30
+ 'fcfcfc',
31
+ 'f58333',
32
+ 'c8df8c',
33
+ '293f58',
34
+ 'a7b1b7',
35
+ '393d34',
36
+ 'e3e3e3',
37
+ ],
38
+ Monet: [
39
+ '0f1912',
40
+ 'f6f4f3',
41
+ 'cfae97',
42
+ 'ded2c3',
43
+ '24423c',
44
+ 'a8cd20',
45
+ '452a3d',
46
+ 'f3f5f6',
47
+ ],
48
+ Dali: [
49
+ '150c02',
50
+ 'fffef9',
51
+ 'fef6d1',
52
+ 'e2e5d4',
53
+ '4b3703',
54
+ 'dddcca',
55
+ '382c0d',
56
+ 'fefcee',
57
+ ],
58
+ Hiphop: [
59
+ '0d0d09',
60
+ 'faf7f3',
61
+ 'ffd201',
62
+ 'a3bfd4',
63
+ '39304d',
64
+ 'f6e5ce',
65
+ '3c2a25',
66
+ 'f0e7d5',
67
+ ],
68
+ Grey: [
69
+ '101010',
70
+ 'f0f0f0',
71
+ '888888',
72
+ 'aaaaaa',
73
+ '333333',
74
+ 'bbbbbb',
75
+ '444444',
76
+ 'dddddd',
77
+ ],
78
+ };
79
+
80
+ // Validate that all presets have exactly 8 colors
81
+ Object.entries(THEME_PRESETS).forEach(([themeName, colors]) => {
82
+ if (colors.length !== 8) {
83
+ throw new Error(
84
+ `Theme "${themeName}" must have exactly 8 colors, found ${colors.length}`
85
+ );
86
+ }
87
+ });
88
+
89
+ // Helper function to get theme colors
90
+ export function getThemeColors(theme: string): string[] {
91
+ return THEME_PRESETS[theme] || THEME_PRESETS.Default;
92
+ }
93
+
94
+ // Helper function to check if theme is custom
95
+ export function isCustomTheme(theme: string): boolean {
96
+ return theme === 'Custom' || !THEME_OPTIONS.includes(theme as ThemeOption);
97
+ }
98
+
99
+ export const ARTPACKS: ArtpacksStore = {
100
+ kCz: [
101
+ 'captainBreakfast',
102
+ 'cleanDrips',
103
+ 'crispwaves',
104
+ 'dragon',
105
+ 'dragonSkin',
106
+ 'nightcity',
107
+ 'pattern1',
108
+ 'pattern2',
109
+ 'skindrips',
110
+ 'slimetime',
111
+ 'snake',
112
+ 'toxicshock',
113
+ 'tractstack',
114
+ 'tripdrips',
115
+ 'wavedrips',
116
+ ],
117
+ t8k: [
118
+ 'beach',
119
+ 'blast',
120
+ 'bokeh',
121
+ 'cartoon',
122
+ 'darkeggshell',
123
+ 'explosion',
124
+ 'floral',
125
+ 'flower',
126
+ 'foliage',
127
+ 'mist',
128
+ 'portal',
129
+ 'storytime',
130
+ 'tacky',
131
+ 'wallpaper',
132
+ ],
133
+ };
@@ -0,0 +1,55 @@
1
+ {
2
+ "formatPrompt": "Create a markdown summary following this structure: Start with a ## Heading 2 containing a catchy, concise title that encapsulates the main theme. Follow with a single paragraph that provides an overall short description, setting the context for the entire piece. Create 3-5 ### Heading 3 sections, each focusing on a key aspect or subtopic of the main theme. Each heading should be followed by any appropriate number of paragraphs expanding on that subtopic. Optionally, include a #### Heading 4 subsection under one or more of the ### Heading 3 sections if there's a need to dive deeper into a specific point. This should also be followed by one or two paragraphs. Ensure all content is in pure markdown format, without any HTML tags or special formatting.",
3
+ "paneFormatPrompt": "Create a markdown artifact following this structure: If appropriate start with a ## Heading 2 containing a catchy, concise title that encapsulates the main theme. Follow with a single paragraph that provides an overall short description, setting the context for the entire piece. Create a ### Heading 3 section focusing on the main theme. This heading should be followed by any appropriate number of paragraphs expanding on the topic. Optionally, include a #### Heading 4 subsection if there's a need to dive deeper into a specific point. This should also be followed by one or two paragraphs. Ensure all content is in pure markdown format, without any HTML tags or special formatting.",
4
+ "contextPanePrompts": {
5
+ "shortformcontext": "You are writing a focused, contextual page that needs to quickly orient and inform readers about a specific topic or concept in 500 words or less. Prioritize clarity and immediate relevance over comprehensive coverage. Use a direct, efficient writing style that frontloads key information. Keep sections brief but substantive, focusing on what readers need to know in this specific context. Maintain a helpful, straightforward tone that respects the reader's time while ensuring they grasp essential points."
6
+ },
7
+ "panePrompts": {
8
+ "shortformcontext": "You are writing focused, contextual paragraph(s) that quickly orient and inform readers about a specific topic or concept in 50-150 words. Do not include *everything* from the raw notes. Summarize selectively to meet word length target while prioritizing clarity and immediate relevance over comprehensive coverage. Use a direct, efficient writing style that frontloads key information. Keep sections brief but substantive, focusing on what readers need to know in this specific context. Maintain a helpful, straightforward tone that respects the reader's time while ensuring they grasp essential points."
9
+ },
10
+ "pagePrompts": {
11
+ "landing": "You are writing copy for a high-traffic internet website landing page. Write for an audience who is reading this website copy and is very interested in what it has to offer. Focus on compelling value propositions, clear benefits, and strong calls-to-action. Maintain a direct, engaging tone that builds trust and encourages conversion. Each section should naturally lead visitors toward taking action. Keep paragraphs concise and impactful.",
12
+ "longform": "You are writing an in-depth, long-form blog article or content piece of up to two thousand words. Take a comprehensive, authoritative approach that demonstrates deep expertise while remaining accessible. Build your argument methodically, using a clear narrative structure that guides readers through complex ideas. Focus on delivering valuable insights and thorough analysis. Use a professional yet conversational tone that maintains reader engagement throughout the extended length. Each section should build upon previous points while introducing new dimensions of the topic.",
13
+ "shortformcontext": "You are writing a focused, contextual page that needs to quickly orient and inform readers about a specific topic or concept in 500 words or less. Prioritize clarity and immediate relevance over comprehensive coverage. Use a direct, efficient writing style that frontloads key information. Keep sections brief but substantive, focusing on what readers need to know in this specific context. Maintain a helpful, straightforward tone that respects the reader's time while ensuring they grasp essential points.",
14
+ "product": "You are detailing a product page for an e-commerce site. Focus on highlighting unique selling points, specifications, and benefits of the product. Use persuasive language to showcase how the product solves problems or enhances the user's life. Include clear calls-to-action towards purchasing or adding to cart. Ensure the tone is enthusiastic yet informative, with concise sections for easy scanning.",
15
+ "aboutus": "You're crafting the 'About Us' page for a company website. Narrate the company's history, mission, vision, and values in a storytelling manner that resonates with visitors. Highlight key milestones, team culture, and what sets the company apart. Use a warm, approachable tone that builds trust and connection with the visitor. Include subtle calls-to-action encouraging contact or further exploration of the site.",
16
+ "contact": "You are writing for a contact page that must be approachable and reassuring. Outline all available contact methods clearly - phone, email, social media, etc. Provide concise instructions or forms for inquiries, emphasizing quick responses and customer satisfaction. Use a friendly, service-oriented tone to make potential clients feel welcome and valued.",
17
+ "service": "You are detailing a service page where clarity and benefit-focused content are key. Describe each service with emphasis on how it benefits the client, using case studies or testimonials if possible. Structure the content to guide the visitor from understanding the service to seeing its value, culminating in a strong call-to-action to get in touch or book a service. Keep the tone professional yet engaging.",
18
+ "faq": "You're compiling an FAQ page intended to preemptively answer common questions. Write in a straightforward, informative style, addressing questions succinctly but thoroughly. Organize questions by relevance or category for ease of use. Use a tone that reassures and educates, making users feel their queries are anticipated and valued."
19
+ },
20
+ "pagePromptsDetails": {
21
+ "landing": {
22
+ "title": "High-Traffic Landing Page",
23
+ "description": "Engage visitors with compelling offers and clear calls-to-action"
24
+ },
25
+ "longform": {
26
+ "title": "In-depth long-form Post",
27
+ "description": "Comprehensive, expert-driven analysis on complex topics"
28
+ },
29
+ "shortformcontext": {
30
+ "title": "Quick Context Piece",
31
+ "description": "Focused content delivering immediate clarity on specific concepts"
32
+ },
33
+ "product": {
34
+ "title": "Product Detail Page",
35
+ "description": "Highlighting unique features, benefits, and purchase options"
36
+ },
37
+ "aboutus": {
38
+ "title": "About Us",
39
+ "description": "Our story, mission, and what makes us unique"
40
+ },
41
+ "contact": {
42
+ "title": "Contact Us",
43
+ "description": "Get in touch with us easily and confidently"
44
+ },
45
+ "service": {
46
+ "title": "Services Overview",
47
+ "description": "Explore how our services can benefit you"
48
+ },
49
+ "faq": {
50
+ "title": "Frequently Asked Questions Page",
51
+ "description": "Answers to commonly asked questions"
52
+ }
53
+ },
54
+ "contextPrompt": "Using the following contextual information - both the broad topic/purpose you want to write about and any supporting details, documentation, or reference material - I will help craft appropriate content structured for your specific page type. Please provide both your high-level goal/topic and any relevant reference material you'd like incorporated:"
55
+ }