convex-cms 0.0.9-alpha.6 → 0.0.9-alpha.7

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 (68) hide show
  1. package/admin/src/contexts/SettingsConfigContext.tsx +67 -11
  2. package/admin/src/pages/SettingsPage.tsx +124 -80
  3. package/admin/src/routes/__root.tsx +4 -1
  4. package/admin-dist/nitro.json +1 -1
  5. package/admin-dist/public/assets/{CmsEmptyState-la_kLGHv.js → CmsEmptyState-gxhf-b6F.js} +1 -1
  6. package/admin-dist/public/assets/{CmsPageHeader-Cf0SafVG.js → CmsPageHeader-equV7Sd9.js} +1 -1
  7. package/admin-dist/public/assets/{CmsStatusBadge-BovugIHH.js → CmsStatusBadge-DQAslyW4.js} +1 -1
  8. package/admin-dist/public/assets/{CmsSurface-Dp1TegU4.js → CmsSurface-DdC_aGB5.js} +1 -1
  9. package/admin-dist/public/assets/{CmsToolbar-B1zdfMu0.js → CmsToolbar-Crleacii.js} +1 -1
  10. package/admin-dist/public/assets/{ContentEntryEditor-CB--8SC3.js → ContentEntryEditor-RmtIo3lE.js} +1 -1
  11. package/admin-dist/public/assets/{TaxonomyFilter-fmZxxbdA.js → TaxonomyFilter-BsoK90hw.js} +1 -1
  12. package/admin-dist/public/assets/{_contentTypeId-vT09P77i.js → _contentTypeId-Bn2ItET5.js} +1 -1
  13. package/admin-dist/public/assets/{_entryId-Dhq6ybYt.js → _entryId-CkZWLvOZ.js} +1 -1
  14. package/admin-dist/public/assets/{alert-DfdkD-ZZ.js → alert-C7q0k4u0.js} +1 -1
  15. package/admin-dist/public/assets/{badge-Cmc3T9vs.js → badge-DiaAY1It.js} +1 -1
  16. package/admin-dist/public/assets/{circle-check-big-B8AJAcBi.js → circle-check-big-Bl0y10am.js} +1 -1
  17. package/admin-dist/public/assets/{command-BsmkQ6_j.js → command-QyTDg7pa.js} +1 -1
  18. package/admin-dist/public/assets/{content-DdQ1u7T4.js → content-D868GT7T.js} +1 -1
  19. package/admin-dist/public/assets/{content-types-QYcwm0Sy.js → content-types-DD7fJA5i.js} +1 -1
  20. package/admin-dist/public/assets/{index-kxLB3e43.js → index-CMnzrG_D.js} +1 -1
  21. package/admin-dist/public/assets/{main-BrFRroF1.js → main-DWSY6jZL.js} +19 -19
  22. package/admin-dist/public/assets/{media-Cx9IyZvU.js → media-aqxopgtw.js} +1 -1
  23. package/admin-dist/public/assets/{new._contentTypeId-2HsDwzy_.js → new._contentTypeId-9ji3Hibs.js} +1 -1
  24. package/admin-dist/public/assets/{pencil-PaJhpDeC.js → pencil-D8GqMaV3.js} +1 -1
  25. package/admin-dist/public/assets/{refresh-cw-D_KNzBUN.js → refresh-cw-JipRPLLT.js} +1 -1
  26. package/admin-dist/public/assets/{rotate-ccw-I3wzW1RQ.js → rotate-ccw-CK11hP79.js} +1 -1
  27. package/admin-dist/public/assets/{scroll-area-t72-FBB4.js → scroll-area-CJS1P20j.js} +1 -1
  28. package/admin-dist/public/assets/{search-BsuImjd-.js → search-BT8HTHxb.js} +1 -1
  29. package/admin-dist/public/assets/settings-DCY0s2hR.js +1 -0
  30. package/admin-dist/public/assets/{switch-DWN_fx2n.js → switch-Cb-ecsrJ.js} +1 -1
  31. package/admin-dist/public/assets/{tabs-BG0vukFH.js → tabs-CFEXN2p7.js} +1 -1
  32. package/admin-dist/public/assets/{tanstack-adapter-DHsy8Fjs.js → tanstack-adapter-CGxC-fmP.js} +1 -1
  33. package/admin-dist/public/assets/{taxonomies-WG8YV2pR.js → taxonomies-C21Z8CBa.js} +1 -1
  34. package/admin-dist/public/assets/{trash-C3Lt5m9d.js → trash-CMRJlzc0.js} +1 -1
  35. package/admin-dist/public/assets/{useBreadcrumbLabel-BC8wl3jQ.js → useBreadcrumbLabel-ZZFYdqzi.js} +1 -1
  36. package/admin-dist/public/assets/{usePermissions-BM1Vv1YJ.js → usePermissions-C2FRye75.js} +1 -1
  37. package/admin-dist/server/_ssr/{CmsEmptyState-NKmyUWD9.mjs → CmsEmptyState-DWqt3y_O.mjs} +1 -1
  38. package/admin-dist/server/_ssr/{CmsPageHeader-CngxPIOg.mjs → CmsPageHeader-BuN0dOPA.mjs} +1 -1
  39. package/admin-dist/server/_ssr/{CmsStatusBadge-D4fiHjJD.mjs → CmsStatusBadge-CV35-X_8.mjs} +2 -2
  40. package/admin-dist/server/_ssr/{CmsSurface-DN9I2iuX.mjs → CmsSurface-DEcWf_aJ.mjs} +1 -1
  41. package/admin-dist/server/_ssr/{CmsToolbar-ux-veU96.mjs → CmsToolbar-BMBEZVgb.mjs} +1 -1
  42. package/admin-dist/server/_ssr/{ContentEntryEditor-BiY9bJr9.mjs → ContentEntryEditor-Db9Sy_0y.mjs} +8 -8
  43. package/admin-dist/server/_ssr/{TaxonomyFilter-BdtKJie2.mjs → TaxonomyFilter-D_xDfC8t.mjs} +3 -3
  44. package/admin-dist/server/_ssr/{_contentTypeId-CRo5WQVu.mjs → _contentTypeId-HZlfcQi-.mjs} +10 -10
  45. package/admin-dist/server/_ssr/{_entryId-FnG3uc_Y.mjs → _entryId-Cc_Ry7AV.mjs} +11 -11
  46. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-DhspKP9e.mjs +4 -0
  47. package/admin-dist/server/_ssr/{badge-D3SGS0Jp.mjs → badge-CmG74mbX.mjs} +1 -1
  48. package/admin-dist/server/_ssr/{command-2t7uTBKt.mjs → command-DWXiOsOb.mjs} +1 -1
  49. package/admin-dist/server/_ssr/{content-CCsSzXeb.mjs → content-CAgFQzx-.mjs} +8 -8
  50. package/admin-dist/server/_ssr/{content-types-CuVG3uSt.mjs → content-types-CqKvAZ8P.mjs} +6 -6
  51. package/admin-dist/server/_ssr/{index-CLwCLoco.mjs → index--qYdIqvh.mjs} +3 -3
  52. package/admin-dist/server/_ssr/index.mjs +2 -2
  53. package/admin-dist/server/_ssr/{media-D3duVWkk.mjs → media-AXePwPAK.mjs} +9 -9
  54. package/admin-dist/server/_ssr/{new._contentTypeId-6uKYdgGO.mjs → new._contentTypeId-DNWIl-Ha.mjs} +10 -10
  55. package/admin-dist/server/_ssr/{router-D9Zk56-q.mjs → router-B_gIkxi2.mjs} +59 -16
  56. package/admin-dist/server/_ssr/{scroll-area-vbjKsfFu.mjs → scroll-area-Cz-9ry0J.mjs} +1 -1
  57. package/admin-dist/server/_ssr/{settings-D7-vwjqD.mjs → settings-BjSxo5d6.mjs} +95 -80
  58. package/admin-dist/server/_ssr/{switch-CbKuV4Qh.mjs → switch-IsC1gdb1.mjs} +1 -1
  59. package/admin-dist/server/_ssr/{tabs-C_IfqLiu.mjs → tabs-BdgLwrYe.mjs} +1 -1
  60. package/admin-dist/server/_ssr/{tanstack-adapter-yhyAcBi-.mjs → tanstack-adapter-CFwjrqRl.mjs} +1 -1
  61. package/admin-dist/server/_ssr/{taxonomies-C15s_nvM.mjs → taxonomies-D5Di9EgA.mjs} +7 -7
  62. package/admin-dist/server/_ssr/{trash-BPIjmAUh.mjs → trash-DokZl1yA.mjs} +7 -7
  63. package/admin-dist/server/_ssr/{useBreadcrumbLabel-BC7plG0L.mjs → useBreadcrumbLabel-C4TsA5z0.mjs} +1 -1
  64. package/admin-dist/server/_ssr/{usePermissions-DJ8a7bZU.mjs → usePermissions-COsRlMp-.mjs} +1 -1
  65. package/admin-dist/server/index.mjs +153 -153
  66. package/package.json +1 -1
  67. package/admin-dist/public/assets/settings-DB6TvceQ.js +0 -1
  68. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-BbSNqRIw.mjs +0 -4
@@ -18,8 +18,12 @@ export interface Settings {
18
18
  }
19
19
 
20
20
  type SettingsApi = {
21
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
- getSettings: FunctionReference<"query", "public", Record<string, never>, Settings | null>;
21
+ getSettings: FunctionReference<
22
+ "query",
23
+ "public",
24
+ Record<string, never>,
25
+ Settings | null
26
+ >;
23
27
  };
24
28
 
25
29
  interface SettingsConfigContextValue {
@@ -27,21 +31,22 @@ interface SettingsConfigContextValue {
27
31
  settings: Settings | undefined;
28
32
  }
29
33
 
30
- const SettingsConfigContext = createContext<SettingsConfigContextValue | null>(null);
34
+ const SettingsConfigContext = createContext<SettingsConfigContextValue | null>(
35
+ null
36
+ );
31
37
 
32
- export function SettingsConfigProvider({
38
+ // Component that queries settings (only rendered when api is provided)
39
+ function SettingsConfigProviderWithQuery({
33
40
  baseConfig,
34
41
  children,
35
42
  api,
36
43
  }: {
37
44
  baseConfig: AdminConfig;
38
45
  children: ReactNode;
39
- api?: SettingsApi;
46
+ api: SettingsApi;
40
47
  }) {
41
- // Use skip pattern when api is not provided
42
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
43
- const queryArg = api ? api.getSettings : ("skip" as any);
44
- const settings = useQuery(queryArg) as Settings | undefined;
48
+ // Proper skip pattern: function ref first, args (or "skip") second
49
+ const settings = useQuery(api.getSettings, {}) ?? undefined;
45
50
 
46
51
  const mergedConfig = useMemo((): AdminConfig => {
47
52
  if (!settings) return baseConfig;
@@ -50,7 +55,8 @@ export function SettingsConfigProvider({
50
55
  ...baseConfig,
51
56
  navigation: {
52
57
  ...baseConfig.navigation,
53
- showMedia: baseConfig.navigation.showMedia && settings.features.mediaManagement,
58
+ showMedia:
59
+ baseConfig.navigation.showMedia && settings.features.mediaManagement,
54
60
  },
55
61
  };
56
62
  }, [baseConfig, settings]);
@@ -69,10 +75,60 @@ export function SettingsConfigProvider({
69
75
  );
70
76
  }
71
77
 
78
+ // Component without query (when api is not provided)
79
+ function SettingsConfigProviderWithoutQuery({
80
+ baseConfig,
81
+ children,
82
+ }: {
83
+ baseConfig: AdminConfig;
84
+ children: ReactNode;
85
+ }) {
86
+ const contextValue = useMemo(
87
+ () => ({ baseConfig, settings: undefined }),
88
+ [baseConfig]
89
+ );
90
+
91
+ return (
92
+ <SettingsConfigContext.Provider value={contextValue}>
93
+ <AdminConfigProvider config={baseConfig}>{children}</AdminConfigProvider>
94
+ </SettingsConfigContext.Provider>
95
+ );
96
+ }
97
+
98
+ export function SettingsConfigProvider({
99
+ baseConfig,
100
+ children,
101
+ api,
102
+ }: {
103
+ baseConfig: AdminConfig;
104
+ children: ReactNode;
105
+ api?: SettingsApi;
106
+ }) {
107
+ // Use component splitting to avoid calling useQuery without a valid function ref
108
+ if (api) {
109
+ return (
110
+ <SettingsConfigProviderWithQuery
111
+ baseConfig={baseConfig}
112
+ api={api}
113
+ children={children}
114
+ />
115
+ );
116
+ }
117
+
118
+ return (
119
+ <SettingsConfigProviderWithoutQuery
120
+ baseConfig={baseConfig}
121
+ children={children}
122
+ />
123
+ );
124
+ }
125
+
72
126
  export function useSettingsConfig(): SettingsConfigContextValue {
73
127
  const ctx = useContext(SettingsConfigContext);
74
128
  if (!ctx) {
75
- throw new Error("useSettingsConfig must be used within SettingsConfigProvider");
129
+ throw new Error(
130
+ "useSettingsConfig must be used within SettingsConfigProvider"
131
+ );
76
132
  }
77
133
  return ctx;
78
134
  }
@@ -126,22 +126,110 @@ export interface SettingsPageProps {
126
126
  navigation: AdminNavigation;
127
127
  }
128
128
 
129
- export function SettingsPage({
129
+ // Unconfigured settings page (no useQuery needed)
130
+ function SettingsPageUnconfigured() {
131
+ return (
132
+ <RouteGuard requiredPermission={{ resource: "settings", action: "manage" }}>
133
+ <div className="space-y-6 p-6">
134
+ <CmsPageHeader
135
+ title="Settings"
136
+ description="Configure your CMS settings and preferences."
137
+ />
138
+
139
+ <div className="space-y-6">
140
+ <AppearanceSection />
141
+
142
+ <Alert>
143
+ <Info className="size-4" />
144
+ <AlertDescription>
145
+ <strong>Settings not configured.</strong> To enable CMS settings,
146
+ export{" "}
147
+ <code className="rounded bg-muted px-1 py-0.5 text-xs">
148
+ getSettings
149
+ </code>
150
+ ,{" "}
151
+ <code className="rounded bg-muted px-1 py-0.5 text-xs">
152
+ updateSettings
153
+ </code>
154
+ , and{" "}
155
+ <code className="rounded bg-muted px-1 py-0.5 text-xs">
156
+ resetSettings
157
+ </code>{" "}
158
+ from your{" "}
159
+ <code className="rounded bg-muted px-1 py-0.5 text-xs">
160
+ convex/admin.ts
161
+ </code>{" "}
162
+ file.
163
+ </AlertDescription>
164
+ </Alert>
165
+
166
+ <CmsSurface elevation="base" className="p-6">
167
+ <div className="mb-4 flex items-center gap-2">
168
+ <h2 className="text-lg font-semibold text-foreground">Features</h2>
169
+ <Badge variant="secondary" className="gap-1">
170
+ <Lock className="size-3" />
171
+ Default values
172
+ </Badge>
173
+ </div>
174
+ <p className="mb-4 text-sm text-muted-foreground">
175
+ Showing default feature flags. Configure settings in your admin
176
+ API to customize.
177
+ </p>
178
+ <div className="space-y-4">
179
+ {(
180
+ [
181
+ "versioning",
182
+ "scheduling",
183
+ "localization",
184
+ "mediaManagement",
185
+ ] as const
186
+ ).map((feature) => (
187
+ <div
188
+ key={feature}
189
+ className="flex items-center justify-between opacity-75"
190
+ >
191
+ <div>
192
+ <Label className="text-sm font-medium capitalize">
193
+ {feature}
194
+ </Label>
195
+ </div>
196
+ <Switch checked={DEFAULT_FEATURES[feature]} disabled={true} />
197
+ </div>
198
+ ))}
199
+ </div>
200
+ </CmsSurface>
201
+
202
+ <CmsSurface elevation="base" className="p-6">
203
+ <h2 className="mb-4 text-lg font-semibold text-foreground">API</h2>
204
+ <div className="space-y-4">
205
+ <div>
206
+ <Label className="text-sm font-medium">
207
+ Convex Deployment URL
208
+ </Label>
209
+ <code className="mt-1 block rounded-md bg-muted px-3 py-2 text-sm">
210
+ {import.meta.env.VITE_CONVEX_URL || "Not configured"}
211
+ </code>
212
+ </div>
213
+ </div>
214
+ </CmsSurface>
215
+ </div>
216
+ </div>
217
+ </RouteGuard>
218
+ );
219
+ }
220
+
221
+ // Configured settings page with query
222
+ function SettingsPageConfigured({
130
223
  api,
131
- navigation: _navigation,
132
- }: SettingsPageProps) {
224
+ }: {
225
+ api: CmsAdminApi & { getSettings: NonNullable<CmsAdminApi["getSettings"]> };
226
+ }) {
133
227
  const { canManageSettings } = usePermissions();
134
228
  const canEdit = canManageSettings();
135
229
  const adminConfig = useAdminConfig();
136
230
 
137
- const isConfigured = useMemo(() => {
138
- return api.getSettings != null;
139
- }, [api]);
140
-
141
- const settings = useQuery(
142
- isConfigured ? api.getSettings : ("skip" as unknown as typeof api.getSettings),
143
- isConfigured ? {} : "skip"
144
- );
231
+ // Proper skip pattern: valid function ref, args as second param
232
+ const settings = useQuery(api.getSettings, {});
145
233
 
146
234
  const updateSettingsMutation = useMutation(
147
235
  api.updateSettings ?? ((() => {}) as unknown as typeof api.updateSettings)
@@ -197,7 +285,7 @@ export function SettingsPage({
197
285
  );
198
286
 
199
287
  const handleSave = useCallback(async () => {
200
- if (!formData || !isDirty || !isConfigured || !api.updateSettings) return;
288
+ if (!formData || !isDirty || !api.updateSettings) return;
201
289
 
202
290
  setFeedbackStatus("saving");
203
291
  setErrorMessage(null);
@@ -219,10 +307,10 @@ export function SettingsPage({
219
307
  error instanceof Error ? error.message : "Failed to save settings",
220
308
  );
221
309
  }
222
- }, [formData, isDirty, isConfigured, api.updateSettings, updateSettingsMutation]);
310
+ }, [formData, isDirty, api.updateSettings, updateSettingsMutation]);
223
311
 
224
312
  const handleReset = useCallback(async () => {
225
- if (!isConfigured || !api.resetSettings) return;
313
+ if (!api.resetSettings) return;
226
314
 
227
315
  const confirmed = window.confirm(
228
316
  "Are you sure you want to reset all settings to their defaults? This action cannot be undone.",
@@ -257,7 +345,7 @@ export function SettingsPage({
257
345
  error instanceof Error ? error.message : "Failed to reset settings",
258
346
  );
259
347
  }
260
- }, [isConfigured, api.resetSettings, resetSettingsMutation]);
348
+ }, [api.resetSettings, resetSettingsMutation]);
261
349
 
262
350
  const handleDiscard = useCallback(() => {
263
351
  if (normalizedSettings) {
@@ -268,71 +356,6 @@ export function SettingsPage({
268
356
  }
269
357
  }, [normalizedSettings]);
270
358
 
271
- if (!isConfigured) {
272
- return (
273
- <RouteGuard
274
- requiredPermission={{ resource: "settings", action: "manage" }}
275
- >
276
- <div className="space-y-6 p-6">
277
- <CmsPageHeader
278
- title="Settings"
279
- description="Configure your CMS settings and preferences."
280
- />
281
-
282
- <div className="space-y-6">
283
- <AppearanceSection />
284
-
285
- <Alert>
286
- <Info className="size-4" />
287
- <AlertDescription>
288
- <strong>Settings not configured.</strong> To enable CMS settings, export{" "}
289
- <code className="rounded bg-muted px-1 py-0.5 text-xs">getSettings</code>,{" "}
290
- <code className="rounded bg-muted px-1 py-0.5 text-xs">updateSettings</code>, and{" "}
291
- <code className="rounded bg-muted px-1 py-0.5 text-xs">resetSettings</code> from your{" "}
292
- <code className="rounded bg-muted px-1 py-0.5 text-xs">convex/admin.ts</code> file.
293
- </AlertDescription>
294
- </Alert>
295
-
296
- <CmsSurface elevation="base" className="p-6">
297
- <div className="mb-4 flex items-center gap-2">
298
- <h2 className="text-lg font-semibold text-foreground">Features</h2>
299
- <Badge variant="secondary" className="gap-1">
300
- <Lock className="size-3" />
301
- Default values
302
- </Badge>
303
- </div>
304
- <p className="mb-4 text-sm text-muted-foreground">
305
- Showing default feature flags. Configure settings in your admin API to customize.
306
- </p>
307
- <div className="space-y-4">
308
- {(["versioning", "scheduling", "localization", "mediaManagement"] as const).map((feature) => (
309
- <div key={feature} className="flex items-center justify-between opacity-75">
310
- <div>
311
- <Label className="text-sm font-medium capitalize">{feature}</Label>
312
- </div>
313
- <Switch checked={DEFAULT_FEATURES[feature]} disabled={true} />
314
- </div>
315
- ))}
316
- </div>
317
- </CmsSurface>
318
-
319
- <CmsSurface elevation="base" className="p-6">
320
- <h2 className="mb-4 text-lg font-semibold text-foreground">API</h2>
321
- <div className="space-y-4">
322
- <div>
323
- <Label className="text-sm font-medium">Convex Deployment URL</Label>
324
- <code className="mt-1 block rounded-md bg-muted px-3 py-2 text-sm">
325
- {import.meta.env.VITE_CONVEX_URL || "Not configured"}
326
- </code>
327
- </div>
328
- </div>
329
- </CmsSurface>
330
- </div>
331
- </div>
332
- </RouteGuard>
333
- );
334
- }
335
-
336
359
  if (settings === undefined) {
337
360
  return (
338
361
  <RouteGuard
@@ -547,3 +570,24 @@ export function SettingsPage({
547
570
  </RouteGuard>
548
571
  );
549
572
  }
573
+
574
+ // Main wrapper that decides which component to render
575
+ export function SettingsPage({
576
+ api,
577
+ navigation: _navigation,
578
+ }: SettingsPageProps) {
579
+ // Check if settings API is configured
580
+ if (api.getSettings) {
581
+ return (
582
+ <SettingsPageConfigured
583
+ api={
584
+ api as CmsAdminApi & {
585
+ getSettings: NonNullable<CmsAdminApi["getSettings"]>;
586
+ }
587
+ }
588
+ />
589
+ );
590
+ }
591
+
592
+ return <SettingsPageUnconfigured />;
593
+ }
@@ -231,7 +231,10 @@ function ConvexProviderWrapper({
231
231
  return (
232
232
  <ConvexProvider client={convex}>
233
233
  <ApiProvider api={api.admin}>
234
- <SettingsConfigProvider baseConfig={adminConfig}>
234
+ <SettingsConfigProvider
235
+ baseConfig={adminConfig}
236
+ api={{ getSettings: api.admin.getSettings }}
237
+ >
235
238
  {children}
236
239
  </SettingsConfigProvider>
237
240
  </ApiProvider>
@@ -1,5 +1,5 @@
1
1
  {
2
- "date": "2026-01-28T12:28:07.860Z",
2
+ "date": "2026-01-28T13:35:47.975Z",
3
3
  "preset": "node-server",
4
4
  "framework": {
5
5
  "name": "nitro",
@@ -1 +1 @@
1
- import{j as e,C as n,h as x}from"./main-BrFRroF1.js";function d({icon:s,title:m,description:r,action:t,className:l,...a}){return e.jsxs("div",{className:x("flex flex-col items-center justify-center py-12 text-center",l),...a,children:[s&&e.jsx("div",{className:"mb-4 flex size-12 items-center justify-center rounded-full bg-muted text-muted-foreground",children:s}),e.jsx("h3",{className:"text-base font-semibold text-foreground",children:m}),r&&e.jsx("p",{className:"mt-1 max-w-sm text-sm text-muted-foreground",children:r}),t&&e.jsx(n,{variant:t.variant??"primary",onClick:t.onClick,className:"mt-4",children:t.label})]})}export{d as C};
1
+ import{j as e,C as n,h as x}from"./main-DWSY6jZL.js";function d({icon:s,title:m,description:r,action:t,className:l,...a}){return e.jsxs("div",{className:x("flex flex-col items-center justify-center py-12 text-center",l),...a,children:[s&&e.jsx("div",{className:"mb-4 flex size-12 items-center justify-center rounded-full bg-muted text-muted-foreground",children:s}),e.jsx("h3",{className:"text-base font-semibold text-foreground",children:m}),r&&e.jsx("p",{className:"mt-1 max-w-sm text-sm text-muted-foreground",children:r}),t&&e.jsx(n,{variant:t.variant??"primary",onClick:t.onClick,className:"mt-4",children:t.label})]})}export{d as C};
@@ -1 +1 @@
1
- import{j as e,h as m}from"./main-BrFRroF1.js";function c({title:i,description:s,actions:t,breadcrumbs:a,className:l,...r}){return e.jsxs("div",{className:m("mb-6",l),...r,children:[a&&e.jsx("div",{className:"mb-2",children:a}),e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx("h1",{className:"text-2xl font-semibold tracking-tight text-foreground",children:i}),s&&e.jsx("p",{className:"text-sm text-muted-foreground",children:s})]}),t&&e.jsx("div",{className:"flex items-center gap-2",children:t})]})]})}export{c as C};
1
+ import{j as e,h as m}from"./main-DWSY6jZL.js";function c({title:i,description:s,actions:t,breadcrumbs:a,className:l,...r}){return e.jsxs("div",{className:m("mb-6",l),...r,children:[a&&e.jsx("div",{className:"mb-2",children:a}),e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx("h1",{className:"text-2xl font-semibold tracking-tight text-foreground",children:i}),s&&e.jsx("p",{className:"text-sm text-muted-foreground",children:s})]}),t&&e.jsx("div",{className:"flex items-center gap-2",children:t})]})]})}export{c as C};
@@ -1 +1 @@
1
- import{j as e,h as t}from"./main-BrFRroF1.js";import{B as a}from"./badge-Cmc3T9vs.js";const c={draft:{label:"Draft",className:"status-draft",icon:e.jsx("svg",{className:"size-3",fill:"currentColor",viewBox:"0 0 8 8",children:e.jsx("circle",{cx:"4",cy:"4",r:"3"})})},published:{label:"Published",className:"status-published",icon:e.jsx("svg",{className:"size-3",fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"})})},scheduled:{label:"Scheduled",className:"status-scheduled",icon:e.jsxs("svg",{className:"size-3",fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",children:[e.jsx("circle",{cx:"12",cy:"12",r:"10"}),e.jsx("path",{strokeLinecap:"round",d:"M12 6v6l4 2"})]})},archived:{label:"Archived",className:"status-archived",icon:e.jsx("svg",{className:"size-3",fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4"})})}},n={gray:"bg-muted text-muted-foreground",yellow:"bg-diff-modified-bg text-diff-modified-foreground",blue:"bg-info-bg text-info-foreground",green:"bg-diff-added-bg text-diff-added-foreground",red:"bg-diff-removed-bg text-diff-removed-foreground",purple:"bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-400",orange:"bg-diff-modified-bg text-diff-modified-foreground"};function l(){return e.jsx("svg",{className:"size-3",fill:"currentColor",viewBox:"0 0 8 8",children:e.jsx("circle",{cx:"4",cy:"4",r:"3"})})}function x({status:d,customConfig:s,className:o,...i}){if(s)return e.jsxs(a,{variant:"secondary",className:t("gap-1.5 px-2 py-0.5 text-xs font-medium",n[s.color],o),...i,children:[l(),s.displayName]});const r=c[d];return r?e.jsxs(a,{variant:"secondary",className:t("gap-1.5 px-2 py-0.5 text-xs font-medium",r.className,o),...i,children:[r.icon,r.label]}):e.jsxs(a,{variant:"secondary",className:t("gap-1.5 px-2 py-0.5 text-xs font-medium",n.gray,o),...i,children:[l(),d]})}export{x as C};
1
+ import{j as e,h as t}from"./main-DWSY6jZL.js";import{B as a}from"./badge-DiaAY1It.js";const c={draft:{label:"Draft",className:"status-draft",icon:e.jsx("svg",{className:"size-3",fill:"currentColor",viewBox:"0 0 8 8",children:e.jsx("circle",{cx:"4",cy:"4",r:"3"})})},published:{label:"Published",className:"status-published",icon:e.jsx("svg",{className:"size-3",fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"})})},scheduled:{label:"Scheduled",className:"status-scheduled",icon:e.jsxs("svg",{className:"size-3",fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",children:[e.jsx("circle",{cx:"12",cy:"12",r:"10"}),e.jsx("path",{strokeLinecap:"round",d:"M12 6v6l4 2"})]})},archived:{label:"Archived",className:"status-archived",icon:e.jsx("svg",{className:"size-3",fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4"})})}},n={gray:"bg-muted text-muted-foreground",yellow:"bg-diff-modified-bg text-diff-modified-foreground",blue:"bg-info-bg text-info-foreground",green:"bg-diff-added-bg text-diff-added-foreground",red:"bg-diff-removed-bg text-diff-removed-foreground",purple:"bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-400",orange:"bg-diff-modified-bg text-diff-modified-foreground"};function l(){return e.jsx("svg",{className:"size-3",fill:"currentColor",viewBox:"0 0 8 8",children:e.jsx("circle",{cx:"4",cy:"4",r:"3"})})}function x({status:d,customConfig:s,className:o,...i}){if(s)return e.jsxs(a,{variant:"secondary",className:t("gap-1.5 px-2 py-0.5 text-xs font-medium",n[s.color],o),...i,children:[l(),s.displayName]});const r=c[d];return r?e.jsxs(a,{variant:"secondary",className:t("gap-1.5 px-2 py-0.5 text-xs font-medium",r.className,o),...i,children:[r.icon,r.label]}):e.jsxs(a,{variant:"secondary",className:t("gap-1.5 px-2 py-0.5 text-xs font-medium",n.gray,o),...i,children:[l(),d]})}export{x as C};
@@ -1 +1 @@
1
- import{j as r,h as t}from"./main-BrFRroF1.js";const l={base:"surface-base",elevated:"surface-elevated",floating:"surface-floating"},m={none:"",sm:"p-3",md:"p-4",lg:"p-6"},u={none:"rounded-none",sm:"rounded-sm",md:"rounded-md",lg:"rounded-lg"};function f({elevation:e="base",padding:s="md",rounded:n="lg",className:a,children:d,...o}){return r.jsx("div",{className:t(l[e],m[s],u[n],a),...o,children:d})}export{f as C};
1
+ import{j as r,h as t}from"./main-DWSY6jZL.js";const l={base:"surface-base",elevated:"surface-elevated",floating:"surface-floating"},m={none:"",sm:"p-3",md:"p-4",lg:"p-6"},u={none:"rounded-none",sm:"rounded-sm",md:"rounded-md",lg:"rounded-lg"};function f({elevation:e="base",padding:s="md",rounded:n="lg",className:a,children:d,...o}){return r.jsx("div",{className:t(l[e],m[s],u[n],a),...o,children:d})}export{f as C};
@@ -1 +1 @@
1
- import{j as e,I as i,h as o}from"./main-BrFRroF1.js";import{S as p}from"./search-BsuImjd-.js";function u({left:t,right:s,search:a,filters:r,actions:l,className:n,children:x,...m}){return e.jsxs("div",{className:o("flex flex-wrap items-center justify-between gap-3 pb-4",n),...m,children:[e.jsxs("div",{className:"flex flex-1 flex-wrap items-center gap-2",children:[a&&e.jsxs("div",{className:"relative w-full max-w-xs",children:[e.jsx(p,{className:"absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground"}),e.jsx(i,{type:"search",placeholder:a.placeholder??"Search...",value:a.value,onChange:c=>a.onChange(c.target.value),className:"pl-9"})]}),r,t,x]}),(s||l)&&e.jsx("div",{className:"flex items-center gap-2",children:s??l})]})}export{u as C};
1
+ import{j as e,I as i,h as o}from"./main-DWSY6jZL.js";import{S as p}from"./search-BT8HTHxb.js";function u({left:t,right:s,search:a,filters:r,actions:l,className:n,children:x,...m}){return e.jsxs("div",{className:o("flex flex-wrap items-center justify-between gap-3 pb-4",n),...m,children:[e.jsxs("div",{className:"flex flex-1 flex-wrap items-center gap-2",children:[a&&e.jsxs("div",{className:"relative w-full max-w-xs",children:[e.jsx(p,{className:"absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground"}),e.jsx(i,{type:"search",placeholder:a.placeholder??"Search...",value:a.value,onChange:c=>a.onChange(c.target.value),className:"pl-9"})]}),r,t,x]}),(s||l)&&e.jsx("div",{className:"flex items-center gap-2",children:s??l})]})}export{u as C};