astro-tractstack 2.0.0-rc.9 → 2.0.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/LICENSE +8 -97
- package/README.md +7 -5
- package/bin/create-tractstack.js +31 -8
- package/dist/index.js +106 -29
- package/package.json +10 -5
- package/templates/css/frontend.css +1 -1
- package/templates/custom/minimal/CodeHook.astro +13 -12
- package/templates/custom/minimal/CustomRoutes.astro +25 -31
- package/templates/custom/with-examples/CodeHook.astro +22 -11
- package/templates/custom/with-examples/CustomRoutes.astro +4 -8
- package/templates/custom/with-examples/ProductCard.astro +29 -0
- package/templates/custom/with-examples/ProductCardWrapper.astro +43 -0
- package/templates/custom/with-examples/ProductGrid.astro +64 -0
- package/templates/custom/with-examples/pages/Collections.astro +58 -98
- package/templates/gitignore +42 -0
- package/templates/prettierignore +5 -0
- package/templates/prettierrc +19 -0
- package/templates/src/client/app.js +127 -0
- package/templates/src/client/htmx.min.js +3519 -0
- package/templates/src/client/view.js +429 -0
- package/templates/src/components/Footer.astro +4 -9
- package/templates/src/components/Header.astro +67 -60
- package/templates/src/components/Menu.tsx +188 -52
- package/templates/src/components/codehooks/BunnyVideoSetup.tsx +2 -2
- 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 +10 -9
- package/templates/src/components/codehooks/FeaturedArticle.astro +105 -0
- package/templates/src/components/codehooks/FeaturedArticleSetup.tsx +318 -0
- package/templates/src/components/codehooks/ListContent.astro +32 -162
- package/templates/src/components/codehooks/ListContentSetup.tsx +43 -138
- package/templates/src/components/codehooks/ProductCardSetup.tsx +152 -0
- package/templates/src/components/codehooks/ProductGridSetup.tsx +274 -0
- package/templates/src/components/codehooks/SearchWidget.tsx +453 -0
- package/templates/src/components/compositor/Node.tsx +3 -6
- package/templates/src/components/compositor/PanelVisibilityWrapper.tsx +21 -11
- package/templates/src/components/compositor/elements/BunnyVideo.tsx +21 -20
- package/templates/src/components/compositor/nodes/Pane.tsx +51 -21
- package/templates/src/components/compositor/nodes/RenderChildren.tsx +6 -1
- package/templates/src/components/compositor/nodes/Widget.tsx +16 -2
- package/templates/src/components/compositor/preview/FeaturedArticlePreview.tsx +155 -0
- package/templates/src/components/compositor/preview/PaneSnapshotGenerator.tsx +20 -1
- package/templates/src/components/edit/Header.tsx +10 -4
- package/templates/src/components/edit/PanelSwitch.tsx +11 -7
- package/templates/src/components/edit/SettingsPanel.tsx +29 -18
- package/templates/src/components/edit/ToolBar.tsx +1 -28
- package/templates/src/components/edit/ToolMode.tsx +45 -32
- package/templates/src/components/edit/pane/AddPanePanel_break.tsx +12 -2
- package/templates/src/components/edit/pane/AddPanePanel_codehook.tsx +8 -2
- package/templates/src/components/edit/pane/AddPanePanel_newAICopy_modal.tsx +1 -1
- package/templates/src/components/edit/pane/ConfigPanePanel.tsx +17 -27
- package/templates/src/components/edit/pane/PageGenSelector.tsx +16 -16
- package/templates/src/components/edit/pane/PageGenSpecial.tsx +26 -49
- package/templates/src/components/edit/pane/PageGen_preview.tsx +17 -2
- package/templates/src/components/edit/pane/PanePanel_path.tsx +2 -4
- package/templates/src/components/edit/pane/PanePanel_title.tsx +243 -76
- package/templates/src/components/edit/panels/StyleBreakPanel.tsx +17 -19
- package/templates/src/components/edit/panels/StyleCodeHookPanel.tsx +48 -37
- package/templates/src/components/edit/panels/StyleElementPanel_add.tsx +60 -55
- package/templates/src/components/edit/panels/StyleImagePanel_add.tsx +56 -50
- package/templates/src/components/edit/panels/StyleLiElementPanel_add.tsx +54 -47
- package/templates/src/components/edit/panels/StyleLinkPanel_add.tsx +54 -44
- package/templates/src/components/edit/panels/StyleLinkPanel_config.tsx +113 -138
- package/templates/src/components/edit/panels/StyleParentPanel_add.tsx +54 -40
- package/templates/src/components/edit/panels/StyleWidgetPanel.tsx +3 -3
- package/templates/src/components/edit/panels/StyleWidgetPanel_add.tsx +56 -49
- package/templates/src/components/edit/panels/StyleWidgetPanel_config.tsx +14 -5
- package/templates/src/components/edit/state/SaveModal.tsx +316 -169
- package/templates/src/components/edit/storyfragment/StoryFragmentPanel_og.tsx +1 -1
- package/templates/src/components/edit/storyfragment/StoryFragmentPanel_slug.tsx +56 -55
- package/templates/src/components/edit/widgets/BunnyWidget.tsx +538 -59
- package/templates/src/components/edit/widgets/InteractiveDisclosureWidget.tsx +656 -0
- package/templates/src/components/edit/widgets/ToggleWidget.tsx +9 -16
- package/templates/src/components/fields/ArtpackImage.tsx +4 -1
- package/templates/src/components/fields/BackgroundImage.tsx +1 -1
- package/templates/src/components/fields/BackgroundImageWrapper.tsx +127 -35
- package/templates/src/components/fields/ColorPickerCombo.tsx +66 -62
- package/templates/src/components/fields/ImageUpload.tsx +1 -1
- package/templates/src/components/fields/ViewportComboBox.tsx +59 -42
- package/templates/src/components/form/ActionBuilderBeliefSelector.tsx +117 -0
- package/templates/src/components/form/ActionBuilderField.tsx +306 -87
- package/templates/src/components/search/SearchModal.tsx +420 -0
- package/templates/src/components/search/SearchResults.tsx +367 -0
- package/templates/src/components/search/SearchWrapper.tsx +46 -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 +1 -1
- package/templates/src/components/storykeep/Dashboard_Content.tsx +6 -0
- package/templates/src/components/storykeep/StoryKeepBackdrop.astro +87 -0
- package/templates/src/components/storykeep/controls/content/BeliefForm.tsx +38 -34
- package/templates/src/components/storykeep/controls/content/KnownResourceForm.tsx +1 -1
- package/templates/src/components/storykeep/controls/content/MenuForm.tsx +56 -8
- package/templates/src/components/storykeep/controls/content/ResourceForm.tsx +18 -3
- package/templates/src/components/storykeep/controls/content/StoryFragmentTable.tsx +5 -8
- package/templates/src/components/storykeep/state/FetchAnalytics.tsx +274 -228
- package/templates/src/components/storykeep/widgets/Wizard.tsx +14 -7
- package/templates/src/components/widgets/ImpressionWrapper.tsx +0 -1
- package/templates/src/constants/shapes.ts +9 -0
- package/templates/src/constants.ts +2121 -16
- package/templates/src/hooks/useSearch.ts +228 -0
- package/templates/src/layouts/Layout.astro +213 -104
- package/templates/src/lib/storyData.ts +4 -1
- package/templates/src/pages/[...slug]/edit.astro +14 -14
- package/templates/src/pages/[...slug].astro +82 -21
- package/templates/src/pages/api/orphan-analysis.ts +0 -1
- package/templates/src/pages/api/tailwind.ts +23 -21
- package/templates/src/pages/context/[...contextSlug]/edit.astro +14 -14
- package/templates/src/pages/context/[...contextSlug].astro +7 -2
- package/templates/src/pages/storykeep/advanced.astro +5 -4
- package/templates/src/pages/storykeep/branding.astro +5 -4
- package/templates/src/pages/storykeep/content.astro +5 -4
- package/templates/src/pages/storykeep/init.astro +40 -1
- package/templates/src/pages/storykeep/login.astro +1 -1
- package/templates/src/pages/storykeep.astro +5 -4
- package/templates/src/stores/nodes.ts +59 -88
- package/templates/src/stores/orphanAnalysis.ts +19 -21
- package/templates/src/stores/storykeep.ts +7 -0
- package/templates/src/types/compositorTypes.ts +6 -0
- package/templates/src/types/tractstack.ts +17 -0
- package/templates/src/utils/actions/lispLexer.ts +2 -2
- package/templates/src/utils/actions/preParse_Action.ts +3 -0
- package/templates/src/utils/api/beliefHelpers.ts +12 -36
- package/templates/src/utils/api/menuHelpers.ts +2 -2
- package/templates/src/utils/api.ts +26 -0
- package/templates/src/utils/compositor/TemplateNodes.ts +7 -0
- package/templates/src/utils/compositor/allowInsert.ts +5 -3
- package/templates/src/utils/compositor/nodesHelper.ts +4 -0
- package/templates/src/utils/compositor/processMarkdown.ts +16 -2
- package/templates/src/utils/compositor/reduceNodesClassNames.ts +4 -0
- package/templates/src/utils/compositor/templateMarkdownStyles.ts +13 -13
- package/templates/src/utils/compositor/typeGuards.ts +1 -0
- package/templates/src/utils/customHelpers.ts +38 -0
- package/templates/src/utils/helpers.ts +2 -2
- package/templates/src/utils/layout.ts +65 -144
- package/utils/inject-files.ts +95 -18
- package/templates/src/client/analytics-events.js +0 -207
- package/templates/src/client/belief-events.js +0 -191
- package/templates/src/client/sse.js +0 -613
- package/templates/src/components/codehooks/FeaturedContent.astro +0 -273
- package/templates/src/components/codehooks/FeaturedContentSetup.tsx +0 -738
- package/templates/src/components/compositor/preview/FeaturedContentPreview.tsx +0 -128
- package/templates/src/components/edit/pane/PanePanel_slug.tsx +0 -219
|
@@ -1,110 +1,70 @@
|
|
|
1
1
|
---
|
|
2
|
-
import
|
|
3
|
-
|
|
2
|
+
import CustomRoutes, { routes } from '@/custom/CustomRoutes.astro';
|
|
3
|
+
import { preHealthCheck } from '@/utils/backend';
|
|
4
|
+
//import type { ResourceNode } from '@/types/compositorTypes';
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
const tenantId =
|
|
7
|
+
Astro.locals.tenant?.id || import.meta.env.PUBLIC_TENANTID || 'default';
|
|
8
|
+
|
|
9
|
+
const healthCheckRedirect = await preHealthCheck(tenantId);
|
|
10
|
+
if (healthCheckRedirect !== undefined) {
|
|
11
|
+
return healthCheckRedirect;
|
|
10
12
|
}
|
|
11
13
|
|
|
12
|
-
const {
|
|
14
|
+
const { param1 } = Astro.params;
|
|
15
|
+
// this needs to match the url path
|
|
16
|
+
const route = `collections`;
|
|
13
17
|
|
|
14
|
-
//
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
// if (menuResponse.ok) {
|
|
22
|
-
// menuPayload = await menuResponse.json();
|
|
23
|
-
// }
|
|
24
|
-
//} catch (error) {
|
|
25
|
-
// console.error('Error fetching menu:', error);
|
|
26
|
-
//}
|
|
18
|
+
// Check if route is enabled
|
|
19
|
+
if (!param1 || !routes[route]) {
|
|
20
|
+
return new Response(null, {
|
|
21
|
+
status: 404,
|
|
22
|
+
statusText: 'Not Found',
|
|
23
|
+
});
|
|
24
|
+
}
|
|
27
25
|
|
|
28
|
-
|
|
29
|
-
const
|
|
30
|
-
const activeResource = categoryResources.find(
|
|
31
|
-
(resource: any) => resource.slug === targetSlug
|
|
32
|
-
);
|
|
26
|
+
// include all resource categories here
|
|
27
|
+
const CATEGORIES = [`collections`];
|
|
33
28
|
|
|
34
|
-
|
|
35
|
-
|
|
29
|
+
let resources = [];
|
|
30
|
+
const goBackend = import.meta.env.PUBLIC_GO_BACKEND || 'http://localhost:8080';
|
|
36
31
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
</div>
|
|
32
|
+
try {
|
|
33
|
+
const resourcesResponse = await fetch(`${goBackend}/api/v1/nodes/resources`, {
|
|
34
|
+
method: 'POST',
|
|
35
|
+
headers: { 'Content-Type': 'application/json', 'X-Tenant-ID': tenantId },
|
|
36
|
+
body: JSON.stringify({ categories: CATEGORIES }),
|
|
37
|
+
});
|
|
44
38
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
39
|
+
if (resourcesResponse.ok) {
|
|
40
|
+
const responseData = await resourcesResponse.json();
|
|
41
|
+
if (responseData.resources) {
|
|
42
|
+
resources = responseData.resources;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
} catch (error) {
|
|
46
|
+
console.error('Error fetching resources:', error);
|
|
47
|
+
return new Response(null, {
|
|
48
|
+
status: 500,
|
|
49
|
+
statusText: 'Internal Server Error',
|
|
50
|
+
});
|
|
51
|
+
}
|
|
53
52
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
<p>Slug: {activeResource.slug}</p>
|
|
63
|
-
<p>Category: {activeResource.categorySlug || 'none'}</p>
|
|
64
|
-
</div>
|
|
65
|
-
</div>
|
|
66
|
-
) : (
|
|
67
|
-
<div class="mb-6 rounded-lg bg-yellow-50 p-6">
|
|
68
|
-
<p class="text-yellow-800">
|
|
69
|
-
No active resource found for slug: {targetSlug}
|
|
70
|
-
</p>
|
|
71
|
-
</div>
|
|
72
|
-
)}
|
|
53
|
+
/*
|
|
54
|
+
if (!resources.length) {
|
|
55
|
+
return new Response(null, {
|
|
56
|
+
status: 404,
|
|
57
|
+
statusText: 'Not Found',
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
*/
|
|
73
61
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
All Resources in Category ({categoryResources.length})
|
|
77
|
-
</h3>
|
|
78
|
-
{categoryResources.length > 0 ? (
|
|
79
|
-
<div class="grid gap-4 md:grid-cols-2">
|
|
80
|
-
{categoryResources.map((resource: any) => (
|
|
81
|
-
<div class="rounded border bg-white p-4">
|
|
82
|
-
<h4 class="font-bold text-gray-900">{resource.title}</h4>
|
|
83
|
-
<p class="mt-1 text-sm text-gray-600">
|
|
84
|
-
{resource.oneliner}
|
|
85
|
-
</p>
|
|
86
|
-
<div class="mt-2 text-xs text-gray-500">
|
|
87
|
-
<p>Slug: {resource.slug}</p>
|
|
88
|
-
{resource.categorySlug && (
|
|
89
|
-
<p>Category: {resource.categorySlug}</p>
|
|
90
|
-
)}
|
|
91
|
-
</div>
|
|
92
|
-
</div>
|
|
93
|
-
))}
|
|
94
|
-
</div>
|
|
95
|
-
) : (
|
|
96
|
-
<p class="text-gray-500">
|
|
97
|
-
No resources found in this category.
|
|
98
|
-
</p>
|
|
99
|
-
)}
|
|
100
|
-
</div>
|
|
101
|
-
</div>
|
|
102
|
-
) : null
|
|
103
|
-
}
|
|
104
|
-
</div>
|
|
105
|
-
</main>
|
|
62
|
+
const pageTitle = `${route} collection`;
|
|
63
|
+
---
|
|
106
64
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
65
|
+
<div class="border-b bg-gray-100 p-4">
|
|
66
|
+
<h1 class="text-2xl font-bold">{pageTitle}</h1>
|
|
67
|
+
<p class="text-sm text-gray-600">
|
|
68
|
+
Collections page - slug: {param1}
|
|
69
|
+
</p>
|
|
70
|
+
</div>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Build output
|
|
2
|
+
dist/
|
|
3
|
+
*.tgz
|
|
4
|
+
#*.d.ts
|
|
5
|
+
|
|
6
|
+
# Dependencies
|
|
7
|
+
node_modules/
|
|
8
|
+
|
|
9
|
+
# Environment
|
|
10
|
+
.env
|
|
11
|
+
.env.local
|
|
12
|
+
.env.*.local
|
|
13
|
+
|
|
14
|
+
# IDE
|
|
15
|
+
.vscode/
|
|
16
|
+
.idea/
|
|
17
|
+
*.swp
|
|
18
|
+
*.swo
|
|
19
|
+
|
|
20
|
+
# OS
|
|
21
|
+
.DS_Store
|
|
22
|
+
Thumbs.db
|
|
23
|
+
|
|
24
|
+
# Logs
|
|
25
|
+
*.log
|
|
26
|
+
npm-debug.log*
|
|
27
|
+
yarn-debug.log*
|
|
28
|
+
yarn-error.log*
|
|
29
|
+
pnpm-debug.log*
|
|
30
|
+
|
|
31
|
+
# Runtime data
|
|
32
|
+
pids
|
|
33
|
+
*.pid
|
|
34
|
+
*.seed
|
|
35
|
+
*.pid.lock
|
|
36
|
+
|
|
37
|
+
# Coverage directory used by tools like istanbul
|
|
38
|
+
coverage/
|
|
39
|
+
|
|
40
|
+
# Temporary folders
|
|
41
|
+
tmp/
|
|
42
|
+
temp/
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"semi": true,
|
|
3
|
+
"singleQuote": true,
|
|
4
|
+
"tabWidth": 2,
|
|
5
|
+
"trailingComma": "es5",
|
|
6
|
+
"printWidth": 80,
|
|
7
|
+
"plugins": [
|
|
8
|
+
"prettier-plugin-astro",
|
|
9
|
+
"prettier-plugin-tailwindcss"
|
|
10
|
+
],
|
|
11
|
+
"overrides": [
|
|
12
|
+
{
|
|
13
|
+
"files": "*.astro",
|
|
14
|
+
"options": {
|
|
15
|
+
"parser": "astro"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
]
|
|
19
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TractStack Singleton Application Manager
|
|
3
|
+
*
|
|
4
|
+
* This script is loaded with `is:persist` and runs only once per session.
|
|
5
|
+
* Its purpose is to manage long-lived application state and services,
|
|
6
|
+
* primarily the Server-Sent Events (SSE) connection. It provides a stable
|
|
7
|
+
* API on `window.TractStackApp` for transient view scripts to interact with.
|
|
8
|
+
* It is completely decoupled from the DOM and HTMX.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const VERBOSE = false;
|
|
12
|
+
|
|
13
|
+
function log(message, ...args) {
|
|
14
|
+
if (VERBOSE) console.log('✅ SINGLETON [app.js]:', message, ...args);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function logError(message, ...args) {
|
|
18
|
+
if (VERBOSE) console.error('❌ SINGLETON [app.js]:', message, ...args);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (!window.TractStackApp) {
|
|
22
|
+
log('INITIALIZING SINGLETON for the first time.');
|
|
23
|
+
|
|
24
|
+
const TractStackApp = {
|
|
25
|
+
config: {},
|
|
26
|
+
eventSource: null,
|
|
27
|
+
|
|
28
|
+
initialize(config) {
|
|
29
|
+
log('Initializing with config from first page load.', config);
|
|
30
|
+
this.config = config;
|
|
31
|
+
if (config.sessionId && !this.eventSource) {
|
|
32
|
+
this.startSSE();
|
|
33
|
+
} else {
|
|
34
|
+
log(
|
|
35
|
+
'SSE connection not started: missing sessionId or already connected.'
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
updateConfig(newConfig) {
|
|
41
|
+
const oldStoryfragmentId = this.config.storyfragmentId;
|
|
42
|
+
this.config = { ...this.config, ...newConfig };
|
|
43
|
+
log('Configuration updated due to page navigation.', {
|
|
44
|
+
newConfig,
|
|
45
|
+
storyfragmentIdChanged:
|
|
46
|
+
oldStoryfragmentId !== newConfig.storyfragmentId,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
if (this.config.sessionId && !this.eventSource) {
|
|
50
|
+
log(
|
|
51
|
+
'Session ID became available after navigation. Starting SSE connection.'
|
|
52
|
+
);
|
|
53
|
+
this.startSSE();
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
getConfig() {
|
|
58
|
+
return this.config;
|
|
59
|
+
},
|
|
60
|
+
|
|
61
|
+
startSSE() {
|
|
62
|
+
if (this.eventSource) {
|
|
63
|
+
log('Closing existing SSE connection before starting a new one.');
|
|
64
|
+
this.eventSource.close();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const { backendUrl, sessionId, storyfragmentId, tenantId } = this.config;
|
|
68
|
+
if (!sessionId || !tenantId) {
|
|
69
|
+
logError('Cannot start SSE connection: missing sessionId or tenantId.');
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const sseUrl = `${backendUrl}/api/v1/auth/sse?sessionId=${sessionId}&storyfragmentId=${storyfragmentId}&tenantId=${tenantId}`;
|
|
74
|
+
log('Attempting to establish SSE connection...', { url: sseUrl });
|
|
75
|
+
|
|
76
|
+
this.eventSource = new EventSource(sseUrl);
|
|
77
|
+
|
|
78
|
+
this.eventSource.onopen = () => {
|
|
79
|
+
log('SSE Connection opened successfully.');
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
this.eventSource.onerror = (error) => {
|
|
83
|
+
logError('SSE Connection error occurred.', error);
|
|
84
|
+
this.eventSource.close();
|
|
85
|
+
this.eventSource = null;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
this.eventSource.addEventListener('panes_updated', (event) => {
|
|
89
|
+
try {
|
|
90
|
+
const data = JSON.parse(event.data);
|
|
91
|
+
log('Received `panes_updated` event from server.', data);
|
|
92
|
+
|
|
93
|
+
log(
|
|
94
|
+
'Dispatching `tractstack:panes-updated` CustomEvent to the window.'
|
|
95
|
+
);
|
|
96
|
+
window.dispatchEvent(
|
|
97
|
+
new CustomEvent('tractstack:panes-updated', { detail: data })
|
|
98
|
+
);
|
|
99
|
+
} catch (error) {
|
|
100
|
+
logError('Failed to parse `panes_updated` event data.', {
|
|
101
|
+
error,
|
|
102
|
+
rawData: event.data,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
window.TractStackApp = TractStackApp;
|
|
110
|
+
|
|
111
|
+
if (window.TRACTSTACK_CONFIG) {
|
|
112
|
+
window.TractStackApp.initialize(window.TRACTSTACK_CONFIG);
|
|
113
|
+
} else {
|
|
114
|
+
logError('Initial config not found at singleton creation time.');
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
document.addEventListener('astro:page-load', () => {
|
|
118
|
+
log('`astro:page-load` detected. Updating internal config.');
|
|
119
|
+
if (window.TRACTSTACK_CONFIG) {
|
|
120
|
+
window.TractStackApp.updateConfig(window.TRACTSTACK_CONFIG);
|
|
121
|
+
} else {
|
|
122
|
+
logError(
|
|
123
|
+
'`astro:page-load` fired, but `window.TRACTSTACK_CONFIG` was not found!'
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|