@actuate-media/cms-admin 0.56.0 → 0.56.2
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.
- package/CHANGELOG.md +12 -0
- package/dist/__tests__/components/posts-badges.test.js +3 -3
- package/dist/__tests__/components/posts-badges.test.js.map +1 -1
- package/dist/actuate-admin.css +1 -1
- package/dist/components/AICoauthorBubbleMenu.js +2 -2
- package/dist/components/AICoauthorBubbleMenu.js.map +1 -1
- package/dist/components/Breadcrumbs.js +2 -2
- package/dist/components/Breadcrumbs.js.map +1 -1
- package/dist/components/CoauthorResultPopover.d.ts.map +1 -1
- package/dist/components/CoauthorResultPopover.js +1 -1
- package/dist/components/CoauthorResultPopover.js.map +1 -1
- package/dist/components/CommandPalette.d.ts.map +1 -1
- package/dist/components/CommandPalette.js +11 -11
- package/dist/components/CommandPalette.js.map +1 -1
- package/dist/components/CommentSidePanel.js +11 -11
- package/dist/components/CommentSidePanel.js.map +1 -1
- package/dist/components/ContentOverviewChart.js +2 -2
- package/dist/components/ContentOverviewChart.js.map +1 -1
- package/dist/components/FocalPointPicker.js +1 -1
- package/dist/components/FocalPointPicker.js.map +1 -1
- package/dist/components/LivePreview.d.ts.map +1 -1
- package/dist/components/LivePreview.js +5 -5
- package/dist/components/LivePreview.js.map +1 -1
- package/dist/components/LogoPlaceholder.js +1 -1
- package/dist/components/LogoPlaceholder.js.map +1 -1
- package/dist/components/MentionableTextarea.js +3 -3
- package/dist/components/MentionableTextarea.js.map +1 -1
- package/dist/components/NotificationBell.js +1 -1
- package/dist/components/NotificationBell.js.map +1 -1
- package/dist/components/OfflineStatus.js +8 -8
- package/dist/components/OfflineStatus.js.map +1 -1
- package/dist/components/PresenceChips.d.ts.map +1 -1
- package/dist/components/PresenceChips.js +10 -6
- package/dist/components/PresenceChips.js.map +1 -1
- package/dist/components/SEOConfigPanel.d.ts.map +1 -1
- package/dist/components/SEOConfigPanel.js +10 -10
- package/dist/components/SEOConfigPanel.js.map +1 -1
- package/dist/components/SEOPanel.js +12 -12
- package/dist/components/SEOPanel.js.map +1 -1
- package/dist/components/SEOPerformance.d.ts.map +1 -1
- package/dist/components/SEOPerformance.js +3 -3
- package/dist/components/SEOPerformance.js.map +1 -1
- package/dist/components/TipTapEditor.js +6 -6
- package/dist/components/TipTapEditor.js.map +1 -1
- package/dist/components/pages/tag-badges.js +6 -6
- package/dist/components/pages/tag-badges.js.map +1 -1
- package/dist/components/posts/badges.d.ts +0 -4
- package/dist/components/posts/badges.d.ts.map +1 -1
- package/dist/components/posts/badges.js +28 -42
- package/dist/components/posts/badges.js.map +1 -1
- package/dist/components/ui/Badge.js +5 -5
- package/dist/components/ui/Badge.js.map +1 -1
- package/dist/components/ui/Toast.d.ts.map +1 -1
- package/dist/components/ui/Toast.js +4 -4
- package/dist/components/ui/Toast.js.map +1 -1
- package/dist/fields/ComponentBlockField.js +2 -2
- package/dist/fields/ComponentBlockField.js.map +1 -1
- package/dist/fields/FieldRenderer.js +1 -1
- package/dist/fields/FieldRenderer.js.map +1 -1
- package/dist/fields/PropInput.js +1 -1
- package/dist/fields/PropInput.js.map +1 -1
- package/dist/fields/RelationshipField.js +5 -5
- package/dist/fields/RelationshipField.js.map +1 -1
- package/dist/fields/ToggleField.js +1 -1
- package/dist/fields/ToggleField.js.map +1 -1
- package/dist/views/Dashboard.js +5 -5
- package/dist/views/Dashboard.js.map +1 -1
- package/dist/views/DocumentEdit.d.ts.map +1 -1
- package/dist/views/DocumentEdit.js +5 -5
- package/dist/views/DocumentEdit.js.map +1 -1
- package/dist/views/ForgotPassword.d.ts.map +1 -1
- package/dist/views/ForgotPassword.js +3 -2
- package/dist/views/ForgotPassword.js.map +1 -1
- package/dist/views/FormEditor.d.ts.map +1 -1
- package/dist/views/FormEditor.js +5 -5
- package/dist/views/FormEditor.js.map +1 -1
- package/dist/views/Login.d.ts.map +1 -1
- package/dist/views/Login.js +17 -17
- package/dist/views/Login.js.map +1 -1
- package/dist/views/PageEditor.d.ts.map +1 -1
- package/dist/views/PageEditor.js +2 -2
- package/dist/views/PageEditor.js.map +1 -1
- package/dist/views/Pages/PagesListView.js +6 -6
- package/dist/views/Pages/PagesListView.js.map +1 -1
- package/dist/views/Pages.d.ts.map +1 -1
- package/dist/views/Pages.js +16 -19
- package/dist/views/Pages.js.map +1 -1
- package/dist/views/ResetPassword.d.ts.map +1 -1
- package/dist/views/ResetPassword.js +3 -2
- package/dist/views/ResetPassword.js.map +1 -1
- package/dist/views/Settings.js +2 -2
- package/dist/views/Settings.js.map +1 -1
- package/dist/views/SetupWizard.d.ts.map +1 -1
- package/dist/views/SetupWizard.js +6 -5
- package/dist/views/SetupWizard.js.map +1 -1
- package/dist/views/page-builder/DesignScore.js +12 -12
- package/dist/views/page-builder/DesignScore.js.map +1 -1
- package/dist/views/page-builder/SEOPanel.js +9 -9
- package/dist/views/page-builder/SEOPanel.js.map +1 -1
- package/dist/views/page-editor/EditorCanvas.js +1 -1
- package/dist/views/page-editor/EditorCanvas.js.map +1 -1
- package/dist/views/page-editor/EditorTopBar.js +2 -2
- package/dist/views/page-editor/EditorTopBar.js.map +1 -1
- package/dist/views/page-editor/PagePreview.js +1 -1
- package/dist/views/page-editor/PagePreview.js.map +1 -1
- package/dist/views/page-editor/SectionInspector.js +1 -1
- package/dist/views/page-editor/SectionInspector.js.map +1 -1
- package/dist/views/page-editor/SitePreviewFrame.js +1 -1
- package/dist/views/page-editor/SitePreviewFrame.js.map +1 -1
- package/dist/views/page-editor/sections/ArticleBodySection.js +1 -1
- package/dist/views/page-editor/sections/ArticleBodySection.js.map +1 -1
- package/dist/views/page-editor/sections/AuthorBioSection.js +2 -2
- package/dist/views/page-editor/sections/AuthorBioSection.js.map +1 -1
- package/dist/views/page-editor/sections/ByTheNumbersSection.js +1 -1
- package/dist/views/page-editor/sections/ByTheNumbersSection.js.map +1 -1
- package/dist/views/page-editor/sections/CtaBannerSection.js +1 -1
- package/dist/views/page-editor/sections/CtaBannerSection.js.map +1 -1
- package/dist/views/page-editor/sections/EmbedSection.d.ts.map +1 -1
- package/dist/views/page-editor/sections/EmbedSection.js +1 -1
- package/dist/views/page-editor/sections/EmbedSection.js.map +1 -1
- package/dist/views/page-editor/sections/FeatureHighlightSection.d.ts.map +1 -1
- package/dist/views/page-editor/sections/FeatureHighlightSection.js +2 -2
- package/dist/views/page-editor/sections/FeatureHighlightSection.js.map +1 -1
- package/dist/views/page-editor/sections/GallerySection.d.ts.map +1 -1
- package/dist/views/page-editor/sections/GallerySection.js +1 -1
- package/dist/views/page-editor/sections/GallerySection.js.map +1 -1
- package/dist/views/page-editor/sections/HeroBannerSection.js +1 -1
- package/dist/views/page-editor/sections/HeroBannerSection.js.map +1 -1
- package/dist/views/page-editor/sections/MissionSection.d.ts.map +1 -1
- package/dist/views/page-editor/sections/MissionSection.js +1 -1
- package/dist/views/page-editor/sections/MissionSection.js.map +1 -1
- package/dist/views/page-editor/sections/PullQuoteSection.js +1 -1
- package/dist/views/page-editor/sections/PullQuoteSection.js.map +1 -1
- package/dist/views/page-editor/sections/RelatedPostsSection.js +1 -1
- package/dist/views/page-editor/sections/RelatedPostsSection.js.map +1 -1
- package/dist/views/page-editor/sections/SectionRenderer.js +1 -1
- package/dist/views/page-editor/sections/SectionRenderer.js.map +1 -1
- package/dist/views/page-editor/sections/parts.js +6 -6
- package/dist/views/page-editor/sections/parts.js.map +1 -1
- package/dist/views/post-editor/PostEditorCanvas.js +2 -2
- package/dist/views/post-editor/PostEditorCanvas.js.map +1 -1
- package/dist/views/post-editor/PostHeader.js +2 -2
- package/dist/views/post-editor/PostHeader.js.map +1 -1
- package/dist/views/post-editor/PostHeaderPanel.js +1 -1
- package/dist/views/post-editor/PostHeaderPanel.js.map +1 -1
- package/dist/views/post-editor/PostPreview.js +1 -1
- package/dist/views/post-editor/PostPreview.js.map +1 -1
- package/dist/views/profile/AccountSecurity.js +1 -1
- package/dist/views/profile/AccountSecurity.js.map +1 -1
- package/dist/views/settings/components.js +1 -1
- package/dist/views/settings/components.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/components/posts-badges.test.tsx +3 -3
- package/src/components/AICoauthorBubbleMenu.tsx +4 -4
- package/src/components/Breadcrumbs.tsx +5 -5
- package/src/components/CoauthorResultPopover.tsx +26 -23
- package/src/components/CommandPalette.tsx +41 -39
- package/src/components/CommentSidePanel.tsx +20 -20
- package/src/components/ContentOverviewChart.tsx +4 -4
- package/src/components/FocalPointPicker.tsx +2 -2
- package/src/components/LivePreview.tsx +20 -17
- package/src/components/LogoPlaceholder.tsx +1 -1
- package/src/components/MentionableTextarea.tsx +5 -5
- package/src/components/NotificationBell.tsx +10 -10
- package/src/components/OfflineStatus.tsx +8 -8
- package/src/components/PresenceChips.tsx +12 -8
- package/src/components/SEOConfigPanel.tsx +40 -38
- package/src/components/SEOPanel.tsx +15 -15
- package/src/components/SEOPerformance.tsx +25 -23
- package/src/components/TipTapEditor.tsx +7 -7
- package/src/components/pages/tag-badges.tsx +6 -6
- package/src/components/posts/badges.tsx +28 -46
- package/src/components/ui/Badge.tsx +5 -5
- package/src/components/ui/Toast.tsx +4 -5
- package/src/fields/ComponentBlockField.tsx +2 -2
- package/src/fields/FieldRenderer.tsx +1 -1
- package/src/fields/PropInput.tsx +1 -1
- package/src/fields/RelationshipField.tsx +5 -5
- package/src/fields/ToggleField.tsx +1 -1
- package/src/views/Dashboard.tsx +5 -5
- package/src/views/DocumentEdit.tsx +13 -11
- package/src/views/ForgotPassword.tsx +21 -18
- package/src/views/FormEditor.tsx +74 -69
- package/src/views/Login.tsx +45 -39
- package/src/views/PageEditor.tsx +26 -22
- package/src/views/Pages/PagesListView.tsx +6 -6
- package/src/views/Pages.tsx +64 -65
- package/src/views/ResetPassword.tsx +32 -29
- package/src/views/Settings.tsx +2 -2
- package/src/views/SetupWizard.tsx +42 -33
- package/src/views/page-builder/DesignScore.tsx +12 -12
- package/src/views/page-builder/SEOPanel.tsx +12 -12
- package/src/views/page-editor/EditorCanvas.tsx +1 -1
- package/src/views/page-editor/EditorTopBar.tsx +2 -2
- package/src/views/page-editor/PagePreview.tsx +1 -1
- package/src/views/page-editor/SectionInspector.tsx +1 -1
- package/src/views/page-editor/SitePreviewFrame.tsx +1 -1
- package/src/views/page-editor/sections/ArticleBodySection.tsx +5 -5
- package/src/views/page-editor/sections/AuthorBioSection.tsx +6 -6
- package/src/views/page-editor/sections/ByTheNumbersSection.tsx +5 -5
- package/src/views/page-editor/sections/CtaBannerSection.tsx +1 -1
- package/src/views/page-editor/sections/EmbedSection.tsx +6 -4
- package/src/views/page-editor/sections/FeatureHighlightSection.tsx +7 -5
- package/src/views/page-editor/sections/GallerySection.tsx +6 -4
- package/src/views/page-editor/sections/HeroBannerSection.tsx +2 -2
- package/src/views/page-editor/sections/MissionSection.tsx +4 -2
- package/src/views/page-editor/sections/PullQuoteSection.tsx +4 -4
- package/src/views/page-editor/sections/RelatedPostsSection.tsx +5 -5
- package/src/views/page-editor/sections/SectionRenderer.tsx +2 -2
- package/src/views/page-editor/sections/parts.tsx +6 -6
- package/src/views/post-editor/PostEditorCanvas.tsx +4 -4
- package/src/views/post-editor/PostHeader.tsx +5 -5
- package/src/views/post-editor/PostHeaderPanel.tsx +1 -1
- package/src/views/post-editor/PostPreview.tsx +1 -1
- package/src/views/profile/AccountSecurity.tsx +1 -1
- package/src/views/settings/components.tsx +1 -1
|
@@ -81,20 +81,23 @@ export function CoauthorResultPopover({
|
|
|
81
81
|
aria-label={`AI ${coauthorActionLabel(action)} result`}
|
|
82
82
|
tabIndex={-1}
|
|
83
83
|
onClick={(e) => e.stopPropagation()}
|
|
84
|
-
className="w-full max-w-2xl rounded-lg
|
|
84
|
+
className="bg-card w-full max-w-2xl rounded-lg shadow-2xl outline-none"
|
|
85
85
|
>
|
|
86
|
-
<div className="flex items-center justify-between border-b
|
|
87
|
-
<div className="flex items-center gap-2 text-sm font-medium
|
|
88
|
-
<Sparkles className="h-4 w-4
|
|
86
|
+
<div className="border-border flex items-center justify-between border-b px-4 py-3">
|
|
87
|
+
<div className="text-foreground flex items-center gap-2 text-sm font-medium">
|
|
88
|
+
<Sparkles className="text-primary h-4 w-4" aria-hidden />
|
|
89
89
|
<span>AI {coauthorActionLabel(action)}</span>
|
|
90
90
|
{loading && (
|
|
91
|
-
<Loader2
|
|
91
|
+
<Loader2
|
|
92
|
+
className="text-muted-foreground ml-1 h-4 w-4 animate-spin"
|
|
93
|
+
aria-label="Loading"
|
|
94
|
+
/>
|
|
92
95
|
)}
|
|
93
96
|
</div>
|
|
94
97
|
<button
|
|
95
98
|
type="button"
|
|
96
99
|
onClick={onDiscard}
|
|
97
|
-
className="
|
|
100
|
+
className="text-muted-foreground hover:bg-accent hover:text-muted-foreground rounded p-1"
|
|
98
101
|
aria-label="Close"
|
|
99
102
|
>
|
|
100
103
|
<X className="h-4 w-4" />
|
|
@@ -105,34 +108,34 @@ export function CoauthorResultPopover({
|
|
|
105
108
|
<section aria-labelledby="coauthor-before">
|
|
106
109
|
<h3
|
|
107
110
|
id="coauthor-before"
|
|
108
|
-
className="mb-2 text-xs font-medium tracking-wide
|
|
111
|
+
className="text-muted-foreground mb-2 text-xs font-medium tracking-wide uppercase"
|
|
109
112
|
>
|
|
110
113
|
Before
|
|
111
114
|
</h3>
|
|
112
|
-
<pre className="max-h-72 overflow-auto rounded border
|
|
115
|
+
<pre className="border-border bg-muted text-foreground max-h-72 overflow-auto rounded border p-3 text-sm whitespace-pre-wrap">
|
|
113
116
|
{before}
|
|
114
117
|
</pre>
|
|
115
118
|
</section>
|
|
116
119
|
<section aria-labelledby="coauthor-after">
|
|
117
120
|
<h3
|
|
118
121
|
id="coauthor-after"
|
|
119
|
-
className="mb-2 text-xs font-medium tracking-wide
|
|
122
|
+
className="text-muted-foreground mb-2 text-xs font-medium tracking-wide uppercase"
|
|
120
123
|
>
|
|
121
124
|
After
|
|
122
125
|
</h3>
|
|
123
126
|
{loading ? (
|
|
124
127
|
<div
|
|
125
|
-
className="flex h-72 items-center justify-center rounded border border-dashed
|
|
128
|
+
className="border-border bg-muted text-muted-foreground flex h-72 items-center justify-center rounded border border-dashed text-sm"
|
|
126
129
|
role="status"
|
|
127
130
|
>
|
|
128
131
|
Thinking…
|
|
129
132
|
</div>
|
|
130
133
|
) : error ? (
|
|
131
|
-
<div className="flex h-72 items-center justify-center rounded border border-dashed
|
|
134
|
+
<div className="border-destructive/30 bg-destructive/10 text-destructive flex h-72 items-center justify-center rounded border border-dashed p-3 text-sm">
|
|
132
135
|
{error}
|
|
133
136
|
</div>
|
|
134
137
|
) : (
|
|
135
|
-
<pre className="max-h-72 overflow-auto rounded border
|
|
138
|
+
<pre className="border-info/30 bg-info/10 text-foreground max-h-72 overflow-auto rounded border p-3 text-sm whitespace-pre-wrap">
|
|
136
139
|
{after}
|
|
137
140
|
</pre>
|
|
138
141
|
)}
|
|
@@ -140,18 +143,18 @@ export function CoauthorResultPopover({
|
|
|
140
143
|
</div>
|
|
141
144
|
|
|
142
145
|
{changes && changes.length > 0 && !loading && !error && (
|
|
143
|
-
<div className="border-
|
|
144
|
-
<h3 className="mb-2 text-xs font-medium tracking-wide
|
|
146
|
+
<div className="border-border border-t px-4 py-3">
|
|
147
|
+
<h3 className="text-muted-foreground mb-2 text-xs font-medium tracking-wide uppercase">
|
|
145
148
|
Changes ({changes.length})
|
|
146
149
|
</h3>
|
|
147
150
|
<ul className="max-h-32 space-y-1 overflow-auto text-xs">
|
|
148
151
|
{changes.map((change, i) => (
|
|
149
|
-
<li key={i} className="flex items-start gap-2 rounded
|
|
150
|
-
<span className="text-
|
|
151
|
-
<span className="text-
|
|
152
|
-
<span className="text-
|
|
152
|
+
<li key={i} className="bg-muted flex items-start gap-2 rounded px-2 py-1">
|
|
153
|
+
<span className="text-destructive line-through">{change.original}</span>
|
|
154
|
+
<span className="text-muted-foreground">→</span>
|
|
155
|
+
<span className="text-success">{change.corrected}</span>
|
|
153
156
|
{change.reason && (
|
|
154
|
-
<span className="ml-auto
|
|
157
|
+
<span className="text-muted-foreground ml-auto italic">{change.reason}</span>
|
|
155
158
|
)}
|
|
156
159
|
</li>
|
|
157
160
|
))}
|
|
@@ -159,11 +162,11 @@ export function CoauthorResultPopover({
|
|
|
159
162
|
</div>
|
|
160
163
|
)}
|
|
161
164
|
|
|
162
|
-
<div className="flex items-center justify-end gap-2 border-t
|
|
165
|
+
<div className="border-border bg-muted flex items-center justify-end gap-2 border-t px-4 py-3">
|
|
163
166
|
<button
|
|
164
167
|
type="button"
|
|
165
168
|
onClick={onDiscard}
|
|
166
|
-
className="
|
|
169
|
+
className="border-border bg-card text-foreground hover:bg-accent rounded-md border px-3 py-1.5 text-sm"
|
|
167
170
|
>
|
|
168
171
|
<X className="mr-1.5 inline h-3.5 w-3.5" aria-hidden />
|
|
169
172
|
Discard
|
|
@@ -172,7 +175,7 @@ export function CoauthorResultPopover({
|
|
|
172
175
|
type="button"
|
|
173
176
|
onClick={onCopy}
|
|
174
177
|
disabled={copyDisabled}
|
|
175
|
-
className="
|
|
178
|
+
className="border-border bg-card text-foreground hover:bg-accent rounded-md border px-3 py-1.5 text-sm disabled:cursor-not-allowed disabled:opacity-50"
|
|
176
179
|
>
|
|
177
180
|
<Copy className="mr-1.5 inline h-3.5 w-3.5" aria-hidden />
|
|
178
181
|
Copy
|
|
@@ -181,7 +184,7 @@ export function CoauthorResultPopover({
|
|
|
181
184
|
type="button"
|
|
182
185
|
onClick={onApply}
|
|
183
186
|
disabled={applyDisabled}
|
|
184
|
-
className="
|
|
187
|
+
className="bg-primary hover:bg-primary/90 rounded-md px-3 py-1.5 text-sm font-medium text-white disabled:cursor-not-allowed disabled:opacity-50"
|
|
185
188
|
>
|
|
186
189
|
<Check className="mr-1.5 inline h-3.5 w-3.5" aria-hidden />
|
|
187
190
|
{applyLabel ?? 'Apply'}
|
|
@@ -340,7 +340,7 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
|
|
|
340
340
|
onClick={(e) => e.stopPropagation()}
|
|
341
341
|
>
|
|
342
342
|
<Command
|
|
343
|
-
className="w-full overflow-hidden rounded-lg
|
|
343
|
+
className="bg-card w-full overflow-hidden rounded-lg shadow-2xl"
|
|
344
344
|
onKeyDown={(e) => {
|
|
345
345
|
if (e.key === 'Escape') {
|
|
346
346
|
onOpenChange(false)
|
|
@@ -349,30 +349,30 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
|
|
|
349
349
|
}}
|
|
350
350
|
shouldFilter={!hasQuery}
|
|
351
351
|
>
|
|
352
|
-
<div className="flex items-center border-b
|
|
353
|
-
<Search className="mr-3 h-5 w-5 shrink-0
|
|
352
|
+
<div className="border-border flex items-center border-b px-4">
|
|
353
|
+
<Search className="text-muted-foreground mr-3 h-5 w-5 shrink-0" />
|
|
354
354
|
<Command.Input
|
|
355
355
|
value={search}
|
|
356
356
|
onValueChange={setSearch}
|
|
357
357
|
placeholder="Search, jump to, or type /ai to use the AI co-author…"
|
|
358
|
-
className="w-full bg-transparent py-4 text-base
|
|
358
|
+
className="placeholder:text-muted-foreground w-full bg-transparent py-4 text-base focus:outline-none"
|
|
359
359
|
/>
|
|
360
360
|
{loading && (
|
|
361
|
-
<div className="mr-2 h-4 w-4 shrink-0 animate-spin rounded-full border-2 border-
|
|
361
|
+
<div className="border-border mr-2 h-4 w-4 shrink-0 animate-spin rounded-full border-2 border-t-gray-600" />
|
|
362
362
|
)}
|
|
363
|
-
<kbd className="hidden shrink-0 rounded
|
|
363
|
+
<kbd className="bg-muted text-muted-foreground hidden shrink-0 rounded px-2 py-1 font-mono text-xs sm:inline-block">
|
|
364
364
|
ESC
|
|
365
365
|
</kbd>
|
|
366
366
|
</div>
|
|
367
367
|
|
|
368
368
|
<Command.List className="max-h-[400px] overflow-y-auto p-2">
|
|
369
|
-
<Command.Empty className="py-6 text-center text-sm
|
|
369
|
+
<Command.Empty className="text-muted-foreground py-6 text-center text-sm">
|
|
370
370
|
{loading ? 'Searching...' : 'No results found.'}
|
|
371
371
|
</Command.Empty>
|
|
372
372
|
|
|
373
373
|
{isAiMode && (
|
|
374
374
|
<Command.Group heading="AI co-author" className="px-2 py-2">
|
|
375
|
-
<div className="mb-2 flex items-center gap-1 text-xs font-medium
|
|
375
|
+
<div className="text-muted-foreground mb-2 flex items-center gap-1 text-xs font-medium">
|
|
376
376
|
<Sparkles className="h-3 w-3" aria-hidden /> AI CO-AUTHOR
|
|
377
377
|
</div>
|
|
378
378
|
{aiActions.map((action) => {
|
|
@@ -384,23 +384,23 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
|
|
|
384
384
|
key={`ai-${action}`}
|
|
385
385
|
value={`ai ${action}`}
|
|
386
386
|
onSelect={() => runSlashAction(action, aiPayload)}
|
|
387
|
-
className="flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2
|
|
387
|
+
className="hover:bg-accent data-[selected=true]:bg-muted flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2"
|
|
388
388
|
>
|
|
389
|
-
<Icon className="h-4 w-4
|
|
389
|
+
<Icon className="text-primary h-4 w-4" />
|
|
390
390
|
<div className="flex min-w-0 flex-col">
|
|
391
391
|
<span className="font-medium">
|
|
392
392
|
{coauthorActionLabel(action)}
|
|
393
393
|
{previewable && (
|
|
394
|
-
<span className="ml-1 font-normal
|
|
394
|
+
<span className="text-muted-foreground ml-1 font-normal">
|
|
395
395
|
“{truncatePreview(aiPayload)}”
|
|
396
396
|
</span>
|
|
397
397
|
)}
|
|
398
398
|
</span>
|
|
399
|
-
<span className="text-
|
|
399
|
+
<span className="text-muted-foreground text-xs">
|
|
400
400
|
{coauthorActionDescription(action)}
|
|
401
401
|
</span>
|
|
402
402
|
</div>
|
|
403
|
-
<kbd className="ml-auto rounded
|
|
403
|
+
<kbd className="bg-muted text-muted-foreground ml-auto rounded px-1.5 py-0.5 font-mono text-[10px]">
|
|
404
404
|
/ai {action}
|
|
405
405
|
</kbd>
|
|
406
406
|
</Command.Item>
|
|
@@ -411,17 +411,19 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
|
|
|
411
411
|
|
|
412
412
|
{!isAiMode && !hasQuery && recentItems.length > 0 && (
|
|
413
413
|
<Command.Group heading="Recent" className="px-2 py-2">
|
|
414
|
-
<div className="mb-2 text-xs font-medium
|
|
414
|
+
<div className="text-muted-foreground mb-2 text-xs font-medium">RECENT</div>
|
|
415
415
|
{recentItems.map((item) => (
|
|
416
416
|
<Command.Item
|
|
417
417
|
key={`recent-${item.id}`}
|
|
418
418
|
value={`recent ${item.label}`}
|
|
419
419
|
onSelect={() => handleSelect(item.path, item)}
|
|
420
|
-
className="flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2
|
|
420
|
+
className="hover:bg-accent data-[selected=true]:bg-muted flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2"
|
|
421
421
|
>
|
|
422
|
-
<Clock className="h-4 w-4
|
|
422
|
+
<Clock className="text-muted-foreground h-4 w-4" />
|
|
423
423
|
<span>{item.label}</span>
|
|
424
|
-
<span className="ml-auto text-xs
|
|
424
|
+
<span className="text-muted-foreground ml-auto text-xs capitalize">
|
|
425
|
+
{item.type}
|
|
426
|
+
</span>
|
|
425
427
|
</Command.Item>
|
|
426
428
|
))}
|
|
427
429
|
</Command.Group>
|
|
@@ -429,7 +431,7 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
|
|
|
429
431
|
|
|
430
432
|
{!isAiMode && hasQuery && documents.length > 0 && (
|
|
431
433
|
<Command.Group heading="Documents" className="px-2 py-2">
|
|
432
|
-
<div className="mb-2 text-xs font-medium
|
|
434
|
+
<div className="text-muted-foreground mb-2 text-xs font-medium">DOCUMENTS</div>
|
|
433
435
|
{documents.map((doc) => (
|
|
434
436
|
<Command.Item
|
|
435
437
|
key={`doc-${doc.id}`}
|
|
@@ -442,12 +444,12 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
|
|
|
442
444
|
type: 'document',
|
|
443
445
|
})
|
|
444
446
|
}
|
|
445
|
-
className="flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2
|
|
447
|
+
className="hover:bg-accent data-[selected=true]:bg-muted flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2"
|
|
446
448
|
>
|
|
447
|
-
<FileText className="h-4 w-4
|
|
449
|
+
<FileText className="text-muted-foreground h-4 w-4" />
|
|
448
450
|
<div className="flex min-w-0 flex-col">
|
|
449
451
|
<span className="truncate">{doc.title ?? doc.slug ?? doc.id}</span>
|
|
450
|
-
<span className="text-
|
|
452
|
+
<span className="text-muted-foreground text-xs">
|
|
451
453
|
{doc.collection} · {doc.status}
|
|
452
454
|
</span>
|
|
453
455
|
</div>
|
|
@@ -458,7 +460,7 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
|
|
|
458
460
|
|
|
459
461
|
{!isAiMode && hasQuery && media.length > 0 && (
|
|
460
462
|
<Command.Group heading="Media" className="mt-1 px-2 py-2">
|
|
461
|
-
<div className="mb-2 text-xs font-medium
|
|
463
|
+
<div className="text-muted-foreground mb-2 text-xs font-medium">MEDIA</div>
|
|
462
464
|
{media.map((m) => (
|
|
463
465
|
<Command.Item
|
|
464
466
|
key={`media-${m.id}`}
|
|
@@ -471,12 +473,12 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
|
|
|
471
473
|
type: 'media',
|
|
472
474
|
})
|
|
473
475
|
}
|
|
474
|
-
className="flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2
|
|
476
|
+
className="hover:bg-accent data-[selected=true]:bg-muted flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2"
|
|
475
477
|
>
|
|
476
|
-
<Image className="h-4 w-4
|
|
478
|
+
<Image className="text-muted-foreground h-4 w-4" />
|
|
477
479
|
<div className="flex min-w-0 flex-col">
|
|
478
480
|
<span className="truncate">{m.filename}</span>
|
|
479
|
-
<span className="text-
|
|
481
|
+
<span className="text-muted-foreground text-xs">{m.mimeType}</span>
|
|
480
482
|
</div>
|
|
481
483
|
</Command.Item>
|
|
482
484
|
))}
|
|
@@ -485,7 +487,7 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
|
|
|
485
487
|
|
|
486
488
|
{!isAiMode && hasQuery && users.length > 0 && (
|
|
487
489
|
<Command.Group heading="Users" className="mt-1 px-2 py-2">
|
|
488
|
-
<div className="mb-2 text-xs font-medium
|
|
490
|
+
<div className="text-muted-foreground mb-2 text-xs font-medium">USERS</div>
|
|
489
491
|
{users.map((u) => (
|
|
490
492
|
<Command.Item
|
|
491
493
|
key={`user-${u.id}`}
|
|
@@ -498,12 +500,12 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
|
|
|
498
500
|
type: 'user',
|
|
499
501
|
})
|
|
500
502
|
}
|
|
501
|
-
className="flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2
|
|
503
|
+
className="hover:bg-accent data-[selected=true]:bg-muted flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2"
|
|
502
504
|
>
|
|
503
|
-
<Users className="h-4 w-4
|
|
505
|
+
<Users className="text-muted-foreground h-4 w-4" />
|
|
504
506
|
<div className="flex min-w-0 flex-col">
|
|
505
507
|
<span className="truncate">{u.name}</span>
|
|
506
|
-
<span className="text-
|
|
508
|
+
<span className="text-muted-foreground text-xs">
|
|
507
509
|
{u.email} · {u.role}
|
|
508
510
|
</span>
|
|
509
511
|
</div>
|
|
@@ -514,7 +516,7 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
|
|
|
514
516
|
|
|
515
517
|
{!isAiMode && (!hasQuery || !hasResults) && (
|
|
516
518
|
<Command.Group heading="Navigation" className="px-2 py-2">
|
|
517
|
-
<div className="mb-2 text-xs font-medium
|
|
519
|
+
<div className="text-muted-foreground mb-2 text-xs font-medium">NAVIGATION</div>
|
|
518
520
|
{navigationCommands.map((cmd) => {
|
|
519
521
|
const Icon = cmd.icon
|
|
520
522
|
return (
|
|
@@ -522,9 +524,9 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
|
|
|
522
524
|
key={cmd.id}
|
|
523
525
|
value={cmd.label}
|
|
524
526
|
onSelect={() => handleSelect(cmd.action)}
|
|
525
|
-
className="flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2
|
|
527
|
+
className="hover:bg-accent data-[selected=true]:bg-muted flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2"
|
|
526
528
|
>
|
|
527
|
-
<Icon className="h-4 w-4
|
|
529
|
+
<Icon className="text-muted-foreground h-4 w-4" />
|
|
528
530
|
<span>{cmd.label}</span>
|
|
529
531
|
</Command.Item>
|
|
530
532
|
)
|
|
@@ -534,7 +536,7 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
|
|
|
534
536
|
|
|
535
537
|
{!isAiMode && (
|
|
536
538
|
<Command.Group heading="Actions" className="mt-2 px-2 py-2">
|
|
537
|
-
<div className="mb-2 text-xs font-medium
|
|
539
|
+
<div className="text-muted-foreground mb-2 text-xs font-medium">ACTIONS</div>
|
|
538
540
|
{staticActions.map((cmd) => {
|
|
539
541
|
const Icon = cmd.icon
|
|
540
542
|
return (
|
|
@@ -549,9 +551,9 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
|
|
|
549
551
|
type: 'action',
|
|
550
552
|
})
|
|
551
553
|
}
|
|
552
|
-
className="flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2
|
|
554
|
+
className="hover:bg-accent data-[selected=true]:bg-muted flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2"
|
|
553
555
|
>
|
|
554
|
-
<Icon className="h-4 w-4
|
|
556
|
+
<Icon className="text-muted-foreground h-4 w-4" />
|
|
555
557
|
<span>{cmd.label}</span>
|
|
556
558
|
</Command.Item>
|
|
557
559
|
)
|
|
@@ -560,19 +562,19 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
|
|
|
560
562
|
)}
|
|
561
563
|
</Command.List>
|
|
562
564
|
|
|
563
|
-
<div className="flex items-center justify-between border-t
|
|
565
|
+
<div className="border-border bg-muted text-muted-foreground flex items-center justify-between border-t px-4 py-3 text-xs">
|
|
564
566
|
<div className="flex items-center gap-4">
|
|
565
567
|
<span className="flex items-center gap-1">
|
|
566
|
-
<kbd className="
|
|
568
|
+
<kbd className="border-border bg-card rounded border px-1.5 py-0.5 text-[10px]">
|
|
567
569
|
↑
|
|
568
570
|
</kbd>
|
|
569
|
-
<kbd className="
|
|
571
|
+
<kbd className="border-border bg-card rounded border px-1.5 py-0.5 text-[10px]">
|
|
570
572
|
↓
|
|
571
573
|
</kbd>
|
|
572
574
|
to navigate
|
|
573
575
|
</span>
|
|
574
576
|
<span className="flex items-center gap-1">
|
|
575
|
-
<kbd className="
|
|
577
|
+
<kbd className="border-border bg-card rounded border px-1.5 py-0.5 text-[10px]">
|
|
576
578
|
↵
|
|
577
579
|
</kbd>
|
|
578
580
|
to select
|
|
@@ -228,13 +228,13 @@ export function CommentSidePanel({
|
|
|
228
228
|
[api, onError, refresh, activeCommentId, setActive],
|
|
229
229
|
)
|
|
230
230
|
|
|
231
|
-
const wrapperClass = `flex h-full flex-col gap-3 border-l border-
|
|
231
|
+
const wrapperClass = `flex h-full flex-col gap-3 border-l border-border bg-card p-3 ${className ?? ''}`
|
|
232
232
|
|
|
233
233
|
return (
|
|
234
234
|
<aside className={wrapperClass} data-testid="comment-side-panel">
|
|
235
235
|
<header className="flex items-center justify-between">
|
|
236
|
-
<h2 className="text-sm font-medium
|
|
237
|
-
<label className="flex cursor-pointer items-center gap-1 text-xs
|
|
236
|
+
<h2 className="text-foreground text-sm font-medium">Comments</h2>
|
|
237
|
+
<label className="text-muted-foreground flex cursor-pointer items-center gap-1 text-xs">
|
|
238
238
|
<input
|
|
239
239
|
type="checkbox"
|
|
240
240
|
checked={includeResolved}
|
|
@@ -247,7 +247,7 @@ export function CommentSidePanel({
|
|
|
247
247
|
|
|
248
248
|
<section className="flex flex-col gap-1.5">
|
|
249
249
|
<MentionableTextarea
|
|
250
|
-
className="w-full resize-none rounded border
|
|
250
|
+
className="border-border focus-visible:border-ring w-full resize-none rounded border p-2 text-sm focus:outline-none"
|
|
251
251
|
rows={3}
|
|
252
252
|
placeholder="Write a comment… Type @ to mention a teammate."
|
|
253
253
|
value={draft}
|
|
@@ -258,7 +258,7 @@ export function CommentSidePanel({
|
|
|
258
258
|
<div className="flex justify-end">
|
|
259
259
|
<button
|
|
260
260
|
type="button"
|
|
261
|
-
className="
|
|
261
|
+
className="bg-primary hover:bg-info rounded px-3 py-1 text-xs font-medium text-white disabled:opacity-50"
|
|
262
262
|
disabled={!draft.trim()}
|
|
263
263
|
onClick={handleCompose}
|
|
264
264
|
data-testid="comment-submit"
|
|
@@ -270,9 +270,9 @@ export function CommentSidePanel({
|
|
|
270
270
|
|
|
271
271
|
<section className="flex-1 overflow-y-auto" aria-busy={loading} data-testid="comment-list">
|
|
272
272
|
{loading ? (
|
|
273
|
-
<p className="text-
|
|
273
|
+
<p className="text-muted-foreground text-xs">Loading…</p>
|
|
274
274
|
) : threads.length === 0 ? (
|
|
275
|
-
<p className="text-
|
|
275
|
+
<p className="text-muted-foreground text-xs">No comments yet.</p>
|
|
276
276
|
) : (
|
|
277
277
|
<ul className="flex flex-col gap-2">
|
|
278
278
|
{threads.map((thread) => (
|
|
@@ -323,8 +323,8 @@ function CommentThreadView({
|
|
|
323
323
|
mentionSearch,
|
|
324
324
|
}: CommentThreadViewProps): React.JSX.Element {
|
|
325
325
|
const [replyDraft, setReplyDraft] = useState('')
|
|
326
|
-
const cardClass = `rounded border bg-
|
|
327
|
-
isActive ? 'border-yellow-400 ring-1 ring-yellow-300' : 'border-
|
|
326
|
+
const cardClass = `rounded border bg-muted p-2 ${
|
|
327
|
+
isActive ? 'border-yellow-400 ring-1 ring-yellow-300' : 'border-border'
|
|
328
328
|
}`
|
|
329
329
|
|
|
330
330
|
return (
|
|
@@ -344,7 +344,7 @@ function CommentThreadView({
|
|
|
344
344
|
mentionSearch={mentionSearch}
|
|
345
345
|
/>
|
|
346
346
|
{thread.replies.length > 0 && (
|
|
347
|
-
<ul className="mt-2 flex flex-col gap-1 border-l-2
|
|
347
|
+
<ul className="border-border mt-2 flex flex-col gap-1 border-l-2 pl-2">
|
|
348
348
|
{thread.replies.map((reply) => (
|
|
349
349
|
<li key={reply.id}>
|
|
350
350
|
<CommentRow
|
|
@@ -365,7 +365,7 @@ function CommentThreadView({
|
|
|
365
365
|
<div className="mt-2 flex items-start gap-1">
|
|
366
366
|
<div className="flex-1">
|
|
367
367
|
<MentionableTextarea
|
|
368
|
-
className="w-full resize-none rounded border
|
|
368
|
+
className="border-border focus-visible:border-ring w-full resize-none rounded border px-2 py-1 text-xs focus:outline-none"
|
|
369
369
|
placeholder="Reply… Type @ to mention."
|
|
370
370
|
rows={1}
|
|
371
371
|
value={replyDraft}
|
|
@@ -377,7 +377,7 @@ function CommentThreadView({
|
|
|
377
377
|
</div>
|
|
378
378
|
<button
|
|
379
379
|
type="button"
|
|
380
|
-
className="
|
|
380
|
+
className="bg-foreground hover:bg-foreground/90 rounded px-2 py-1 text-xs font-medium text-white disabled:opacity-50"
|
|
381
381
|
disabled={!replyDraft.trim()}
|
|
382
382
|
onClick={(e) => {
|
|
383
383
|
e.stopPropagation()
|
|
@@ -420,7 +420,7 @@ function CommentRow({
|
|
|
420
420
|
|
|
421
421
|
const canMutate = isAdmin || comment.userId === currentUserId
|
|
422
422
|
const meta = (
|
|
423
|
-
<div className="text-
|
|
423
|
+
<div className="text-muted-foreground text-xs">
|
|
424
424
|
{comment.userId ?? 'deleted user'} · {formatRelative(comment.createdAt)}
|
|
425
425
|
{comment.isResolved ? ' · resolved' : null}
|
|
426
426
|
</div>
|
|
@@ -432,7 +432,7 @@ function CommentRow({
|
|
|
432
432
|
{editing ? (
|
|
433
433
|
<>
|
|
434
434
|
<MentionableTextarea
|
|
435
|
-
className="w-full resize-none rounded border
|
|
435
|
+
className="border-border w-full resize-none rounded border p-1 text-sm"
|
|
436
436
|
rows={3}
|
|
437
437
|
value={draft}
|
|
438
438
|
onChange={setDraft}
|
|
@@ -443,7 +443,7 @@ function CommentRow({
|
|
|
443
443
|
<div className="flex gap-1">
|
|
444
444
|
<button
|
|
445
445
|
type="button"
|
|
446
|
-
className="
|
|
446
|
+
className="bg-primary rounded px-2 py-1 text-xs font-medium text-white"
|
|
447
447
|
onClick={async (e) => {
|
|
448
448
|
e.stopPropagation()
|
|
449
449
|
const ok = await onEdit(comment.id, draft)
|
|
@@ -455,7 +455,7 @@ function CommentRow({
|
|
|
455
455
|
</button>
|
|
456
456
|
<button
|
|
457
457
|
type="button"
|
|
458
|
-
className="rounded border
|
|
458
|
+
className="border-border rounded border px-2 py-1 text-xs"
|
|
459
459
|
onClick={(e) => {
|
|
460
460
|
e.stopPropagation()
|
|
461
461
|
setDraft(comment.body)
|
|
@@ -469,7 +469,7 @@ function CommentRow({
|
|
|
469
469
|
</>
|
|
470
470
|
) : (
|
|
471
471
|
<p
|
|
472
|
-
className="text-sm whitespace-pre-wrap
|
|
472
|
+
className="text-foreground text-sm whitespace-pre-wrap"
|
|
473
473
|
data-testid={`comment-body-${comment.id}`}
|
|
474
474
|
>
|
|
475
475
|
{comment.body}
|
|
@@ -480,7 +480,7 @@ function CommentRow({
|
|
|
480
480
|
{canMutate && (
|
|
481
481
|
<button
|
|
482
482
|
type="button"
|
|
483
|
-
className="text-
|
|
483
|
+
className="text-muted-foreground hover:text-foreground"
|
|
484
484
|
onClick={(e) => {
|
|
485
485
|
e.stopPropagation()
|
|
486
486
|
setEditing(true)
|
|
@@ -493,7 +493,7 @@ function CommentRow({
|
|
|
493
493
|
{onToggleResolve && (
|
|
494
494
|
<button
|
|
495
495
|
type="button"
|
|
496
|
-
className="text-
|
|
496
|
+
className="text-muted-foreground hover:text-foreground"
|
|
497
497
|
onClick={(e) => {
|
|
498
498
|
e.stopPropagation()
|
|
499
499
|
onToggleResolve()
|
|
@@ -506,7 +506,7 @@ function CommentRow({
|
|
|
506
506
|
{canMutate && (
|
|
507
507
|
<button
|
|
508
508
|
type="button"
|
|
509
|
-
className="text-
|
|
509
|
+
className="text-destructive hover:text-destructive"
|
|
510
510
|
onClick={(e) => {
|
|
511
511
|
e.stopPropagation()
|
|
512
512
|
onDelete()
|
|
@@ -20,7 +20,7 @@ export function ContentOverviewChart({ published, drafts, scheduled }: ContentOv
|
|
|
20
20
|
|
|
21
21
|
if (total === 0) {
|
|
22
22
|
return (
|
|
23
|
-
<div className="flex h-full items-center justify-center text-sm
|
|
23
|
+
<div className="text-muted-foreground flex h-full items-center justify-center text-sm">
|
|
24
24
|
No content yet
|
|
25
25
|
</div>
|
|
26
26
|
)
|
|
@@ -58,12 +58,12 @@ export function ContentOverviewChart({ published, drafts, scheduled }: ContentOv
|
|
|
58
58
|
style={{ backgroundColor: COLORS[idx] }}
|
|
59
59
|
/>
|
|
60
60
|
<div className="min-w-0">
|
|
61
|
-
<span className="text-
|
|
61
|
+
<span className="text-foreground text-sm">{entry.name}</span>
|
|
62
62
|
<div className="flex items-baseline gap-2">
|
|
63
|
-
<span className="text-lg font-medium
|
|
63
|
+
<span className="text-foreground text-lg font-medium">
|
|
64
64
|
{entry.value.toLocaleString()}
|
|
65
65
|
</span>
|
|
66
|
-
<span className="text-
|
|
66
|
+
<span className="text-muted-foreground text-xs">{pct}%</span>
|
|
67
67
|
</div>
|
|
68
68
|
</div>
|
|
69
69
|
</div>
|
|
@@ -50,10 +50,10 @@ export function FocalPointPicker({ imageUrl, focalX, focalY, onChange }: FocalPo
|
|
|
50
50
|
draggable={false}
|
|
51
51
|
/>
|
|
52
52
|
<div
|
|
53
|
-
className="pointer-events-none absolute -mt-3 -ml-3 h-6 w-6 rounded-full border-2 border-white
|
|
53
|
+
className="bg-info/50 pointer-events-none absolute -mt-3 -ml-3 h-6 w-6 rounded-full border-2 border-white shadow-lg"
|
|
54
54
|
style={{ left: `${focalX * 100}%`, top: `${focalY * 100}%` }}
|
|
55
55
|
>
|
|
56
|
-
<div className="absolute inset-1 rounded-full
|
|
56
|
+
<div className="bg-card absolute inset-1 rounded-full" />
|
|
57
57
|
</div>
|
|
58
58
|
</div>
|
|
59
59
|
<p className="text-xs text-[var(--muted-foreground)]">
|