astro-tractstack 2.0.46 → 2.1.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 (121) 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 -9
  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/constants.ts +4 -0
  108. package/templates/src/hooks/useSearch.ts +1 -1
  109. package/templates/src/layouts/Layout.astro +2 -2
  110. package/templates/src/pages/[...slug]/edit.astro +3 -3
  111. package/templates/src/pages/[...slug].astro +1 -1
  112. package/templates/src/pages/context/[...contextSlug]/edit.astro +3 -3
  113. package/templates/src/pages/maint.astro +9 -9
  114. package/templates/src/pages/sandbox.astro +3 -3
  115. package/templates/src/pages/storykeep/login.astro +6 -6
  116. package/templates/src/types/formTypes.ts +6 -4
  117. package/templates/src/types/nodeProps.ts +1 -1
  118. package/templates/src/types/tractstack.ts +1 -2
  119. package/templates/src/utils/actions/preParse_Action.ts +2 -8
  120. package/templates/src/utils/compositor/nodesHelper.ts +1 -1
  121. package/templates/src/utils/compositor/typeGuards.ts +3 -3
@@ -288,7 +288,7 @@ const StyleWidgetPanel = ({
288
288
  <h3 className="text-xl font-bold">Setup {widgetName}</h3>
289
289
 
290
290
  <div className="pb-2">
291
- <div className="text-myblack hover:bg-mygreen/20 w-fit rounded border border-slate-200 p-2 text-sm">
291
+ <div className="w-fit rounded border border-slate-200 p-2 text-sm text-myblack hover:bg-mygreen/20">
292
292
  <div
293
293
  title="Configure this Widget"
294
294
  className="flex items-center gap-2 font-bold"
@@ -322,14 +322,14 @@ const StyleWidgetPanel = ({
322
322
  )}
323
323
 
324
324
  <div className="space-y-4">
325
- <ul className="text-mydarkgrey flex flex-wrap gap-x-4 gap-y-1">
325
+ <ul className="flex flex-wrap gap-x-4 gap-y-1 text-mydarkgrey">
326
326
  <li>
327
327
  <em>Actions:</em>
328
328
  </li>
329
329
  <li>
330
330
  <button
331
331
  onClick={handleImgAdd}
332
- className="text-myblue font-bold underline hover:text-black"
332
+ className="font-bold text-myblue underline hover:text-black"
333
333
  >
334
334
  Add Style
335
335
  </button>
@@ -366,14 +366,14 @@ const StyleWidgetPanel = ({
366
366
  )}
367
367
 
368
368
  <div className="space-y-4">
369
- <ul className="text-mydarkgrey flex flex-wrap gap-x-4 gap-y-1">
369
+ <ul className="flex flex-wrap gap-x-4 gap-y-1 text-mydarkgrey">
370
370
  <li>
371
371
  <em>Actions:</em>
372
372
  </li>
373
373
  <li>
374
374
  <button
375
375
  onClick={handleContainerAdd}
376
- className="text-myblue font-bold underline hover:text-black"
376
+ className="font-bold text-myblue underline hover:text-black"
377
377
  >
378
378
  Add Style
379
379
  </button>
@@ -407,14 +407,14 @@ const StyleWidgetPanel = ({
407
407
  )}
408
408
 
409
409
  <div className="space-y-4">
410
- <ul className="text-mydarkgrey flex flex-wrap gap-x-4 gap-y-1">
410
+ <ul className="flex flex-wrap gap-x-4 gap-y-1 text-mydarkgrey">
411
411
  <li>
412
412
  <em>Actions:</em>
413
413
  </li>
414
414
  <li>
415
415
  <button
416
416
  onClick={handleOuterAdd}
417
- className="text-myblue font-bold underline hover:text-black"
417
+ className="font-bold text-myblue underline hover:text-black"
418
418
  >
419
419
  Add Style
420
420
  </button>
@@ -214,9 +214,9 @@ const StyleWidgetPanelAdd = ({ node, parentNode, childId }: BasePanelProps) => {
214
214
  id="show-advanced"
215
215
  checked={showAdvanced}
216
216
  onChange={(e) => setShowAdvanced(e.target.checked)}
217
- className="border-mydarkgrey h-4 w-4 rounded text-cyan-600 focus:ring-cyan-600"
217
+ className="h-4 w-4 rounded border-mydarkgrey text-cyan-600 focus:ring-cyan-600"
218
218
  />
219
- <label htmlFor="show-advanced" className="text-mydarkgrey text-sm">
219
+ <label htmlFor="show-advanced" className="text-sm text-mydarkgrey">
220
220
  Show Advanced Styles
221
221
  </label>
222
222
  </div>
@@ -238,13 +238,13 @@ const StyleWidgetPanelAdd = ({ node, parentNode, childId }: BasePanelProps) => {
238
238
  <Combobox.Control ref={comboboxRef}>
239
239
  <div className="relative">
240
240
  <Combobox.Input
241
- className="border-mydarkgrey focus:border-myblue focus:ring-myblue w-full rounded-md py-2 pl-3 pr-10 text-xl shadow-sm"
241
+ className="w-full rounded-md border-mydarkgrey py-2 pl-3 pr-10 text-xl shadow-sm focus:border-myblue focus:ring-myblue"
242
242
  onChange={(e) => setQuery(e.target.value)}
243
243
  placeholder="Search styles..."
244
244
  />
245
245
  <Combobox.Trigger className="absolute inset-y-0 right-0 flex items-center pr-2">
246
246
  <ChevronUpDownIcon
247
- className="text-mydarkgrey h-5 w-5"
247
+ className="h-5 w-5 text-mydarkgrey"
248
248
  aria-hidden="true"
249
249
  />
250
250
  </Combobox.Trigger>
@@ -255,7 +255,7 @@ const StyleWidgetPanelAdd = ({ node, parentNode, childId }: BasePanelProps) => {
255
255
  <Combobox.Positioner style={{ zIndex: 1002 }}>
256
256
  <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">
257
257
  {collection.items.length === 0 ? (
258
- <div className="text-mydarkgrey relative cursor-default select-none px-4 py-2">
258
+ <div className="relative cursor-default select-none px-4 py-2 text-mydarkgrey">
259
259
  Nothing found.
260
260
  </div>
261
261
  ) : (
@@ -291,7 +291,7 @@ const StyleWidgetPanelAdd = ({ node, parentNode, childId }: BasePanelProps) => {
291
291
  <button
292
292
  key={style.key}
293
293
  onClick={() => handleSelect({ value: [style.key] })}
294
- className="hover:bg-mygreen/20 inline-flex items-center rounded-md bg-slate-50 px-3 py-2 text-sm text-black transition-colors duration-200"
294
+ className="inline-flex items-center rounded-md bg-slate-50 px-3 py-2 text-sm text-black transition-colors duration-200 hover:bg-mygreen/20"
295
295
  >
296
296
  <span className="font-bold">{style.title}</span>
297
297
  </button>
@@ -126,7 +126,7 @@ const StyleWidgetRemovePanel = ({
126
126
  <span className="ml-1">from {elementTypeTitle}?</span>
127
127
  </h3>
128
128
  <div className="space-y-4 rounded bg-slate-50 p-6">
129
- <ul className="text-mydarkgrey flex flex-wrap gap-x-4 gap-y-1">
129
+ <ul className="flex flex-wrap gap-x-4 gap-y-1 text-mydarkgrey">
130
130
  <li>
131
131
  <em>Are you sure?</em>
132
132
  </li>
@@ -269,16 +269,16 @@ const StyleWidgetUpdatePanel = ({
269
269
  type="checkbox"
270
270
  checked={isOverridden}
271
271
  onChange={(e) => handleToggleOverride(e.target.checked)}
272
- className="border-mydarkgrey text-myorange focus:ring-myorange h-4 w-4 rounded"
272
+ className="h-4 w-4 rounded border-mydarkgrey text-myorange focus:ring-myorange"
273
273
  />
274
- <span className="text-mydarkgrey text-sm">
274
+ <span className="text-sm text-mydarkgrey">
275
275
  {isOverridden
276
276
  ? 'Override mode. Styling this element only.'
277
277
  : 'You are in quick styles mode. Click to override this element.'}
278
278
  </span>
279
279
  </div>
280
280
 
281
- <div className="text-mydarkgrey my-3 flex flex-col gap-y-2.5 text-xl">
281
+ <div className="my-3 flex flex-col gap-y-2.5 text-xl text-mydarkgrey">
282
282
  <ViewportComboBox
283
283
  value={mobileValue}
284
284
  onFinalChange={handleFinalChange}
@@ -132,7 +132,7 @@ const StyleWordCarouselPanel = ({ node }: StyleWordCarouselPanelProps) => {
132
132
  Words (one per line)
133
133
  </label>
134
134
  <textarea
135
- className="focus:border-myblue focus:ring-myblue w-full rounded border border-gray-300 p-2 text-sm focus:ring-1"
135
+ className="w-full rounded border border-gray-300 p-2 text-sm focus:border-myblue focus:ring-1 focus:ring-myblue"
136
136
  rows={5}
137
137
  value={words}
138
138
  onChange={(e) => handleWordsChange(e.target.value)}
@@ -90,7 +90,7 @@ const SandboxUpgradeNotice = ({ onClose }: { onClose: () => void }) => (
90
90
  <div className="mt-6 flex justify-center gap-3">
91
91
  <a
92
92
  href="/sandbox/register"
93
- className="bg-myblue hover:bg-myorange rounded-md px-4 py-2 font-bold text-white"
93
+ className="rounded-md bg-myblue px-4 py-2 font-bold text-white hover:bg-myorange"
94
94
  >
95
95
  Sign Up Now
96
96
  </a>
@@ -138,7 +138,7 @@ export function SaveToLibraryModal({
138
138
 
139
139
  return (
140
140
  <div
141
- className="z-105 fixed inset-0 flex items-center justify-center bg-black bg-opacity-75"
141
+ className="fixed inset-0 z-105 flex items-center justify-center bg-black bg-opacity-75"
142
142
  onClick={saveState === 'idle' ? onClose : undefined}
143
143
  >
144
144
  <div
@@ -165,7 +165,7 @@ export function SaveToLibraryModal({
165
165
  id="category-select"
166
166
  value={selectedCategory}
167
167
  onChange={(e) => setSelectedCategory(e.target.value)}
168
- className="mt-1 block w-full rounded-md border-gray-300 py-2 pl-3 pr-10 text-base focus:border-cyan-500 focus:outline-none focus:ring-cyan-500 sm:text-sm"
168
+ className="sm:text-sm mt-1 block w-full rounded-md border-gray-300 py-2 pl-3 pr-10 text-base focus:border-cyan-500 focus:outline-none focus:ring-cyan-500"
169
169
  >
170
170
  {categories.map((cat) => (
171
171
  <option key={cat} value={cat}>
@@ -291,7 +291,7 @@ export const StylesMemory = ({ node, parentNode }: StylesMemoryProps) => {
291
291
  disabled={!hasMemory || isMatchingMemory}
292
292
  className={`transition-colors ${
293
293
  !hasMemory || isMatchingMemory
294
- ? 'text-mylightgrey cursor-not-allowed'
294
+ ? 'cursor-not-allowed text-mylightgrey'
295
295
  : 'text-mydarkgrey hover:text-black'
296
296
  }`}
297
297
  title={
@@ -134,7 +134,7 @@ const StoryFragmentConfigPanel = ({
134
134
  // Set SEO ready if description exists and is not empty
135
135
  const hasValidDescription = Boolean(
136
136
  storyFragmentContent?.description &&
137
- storyFragmentContent.description.trim() !== ''
137
+ storyFragmentContent.description.trim() !== ''
138
138
  );
139
139
 
140
140
  setIsSEOReady(hasValidDescription);
@@ -271,20 +271,20 @@ const StoryFragmentMenuPanel = ({
271
271
  >
272
272
  <div className="relative">
273
273
  <Combobox.Input
274
- className="border-mydarkgrey focus:border-myblue focus:ring-myblue w-full rounded-md border py-2 pl-3 pr-10 text-sm shadow-sm"
274
+ className="w-full rounded-md border border-mydarkgrey py-2 pl-3 pr-10 text-sm shadow-sm focus:border-myblue focus:ring-myblue"
275
275
  onChange={(e) => setQuery(e.target.value)}
276
276
  placeholder="Select a menu..."
277
277
  />
278
278
  <Combobox.Trigger className="absolute inset-y-0 right-0 flex items-center pr-2">
279
279
  <ChevronUpDownIcon
280
- className="text-mydarkgrey h-5 w-5"
280
+ className="h-5 w-5 text-mydarkgrey"
281
281
  aria-hidden="true"
282
282
  />
283
283
  </Combobox.Trigger>
284
284
  </div>
285
- <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 sm:text-sm">
285
+ <Combobox.Content className="sm: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">
286
286
  {filteredMenus.length === 0 && query !== '' ? (
287
- <div className="text-mydarkgrey relative cursor-default select-none px-4 py-2">
287
+ <div className="relative cursor-default select-none px-4 py-2 text-mydarkgrey">
288
288
  Nothing found.
289
289
  </div>
290
290
  ) : (
@@ -295,7 +295,7 @@ const StoryFragmentMenuPanel = ({
295
295
  className="menu-item relative cursor-default select-none py-2 pl-10 pr-4 text-gray-900"
296
296
  >
297
297
  <span className="block truncate">{menu.title}</span>
298
- <span className="menu-indicator text-myblue absolute inset-y-0 left-0 flex items-center pl-3">
298
+ <span className="menu-indicator absolute inset-y-0 left-0 flex items-center pl-3 text-myblue">
299
299
  <CheckIcon className="h-5 w-5" aria-hidden="true" />
300
300
  </span>
301
301
  </Combobox.Item>
@@ -382,7 +382,7 @@ function BunnyWidget({ node, onUpdate }: BunnyWidgetProps) {
382
382
  </Dialog.Title>
383
383
  </div>
384
384
  <div className="flex-1 overflow-y-auto p-4">
385
- <div className="grid grid-cols-1 gap-4 lg:grid-cols-2">
385
+ <div className="lg:grid-cols-2 grid grid-cols-1 gap-4">
386
386
  <div className="rounded-lg border border-gray-200 bg-white shadow-sm">
387
387
  <div className="flex items-center justify-between border-b border-gray-200 p-3">
388
388
  <h3 className="text-base font-bold text-gray-900">
@@ -433,7 +433,7 @@ function BunnyWidget({ node, onUpdate }: BunnyWidgetProps) {
433
433
  onBlur={() =>
434
434
  handleUpdate(videoId, title, chapters)
435
435
  }
436
- className={`mt-1 block w-full rounded-md border-gray-300 px-2 py-1 shadow-sm sm:text-sm ${formErrors[`title-${index}`] ? 'border-red-300' : 'focus:border-cyan-500 focus:ring-cyan-500'}`}
436
+ className={`sm:text-sm mt-1 block w-full rounded-md border-gray-300 px-2 py-1 shadow-sm ${formErrors[`title-${index}`] ? 'border-red-300' : 'focus:border-cyan-500 focus:ring-cyan-500'}`}
437
437
  />
438
438
  </div>
439
439
  <div>
@@ -451,7 +451,7 @@ function BunnyWidget({ node, onUpdate }: BunnyWidgetProps) {
451
451
  onBlur={() =>
452
452
  handleUpdate(videoId, title, chapters)
453
453
  }
454
- className="mt-1 block w-full rounded-md border-gray-300 px-2 py-1 shadow-sm focus:border-cyan-500 focus:ring-cyan-500 sm:text-sm"
454
+ className="sm:text-sm mt-1 block w-full rounded-md border-gray-300 px-2 py-1 shadow-sm focus:border-cyan-500 focus:ring-cyan-500"
455
455
  />
456
456
  </div>
457
457
  <div className="grid grid-cols-2 gap-2">
@@ -472,7 +472,7 @@ function BunnyWidget({ node, onUpdate }: BunnyWidgetProps) {
472
472
  onBlur={() =>
473
473
  handleUpdate(videoId, title, chapters)
474
474
  }
475
- className={`mt-1 block w-full rounded-md border-gray-300 px-2 py-1 shadow-sm sm:text-sm ${formErrors[`startTime-${index}`] || formErrors[`overlap-${index}`] ? 'border-red-300' : 'focus:border-cyan-500 focus:ring-cyan-500'}`}
475
+ className={`sm:text-sm mt-1 block w-full rounded-md border-gray-300 px-2 py-1 shadow-sm ${formErrors[`startTime-${index}`] || formErrors[`overlap-${index}`] ? 'border-red-300' : 'focus:border-cyan-500 focus:ring-cyan-500'}`}
476
476
  />
477
477
  </div>
478
478
  <div>
@@ -491,7 +491,7 @@ function BunnyWidget({ node, onUpdate }: BunnyWidgetProps) {
491
491
  onBlur={() =>
492
492
  handleUpdate(videoId, title, chapters)
493
493
  }
494
- className={`mt-1 block w-full rounded-md border-gray-300 px-2 py-1 shadow-sm sm:text-sm ${formErrors[`endTime-${index}`] || formErrors[`overlap-${index}`] ? 'border-red-300' : 'focus:border-cyan-500 focus:ring-cyan-500'}`}
494
+ className={`sm:text-sm mt-1 block w-full rounded-md border-gray-300 px-2 py-1 shadow-sm ${formErrors[`endTime-${index}`] || formErrors[`overlap-${index}`] ? 'border-red-300' : 'focus:border-cyan-500 focus:ring-cyan-500'}`}
495
495
  />
496
496
  </div>
497
497
  </div>
@@ -621,7 +621,7 @@ export default function InteractiveDisclosureWidget({
621
621
  <h3 className="font-bold text-gray-800">
622
622
  Widget Styles
623
623
  </h3>
624
- <div className="grid grid-cols-1 gap-4 sm:grid-cols-3">
624
+ <div className="sm:grid-cols-3 grid grid-cols-1 gap-4">
625
625
  <div>
626
626
  <ColorPickerCombo
627
627
  title="Background Color"
@@ -124,7 +124,7 @@ function SignupWidget({ node, onUpdate }: SignupWidgetProps) {
124
124
  >
125
125
  <div className="relative mt-1">
126
126
  <Combobox.Input
127
- className="focus:border-myblue focus:ring-myblue w-full rounded-md border border-gray-300 py-2 pl-3 pr-10 text-sm shadow-sm"
127
+ className="w-full rounded-md border border-gray-300 py-2 pl-3 pr-10 text-sm shadow-sm focus:border-myblue focus:ring-myblue"
128
128
  placeholder="Select contact persona..."
129
129
  defaultValue={selectedPersonaTitle}
130
130
  />
@@ -135,7 +135,7 @@ function SignupWidget({ node, onUpdate }: SignupWidgetProps) {
135
135
  />
136
136
  </Combobox.Trigger>
137
137
  </div>
138
- <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 sm:text-sm">
138
+ <Combobox.Content className="sm: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">
139
139
  {collection.items.length === 0 ? (
140
140
  <div className="relative cursor-default select-none px-4 py-2 text-gray-700">
141
141
  Nothing found.
@@ -151,7 +151,7 @@ function SignupWidget({ node, onUpdate }: SignupWidgetProps) {
151
151
  <span className="block text-sm text-gray-500">
152
152
  {persona.description}
153
153
  </span>
154
- <span className="persona-indicator text-myblue absolute inset-y-0 left-0 flex items-center pl-3">
154
+ <span className="persona-indicator absolute inset-y-0 left-0 flex items-center pl-3 text-myblue">
155
155
  <CheckIcon className="h-5 w-5" aria-hidden="true" />
156
156
  </span>
157
157
  </Combobox.Item>
@@ -109,11 +109,11 @@ function TimeSelectModal({
109
109
  value={manualTime}
110
110
  onChange={handleManualTimeChange}
111
111
  placeholder="Enter time in seconds"
112
- className="focus:ring-myorange rounded border px-3 py-2 focus:outline-none focus:ring-2"
112
+ className="rounded border px-3 py-2 focus:outline-none focus:ring-2 focus:ring-myorange"
113
113
  />
114
114
  <button
115
115
  onClick={handleSeekToTime}
116
- className="bg-myblue rounded px-4 py-2 text-white hover:bg-blue-600"
116
+ className="rounded bg-myblue px-4 py-2 text-white hover:bg-blue-600"
117
117
  >
118
118
  Seek
119
119
  </button>
@@ -128,7 +128,7 @@ function TimeSelectModal({
128
128
  </button>
129
129
  <button
130
130
  onClick={handleGetCurrentTime}
131
- className="bg-myorange rounded px-4 py-2 text-white hover:bg-orange-600"
131
+ className="rounded bg-myorange px-4 py-2 text-white hover:bg-orange-600"
132
132
  >
133
133
  Use Current Time {currentTime > 0 ? `(${currentTime}s)` : ''}
134
134
  </button>
@@ -258,7 +258,7 @@ export default function ActionBuilderTimeSelector({
258
258
  >
259
259
  <div className="relative">
260
260
  <Combobox.Input
261
- className="focus:border-myblue focus:ring-myblue w-full rounded-md border border-gray-300 px-3 py-2 shadow-sm"
261
+ className="w-full rounded-md border border-gray-300 px-3 py-2 shadow-sm focus:border-myblue focus:ring-myblue"
262
262
  placeholder={placeholder}
263
263
  autoComplete="off"
264
264
  />
@@ -270,7 +270,7 @@ export default function ActionBuilderTimeSelector({
270
270
  </Combobox.Trigger>
271
271
  </div>
272
272
 
273
- <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 sm:text-sm">
273
+ <Combobox.Content className="sm: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">
274
274
  {availableVideos.length > 0 ? (
275
275
  collection.items.length === 0 ? (
276
276
  <div className="relative cursor-default select-none px-4 py-2 text-gray-700">
@@ -326,14 +326,14 @@ export default function ActionBuilderTimeSelector({
326
326
  {value !== '' && (
327
327
  <button
328
328
  onClick={() => handleTimeSelect(value)}
329
- className="bg-myblue rounded px-4 py-2 text-white hover:bg-blue-600"
329
+ className="rounded bg-myblue px-4 py-2 text-white hover:bg-blue-600"
330
330
  >
331
331
  Start at {value}s
332
332
  </button>
333
333
  )}
334
334
  <button
335
335
  onClick={() => setShowModal(true)}
336
- className="bg-myorange rounded px-4 py-2 text-white hover:bg-orange-600"
336
+ className="rounded bg-myorange px-4 py-2 text-white hover:bg-orange-600"
337
337
  >
338
338
  Find Time
339
339
  </button>
@@ -265,9 +265,9 @@ const ArtpackImage = ({ paneId, onUpdate }: ArtpackImageProps) => {
265
265
  ></div>
266
266
  <button
267
267
  onClick={handleRemoveImage}
268
- className="hover:bg-mylightgrey absolute right-2 top-2 rounded-full bg-white p-1 shadow-md"
268
+ className="absolute right-2 top-2 rounded-full bg-white p-1 shadow-md hover:bg-mylightgrey"
269
269
  >
270
- <XMarkIcon className="text-mydarkgrey h-4 w-4" />
270
+ <XMarkIcon className="h-4 w-4 text-mydarkgrey" />
271
271
  </button>
272
272
  </div>
273
273
  )}
@@ -275,7 +275,7 @@ const ArtpackImage = ({ paneId, onUpdate }: ArtpackImageProps) => {
275
275
  <div className="flex items-center justify-between">
276
276
  <button
277
277
  onClick={() => setIsModalOpen(true)}
278
- className="text-myblue flex items-center text-sm hover:text-cyan-600"
278
+ className="flex items-center text-sm text-myblue hover:text-cyan-600"
279
279
  >
280
280
  <SwatchIcon className="mr-1 h-4 w-4" />
281
281
  {previewUrl ? 'Change Artpack Image' : 'Use Artpack Image'}
@@ -300,7 +300,7 @@ const ArtpackImage = ({ paneId, onUpdate }: ArtpackImageProps) => {
300
300
  onChange={() =>
301
301
  handleObjectFitChange(fit as 'cover' | 'contain' | 'fill')
302
302
  }
303
- className="text-myblue focus:ring-myblue h-4 w-4 border-gray-300"
303
+ className="h-4 w-4 border-gray-300 text-myblue focus:ring-myblue"
304
304
  />
305
305
  <span className="ml-2 text-sm capitalize text-gray-700">
306
306
  {fit}
@@ -328,7 +328,7 @@ const ArtpackImage = ({ paneId, onUpdate }: ArtpackImageProps) => {
328
328
  e.target.checked
329
329
  )
330
330
  }
331
- className="text-myblue focus:ring-myblue h-4 w-4 rounded border-gray-300"
331
+ className="h-4 w-4 rounded border-gray-300 text-myblue focus:ring-myblue"
332
332
  />
333
333
  <span className="ml-2 text-sm capitalize text-gray-700">
334
334
  {viewport}
@@ -367,7 +367,7 @@ const ArtpackImage = ({ paneId, onUpdate }: ArtpackImageProps) => {
367
367
  ) : (
368
368
  <div className="space-y-6">
369
369
  <div>
370
- <label className="text-mydarkgrey mb-2 block text-sm font-bold">
370
+ <label className="mb-2 block text-sm font-bold text-mydarkgrey">
371
371
  Select Collection
372
372
  </label>
373
373
  <Combobox.Root
@@ -382,20 +382,20 @@ const ArtpackImage = ({ paneId, onUpdate }: ArtpackImageProps) => {
382
382
  composite={true}
383
383
  >
384
384
  <div className="relative">
385
- <div className="focus-within:border-myblue focus-within:ring-myblue relative w-full cursor-default overflow-hidden rounded-lg border border-gray-300 bg-white text-left shadow-sm focus-within:ring-1">
385
+ <div className="relative w-full cursor-default overflow-hidden rounded-lg border border-gray-300 bg-white text-left shadow-sm focus-within:border-myblue focus-within:ring-1 focus-within:ring-myblue">
386
386
  <Combobox.Input
387
- className="text-mydarkgrey w-full border-none py-2 pl-3 pr-10 text-sm leading-5 focus:ring-0"
387
+ className="w-full border-none py-2 pl-3 pr-10 text-sm leading-5 text-mydarkgrey focus:ring-0"
388
388
  placeholder="Select a collection..."
389
389
  autoComplete="off"
390
390
  />
391
391
  <Combobox.Trigger className="absolute inset-y-0 right-0 flex items-center pr-2">
392
392
  <ChevronUpDownIcon
393
- className="text-mydarkgrey h-5 w-5"
393
+ className="h-5 w-5 text-mydarkgrey"
394
394
  aria-hidden="true"
395
395
  />
396
396
  </Combobox.Trigger>
397
397
  </div>
398
- <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 sm:text-sm">
398
+ <Combobox.Content className="sm: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">
399
399
  {collection.items.length === 0 ? (
400
400
  <div className="relative cursor-default select-none px-4 py-2 text-gray-700">
401
401
  No collections found.
@@ -405,7 +405,7 @@ const ArtpackImage = ({ paneId, onUpdate }: ArtpackImageProps) => {
405
405
  <Combobox.Item
406
406
  key={item}
407
407
  item={item}
408
- className="collection-item text-mydarkgrey relative cursor-default select-none py-2 pl-10 pr-4"
408
+ className="collection-item relative cursor-default select-none py-2 pl-10 pr-4 text-mydarkgrey"
409
409
  >
410
410
  <span className="block truncate">{item}</span>
411
411
  <span className="collection-indicator absolute inset-y-0 left-0 flex items-center pl-3 text-cyan-600">
@@ -426,10 +426,10 @@ const ArtpackImage = ({ paneId, onUpdate }: ArtpackImageProps) => {
426
426
  selectedCollection &&
427
427
  availableImages.length > 0 ? (
428
428
  <div>
429
- <label className="text-mydarkgrey mb-2 block text-sm font-bold">
429
+ <label className="mb-2 block text-sm font-bold text-mydarkgrey">
430
430
  Select Image from {selectedCollection}
431
431
  </label>
432
- <div className="grid grid-cols-2 gap-4 p-2 sm:grid-cols-3 md:grid-cols-4">
432
+ <div className="sm:grid-cols-3 grid grid-cols-2 gap-4 p-2 md:grid-cols-4">
433
433
  {availableImages.map((image) => (
434
434
  <div
435
435
  key={image}
@@ -451,7 +451,7 @@ const ArtpackImage = ({ paneId, onUpdate }: ArtpackImageProps) => {
451
451
  className="aspect-video w-full object-cover"
452
452
  />
453
453
  <div className="absolute inset-0 flex items-center justify-center bg-black bg-opacity-0 transition-opacity hover:bg-opacity-20">
454
- <span className="text-mydarkgrey max-w-full truncate rounded bg-white bg-opacity-80 px-2 py-1 text-xs">
454
+ <span className="max-w-full truncate rounded bg-white bg-opacity-80 px-2 py-1 text-xs text-mydarkgrey">
455
455
  {image}
456
456
  </span>
457
457
  </div>
@@ -466,7 +466,7 @@ const ArtpackImage = ({ paneId, onUpdate }: ArtpackImageProps) => {
466
466
  ) : null}
467
467
 
468
468
  <div className="mt-4 flex justify-end space-x-3">
469
- <Dialog.CloseTrigger className="bg-mylightgrey text-mydarkgrey rounded px-4 py-2 hover:bg-gray-300">
469
+ <Dialog.CloseTrigger className="rounded bg-mylightgrey px-4 py-2 text-mydarkgrey hover:bg-gray-300">
470
470
  Cancel
471
471
  </Dialog.CloseTrigger>
472
472
  </div>
@@ -338,9 +338,9 @@ const BackgroundImage = ({ paneId, onUpdate }: BackgroundImageProps) => {
338
338
  <button
339
339
  onClick={handleRemoveImage}
340
340
  disabled={isProcessing}
341
- className="hover:bg-mylightgrey absolute right-2 top-2 rounded-full bg-white p-1 shadow-md disabled:opacity-50"
341
+ className="absolute right-2 top-2 rounded-full bg-white p-1 shadow-md hover:bg-mylightgrey disabled:opacity-50"
342
342
  >
343
- <XMarkIcon className="text-mydarkgrey h-4 w-4" />
343
+ <XMarkIcon className="h-4 w-4 text-mydarkgrey" />
344
344
  </button>
345
345
  </div>
346
346
  ) : null}
@@ -350,7 +350,7 @@ const BackgroundImage = ({ paneId, onUpdate }: BackgroundImageProps) => {
350
350
  <button
351
351
  onClick={() => fileInputRef.current?.click()}
352
352
  disabled={isProcessing}
353
- className={`text-myblue flex items-center text-sm hover:text-cyan-600`}
353
+ className={`flex items-center text-sm text-myblue hover:text-cyan-600`}
354
354
  >
355
355
  <ArrowUpTrayIcon className="mr-1 h-4 w-4" />
356
356
  {isProcessing
@@ -362,7 +362,7 @@ const BackgroundImage = ({ paneId, onUpdate }: BackgroundImageProps) => {
362
362
 
363
363
  <button
364
364
  onClick={() => setIsSelectingFile(true)}
365
- className="text-myblue flex items-center text-sm hover:text-cyan-600"
365
+ className="flex items-center text-sm text-myblue hover:text-cyan-600"
366
366
  >
367
367
  <FolderIcon className="mr-1 h-4 w-4" />
368
368
  Select Image
@@ -399,7 +399,7 @@ const BackgroundImage = ({ paneId, onUpdate }: BackgroundImageProps) => {
399
399
  onChange={() =>
400
400
  handleObjectFitChange(fit as 'cover' | 'contain' | 'fill')
401
401
  }
402
- className="text-myblue focus:ring-myblue h-4 w-4 border-gray-300"
402
+ className="h-4 w-4 border-gray-300 text-myblue focus:ring-myblue"
403
403
  />
404
404
  <span className="ml-2 text-sm capitalize text-gray-700">
405
405
  {fit}
@@ -427,7 +427,7 @@ const BackgroundImage = ({ paneId, onUpdate }: BackgroundImageProps) => {
427
427
  e.target.checked
428
428
  )
429
429
  }
430
- className="text-myblue focus:ring-myblue h-4 w-4 rounded border-gray-300"
430
+ className="h-4 w-4 rounded border-gray-300 text-myblue focus:ring-myblue"
431
431
  />
432
432
  <span className="ml-2 text-sm capitalize text-gray-700">
433
433
  {viewport}
@@ -450,7 +450,7 @@ const BackgroundImage = ({ paneId, onUpdate }: BackgroundImageProps) => {
450
450
  value={localAltDescription}
451
451
  onChange={(e) => setLocalAltDescription(e.target.value)}
452
452
  onBlur={handleAltDescriptionBlur}
453
- className="border-mylightgrey focus:border-myblue focus:ring-myblue block w-full rounded-md border px-3 py-2 text-sm focus:outline-none focus:ring-1"
453
+ className="block w-full rounded-md border border-mylightgrey px-3 py-2 text-sm focus:border-myblue focus:outline-none focus:ring-1 focus:ring-myblue"
454
454
  placeholder="Describe this image for accessibility"
455
455
  />
456
456
  </div>
@@ -479,20 +479,20 @@ const BackgroundImage = ({ paneId, onUpdate }: BackgroundImageProps) => {
479
479
  <Combobox.Control className="relative">
480
480
  <Combobox.Input
481
481
  placeholder="Search files..."
482
- className="border-mylightgrey focus:border-myblue focus:ring-myblue block w-full rounded-md border px-3 py-2 pr-10 text-sm focus:outline-none focus:ring-1"
482
+ className="block w-full rounded-md border border-mylightgrey px-3 py-2 pr-10 text-sm focus:border-myblue focus:outline-none focus:ring-1 focus:ring-myblue"
483
483
  />
484
484
  <Combobox.Trigger className="absolute inset-y-0 right-0 flex items-center pr-2">
485
- <ChevronUpDownIcon className="text-mydarkgrey h-5 w-5" />
485
+ <ChevronUpDownIcon className="h-5 w-5 text-mydarkgrey" />
486
486
  </Combobox.Trigger>
487
487
  </Combobox.Control>
488
488
 
489
489
  <Combobox.Positioner>
490
- <Combobox.Content className="border-mylightgrey max-h-60 w-full overflow-auto rounded-md border bg-white shadow-lg">
490
+ <Combobox.Content className="max-h-60 w-full overflow-auto rounded-md border border-mylightgrey bg-white shadow-lg">
491
491
  {collection.items.map((file) => (
492
492
  <Combobox.Item
493
493
  key={file.id}
494
494
  item={file}
495
- className="file-item hover:bg-mylightgrey relative cursor-pointer select-none px-3 py-2 text-sm"
495
+ className="file-item relative cursor-pointer select-none px-3 py-2 text-sm hover:bg-mylightgrey"
496
496
  >
497
497
  <div className="flex items-center justify-between">
498
498
  <div className="flex flex-1 items-center">
@@ -511,13 +511,13 @@ const BackgroundImage = ({ paneId, onUpdate }: BackgroundImageProps) => {
511
511
  {file.altDescription || file.filename}
512
512
  </div>
513
513
  {file.altDescription && (
514
- <div className="text-mydarkgrey text-xs">
514
+ <div className="text-xs text-mydarkgrey">
515
515
  {file.filename}
516
516
  </div>
517
517
  )}
518
518
  </div>
519
519
  </div>
520
- <CheckIcon className="file-indicator text-myblue h-4 w-4 flex-shrink-0" />
520
+ <CheckIcon className="file-indicator h-4 w-4 flex-shrink-0 text-myblue" />
521
521
  </div>
522
522
  </Combobox.Item>
523
523
  ))}
@@ -163,7 +163,7 @@ const BackgroundImageWrapper = ({ paneId }: BackgroundImageWrapperProps) => {
163
163
  allowNull={true}
164
164
  />
165
165
  {!bgNode && (
166
- <div className="flex flex-col gap-4 sm:flex-row">
166
+ <div className="sm:flex-row flex flex-col gap-4">
167
167
  <div className="flex-1">
168
168
  <h4 className="mb-2 text-sm font-bold text-gray-700">
169
169
  Background Image
@@ -204,7 +204,7 @@ const BackgroundImageWrapper = ({ paneId }: BackgroundImageWrapperProps) => {
204
204
  Position
205
205
  </Select.Label>
206
206
  <Select.Control>
207
- <Select.Trigger className="focus:border-myblue focus:ring-myblue flex w-full items-center justify-between rounded-md border border-gray-300 bg-white px-3 py-2 text-sm shadow-sm focus:outline-none focus:ring-1">
207
+ <Select.Trigger className="flex w-full items-center justify-between rounded-md border border-gray-300 bg-white px-3 py-2 text-sm shadow-sm focus:border-myblue focus:outline-none focus:ring-1 focus:ring-myblue">
208
208
  <Select.ValueText
209
209
  className="capitalize"
210
210
  placeholder="Select a position"
@@ -249,7 +249,7 @@ const BackgroundImageWrapper = ({ paneId }: BackgroundImageWrapperProps) => {
249
249
  value={s}
250
250
  checked={size === s}
251
251
  onChange={() => handleSizeChange(s)}
252
- className="text-myblue focus:ring-myblue h-4 w-4 border-gray-300"
252
+ className="h-4 w-4 border-gray-300 text-myblue focus:ring-myblue"
253
253
  />
254
254
  <span className="ml-2 text-sm capitalize text-gray-700">
255
255
  {s === 'narrow'