astro-tractstack 2.0.47 → 2.1.1
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/README.md +35 -39
- package/package.json +25 -20
- package/templates/src/components/Footer.astro +4 -4
- package/templates/src/components/Header.astro +6 -6
- package/templates/src/components/Menu.tsx +15 -15
- package/templates/src/components/codehooks/BunnyVideoSetup.tsx +6 -6
- package/templates/src/components/codehooks/EpinetDurationSelector.tsx +3 -3
- package/templates/src/components/codehooks/FeaturedArticle.astro +1 -1
- package/templates/src/components/codehooks/FeaturedArticleSetup.tsx +3 -3
- package/templates/src/components/codehooks/ListContentSetup.tsx +2 -2
- package/templates/src/components/codehooks/ProductCardSetup.tsx +1 -1
- package/templates/src/components/codehooks/ProductGridSetup.tsx +2 -2
- package/templates/src/components/codehooks/SandboxRegisterForm.tsx +3 -3
- package/templates/src/components/compositor/Compositor.tsx +1 -1
- package/templates/src/components/compositor/elements/Belief.tsx +1 -1
- package/templates/src/components/compositor/elements/BunnyVideo.tsx +2 -2
- package/templates/src/components/compositor/elements/SignUp.tsx +1 -1
- package/templates/src/components/compositor/elements/ToggleBelief.tsx +1 -1
- package/templates/src/components/compositor/nodes/GhostInsertBlock.tsx +1 -1
- package/templates/src/components/compositor/nodes/GridLayout.tsx +1 -1
- package/templates/src/components/compositor/nodes/tagElements/TabIndicator.tsx +1 -1
- package/templates/src/components/compositor/preview/ListContentPreview.tsx +8 -8
- package/templates/src/components/edit/Header.tsx +1 -1
- package/templates/src/components/edit/SettingsPanel.tsx +3 -3
- package/templates/src/components/edit/ToolBar.tsx +3 -3
- package/templates/src/components/edit/ToolMode.tsx +5 -5
- package/templates/src/components/edit/pane/AddPanePanel.tsx +5 -5
- package/templates/src/components/edit/pane/AddPanePanel_break.tsx +6 -6
- package/templates/src/components/edit/pane/AddPanePanel_codehook.tsx +2 -2
- package/templates/src/components/edit/pane/AddPanePanel_new.tsx +2 -2
- package/templates/src/components/edit/pane/AddPanePanel_reuse.tsx +4 -4
- package/templates/src/components/edit/pane/AiRestylePaneModal.tsx +2 -2
- package/templates/src/components/edit/pane/ConfigPanePanel.tsx +1 -1
- package/templates/src/components/edit/pane/PanePanel_impression.tsx +4 -4
- package/templates/src/components/edit/pane/RestylePaneModal.tsx +3 -3
- package/templates/src/components/edit/pane/steps/AiDesignStep.tsx +2 -2
- package/templates/src/components/edit/pane/steps/CopyInputStep.tsx +5 -5
- package/templates/src/components/edit/panels/StyleBreakPanel.tsx +2 -2
- package/templates/src/components/edit/panels/StyleCodeHookPanel.tsx +6 -6
- package/templates/src/components/edit/panels/StyleElementPanel.tsx +5 -5
- package/templates/src/components/edit/panels/StyleElementPanel_add.tsx +6 -6
- package/templates/src/components/edit/panels/StyleElementPanel_remove.tsx +1 -1
- package/templates/src/components/edit/panels/StyleElementPanel_update.tsx +3 -3
- package/templates/src/components/edit/panels/StyleImagePanel.tsx +8 -8
- package/templates/src/components/edit/panels/StyleImagePanel_add.tsx +6 -6
- package/templates/src/components/edit/panels/StyleImagePanel_remove.tsx +1 -1
- package/templates/src/components/edit/panels/StyleImagePanel_update.tsx +3 -3
- package/templates/src/components/edit/panels/StyleLiElementPanel.tsx +4 -4
- package/templates/src/components/edit/panels/StyleLiElementPanel_add.tsx +6 -6
- package/templates/src/components/edit/panels/StyleLiElementPanel_remove.tsx +1 -1
- package/templates/src/components/edit/panels/StyleLiElementPanel_update.tsx +3 -3
- package/templates/src/components/edit/panels/StyleLinkPanel.tsx +5 -5
- package/templates/src/components/edit/panels/StyleLinkPanel_add.tsx +6 -6
- package/templates/src/components/edit/panels/StyleLinkPanel_remove.tsx +1 -1
- package/templates/src/components/edit/panels/StyleLinkPanel_update.tsx +1 -1
- package/templates/src/components/edit/panels/StyleParentPanel.tsx +9 -9
- package/templates/src/components/edit/panels/StyleParentPanel_add.tsx +6 -6
- package/templates/src/components/edit/panels/StyleParentPanel_deleteLayer.tsx +2 -2
- package/templates/src/components/edit/panels/StyleParentPanel_remove.tsx +1 -1
- package/templates/src/components/edit/panels/StyleParentPanel_update.tsx +1 -1
- package/templates/src/components/edit/panels/StyleWidgetPanel.tsx +7 -7
- package/templates/src/components/edit/panels/StyleWidgetPanel_add.tsx +6 -6
- package/templates/src/components/edit/panels/StyleWidgetPanel_remove.tsx +1 -1
- package/templates/src/components/edit/panels/StyleWidgetPanel_update.tsx +3 -3
- package/templates/src/components/edit/panels/StyleWordCarouselPanel.tsx +1 -1
- package/templates/src/components/edit/state/SaveModal.tsx +1 -1
- package/templates/src/components/edit/state/SaveToLibraryModal.tsx +2 -2
- package/templates/src/components/edit/state/StylesMemory.tsx +1 -1
- package/templates/src/components/edit/storyfragment/StoryFragmentConfigPanel.tsx +1 -1
- package/templates/src/components/edit/storyfragment/StoryFragmentPanel_menu.tsx +5 -5
- package/templates/src/components/edit/widgets/BunnyWidget.tsx +5 -5
- package/templates/src/components/edit/widgets/InteractiveDisclosureWidget.tsx +1 -1
- package/templates/src/components/edit/widgets/SignupWidget.tsx +3 -3
- package/templates/src/components/fields/ActionBuilderTimeSelector.tsx +7 -7
- package/templates/src/components/fields/ArtpackImage.tsx +15 -15
- package/templates/src/components/fields/BackgroundImage.tsx +13 -13
- package/templates/src/components/fields/BackgroundImageWrapper.tsx +3 -3
- package/templates/src/components/fields/ColorPickerCombo.tsx +8 -8
- package/templates/src/components/fields/ImageUpload.tsx +8 -8
- package/templates/src/components/fields/PaneBreakCollectionSelector.tsx +3 -3
- package/templates/src/components/fields/PaneBreakShapeSelector.tsx +4 -4
- package/templates/src/components/fields/SelectedTailwindClass.tsx +2 -2
- package/templates/src/components/fields/ViewportComboBox.tsx +4 -4
- package/templates/src/components/form/ActionBuilderField.tsx +1 -1
- package/templates/src/components/form/ActionBuilderSlugSelector.tsx +1 -1
- package/templates/src/components/form/UnsavedChangesBar.tsx +1 -1
- package/templates/src/components/form/advanced/APIConfigSection.tsx +2 -2
- package/templates/src/components/form/advanced/AuthConfigSection.tsx +2 -2
- package/templates/src/components/form/brand/BrandColorsSection.tsx +1 -1
- package/templates/src/components/profile/ProfileCreate.tsx +4 -4
- package/templates/src/components/profile/ProfileEdit.tsx +4 -4
- package/templates/src/components/profile/ProfileSwitch.tsx +2 -2
- package/templates/src/components/profile/ProfileUnlock.tsx +3 -3
- package/templates/src/components/search/SearchModal.tsx +10 -10
- package/templates/src/components/search/SearchResults.tsx +10 -10
- package/templates/src/components/search/SearchWrapper.tsx +1 -1
- package/templates/src/components/storykeep/Dashboard.tsx +1 -1
- package/templates/src/components/storykeep/Dashboard_Advanced.tsx +2 -2
- package/templates/src/components/storykeep/controls/content/BeliefForm.tsx +1 -1
- package/templates/src/components/storykeep/controls/content/ContentSummary.tsx +2 -2
- package/templates/src/components/storykeep/controls/content/KnownResourceTable.tsx +1 -1
- package/templates/src/components/storykeep/controls/content/ManageContent.tsx +2 -2
- package/templates/src/components/storykeep/controls/content/MenuForm.tsx +1 -1
- package/templates/src/components/storykeep/controls/content/ResourceTable.tsx +1 -1
- package/templates/src/components/widgets/Impression.tsx +2 -2
- package/templates/src/components/widgets/ImpressionWrapper.tsx +2 -2
- package/templates/src/hooks/useSearch.ts +1 -1
- package/templates/src/layouts/Layout.astro +2 -2
- package/templates/src/pages/[...slug]/edit.astro +3 -3
- package/templates/src/pages/[...slug].astro +1 -1
- package/templates/src/pages/context/[...contextSlug]/edit.astro +3 -3
- package/templates/src/pages/maint.astro +9 -9
- package/templates/src/pages/sandbox.astro +50 -61
- package/templates/src/pages/storykeep/login.astro +6 -6
- package/templates/src/types/formTypes.ts +6 -4
- package/templates/src/types/nodeProps.ts +1 -1
- package/templates/src/types/tractstack.ts +1 -2
- package/templates/src/utils/compositor/nodesHelper.ts +1 -1
- package/templates/src/utils/compositor/typeGuards.ts +3 -3
|
@@ -47,7 +47,7 @@ const ContentSummary = ({ fullContentMap }: ContentSummaryProps) => {
|
|
|
47
47
|
<h2 className="mb-4 text-xl font-bold text-gray-900">
|
|
48
48
|
Content Overview
|
|
49
49
|
</h2>
|
|
50
|
-
<div className="grid
|
|
50
|
+
<div className="sm:grid-cols-4 lg:grid-cols-8 grid grid-cols-2 gap-4">
|
|
51
51
|
<div className="text-center">
|
|
52
52
|
<div className="text-2xl font-bold text-cyan-600">
|
|
53
53
|
{contentStats.storyfragments}
|
|
@@ -89,7 +89,7 @@ const ContentSummary = ({ fullContentMap }: ContentSummaryProps) => {
|
|
|
89
89
|
{/* Quick Actions */}
|
|
90
90
|
<div className="rounded-lg bg-white p-6 shadow">
|
|
91
91
|
<h2 className="mb-4 text-xl font-bold text-gray-900">Quick Actions</h2>
|
|
92
|
-
<div className="grid grid-cols-2 gap-4
|
|
92
|
+
<div className="sm:grid-cols-4 grid grid-cols-2 gap-4">
|
|
93
93
|
<a
|
|
94
94
|
href="/create/edit"
|
|
95
95
|
className="rounded-lg border-2 border-dashed border-gray-300 p-4 text-center hover:border-cyan-500 hover:text-cyan-600"
|
|
@@ -195,7 +195,7 @@ const KnownResourceTable = ({
|
|
|
195
195
|
<td className="whitespace-nowrap px-6 py-4 text-sm text-gray-500">
|
|
196
196
|
{fieldCount} {fieldCount === 1 ? 'field' : 'fields'}
|
|
197
197
|
</td>
|
|
198
|
-
<td className="relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-bold
|
|
198
|
+
<td className="sm:pr-6 relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-bold">
|
|
199
199
|
<div className="flex items-center justify-end space-x-2">
|
|
200
200
|
{/* Edit button */}
|
|
201
201
|
<button
|
|
@@ -403,10 +403,10 @@ const ManageContent = ({
|
|
|
403
403
|
className={classNames(
|
|
404
404
|
activeTab === tab.id
|
|
405
405
|
? tab.isResourceCategory
|
|
406
|
-
? '
|
|
406
|
+
? 'border-dashed border-gray-500 bg-white text-mydarkgrey'
|
|
407
407
|
: 'border-cyan-500 bg-cyan-100 text-cyan-700'
|
|
408
408
|
: tab.isResourceCategory
|
|
409
|
-
? '
|
|
409
|
+
? 'border-transparent bg-orange-50 text-mydarkgrey hover:bg-orange-100'
|
|
410
410
|
: 'border-transparent bg-gray-100 text-gray-500 hover:bg-gray-200',
|
|
411
411
|
'rounded-xl border-2 px-4 py-1.5 text-sm font-bold transition-colors duration-200'
|
|
412
412
|
)}
|
|
@@ -162,7 +162,7 @@ export default function ResourceTable({
|
|
|
162
162
|
<td className="px-6 py-4 text-sm text-gray-500">
|
|
163
163
|
{(resource as any).oneliner || '-'}
|
|
164
164
|
</td>
|
|
165
|
-
<td className="relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-bold
|
|
165
|
+
<td className="sm:pr-6 relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-bold">
|
|
166
166
|
<div className="flex items-center justify-end space-x-2">
|
|
167
167
|
{/* Edit button */}
|
|
168
168
|
<button
|
|
@@ -82,14 +82,14 @@ const Impression = ({ payload, currentPage, config }: ImpressionProps) => {
|
|
|
82
82
|
<h3 className="text-md font-action leading-6 text-black">
|
|
83
83
|
{payload.title}
|
|
84
84
|
</h3>
|
|
85
|
-
<div className="xs:flex xs:items-start xs:justify-between
|
|
85
|
+
<div className="mt-2 xs:flex xs:items-start xs:justify-between">
|
|
86
86
|
<div className="max-w-xl text-sm text-black">
|
|
87
87
|
<p>
|
|
88
88
|
{payload.body}
|
|
89
89
|
{` `}
|
|
90
90
|
<a
|
|
91
91
|
onClick={() => pushEvent()}
|
|
92
|
-
className="
|
|
92
|
+
className="cursor-pointer text-black underline underline-offset-4 hover:text-myorange"
|
|
93
93
|
href={actionPayload || '#'}
|
|
94
94
|
>
|
|
95
95
|
{payload.buttonText}
|
|
@@ -126,7 +126,7 @@ const ImpressionWrapper = ({
|
|
|
126
126
|
<button
|
|
127
127
|
type="button"
|
|
128
128
|
title="Click for notifications"
|
|
129
|
-
className="
|
|
129
|
+
className="flex h-6 w-6 items-center justify-center rounded-full bg-brand-1 text-sm font-bold text-white transition-colors hover:bg-brand-3 motion-safe:animate-bounce"
|
|
130
130
|
onClick={() => setIsExpanded(true)}
|
|
131
131
|
>
|
|
132
132
|
<span className="sr-only">Show impressions</span>
|
|
@@ -149,7 +149,7 @@ const ImpressionWrapper = ({
|
|
|
149
149
|
{/* Close button */}
|
|
150
150
|
<button
|
|
151
151
|
type="button"
|
|
152
|
-
className="
|
|
152
|
+
className="absolute right-2 top-2 z-10 rounded-md bg-white text-gray-400 hover:text-gray-600 focus:outline-none focus:ring-2 focus:ring-brand-1 focus:ring-offset-2"
|
|
153
153
|
onClick={() => setIsExpanded(false)}
|
|
154
154
|
>
|
|
155
155
|
<span className="sr-only">Close impressions</span>
|
|
@@ -42,7 +42,7 @@ export function useSearch(): UseSearchReturn {
|
|
|
42
42
|
const [isRetrieving, setIsRetrieving] = useState(false);
|
|
43
43
|
const [retrieveError, setRetrieveError] = useState<string | null>(null);
|
|
44
44
|
|
|
45
|
-
const searchTimerRef = useRef<NodeJS.Timeout>();
|
|
45
|
+
const searchTimerRef = useRef<NodeJS.Timeout | undefined>(undefined);
|
|
46
46
|
const lastExecutionTimeRef = useRef<number>(0);
|
|
47
47
|
const pendingQueryRef = useRef<string | null>(null);
|
|
48
48
|
const inflightQueryRef = useRef<string | null>(null);
|
|
@@ -244,7 +244,7 @@ const enableBunny = import.meta.env.PUBLIC_ENABLE_BUNNY === 'true';
|
|
|
244
244
|
document.addEventListener('astro:page-load', updateTractstackConfig);
|
|
245
245
|
</script>
|
|
246
246
|
</head>
|
|
247
|
-
<body class="font-main
|
|
247
|
+
<body class="w-full font-main">
|
|
248
248
|
<div class="overflow-hidden">
|
|
249
249
|
{!isStoryKeep && !isEditor && <HeaderWidget tenantId={tenantId} />}
|
|
250
250
|
{
|
|
@@ -271,7 +271,7 @@ const enableBunny = import.meta.env.PUBLIC_ENABLE_BUNNY === 'true';
|
|
|
271
271
|
</div>
|
|
272
272
|
<div
|
|
273
273
|
id="loading-indicator"
|
|
274
|
-
class="
|
|
274
|
+
class="fixed left-0 top-0 h-1 w-full scale-x-0 transform bg-myorange transition-transform duration-300 ease-out"
|
|
275
275
|
style="opacity: 0.5; filter: blur(0.5px); z-index: 99999;"
|
|
276
276
|
>
|
|
277
277
|
</div>
|
|
@@ -162,7 +162,7 @@ for (const [key, value] of Astro.url.searchParams) {
|
|
|
162
162
|
<section
|
|
163
163
|
id="storykeepHeader"
|
|
164
164
|
role="banner"
|
|
165
|
-
class="z-101 bg-mywhite
|
|
165
|
+
class="left-0 right-0 z-101 bg-mywhite drop-shadow transition-all duration-200"
|
|
166
166
|
>
|
|
167
167
|
<StoryKeepHeader slug={slug} isContext={false} client:only="react" />
|
|
168
168
|
</section>
|
|
@@ -173,7 +173,7 @@ for (const [key, value] of Astro.url.searchParams) {
|
|
|
173
173
|
|
|
174
174
|
<!-- Main Content Area -->
|
|
175
175
|
<main id="mainContent" class="relative flex-1 overflow-x-auto">
|
|
176
|
-
<div class="bg-myblue/20 bg-mylightgrey
|
|
176
|
+
<div class="h-full bg-myblue/20 bg-mylightgrey p-1.5">
|
|
177
177
|
<div
|
|
178
178
|
class="h-fit min-h-screen pb-96"
|
|
179
179
|
style={{
|
|
@@ -199,7 +199,7 @@ for (const [key, value] of Astro.url.searchParams) {
|
|
|
199
199
|
<!-- Floating Controls (Settings Panel & HUD OR ToolBar) -->
|
|
200
200
|
<aside
|
|
201
201
|
id="settingsControls"
|
|
202
|
-
class="
|
|
202
|
+
class="pointer-events-none fixed bottom-16 right-2 z-101 flex flex-col items-end gap-2 md:bottom-2"
|
|
203
203
|
>
|
|
204
204
|
<div class="pointer-events-none flex-grow"></div>
|
|
205
205
|
|
|
@@ -172,7 +172,7 @@ paneIds.forEach((paneId: string) => {
|
|
|
172
172
|
{Array.isArray(storyData.codeHookVisibility?.[paneId]) && (
|
|
173
173
|
<button
|
|
174
174
|
type="button"
|
|
175
|
-
class="
|
|
175
|
+
class="absolute right-2 top-2 z-10 rounded-full bg-white p-1.5 text-mydarkgrey hover:bg-black hover:text-white"
|
|
176
176
|
title="Go Back"
|
|
177
177
|
hx-post="/api/v1/state"
|
|
178
178
|
hx-trigger="click"
|
|
@@ -149,7 +149,7 @@ for (const [key, value] of Astro.url.searchParams) {
|
|
|
149
149
|
<section
|
|
150
150
|
id="storykeepHeader"
|
|
151
151
|
role="banner"
|
|
152
|
-
class="z-101 bg-mywhite
|
|
152
|
+
class="left-0 right-0 z-101 bg-mywhite drop-shadow transition-all duration-200"
|
|
153
153
|
>
|
|
154
154
|
<StoryKeepHeader slug={contextSlug} isContext={true} client:only="react" />
|
|
155
155
|
</section>
|
|
@@ -160,7 +160,7 @@ for (const [key, value] of Astro.url.searchParams) {
|
|
|
160
160
|
|
|
161
161
|
<!-- Main Content Area -->
|
|
162
162
|
<main id="mainContent" class="relative flex-1 overflow-x-auto">
|
|
163
|
-
<div class="bg-myblue/20 bg-mylightgrey
|
|
163
|
+
<div class="h-full bg-myblue/20 bg-mylightgrey p-1.5">
|
|
164
164
|
<div
|
|
165
165
|
class="h-fit min-h-screen pb-96"
|
|
166
166
|
style={{
|
|
@@ -186,7 +186,7 @@ for (const [key, value] of Astro.url.searchParams) {
|
|
|
186
186
|
<!-- Floating Controls (Settings Panel & HUD OR ToolBar) -->
|
|
187
187
|
<aside
|
|
188
188
|
id="settingsControls"
|
|
189
|
-
class="
|
|
189
|
+
class="pointer-events-none fixed bottom-16 right-2 z-101 flex flex-col items-end gap-2 md:bottom-2"
|
|
190
190
|
>
|
|
191
191
|
<div class="pointer-events-none flex-grow"></div>
|
|
192
192
|
|
|
@@ -18,7 +18,7 @@ const wordmark = getAssetPath(brandConfig?.WORDMARK, '/brand/wordmark.svg');
|
|
|
18
18
|
---
|
|
19
19
|
|
|
20
20
|
<!doctype html>
|
|
21
|
-
<html lang="en" class="bg-mywhite
|
|
21
|
+
<html lang="en" class="h-full bg-mywhite">
|
|
22
22
|
<head>
|
|
23
23
|
<meta charset="UTF-8" />
|
|
24
24
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
@@ -27,7 +27,7 @@ const wordmark = getAssetPath(brandConfig?.WORDMARK, '/brand/wordmark.svg');
|
|
|
27
27
|
<link rel="stylesheet" href="/styles/storykeep.css" />
|
|
28
28
|
</head>
|
|
29
29
|
<body class="h-full">
|
|
30
|
-
<div class="flex min-h-full flex-col justify-center py-12
|
|
30
|
+
<div class="sm:px-6 lg:px-8 flex min-h-full flex-col justify-center py-12">
|
|
31
31
|
<div class="mx-auto pb-6">
|
|
32
32
|
<div class="flex flex-col items-center justify-center gap-4">
|
|
33
33
|
<div class="h-16 w-auto">
|
|
@@ -47,7 +47,7 @@ const wordmark = getAssetPath(brandConfig?.WORDMARK, '/brand/wordmark.svg');
|
|
|
47
47
|
</div>
|
|
48
48
|
|
|
49
49
|
<h2
|
|
50
|
-
class="
|
|
50
|
+
class="mt-6 text-center text-2xl font-bold leading-9 tracking-tight text-mydarkgrey"
|
|
51
51
|
>
|
|
52
52
|
Service Temporarily Unavailable
|
|
53
53
|
</h2>
|
|
@@ -56,7 +56,7 @@ const wordmark = getAssetPath(brandConfig?.WORDMARK, '/brand/wordmark.svg');
|
|
|
56
56
|
<div class="mx-auto">
|
|
57
57
|
<div class="rounded-lg bg-white px-6 py-12 shadow-inner">
|
|
58
58
|
<div class="space-y-6 text-center">
|
|
59
|
-
<div class="
|
|
59
|
+
<div class="mx-auto h-12 w-12 text-myorange">
|
|
60
60
|
<svg
|
|
61
61
|
fill="none"
|
|
62
62
|
stroke="currentColor"
|
|
@@ -72,16 +72,16 @@ const wordmark = getAssetPath(brandConfig?.WORDMARK, '/brand/wordmark.svg');
|
|
|
72
72
|
</svg>
|
|
73
73
|
</div>
|
|
74
74
|
|
|
75
|
-
<p class="text-
|
|
75
|
+
<p class="text-sm text-mydarkgrey">
|
|
76
76
|
We're experiencing technical difficulties. The service will be
|
|
77
77
|
restored automatically.
|
|
78
78
|
</p>
|
|
79
79
|
|
|
80
80
|
<div
|
|
81
81
|
id="status-indicator"
|
|
82
|
-
class="
|
|
82
|
+
class="inline-flex items-center rounded-md border border-mylightgrey bg-white px-4 py-2 shadow-sm"
|
|
83
83
|
>
|
|
84
|
-
<div class="
|
|
84
|
+
<div class="-ml-1 mr-3 h-5 w-5 animate-spin text-myorange">
|
|
85
85
|
<svg fill="none" viewBox="0 0 24 24">
|
|
86
86
|
<circle
|
|
87
87
|
class="opacity-25"
|
|
@@ -97,12 +97,12 @@ const wordmark = getAssetPath(brandConfig?.WORDMARK, '/brand/wordmark.svg');
|
|
|
97
97
|
></path>
|
|
98
98
|
</svg>
|
|
99
99
|
</div>
|
|
100
|
-
<span class="text-
|
|
100
|
+
<span class="text-sm text-mydarkgrey"
|
|
101
101
|
>Checking service status...</span
|
|
102
102
|
>
|
|
103
103
|
</div>
|
|
104
104
|
|
|
105
|
-
<div class="text-
|
|
105
|
+
<div class="text-center text-xs text-mylightgrey">
|
|
106
106
|
<p>
|
|
107
107
|
This page will automatically refresh when the service is
|
|
108
108
|
available
|
|
@@ -48,10 +48,6 @@ const urlParams: Record<string, string | boolean> = {};
|
|
|
48
48
|
for (const [key, value] of Astro.url.searchParams) {
|
|
49
49
|
urlParams[key] = value === '' ? true : value;
|
|
50
50
|
}
|
|
51
|
-
|
|
52
|
-
const hasProfile = Astro.request.headers
|
|
53
|
-
.get('cookie')
|
|
54
|
-
?.includes('tractstack_profile=true');
|
|
55
51
|
---
|
|
56
52
|
|
|
57
53
|
<Layout
|
|
@@ -81,71 +77,64 @@ const hasProfile = Astro.request.headers
|
|
|
81
77
|
menu={null}
|
|
82
78
|
/>
|
|
83
79
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
80
|
+
<section
|
|
81
|
+
id="storykeepHeader"
|
|
82
|
+
role="banner"
|
|
83
|
+
class="left-0 right-0 z-101 bg-mywhite drop-shadow transition-all duration-200"
|
|
84
|
+
>
|
|
85
|
+
<StoryKeepHeader
|
|
86
|
+
slug="sandbox"
|
|
87
|
+
isContext={false}
|
|
88
|
+
isSandboxMode={true}
|
|
89
|
+
client:only="react"
|
|
90
|
+
/>
|
|
91
|
+
</section>
|
|
92
|
+
|
|
93
|
+
<div class="flex min-h-screen">
|
|
94
|
+
<StoryKeepToolMode isContext={false} client:only="react" />
|
|
95
|
+
|
|
96
|
+
<main id="mainContent" class="relative flex-1 overflow-x-auto">
|
|
97
|
+
<div class="h-full bg-myblue/20 bg-mylightgrey p-1.5">
|
|
98
|
+
<div
|
|
99
|
+
class="h-fit min-h-screen pb-96"
|
|
100
|
+
style={{
|
|
101
|
+
backgroundImage:
|
|
102
|
+
'repeating-linear-gradient(135deg, transparent, transparent 10px, rgba(0,0,0,0.05) 10px, rgba(0,0,0,0.05) 20px)',
|
|
103
|
+
}}
|
|
91
104
|
>
|
|
92
|
-
<
|
|
93
|
-
|
|
94
|
-
|
|
105
|
+
<Compositor
|
|
106
|
+
id={storyFragmentID}
|
|
107
|
+
nodes={loadData}
|
|
108
|
+
config={brandConfig}
|
|
109
|
+
fullContentMap={fullContentMap}
|
|
110
|
+
fullCanonicalURL="/sandbox"
|
|
111
|
+
urlParams={urlParams}
|
|
112
|
+
availableCodeHooks={Object.keys(codeHookComponents)}
|
|
95
113
|
isSandboxMode={true}
|
|
96
114
|
client:only="react"
|
|
97
115
|
/>
|
|
98
|
-
</section>
|
|
99
|
-
|
|
100
|
-
<div class="flex min-h-screen">
|
|
101
|
-
<StoryKeepToolMode isContext={false} client:only="react" />
|
|
102
|
-
|
|
103
|
-
<main id="mainContent" class="relative flex-1 overflow-x-auto">
|
|
104
|
-
<div class="bg-myblue/20 bg-mylightgrey h-full p-1.5">
|
|
105
|
-
<div
|
|
106
|
-
class="h-fit min-h-screen pb-96"
|
|
107
|
-
style={{
|
|
108
|
-
backgroundImage:
|
|
109
|
-
'repeating-linear-gradient(135deg, transparent, transparent 10px, rgba(0,0,0,0.05) 10px, rgba(0,0,0,0.05) 20px)',
|
|
110
|
-
}}
|
|
111
|
-
>
|
|
112
|
-
<Compositor
|
|
113
|
-
id={storyFragmentID}
|
|
114
|
-
nodes={loadData}
|
|
115
|
-
config={brandConfig}
|
|
116
|
-
fullContentMap={fullContentMap}
|
|
117
|
-
fullCanonicalURL="/sandbox"
|
|
118
|
-
urlParams={urlParams}
|
|
119
|
-
availableCodeHooks={Object.keys(codeHookComponents)}
|
|
120
|
-
isSandboxMode={true}
|
|
121
|
-
client:only="react"
|
|
122
|
-
/>
|
|
123
|
-
</div>
|
|
124
|
-
</div>
|
|
125
|
-
</main>
|
|
126
116
|
</div>
|
|
117
|
+
</div>
|
|
118
|
+
</main>
|
|
119
|
+
</div>
|
|
127
120
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
121
|
+
<aside
|
|
122
|
+
id="settingsControls"
|
|
123
|
+
class="pointer-events-none fixed bottom-16 right-2 z-101 flex flex-col items-end gap-2 md:bottom-2"
|
|
124
|
+
>
|
|
125
|
+
<div class="pointer-events-none flex-grow"></div>
|
|
133
126
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
127
|
+
<div class="pointer-events-auto flex-shrink-0">
|
|
128
|
+
<StoryKeepToolBar client:only="react" />
|
|
129
|
+
</div>
|
|
137
130
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
</aside>
|
|
146
|
-
</>
|
|
147
|
-
)
|
|
148
|
-
}
|
|
131
|
+
<div class="pointer-events-auto max-h-full">
|
|
132
|
+
<SettingsPanel
|
|
133
|
+
availableCodeHooks={Object.keys(codeHookComponents)}
|
|
134
|
+
client:only="react"
|
|
135
|
+
/>
|
|
136
|
+
</div>
|
|
137
|
+
</aside>
|
|
149
138
|
</Layout>
|
|
150
139
|
|
|
151
140
|
<script>
|
|
@@ -39,7 +39,7 @@ const mainStylesUrl = isDev
|
|
|
39
39
|
---
|
|
40
40
|
|
|
41
41
|
<!doctype html>
|
|
42
|
-
<html lang="en" class="bg-mywhite
|
|
42
|
+
<html lang="en" class="h-full bg-mywhite">
|
|
43
43
|
<head>
|
|
44
44
|
<meta charset="UTF-8" />
|
|
45
45
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
@@ -48,7 +48,7 @@ const mainStylesUrl = isDev
|
|
|
48
48
|
<link rel="stylesheet" href={mainStylesUrl} />
|
|
49
49
|
</head>
|
|
50
50
|
<body class="h-full">
|
|
51
|
-
<div class="flex min-h-full flex-col justify-center py-12
|
|
51
|
+
<div class="sm:px-6 lg:px-8 flex min-h-full flex-col justify-center py-12">
|
|
52
52
|
<div class="mx-auto pb-6">
|
|
53
53
|
<!-- Logo and Wordmark -->
|
|
54
54
|
<div class="flex flex-col items-center justify-center gap-4">
|
|
@@ -69,7 +69,7 @@ const mainStylesUrl = isDev
|
|
|
69
69
|
</div>
|
|
70
70
|
|
|
71
71
|
<h2
|
|
72
|
-
class="
|
|
72
|
+
class="mt-6 text-center text-2xl font-bold leading-9 tracking-tight text-mydarkgrey"
|
|
73
73
|
>
|
|
74
74
|
Sign in to your Storykeep
|
|
75
75
|
</h2>
|
|
@@ -113,7 +113,7 @@ const mainStylesUrl = isDev
|
|
|
113
113
|
<div>
|
|
114
114
|
<label
|
|
115
115
|
for="password"
|
|
116
|
-
class="
|
|
116
|
+
class="block text-sm font-bold leading-6 text-mydarkgrey"
|
|
117
117
|
>
|
|
118
118
|
Password
|
|
119
119
|
</label>
|
|
@@ -123,7 +123,7 @@ const mainStylesUrl = isDev
|
|
|
123
123
|
name="password"
|
|
124
124
|
type="password"
|
|
125
125
|
required
|
|
126
|
-
class="
|
|
126
|
+
class="sm:text-sm sm:leading-6 block w-full rounded-md border-0 px-3 py-1.5 text-mydarkgrey shadow-sm ring-1 ring-inset ring-mylightgrey placeholder:text-mylightgrey focus:ring-2 focus:ring-inset focus:ring-myorange"
|
|
127
127
|
/>
|
|
128
128
|
</div>
|
|
129
129
|
</div>
|
|
@@ -139,7 +139,7 @@ const mainStylesUrl = isDev
|
|
|
139
139
|
<button
|
|
140
140
|
type="button"
|
|
141
141
|
id="submitButton"
|
|
142
|
-
class="
|
|
142
|
+
class="flex w-full justify-center rounded-md bg-myblue px-3 py-1.5 text-sm font-bold leading-6 text-white shadow-sm hover:bg-myorange focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-myorange"
|
|
143
143
|
>
|
|
144
144
|
Sign in
|
|
145
145
|
</button>
|
|
@@ -17,8 +17,9 @@ export interface StringInputProps extends BaseFormComponentProps<string> {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
// String array input props (for tags/chips)
|
|
20
|
-
export interface StringArrayInputProps
|
|
21
|
-
|
|
20
|
+
export interface StringArrayInputProps extends BaseFormComponentProps<
|
|
21
|
+
string[]
|
|
22
|
+
> {
|
|
22
23
|
maxItems?: number;
|
|
23
24
|
allowDuplicates?: boolean;
|
|
24
25
|
separator?: string; // For parsing pasted content
|
|
@@ -151,8 +152,9 @@ export interface StringInputProps extends BaseFormComponentProps<string> {
|
|
|
151
152
|
}
|
|
152
153
|
|
|
153
154
|
// String array input props (for tags/chips)
|
|
154
|
-
export interface StringArrayInputProps
|
|
155
|
-
|
|
155
|
+
export interface StringArrayInputProps extends BaseFormComponentProps<
|
|
156
|
+
string[]
|
|
157
|
+
> {
|
|
156
158
|
maxItems?: number;
|
|
157
159
|
allowDuplicates?: boolean;
|
|
158
160
|
separator?: string; // For parsing pasted content
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { MouseEvent } from 'react';
|
|
2
1
|
import { NodesContext } from '@/stores/nodes';
|
|
3
2
|
import type { BrandConfig } from './tractstack';
|
|
4
3
|
import type { Tag } from './compositorTypes';
|
|
4
|
+
import type { MouseEvent, JSX } from 'react';
|
|
5
5
|
|
|
6
6
|
export interface WidgetProps {
|
|
7
7
|
nodeId: string;
|
|
@@ -66,8 +66,7 @@ export interface TractStackEvent {
|
|
|
66
66
|
|
|
67
67
|
// Fragment component props
|
|
68
68
|
export interface FragmentProps
|
|
69
|
-
extends BaseComponentProps,
|
|
70
|
-
Partial<HTMXAttributes> {
|
|
69
|
+
extends BaseComponentProps, Partial<HTMXAttributes> {
|
|
71
70
|
/** Fragment ID */
|
|
72
71
|
fragmentId?: string;
|
|
73
72
|
|
|
@@ -85,7 +85,7 @@ export const canEditText = (props: NodeTagProps): boolean => {
|
|
|
85
85
|
const parentIsButton = getCtx(props).getParentNodeByTagNames(nodeId, ['a']);
|
|
86
86
|
if (parentIsButton?.length > 0) return false;
|
|
87
87
|
|
|
88
|
-
if (forbiddenEditTags.has(props.tagName)) return false;
|
|
88
|
+
if (forbiddenEditTags.has(props.tagName as string)) return false;
|
|
89
89
|
return true;
|
|
90
90
|
};
|
|
91
91
|
|
|
@@ -70,9 +70,9 @@ export const isContextPaneNode = (
|
|
|
70
70
|
): node is PaneNode & { isContextPane: boolean } => {
|
|
71
71
|
return Boolean(
|
|
72
72
|
node?.nodeType === 'Pane' &&
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
73
|
+
'isContextPane' in node &&
|
|
74
|
+
typeof node.isContextPane === 'boolean' &&
|
|
75
|
+
node.isContextPane
|
|
76
76
|
);
|
|
77
77
|
};
|
|
78
78
|
|