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.
- package/LICENSE +110 -0
- package/README.md +56 -0
- package/astro.d.ts +64 -0
- package/bin/create-tractstack.js +483 -0
- package/dist/config.js +80 -0
- package/dist/index.js +2129 -0
- package/package.json +89 -0
- package/templates/artpacks/kCz/captainBreakfast_1080px.webp +0 -0
- package/templates/artpacks/kCz/captainBreakfast_1920px.webp +0 -0
- package/templates/artpacks/kCz/captainBreakfast_600px.webp +0 -0
- package/templates/artpacks/kCz/cleanDrips_1080px.webp +0 -0
- package/templates/artpacks/kCz/cleanDrips_1920px.webp +0 -0
- package/templates/artpacks/kCz/cleanDrips_600px.webp +0 -0
- package/templates/artpacks/kCz/crispwaves_1080px.webp +0 -0
- package/templates/artpacks/kCz/crispwaves_1920px.webp +0 -0
- package/templates/artpacks/kCz/crispwaves_600px.webp +0 -0
- package/templates/artpacks/kCz/dragonSkin_1080px.webp +0 -0
- package/templates/artpacks/kCz/dragonSkin_1920px.webp +0 -0
- package/templates/artpacks/kCz/dragonSkin_600px.webp +0 -0
- package/templates/artpacks/kCz/dragon_1080px.webp +0 -0
- package/templates/artpacks/kCz/dragon_1920px.webp +0 -0
- package/templates/artpacks/kCz/dragon_600px.webp +0 -0
- package/templates/artpacks/kCz/nightcity_1080px.webp +0 -0
- package/templates/artpacks/kCz/nightcity_1920px.webp +0 -0
- package/templates/artpacks/kCz/nightcity_600px.webp +0 -0
- package/templates/artpacks/kCz/pattern1_1080px.webp +0 -0
- package/templates/artpacks/kCz/pattern1_1920px.webp +0 -0
- package/templates/artpacks/kCz/pattern1_600px.webp +0 -0
- package/templates/artpacks/kCz/pattern2_1080px.webp +0 -0
- package/templates/artpacks/kCz/pattern2_1920px.webp +0 -0
- package/templates/artpacks/kCz/pattern2_600px.webp +0 -0
- package/templates/artpacks/kCz/skindrips_1080px.webp +0 -0
- package/templates/artpacks/kCz/skindrips_1920px.webp +0 -0
- package/templates/artpacks/kCz/skindrips_600px.webp +0 -0
- package/templates/artpacks/kCz/slimetime_1080px.webp +0 -0
- package/templates/artpacks/kCz/slimetime_1920px.webp +0 -0
- package/templates/artpacks/kCz/slimetime_600px.webp +0 -0
- package/templates/artpacks/kCz/snake_1080px.webp +0 -0
- package/templates/artpacks/kCz/snake_1920px.webp +0 -0
- package/templates/artpacks/kCz/snake_600px.webp +0 -0
- package/templates/artpacks/kCz/toxicshock_1080px.webp +0 -0
- package/templates/artpacks/kCz/toxicshock_1920px.webp +0 -0
- package/templates/artpacks/kCz/toxicshock_600px.webp +0 -0
- package/templates/artpacks/kCz/tractstack_1080px.webp +0 -0
- package/templates/artpacks/kCz/tractstack_1920px.webp +0 -0
- package/templates/artpacks/kCz/tractstack_600px.webp +0 -0
- package/templates/artpacks/kCz/tripdrips_1080px.webp +0 -0
- package/templates/artpacks/kCz/tripdrips_1920px.webp +0 -0
- package/templates/artpacks/kCz/tripdrips_600px.webp +0 -0
- package/templates/artpacks/kCz/wavedrips_1080px.webp +0 -0
- package/templates/artpacks/kCz/wavedrips_1920px.webp +0 -0
- package/templates/artpacks/kCz/wavedrips_600px.webp +0 -0
- package/templates/artpacks/t8k/beach_1080px.webp +0 -0
- package/templates/artpacks/t8k/beach_1920px.webp +0 -0
- package/templates/artpacks/t8k/beach_600px.webp +0 -0
- package/templates/artpacks/t8k/blast_1080px.webp +0 -0
- package/templates/artpacks/t8k/blast_1920px.webp +0 -0
- package/templates/artpacks/t8k/blast_600px.webp +0 -0
- package/templates/artpacks/t8k/bokeh_1080px.webp +0 -0
- package/templates/artpacks/t8k/bokeh_1920px.webp +0 -0
- package/templates/artpacks/t8k/bokeh_600px.webp +0 -0
- package/templates/artpacks/t8k/cartoon_1080px.webp +0 -0
- package/templates/artpacks/t8k/cartoon_1920px.webp +0 -0
- package/templates/artpacks/t8k/cartoon_600px.webp +0 -0
- package/templates/artpacks/t8k/darkeggshell_1080px.webp +0 -0
- package/templates/artpacks/t8k/darkeggshell_1920px.webp +0 -0
- package/templates/artpacks/t8k/darkeggshell_600px.webp +0 -0
- package/templates/artpacks/t8k/explosion_1080px.webp +0 -0
- package/templates/artpacks/t8k/explosion_1920px.webp +0 -0
- package/templates/artpacks/t8k/explosion_600px.webp +0 -0
- package/templates/artpacks/t8k/floral_1080px.webp +0 -0
- package/templates/artpacks/t8k/floral_1920px.webp +0 -0
- package/templates/artpacks/t8k/floral_600px.webp +0 -0
- package/templates/artpacks/t8k/flower_1080px.webp +0 -0
- package/templates/artpacks/t8k/flower_1920px.webp +0 -0
- package/templates/artpacks/t8k/flower_600px.webp +0 -0
- package/templates/artpacks/t8k/foliage_1080px.webp +0 -0
- package/templates/artpacks/t8k/foliage_1920px.webp +0 -0
- package/templates/artpacks/t8k/foliage_600px.webp +0 -0
- package/templates/artpacks/t8k/mist_1080px.webp +0 -0
- package/templates/artpacks/t8k/mist_1920px.webp +0 -0
- package/templates/artpacks/t8k/mist_600px.webp +0 -0
- package/templates/artpacks/t8k/portal_1080px.webp +0 -0
- package/templates/artpacks/t8k/portal_1920px.webp +0 -0
- package/templates/artpacks/t8k/portal_600px.webp +0 -0
- package/templates/artpacks/t8k/storytime_1080px.webp +0 -0
- package/templates/artpacks/t8k/storytime_1920px.webp +0 -0
- package/templates/artpacks/t8k/storytime_600px.webp +0 -0
- package/templates/artpacks/t8k/tacky_1080px.webp +0 -0
- package/templates/artpacks/t8k/tacky_1920px.webp +0 -0
- package/templates/artpacks/t8k/tacky_600px.webp +0 -0
- package/templates/artpacks/t8k/wallpaper_1080px.webp +0 -0
- package/templates/artpacks/t8k/wallpaper_1920px.webp +0 -0
- package/templates/artpacks/t8k/wallpaper_600px.webp +0 -0
- package/templates/brand/favicon.ico +0 -0
- package/templates/brand/logo.svg +19 -0
- package/templates/brand/static.jpg +0 -0
- package/templates/brand/wordmark.svg +4 -0
- package/templates/css/custom.css +51 -0
- package/templates/css/frontend.css +3519 -0
- package/templates/css/storykeep.css +92872 -0
- package/templates/custom/minimal/CodeHook.astro +53 -0
- package/templates/custom/minimal/CustomRoutes.astro +46 -0
- package/templates/custom/with-examples/CodeHook.astro +49 -0
- package/templates/custom/with-examples/CustomHero.astro +13 -0
- package/templates/custom/with-examples/CustomRoutes.astro +39 -0
- package/templates/custom/with-examples/pages/Collections.astro +110 -0
- package/templates/env.example +8 -0
- package/templates/fonts/Inter-Black.woff2 +0 -0
- package/templates/fonts/Inter-Bold.woff2 +0 -0
- package/templates/fonts/Inter-Regular.woff2 +0 -0
- package/templates/icons/h2.svg +1 -0
- package/templates/icons/h3.svg +1 -0
- package/templates/icons/h4.svg +1 -0
- package/templates/icons/h5.svg +1 -0
- package/templates/icons/image.svg +7 -0
- package/templates/icons/text.svg +6 -0
- package/templates/socials/codepen.svg +1 -0
- package/templates/socials/discord.svg +1 -0
- package/templates/socials/facebook.svg +1 -0
- package/templates/socials/github.svg +1 -0
- package/templates/socials/instagram.svg +1 -0
- package/templates/socials/linkedin.svg +1 -0
- package/templates/socials/mail.svg +1 -0
- package/templates/socials/rumble.svg +1 -0
- package/templates/socials/tiktok.svg +1 -0
- package/templates/socials/twitch.svg +1 -0
- package/templates/socials/twitter.svg +1 -0
- package/templates/socials/x.svg +1 -0
- package/templates/socials/youtube.svg +1 -0
- package/templates/src/client/analytics-events.ts +213 -0
- package/templates/src/client/belief-events.ts +205 -0
- package/templates/src/client/sse.ts +667 -0
- package/templates/src/components/Footer.astro +246 -0
- package/templates/src/components/Fragment.astro +70 -0
- package/templates/src/components/Header.astro +458 -0
- package/templates/src/components/Menu.tsx +196 -0
- package/templates/src/components/codehooks/BunnyVideoSetup.tsx +692 -0
- package/templates/src/components/codehooks/BunnyVideoWrapper.astro +78 -0
- package/templates/src/components/codehooks/EpinetDurationSelector.tsx +1020 -0
- package/templates/src/components/codehooks/EpinetTableView.tsx +594 -0
- package/templates/src/components/codehooks/EpinetWrapper.tsx +424 -0
- package/templates/src/components/codehooks/FeaturedContent.astro +273 -0
- package/templates/src/components/codehooks/FeaturedContentSetup.tsx +738 -0
- package/templates/src/components/codehooks/ListContent.astro +460 -0
- package/templates/src/components/codehooks/ListContentSetup.tsx +649 -0
- package/templates/src/components/codehooks/SankeyDiagram.tsx +359 -0
- package/templates/src/components/compositor/Compositor.tsx +144 -0
- package/templates/src/components/compositor/Node.tsx +415 -0
- package/templates/src/components/compositor/NodeWithGuid.tsx +25 -0
- package/templates/src/components/compositor/PanelVisibilityWrapper.tsx +87 -0
- package/templates/src/components/compositor/elements/Belief.tsx +148 -0
- package/templates/src/components/compositor/elements/BgImage.tsx +118 -0
- package/templates/src/components/compositor/elements/BgVisualBreak.tsx +102 -0
- package/templates/src/components/compositor/elements/BunnyVideo.tsx +63 -0
- package/templates/src/components/compositor/elements/IdentifyAs.tsx +66 -0
- package/templates/src/components/compositor/elements/PlayButton.tsx +19 -0
- package/templates/src/components/compositor/elements/SignUp.tsx +179 -0
- package/templates/src/components/compositor/elements/Svg.tsx +33 -0
- package/templates/src/components/compositor/elements/ToggleBelief.tsx +36 -0
- package/templates/src/components/compositor/elements/YouTubeWrapper.tsx +33 -0
- package/templates/src/components/compositor/nodes/BgPaneWrapper.tsx +35 -0
- package/templates/src/components/compositor/nodes/GhostInsertBlock.tsx +189 -0
- package/templates/src/components/compositor/nodes/Markdown.tsx +179 -0
- package/templates/src/components/compositor/nodes/Pane.tsx +277 -0
- package/templates/src/components/compositor/nodes/Pane_eraser.tsx +69 -0
- package/templates/src/components/compositor/nodes/Pane_layout.tsx +77 -0
- package/templates/src/components/compositor/nodes/RenderChildren.tsx +19 -0
- package/templates/src/components/compositor/nodes/StoryFragment.tsx +35 -0
- package/templates/src/components/compositor/nodes/TagElement.tsx +14 -0
- package/templates/src/components/compositor/nodes/Widget.tsx +115 -0
- package/templates/src/components/compositor/nodes/tagElements/NodeA.tsx +4 -0
- package/templates/src/components/compositor/nodes/tagElements/NodeA_eraser.tsx +26 -0
- package/templates/src/components/compositor/nodes/tagElements/NodeAnchorComponent.tsx +248 -0
- package/templates/src/components/compositor/nodes/tagElements/NodeBasicTag.tsx +684 -0
- package/templates/src/components/compositor/nodes/tagElements/NodeBasicTag_eraser.tsx +62 -0
- package/templates/src/components/compositor/nodes/tagElements/NodeBasicTag_insert.tsx +120 -0
- package/templates/src/components/compositor/nodes/tagElements/NodeBasicTag_settings.tsx +62 -0
- package/templates/src/components/compositor/nodes/tagElements/NodeButton.tsx +5 -0
- package/templates/src/components/compositor/nodes/tagElements/NodeButton_eraser.tsx +26 -0
- package/templates/src/components/compositor/nodes/tagElements/NodeImg.tsx +28 -0
- package/templates/src/components/compositor/nodes/tagElements/NodeText.tsx +18 -0
- package/templates/src/components/compositor/nodes/tagElements/TabIndicator.tsx +51 -0
- package/templates/src/components/compositor/preview/FeaturedContentPreview.tsx +128 -0
- package/templates/src/components/compositor/preview/ListContentPreview.tsx +213 -0
- package/templates/src/components/compositor/preview/OgImagePreview.tsx +223 -0
- package/templates/src/components/compositor/preview/PaneSnapshotGenerator.tsx +199 -0
- package/templates/src/components/compositor/preview/PanesPreviewGenerator.tsx +123 -0
- package/templates/src/components/compositor/preview/VisualBreakPreview.tsx +154 -0
- package/templates/src/components/edit/Header.tsx +181 -0
- package/templates/src/components/edit/PanelSwitch.tsx +446 -0
- package/templates/src/components/edit/SettingsPanel.tsx +70 -0
- package/templates/src/components/edit/ToolBar.tsx +101 -0
- package/templates/src/components/edit/ToolMode.tsx +121 -0
- package/templates/src/components/edit/context/ContextPaneConfig.tsx +91 -0
- package/templates/src/components/edit/context/ContextPaneConfig_slug.tsx +174 -0
- package/templates/src/components/edit/context/ContextPaneConfig_title.tsx +186 -0
- package/templates/src/components/edit/pane/AddPanePanel.tsx +136 -0
- package/templates/src/components/edit/pane/AddPanePanel_break.tsx +470 -0
- package/templates/src/components/edit/pane/AddPanePanel_codehook.tsx +264 -0
- package/templates/src/components/edit/pane/AddPanePanel_new.tsx +623 -0
- package/templates/src/components/edit/pane/AddPanePanel_newAICopy.tsx +107 -0
- package/templates/src/components/edit/pane/AddPanePanel_newAICopy_modal.tsx +217 -0
- package/templates/src/components/edit/pane/AddPanePanel_newCopyMode.tsx +109 -0
- package/templates/src/components/edit/pane/AddPanePanel_newCustomCopy.tsx +39 -0
- package/templates/src/components/edit/pane/AddPanePanel_reuse.tsx +445 -0
- package/templates/src/components/edit/pane/ConfigPanePanel.tsx +245 -0
- package/templates/src/components/edit/pane/PageGen.tsx +485 -0
- package/templates/src/components/edit/pane/PageGenSelector.tsx +238 -0
- package/templates/src/components/edit/pane/PageGenSpecial.tsx +362 -0
- package/templates/src/components/edit/pane/PageGen_preview.tsx +495 -0
- package/templates/src/components/edit/pane/PanePanel_impression.tsx +258 -0
- package/templates/src/components/edit/pane/PanePanel_path.tsx +268 -0
- package/templates/src/components/edit/pane/PanePanel_slug.tsx +219 -0
- package/templates/src/components/edit/pane/PanePanel_title.tsx +142 -0
- package/templates/src/components/edit/panels/StyleBreakPanel.tsx +182 -0
- package/templates/src/components/edit/panels/StyleCodeHookPanel.tsx +439 -0
- package/templates/src/components/edit/panels/StyleElementPanel.tsx +177 -0
- package/templates/src/components/edit/panels/StyleElementPanel_add.tsx +349 -0
- package/templates/src/components/edit/panels/StyleElementPanel_remove.tsx +159 -0
- package/templates/src/components/edit/panels/StyleElementPanel_update.tsx +320 -0
- package/templates/src/components/edit/panels/StyleImagePanel.tsx +460 -0
- package/templates/src/components/edit/panels/StyleImagePanel_add.tsx +296 -0
- package/templates/src/components/edit/panels/StyleImagePanel_remove.tsx +153 -0
- package/templates/src/components/edit/panels/StyleImagePanel_update.tsx +312 -0
- package/templates/src/components/edit/panels/StyleLiElementPanel.tsx +273 -0
- package/templates/src/components/edit/panels/StyleLiElementPanel_add.tsx +301 -0
- package/templates/src/components/edit/panels/StyleLiElementPanel_remove.tsx +132 -0
- package/templates/src/components/edit/panels/StyleLiElementPanel_update.tsx +313 -0
- package/templates/src/components/edit/panels/StyleLinkPanel.tsx +346 -0
- package/templates/src/components/edit/panels/StyleLinkPanel_add.tsx +265 -0
- package/templates/src/components/edit/panels/StyleLinkPanel_config.tsx +240 -0
- package/templates/src/components/edit/panels/StyleLinkPanel_remove.tsx +94 -0
- package/templates/src/components/edit/panels/StyleLinkPanel_update.tsx +110 -0
- package/templates/src/components/edit/panels/StyleParentPanel.tsx +263 -0
- package/templates/src/components/edit/panels/StyleParentPanel_add.tsx +275 -0
- package/templates/src/components/edit/panels/StyleParentPanel_deleteLayer.tsx +112 -0
- package/templates/src/components/edit/panels/StyleParentPanel_remove.tsx +87 -0
- package/templates/src/components/edit/panels/StyleParentPanel_update.tsx +141 -0
- package/templates/src/components/edit/panels/StyleWidgetPanel.tsx +428 -0
- package/templates/src/components/edit/panels/StyleWidgetPanel_add.tsx +292 -0
- package/templates/src/components/edit/panels/StyleWidgetPanel_config.tsx +190 -0
- package/templates/src/components/edit/panels/StyleWidgetPanel_remove.tsx +152 -0
- package/templates/src/components/edit/panels/StyleWidgetPanel_update.tsx +308 -0
- package/templates/src/components/edit/state/SaveModal.tsx +811 -0
- package/templates/src/components/edit/state/StylesMemory.tsx +310 -0
- package/templates/src/components/edit/storyfragment/StoryFragmentConfigPanel.tsx +289 -0
- package/templates/src/components/edit/storyfragment/StoryFragmentPanel_menu.tsx +320 -0
- package/templates/src/components/edit/storyfragment/StoryFragmentPanel_og.tsx +888 -0
- package/templates/src/components/edit/storyfragment/StoryFragmentPanel_slug.tsx +269 -0
- package/templates/src/components/edit/storyfragment/StoryFragmentPanel_title.tsx +190 -0
- package/templates/src/components/edit/widgets/BeliefWidget.tsx +183 -0
- package/templates/src/components/edit/widgets/BunnyWidget.tsx +134 -0
- package/templates/src/components/edit/widgets/IdentifyAsWidget.tsx +193 -0
- package/templates/src/components/edit/widgets/SignupWidget.tsx +177 -0
- package/templates/src/components/edit/widgets/ToggleWidget.tsx +152 -0
- package/templates/src/components/edit/widgets/YouTubeWidget.tsx +65 -0
- package/templates/src/components/fields/ActionBuilderTimeSelector.tsx +353 -0
- package/templates/src/components/fields/ArtpackImage.tsx +480 -0
- package/templates/src/components/fields/BackgroundImage.tsx +530 -0
- package/templates/src/components/fields/BackgroundImageWrapper.tsx +192 -0
- package/templates/src/components/fields/BooleanParam.tsx +67 -0
- package/templates/src/components/fields/BunnyMomentSelector.tsx +56 -0
- package/templates/src/components/fields/ColorPickerCombo.tsx +284 -0
- package/templates/src/components/fields/ImageUpload.tsx +405 -0
- package/templates/src/components/fields/MultiParam.tsx +75 -0
- package/templates/src/components/fields/PaneBreakCollectionSelector.tsx +97 -0
- package/templates/src/components/fields/PaneBreakShapeSelector.tsx +134 -0
- package/templates/src/components/fields/SelectedTailwindClass.tsx +44 -0
- package/templates/src/components/fields/SingleParam.tsx +73 -0
- package/templates/src/components/fields/ViewportComboBox.tsx +252 -0
- package/templates/src/components/form/ActionBuilderField.tsx +282 -0
- package/templates/src/components/form/ActionBuilderSlugSelector.tsx +182 -0
- package/templates/src/components/form/BooleanToggle.tsx +94 -0
- package/templates/src/components/form/ColorPicker.tsx +153 -0
- package/templates/src/components/form/DateTimeInput.tsx +638 -0
- package/templates/src/components/form/EnumSelect.tsx +88 -0
- package/templates/src/components/form/FileUpload.tsx +465 -0
- package/templates/src/components/form/MagicPathBuilder.tsx +546 -0
- package/templates/src/components/form/NumberInput.tsx +101 -0
- package/templates/src/components/form/ParagraphArrayInput.tsx +207 -0
- package/templates/src/components/form/StringArrayInput.tsx +163 -0
- package/templates/src/components/form/StringInput.tsx +88 -0
- package/templates/src/components/form/UnsavedChangesBar.tsx +295 -0
- package/templates/src/components/form/advanced/APIConfigSection.tsx +69 -0
- package/templates/src/components/form/advanced/AuthConfigSection.tsx +97 -0
- package/templates/src/components/form/brand/BrandAssetsSection.tsx +93 -0
- package/templates/src/components/form/brand/BrandColorsSection.tsx +201 -0
- package/templates/src/components/form/brand/SEOSection.tsx +101 -0
- package/templates/src/components/form/brand/SiteConfigSection.tsx +61 -0
- package/templates/src/components/form/brand/SocialLinksSection.tsx +393 -0
- package/templates/src/components/profile/ProfileConsent.tsx +65 -0
- package/templates/src/components/profile/ProfileCreate.tsx +462 -0
- package/templates/src/components/profile/ProfileEdit.tsx +409 -0
- package/templates/src/components/profile/ProfileSwitch.tsx +255 -0
- package/templates/src/components/profile/ProfileUnlock.tsx +221 -0
- package/templates/src/components/storykeep/Dashboard.tsx +160 -0
- package/templates/src/components/storykeep/Dashboard_Activity.tsx +56 -0
- package/templates/src/components/storykeep/Dashboard_Advanced.tsx +165 -0
- package/templates/src/components/storykeep/Dashboard_Analytics.tsx +451 -0
- package/templates/src/components/storykeep/Dashboard_Branding.tsx +95 -0
- package/templates/src/components/storykeep/Dashboard_Content.tsx +191 -0
- package/templates/src/components/storykeep/controls/UsageCell.tsx +71 -0
- package/templates/src/components/storykeep/controls/content/BeliefForm.tsx +378 -0
- package/templates/src/components/storykeep/controls/content/BeliefTable.tsx +329 -0
- package/templates/src/components/storykeep/controls/content/ContentBrowser.tsx +385 -0
- package/templates/src/components/storykeep/controls/content/ContentSummary.tsx +149 -0
- package/templates/src/components/storykeep/controls/content/KnownResourceForm.tsx +397 -0
- package/templates/src/components/storykeep/controls/content/KnownResourceTable.tsx +260 -0
- package/templates/src/components/storykeep/controls/content/ManageContent.tsx +439 -0
- package/templates/src/components/storykeep/controls/content/MenuForm.tsx +239 -0
- package/templates/src/components/storykeep/controls/content/MenuTable.tsx +332 -0
- package/templates/src/components/storykeep/controls/content/ResourceBulkIngest.tsx +724 -0
- package/templates/src/components/storykeep/controls/content/ResourceForm.tsx +355 -0
- package/templates/src/components/storykeep/controls/content/ResourceTable.tsx +222 -0
- package/templates/src/components/storykeep/controls/content/StoryFragmentTable.tsx +482 -0
- package/templates/src/components/storykeep/state/BrandingWrapper.tsx +42 -0
- package/templates/src/components/storykeep/state/FetchAnalytics.tsx +350 -0
- package/templates/src/components/storykeep/widgets/ResponsiveLine.tsx +319 -0
- package/templates/src/components/storykeep/widgets/Wizard.tsx +278 -0
- package/templates/src/components/tenant/RegistrationForm.tsx +447 -0
- package/templates/src/components/widgets/BunnyVideoHero.astro +775 -0
- package/templates/src/components/widgets/Impression.tsx +102 -0
- package/templates/src/components/widgets/ImpressionWrapper.tsx +214 -0
- package/templates/src/constants/beliefs.ts +61 -0
- package/templates/src/constants/brandThemes.ts +133 -0
- package/templates/src/constants/prompts.json +55 -0
- package/templates/src/constants/shapes.ts +556 -0
- package/templates/src/constants/stopWords.ts +116 -0
- package/templates/src/constants/tailwindColors.json +344 -0
- package/templates/src/constants.ts +274 -0
- package/templates/src/hooks/useFormState.ts +203 -0
- package/templates/src/layouts/Layout.astro +290 -0
- package/templates/src/lib/session.ts +126 -0
- package/templates/src/lib/storyData.ts +56 -0
- package/templates/src/middleware.ts +52 -0
- package/templates/src/pages/404.astro +54 -0
- package/templates/src/pages/[...slug]/edit.astro +216 -0
- package/templates/src/pages/[...slug].astro +148 -0
- package/templates/src/pages/api/auth/decode.ts +101 -0
- package/templates/src/pages/api/auth/login.ts +122 -0
- package/templates/src/pages/api/auth/logout.ts +37 -0
- package/templates/src/pages/api/auth/profile.ts +76 -0
- package/templates/src/pages/api/orphan-analysis.ts +106 -0
- package/templates/src/pages/api/tailwind.ts +116 -0
- package/templates/src/pages/collections/[param1].astro +65 -0
- package/templates/src/pages/context/[...contextSlug]/edit.astro +207 -0
- package/templates/src/pages/context/[...contextSlug].astro +161 -0
- package/templates/src/pages/llms.txt.ts +122 -0
- package/templates/src/pages/maint.astro +183 -0
- package/templates/src/pages/media/[...slug].astro +67 -0
- package/templates/src/pages/robots.txt.ts +36 -0
- package/templates/src/pages/sandbox/activate.astro +258 -0
- package/templates/src/pages/sandbox/register.astro +44 -0
- package/templates/src/pages/sandbox/success.astro +179 -0
- package/templates/src/pages/sitemap.xml.ts +119 -0
- package/templates/src/pages/storykeep/advanced.astro +69 -0
- package/templates/src/pages/storykeep/branding.astro +57 -0
- package/templates/src/pages/storykeep/content.astro +71 -0
- package/templates/src/pages/storykeep/init.astro +36 -0
- package/templates/src/pages/storykeep/login.astro +266 -0
- package/templates/src/pages/storykeep/logout.astro +84 -0
- package/templates/src/pages/storykeep/profile.astro +98 -0
- package/templates/src/pages/storykeep.astro +81 -0
- package/templates/src/stores/analytics.ts +171 -0
- package/templates/src/stores/backend.ts +16 -0
- package/templates/src/stores/navigation.ts +149 -0
- package/templates/src/stores/nodes.ts +2390 -0
- package/templates/src/stores/nodesHistory.ts +85 -0
- package/templates/src/stores/notificationSystem.ts +41 -0
- package/templates/src/stores/orphanAnalysis.ts +409 -0
- package/templates/src/stores/storykeep.ts +247 -0
- package/templates/src/types/astro.ts +86 -0
- package/templates/src/types/compositorTypes.ts +456 -0
- package/templates/src/types/formTypes.ts +281 -0
- package/templates/src/types/multiTenant.ts +77 -0
- package/templates/src/types/nodeProps.ts +66 -0
- package/templates/src/types/tractstack.ts +445 -0
- package/templates/src/utils/aai/getTitleSlug.ts +72 -0
- package/templates/src/utils/actions/actionButton.ts +101 -0
- package/templates/src/utils/actions/lispLexer.ts +57 -0
- package/templates/src/utils/actions/preParse_Action.ts +85 -0
- package/templates/src/utils/actions/preParse_Bunny.ts +50 -0
- package/templates/src/utils/actions/preParse_Clicked.ts +87 -0
- package/templates/src/utils/actions/preParse_Impression.ts +71 -0
- package/templates/src/utils/api/advancedConfig.ts +66 -0
- package/templates/src/utils/api/advancedHelpers.ts +134 -0
- package/templates/src/utils/api/beliefConfig.ts +87 -0
- package/templates/src/utils/api/beliefHelpers.ts +196 -0
- package/templates/src/utils/api/brandConfig.ts +126 -0
- package/templates/src/utils/api/brandHelpers.ts +155 -0
- package/templates/src/utils/api/fileHelpers.ts +306 -0
- package/templates/src/utils/api/menuConfig.ts +57 -0
- package/templates/src/utils/api/menuHelpers.ts +156 -0
- package/templates/src/utils/api/resourceConfig.ts +158 -0
- package/templates/src/utils/api/resourceHelpers.ts +72 -0
- package/templates/src/utils/api/tenantConfig.ts +97 -0
- package/templates/src/utils/api/tenantHelpers.ts +172 -0
- package/templates/src/utils/api.ts +183 -0
- package/templates/src/utils/auth.ts +150 -0
- package/templates/src/utils/backend.ts +243 -0
- package/templates/src/utils/compositor/TemplateMarkdowns.ts +118 -0
- package/templates/src/utils/compositor/TemplateNodes.ts +138 -0
- package/templates/src/utils/compositor/TemplatePanes.ts +100 -0
- package/templates/src/utils/compositor/allowInsert.ts +100 -0
- package/templates/src/utils/compositor/domHelpers.ts +37 -0
- package/templates/src/utils/compositor/handleClickEvent.ts +131 -0
- package/templates/src/utils/compositor/nodesHelper.ts +491 -0
- package/templates/src/utils/compositor/nodesMarkdownGenerator.ts +292 -0
- package/templates/src/utils/compositor/processMarkdown.ts +431 -0
- package/templates/src/utils/compositor/reduceNodesClassNames.ts +192 -0
- package/templates/src/utils/compositor/tailwindClasses.ts +1795 -0
- package/templates/src/utils/compositor/tailwindColors.ts +227 -0
- package/templates/src/utils/compositor/templateMarkdownStyles.ts +1265 -0
- package/templates/src/utils/compositor/typeGuards.ts +193 -0
- package/templates/src/utils/etl/extractor.ts +119 -0
- package/templates/src/utils/etl/index.ts +88 -0
- package/templates/src/utils/etl/loader.ts +36 -0
- package/templates/src/utils/etl/transformer.ts +286 -0
- package/templates/src/utils/helpers.ts +435 -0
- package/templates/src/utils/layout.ts +209 -0
- package/templates/src/utils/profileStorage.ts +306 -0
- package/templates/src/utils/useInterval.ts +27 -0
- package/templates/tailwind.config.cjs +169 -0
- package/utils/create-resolver.ts +10 -0
- package/utils/inject-files.ts +2140 -0
- package/utils/validate-config.ts +43 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
import Layout from '@/layouts/Layout.astro';
|
|
3
|
+
import RegistrationForm from '@/components/tenant/RegistrationForm';
|
|
4
|
+
import { getBrandConfig } from '@/utils/api/brandConfig';
|
|
5
|
+
import { preHealthCheck } from '@/utils/backend';
|
|
6
|
+
|
|
7
|
+
const tenantId = 'default'; // For registration, always use default
|
|
8
|
+
|
|
9
|
+
const healthCheckRedirect = await preHealthCheck(tenantId);
|
|
10
|
+
if (healthCheckRedirect !== undefined) {
|
|
11
|
+
return healthCheckRedirect;
|
|
12
|
+
}
|
|
13
|
+
// Check if multi-tenant is enabled
|
|
14
|
+
const isMultiTenantEnabled =
|
|
15
|
+
import.meta.env.PUBLIC_ENABLE_MULTI_TENANT === 'true';
|
|
16
|
+
if (!isMultiTenantEnabled) {
|
|
17
|
+
return Astro.redirect('/storykeep?error=multi-tenant-disabled');
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const brandConfig = await getBrandConfig('default');
|
|
21
|
+
const title = 'Register New Tenant | TractStack';
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
<Layout title={title} slug="sandbox-register" brandConfig={brandConfig}>
|
|
25
|
+
<main id="main-content" class="min-h-screen bg-gray-50">
|
|
26
|
+
<div class="py-12">
|
|
27
|
+
<RegistrationForm
|
|
28
|
+
client:load
|
|
29
|
+
onSuccess={(tenantId) => {
|
|
30
|
+
if (tenantId)
|
|
31
|
+
window.location.href = `/sandbox/success?tenant=${encodeURIComponent(tenantId)}`;
|
|
32
|
+
}}
|
|
33
|
+
onCapacityFull={() => {
|
|
34
|
+
window.location.href = '/sandbox/capacity-full';
|
|
35
|
+
}}
|
|
36
|
+
/>
|
|
37
|
+
</div>
|
|
38
|
+
</main>
|
|
39
|
+
</Layout>
|
|
40
|
+
|
|
41
|
+
<script>
|
|
42
|
+
// Add any additional client-side logic here if needed
|
|
43
|
+
console.log('Tenant registration page loaded');
|
|
44
|
+
</script>
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
---
|
|
2
|
+
import Layout from '@/layouts/Layout.astro';
|
|
3
|
+
import { getBrandConfig } from '@/utils/api/brandConfig';
|
|
4
|
+
import { preHealthCheck } from '@/utils/backend';
|
|
5
|
+
|
|
6
|
+
// Get tenant ID from URL params
|
|
7
|
+
const url = new URL(Astro.request.url);
|
|
8
|
+
const tenantId = url.searchParams.get('tenant');
|
|
9
|
+
|
|
10
|
+
const healthCheckRedirect = await preHealthCheck(tenantId || `default`);
|
|
11
|
+
if (healthCheckRedirect !== undefined) {
|
|
12
|
+
return healthCheckRedirect;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// Check if multi-tenant is enabled
|
|
16
|
+
const isMultiTenantEnabled =
|
|
17
|
+
import.meta.env.PUBLIC_ENABLE_MULTI_TENANT === 'true';
|
|
18
|
+
if (!isMultiTenantEnabled) {
|
|
19
|
+
return Astro.redirect('/?error=multi-tenant-disabled');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (!tenantId) {
|
|
23
|
+
return Astro.redirect('/sandbox/register?error=missing-tenant-id');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Get backend URL
|
|
27
|
+
const brandConfig = await getBrandConfig('default');
|
|
28
|
+
const title = 'Registration Successful | TractStack';
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
<Layout title={title} slug="tenant-success" brandConfig={brandConfig}>
|
|
32
|
+
<main
|
|
33
|
+
id="main-content"
|
|
34
|
+
class="flex min-h-screen items-center justify-center bg-gray-50"
|
|
35
|
+
>
|
|
36
|
+
<div class="mx-auto max-w-2xl p-6">
|
|
37
|
+
<div class="rounded-lg bg-white p-8 text-center shadow-lg">
|
|
38
|
+
<div
|
|
39
|
+
class="mx-auto mb-6 flex h-16 w-16 items-center justify-center rounded-full bg-orange-100"
|
|
40
|
+
>
|
|
41
|
+
<svg
|
|
42
|
+
class="h-8 w-8 text-orange-600"
|
|
43
|
+
fill="none"
|
|
44
|
+
stroke="currentColor"
|
|
45
|
+
viewBox="0 0 24 24"
|
|
46
|
+
>
|
|
47
|
+
<path
|
|
48
|
+
stroke-linecap="round"
|
|
49
|
+
stroke-linejoin="round"
|
|
50
|
+
stroke-width="2"
|
|
51
|
+
d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"
|
|
52
|
+
></path>
|
|
53
|
+
</svg>
|
|
54
|
+
</div>
|
|
55
|
+
|
|
56
|
+
<h2 class="mb-4 text-2xl font-bold text-gray-900">
|
|
57
|
+
📧 Check Your Email
|
|
58
|
+
</h2>
|
|
59
|
+
|
|
60
|
+
<p class="mb-6 text-gray-600">
|
|
61
|
+
Your tenant <strong class="font-mono text-orange-600"
|
|
62
|
+
>{tenantId}</strong
|
|
63
|
+
> has been created successfully!
|
|
64
|
+
</p>
|
|
65
|
+
|
|
66
|
+
<div class="mb-6 rounded-lg border border-orange-200 bg-orange-50 p-6">
|
|
67
|
+
<h3 class="mb-3 text-lg font-bold text-orange-800">
|
|
68
|
+
What happens next:
|
|
69
|
+
</h3>
|
|
70
|
+
<div class="space-y-3 text-left">
|
|
71
|
+
<div class="flex items-start space-x-3">
|
|
72
|
+
<div
|
|
73
|
+
class="mt-0.5 flex h-6 w-6 items-center justify-center rounded-full bg-orange-600 text-sm font-bold text-white"
|
|
74
|
+
>
|
|
75
|
+
1
|
|
76
|
+
</div>
|
|
77
|
+
<div>
|
|
78
|
+
<p class="font-bold text-orange-800">Check your email inbox</p>
|
|
79
|
+
<p class="text-sm text-orange-600">
|
|
80
|
+
We've sent an activation link to complete setup
|
|
81
|
+
</p>
|
|
82
|
+
</div>
|
|
83
|
+
</div>
|
|
84
|
+
|
|
85
|
+
<div class="flex items-start space-x-3">
|
|
86
|
+
<div
|
|
87
|
+
class="mt-0.5 flex h-6 w-6 items-center justify-center rounded-full bg-orange-600 text-sm font-bold text-white"
|
|
88
|
+
>
|
|
89
|
+
2
|
|
90
|
+
</div>
|
|
91
|
+
<div>
|
|
92
|
+
<p class="font-bold text-orange-800">
|
|
93
|
+
Click the activation link
|
|
94
|
+
</p>
|
|
95
|
+
<p class="text-sm text-orange-600">
|
|
96
|
+
This will finalize your tenant setup
|
|
97
|
+
</p>
|
|
98
|
+
</div>
|
|
99
|
+
</div>
|
|
100
|
+
|
|
101
|
+
<div class="flex items-start space-x-3">
|
|
102
|
+
<div
|
|
103
|
+
class="mt-0.5 flex h-6 w-6 items-center justify-center rounded-full bg-orange-600 text-sm font-bold text-white"
|
|
104
|
+
>
|
|
105
|
+
3
|
|
106
|
+
</div>
|
|
107
|
+
<div>
|
|
108
|
+
<p class="font-bold text-orange-800">Access your dashboard</p>
|
|
109
|
+
<p class="text-sm text-orange-600">
|
|
110
|
+
Visit <strong class="font-mono"
|
|
111
|
+
>{tenantId}.sandbox.freewebpress.com</strong
|
|
112
|
+
>
|
|
113
|
+
</p>
|
|
114
|
+
</div>
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
</div>
|
|
118
|
+
|
|
119
|
+
<div class="mb-6 rounded-lg border border-yellow-200 bg-yellow-50 p-4">
|
|
120
|
+
<p class="text-sm text-yellow-800">
|
|
121
|
+
<strong>⏰ Important:</strong> The activation link will expire in 48
|
|
122
|
+
hours. If you don't see the email, check your spam folder.
|
|
123
|
+
</p>
|
|
124
|
+
</div>
|
|
125
|
+
|
|
126
|
+
<div class="space-y-4">
|
|
127
|
+
<div class="text-center">
|
|
128
|
+
<p class="mb-4 text-sm text-gray-500">
|
|
129
|
+
Once activated, your tenant URL will be:
|
|
130
|
+
</p>
|
|
131
|
+
<p
|
|
132
|
+
class="break-all rounded border bg-gray-100 p-3 font-mono text-lg"
|
|
133
|
+
>
|
|
134
|
+
https://{tenantId}.sandbox.freewebpress.com
|
|
135
|
+
</p>
|
|
136
|
+
</div>
|
|
137
|
+
|
|
138
|
+
<div class="flex flex-col justify-center gap-4 sm:flex-row">
|
|
139
|
+
<a
|
|
140
|
+
href="/sandbox/register"
|
|
141
|
+
class="rounded-lg border border-gray-300 px-6 py-2 text-gray-700 transition-colors hover:bg-gray-50"
|
|
142
|
+
>
|
|
143
|
+
Register Another Tenant
|
|
144
|
+
</a>
|
|
145
|
+
|
|
146
|
+
<a
|
|
147
|
+
href="https://docs.tractstack.com"
|
|
148
|
+
class="rounded-lg bg-orange-600 px-6 py-2 text-white transition-colors hover:bg-orange-700"
|
|
149
|
+
target="_blank"
|
|
150
|
+
rel="noopener noreferrer"
|
|
151
|
+
>
|
|
152
|
+
View Documentation
|
|
153
|
+
</a>
|
|
154
|
+
</div>
|
|
155
|
+
|
|
156
|
+
<div class="border-t pt-4 text-center">
|
|
157
|
+
<p class="text-sm text-gray-500">
|
|
158
|
+
Need help?
|
|
159
|
+
<a
|
|
160
|
+
href="mailto:support@tractstack.com"
|
|
161
|
+
class="text-orange-600 underline hover:text-orange-800"
|
|
162
|
+
>
|
|
163
|
+
Contact Support
|
|
164
|
+
</a>
|
|
165
|
+
</p>
|
|
166
|
+
</div>
|
|
167
|
+
</div>
|
|
168
|
+
</div>
|
|
169
|
+
</div>
|
|
170
|
+
</main>
|
|
171
|
+
</Layout>
|
|
172
|
+
|
|
173
|
+
<script>
|
|
174
|
+
// Add email resend functionality (placeholder for future implementation)
|
|
175
|
+
console.log(
|
|
176
|
+
'Registration success page loaded for tenant:',
|
|
177
|
+
document.querySelector('[data-tenant-id]')?.textContent
|
|
178
|
+
);
|
|
179
|
+
</script>
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import type { APIRoute } from '@/types/astro';
|
|
2
|
+
import { getBrandConfig } from '@/utils/api/brandConfig';
|
|
3
|
+
|
|
4
|
+
// Helper functions for date formatting
|
|
5
|
+
function dateToUnixTimestamp(dateString: string): number {
|
|
6
|
+
return new Date(dateString).getTime();
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function formatDateToYYYYMMDD(dateString: string): string {
|
|
10
|
+
const date = new Date(dateString);
|
|
11
|
+
return date.toISOString().split('T')[0];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const GET: APIRoute = async ({ request }) => {
|
|
15
|
+
// Get tenant ID from headers (set by middleware)
|
|
16
|
+
const tenantId = request.headers.get('X-Tenant-ID') || 'default';
|
|
17
|
+
|
|
18
|
+
// Fetch content map and brand config
|
|
19
|
+
const goBackend =
|
|
20
|
+
import.meta.env.PUBLIC_GO_BACKEND || 'http://localhost:8080';
|
|
21
|
+
|
|
22
|
+
let contentMap: any[] = [];
|
|
23
|
+
let brandConfig = null;
|
|
24
|
+
|
|
25
|
+
try {
|
|
26
|
+
// Fetch content map
|
|
27
|
+
const contentResponse = await fetch(
|
|
28
|
+
`${goBackend}/api/v1/content/full-map`,
|
|
29
|
+
{
|
|
30
|
+
headers: {
|
|
31
|
+
'X-Tenant-ID': tenantId,
|
|
32
|
+
},
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
if (contentResponse.ok) {
|
|
37
|
+
const contentData = await contentResponse.json();
|
|
38
|
+
contentMap = contentData.data?.data || [];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Fetch brand config
|
|
42
|
+
brandConfig = await getBrandConfig(tenantId);
|
|
43
|
+
} catch (error) {
|
|
44
|
+
console.error('Error fetching data for sitemap:', error);
|
|
45
|
+
// Continue with empty data rather than failing
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const siteUrl = brandConfig?.SITE_URL || 'https://example.com';
|
|
49
|
+
const homeSlug = brandConfig?.HOME_SLUG || 'home';
|
|
50
|
+
|
|
51
|
+
const xmlTop = `<?xml version="1.0" encoding="UTF-8"?>
|
|
52
|
+
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">`;
|
|
53
|
+
const xmlBottom = `</urlset>`;
|
|
54
|
+
|
|
55
|
+
const entries = contentMap
|
|
56
|
+
.map((c: any) => {
|
|
57
|
+
if (c.type === 'StoryFragment') {
|
|
58
|
+
const thisPriority = c.slug === homeSlug ? '1.0' : '0.8';
|
|
59
|
+
const thisUrl =
|
|
60
|
+
c.slug === homeSlug
|
|
61
|
+
? new URL('/', siteUrl).href
|
|
62
|
+
: new URL(c.slug, siteUrl).href;
|
|
63
|
+
const thisChanged = (c?.changed && dateToUnixTimestamp(c.changed)) || 0;
|
|
64
|
+
const thisCreated = dateToUnixTimestamp(c.created);
|
|
65
|
+
const daysDelta = (thisChanged - thisCreated) / (1000 * 60 * 60 * 24);
|
|
66
|
+
const formatted = formatDateToYYYYMMDD(c.changed || c.created);
|
|
67
|
+
const thisFreq =
|
|
68
|
+
daysDelta < 3
|
|
69
|
+
? 'daily'
|
|
70
|
+
: daysDelta < 10
|
|
71
|
+
? 'weekly'
|
|
72
|
+
: daysDelta < 90
|
|
73
|
+
? 'monthly'
|
|
74
|
+
: 'yearly';
|
|
75
|
+
return `<url><loc>${thisUrl}</loc><lastmod>${formatted}</lastmod><changefreq>${thisFreq}</changefreq><priority>${thisPriority}</priority></url>`;
|
|
76
|
+
}
|
|
77
|
+
if (c.type === 'Pane' && c.isContext) {
|
|
78
|
+
const thisUrl = new URL(`context/${c.slug}`, siteUrl).href;
|
|
79
|
+
const thisChanged = (c?.changed && dateToUnixTimestamp(c.changed)) || 0;
|
|
80
|
+
const thisCreated = dateToUnixTimestamp(c.created);
|
|
81
|
+
const daysDelta = (thisChanged - thisCreated) / (1000 * 60 * 60 * 24);
|
|
82
|
+
const formatted = formatDateToYYYYMMDD(c.changed || c.created);
|
|
83
|
+
const thisFreq =
|
|
84
|
+
daysDelta < 3
|
|
85
|
+
? 'daily'
|
|
86
|
+
: daysDelta < 10
|
|
87
|
+
? 'weekly'
|
|
88
|
+
: daysDelta < 90
|
|
89
|
+
? 'monthly'
|
|
90
|
+
: 'yearly';
|
|
91
|
+
return `<url><loc>${thisUrl}</loc><lastmod>${formatted}</lastmod><changefreq>${thisFreq}</changefreq><priority>0.4</priority></url>`;
|
|
92
|
+
}
|
|
93
|
+
})
|
|
94
|
+
.filter((n) => n);
|
|
95
|
+
|
|
96
|
+
const xmlBody = entries.join('');
|
|
97
|
+
const xml = `${xmlTop}${xmlBody}${xmlBottom}`;
|
|
98
|
+
|
|
99
|
+
return new Response(xml, {
|
|
100
|
+
headers: {
|
|
101
|
+
'Content-Type': 'application/xml; charset=utf-8',
|
|
102
|
+
'Cache-Control': 'public, max-age=3600',
|
|
103
|
+
'X-Content-Type-Options': 'nosniff',
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
export const HEAD: APIRoute = async () => {
|
|
109
|
+
// For HEAD requests, return the same headers but no body
|
|
110
|
+
return new Response(null, {
|
|
111
|
+
headers: {
|
|
112
|
+
'Content-Type': 'application/xml; charset=utf-8',
|
|
113
|
+
'Cache-Control': 'public, max-age=3600',
|
|
114
|
+
'X-Content-Type-Options': 'nosniff',
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
export const prerender = false;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
import Layout from '@/layouts/Layout.astro';
|
|
3
|
+
import StoryKeepDashboard from '@/components/storykeep/Dashboard';
|
|
4
|
+
import StoryKeepDashboard_Advanced from '@/components/storykeep/Dashboard_Advanced';
|
|
5
|
+
import { requireAdminOrEditor, isAuthenticated, isAdmin } from '@/utils/auth';
|
|
6
|
+
import { getFullContentMap } from '@/stores/analytics';
|
|
7
|
+
import { getBrandConfig } from '@/utils/api/brandConfig';
|
|
8
|
+
import { preHealthCheck } from '@/utils/backend';
|
|
9
|
+
|
|
10
|
+
const tenantId =
|
|
11
|
+
Astro.locals.tenant?.id || import.meta.env.PUBLIC_TENANTID || 'default';
|
|
12
|
+
|
|
13
|
+
const healthCheckRedirect = await preHealthCheck(tenantId);
|
|
14
|
+
if (healthCheckRedirect !== undefined) {
|
|
15
|
+
return healthCheckRedirect;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const authCheck = requireAdminOrEditor(Astro);
|
|
19
|
+
if (authCheck) {
|
|
20
|
+
return authCheck;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Additional admin check for Advanced page
|
|
24
|
+
const userIsAdmin = isAdmin(Astro);
|
|
25
|
+
if (!userIsAdmin) {
|
|
26
|
+
return Astro.redirect('/storykeep');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const userIsAuthenticated = isAuthenticated(Astro);
|
|
30
|
+
const role = userIsAdmin ? `admin` : userIsAuthenticated ? `editor` : null;
|
|
31
|
+
|
|
32
|
+
const brandConfig = await getBrandConfig(tenantId);
|
|
33
|
+
const initializing = !brandConfig.SITE_INIT;
|
|
34
|
+
|
|
35
|
+
// Redirect to branding page during initial setup
|
|
36
|
+
if (initializing) {
|
|
37
|
+
return Astro.redirect('/storykeep/branding');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const title = 'Advanced | StoryKeep';
|
|
41
|
+
|
|
42
|
+
let fullContentMap;
|
|
43
|
+
let homeSlug = 'hello';
|
|
44
|
+
|
|
45
|
+
try {
|
|
46
|
+
fullContentMap = await getFullContentMap(tenantId);
|
|
47
|
+
homeSlug = fullContentMap.find((item) => item.isHome)?.slug || 'hello';
|
|
48
|
+
} catch (error) {
|
|
49
|
+
return Astro.redirect(
|
|
50
|
+
`/maint?from=${encodeURIComponent(Astro.url.pathname)}`
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
<Layout title={title} slug="storykeep">
|
|
56
|
+
<main id="main-content" class="min-h-screen w-full">
|
|
57
|
+
<div class="p-8">
|
|
58
|
+
<StoryKeepDashboard
|
|
59
|
+
client:only="react"
|
|
60
|
+
fullContentMap={fullContentMap}
|
|
61
|
+
homeSlug={homeSlug}
|
|
62
|
+
activeTab="advanced"
|
|
63
|
+
role={role}
|
|
64
|
+
initializing={initializing}
|
|
65
|
+
/>
|
|
66
|
+
<StoryKeepDashboard_Advanced client:only="react" />
|
|
67
|
+
</div>
|
|
68
|
+
</main>
|
|
69
|
+
</Layout>
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
import Layout from '@/layouts/Layout.astro';
|
|
3
|
+
import BrandingPageWrapper from '@/components/storykeep/state/BrandingWrapper';
|
|
4
|
+
import { requireAdminOrEditor, isAuthenticated, isAdmin } from '@/utils/auth';
|
|
5
|
+
import { getFullContentMap } from '@/stores/analytics';
|
|
6
|
+
import { getBrandConfig } from '@/utils/api/brandConfig';
|
|
7
|
+
import { preHealthCheck } from '@/utils/backend';
|
|
8
|
+
|
|
9
|
+
const tenantId =
|
|
10
|
+
Astro.locals.tenant?.id || import.meta.env.PUBLIC_TENANTID || 'default';
|
|
11
|
+
|
|
12
|
+
const healthCheckRedirect = await preHealthCheck(tenantId);
|
|
13
|
+
if (healthCheckRedirect !== undefined) {
|
|
14
|
+
return healthCheckRedirect;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const authCheck = requireAdminOrEditor(Astro);
|
|
18
|
+
if (authCheck) {
|
|
19
|
+
return authCheck;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const userIsAuthenticated = isAuthenticated(Astro);
|
|
23
|
+
const userIsAdmin = isAdmin(Astro);
|
|
24
|
+
const role = userIsAdmin ? `admin` : userIsAuthenticated ? `editor` : null;
|
|
25
|
+
|
|
26
|
+
const brandConfig = await getBrandConfig(tenantId);
|
|
27
|
+
const initializing = !brandConfig.SITE_INIT;
|
|
28
|
+
|
|
29
|
+
const title = 'Branding | StoryKeep';
|
|
30
|
+
|
|
31
|
+
let fullContentMap;
|
|
32
|
+
let homeSlug = 'hello';
|
|
33
|
+
|
|
34
|
+
try {
|
|
35
|
+
fullContentMap = await getFullContentMap(tenantId);
|
|
36
|
+
homeSlug = fullContentMap.find((item) => item.isHome)?.slug || 'hello';
|
|
37
|
+
} catch (error) {
|
|
38
|
+
return Astro.redirect(
|
|
39
|
+
`/maint?from=${encodeURIComponent(Astro.url.pathname)}`
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
<Layout title={title} slug="storykeep">
|
|
45
|
+
<main id="main-content" class="min-h-screen w-full">
|
|
46
|
+
<div class="p-8">
|
|
47
|
+
<BrandingPageWrapper
|
|
48
|
+
client:only="react"
|
|
49
|
+
fullContentMap={fullContentMap}
|
|
50
|
+
homeSlug={homeSlug}
|
|
51
|
+
role={role}
|
|
52
|
+
initializing={initializing}
|
|
53
|
+
initialBrandConfig={brandConfig}
|
|
54
|
+
/>
|
|
55
|
+
</div>
|
|
56
|
+
</main>
|
|
57
|
+
</Layout>
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
---
|
|
2
|
+
import Layout from '@/layouts/Layout.astro';
|
|
3
|
+
import StoryKeepDashboard from '@/components/storykeep/Dashboard';
|
|
4
|
+
import StoryKeepDashboard_Content from '@/components/storykeep/Dashboard_Content';
|
|
5
|
+
import { requireAdminOrEditor, isAuthenticated, isAdmin } from '@/utils/auth';
|
|
6
|
+
import { getFullContentMap } from '@/stores/analytics';
|
|
7
|
+
import { getBrandConfig } from '@/utils/api/brandConfig';
|
|
8
|
+
import { preHealthCheck } from '@/utils/backend';
|
|
9
|
+
|
|
10
|
+
const tenantId =
|
|
11
|
+
Astro.locals.tenant?.id || import.meta.env.PUBLIC_TENANTID || 'default';
|
|
12
|
+
|
|
13
|
+
const healthCheckRedirect = await preHealthCheck(tenantId);
|
|
14
|
+
if (healthCheckRedirect !== undefined) {
|
|
15
|
+
return healthCheckRedirect;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const authCheck = requireAdminOrEditor(Astro);
|
|
19
|
+
if (authCheck) {
|
|
20
|
+
return authCheck;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const userIsAuthenticated = isAuthenticated(Astro);
|
|
24
|
+
const userIsAdmin = isAdmin(Astro);
|
|
25
|
+
const role = userIsAdmin ? `admin` : userIsAuthenticated ? `editor` : null;
|
|
26
|
+
|
|
27
|
+
const brandConfig = await getBrandConfig(tenantId);
|
|
28
|
+
const initializing = !brandConfig.SITE_INIT;
|
|
29
|
+
|
|
30
|
+
// Redirect to branding page during initial setup
|
|
31
|
+
if (initializing) {
|
|
32
|
+
return Astro.redirect('/storykeep/branding');
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const title = 'Content | StoryKeep';
|
|
36
|
+
const createMenu = Astro.url.searchParams.has('create-menu');
|
|
37
|
+
|
|
38
|
+
let fullContentMap;
|
|
39
|
+
let homeSlug = 'hello';
|
|
40
|
+
|
|
41
|
+
try {
|
|
42
|
+
fullContentMap = await getFullContentMap(tenantId);
|
|
43
|
+
homeSlug = fullContentMap.find((item) => item.isHome)?.slug || 'hello';
|
|
44
|
+
} catch (error) {
|
|
45
|
+
return Astro.redirect(
|
|
46
|
+
`/maint?from=${encodeURIComponent(Astro.url.pathname)}`
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
<Layout title={title} slug="storykeep">
|
|
52
|
+
<main id="main-content" class="min-h-screen w-full">
|
|
53
|
+
<div class="p-8">
|
|
54
|
+
<StoryKeepDashboard
|
|
55
|
+
client:only="react"
|
|
56
|
+
fullContentMap={fullContentMap}
|
|
57
|
+
homeSlug={homeSlug}
|
|
58
|
+
activeTab="content"
|
|
59
|
+
role={role}
|
|
60
|
+
initializing={initializing}
|
|
61
|
+
/>
|
|
62
|
+
|
|
63
|
+
<StoryKeepDashboard_Content
|
|
64
|
+
client:only="react"
|
|
65
|
+
fullContentMap={fullContentMap}
|
|
66
|
+
homeSlug={homeSlug}
|
|
67
|
+
createMenu={createMenu}
|
|
68
|
+
/>
|
|
69
|
+
</div>
|
|
70
|
+
</main>
|
|
71
|
+
</Layout>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { freshInstallStore } from '@/stores/backend';
|
|
3
|
+
import { preHealthCheck } from '@/utils/backend';
|
|
4
|
+
import RegistrationForm from '@/components/tenant/RegistrationForm';
|
|
5
|
+
|
|
6
|
+
const tenantId =
|
|
7
|
+
Astro.locals.tenant?.id || import.meta.env.PUBLIC_TENANTID || 'default';
|
|
8
|
+
await preHealthCheck(tenantId);
|
|
9
|
+
|
|
10
|
+
const { needsSetup } = freshInstallStore.get();
|
|
11
|
+
|
|
12
|
+
if (!needsSetup) {
|
|
13
|
+
return Astro.redirect('/storykeep');
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const isDev = import.meta.env.DEV;
|
|
17
|
+
const isInitialized = !freshInstallStore.get().needsSetup;
|
|
18
|
+
const cssBasePath = isInitialized ? '/media/css' : '/styles';
|
|
19
|
+
const mainStylesUrl = isDev
|
|
20
|
+
? `${cssBasePath}/storykeep.css`
|
|
21
|
+
: `${cssBasePath}/frontend.css`;
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
<!doctype html>
|
|
25
|
+
<html lang="en" class="h-full bg-gray-50">
|
|
26
|
+
<head>
|
|
27
|
+
<meta charset="UTF-8" />
|
|
28
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
29
|
+
<title>Initialize TractStack</title>
|
|
30
|
+
<link rel="stylesheet" href={`${cssBasePath}/custom.css`} />
|
|
31
|
+
<link rel="stylesheet" href={mainStylesUrl} />
|
|
32
|
+
</head>
|
|
33
|
+
<body class="h-full">
|
|
34
|
+
<RegistrationForm client:load isInitMode={true} />
|
|
35
|
+
</body>
|
|
36
|
+
</html>
|