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
@@ -156,12 +156,12 @@ const ColorPickerCombo = ({
156
156
  return (
157
157
  <div>
158
158
  {title && (
159
- <span className="text-mydarkgrey block py-2 text-sm">{title}</span>
159
+ <span className="block py-2 text-sm text-mydarkgrey">{title}</span>
160
160
  )}
161
161
  <div className="flex items-center space-x-2">
162
162
  {allowNull && !hexColor ? (
163
163
  // Show empty state with angled stripes pattern when allowNull is true and no color is set
164
- <div className="border-mydarkgrey relative h-9 w-12 overflow-hidden rounded">
164
+ <div className="relative h-9 w-12 overflow-hidden rounded border-mydarkgrey">
165
165
  {/* Angled stripes pattern to represent transparency */}
166
166
  <div
167
167
  className="absolute inset-0"
@@ -189,15 +189,15 @@ const ColorPickerCombo = ({
189
189
  type="color"
190
190
  value={hexColor || '#ffffff'}
191
191
  onChange={(e) => handleHexColorChange(e.target.value)}
192
- className="border-mydarkgrey h-9 w-12 rounded"
192
+ className="h-9 w-12 rounded border-mydarkgrey"
193
193
  />
194
194
  )}
195
195
  {allowNull && (
196
196
  <button
197
197
  onClick={handleRemoveColor}
198
- className="border-mydarkgrey flex h-9 w-9 items-center justify-center rounded"
198
+ className="flex h-9 w-9 items-center justify-center rounded border-mydarkgrey"
199
199
  >
200
- <XMarkIcon className="text-mydarkgrey h-5 w-5" aria-hidden="true" />
200
+ <XMarkIcon className="h-5 w-5 text-mydarkgrey" aria-hidden="true" />
201
201
  </button>
202
202
  )}
203
203
  {!skipTailwind && (
@@ -222,13 +222,13 @@ const ColorPickerCombo = ({
222
222
  <Combobox.Control ref={comboboxRef}>
223
223
  <div className="relative">
224
224
  <Combobox.Input
225
- className="border-mydarkgrey focus:border-myblue focus:ring-myblue xs:text-sm w-full max-w-xl rounded-md py-2 pl-3 pr-10 shadow-sm"
225
+ className="w-full max-w-xl rounded-md border-mydarkgrey py-2 pl-3 pr-10 shadow-sm focus:border-myblue focus:ring-myblue xs:text-sm"
226
226
  placeholder="Search Tailwind colors..."
227
227
  autoComplete="off"
228
228
  />
229
229
  <Combobox.Trigger className="absolute inset-y-0 right-0 flex items-center pr-2">
230
230
  <ChevronUpDownIcon
231
- className="text-mydarkgrey h-5 w-5"
231
+ className="h-5 w-5 text-mydarkgrey"
232
232
  aria-hidden="true"
233
233
  />
234
234
  </Combobox.Trigger>
@@ -237,7 +237,7 @@ const ColorPickerCombo = ({
237
237
 
238
238
  <Portal>
239
239
  <Combobox.Positioner style={{ zIndex: 1002 }}>
240
- <Combobox.Content className="xs:text-sm max-h-64 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none">
240
+ <Combobox.Content className="max-h-64 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none xs:text-sm">
241
241
  {filteredColors.length === 0 ? (
242
242
  <div className="relative cursor-default select-none py-2 pl-3 pr-4 text-black">
243
243
  Nothing found.
@@ -197,7 +197,7 @@ export const ImageUpload = ({
197
197
  // Update the node with base64Data
198
198
  if (currentImageNode) {
199
199
  const updatedNode = cloneDeep(currentImageNode);
200
- (updatedNode.fileId = ulid()), (updatedNode.src = base64); // Set src to base64 for immediate display
200
+ ((updatedNode.fileId = ulid()), (updatedNode.src = base64)); // Set src to base64 for immediate display
201
201
  updatedNode.base64Data = base64;
202
202
  updatedNode.alt = defaultAlt;
203
203
  updatedNode.isChanged = true;
@@ -303,7 +303,7 @@ export const ImageUpload = ({
303
303
  </button>
304
304
  <button
305
305
  onClick={() => setIsSelectingFile(true)}
306
- className="text-myblue flex items-center text-sm hover:text-cyan-600"
306
+ className="flex items-center text-sm text-myblue hover:text-cyan-600"
307
307
  >
308
308
  <FolderIcon className="mr-1 h-4 w-4" />
309
309
  Select Existing
@@ -326,7 +326,7 @@ export const ImageUpload = ({
326
326
  {isSelectingFile && (
327
327
  <div className="fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50">
328
328
  <div className="w-full max-w-md rounded-lg bg-white p-6 shadow-lg">
329
- <h3 className="text-mydarkgrey mb-4 text-lg font-bold">
329
+ <h3 className="mb-4 text-lg font-bold text-mydarkgrey">
330
330
  Select an Image
331
331
  </h3>
332
332
 
@@ -343,11 +343,11 @@ export const ImageUpload = ({
343
343
  <div ref={comboboxRef} className="relative">
344
344
  <Combobox.Control className="relative">
345
345
  <Combobox.Input
346
- className="border-mydarkgrey text-myblack w-full rounded-md py-2 pl-3 pr-10"
346
+ className="w-full rounded-md border-mydarkgrey py-2 pl-3 pr-10 text-myblack"
347
347
  placeholder="Search files..."
348
348
  />
349
349
  <Combobox.Trigger className="absolute inset-y-0 right-0 flex items-center pr-2">
350
- <ChevronUpDownIcon className="text-mydarkgrey h-5 w-5" />
350
+ <ChevronUpDownIcon className="h-5 w-5 text-mydarkgrey" />
351
351
  </Combobox.Trigger>
352
352
  </Combobox.Control>
353
353
 
@@ -359,7 +359,7 @@ export const ImageUpload = ({
359
359
  style={{ maxHeight: `${maxHeight}px` }}
360
360
  >
361
361
  {collection.items.length === 0 ? (
362
- <div className="text-mydarkgrey relative cursor-default select-none px-4 py-2">
362
+ <div className="relative cursor-default select-none px-4 py-2 text-mydarkgrey">
363
363
  Nothing found.
364
364
  </div>
365
365
  ) : (
@@ -367,7 +367,7 @@ export const ImageUpload = ({
367
367
  <Combobox.Item
368
368
  key={file.id}
369
369
  item={file}
370
- className="file-item text-myblack relative cursor-default select-none py-2 pl-10 pr-4"
370
+ className="file-item relative cursor-default select-none py-2 pl-10 pr-4 text-myblack"
371
371
  >
372
372
  <div className="flex items-center space-x-3">
373
373
  <img
@@ -391,7 +391,7 @@ export const ImageUpload = ({
391
391
  </Combobox.Root>
392
392
 
393
393
  <button
394
- className="bg-mylightgrey text-myblack mt-4 rounded-md px-4 py-2 text-sm hover:bg-cyan-600 hover:text-white"
394
+ className="mt-4 rounded-md bg-mylightgrey px-4 py-2 text-sm text-myblack hover:bg-cyan-600 hover:text-white"
395
395
  onClick={() => setIsSelectingFile(false)}
396
396
  >
397
397
  Cancel
@@ -67,17 +67,17 @@ export default function PaneBreakCollectionSelector({
67
67
  >
68
68
  <div className="relative mt-1">
69
69
  <Combobox.Input
70
- className="border-mydarkgrey focus:border-myblue focus:ring-myblue xs:text-sm w-full rounded-md py-2 pl-3 pr-10 shadow-sm"
70
+ className="w-full rounded-md border-mydarkgrey py-2 pl-3 pr-10 shadow-sm focus:border-myblue focus:ring-myblue xs:text-sm"
71
71
  autoComplete="off"
72
72
  />
73
73
  <Combobox.Trigger className="absolute inset-y-0 right-0 flex items-center pr-2">
74
74
  <ChevronUpDownIcon
75
- className="text-mydarkgrey h-5 w-5"
75
+ className="h-5 w-5 text-mydarkgrey"
76
76
  aria-hidden="true"
77
77
  />
78
78
  </Combobox.Trigger>
79
79
  </div>
80
- <Combobox.Content className="xs:text-sm absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none">
80
+ <Combobox.Content className="absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none xs:text-sm">
81
81
  {collection.items.map((item) => (
82
82
  <Combobox.Item
83
83
  key={item}
@@ -98,22 +98,22 @@ export default function PaneBreakShapeSelector({
98
98
  composite={true}
99
99
  >
100
100
  <div className="relative mt-1 flex-grow">
101
- <div className="border-mydarkgrey focus-within:border-myblue focus-within:ring-myblue flex w-full items-center rounded-md border shadow-sm">
101
+ <div className="flex w-full items-center rounded-md border border-mydarkgrey shadow-sm focus-within:border-myblue focus-within:ring-myblue">
102
102
  <Combobox.Input
103
- className="xs:text-sm w-full rounded-l-md border-0 py-2 pl-3 pr-0 focus:ring-0"
103
+ className="w-full rounded-l-md border-0 py-2 pl-3 pr-0 focus:ring-0 xs:text-sm"
104
104
  autoComplete="off"
105
105
  />
106
106
  <div className="py-2 pr-8">{renderShapePreview(selectedImage)}</div>
107
107
  <Combobox.Trigger className="absolute inset-y-0 right-0 flex items-center pr-2">
108
108
  <ChevronUpDownIcon
109
- className="text-mydarkgrey h-5 w-5"
109
+ className="h-5 w-5 text-mydarkgrey"
110
110
  aria-hidden="true"
111
111
  />
112
112
  </Combobox.Trigger>
113
113
  </div>
114
114
  </div>
115
115
 
116
- <Combobox.Content className="xs:text-sm absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none">
116
+ <Combobox.Content className="absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none xs:text-sm">
117
117
  {collection.items.map((shape) => (
118
118
  <Combobox.Item
119
119
  key={shape}
@@ -23,7 +23,7 @@ const SelectedTailwindClass = ({ name, values, onRemove, onUpdate }: Props) => {
23
23
  .join(', ');
24
24
 
25
25
  return (
26
- <div className="text-myblack hover:bg-mygreen/20 w-fit rounded border border-slate-200 p-2 text-sm">
26
+ <div className="w-fit rounded border border-slate-200 p-2 text-sm text-myblack hover:bg-mygreen/20">
27
27
  <div title={title} className="flex items-center gap-2 font-bold">
28
28
  <button onClick={() => onUpdate(name)}>
29
29
  {tailwindClasses[name]?.title || name}
@@ -34,7 +34,7 @@ const SelectedTailwindClass = ({ name, values, onRemove, onUpdate }: Props) => {
34
34
  aria-label={`Remove ${name} class`}
35
35
  title={`Remove ${tailwindClasses[name]?.title || name} class`}
36
36
  >
37
- <XMarkIcon className="text-mydarkgrey h-4 w-4 hover:font-bold hover:text-black" />
37
+ <XMarkIcon className="h-4 w-4 text-mydarkgrey hover:font-bold hover:text-black" />
38
38
  </button>
39
39
  </div>
40
40
  </div>
@@ -183,7 +183,7 @@ const ViewportComboBox = ({
183
183
  )}
184
184
  <Combobox.Input
185
185
  className={classNames(
186
- 'border-mydarkgrey w-full rounded-md border py-2 text-xl leading-5 focus:border-cyan-600 focus:ring-1 focus:ring-cyan-600',
186
+ 'w-full rounded-md border border-mydarkgrey py-2 text-xl leading-5 focus:border-cyan-600 focus:ring-1 focus:ring-cyan-600',
187
187
  isInferred ? 'text-black/20' : 'text-black',
188
188
  isColorValue ? 'pl-12' : 'pl-3',
189
189
  'pr-16'
@@ -193,7 +193,7 @@ const ViewportComboBox = ({
193
193
  />
194
194
  <Combobox.Trigger className="absolute inset-y-0 right-0 flex items-center pl-2 pr-2">
195
195
  <ChevronUpDownIcon
196
- className="text-mydarkgrey h-5 w-5"
196
+ className="h-5 w-5 text-mydarkgrey"
197
197
  aria-hidden="true"
198
198
  />
199
199
  </Combobox.Trigger>
@@ -203,7 +203,7 @@ const ViewportComboBox = ({
203
203
  <Combobox.Positioner style={{ zIndex: 1002 }}>
204
204
  <Combobox.Content className="max-h-64 w-full overflow-auto rounded-md bg-white py-1 text-xl shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none">
205
205
  {collection.items.length === 0 ? (
206
- <div className="text-mydarkgrey relative cursor-default select-none px-4 py-2">
206
+ <div className="relative cursor-default select-none px-4 py-2 text-mydarkgrey">
207
207
  Nothing found.
208
208
  </div>
209
209
  ) : (
@@ -252,7 +252,7 @@ const ViewportComboBox = ({
252
252
  id={`negative-${viewport}`}
253
253
  checked={isNowNegative}
254
254
  onChange={handleNegativeChange}
255
- className="border-mydarkgrey h-4 w-4 rounded text-cyan-600 focus:ring-cyan-600"
255
+ className="h-4 w-4 rounded border-mydarkgrey text-cyan-600 focus:ring-cyan-600"
256
256
  />
257
257
  <label
258
258
  htmlFor={`negative-${viewport}`}
@@ -1,4 +1,4 @@
1
- import { useState, useEffect, useMemo } from 'react';
1
+ import { useState, useEffect, useMemo, type JSX } from 'react';
2
2
  import { TractStackAPI } from '@/utils/api';
3
3
  import { GOTO_TARGETS, ACTION_COMMANDS, type ActionCommand } from '@/constants';
4
4
  import XMarkIcon from '@heroicons/react/24/outline/XMarkIcon';
@@ -151,7 +151,7 @@ const ActionBuilderSlugSelector = ({
151
151
  </Combobox.Trigger>
152
152
  </div>
153
153
 
154
- <Combobox.Content className="absolute z-10 mt-1 max-h-60 w-full max-w-md overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:text-sm">
154
+ <Combobox.Content className="sm:text-sm absolute z-10 mt-1 max-h-60 w-full max-w-md overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none">
155
155
  {filteredItems.length === 0 ? (
156
156
  <div className="relative cursor-default select-none px-4 py-2 text-gray-700">
157
157
  {query ? 'No matching items found' : 'No items available'}
@@ -147,7 +147,7 @@ export default function UnsavedChangesBar<T>({
147
147
  <div className="absolute inset-0 bg-black/10 backdrop-blur-sm" />
148
148
 
149
149
  {/* Main content bar */}
150
- <div className="relative mx-auto max-w-7xl px-4 py-4 sm:px-6 lg:px-8">
150
+ <div className="sm:px-6 lg:px-8 relative mx-auto max-w-7xl px-4 py-4">
151
151
  <div
152
152
  className={`flex items-center justify-between rounded-lg border px-4 py-3 shadow-lg ${styling.bgColor} ${styling.borderColor}`}
153
153
  >
@@ -19,8 +19,8 @@ export default function APIConfigSection({
19
19
  const aaiConfigured = status?.aaiAPIKeySet;
20
20
 
21
21
  return (
22
- <div className="bg-white shadow sm:rounded-lg">
23
- <div className="px-4 py-5 sm:p-6">
22
+ <div className="sm:rounded-lg bg-white shadow">
23
+ <div className="sm:p-6 px-4 py-5">
24
24
  <div className="flex items-center justify-between">
25
25
  <h3 className="text-base font-bold leading-6 text-gray-900">
26
26
  API Configuration
@@ -20,8 +20,8 @@ export default function AuthConfigSection({
20
20
  const editorConfigured = status?.editorPasswordSet;
21
21
 
22
22
  return (
23
- <div className="bg-white shadow sm:rounded-lg">
24
- <div className="px-4 py-5 sm:p-6">
23
+ <div className="sm:rounded-lg bg-white shadow">
24
+ <div className="sm:p-6 px-4 py-5">
25
25
  <h3 className="text-base font-bold leading-6 text-gray-900">
26
26
  Authentication Configuration
27
27
  </h3>
@@ -188,7 +188,7 @@ export default function BrandColorsSection({
188
188
  ) : (
189
189
  <div className="space-y-1">
190
190
  {contrastIssues.map((issue, index) => (
191
- <p key={index} className="text-mydarkgrey text-sm">
191
+ <p key={index} className="text-sm text-mydarkgrey">
192
192
  {issue}
193
193
  </p>
194
194
  ))}
@@ -226,7 +226,7 @@ export const ProfileCreate = ({ onSuccess, onError }: ProfileCreateProps) => {
226
226
  return (
227
227
  <>
228
228
  <style>{selectItemStyles}</style>
229
- <h3 className="font-action py-6 text-xl text-blue-600">
229
+ <h3 className="py-6 font-action text-xl text-blue-600">
230
230
  Feel free to introduce yourself
231
231
  </h3>
232
232
  <p className="text-md pb-6">
@@ -332,7 +332,7 @@ export const ProfileCreate = ({ onSuccess, onError }: ProfileCreateProps) => {
332
332
 
333
333
  <Portal>
334
334
  <Select.Positioner>
335
- <Select.Content className="relative z-10 mt-1 max-h-56 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:text-sm">
335
+ <Select.Content className="sm:text-sm relative z-10 mt-1 max-h-56 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none">
336
336
  {contactPersona.map((item) => (
337
337
  <Select.Item
338
338
  key={item.id}
@@ -434,7 +434,7 @@ export const ProfileCreate = ({ onSuccess, onError }: ProfileCreateProps) => {
434
434
  )}
435
435
 
436
436
  {badSave ? (
437
- <div className="align-center font-action col-span-3 flex justify-center py-12 text-red-500">
437
+ <div className="align-center col-span-3 flex justify-center py-12 font-action text-red-500">
438
438
  Profile could not be saved. Email already registered.
439
439
  </div>
440
440
  ) : null}
@@ -445,7 +445,7 @@ export const ProfileCreate = ({ onSuccess, onError }: ProfileCreateProps) => {
445
445
  type="submit"
446
446
  disabled={isLoading}
447
447
  className={classNames(
448
- `font-action rounded-lg px-3.5 py-2.5 text-white transition-all duration-200 hover:rotate-1`,
448
+ `rounded-lg px-3.5 py-2.5 font-action text-white transition-all duration-200 hover:rotate-1`,
449
449
  isLoading
450
450
  ? `cursor-not-allowed bg-gray-400`
451
451
  : `bg-black hover:bg-orange-500`
@@ -213,7 +213,7 @@ export const ProfileEdit = ({ onSuccess, onError }: ProfileEditProps) => {
213
213
  return (
214
214
  <>
215
215
  <style>{selectItemStyles}</style>
216
- <h3 className="font-action py-6 text-xl text-blue-600">
216
+ <h3 className="py-6 font-action text-xl text-blue-600">
217
217
  Update your profile
218
218
  </h3>
219
219
 
@@ -294,7 +294,7 @@ export const ProfileEdit = ({ onSuccess, onError }: ProfileEditProps) => {
294
294
 
295
295
  <Portal>
296
296
  <Select.Positioner>
297
- <Select.Content className="relative z-10 mt-1 max-h-56 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:text-sm">
297
+ <Select.Content className="sm:text-sm relative z-10 mt-1 max-h-56 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none">
298
298
  {contactPersona.map((item) => (
299
299
  <Select.Item
300
300
  key={item.id}
@@ -383,7 +383,7 @@ export const ProfileEdit = ({ onSuccess, onError }: ProfileEditProps) => {
383
383
  </div>
384
384
 
385
385
  {saved ? (
386
- <div className="align-center font-action col-span-3 flex justify-center py-12 text-green-600">
386
+ <div className="align-center col-span-3 flex justify-center py-12 font-action text-green-600">
387
387
  Profile updated successfully!
388
388
  </div>
389
389
  ) : null}
@@ -393,7 +393,7 @@ export const ProfileEdit = ({ onSuccess, onError }: ProfileEditProps) => {
393
393
  type="submit"
394
394
  disabled={isLoading}
395
395
  className={classNames(
396
- `font-action rounded-lg px-3.5 py-2.5 text-white transition-all duration-200 hover:rotate-1`,
396
+ `rounded-lg px-3.5 py-2.5 font-action text-white transition-all duration-200 hover:rotate-1`,
397
397
  isLoading
398
398
  ? `cursor-not-allowed bg-gray-400`
399
399
  : `bg-black hover:bg-orange-500`
@@ -213,7 +213,7 @@ export const ProfileSwitch = () => {
213
213
  if (isLoading) {
214
214
  return (
215
215
  <div className="py-12">
216
- <div className="border-myblue/20 bg-mywhite border border-dashed">
216
+ <div className="border border-dashed border-myblue/20 bg-mywhite">
217
217
  <div className="p-6">
218
218
  <div className="flex items-center justify-center py-12">
219
219
  <div className="text-mydarkgrey">Loading profile...</div>
@@ -236,7 +236,7 @@ export const ProfileSwitch = () => {
236
236
 
237
237
  return (
238
238
  <div className="py-12">
239
- <div className="border-myblue/20 bg-mywhite border border-dashed">
239
+ <div className="border border-dashed border-myblue/20 bg-mywhite">
240
240
  <div className="p-6">
241
241
  {mode === 'create' && (
242
242
  <ProfileCreate onSuccess={handleProfileSuccess} />
@@ -128,7 +128,7 @@ export const ProfileUnlock = ({
128
128
 
129
129
  return (
130
130
  <>
131
- <h3 className="font-action py-6 text-xl text-blue-600">
131
+ <h3 className="py-6 font-action text-xl text-blue-600">
132
132
  Welcome back! Please unlock your profile
133
133
  </h3>
134
134
 
@@ -181,7 +181,7 @@ export const ProfileUnlock = ({
181
181
  </div>
182
182
 
183
183
  {badLogin ? (
184
- <div className="align-center font-action col-span-1 flex justify-center py-6 text-red-500">
184
+ <div className="align-center col-span-1 flex justify-center py-6 font-action text-red-500">
185
185
  Invalid credentials. Please try again.
186
186
  </div>
187
187
  ) : null}
@@ -191,7 +191,7 @@ export const ProfileUnlock = ({
191
191
  type="submit"
192
192
  disabled={isLoading}
193
193
  className={classNames(
194
- `font-action rounded-lg px-3.5 py-2.5 text-white transition-all duration-200 hover:rotate-1`,
194
+ `rounded-lg px-3.5 py-2.5 font-action text-white transition-all duration-200 hover:rotate-1`,
195
195
  isLoading
196
196
  ? `cursor-not-allowed bg-gray-400`
197
197
  : `bg-black hover:bg-orange-500`
@@ -221,7 +221,7 @@ export default function SearchModal({
221
221
  <Dialog.Backdrop className="fixed inset-0 z-50 bg-black bg-opacity-50 backdrop-blur-sm" />
222
222
  <Dialog.Positioner className="fixed inset-0 z-50 mx-auto max-w-3xl p-2 pt-16 md:p-4">
223
223
  <Dialog.Content
224
- className="bg-mywhite mx-auto w-full overflow-hidden rounded-lg shadow-2xl"
224
+ className="mx-auto w-full overflow-hidden rounded-lg bg-mywhite shadow-2xl"
225
225
  style={{ height: '80vh' }}
226
226
  >
227
227
  <div className="relative w-full border-b border-gray-200 p-4">
@@ -269,7 +269,7 @@ export default function SearchModal({
269
269
  onChange={handleInputChange}
270
270
  onKeyDown={handleKeyDown}
271
271
  placeholder="Search content..."
272
- className="text-mydarkgrey relative z-10 w-full border-none bg-transparent text-xl placeholder-gray-500 outline-none"
272
+ className="relative z-10 w-full border-none bg-transparent text-xl text-mydarkgrey placeholder-gray-500 outline-none"
273
273
  style={{ background: 'transparent', padding: '0' }}
274
274
  />
275
275
  </div>
@@ -277,7 +277,7 @@ export default function SearchModal({
277
277
 
278
278
  <button
279
279
  onClick={handleClose}
280
- className="text-mydarkgrey hover:text-myblue absolute right-4 top-6 rounded-lg p-2 transition-colors hover:bg-gray-100"
280
+ className="absolute right-4 top-6 rounded-lg p-2 text-mydarkgrey transition-colors hover:bg-gray-100 hover:text-myblue"
281
281
  aria-label="Close search"
282
282
  >
283
283
  <XMarkIcon className="h-6 w-6" />
@@ -310,8 +310,8 @@ export default function SearchModal({
310
310
 
311
311
  {query.trim().length >= 3 && isDiscovering && (
312
312
  <div className="w-full p-8 text-center">
313
- <div className="border-myblue inline-block h-8 w-8 animate-spin rounded-full border-b-2"></div>
314
- <p className="text-mydarkgrey mt-4">Discovering...</p>
313
+ <div className="inline-block h-8 w-8 animate-spin rounded-full border-b-2 border-myblue"></div>
314
+ <p className="mt-4 text-mydarkgrey">Discovering...</p>
315
315
  </div>
316
316
  )}
317
317
 
@@ -320,7 +320,7 @@ export default function SearchModal({
320
320
  <p>Discovery failed: {discoverError}</p>
321
321
  <button
322
322
  onClick={() => discoverTerms(query.trim())}
323
- className="text-myblue mt-2 hover:underline"
323
+ className="mt-2 text-myblue hover:underline"
324
324
  >
325
325
  Try again
326
326
  </button>
@@ -329,7 +329,7 @@ export default function SearchModal({
329
329
 
330
330
  {showSuggestions && (
331
331
  <div className="w-full p-6">
332
- <p className="text-mydarkgrey mb-4 text-sm font-bold">
332
+ <p className="mb-4 text-sm font-bold text-mydarkgrey">
333
333
  Suggestions ({suggestions.length})
334
334
  </p>
335
335
  <div className="flex flex-wrap gap-2">
@@ -345,7 +345,7 @@ export default function SearchModal({
345
345
  </button>
346
346
  ))}
347
347
  </div>
348
- <p className="text-mydarkgrey mt-4 text-xs">
348
+ <p className="mt-4 text-xs text-mydarkgrey">
349
349
  Click a suggestion or press Enter to search
350
350
  </p>
351
351
  <div className="mt-6 border-t border-gray-200 pt-4">
@@ -379,8 +379,8 @@ export default function SearchModal({
379
379
 
380
380
  {isRetrieving && (
381
381
  <div className="w-full p-8 text-center">
382
- <div className="border-myblue inline-block h-8 w-8 animate-spin rounded-full border-b-2"></div>
383
- <p className="text-mydarkgrey mt-4">Searching...</p>
382
+ <div className="inline-block h-8 w-8 animate-spin rounded-full border-b-2 border-myblue"></div>
383
+ <p className="mt-4 text-mydarkgrey">Searching...</p>
384
384
  </div>
385
385
  )}
386
386
 
@@ -226,7 +226,7 @@ export default function SearchResults({
226
226
  return (
227
227
  <div className="p-6">
228
228
  <div className="mb-6">
229
- <h2 className="text-mydarkgrey text-lg font-bold">
229
+ <h2 className="text-lg font-bold text-mydarkgrey">
230
230
  {totalResults} result{totalResults !== 1 ? 's' : ''} found
231
231
  </h2>
232
232
  <p className="mt-1 text-sm text-gray-600">
@@ -246,7 +246,7 @@ export default function SearchResults({
246
246
  <div className="flex flex-col md:flex-row md:items-start md:gap-4">
247
247
  {/* Mobile: Full width image without overlay badge */}
248
248
  <div
249
- className="bg-mydarkgrey relative w-full overflow-hidden rounded-lg md:hidden"
249
+ className="relative w-full overflow-hidden rounded-lg bg-mydarkgrey md:hidden"
250
250
  style={{ aspectRatio: '1200/630' }}
251
251
  >
252
252
  <img
@@ -258,7 +258,7 @@ export default function SearchResults({
258
258
 
259
259
  {/* Desktop: Side image without overlay badge */}
260
260
  <div
261
- className="bg-mydarkgrey relative hidden flex-shrink-0 overflow-hidden rounded-lg md:block"
261
+ className="relative hidden flex-shrink-0 overflow-hidden rounded-lg bg-mydarkgrey md:block"
262
262
  style={{ width: '240px', height: '135px' }}
263
263
  >
264
264
  <img
@@ -271,11 +271,11 @@ export default function SearchResults({
271
271
  <div className="mt-3 min-w-0 flex-1 md:mt-0">
272
272
  <div className="flex items-start justify-between gap-4">
273
273
  <div className="flex-1">
274
- <h3 className="text-mydarkgrey group-hover:text-myblue mb-2 text-lg font-bold transition-colors">
274
+ <h3 className="mb-2 text-lg font-bold text-mydarkgrey transition-colors group-hover:text-myblue">
275
275
  {item.title}
276
276
  </h3>
277
277
  {item.description && (
278
- <p className="text-mydarkgrey mb-2 text-sm">
278
+ <p className="mb-2 text-sm text-mydarkgrey">
279
279
  {item.description}
280
280
  </p>
281
281
  )}
@@ -291,13 +291,13 @@ export default function SearchResults({
291
291
  {item.topics.slice(0, 3).map((topic, idx) => (
292
292
  <span
293
293
  key={idx}
294
- className="bg-myoffwhite text-mydarkgrey rounded px-2 py-1 text-xs"
294
+ className="rounded bg-myoffwhite px-2 py-1 text-xs text-mydarkgrey"
295
295
  >
296
296
  {topic}
297
297
  </span>
298
298
  ))}
299
299
  {item.topics.length > 3 && (
300
- <span className="text-mydarkgrey text-xs">
300
+ <span className="text-xs text-mydarkgrey">
301
301
  +{item.topics.length - 3} more
302
302
  </span>
303
303
  )}
@@ -321,7 +321,7 @@ export default function SearchResults({
321
321
  page={currentPage}
322
322
  onPageChange={(details) => handlePageChange(details.page)}
323
323
  >
324
- <Pagination.PrevTrigger className="text-mydarkgrey hover:text-myblue mr-2 flex items-center gap-1 rounded px-3 py-2 text-sm font-bold transition-colors disabled:opacity-50">
324
+ <Pagination.PrevTrigger className="mr-2 flex items-center gap-1 rounded px-3 py-2 text-sm font-bold text-mydarkgrey transition-colors hover:text-myblue disabled:opacity-50">
325
325
  <ChevronLeftIcon className="h-4 w-4" />
326
326
  Previous
327
327
  </Pagination.PrevTrigger>
@@ -346,7 +346,7 @@ export default function SearchResults({
346
346
  ) : (
347
347
  <span
348
348
  key={index}
349
- className="text-mydarkgrey px-2 text-sm"
349
+ className="px-2 text-sm text-mydarkgrey"
350
350
  >
351
351
  {page.type === 'ellipsis' ? '...' : ''}
352
352
  </span>
@@ -356,7 +356,7 @@ export default function SearchResults({
356
356
  </Pagination.Context>
357
357
  </div>
358
358
 
359
- <Pagination.NextTrigger className="text-mydarkgrey hover:text-myblue ml-2 flex items-center gap-1 rounded px-3 py-2 text-sm font-bold transition-colors disabled:opacity-50">
359
+ <Pagination.NextTrigger className="ml-2 flex items-center gap-1 rounded px-3 py-2 text-sm font-bold text-mydarkgrey transition-colors hover:text-myblue disabled:opacity-50">
360
360
  Next
361
361
  <ChevronRightIcon className="h-4 w-4" />
362
362
  </Pagination.NextTrigger>
@@ -27,7 +27,7 @@ export default function SearchWrapper({ contentMap }: SearchWrapperProps) {
27
27
  <>
28
28
  <button
29
29
  onClick={handleSearchOpen}
30
- className="text-myblue/80 hover:text-myblue hover:rotate-6"
30
+ className="text-myblue/80 hover:rotate-6 hover:text-myblue"
31
31
  title="Search content"
32
32
  aria-label="Search content"
33
33
  >
@@ -113,7 +113,7 @@ export default function StoryKeepDashboard({
113
113
  <h3 className="text-lg font-bold text-black">
114
114
  Welcome to your StoryKeep
115
115
  </h3>
116
- <div className="text-mydarkgrey mt-2 text-sm">
116
+ <div className="mt-2 text-sm text-mydarkgrey">
117
117
  <p>
118
118
  Complete your site's branding configuration to get started.
119
119
  (And update as often as you like!)
@@ -100,8 +100,8 @@ export default function StoryKeepDashboard_Advanced({
100
100
  const icon = status?.tursoEnabled ? '☁️' : '📁';
101
101
 
102
102
  return (
103
- <div className="bg-white shadow sm:rounded-lg">
104
- <div className="px-4 py-5 sm:p-6">
103
+ <div className="sm:rounded-lg bg-white shadow">
104
+ <div className="sm:p-6 px-4 py-5">
105
105
  <h3 className="text-base font-bold leading-6 text-gray-900">
106
106
  Database Configuration
107
107
  </h3>
@@ -288,7 +288,7 @@ export default function BeliefForm({
288
288
  onChange={(e) => handleCustomValueChange(e.target.value)}
289
289
  onKeyDown={handleKeyDown}
290
290
  placeholder="Enter custom value"
291
- className={`block w-full rounded-md border-0 px-3 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset placeholder:text-gray-400 focus:ring-2 focus:ring-inset sm:text-sm sm:leading-6 ${
291
+ className={`sm:text-sm sm:leading-6 block w-full rounded-md border-0 px-3 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset placeholder:text-gray-400 focus:ring-2 focus:ring-inset ${
292
292
  customValueError
293
293
  ? 'ring-red-500 focus:ring-red-600'
294
294
  : 'ring-gray-300 focus:ring-cyan-600'