astro-tractstack 2.0.0-rc.3 → 2.0.0-rc.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +0 -0
- package/README.md +227 -98
- package/astro.d.ts +0 -0
- package/bin/create-tractstack.js +125 -45
- package/dist/index.js +21 -1
- package/package.json +10 -5
- 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 +0 -0
- package/templates/brand/og.png +0 -0
- package/templates/brand/oglogo.png +0 -0
- package/templates/brand/static.jpg +0 -0
- package/templates/brand/wordmark.svg +0 -0
- package/templates/css/custom.css +0 -0
- package/templates/css/frontend.css +1 -3519
- package/templates/css/storykeep.css +0 -0
- package/templates/custom/minimal/CodeHook.astro +7 -6
- package/templates/custom/minimal/CustomRoutes.astro +25 -31
- package/templates/custom/with-examples/CodeHook.astro +7 -6
- package/templates/custom/with-examples/CustomHero.astro +0 -0
- package/templates/custom/with-examples/CustomRoutes.astro +4 -8
- package/templates/custom/with-examples/pages/Collections.astro +58 -98
- package/templates/env.example +0 -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/gitignore +42 -0
- package/templates/icons/h2.svg +0 -0
- package/templates/icons/h3.svg +0 -0
- package/templates/icons/h4.svg +0 -0
- package/templates/icons/h5.svg +0 -0
- package/templates/icons/image.svg +0 -0
- package/templates/icons/text.svg +0 -0
- package/templates/prettierignore +5 -0
- package/templates/prettierrc +19 -0
- package/templates/socials/codepen.svg +0 -0
- package/templates/socials/discord.svg +0 -0
- package/templates/socials/facebook.svg +0 -0
- package/templates/socials/github.svg +0 -0
- package/templates/socials/instagram.svg +0 -0
- package/templates/socials/linkedin.svg +0 -0
- package/templates/socials/mail.svg +0 -0
- package/templates/socials/rumble.svg +0 -0
- package/templates/socials/tiktok.svg +0 -0
- package/templates/socials/twitch.svg +0 -0
- package/templates/socials/twitter.svg +0 -0
- package/templates/socials/x.svg +0 -0
- package/templates/socials/youtube.svg +0 -0
- package/templates/src/client/htmx.min.js +3519 -0
- package/templates/src/components/Footer.astro +1 -1
- package/templates/src/components/Fragment.astro +0 -0
- package/templates/src/components/Header.astro +55 -52
- package/templates/src/components/Menu.tsx +0 -0
- package/templates/src/components/codehooks/BunnyVideoSetup.tsx +0 -0
- package/templates/src/components/codehooks/BunnyVideoWrapper.astro +0 -0
- package/templates/src/components/codehooks/EpinetDurationSelector.tsx +9 -13
- package/templates/src/components/codehooks/EpinetTableView.tsx +11 -7
- package/templates/src/components/codehooks/EpinetWrapper.tsx +0 -0
- package/templates/src/components/codehooks/FeaturedContent.astro +0 -0
- package/templates/src/components/codehooks/FeaturedContentSetup.tsx +0 -0
- package/templates/src/components/codehooks/ListContent.astro +0 -0
- package/templates/src/components/codehooks/ListContentSetup.tsx +0 -0
- package/templates/src/components/codehooks/SankeyDiagram.tsx +4 -3
- package/templates/src/components/compositor/Compositor.tsx +0 -0
- package/templates/src/components/compositor/Node.tsx +1 -1
- package/templates/src/components/compositor/NodeWithGuid.tsx +0 -0
- package/templates/src/components/compositor/PanelVisibilityWrapper.tsx +25 -11
- package/templates/src/components/compositor/elements/Belief.tsx +0 -0
- package/templates/src/components/compositor/elements/BgImage.tsx +0 -0
- package/templates/src/components/compositor/elements/BgVisualBreak.tsx +0 -0
- package/templates/src/components/compositor/elements/BunnyVideo.tsx +0 -0
- package/templates/src/components/compositor/elements/IdentifyAs.tsx +0 -0
- package/templates/src/components/compositor/elements/PlayButton.tsx +0 -0
- package/templates/src/components/compositor/elements/SignUp.tsx +0 -0
- package/templates/src/components/compositor/elements/Svg.tsx +0 -0
- package/templates/src/components/compositor/elements/ToggleBelief.tsx +0 -0
- package/templates/src/components/compositor/elements/YouTubeWrapper.tsx +0 -0
- package/templates/src/components/compositor/nodes/BgPaneWrapper.tsx +0 -0
- package/templates/src/components/compositor/nodes/GhostInsertBlock.tsx +0 -0
- package/templates/src/components/compositor/nodes/Markdown.tsx +0 -0
- package/templates/src/components/compositor/nodes/Pane.tsx +13 -6
- package/templates/src/components/compositor/nodes/Pane_eraser.tsx +0 -0
- package/templates/src/components/compositor/nodes/Pane_layout.tsx +0 -0
- package/templates/src/components/compositor/nodes/RenderChildren.tsx +0 -0
- package/templates/src/components/compositor/nodes/StoryFragment.tsx +0 -0
- package/templates/src/components/compositor/nodes/TagElement.tsx +0 -0
- package/templates/src/components/compositor/nodes/Widget.tsx +0 -0
- package/templates/src/components/compositor/nodes/tagElements/NodeA.tsx +0 -0
- package/templates/src/components/compositor/nodes/tagElements/NodeA_eraser.tsx +0 -0
- package/templates/src/components/compositor/nodes/tagElements/NodeAnchorComponent.tsx +0 -0
- package/templates/src/components/compositor/nodes/tagElements/NodeBasicTag.tsx +0 -0
- package/templates/src/components/compositor/nodes/tagElements/NodeBasicTag_eraser.tsx +0 -0
- package/templates/src/components/compositor/nodes/tagElements/NodeBasicTag_insert.tsx +0 -0
- package/templates/src/components/compositor/nodes/tagElements/NodeBasicTag_settings.tsx +0 -0
- package/templates/src/components/compositor/nodes/tagElements/NodeButton.tsx +0 -0
- package/templates/src/components/compositor/nodes/tagElements/NodeButton_eraser.tsx +0 -0
- package/templates/src/components/compositor/nodes/tagElements/NodeImg.tsx +0 -0
- package/templates/src/components/compositor/nodes/tagElements/NodeText.tsx +0 -0
- package/templates/src/components/compositor/nodes/tagElements/TabIndicator.tsx +0 -0
- package/templates/src/components/compositor/preview/FeaturedContentPreview.tsx +0 -0
- package/templates/src/components/compositor/preview/ListContentPreview.tsx +0 -0
- package/templates/src/components/compositor/preview/OgImagePreview.tsx +0 -0
- package/templates/src/components/compositor/preview/PaneSnapshotGenerator.tsx +0 -0
- package/templates/src/components/compositor/preview/PanesPreviewGenerator.tsx +0 -0
- package/templates/src/components/compositor/preview/VisualBreakPreview.tsx +0 -0
- package/templates/src/components/edit/Header.tsx +9 -3
- package/templates/src/components/edit/PanelSwitch.tsx +4 -8
- package/templates/src/components/edit/SettingsPanel.tsx +24 -17
- package/templates/src/components/edit/ToolBar.tsx +0 -0
- package/templates/src/components/edit/ToolMode.tsx +93 -33
- package/templates/src/components/edit/context/ContextPaneConfig.tsx +0 -0
- package/templates/src/components/edit/context/ContextPaneConfig_slug.tsx +0 -0
- package/templates/src/components/edit/context/ContextPaneConfig_title.tsx +0 -0
- package/templates/src/components/edit/pane/AddPanePanel.tsx +0 -0
- package/templates/src/components/edit/pane/AddPanePanel_break.tsx +0 -0
- package/templates/src/components/edit/pane/AddPanePanel_codehook.tsx +2 -1
- package/templates/src/components/edit/pane/AddPanePanel_new.tsx +1 -1
- package/templates/src/components/edit/pane/AddPanePanel_newAICopy.tsx +0 -0
- package/templates/src/components/edit/pane/AddPanePanel_newAICopy_modal.tsx +1 -1
- package/templates/src/components/edit/pane/AddPanePanel_newCopyMode.tsx +0 -0
- package/templates/src/components/edit/pane/AddPanePanel_newCustomCopy.tsx +0 -0
- package/templates/src/components/edit/pane/AddPanePanel_reuse.tsx +0 -0
- package/templates/src/components/edit/pane/ConfigPanePanel.tsx +1 -0
- package/templates/src/components/edit/pane/PageGen.tsx +0 -0
- package/templates/src/components/edit/pane/PageGenSelector.tsx +0 -0
- package/templates/src/components/edit/pane/PageGenSpecial.tsx +0 -0
- package/templates/src/components/edit/pane/PageGen_preview.tsx +0 -0
- package/templates/src/components/edit/pane/PanePanel_impression.tsx +0 -0
- package/templates/src/components/edit/pane/PanePanel_path.tsx +2 -2
- package/templates/src/components/edit/pane/PanePanel_slug.tsx +0 -0
- package/templates/src/components/edit/pane/PanePanel_title.tsx +0 -0
- package/templates/src/components/edit/panels/StyleBreakPanel.tsx +0 -0
- package/templates/src/components/edit/panels/StyleCodeHookPanel.tsx +0 -0
- package/templates/src/components/edit/panels/StyleElementPanel.tsx +0 -0
- package/templates/src/components/edit/panels/StyleElementPanel_add.tsx +1 -1
- package/templates/src/components/edit/panels/StyleElementPanel_remove.tsx +0 -0
- package/templates/src/components/edit/panels/StyleElementPanel_update.tsx +0 -0
- package/templates/src/components/edit/panels/StyleImagePanel.tsx +0 -0
- package/templates/src/components/edit/panels/StyleImagePanel_add.tsx +1 -1
- package/templates/src/components/edit/panels/StyleImagePanel_remove.tsx +0 -0
- package/templates/src/components/edit/panels/StyleImagePanel_update.tsx +0 -0
- package/templates/src/components/edit/panels/StyleLiElementPanel.tsx +0 -0
- package/templates/src/components/edit/panels/StyleLiElementPanel_add.tsx +1 -1
- package/templates/src/components/edit/panels/StyleLiElementPanel_remove.tsx +0 -0
- package/templates/src/components/edit/panels/StyleLiElementPanel_update.tsx +0 -0
- package/templates/src/components/edit/panels/StyleLinkPanel.tsx +0 -0
- package/templates/src/components/edit/panels/StyleLinkPanel_add.tsx +1 -1
- package/templates/src/components/edit/panels/StyleLinkPanel_config.tsx +1 -1
- package/templates/src/components/edit/panels/StyleLinkPanel_remove.tsx +0 -0
- package/templates/src/components/edit/panels/StyleLinkPanel_update.tsx +0 -0
- package/templates/src/components/edit/panels/StyleParentPanel.tsx +0 -0
- package/templates/src/components/edit/panels/StyleParentPanel_add.tsx +1 -1
- package/templates/src/components/edit/panels/StyleParentPanel_deleteLayer.tsx +0 -0
- package/templates/src/components/edit/panels/StyleParentPanel_remove.tsx +0 -0
- package/templates/src/components/edit/panels/StyleParentPanel_update.tsx +0 -0
- package/templates/src/components/edit/panels/StyleWidgetPanel.tsx +2 -0
- package/templates/src/components/edit/panels/StyleWidgetPanel_add.tsx +1 -1
- package/templates/src/components/edit/panels/StyleWidgetPanel_config.tsx +0 -0
- package/templates/src/components/edit/panels/StyleWidgetPanel_remove.tsx +0 -0
- package/templates/src/components/edit/panels/StyleWidgetPanel_update.tsx +0 -0
- package/templates/src/components/edit/state/SaveModal.tsx +156 -48
- package/templates/src/components/edit/state/StylesMemory.tsx +0 -0
- package/templates/src/components/edit/storyfragment/StoryFragmentConfigPanel.tsx +0 -0
- package/templates/src/components/edit/storyfragment/StoryFragmentPanel_menu.tsx +0 -0
- package/templates/src/components/edit/storyfragment/StoryFragmentPanel_og.tsx +0 -0
- package/templates/src/components/edit/storyfragment/StoryFragmentPanel_slug.tsx +56 -55
- package/templates/src/components/edit/storyfragment/StoryFragmentPanel_title.tsx +0 -0
- package/templates/src/components/edit/widgets/BeliefWidget.tsx +0 -0
- package/templates/src/components/edit/widgets/BunnyWidget.tsx +0 -0
- package/templates/src/components/edit/widgets/IdentifyAsWidget.tsx +0 -0
- package/templates/src/components/edit/widgets/SignupWidget.tsx +0 -0
- package/templates/src/components/edit/widgets/ToggleWidget.tsx +0 -0
- package/templates/src/components/edit/widgets/YouTubeWidget.tsx +0 -0
- package/templates/src/components/fields/ActionBuilderTimeSelector.tsx +0 -0
- package/templates/src/components/fields/ArtpackImage.tsx +0 -0
- package/templates/src/components/fields/BackgroundImage.tsx +0 -0
- package/templates/src/components/fields/BackgroundImageWrapper.tsx +1 -1
- package/templates/src/components/fields/BooleanParam.tsx +0 -0
- package/templates/src/components/fields/BunnyMomentSelector.tsx +0 -0
- package/templates/src/components/fields/ColorPickerCombo.tsx +0 -0
- package/templates/src/components/fields/ImageUpload.tsx +0 -0
- package/templates/src/components/fields/MultiParam.tsx +0 -0
- package/templates/src/components/fields/PaneBreakCollectionSelector.tsx +0 -0
- package/templates/src/components/fields/PaneBreakShapeSelector.tsx +0 -0
- package/templates/src/components/fields/SelectedTailwindClass.tsx +0 -0
- package/templates/src/components/fields/SingleParam.tsx +0 -0
- package/templates/src/components/fields/ViewportComboBox.tsx +10 -3
- package/templates/src/components/form/ActionBuilderField.tsx +0 -0
- package/templates/src/components/form/ActionBuilderSlugSelector.tsx +0 -0
- package/templates/src/components/form/BooleanToggle.tsx +0 -0
- package/templates/src/components/form/ColorPicker.tsx +0 -0
- package/templates/src/components/form/DateTimeInput.tsx +0 -0
- package/templates/src/components/form/EnumSelect.tsx +0 -0
- package/templates/src/components/form/FileUpload.tsx +0 -0
- package/templates/src/components/form/MagicPathBuilder.tsx +0 -0
- package/templates/src/components/form/NumberInput.tsx +0 -0
- package/templates/src/components/form/ParagraphArrayInput.tsx +0 -0
- package/templates/src/components/form/StringArrayInput.tsx +0 -0
- package/templates/src/components/form/StringInput.tsx +0 -0
- package/templates/src/components/form/UnsavedChangesBar.tsx +0 -0
- package/templates/src/components/form/advanced/APIConfigSection.tsx +0 -0
- package/templates/src/components/form/advanced/AuthConfigSection.tsx +0 -0
- package/templates/src/components/form/brand/BrandAssetsSection.tsx +0 -0
- package/templates/src/components/form/brand/BrandColorsSection.tsx +0 -0
- package/templates/src/components/form/brand/SEOSection.tsx +0 -0
- package/templates/src/components/form/brand/SiteConfigSection.tsx +0 -0
- package/templates/src/components/form/brand/SocialLinksSection.tsx +0 -0
- package/templates/src/components/profile/ProfileConsent.tsx +0 -0
- package/templates/src/components/profile/ProfileCreate.tsx +0 -0
- package/templates/src/components/profile/ProfileEdit.tsx +0 -0
- package/templates/src/components/profile/ProfileSwitch.tsx +0 -0
- package/templates/src/components/profile/ProfileUnlock.tsx +0 -0
- package/templates/src/components/storykeep/Dashboard.tsx +0 -0
- package/templates/src/components/storykeep/Dashboard_Activity.tsx +0 -0
- package/templates/src/components/storykeep/Dashboard_Advanced.tsx +1 -1
- package/templates/src/components/storykeep/Dashboard_Analytics.tsx +34 -8
- package/templates/src/components/storykeep/Dashboard_Branding.tsx +0 -0
- package/templates/src/components/storykeep/Dashboard_Content.tsx +6 -0
- package/templates/src/components/storykeep/controls/UsageCell.tsx +0 -0
- package/templates/src/components/storykeep/controls/content/BeliefForm.tsx +0 -0
- package/templates/src/components/storykeep/controls/content/BeliefTable.tsx +0 -0
- package/templates/src/components/storykeep/controls/content/ContentBrowser.tsx +0 -0
- package/templates/src/components/storykeep/controls/content/ContentSummary.tsx +0 -0
- package/templates/src/components/storykeep/controls/content/KnownResourceForm.tsx +0 -0
- package/templates/src/components/storykeep/controls/content/KnownResourceTable.tsx +0 -0
- package/templates/src/components/storykeep/controls/content/ManageContent.tsx +0 -0
- package/templates/src/components/storykeep/controls/content/MenuForm.tsx +0 -0
- package/templates/src/components/storykeep/controls/content/MenuTable.tsx +0 -0
- package/templates/src/components/storykeep/controls/content/ResourceBulkIngest.tsx +0 -0
- package/templates/src/components/storykeep/controls/content/ResourceForm.tsx +0 -0
- package/templates/src/components/storykeep/controls/content/ResourceTable.tsx +0 -0
- package/templates/src/components/storykeep/controls/content/StoryFragmentTable.tsx +5 -8
- package/templates/src/components/storykeep/state/BrandingWrapper.tsx +0 -0
- package/templates/src/components/storykeep/state/FetchAnalytics.tsx +274 -228
- package/templates/src/components/storykeep/widgets/ResponsiveLine.tsx +0 -0
- package/templates/src/components/storykeep/widgets/Wizard.tsx +13 -6
- package/templates/src/components/tenant/RegistrationForm.tsx +5 -3
- package/templates/src/components/widgets/BunnyVideoHero.astro +0 -0
- package/templates/src/components/widgets/Impression.tsx +0 -0
- package/templates/src/components/widgets/ImpressionWrapper.tsx +0 -0
- package/templates/src/constants/beliefs.ts +0 -0
- package/templates/src/constants/brandThemes.ts +0 -0
- package/templates/src/constants/prompts.json +0 -0
- package/templates/src/constants/shapes.ts +0 -0
- package/templates/src/constants/stopWords.ts +0 -0
- package/templates/src/constants/tailwindColors.json +0 -0
- package/templates/src/constants.ts +0 -0
- package/templates/src/hooks/useFormState.ts +0 -0
- package/templates/src/layouts/Layout.astro +129 -20
- package/templates/src/lib/session.ts +0 -0
- package/templates/src/lib/storyData.ts +2 -1
- package/templates/src/middleware.ts +0 -0
- package/templates/src/pages/404.astro +0 -0
- package/templates/src/pages/[...slug]/edit.astro +18 -5
- package/templates/src/pages/[...slug].astro +10 -3
- package/templates/src/pages/api/auth/decode.ts +0 -0
- package/templates/src/pages/api/auth/login.ts +0 -0
- package/templates/src/pages/api/auth/logout.ts +0 -0
- package/templates/src/pages/api/auth/profile.ts +0 -0
- package/templates/src/pages/api/orphan-analysis.ts +0 -1
- package/templates/src/pages/api/tailwind.ts +23 -21
- package/templates/src/pages/collections/[param1].astro +0 -0
- package/templates/src/pages/context/[...contextSlug]/edit.astro +18 -5
- package/templates/src/pages/context/[...contextSlug].astro +7 -2
- package/templates/src/pages/llms.txt.ts +0 -0
- package/templates/src/pages/maint.astro +0 -0
- package/templates/src/pages/media/[...slug].astro +0 -0
- package/templates/src/pages/robots.txt.ts +0 -0
- package/templates/src/pages/sandbox/activate.astro +0 -0
- package/templates/src/pages/sandbox/register.astro +0 -0
- package/templates/src/pages/sandbox/success.astro +0 -0
- package/templates/src/pages/sitemap.xml.ts +0 -0
- package/templates/src/pages/storykeep/advanced.astro +2 -3
- package/templates/src/pages/storykeep/branding.astro +2 -3
- package/templates/src/pages/storykeep/content.astro +2 -3
- package/templates/src/pages/storykeep/init.astro +40 -1
- package/templates/src/pages/storykeep/login.astro +0 -0
- package/templates/src/pages/storykeep/logout.astro +0 -0
- package/templates/src/pages/storykeep/profile.astro +0 -0
- package/templates/src/pages/storykeep.astro +2 -3
- package/templates/src/stores/analytics.ts +0 -0
- package/templates/src/stores/backend.ts +0 -0
- package/templates/src/stores/navigation.ts +0 -0
- package/templates/src/stores/nodes.ts +32 -1
- package/templates/src/stores/nodesHistory.ts +0 -0
- package/templates/src/stores/notificationSystem.ts +0 -0
- package/templates/src/stores/orphanAnalysis.ts +19 -21
- package/templates/src/stores/storykeep.ts +7 -0
- package/templates/src/types/astro.ts +0 -0
- package/templates/src/types/compositorTypes.ts +0 -0
- package/templates/src/types/formTypes.ts +0 -0
- package/templates/src/types/multiTenant.ts +0 -0
- package/templates/src/types/nodeProps.ts +0 -0
- package/templates/src/types/tractstack.ts +0 -0
- package/templates/src/utils/aai/getTitleSlug.ts +0 -0
- package/templates/src/utils/actions/actionButton.ts +0 -0
- package/templates/src/utils/actions/lispLexer.ts +0 -0
- package/templates/src/utils/actions/preParse_Action.ts +0 -0
- package/templates/src/utils/actions/preParse_Bunny.ts +0 -0
- package/templates/src/utils/actions/preParse_Clicked.ts +0 -0
- package/templates/src/utils/actions/preParse_Impression.ts +0 -0
- package/templates/src/utils/api/advancedConfig.ts +0 -0
- package/templates/src/utils/api/advancedHelpers.ts +0 -0
- package/templates/src/utils/api/beliefConfig.ts +0 -0
- package/templates/src/utils/api/beliefHelpers.ts +0 -0
- package/templates/src/utils/api/brandConfig.ts +0 -0
- package/templates/src/utils/api/brandHelpers.ts +0 -0
- package/templates/src/utils/api/fileHelpers.ts +0 -0
- package/templates/src/utils/api/menuConfig.ts +0 -0
- package/templates/src/utils/api/menuHelpers.ts +0 -0
- package/templates/src/utils/api/resourceConfig.ts +0 -0
- package/templates/src/utils/api/resourceHelpers.ts +0 -0
- package/templates/src/utils/api/tenantConfig.ts +0 -0
- package/templates/src/utils/api/tenantHelpers.ts +0 -0
- package/templates/src/utils/api.ts +0 -0
- package/templates/src/utils/auth.ts +0 -0
- package/templates/src/utils/backend.ts +0 -0
- package/templates/src/utils/compositor/TemplateMarkdowns.ts +0 -0
- package/templates/src/utils/compositor/TemplateNodes.ts +0 -0
- package/templates/src/utils/compositor/TemplatePanes.ts +0 -0
- package/templates/src/utils/compositor/allowInsert.ts +0 -0
- package/templates/src/utils/compositor/domHelpers.ts +0 -0
- package/templates/src/utils/compositor/handleClickEvent.ts +0 -0
- package/templates/src/utils/compositor/nodesHelper.ts +0 -0
- package/templates/src/utils/compositor/nodesMarkdownGenerator.ts +0 -0
- package/templates/src/utils/compositor/processMarkdown.ts +0 -0
- package/templates/src/utils/compositor/reduceNodesClassNames.ts +0 -0
- package/templates/src/utils/compositor/tailwindClasses.ts +0 -0
- package/templates/src/utils/compositor/tailwindColors.ts +0 -0
- package/templates/src/utils/compositor/templateMarkdownStyles.ts +8 -0
- package/templates/src/utils/compositor/typeGuards.ts +0 -0
- package/templates/src/utils/etl/extractor.ts +0 -0
- package/templates/src/utils/etl/index.ts +0 -0
- package/templates/src/utils/etl/loader.ts +0 -0
- package/templates/src/utils/etl/transformer.ts +0 -0
- package/templates/src/utils/helpers.ts +1 -0
- package/templates/src/utils/layout.ts +66 -121
- package/templates/src/utils/profileStorage.ts +0 -0
- package/templates/src/utils/useInterval.ts +0 -0
- package/templates/tailwind.config.cjs +0 -0
- package/utils/create-resolver.ts +0 -0
- package/utils/inject-files.ts +21 -1
- package/utils/validate-config.ts +0 -0
|
@@ -176,7 +176,7 @@ const createdDate = created ? new Date(created) : new Date();
|
|
|
176
176
|
>
|
|
177
177
|
Tract Stack</a
|
|
178
178
|
>
|
|
179
|
-
–
|
|
179
|
+
– the “free web press” by{` `}
|
|
180
180
|
<a
|
|
181
181
|
href="https://atriskmedia.com/?utm_source=tractstack&utm_medium=www&utm_campaign=community"
|
|
182
182
|
class="font-bold underline hover:text-black"
|
|
File without changes
|
|
@@ -160,12 +160,13 @@ const authStatus = {
|
|
|
160
160
|
|
|
161
161
|
{/* Edit Icon */}
|
|
162
162
|
{
|
|
163
|
-
isEditable
|
|
163
|
+
isEditable &&
|
|
164
|
+
(authStatus.isAdmin || authStatus.userRole === 'editor') ? (
|
|
164
165
|
<a
|
|
165
166
|
data-astro-reload
|
|
166
167
|
href={!isContext ? `/${slug}/edit` : `/context/${slug}/edit`}
|
|
167
168
|
class="text-myblue/80 hover:text-myblue hover:rotate-6"
|
|
168
|
-
title={!isContext ? 'Edit this story' : 'Edit this
|
|
169
|
+
title={!isContext ? 'Edit this story' : 'Edit this page'}
|
|
169
170
|
>
|
|
170
171
|
<svg
|
|
171
172
|
class="h-6 w-6"
|
|
@@ -335,7 +336,13 @@ const authStatus = {
|
|
|
335
336
|
}
|
|
336
337
|
|
|
337
338
|
<script>
|
|
338
|
-
document.
|
|
339
|
+
if (document.readyState === 'loading') {
|
|
340
|
+
document.addEventListener('DOMContentLoaded', setupAdminModal);
|
|
341
|
+
} else {
|
|
342
|
+
setupAdminModal();
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
function setupAdminModal() {
|
|
339
346
|
const logoutBtn = document.getElementById(
|
|
340
347
|
'logout-btn'
|
|
341
348
|
) as HTMLButtonElement | null;
|
|
@@ -394,65 +401,61 @@ const authStatus = {
|
|
|
394
401
|
});
|
|
395
402
|
}
|
|
396
403
|
|
|
397
|
-
// Admin Modal JavaScript -
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
const closeBtn = document.getElementById('admin-modal-close');
|
|
401
|
-
const iframe = document.getElementById('admin-sysop-iframe');
|
|
402
|
-
|
|
403
|
-
if (heartBtn && modal && closeBtn && iframe) {
|
|
404
|
-
// Open modal when heart icon is clicked
|
|
405
|
-
heartBtn.addEventListener('click', function (e) {
|
|
404
|
+
// Admin Modal JavaScript - Use event delegation
|
|
405
|
+
document.addEventListener('click', function (e) {
|
|
406
|
+
if (e.target && (e.target as Element).closest('#admin-heart-btn')) {
|
|
406
407
|
e.preventDefault();
|
|
407
|
-
modal.
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
408
|
+
const modal = document.getElementById('admin-modal');
|
|
409
|
+
const closeBtn = document.getElementById('admin-modal-close');
|
|
410
|
+
|
|
411
|
+
if (modal && closeBtn) {
|
|
412
|
+
modal.classList.remove('hidden');
|
|
413
|
+
modal.setAttribute('aria-hidden', 'false');
|
|
414
|
+
closeBtn.focus();
|
|
415
|
+
document.body.style.overflow = 'hidden';
|
|
416
|
+
}
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
416
419
|
|
|
417
|
-
|
|
418
|
-
closeBtn.addEventListener('click', function (e) {
|
|
420
|
+
if (e.target && (e.target as Element).closest('#admin-modal-close')) {
|
|
419
421
|
e.preventDefault();
|
|
420
422
|
closeModal();
|
|
421
|
-
|
|
423
|
+
return;
|
|
424
|
+
}
|
|
422
425
|
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
});
|
|
426
|
+
if (e.target && (e.target as Element).id === 'admin-modal') {
|
|
427
|
+
closeModal();
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
});
|
|
429
431
|
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
432
|
+
document.addEventListener('keydown', function (e) {
|
|
433
|
+
if (e.key === 'Escape') {
|
|
434
|
+
const modal = document.getElementById('admin-modal');
|
|
435
|
+
if (modal && !modal.classList.contains('hidden')) {
|
|
433
436
|
closeModal();
|
|
434
437
|
}
|
|
435
|
-
});
|
|
436
|
-
|
|
437
|
-
function closeModal() {
|
|
438
|
-
modal?.classList.add('hidden');
|
|
439
|
-
modal?.setAttribute('aria-hidden', 'true');
|
|
440
|
-
|
|
441
|
-
// Restore body scroll
|
|
442
|
-
document.body.style.overflow = '';
|
|
443
|
-
|
|
444
|
-
// Return focus to heart button for accessibility
|
|
445
|
-
heartBtn?.focus();
|
|
446
438
|
}
|
|
439
|
+
});
|
|
447
440
|
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
//});
|
|
441
|
+
function closeModal() {
|
|
442
|
+
const modal = document.getElementById('admin-modal');
|
|
443
|
+
const heartBtn = document.getElementById('admin-heart-btn');
|
|
452
444
|
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
445
|
+
modal?.classList.add('hidden');
|
|
446
|
+
modal?.setAttribute('aria-hidden', 'true');
|
|
447
|
+
document.body.style.overflow = '';
|
|
448
|
+
heartBtn?.focus();
|
|
456
449
|
}
|
|
457
|
-
|
|
450
|
+
|
|
451
|
+
// iframe error handling
|
|
452
|
+
document.addEventListener('DOMContentLoaded', function () {
|
|
453
|
+
const iframe = document.getElementById('admin-sysop-iframe');
|
|
454
|
+
if (iframe) {
|
|
455
|
+
iframe.addEventListener('error', function () {
|
|
456
|
+
console.error('Failed to load admin panel');
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
});
|
|
460
|
+
}
|
|
458
461
|
</script>
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -45,11 +45,13 @@ interface ContentMapItem {
|
|
|
45
45
|
interface EpinetDurationSelectorProps {
|
|
46
46
|
fullContentMap?: ContentMapItem[];
|
|
47
47
|
isLoading?: boolean;
|
|
48
|
+
hourlyNodeActivity?: any;
|
|
48
49
|
}
|
|
49
50
|
|
|
50
51
|
const EpinetDurationSelector = ({
|
|
51
52
|
fullContentMap,
|
|
52
53
|
isLoading,
|
|
54
|
+
hourlyNodeActivity,
|
|
53
55
|
}: EpinetDurationSelectorProps = {}) => {
|
|
54
56
|
const [startDate, setStartDate] = useState<Date | null>(null);
|
|
55
57
|
const [endDate, setEndDate] = useState<Date | null>(null);
|
|
@@ -185,22 +187,12 @@ const EpinetDurationSelector = ({
|
|
|
185
187
|
const startUTCTime = createUTCDateTime(startDate, localFilters.startHour);
|
|
186
188
|
const endUTCTime = createUTCDateTime(endDate, localFilters.endHour);
|
|
187
189
|
|
|
188
|
-
if (endUTCTime
|
|
190
|
+
if (endUTCTime < startUTCTime) {
|
|
189
191
|
setErrorMessage('End time must be after start time.');
|
|
190
192
|
return;
|
|
191
193
|
}
|
|
192
194
|
|
|
193
195
|
const nowUTC = new Date();
|
|
194
|
-
const maxPastTime = new Date(
|
|
195
|
-
nowUTC.getTime() - MAX_ANALYTICS_HOURS * 60 * 60 * 1000
|
|
196
|
-
);
|
|
197
|
-
|
|
198
|
-
if (startUTCTime < maxPastTime) {
|
|
199
|
-
setErrorMessage(
|
|
200
|
-
`Start time cannot be more than ${MAX_ANALYTICS_HOURS} hours in the past.`
|
|
201
|
-
);
|
|
202
|
-
return;
|
|
203
|
-
}
|
|
204
196
|
|
|
205
197
|
if (endUTCTime > nowUTC) {
|
|
206
198
|
setErrorMessage('End time cannot be in the future.');
|
|
@@ -549,7 +541,7 @@ const EpinetDurationSelector = ({
|
|
|
549
541
|
|
|
550
542
|
return (
|
|
551
543
|
<>
|
|
552
|
-
<div className="space-y-4">
|
|
544
|
+
<div className="space-y-4 overflow-visible">
|
|
553
545
|
{$epinetCustomFilters.enabled && (
|
|
554
546
|
<div
|
|
555
547
|
className={`space-y-4 rounded-lg border-2 border-dashed border-gray-200 bg-gray-50 p-4`}
|
|
@@ -865,7 +857,10 @@ const EpinetDurationSelector = ({
|
|
|
865
857
|
</Select.Control>
|
|
866
858
|
<Portal>
|
|
867
859
|
<Select.Positioner>
|
|
868
|
-
<Select.Content
|
|
860
|
+
<Select.Content
|
|
861
|
+
className="z-10 mt-2 max-h-96 overflow-auto rounded-md bg-white text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none"
|
|
862
|
+
style={{ width: 'var(--trigger-width)' }}
|
|
863
|
+
>
|
|
869
864
|
{paginatedUserCounts.length > 0 ? (
|
|
870
865
|
[
|
|
871
866
|
<Select.Item
|
|
@@ -930,6 +925,7 @@ const EpinetDurationSelector = ({
|
|
|
930
925
|
<EpinetTableView
|
|
931
926
|
fullContentMap={fullContentMap || []}
|
|
932
927
|
isLoading={isLoading}
|
|
928
|
+
hourlyNodeActivity={hourlyNodeActivity}
|
|
933
929
|
/>
|
|
934
930
|
)}
|
|
935
931
|
</div>
|
|
@@ -53,13 +53,17 @@ interface ContentMapItem {
|
|
|
53
53
|
type: string;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
+
interface Props {
|
|
57
|
+
fullContentMap: ContentMapItem[];
|
|
58
|
+
isLoading?: boolean;
|
|
59
|
+
hourlyNodeActivity?: any;
|
|
60
|
+
}
|
|
61
|
+
|
|
56
62
|
const EpinetTableView = ({
|
|
57
63
|
fullContentMap,
|
|
58
64
|
isLoading = false,
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
isLoading?: boolean;
|
|
62
|
-
}) => {
|
|
65
|
+
hourlyNodeActivity,
|
|
66
|
+
}: Props) => {
|
|
63
67
|
const $epinetCustomFilters = useStore(epinetCustomFilters);
|
|
64
68
|
const [currentDay, setCurrentDay] = useState<string | null>(null);
|
|
65
69
|
const [availableDays, setAvailableDays] = useState<string[]>([]);
|
|
@@ -174,7 +178,7 @@ const EpinetTableView = ({
|
|
|
174
178
|
};
|
|
175
179
|
|
|
176
180
|
useEffect(() => {
|
|
177
|
-
const hourlyActivity =
|
|
181
|
+
const hourlyActivity = hourlyNodeActivity || {};
|
|
178
182
|
const hourKeys = Object.keys(hourlyActivity);
|
|
179
183
|
|
|
180
184
|
if (hourKeys.length === 0) {
|
|
@@ -192,7 +196,7 @@ const EpinetTableView = ({
|
|
|
192
196
|
setAvailableDays(days);
|
|
193
197
|
setCurrentDay(days[0] || null);
|
|
194
198
|
setCurrentDayIndex(0);
|
|
195
|
-
}, [
|
|
199
|
+
}, [hourlyNodeActivity]);
|
|
196
200
|
|
|
197
201
|
const navigateDay = (direction: 'prev' | 'next') => {
|
|
198
202
|
const newIndex =
|
|
@@ -213,7 +217,7 @@ const EpinetTableView = ({
|
|
|
213
217
|
if (!currentDay)
|
|
214
218
|
return { data: [], dailyTotal: 0, dailyVisitors: 0, maxHourlyTotal: 0 };
|
|
215
219
|
|
|
216
|
-
const hourlyActivity =
|
|
220
|
+
const hourlyActivity = hourlyNodeActivity || {};
|
|
217
221
|
const result: HourData[] = [];
|
|
218
222
|
let emptyRangeStart: number | null = null;
|
|
219
223
|
let dailyTotal = 0;
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -234,9 +234,10 @@ const SankeyDiagram = ({ data, isLoading = false }: SankeyDiagramProps) => {
|
|
|
234
234
|
}
|
|
235
235
|
}, [data, dimensions]);
|
|
236
236
|
|
|
237
|
-
const
|
|
238
|
-
const
|
|
239
|
-
|
|
237
|
+
const needsCompression = !isExpanded && dimensions.height > COMPRESSED_HEIGHT;
|
|
238
|
+
const displayHeight = needsCompression
|
|
239
|
+
? COMPRESSED_HEIGHT
|
|
240
|
+
: dimensions.height;
|
|
240
241
|
|
|
241
242
|
const handleExpand = () => {
|
|
242
243
|
setIsExpanded(!isExpanded);
|
|
File without changes
|
|
File without changes
|
|
@@ -51,26 +51,40 @@ const PanelVisibilityWrapper = ({
|
|
|
51
51
|
const currentWrapper = wrapperRef.current;
|
|
52
52
|
if (!currentWrapper) return;
|
|
53
53
|
|
|
54
|
-
//
|
|
54
|
+
// Skip intersection observer for 'add' panels - they behave differently
|
|
55
|
+
if (panelType === 'add') {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
|
|
55
59
|
const observer = new IntersectionObserver(
|
|
56
60
|
(entries) => {
|
|
57
|
-
//
|
|
58
|
-
if (
|
|
59
|
-
|
|
61
|
+
// Add delay to prevent immediate closing during panel activation
|
|
62
|
+
if (isActive) {
|
|
63
|
+
setTimeout(() => {
|
|
64
|
+
// Double-check the panel is still active before closing
|
|
65
|
+
const currentActiveMode = nodesCtx.activePaneMode.get();
|
|
66
|
+
const stillActive =
|
|
67
|
+
currentActiveMode.panel === panelType &&
|
|
68
|
+
currentActiveMode.paneId === nodeId;
|
|
69
|
+
if (!entries[0].isIntersecting && stillActive) {
|
|
70
|
+
console.log('❌ CLOSING PANEL DUE TO INTERSECTION OBSERVER!', {
|
|
71
|
+
panelType,
|
|
72
|
+
nodeId,
|
|
73
|
+
});
|
|
74
|
+
nodesCtx.closeAllPanels();
|
|
75
|
+
}
|
|
76
|
+
}, 100); // Small delay to allow panel to render
|
|
60
77
|
}
|
|
61
78
|
},
|
|
62
79
|
{
|
|
63
|
-
threshold: 0.1,
|
|
64
|
-
rootMargin: '-10px',
|
|
80
|
+
threshold: 0.1,
|
|
81
|
+
rootMargin: '-10px',
|
|
65
82
|
}
|
|
66
83
|
);
|
|
67
84
|
|
|
68
85
|
observer.observe(currentWrapper);
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
observer.disconnect();
|
|
72
|
-
};
|
|
73
|
-
}, [nodeId, panelType, nodesCtx, isActive]); // Include isActive in dependencies
|
|
86
|
+
return () => observer.disconnect();
|
|
87
|
+
}, [nodeId, panelType, nodesCtx, isActive]);
|
|
74
88
|
|
|
75
89
|
return (
|
|
76
90
|
<div
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useEffect, useState, memo, type CSSProperties } from 'react';
|
|
1
|
+
import { useEffect, useState, memo, Fragment, type CSSProperties } from 'react';
|
|
2
2
|
import { getCtx } from '@/stores/nodes';
|
|
3
3
|
import { viewportKeyStore } from '@/stores/storykeep';
|
|
4
4
|
import { RenderChildren } from './RenderChildren';
|
|
@@ -27,12 +27,19 @@ const CodeHookContainer = ({
|
|
|
27
27
|
{Object.entries(payload.params).map(
|
|
28
28
|
([key, value]) =>
|
|
29
29
|
value && (
|
|
30
|
-
<
|
|
30
|
+
<Fragment key={key}>
|
|
31
31
|
<span className="min-w-24 font-bold text-gray-600">{key}:</span>
|
|
32
|
-
<
|
|
33
|
-
{
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
<div className="ml-2 flex flex-wrap gap-1">
|
|
33
|
+
{value.split('|').map((item, index) => (
|
|
34
|
+
<span
|
|
35
|
+
key={index}
|
|
36
|
+
className="inline-block rounded bg-gray-200 px-2 py-0.5 text-xs text-gray-800"
|
|
37
|
+
>
|
|
38
|
+
{item}
|
|
39
|
+
</span>
|
|
40
|
+
))}
|
|
41
|
+
</div>
|
|
42
|
+
</Fragment>
|
|
36
43
|
)
|
|
37
44
|
)}
|
|
38
45
|
</div>
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
viewportModeStore,
|
|
14
14
|
setViewportMode,
|
|
15
15
|
settingsPanelStore,
|
|
16
|
+
pendingHomePageSlugStore,
|
|
16
17
|
} from '@/stores/storykeep';
|
|
17
18
|
import { getCtx, ROOT_NODE_NAME } from '@/stores/nodes';
|
|
18
19
|
import SaveModal from '@/components/edit/state/SaveModal';
|
|
@@ -24,6 +25,7 @@ interface StoryKeepHeaderProps {
|
|
|
24
25
|
|
|
25
26
|
const StoryKeepHeader = ({ slug, isContext = false }: StoryKeepHeaderProps) => {
|
|
26
27
|
const viewport = useStore(viewportModeStore);
|
|
28
|
+
const pendingHomePageSlug = useStore(pendingHomePageSlugStore);
|
|
27
29
|
const ctx = getCtx();
|
|
28
30
|
const hasTitle = useStore(ctx.hasTitle);
|
|
29
31
|
const hasPanes = useStore(ctx.hasPanes);
|
|
@@ -61,7 +63,8 @@ const StoryKeepHeader = ({ slug, isContext = false }: StoryKeepHeaderProps) => {
|
|
|
61
63
|
};
|
|
62
64
|
|
|
63
65
|
const handleVisitPage = () => {
|
|
64
|
-
|
|
66
|
+
const hasChanges = canUndo || pendingHomePageSlug;
|
|
67
|
+
if (hasChanges) {
|
|
65
68
|
if (
|
|
66
69
|
confirm(
|
|
67
70
|
'You have unsaved changes. Do you want to visit the page anyway?'
|
|
@@ -89,6 +92,9 @@ const StoryKeepHeader = ({ slug, isContext = false }: StoryKeepHeaderProps) => {
|
|
|
89
92
|
{ value: 'desktop', Icon: ComputerDesktopIcon, title: 'Desktop Viewport' },
|
|
90
93
|
];
|
|
91
94
|
|
|
95
|
+
// Show save button if there are undo changes OR pending home page change
|
|
96
|
+
const shouldShowSave = canUndo || pendingHomePageSlug;
|
|
97
|
+
|
|
92
98
|
if (!hasTitle && !hasPanes) return null;
|
|
93
99
|
|
|
94
100
|
return (
|
|
@@ -127,7 +133,7 @@ const StoryKeepHeader = ({ slug, isContext = false }: StoryKeepHeaderProps) => {
|
|
|
127
133
|
className={`${iconClassName} relative`}
|
|
128
134
|
>
|
|
129
135
|
<GlobeAltIcon />
|
|
130
|
-
{
|
|
136
|
+
{shouldShowSave && (
|
|
131
137
|
<ExclamationTriangleIcon className="absolute -right-1 -top-1 h-3 w-3 rounded-full bg-white text-amber-500" />
|
|
132
138
|
)}
|
|
133
139
|
</button>
|
|
@@ -156,7 +162,7 @@ const StoryKeepHeader = ({ slug, isContext = false }: StoryKeepHeaderProps) => {
|
|
|
156
162
|
</div>
|
|
157
163
|
)}
|
|
158
164
|
|
|
159
|
-
{
|
|
165
|
+
{shouldShowSave && (
|
|
160
166
|
<div className="flex flex-wrap items-center justify-center gap-2 text-sm">
|
|
161
167
|
<button
|
|
162
168
|
onClick={handleSave}
|
|
@@ -110,13 +110,9 @@ const PanelSwitch = ({
|
|
|
110
110
|
break;
|
|
111
111
|
|
|
112
112
|
case 'style-parent-add':
|
|
113
|
-
if (markdownNode
|
|
113
|
+
if (markdownNode)
|
|
114
114
|
return (
|
|
115
|
-
<StyleParentAddPanel
|
|
116
|
-
node={markdownNode}
|
|
117
|
-
layer={signal.layer || 0}
|
|
118
|
-
className={signal.className}
|
|
119
|
-
/>
|
|
115
|
+
<StyleParentAddPanel node={markdownNode} layer={signal.layer || 0} />
|
|
120
116
|
);
|
|
121
117
|
break;
|
|
122
118
|
|
|
@@ -200,12 +196,11 @@ const PanelSwitch = ({
|
|
|
200
196
|
break;
|
|
201
197
|
|
|
202
198
|
case 'style-element-add':
|
|
203
|
-
if (clickedNode && markdownNode
|
|
199
|
+
if (clickedNode && markdownNode)
|
|
204
200
|
return (
|
|
205
201
|
<StyleElementAddPanel
|
|
206
202
|
node={clickedNode}
|
|
207
203
|
parentNode={markdownNode}
|
|
208
|
-
className={signal.className}
|
|
209
204
|
onTitleChange={onTitleChange}
|
|
210
205
|
/>
|
|
211
206
|
);
|
|
@@ -317,6 +312,7 @@ const PanelSwitch = ({
|
|
|
317
312
|
|
|
318
313
|
case 'style-code-config':
|
|
319
314
|
if (clickedNode) return <StyleWidgetConfigPanel node={clickedNode} />;
|
|
315
|
+
break;
|
|
320
316
|
|
|
321
317
|
case 'style-code-add':
|
|
322
318
|
case 'style-code-container-add':
|