@actuate-media/cms-admin 0.9.0 → 0.11.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 (294) hide show
  1. package/dist/AdminRoot.d.ts.map +1 -1
  2. package/dist/AdminRoot.js +8 -5
  3. package/dist/AdminRoot.js.map +1 -1
  4. package/dist/__tests__/layout/primitives.test.d.ts +2 -0
  5. package/dist/__tests__/layout/primitives.test.d.ts.map +1 -0
  6. package/dist/__tests__/layout/primitives.test.js +34 -0
  7. package/dist/__tests__/layout/primitives.test.js.map +1 -0
  8. package/dist/__tests__/lib/cv.test.d.ts +2 -0
  9. package/dist/__tests__/lib/cv.test.d.ts.map +1 -0
  10. package/dist/__tests__/lib/cv.test.js +66 -0
  11. package/dist/__tests__/lib/cv.test.js.map +1 -0
  12. package/dist/actuate-admin.css +1 -1
  13. package/dist/assets/actuate-logo.d.ts +36 -0
  14. package/dist/assets/actuate-logo.d.ts.map +1 -0
  15. package/dist/assets/actuate-logo.js +15 -0
  16. package/dist/assets/actuate-logo.js.map +1 -0
  17. package/dist/components/Breadcrumbs.js +2 -2
  18. package/dist/components/CommandPalette.js +10 -10
  19. package/dist/components/ContentOverviewChart.js +3 -3
  20. package/dist/components/ErrorBoundary.js +1 -1
  21. package/dist/components/FocalPointPicker.js +2 -2
  22. package/dist/components/FolderTree.js +20 -20
  23. package/dist/components/LivePreview.js +3 -3
  24. package/dist/components/LocaleSwitcher.js +1 -1
  25. package/dist/components/MediaPickerModal.js +4 -4
  26. package/dist/components/PresenceIndicator.js +1 -1
  27. package/dist/components/SEOConfigPanel.d.ts +2 -0
  28. package/dist/components/SEOConfigPanel.d.ts.map +1 -0
  29. package/dist/components/SEOConfigPanel.js +174 -0
  30. package/dist/components/SEOConfigPanel.js.map +1 -0
  31. package/dist/components/SEOPanel.js +9 -9
  32. package/dist/components/SEOPerformance.js +2 -2
  33. package/dist/components/SchedulePublishDialog.d.ts +18 -0
  34. package/dist/components/SchedulePublishDialog.d.ts.map +1 -0
  35. package/dist/components/SchedulePublishDialog.js +106 -0
  36. package/dist/components/SchedulePublishDialog.js.map +1 -0
  37. package/dist/components/SharePreviewLinkDialog.d.ts +17 -0
  38. package/dist/components/SharePreviewLinkDialog.d.ts.map +1 -0
  39. package/dist/components/SharePreviewLinkDialog.js +83 -0
  40. package/dist/components/SharePreviewLinkDialog.js.map +1 -0
  41. package/dist/components/TipTapEditor.js +5 -5
  42. package/dist/components/VersionHistory.js +2 -2
  43. package/dist/components/ui/Badge.d.ts +33 -3
  44. package/dist/components/ui/Badge.d.ts.map +1 -1
  45. package/dist/components/ui/Badge.js +42 -8
  46. package/dist/components/ui/Badge.js.map +1 -1
  47. package/dist/components/ui/Button.d.ts +19 -8
  48. package/dist/components/ui/Button.d.ts.map +1 -1
  49. package/dist/components/ui/Button.js +35 -14
  50. package/dist/components/ui/Button.js.map +1 -1
  51. package/dist/components/ui/Card.d.ts +26 -0
  52. package/dist/components/ui/Card.d.ts.map +1 -0
  53. package/dist/components/ui/Card.js +45 -0
  54. package/dist/components/ui/Card.js.map +1 -0
  55. package/dist/components/ui/DataTable.js +1 -1
  56. package/dist/components/ui/Input.d.ts +15 -0
  57. package/dist/components/ui/Input.d.ts.map +1 -0
  58. package/dist/components/ui/Input.js +23 -0
  59. package/dist/components/ui/Input.js.map +1 -0
  60. package/dist/components/ui/SearchInput.js +1 -1
  61. package/dist/components/ui/Select.d.ts +16 -0
  62. package/dist/components/ui/Select.d.ts.map +1 -0
  63. package/dist/components/ui/Select.js +25 -0
  64. package/dist/components/ui/Select.js.map +1 -0
  65. package/dist/components/ui/Toast.js +1 -1
  66. package/dist/components/ui/index.d.ts +10 -4
  67. package/dist/components/ui/index.d.ts.map +1 -1
  68. package/dist/components/ui/index.js +5 -2
  69. package/dist/components/ui/index.js.map +1 -1
  70. package/dist/fields/BlockBuilderField.js +3 -3
  71. package/dist/fields/DateField.js +1 -1
  72. package/dist/fields/RelationshipField.js +3 -3
  73. package/dist/fields/TextField.js +1 -1
  74. package/dist/index.d.ts +6 -0
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +5 -0
  77. package/dist/index.js.map +1 -1
  78. package/dist/layout/Header.js +1 -1
  79. package/dist/layout/Layout.d.ts +14 -0
  80. package/dist/layout/Layout.d.ts.map +1 -1
  81. package/dist/layout/Layout.js +17 -11
  82. package/dist/layout/Layout.js.map +1 -1
  83. package/dist/layout/Sidebar.d.ts.map +1 -1
  84. package/dist/layout/Sidebar.js +21 -11
  85. package/dist/layout/Sidebar.js.map +1 -1
  86. package/dist/layout/primitives/AdminShell.d.ts +43 -0
  87. package/dist/layout/primitives/AdminShell.d.ts.map +1 -0
  88. package/dist/layout/primitives/AdminShell.js +51 -0
  89. package/dist/layout/primitives/AdminShell.js.map +1 -0
  90. package/dist/layout/primitives/Box.d.ts +19 -0
  91. package/dist/layout/primitives/Box.d.ts.map +1 -0
  92. package/dist/layout/primitives/Box.js +12 -0
  93. package/dist/layout/primitives/Box.js.map +1 -0
  94. package/dist/layout/primitives/Cluster.d.ts +27 -0
  95. package/dist/layout/primitives/Cluster.d.ts.map +1 -0
  96. package/dist/layout/primitives/Cluster.js +37 -0
  97. package/dist/layout/primitives/Cluster.js.map +1 -0
  98. package/dist/layout/primitives/Grid.d.ts +45 -0
  99. package/dist/layout/primitives/Grid.d.ts.map +1 -0
  100. package/dist/layout/primitives/Grid.js +59 -0
  101. package/dist/layout/primitives/Grid.js.map +1 -0
  102. package/dist/layout/primitives/PageContainer.d.ts +36 -0
  103. package/dist/layout/primitives/PageContainer.d.ts.map +1 -0
  104. package/dist/layout/primitives/PageContainer.js +41 -0
  105. package/dist/layout/primitives/PageContainer.js.map +1 -0
  106. package/dist/layout/primitives/Split.d.ts +34 -0
  107. package/dist/layout/primitives/Split.d.ts.map +1 -0
  108. package/dist/layout/primitives/Split.js +27 -0
  109. package/dist/layout/primitives/Split.js.map +1 -0
  110. package/dist/layout/primitives/Stack.d.ts +23 -0
  111. package/dist/layout/primitives/Stack.d.ts.map +1 -0
  112. package/dist/layout/primitives/Stack.js +34 -0
  113. package/dist/layout/primitives/Stack.js.map +1 -0
  114. package/dist/layout/primitives/index.d.ts +30 -0
  115. package/dist/layout/primitives/index.d.ts.map +1 -0
  116. package/dist/layout/primitives/index.js +22 -0
  117. package/dist/layout/primitives/index.js.map +1 -0
  118. package/dist/layout/primitives/tokens.d.ts +48 -0
  119. package/dist/layout/primitives/tokens.d.ts.map +1 -0
  120. package/dist/layout/primitives/tokens.js +54 -0
  121. package/dist/layout/primitives/tokens.js.map +1 -0
  122. package/dist/lib/cv.d.ts +53 -0
  123. package/dist/lib/cv.d.ts.map +1 -0
  124. package/dist/lib/cv.js +39 -0
  125. package/dist/lib/cv.js.map +1 -0
  126. package/dist/views/ApiKeys.d.ts.map +1 -1
  127. package/dist/views/ApiKeys.js +13 -11
  128. package/dist/views/ApiKeys.js.map +1 -1
  129. package/dist/views/CollectionList.js +8 -8
  130. package/dist/views/Dashboard.d.ts.map +1 -1
  131. package/dist/views/Dashboard.js +333 -78
  132. package/dist/views/Dashboard.js.map +1 -1
  133. package/dist/views/DocumentEdit.d.ts.map +1 -1
  134. package/dist/views/DocumentEdit.js +17 -5
  135. package/dist/views/DocumentEdit.js.map +1 -1
  136. package/dist/views/ForgotPassword.js +2 -2
  137. package/dist/views/FormEditor.js +5 -5
  138. package/dist/views/FormSubmissions.js +6 -6
  139. package/dist/views/Forms.js +2 -2
  140. package/dist/views/Login.d.ts +16 -1
  141. package/dist/views/Login.d.ts.map +1 -1
  142. package/dist/views/Login.js +17 -7
  143. package/dist/views/Login.js.map +1 -1
  144. package/dist/views/MediaBrowser.js +16 -16
  145. package/dist/views/PageEditor.js +2 -2
  146. package/dist/views/Pages.js +10 -10
  147. package/dist/views/PostEditor.js +2 -2
  148. package/dist/views/Posts.js +4 -4
  149. package/dist/views/Redirects.js +4 -4
  150. package/dist/views/ResetPassword.js +2 -2
  151. package/dist/views/SEO.js +6 -6
  152. package/dist/views/ScriptTagEditor.js +4 -4
  153. package/dist/views/ScriptTags.js +2 -2
  154. package/dist/views/Settings.d.ts.map +1 -1
  155. package/dist/views/Settings.js +9 -8
  156. package/dist/views/Settings.js.map +1 -1
  157. package/dist/views/SetupWizard.js +2 -2
  158. package/dist/views/Users.js +4 -4
  159. package/dist/views/page-builder/AIBlockAssist.js +1 -1
  160. package/dist/views/page-builder/AIGenerateDialog.js +10 -10
  161. package/dist/views/page-builder/BlockEditor.js +10 -10
  162. package/dist/views/page-builder/BlockPicker.js +4 -4
  163. package/dist/views/page-builder/BottomBar.js +1 -1
  164. package/dist/views/page-builder/BuilderToolbar.js +2 -2
  165. package/dist/views/page-builder/ContextPanel.js +2 -2
  166. package/dist/views/page-builder/DesignScore.js +9 -9
  167. package/dist/views/page-builder/NodeSettings.js +8 -8
  168. package/dist/views/page-builder/PageBuilder.js +3 -3
  169. package/dist/views/page-builder/PageSettings.js +1 -1
  170. package/dist/views/page-builder/PageTemplates.js +2 -2
  171. package/dist/views/page-builder/SEOPanel.js +13 -13
  172. package/dist/views/page-builder/SavedSections.js +5 -5
  173. package/dist/views/page-builder/TemplatePicker.js +2 -2
  174. package/dist/views/page-builder/block-renderers/CTAPreview.js +5 -5
  175. package/dist/views/page-builder/block-renderers/CardsPreview.js +1 -1
  176. package/dist/views/page-builder/block-renderers/CodePreview.js +1 -1
  177. package/dist/views/page-builder/block-renderers/FAQPreview.js +3 -3
  178. package/dist/views/page-builder/block-renderers/FallbackPreview.js +1 -1
  179. package/dist/views/page-builder/block-renderers/FormPreview.js +3 -3
  180. package/dist/views/page-builder/block-renderers/GalleryPreview.js +5 -5
  181. package/dist/views/page-builder/block-renderers/HeroPreview.js +3 -3
  182. package/dist/views/page-builder/block-renderers/ImagePreview.js +3 -3
  183. package/dist/views/page-builder/block-renderers/TextPreview.js +3 -3
  184. package/dist/views/page-builder/block-renderers/VideoPreview.js +4 -4
  185. package/dist/views/page-builder/canvas/BlockRenderer.js +1 -1
  186. package/dist/views/page-builder/canvas/BuilderCanvas.js +3 -3
  187. package/dist/views/page-builder/canvas/ColumnRenderer.js +2 -2
  188. package/dist/views/page-builder/canvas/ContainerRenderer.js +2 -2
  189. package/dist/views/page-builder/canvas/RowRenderer.js +2 -2
  190. package/dist/views/page-builder/canvas/SectionRenderer.js +2 -2
  191. package/package.json +6 -2
  192. package/src/AdminRoot.tsx +21 -11
  193. package/src/__tests__/layout/primitives.test.ts +37 -0
  194. package/src/__tests__/lib/cv.test.ts +74 -0
  195. package/src/assets/actuate-logo.tsx +72 -0
  196. package/src/components/Breadcrumbs.tsx +6 -6
  197. package/src/components/CommandPalette.tsx +34 -34
  198. package/src/components/ContentOverviewChart.tsx +3 -3
  199. package/src/components/ErrorBoundary.tsx +3 -3
  200. package/src/components/FocalPointPicker.tsx +4 -4
  201. package/src/components/FolderTree.tsx +38 -38
  202. package/src/components/LivePreview.tsx +16 -16
  203. package/src/components/LocaleSwitcher.tsx +7 -7
  204. package/src/components/MediaPickerModal.tsx +21 -21
  205. package/src/components/PresenceIndicator.tsx +2 -2
  206. package/src/components/SEOConfigPanel.tsx +582 -0
  207. package/src/components/SEOPanel.tsx +46 -46
  208. package/src/components/SEOPerformance.tsx +21 -21
  209. package/src/components/SchedulePublishDialog.tsx +241 -0
  210. package/src/components/SharePreviewLinkDialog.tsx +227 -0
  211. package/src/components/TipTapEditor.tsx +33 -33
  212. package/src/components/VersionHistory.tsx +16 -16
  213. package/src/components/ui/Badge.tsx +66 -14
  214. package/src/components/ui/Button.tsx +70 -33
  215. package/src/components/ui/Card.tsx +101 -0
  216. package/src/components/ui/DataTable.tsx +1 -1
  217. package/src/components/ui/Input.tsx +35 -0
  218. package/src/components/ui/SearchInput.tsx +4 -4
  219. package/src/components/ui/Select.tsx +56 -0
  220. package/src/components/ui/Toast.tsx +1 -1
  221. package/src/components/ui/index.ts +18 -4
  222. package/src/fields/BlockBuilderField.tsx +3 -3
  223. package/src/fields/DateField.tsx +1 -1
  224. package/src/fields/RelationshipField.tsx +10 -10
  225. package/src/fields/TextField.tsx +1 -1
  226. package/src/index.ts +32 -0
  227. package/src/layout/Header.tsx +28 -28
  228. package/src/layout/Layout.tsx +39 -46
  229. package/src/layout/Sidebar.tsx +37 -64
  230. package/src/layout/primitives/AdminShell.tsx +118 -0
  231. package/src/layout/primitives/Box.tsx +30 -0
  232. package/src/layout/primitives/Cluster.tsx +74 -0
  233. package/src/layout/primitives/Grid.tsx +120 -0
  234. package/src/layout/primitives/PageContainer.tsx +96 -0
  235. package/src/layout/primitives/Split.tsx +73 -0
  236. package/src/layout/primitives/Stack.tsx +67 -0
  237. package/src/layout/primitives/index.ts +36 -0
  238. package/src/layout/primitives/tokens.ts +76 -0
  239. package/src/lib/cv.ts +96 -0
  240. package/src/styles/build-input.css +1 -1
  241. package/src/views/ApiKeys.tsx +57 -57
  242. package/src/views/CollectionList.tsx +30 -30
  243. package/src/views/Dashboard.tsx +737 -186
  244. package/src/views/DocumentEdit.tsx +90 -10
  245. package/src/views/ForgotPassword.tsx +18 -18
  246. package/src/views/FormEditor.tsx +75 -75
  247. package/src/views/FormSubmissions.tsx +76 -76
  248. package/src/views/Forms.tsx +27 -27
  249. package/src/views/Login.tsx +65 -25
  250. package/src/views/MediaBrowser.tsx +127 -127
  251. package/src/views/PageEditor.tsx +25 -25
  252. package/src/views/Pages.tsx +59 -59
  253. package/src/views/PostEditor.tsx +37 -37
  254. package/src/views/Posts.tsx +48 -48
  255. package/src/views/Redirects.tsx +21 -21
  256. package/src/views/ResetPassword.tsx +28 -28
  257. package/src/views/SEO.tsx +144 -144
  258. package/src/views/ScriptTagEditor.tsx +24 -24
  259. package/src/views/ScriptTags.tsx +10 -10
  260. package/src/views/Settings.tsx +88 -80
  261. package/src/views/SetupWizard.tsx +28 -28
  262. package/src/views/Users.tsx +20 -20
  263. package/src/views/page-builder/AIBlockAssist.tsx +1 -1
  264. package/src/views/page-builder/AIGenerateDialog.tsx +63 -63
  265. package/src/views/page-builder/BlockEditor.tsx +26 -26
  266. package/src/views/page-builder/BlockPicker.tsx +22 -22
  267. package/src/views/page-builder/BottomBar.tsx +8 -8
  268. package/src/views/page-builder/BuilderToolbar.tsx +17 -17
  269. package/src/views/page-builder/ContextPanel.tsx +3 -3
  270. package/src/views/page-builder/DesignScore.tsx +21 -21
  271. package/src/views/page-builder/NodeSettings.tsx +27 -27
  272. package/src/views/page-builder/PageBuilder.tsx +11 -11
  273. package/src/views/page-builder/PageSettings.tsx +4 -4
  274. package/src/views/page-builder/PageTemplates.tsx +18 -18
  275. package/src/views/page-builder/SEOPanel.tsx +53 -53
  276. package/src/views/page-builder/SavedSections.tsx +37 -37
  277. package/src/views/page-builder/TemplatePicker.tsx +17 -17
  278. package/src/views/page-builder/block-renderers/CTAPreview.tsx +13 -13
  279. package/src/views/page-builder/block-renderers/CardsPreview.tsx +5 -5
  280. package/src/views/page-builder/block-renderers/CodePreview.tsx +6 -6
  281. package/src/views/page-builder/block-renderers/FAQPreview.tsx +13 -13
  282. package/src/views/page-builder/block-renderers/FallbackPreview.tsx +3 -3
  283. package/src/views/page-builder/block-renderers/FormPreview.tsx +20 -20
  284. package/src/views/page-builder/block-renderers/GalleryPreview.tsx +8 -8
  285. package/src/views/page-builder/block-renderers/HeroPreview.tsx +16 -16
  286. package/src/views/page-builder/block-renderers/ImagePreview.tsx +4 -4
  287. package/src/views/page-builder/block-renderers/TextPreview.tsx +14 -14
  288. package/src/views/page-builder/block-renderers/VideoPreview.tsx +12 -12
  289. package/src/views/page-builder/canvas/BlockRenderer.tsx +4 -4
  290. package/src/views/page-builder/canvas/BuilderCanvas.tsx +6 -6
  291. package/src/views/page-builder/canvas/ColumnRenderer.tsx +3 -3
  292. package/src/views/page-builder/canvas/ContainerRenderer.tsx +2 -2
  293. package/src/views/page-builder/canvas/RowRenderer.tsx +2 -2
  294. package/src/views/page-builder/canvas/SectionRenderer.tsx +2 -2
@@ -69,18 +69,18 @@ export function SetupWizard({ onComplete, siteName = 'Actuate CMS' }: SetupWizar
69
69
 
70
70
  if (done) {
71
71
  return (
72
- <div className="min-h-screen flex items-center justify-center bg-gray-50 px-4">
72
+ <div className="flex min-h-screen items-center justify-center bg-gray-50 px-4">
73
73
  <div className="w-full max-w-md text-center">
74
- <div className="mx-auto mb-6 w-16 h-16 bg-green-100 rounded-full flex items-center justify-center">
75
- <CheckCircle2 className="w-8 h-8 text-green-600" />
74
+ <div className="mx-auto mb-6 flex h-16 w-16 items-center justify-center rounded-full bg-green-100">
75
+ <CheckCircle2 className="h-8 w-8 text-green-600" />
76
76
  </div>
77
- <h1 className="text-2xl font-bold text-gray-900 mb-2">Setup Complete</h1>
78
- <p className="text-gray-600 mb-6">
77
+ <h1 className="mb-2 text-2xl font-bold text-gray-900">Setup Complete</h1>
78
+ <p className="mb-6 text-gray-600">
79
79
  Your admin account has been created. You can now sign in to manage your content.
80
80
  </p>
81
81
  <button
82
82
  onClick={() => window.location.reload()}
83
- className="w-full px-6 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors font-medium"
83
+ className="w-full rounded-lg bg-blue-600 px-6 py-3 font-medium text-white transition-colors hover:bg-blue-700"
84
84
  >
85
85
  Go to Login
86
86
  </button>
@@ -90,29 +90,29 @@ export function SetupWizard({ onComplete, siteName = 'Actuate CMS' }: SetupWizar
90
90
  }
91
91
 
92
92
  return (
93
- <div className="min-h-screen flex items-center justify-center bg-gray-50 px-4">
93
+ <div className="flex min-h-screen items-center justify-center bg-gray-50 px-4">
94
94
  <div className="w-full max-w-md">
95
- <div className="text-center mb-8">
96
- <div className="mx-auto mb-4 w-14 h-14 bg-blue-600 rounded-xl flex items-center justify-center">
97
- <Shield className="w-7 h-7 text-white" />
95
+ <div className="mb-8 text-center">
96
+ <div className="mx-auto mb-4 flex h-14 w-14 items-center justify-center rounded-xl bg-blue-600">
97
+ <Shield className="h-7 w-7 text-white" />
98
98
  </div>
99
99
  <h1 className="text-2xl font-bold text-gray-900">Welcome to {siteName}</h1>
100
- <p className="text-gray-600 mt-2">Create your admin account to get started</p>
100
+ <p className="mt-2 text-gray-600">Create your admin account to get started</p>
101
101
  </div>
102
102
 
103
103
  <form
104
104
  onSubmit={handleSubmit}
105
- className="bg-white rounded-xl border border-gray-200 p-6 shadow-sm space-y-5"
105
+ className="space-y-5 rounded-xl border border-gray-200 bg-white p-6 shadow-sm"
106
106
  >
107
107
  {error && (
108
- <div className="flex items-start gap-3 p-3 bg-red-50 border border-red-200 rounded-lg">
109
- <AlertTriangle className="w-5 h-5 text-red-600 mt-0.5 shrink-0" />
108
+ <div className="flex items-start gap-3 rounded-lg border border-red-200 bg-red-50 p-3">
109
+ <AlertTriangle className="mt-0.5 h-5 w-5 shrink-0 text-red-600" />
110
110
  <p className="text-sm text-red-800">{error}</p>
111
111
  </div>
112
112
  )}
113
113
 
114
114
  <div>
115
- <label htmlFor="setup-name" className="block text-sm font-medium text-gray-700 mb-1.5">
115
+ <label htmlFor="setup-name" className="mb-1.5 block text-sm font-medium text-gray-700">
116
116
  Full Name
117
117
  </label>
118
118
  <input
@@ -121,7 +121,7 @@ export function SetupWizard({ onComplete, siteName = 'Actuate CMS' }: SetupWizar
121
121
  value={name}
122
122
  onChange={(e) => setName(e.target.value)}
123
123
  placeholder="Jane Smith"
124
- className="w-full px-3 py-2.5 border border-gray-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
124
+ className="w-full rounded-lg border border-gray-300 px-3 py-2.5 text-sm focus:border-blue-500 focus:ring-2 focus:ring-blue-500 focus:outline-none"
125
125
  required
126
126
  autoFocus
127
127
  autoComplete="name"
@@ -129,7 +129,7 @@ export function SetupWizard({ onComplete, siteName = 'Actuate CMS' }: SetupWizar
129
129
  </div>
130
130
 
131
131
  <div>
132
- <label htmlFor="setup-email" className="block text-sm font-medium text-gray-700 mb-1.5">
132
+ <label htmlFor="setup-email" className="mb-1.5 block text-sm font-medium text-gray-700">
133
133
  Email Address
134
134
  </label>
135
135
  <input
@@ -138,7 +138,7 @@ export function SetupWizard({ onComplete, siteName = 'Actuate CMS' }: SetupWizar
138
138
  value={email}
139
139
  onChange={(e) => setEmail(e.target.value)}
140
140
  placeholder="admin@example.com"
141
- className="w-full px-3 py-2.5 border border-gray-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
141
+ className="w-full rounded-lg border border-gray-300 px-3 py-2.5 text-sm focus:border-blue-500 focus:ring-2 focus:ring-blue-500 focus:outline-none"
142
142
  required
143
143
  autoComplete="email"
144
144
  />
@@ -147,7 +147,7 @@ export function SetupWizard({ onComplete, siteName = 'Actuate CMS' }: SetupWizar
147
147
  <div>
148
148
  <label
149
149
  htmlFor="setup-password"
150
- className="block text-sm font-medium text-gray-700 mb-1.5"
150
+ className="mb-1.5 block text-sm font-medium text-gray-700"
151
151
  >
152
152
  Password
153
153
  </label>
@@ -158,7 +158,7 @@ export function SetupWizard({ onComplete, siteName = 'Actuate CMS' }: SetupWizar
158
158
  value={password}
159
159
  onChange={(e) => setPassword(e.target.value)}
160
160
  placeholder="Minimum 12 characters"
161
- className="w-full px-3 py-2.5 pr-10 border border-gray-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
161
+ className="w-full rounded-lg border border-gray-300 px-3 py-2.5 pr-10 text-sm focus:border-blue-500 focus:ring-2 focus:ring-blue-500 focus:outline-none"
162
162
  required
163
163
  minLength={12}
164
164
  autoComplete="new-password"
@@ -166,16 +166,16 @@ export function SetupWizard({ onComplete, siteName = 'Actuate CMS' }: SetupWizar
166
166
  <button
167
167
  type="button"
168
168
  onClick={() => setShowPassword(!showPassword)}
169
- className="absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600"
169
+ className="absolute top-1/2 right-3 -translate-y-1/2 text-gray-400 hover:text-gray-600"
170
170
  tabIndex={-1}
171
171
  >
172
- {showPassword ? <EyeOff className="w-4 h-4" /> : <Eye className="w-4 h-4" />}
172
+ {showPassword ? <EyeOff className="h-4 w-4" /> : <Eye className="h-4 w-4" />}
173
173
  </button>
174
174
  </div>
175
175
  {password && (
176
176
  <div className="mt-2">
177
177
  <div className="flex items-center gap-2">
178
- <div className="flex-1 h-1.5 bg-gray-200 rounded-full overflow-hidden">
178
+ <div className="h-1.5 flex-1 overflow-hidden rounded-full bg-gray-200">
179
179
  <div
180
180
  className={`h-full rounded-full transition-all ${strength.color}`}
181
181
  style={{ width: `${(strength.score / 6) * 100}%` }}
@@ -190,7 +190,7 @@ export function SetupWizard({ onComplete, siteName = 'Actuate CMS' }: SetupWizar
190
190
  <div>
191
191
  <label
192
192
  htmlFor="setup-confirm"
193
- className="block text-sm font-medium text-gray-700 mb-1.5"
193
+ className="mb-1.5 block text-sm font-medium text-gray-700"
194
194
  >
195
195
  Confirm Password
196
196
  </label>
@@ -200,26 +200,26 @@ export function SetupWizard({ onComplete, siteName = 'Actuate CMS' }: SetupWizar
200
200
  value={confirmPassword}
201
201
  onChange={(e) => setConfirmPassword(e.target.value)}
202
202
  placeholder="Re-enter your password"
203
- className={`w-full px-3 py-2.5 border rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 ${
203
+ className={`w-full rounded-lg border px-3 py-2.5 text-sm focus:border-blue-500 focus:ring-2 focus:ring-blue-500 focus:outline-none ${
204
204
  confirmPassword && !passwordsMatch ? 'border-red-300' : 'border-gray-300'
205
205
  }`}
206
206
  required
207
207
  autoComplete="new-password"
208
208
  />
209
209
  {confirmPassword && !passwordsMatch && (
210
- <p className="text-xs text-red-600 mt-1">Passwords do not match</p>
210
+ <p className="mt-1 text-xs text-red-600">Passwords do not match</p>
211
211
  )}
212
212
  </div>
213
213
 
214
214
  <button
215
215
  type="submit"
216
216
  disabled={!canSubmit}
217
- className="w-full py-2.5 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
217
+ className="w-full rounded-lg bg-blue-600 py-2.5 font-medium text-white transition-colors hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-50"
218
218
  >
219
219
  {submitting ? 'Creating Account...' : 'Create Admin Account'}
220
220
  </button>
221
221
 
222
- <p className="text-xs text-gray-500 text-center">
222
+ <p className="text-center text-xs text-gray-500">
223
223
  This form is only available during initial setup. Once an admin account exists, it will
224
224
  be replaced by the login screen.
225
225
  </p>
@@ -82,17 +82,17 @@ export function Users({ onNavigate }: UsersProps) {
82
82
  <button
83
83
  type="button"
84
84
  onClick={() => setSortConfig(toggleSort(sortConfig, sortKey))}
85
- className="flex items-center gap-1 text-xs font-medium text-gray-700 hover:text-gray-900 transition-colors"
85
+ className="flex items-center gap-1 text-xs font-medium text-gray-700 transition-colors hover:text-gray-900"
86
86
  >
87
87
  {label}
88
88
  {active ? (
89
89
  sortConfig!.direction === 'asc' ? (
90
- <ArrowUp className="w-3 h-3" />
90
+ <ArrowUp className="h-3 w-3" />
91
91
  ) : (
92
- <ArrowDown className="w-3 h-3" />
92
+ <ArrowDown className="h-3 w-3" />
93
93
  )
94
94
  ) : (
95
- <ArrowUpDown className="w-3 h-3 text-gray-400" />
95
+ <ArrowUpDown className="h-3 w-3 text-gray-400" />
96
96
  )}
97
97
  </button>
98
98
  )
@@ -100,8 +100,8 @@ export function Users({ onNavigate }: UsersProps) {
100
100
 
101
101
  if (loading) {
102
102
  return (
103
- <div className="p-3 pr-6 sm:p-4 sm:pr-8 flex items-center justify-center h-64">
104
- <Loader2 className="w-6 h-6 animate-spin text-blue-600" />
103
+ <div className="flex h-64 items-center justify-center p-3 pr-6 sm:p-4 sm:pr-8">
104
+ <Loader2 className="h-6 w-6 animate-spin text-blue-600" />
105
105
  </div>
106
106
  )
107
107
  }
@@ -110,11 +110,11 @@ export function Users({ onNavigate }: UsersProps) {
110
110
  <div className="p-3 pr-6 sm:p-4 sm:pr-8">
111
111
  {error && (
112
112
  <div className="mb-4 flex items-center gap-3 rounded-lg border border-red-200 bg-red-50 p-3">
113
- <AlertTriangle className="w-5 h-5 text-red-600 shrink-0" />
114
- <span className="text-sm text-red-800 flex-1">{error}</span>
113
+ <AlertTriangle className="h-5 w-5 shrink-0 text-red-600" />
114
+ <span className="flex-1 text-sm text-red-800">{error}</span>
115
115
  <button
116
116
  onClick={refetch}
117
- className="px-3 py-1 text-sm text-red-700 border border-red-300 rounded-lg hover:bg-red-100 transition-colors"
117
+ className="rounded-lg border border-red-300 px-3 py-1 text-sm text-red-700 transition-colors hover:bg-red-100"
118
118
  >
119
119
  Retry
120
120
  </button>
@@ -136,22 +136,22 @@ export function Users({ onNavigate }: UsersProps) {
136
136
  </button>
137
137
  </div>
138
138
 
139
- <div className="bg-white rounded-lg border border-gray-200 mb-4">
140
- <div className="p-3 flex flex-col sm:flex-row gap-3">
139
+ <div className="mb-4 rounded-lg border border-gray-200 bg-white">
140
+ <div className="flex flex-col gap-3 p-3 sm:flex-row">
141
141
  <div className="relative flex-1">
142
- <Search className="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400" />
142
+ <Search className="absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 text-gray-400" />
143
143
  <input
144
144
  type="text"
145
145
  placeholder="Search users by name or email..."
146
146
  value={searchQuery}
147
147
  onChange={(e) => setSearchQuery(e.target.value)}
148
- className="w-full pl-9 pr-3 py-2 text-sm border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
148
+ className="w-full rounded-lg border border-gray-300 py-2 pr-3 pl-9 text-sm focus:ring-2 focus:ring-blue-500 focus:outline-none"
149
149
  />
150
150
  </div>
151
151
  <select
152
152
  value={filterRole}
153
153
  onChange={(e) => setFilterRole(e.target.value)}
154
- className="px-3 py-2 text-sm border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
154
+ className="rounded-lg border border-gray-300 px-3 py-2 text-sm focus:ring-2 focus:ring-blue-500 focus:outline-none"
155
155
  >
156
156
  <option value="all">All Roles</option>
157
157
  <option value="admin">Admin</option>
@@ -164,10 +164,10 @@ export function Users({ onNavigate }: UsersProps) {
164
164
 
165
165
  {filteredAndSorted.length === 0 && !loading ? (
166
166
  <div className="flex flex-col items-center justify-center py-16 text-center">
167
- <div className="w-12 h-12 rounded-full bg-gray-100 flex items-center justify-center mb-4">
168
- <UserPlus className="w-6 h-6 text-gray-400" />
167
+ <div className="mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-gray-100">
168
+ <UserPlus className="h-6 w-6 text-gray-400" />
169
169
  </div>
170
- <h3 className="text-sm font-medium text-gray-900 mb-1">No users yet</h3>
170
+ <h3 className="mb-1 text-sm font-medium text-gray-900">No users yet</h3>
171
171
  <p className="text-sm text-gray-500">Invite your first user to get started.</p>
172
172
  </div>
173
173
  ) : (
@@ -261,7 +261,7 @@ export function Users({ onNavigate }: UsersProps) {
261
261
  <Dialog.Root open={showInviteDialog} onOpenChange={setShowInviteDialog}>
262
262
  <Dialog.Portal>
263
263
  <Dialog.Overlay className="fixed inset-0 z-50 bg-black/50" />
264
- <Dialog.Content className="fixed left-1/2 top-1/2 z-50 w-full max-w-md -translate-x-1/2 -translate-y-1/2 rounded-lg bg-white p-6 shadow-lg">
264
+ <Dialog.Content className="fixed top-1/2 left-1/2 z-50 w-full max-w-md -translate-x-1/2 -translate-y-1/2 rounded-lg bg-white p-6 shadow-lg">
265
265
  <Dialog.Title className="mb-4 text-lg font-semibold text-gray-900">
266
266
  Invite User
267
267
  </Dialog.Title>
@@ -275,7 +275,7 @@ export function Users({ onNavigate }: UsersProps) {
275
275
  value={inviteEmail}
276
276
  onChange={(e) => setInviteEmail(e.target.value)}
277
277
  placeholder="user@example.com"
278
- className="w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500"
278
+ className="w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:ring-2 focus:ring-blue-500 focus:outline-none"
279
279
  required
280
280
  />
281
281
  </div>
@@ -284,7 +284,7 @@ export function Users({ onNavigate }: UsersProps) {
284
284
  <select
285
285
  value={inviteRole}
286
286
  onChange={(e) => setInviteRole(e.target.value)}
287
- className="w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500"
287
+ className="w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:ring-2 focus:ring-blue-500 focus:outline-none"
288
288
  >
289
289
  <option value="viewer">Viewer</option>
290
290
  <option value="editor">Editor</option>
@@ -54,7 +54,7 @@ export function AIBlockAssist({
54
54
  <button
55
55
  onClick={handleGenerate}
56
56
  disabled={generating}
57
- className="flex items-center gap-1.5 px-2.5 py-1 text-xs text-primary hover:bg-primary/10 rounded-md transition-colors disabled:opacity-50"
57
+ className="text-primary hover:bg-primary/10 flex items-center gap-1.5 rounded-md px-2.5 py-1 text-xs transition-colors disabled:opacity-50"
58
58
  title="Generate content with AI"
59
59
  >
60
60
  {generating ? <Loader2 size={12} className="animate-spin" /> : <Sparkles size={12} />}