astro-tractstack 2.0.0-rc.8 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/LICENSE +8 -97
  2. package/README.md +7 -5
  3. package/bin/create-tractstack.js +35 -11
  4. package/dist/index.js +106 -29
  5. package/package.json +10 -5
  6. package/templates/css/frontend.css +1 -1
  7. package/templates/custom/minimal/CodeHook.astro +13 -12
  8. package/templates/custom/minimal/CustomRoutes.astro +25 -31
  9. package/templates/custom/with-examples/CodeHook.astro +22 -11
  10. package/templates/custom/with-examples/CustomRoutes.astro +4 -8
  11. package/templates/custom/with-examples/ProductCard.astro +29 -0
  12. package/templates/custom/with-examples/ProductCardWrapper.astro +43 -0
  13. package/templates/custom/with-examples/ProductGrid.astro +64 -0
  14. package/templates/custom/with-examples/pages/Collections.astro +58 -98
  15. package/templates/gitignore +42 -0
  16. package/templates/prettierignore +5 -0
  17. package/templates/prettierrc +19 -0
  18. package/templates/src/client/app.js +127 -0
  19. package/templates/src/client/htmx.min.js +3519 -0
  20. package/templates/src/client/view.js +429 -0
  21. package/templates/src/components/Footer.astro +4 -9
  22. package/templates/src/components/Header.astro +67 -60
  23. package/templates/src/components/Menu.tsx +188 -52
  24. package/templates/src/components/codehooks/BunnyVideoSetup.tsx +2 -2
  25. package/templates/src/components/codehooks/EpinetDurationSelector.tsx +9 -13
  26. package/templates/src/components/codehooks/EpinetTableView.tsx +11 -7
  27. package/templates/src/components/codehooks/EpinetWrapper.tsx +1 -0
  28. package/templates/src/components/codehooks/FeaturedArticle.astro +105 -0
  29. package/templates/src/components/codehooks/FeaturedArticleSetup.tsx +318 -0
  30. package/templates/src/components/codehooks/ListContent.astro +32 -162
  31. package/templates/src/components/codehooks/ListContentSetup.tsx +43 -138
  32. package/templates/src/components/codehooks/ProductCardSetup.tsx +152 -0
  33. package/templates/src/components/codehooks/ProductGridSetup.tsx +274 -0
  34. package/templates/src/components/codehooks/SearchWidget.tsx +453 -0
  35. package/templates/src/components/compositor/Node.tsx +3 -6
  36. package/templates/src/components/compositor/PanelVisibilityWrapper.tsx +21 -11
  37. package/templates/src/components/compositor/elements/BunnyVideo.tsx +21 -20
  38. package/templates/src/components/compositor/nodes/Pane.tsx +51 -21
  39. package/templates/src/components/compositor/nodes/RenderChildren.tsx +6 -1
  40. package/templates/src/components/compositor/nodes/Widget.tsx +16 -2
  41. package/templates/src/components/compositor/preview/FeaturedArticlePreview.tsx +155 -0
  42. package/templates/src/components/compositor/preview/PaneSnapshotGenerator.tsx +20 -1
  43. package/templates/src/components/edit/Header.tsx +10 -4
  44. package/templates/src/components/edit/PanelSwitch.tsx +11 -7
  45. package/templates/src/components/edit/SettingsPanel.tsx +29 -18
  46. package/templates/src/components/edit/ToolBar.tsx +1 -28
  47. package/templates/src/components/edit/ToolMode.tsx +45 -32
  48. package/templates/src/components/edit/pane/AddPanePanel_break.tsx +12 -2
  49. package/templates/src/components/edit/pane/AddPanePanel_codehook.tsx +8 -2
  50. package/templates/src/components/edit/pane/AddPanePanel_newAICopy_modal.tsx +1 -1
  51. package/templates/src/components/edit/pane/ConfigPanePanel.tsx +17 -27
  52. package/templates/src/components/edit/pane/PageGenSelector.tsx +16 -16
  53. package/templates/src/components/edit/pane/PageGenSpecial.tsx +26 -49
  54. package/templates/src/components/edit/pane/PageGen_preview.tsx +17 -2
  55. package/templates/src/components/edit/pane/PanePanel_path.tsx +2 -4
  56. package/templates/src/components/edit/pane/PanePanel_title.tsx +243 -76
  57. package/templates/src/components/edit/panels/StyleBreakPanel.tsx +17 -19
  58. package/templates/src/components/edit/panels/StyleCodeHookPanel.tsx +48 -37
  59. package/templates/src/components/edit/panels/StyleElementPanel_add.tsx +60 -55
  60. package/templates/src/components/edit/panels/StyleImagePanel_add.tsx +56 -50
  61. package/templates/src/components/edit/panels/StyleLiElementPanel_add.tsx +54 -47
  62. package/templates/src/components/edit/panels/StyleLinkPanel_add.tsx +54 -44
  63. package/templates/src/components/edit/panels/StyleLinkPanel_config.tsx +113 -138
  64. package/templates/src/components/edit/panels/StyleParentPanel_add.tsx +54 -40
  65. package/templates/src/components/edit/panels/StyleWidgetPanel.tsx +3 -3
  66. package/templates/src/components/edit/panels/StyleWidgetPanel_add.tsx +56 -49
  67. package/templates/src/components/edit/panels/StyleWidgetPanel_config.tsx +14 -5
  68. package/templates/src/components/edit/state/SaveModal.tsx +316 -169
  69. package/templates/src/components/edit/storyfragment/StoryFragmentPanel_og.tsx +1 -1
  70. package/templates/src/components/edit/storyfragment/StoryFragmentPanel_slug.tsx +56 -55
  71. package/templates/src/components/edit/widgets/BunnyWidget.tsx +538 -59
  72. package/templates/src/components/edit/widgets/InteractiveDisclosureWidget.tsx +656 -0
  73. package/templates/src/components/edit/widgets/ToggleWidget.tsx +9 -16
  74. package/templates/src/components/fields/ArtpackImage.tsx +4 -1
  75. package/templates/src/components/fields/BackgroundImage.tsx +1 -1
  76. package/templates/src/components/fields/BackgroundImageWrapper.tsx +127 -35
  77. package/templates/src/components/fields/ColorPickerCombo.tsx +66 -62
  78. package/templates/src/components/fields/ImageUpload.tsx +1 -1
  79. package/templates/src/components/fields/ViewportComboBox.tsx +59 -42
  80. package/templates/src/components/form/ActionBuilderBeliefSelector.tsx +117 -0
  81. package/templates/src/components/form/ActionBuilderField.tsx +306 -87
  82. package/templates/src/components/search/SearchModal.tsx +420 -0
  83. package/templates/src/components/search/SearchResults.tsx +367 -0
  84. package/templates/src/components/search/SearchWrapper.tsx +46 -0
  85. package/templates/src/components/storykeep/Dashboard_Advanced.tsx +1 -1
  86. package/templates/src/components/storykeep/Dashboard_Analytics.tsx +34 -8
  87. package/templates/src/components/storykeep/Dashboard_Content.tsx +6 -0
  88. package/templates/src/components/storykeep/StoryKeepBackdrop.astro +87 -0
  89. package/templates/src/components/storykeep/controls/content/BeliefForm.tsx +37 -33
  90. package/templates/src/components/storykeep/controls/content/MenuForm.tsx +55 -7
  91. package/templates/src/components/storykeep/controls/content/ResourceForm.tsx +17 -2
  92. package/templates/src/components/storykeep/controls/content/StoryFragmentTable.tsx +5 -8
  93. package/templates/src/components/storykeep/state/FetchAnalytics.tsx +274 -228
  94. package/templates/src/components/storykeep/widgets/Wizard.tsx +14 -7
  95. package/templates/src/components/tenant/RegistrationForm.tsx +1 -1
  96. package/templates/src/components/widgets/ImpressionWrapper.tsx +0 -1
  97. package/templates/src/constants/shapes.ts +9 -0
  98. package/templates/src/constants.ts +2121 -16
  99. package/templates/src/hooks/useSearch.ts +228 -0
  100. package/templates/src/layouts/Layout.astro +213 -104
  101. package/templates/src/lib/storyData.ts +4 -1
  102. package/templates/src/pages/[...slug]/edit.astro +14 -14
  103. package/templates/src/pages/[...slug].astro +82 -21
  104. package/templates/src/pages/api/orphan-analysis.ts +0 -1
  105. package/templates/src/pages/api/tailwind.ts +23 -21
  106. package/templates/src/pages/context/[...contextSlug]/edit.astro +14 -14
  107. package/templates/src/pages/context/[...contextSlug].astro +7 -2
  108. package/templates/src/pages/storykeep/advanced.astro +5 -4
  109. package/templates/src/pages/storykeep/branding.astro +5 -4
  110. package/templates/src/pages/storykeep/content.astro +5 -4
  111. package/templates/src/pages/storykeep/init.astro +40 -1
  112. package/templates/src/pages/storykeep/login.astro +1 -1
  113. package/templates/src/pages/storykeep.astro +5 -4
  114. package/templates/src/stores/nodes.ts +59 -88
  115. package/templates/src/stores/orphanAnalysis.ts +19 -21
  116. package/templates/src/stores/storykeep.ts +7 -0
  117. package/templates/src/types/compositorTypes.ts +6 -0
  118. package/templates/src/types/tractstack.ts +17 -0
  119. package/templates/src/utils/actions/lispLexer.ts +2 -2
  120. package/templates/src/utils/actions/preParse_Action.ts +3 -0
  121. package/templates/src/utils/api/beliefHelpers.ts +12 -36
  122. package/templates/src/utils/api/menuHelpers.ts +2 -2
  123. package/templates/src/utils/api.ts +26 -0
  124. package/templates/src/utils/compositor/TemplateNodes.ts +7 -0
  125. package/templates/src/utils/compositor/allowInsert.ts +5 -3
  126. package/templates/src/utils/compositor/nodesHelper.ts +4 -0
  127. package/templates/src/utils/compositor/processMarkdown.ts +16 -2
  128. package/templates/src/utils/compositor/reduceNodesClassNames.ts +4 -0
  129. package/templates/src/utils/compositor/templateMarkdownStyles.ts +13 -13
  130. package/templates/src/utils/compositor/typeGuards.ts +1 -0
  131. package/templates/src/utils/customHelpers.ts +38 -0
  132. package/templates/src/utils/helpers.ts +2 -2
  133. package/templates/src/utils/layout.ts +65 -144
  134. package/utils/inject-files.ts +95 -18
  135. package/templates/src/client/analytics-events.js +0 -207
  136. package/templates/src/client/belief-events.js +0 -191
  137. package/templates/src/client/sse.js +0 -613
  138. package/templates/src/components/codehooks/FeaturedContent.astro +0 -273
  139. package/templates/src/components/codehooks/FeaturedContentSetup.tsx +0 -738
  140. package/templates/src/components/compositor/preview/FeaturedContentPreview.tsx +0 -128
  141. package/templates/src/components/edit/pane/PanePanel_slug.tsx +0 -219
@@ -1,110 +1,70 @@
1
1
  ---
2
- import Layout from '@/layouts/Layout.astro';
3
- //import type { MenuNode } from '@/types/tractstack';
2
+ import CustomRoutes, { routes } from '@/custom/CustomRoutes.astro';
3
+ import { preHealthCheck } from '@/utils/backend';
4
+ //import type { ResourceNode } from '@/types/compositorTypes';
4
5
 
5
- export interface Props {
6
- route: string;
7
- slug: string;
8
- variation?: string;
9
- resources: any[];
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 { route, slug, resources } = Astro.props;
14
+ const { param1 } = Astro.params;
15
+ // this needs to match the url path
16
+ const route = `collections`;
13
17
 
14
- // uncomment if you add a menu id
15
- //
16
- //let menuPayload: MenuNode | null = null;
17
- //const hardcodedMenuId = '';
18
- //const goBackend = import.meta.env.PUBLIC_GO_BACKEND || 'http://localhost:8080';
19
- //try {
20
- // const menuResponse = await fetch(`${goBackend}/api/v1/nodes/menus/${hardcodedMenuId}`);
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
- const targetSlug = `${route}-${slug}`;
29
- const categoryResources = resources || [];
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
- const pageTitle = `${route}=${slug}`;
35
- ---
29
+ let resources = [];
30
+ const goBackend = import.meta.env.PUBLIC_GO_BACKEND || 'http://localhost:8080';
36
31
 
37
- <Layout title={pageTitle}>
38
- <div class="border-b bg-gray-100 p-4">
39
- <h1 class="text-2xl font-bold">{pageTitle}</h1>
40
- <p class="text-sm text-gray-600">
41
- Collections page - slug: {slug}
42
- </p>
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
- <main id="main-content" class="min-h-screen w-full">
46
- <div class="bg-white p-8">
47
- {
48
- slug ? (
49
- <div class="mx-auto max-w-4xl">
50
- <h2 class="mb-4 text-xl font-bold">
51
- Collection: {route}={slug}
52
- </h2>
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
- {activeResource ? (
55
- <div class="mb-6 rounded-lg bg-blue-50 p-6">
56
- <h3 class="mb-2 text-lg font-bold text-blue-900">
57
- {activeResource.title}
58
- </h3>
59
- <p class="mb-2 text-blue-800">{activeResource.oneliner}</p>
60
- <div class="text-sm text-blue-600">
61
- <p>ID: {activeResource.id}</p>
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
- <div class="rounded-lg bg-gray-50 p-6">
75
- <h3 class="mb-4 text-lg font-bold">
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
- <div class="border-t bg-gray-100 p-4">
108
- <p class="text-sm text-gray-600">Collections footer</p>
109
- </div>
110
- </Layout>
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,5 @@
1
+ node_modules/
2
+ dist/
3
+ .astro/
4
+ templates/css/
5
+ templates/fonts/
@@ -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
+ }