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.
Files changed (119) hide show
  1. package/README.md +35 -39
  2. package/package.json +25 -20
  3. package/templates/src/components/Footer.astro +4 -4
  4. package/templates/src/components/Header.astro +6 -6
  5. package/templates/src/components/Menu.tsx +15 -15
  6. package/templates/src/components/codehooks/BunnyVideoSetup.tsx +6 -6
  7. package/templates/src/components/codehooks/EpinetDurationSelector.tsx +3 -3
  8. package/templates/src/components/codehooks/FeaturedArticle.astro +1 -1
  9. package/templates/src/components/codehooks/FeaturedArticleSetup.tsx +3 -3
  10. package/templates/src/components/codehooks/ListContentSetup.tsx +2 -2
  11. package/templates/src/components/codehooks/ProductCardSetup.tsx +1 -1
  12. package/templates/src/components/codehooks/ProductGridSetup.tsx +2 -2
  13. package/templates/src/components/codehooks/SandboxRegisterForm.tsx +3 -3
  14. package/templates/src/components/compositor/Compositor.tsx +1 -1
  15. package/templates/src/components/compositor/elements/Belief.tsx +1 -1
  16. package/templates/src/components/compositor/elements/BunnyVideo.tsx +2 -2
  17. package/templates/src/components/compositor/elements/SignUp.tsx +1 -1
  18. package/templates/src/components/compositor/elements/ToggleBelief.tsx +1 -1
  19. package/templates/src/components/compositor/nodes/GhostInsertBlock.tsx +1 -1
  20. package/templates/src/components/compositor/nodes/GridLayout.tsx +1 -1
  21. package/templates/src/components/compositor/nodes/tagElements/TabIndicator.tsx +1 -1
  22. package/templates/src/components/compositor/preview/ListContentPreview.tsx +8 -8
  23. package/templates/src/components/edit/Header.tsx +1 -1
  24. package/templates/src/components/edit/SettingsPanel.tsx +3 -3
  25. package/templates/src/components/edit/ToolBar.tsx +3 -3
  26. package/templates/src/components/edit/ToolMode.tsx +5 -5
  27. package/templates/src/components/edit/pane/AddPanePanel.tsx +5 -5
  28. package/templates/src/components/edit/pane/AddPanePanel_break.tsx +6 -6
  29. package/templates/src/components/edit/pane/AddPanePanel_codehook.tsx +2 -2
  30. package/templates/src/components/edit/pane/AddPanePanel_new.tsx +2 -2
  31. package/templates/src/components/edit/pane/AddPanePanel_reuse.tsx +4 -4
  32. package/templates/src/components/edit/pane/AiRestylePaneModal.tsx +2 -2
  33. package/templates/src/components/edit/pane/ConfigPanePanel.tsx +1 -1
  34. package/templates/src/components/edit/pane/PanePanel_impression.tsx +4 -4
  35. package/templates/src/components/edit/pane/RestylePaneModal.tsx +3 -3
  36. package/templates/src/components/edit/pane/steps/AiDesignStep.tsx +2 -2
  37. package/templates/src/components/edit/pane/steps/CopyInputStep.tsx +5 -5
  38. package/templates/src/components/edit/panels/StyleBreakPanel.tsx +2 -2
  39. package/templates/src/components/edit/panels/StyleCodeHookPanel.tsx +6 -6
  40. package/templates/src/components/edit/panels/StyleElementPanel.tsx +5 -5
  41. package/templates/src/components/edit/panels/StyleElementPanel_add.tsx +6 -6
  42. package/templates/src/components/edit/panels/StyleElementPanel_remove.tsx +1 -1
  43. package/templates/src/components/edit/panels/StyleElementPanel_update.tsx +3 -3
  44. package/templates/src/components/edit/panels/StyleImagePanel.tsx +8 -8
  45. package/templates/src/components/edit/panels/StyleImagePanel_add.tsx +6 -6
  46. package/templates/src/components/edit/panels/StyleImagePanel_remove.tsx +1 -1
  47. package/templates/src/components/edit/panels/StyleImagePanel_update.tsx +3 -3
  48. package/templates/src/components/edit/panels/StyleLiElementPanel.tsx +4 -4
  49. package/templates/src/components/edit/panels/StyleLiElementPanel_add.tsx +6 -6
  50. package/templates/src/components/edit/panels/StyleLiElementPanel_remove.tsx +1 -1
  51. package/templates/src/components/edit/panels/StyleLiElementPanel_update.tsx +3 -3
  52. package/templates/src/components/edit/panels/StyleLinkPanel.tsx +5 -5
  53. package/templates/src/components/edit/panels/StyleLinkPanel_add.tsx +6 -6
  54. package/templates/src/components/edit/panels/StyleLinkPanel_remove.tsx +1 -1
  55. package/templates/src/components/edit/panels/StyleLinkPanel_update.tsx +1 -1
  56. package/templates/src/components/edit/panels/StyleParentPanel.tsx +9 -9
  57. package/templates/src/components/edit/panels/StyleParentPanel_add.tsx +6 -6
  58. package/templates/src/components/edit/panels/StyleParentPanel_deleteLayer.tsx +2 -2
  59. package/templates/src/components/edit/panels/StyleParentPanel_remove.tsx +1 -1
  60. package/templates/src/components/edit/panels/StyleParentPanel_update.tsx +1 -1
  61. package/templates/src/components/edit/panels/StyleWidgetPanel.tsx +7 -7
  62. package/templates/src/components/edit/panels/StyleWidgetPanel_add.tsx +6 -6
  63. package/templates/src/components/edit/panels/StyleWidgetPanel_remove.tsx +1 -1
  64. package/templates/src/components/edit/panels/StyleWidgetPanel_update.tsx +3 -3
  65. package/templates/src/components/edit/panels/StyleWordCarouselPanel.tsx +1 -1
  66. package/templates/src/components/edit/state/SaveModal.tsx +1 -1
  67. package/templates/src/components/edit/state/SaveToLibraryModal.tsx +2 -2
  68. package/templates/src/components/edit/state/StylesMemory.tsx +1 -1
  69. package/templates/src/components/edit/storyfragment/StoryFragmentConfigPanel.tsx +1 -1
  70. package/templates/src/components/edit/storyfragment/StoryFragmentPanel_menu.tsx +5 -5
  71. package/templates/src/components/edit/widgets/BunnyWidget.tsx +5 -5
  72. package/templates/src/components/edit/widgets/InteractiveDisclosureWidget.tsx +1 -1
  73. package/templates/src/components/edit/widgets/SignupWidget.tsx +3 -3
  74. package/templates/src/components/fields/ActionBuilderTimeSelector.tsx +7 -7
  75. package/templates/src/components/fields/ArtpackImage.tsx +15 -15
  76. package/templates/src/components/fields/BackgroundImage.tsx +13 -13
  77. package/templates/src/components/fields/BackgroundImageWrapper.tsx +3 -3
  78. package/templates/src/components/fields/ColorPickerCombo.tsx +8 -8
  79. package/templates/src/components/fields/ImageUpload.tsx +8 -8
  80. package/templates/src/components/fields/PaneBreakCollectionSelector.tsx +3 -3
  81. package/templates/src/components/fields/PaneBreakShapeSelector.tsx +4 -4
  82. package/templates/src/components/fields/SelectedTailwindClass.tsx +2 -2
  83. package/templates/src/components/fields/ViewportComboBox.tsx +4 -4
  84. package/templates/src/components/form/ActionBuilderField.tsx +1 -1
  85. package/templates/src/components/form/ActionBuilderSlugSelector.tsx +1 -1
  86. package/templates/src/components/form/UnsavedChangesBar.tsx +1 -1
  87. package/templates/src/components/form/advanced/APIConfigSection.tsx +2 -2
  88. package/templates/src/components/form/advanced/AuthConfigSection.tsx +2 -2
  89. package/templates/src/components/form/brand/BrandColorsSection.tsx +1 -1
  90. package/templates/src/components/profile/ProfileCreate.tsx +4 -4
  91. package/templates/src/components/profile/ProfileEdit.tsx +4 -4
  92. package/templates/src/components/profile/ProfileSwitch.tsx +2 -2
  93. package/templates/src/components/profile/ProfileUnlock.tsx +3 -3
  94. package/templates/src/components/search/SearchModal.tsx +10 -10
  95. package/templates/src/components/search/SearchResults.tsx +10 -10
  96. package/templates/src/components/search/SearchWrapper.tsx +1 -1
  97. package/templates/src/components/storykeep/Dashboard.tsx +1 -1
  98. package/templates/src/components/storykeep/Dashboard_Advanced.tsx +2 -2
  99. package/templates/src/components/storykeep/controls/content/BeliefForm.tsx +1 -1
  100. package/templates/src/components/storykeep/controls/content/ContentSummary.tsx +2 -2
  101. package/templates/src/components/storykeep/controls/content/KnownResourceTable.tsx +1 -1
  102. package/templates/src/components/storykeep/controls/content/ManageContent.tsx +2 -2
  103. package/templates/src/components/storykeep/controls/content/MenuForm.tsx +1 -1
  104. package/templates/src/components/storykeep/controls/content/ResourceTable.tsx +1 -1
  105. package/templates/src/components/widgets/Impression.tsx +2 -2
  106. package/templates/src/components/widgets/ImpressionWrapper.tsx +2 -2
  107. package/templates/src/hooks/useSearch.ts +1 -1
  108. package/templates/src/layouts/Layout.astro +2 -2
  109. package/templates/src/pages/[...slug]/edit.astro +3 -3
  110. package/templates/src/pages/[...slug].astro +1 -1
  111. package/templates/src/pages/context/[...contextSlug]/edit.astro +3 -3
  112. package/templates/src/pages/maint.astro +9 -9
  113. package/templates/src/pages/sandbox.astro +50 -61
  114. package/templates/src/pages/storykeep/login.astro +6 -6
  115. package/templates/src/types/formTypes.ts +6 -4
  116. package/templates/src/types/nodeProps.ts +1 -1
  117. package/templates/src/types/tractstack.ts +1 -2
  118. package/templates/src/utils/compositor/nodesHelper.ts +1 -1
  119. 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 grid-cols-2 gap-4 sm:grid-cols-4 lg:grid-cols-8">
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 sm:grid-cols-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 sm:pr-6">
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
- ? 'text-mydarkgrey border-dashed border-gray-500 bg-white'
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
- ? 'text-mydarkgrey border-transparent bg-orange-50 hover:bg-orange-100'
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
  )}
@@ -212,7 +212,7 @@ export default function MenuForm({
212
212
  </div>
213
213
  </div>
214
214
 
215
- <div className="grid grid-cols-1 gap-4 sm:grid-cols-2">
215
+ <div className="sm:grid-cols-2 grid grid-cols-1 gap-4">
216
216
  <StringInput
217
217
  label="Link Name"
218
218
  value={link.name}
@@ -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 sm:pr-6">
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 mt-2">
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="hover:text-myorange cursor-pointer text-black underline underline-offset-4"
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="bg-brand-1 hover:bg-brand-3 flex h-6 w-6 items-center justify-center rounded-full text-sm font-bold text-white transition-colors motion-safe:animate-bounce"
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="focus:ring-brand-1 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-offset-2"
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 w-full">
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="bg-myorange fixed left-0 top-0 h-1 w-full scale-x-0 transform transition-transform duration-300 ease-out"
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 left-0 right-0 drop-shadow transition-all duration-200"
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 h-full p-1.5">
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="z-101 pointer-events-none fixed bottom-16 right-2 flex flex-col items-end gap-2 md:bottom-2"
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="text-mydarkgrey absolute right-2 top-2 z-10 rounded-full bg-white p-1.5 hover:bg-black hover:text-white"
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 left-0 right-0 drop-shadow transition-all duration-200"
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 h-full p-1.5">
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="z-101 pointer-events-none fixed bottom-16 right-2 flex flex-col items-end gap-2 md:bottom-2"
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 h-full">
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 sm:px-6 lg:px-8">
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="text-mydarkgrey mt-6 text-center text-2xl font-bold leading-9 tracking-tight"
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="text-myorange mx-auto h-12 w-12">
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-mydarkgrey text-sm">
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="border-mylightgrey inline-flex items-center rounded-md border bg-white px-4 py-2 shadow-sm"
82
+ class="inline-flex items-center rounded-md border border-mylightgrey bg-white px-4 py-2 shadow-sm"
83
83
  >
84
- <div class="text-myorange -ml-1 mr-3 h-5 w-5 animate-spin">
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-mydarkgrey text-sm"
100
+ <span class="text-sm text-mydarkgrey"
101
101
  >Checking service status...</span
102
102
  >
103
103
  </div>
104
104
 
105
- <div class="text-mylightgrey text-center text-xs">
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
- hasProfile && (
86
- <>
87
- <section
88
- id="storykeepHeader"
89
- role="banner"
90
- class="z-101 bg-mywhite left-0 right-0 drop-shadow transition-all duration-200"
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
- <StoryKeepHeader
93
- slug="sandbox"
94
- isContext={false}
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
- <aside
129
- id="settingsControls"
130
- class="z-101 pointer-events-none fixed bottom-16 right-2 flex flex-col items-end gap-2 md:bottom-2"
131
- >
132
- <div class="pointer-events-none flex-grow" />
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
- <div class="pointer-events-auto flex-shrink-0">
135
- <StoryKeepToolBar client:only="react" />
136
- </div>
127
+ <div class="pointer-events-auto flex-shrink-0">
128
+ <StoryKeepToolBar client:only="react" />
129
+ </div>
137
130
 
138
- <div class="pointer-events-auto max-h-full">
139
- <SettingsPanel
140
- config={brandConfig}
141
- availableCodeHooks={Object.keys(codeHookComponents)}
142
- client:only="react"
143
- />
144
- </div>
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 h-full">
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 sm:px-6 lg:px-8">
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="text-mydarkgrey mt-6 text-center text-2xl font-bold leading-9 tracking-tight"
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="text-mydarkgrey block text-sm font-bold leading-6"
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="text-mydarkgrey ring-mylightgrey placeholder:text-mylightgrey focus:ring-myorange block w-full rounded-md border-0 px-3 py-1.5 shadow-sm ring-1 ring-inset focus:ring-2 focus:ring-inset sm:text-sm sm:leading-6"
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="bg-myblue hover:bg-myorange focus-visible:outline-myorange flex w-full justify-center rounded-md px-3 py-1.5 text-sm font-bold leading-6 text-white shadow-sm focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2"
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
- extends BaseFormComponentProps<string[]> {
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
- extends BaseFormComponentProps<string[]> {
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
- 'isContextPane' in node &&
74
- typeof node.isContextPane === 'boolean' &&
75
- node.isContextPane
73
+ 'isContextPane' in node &&
74
+ typeof node.isContextPane === 'boolean' &&
75
+ node.isContextPane
76
76
  );
77
77
  };
78
78