convex-cms 0.0.9-alpha.8 → 0.0.10

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 (136) hide show
  1. package/README.md +27 -0
  2. package/admin/src/components/Header.tsx +1 -1
  3. package/admin/src/components/RouteGuard.tsx +1 -1
  4. package/admin/src/components/UploadDropzone.tsx +1 -1
  5. package/admin/src/components/cmsds/CmsFilterBar.tsx +74 -0
  6. package/admin/src/components/cmsds/CmsInput.tsx +24 -0
  7. package/admin/src/components/cmsds/CmsPagination.tsx +79 -0
  8. package/admin/src/components/cmsds/CmsSelect.tsx +59 -0
  9. package/admin/src/components/cmsds/CmsStatCard.tsx +79 -0
  10. package/admin/src/components/cmsds/CmsStatusBadge.tsx +1 -1
  11. package/admin/src/components/cmsds/index.ts +5 -0
  12. package/admin/src/components/ui/sidebar.tsx +1 -1
  13. package/admin/src/contexts/AuthContext.tsx +1 -1
  14. package/admin/src/contexts/ThemeContext.tsx +85 -17
  15. package/admin/src/embed/components/EmbedHeader.tsx +11 -9
  16. package/admin/src/embed/components/EmbedLayout.tsx +2 -6
  17. package/admin/src/embed/components/EmbedSidebar.tsx +16 -13
  18. package/admin/src/embed/contexts/ApiContext.tsx +1 -1
  19. package/admin/src/embed/index.tsx +3 -2
  20. package/admin/src/embed/types.ts +6 -0
  21. package/admin/src/hooks/usePermissions.ts +1 -1
  22. package/admin/src/index.css +432 -0
  23. package/admin/src/lib/cmsExports.ts +6 -0
  24. package/admin/src/pages/ContentPage.tsx +116 -172
  25. package/admin/src/pages/ContentTypeEntriesPage.tsx +120 -194
  26. package/admin/src/pages/ContentTypesPage.tsx +136 -139
  27. package/admin/src/pages/DashboardPage.tsx +15 -55
  28. package/admin/src/pages/MediaPage.tsx +31 -57
  29. package/admin/src/pages/SettingsPage.tsx +5 -1
  30. package/admin/src/pages/TrashPage.tsx +115 -170
  31. package/admin/src/routes/__root.tsx +1 -1
  32. package/admin-dist/nitro.json +1 -1
  33. package/admin-dist/public/assets/{CmsEmptyState-DTlpzjOI.js → CmsEmptyState-BKeL4DBB.js} +1 -1
  34. package/admin-dist/public/assets/CmsFilterBar-CEpMHd_c.js +1 -0
  35. package/admin-dist/public/assets/{CmsPageHeader-0REGRH4X.js → CmsPageHeader-CIEkTbyH.js} +1 -1
  36. package/admin-dist/public/assets/{CmsStatusBadge-D_n8u8xa.js → CmsStatusBadge-BFMOsfMW.js} +1 -1
  37. package/admin-dist/public/assets/{CmsSurface-BHmvNai4.js → CmsSurface-kqqaFKUI.js} +1 -1
  38. package/admin-dist/public/assets/CmsTable-Db53Exq0.js +1 -0
  39. package/admin-dist/public/assets/ContentEntryEditor-Ct7cHayy.js +4 -0
  40. package/admin-dist/public/assets/TaxonomyFilter-Bm1DI1A7.js +1 -0
  41. package/admin-dist/public/assets/_contentTypeId-BekeCblX.js +1 -0
  42. package/admin-dist/public/assets/{_entryId-jPXz4z9T.js → _entryId-CoZDE0l0.js} +1 -1
  43. package/admin-dist/public/assets/{alert-CG97cMfC.js → alert-CpLdsTGU.js} +1 -1
  44. package/admin-dist/public/assets/{badge-C6qt24oj.js → badge-BQAotc5B.js} +1 -1
  45. package/admin-dist/public/assets/{circle-check-big-PltpxuB1.js → circle-check-big-BF3Y5nES.js} +1 -1
  46. package/admin-dist/public/assets/{command-CJ8i86fd.js → command-lEq6f_Ee.js} +1 -1
  47. package/admin-dist/public/assets/content-DH6k0dN6.js +1 -0
  48. package/admin-dist/public/assets/content-types-DHr9tc2V.js +1 -0
  49. package/admin-dist/public/assets/index-Cf0lbl0G.js +1 -0
  50. package/admin-dist/public/assets/index-D-4wFfgU.css +1 -0
  51. package/admin-dist/public/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  52. package/admin-dist/public/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  53. package/admin-dist/public/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  54. package/admin-dist/public/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  55. package/admin-dist/public/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  56. package/admin-dist/public/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  57. package/admin-dist/public/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  58. package/admin-dist/public/assets/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2 +0 -0
  59. package/admin-dist/public/assets/jetbrains-mono-cyrillic-400-normal-ugxPyKxw.woff +0 -0
  60. package/admin-dist/public/assets/jetbrains-mono-greek-400-normal-B9oWc5Lo.woff +0 -0
  61. package/admin-dist/public/assets/jetbrains-mono-greek-400-normal-C190GLew.woff2 +0 -0
  62. package/admin-dist/public/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
  63. package/admin-dist/public/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
  64. package/admin-dist/public/assets/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2 +0 -0
  65. package/admin-dist/public/assets/jetbrains-mono-latin-ext-400-normal-fXTG6kC5.woff +0 -0
  66. package/admin-dist/public/assets/jetbrains-mono-vietnamese-400-normal-CqNFfHCs.woff +0 -0
  67. package/admin-dist/public/assets/main-B-6700eG.js +137 -0
  68. package/admin-dist/public/assets/media-DY5zD52L.js +1 -0
  69. package/admin-dist/public/assets/{new._contentTypeId-qsvo01mH.js → new._contentTypeId-Dq_NqTQV.js} +1 -1
  70. package/admin-dist/public/assets/{pencil-gAL0R34f.js → pencil-CI_KfxSx.js} +1 -1
  71. package/admin-dist/public/assets/refresh-cw-BrXg9a2r.js +1 -0
  72. package/admin-dist/public/assets/rotate-ccw-PwzxdPxd.js +1 -0
  73. package/admin-dist/public/assets/{scroll-area-CJBhf9pf.js → scroll-area-DX_nZYp8.js} +1 -1
  74. package/admin-dist/public/assets/{search-WXp6KxDJ.js → search-DlwBH4C5.js} +1 -1
  75. package/admin-dist/public/assets/settings-2mx3_ORG.js +1 -0
  76. package/admin-dist/public/assets/{switch-Ck9ecqEX.js → switch-CjPi4DKH.js} +1 -1
  77. package/admin-dist/public/assets/{tabs-vQYu8rjC.js → tabs-B5X37GEM.js} +1 -1
  78. package/admin-dist/public/assets/tanstack-adapter-KSm-nO5L.js +1 -0
  79. package/admin-dist/public/assets/{taxonomies-DvILUNvr.js → taxonomies-CHjJKNlR.js} +1 -1
  80. package/admin-dist/public/assets/trash-Cle-tcqq.js +1 -0
  81. package/admin-dist/public/assets/{useBreadcrumbLabel-tlSh7dtO.js → useBreadcrumbLabel-yZQG_N_3.js} +1 -1
  82. package/admin-dist/public/assets/{usePermissions-BTGdTOJS.js → usePermissions-D6vsoaJf.js} +1 -1
  83. package/admin-dist/server/_libs/convex-helpers.mjs +1077 -2
  84. package/admin-dist/server/_libs/convex.mjs +222 -13
  85. package/admin-dist/server/_libs/lucide-react.mjs +57 -51
  86. package/admin-dist/server/_ssr/{CmsEmptyState-CB6e53i5.mjs → CmsEmptyState-DzzuQG0S.mjs} +1 -1
  87. package/admin-dist/server/_ssr/CmsFilterBar-C5XADS12.mjs +81 -0
  88. package/admin-dist/server/_ssr/{CmsPageHeader-COUHuECp.mjs → CmsPageHeader-DZ6h7smh.mjs} +1 -1
  89. package/admin-dist/server/_ssr/{CmsStatusBadge-kMTL6koE.mjs → CmsStatusBadge-D-YFSAa1.mjs} +3 -3
  90. package/admin-dist/server/_ssr/{CmsSurface-D1HDYjRg.mjs → CmsSurface-Cv51NBLZ.mjs} +1 -1
  91. package/admin-dist/server/_ssr/CmsTable-DG88C5nO.mjs +189 -0
  92. package/admin-dist/server/_ssr/{ContentEntryEditor-Bq8FR_uK.mjs → ContentEntryEditor-CRjwXB17.mjs} +10 -10
  93. package/admin-dist/server/_ssr/{TaxonomyFilter-bm_p4ADg.mjs → TaxonomyFilter-xGwcgtjr.mjs} +3 -3
  94. package/admin-dist/server/_ssr/{_contentTypeId-B7obLmi_.mjs → _contentTypeId-DRCfeKkm.mjs} +53 -12
  95. package/admin-dist/server/_ssr/{_entryId-B4zhQqFg.mjs → _entryId-DULm2TDy.mjs} +11 -11
  96. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-iX3K33p1.mjs +4 -0
  97. package/admin-dist/server/_ssr/{badge-NOEC9bkk.mjs → badge-CbjIvhb6.mjs} +1 -1
  98. package/admin-dist/server/_ssr/{command-h4-OYNBo.mjs → command-xB2uiYps.mjs} +2 -2
  99. package/admin-dist/server/_ssr/{content-CShtLuhK.mjs → content-BfLBaJCZ.mjs} +108 -138
  100. package/admin-dist/server/_ssr/{content-types-PeyRyfbc.mjs → content-types-DZbF6O2q.mjs} +130 -119
  101. package/admin-dist/server/_ssr/{index-CplFXpGg.mjs → index-Cfe8sZv5.mjs} +65 -39
  102. package/admin-dist/server/_ssr/index.mjs +2 -2
  103. package/admin-dist/server/_ssr/{media-QAkNdX54.mjs → media-Bds2AnPC.mjs} +36 -56
  104. package/admin-dist/server/_ssr/{new._contentTypeId-DEJyMphJ.mjs → new._contentTypeId-DGvz_tlW.mjs} +10 -10
  105. package/admin-dist/server/_ssr/{router-CQXMuGMF.mjs → router-DxF7GBcO.mjs} +8804 -4995
  106. package/admin-dist/server/_ssr/{scroll-area-B7zoNyWB.mjs → scroll-area-DLDlXI07.mjs} +1 -1
  107. package/admin-dist/server/_ssr/{settings-CNaqVa4D.mjs → settings-BbaiS6z9.mjs} +13 -10
  108. package/admin-dist/server/_ssr/{switch-BKZhvryc.mjs → switch-Bl89Pfxu.mjs} +1 -1
  109. package/admin-dist/server/_ssr/{tabs-DtIIQxiD.mjs → tabs-QkbR0iir.mjs} +3 -3
  110. package/admin-dist/server/_ssr/{tanstack-adapter-CLavdbUY.mjs → tanstack-adapter-CKknPtcU.mjs} +19 -1
  111. package/admin-dist/server/_ssr/{taxonomies-vIZYICzr.mjs → taxonomies-S_Ontd0z.mjs} +9 -9
  112. package/admin-dist/server/_ssr/{trash-7yGR4-dF.mjs → trash-BzAIsbbN.mjs} +109 -132
  113. package/admin-dist/server/_ssr/{useBreadcrumbLabel-DR5FaAMf.mjs → useBreadcrumbLabel-BjiR1fM_.mjs} +1 -1
  114. package/admin-dist/server/_ssr/{usePermissions-DKkpETj_.mjs → usePermissions-CDHN95Nz.mjs} +1 -1
  115. package/admin-dist/server/index.mjs +284 -165
  116. package/package.json +3 -2
  117. package/admin/src/styles/globals.css +0 -104
  118. package/admin/src/styles/tailwind-config.css +0 -99
  119. package/admin/src/styles/theme.css +0 -261
  120. package/admin-dist/public/assets/CmsToolbar-CY6GV2L8.js +0 -1
  121. package/admin-dist/public/assets/ContentEntryEditor-CRgcRkk5.js +0 -4
  122. package/admin-dist/public/assets/TaxonomyFilter-Ohv5Jg9c.js +0 -1
  123. package/admin-dist/public/assets/_contentTypeId-C_vJq22X.js +0 -1
  124. package/admin-dist/public/assets/content-pKaIL2ru.js +0 -1
  125. package/admin-dist/public/assets/content-types-Bl_8I1Re.js +0 -1
  126. package/admin-dist/public/assets/globals-CoCRjt0K.css +0 -1
  127. package/admin-dist/public/assets/index-CtHq_P5q.js +0 -1
  128. package/admin-dist/public/assets/main-CA-4LyFT.js +0 -107
  129. package/admin-dist/public/assets/media-Bl1tBbJQ.js +0 -1
  130. package/admin-dist/public/assets/refresh-cw-sdVUGJNs.js +0 -1
  131. package/admin-dist/public/assets/rotate-ccw-6OcXCcxb.js +0 -1
  132. package/admin-dist/public/assets/settings-D8crrFCn.js +0 -1
  133. package/admin-dist/public/assets/tanstack-adapter-BRt2CUCw.js +0 -1
  134. package/admin-dist/public/assets/trash-YyYaC3L9.js +0 -1
  135. package/admin-dist/server/_ssr/CmsToolbar-NB014hsd.mjs +0 -48
  136. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-DndoqCo7.mjs +0 -4
@@ -36,9 +36,7 @@ function pathToRoute(path: string): EmbedRoute {
36
36
  export function EmbedSidebar() {
37
37
  const { currentPath, navigate, navigateToContentType } = useEmbedNavigation();
38
38
  const config = useAdminConfig();
39
- const { navItems, branding,
40
- // layout
41
- } = config;
39
+ const { navItems, branding, layout } = config;
42
40
  const api = useApi();
43
41
 
44
42
  const [isCreateModalOpen, setIsCreateModalOpen] = useState(false);
@@ -79,7 +77,7 @@ export function EmbedSidebar() {
79
77
  type="button"
80
78
  onClick={() => handleNavClick(item)}
81
79
  className={cn(
82
- "flex w-full items-center gap-3 rounded-md px-2 py-2 text-left text-sm font-medium transition-colors",
80
+ "flex w-full hover:cursor-pointer items-center gap-3 rounded-md px-2 py-2 text-left text-sm font-medium transition-colors",
83
81
  isActive(item.path, item.exact)
84
82
  ? "bg-sidebar-accent text-sidebar-accent-foreground"
85
83
  : "text-sidebar-foreground hover:bg-sidebar-accent/50 hover:text-sidebar-accent-foreground"
@@ -100,7 +98,7 @@ export function EmbedSidebar() {
100
98
  <Collapsible key={item.id} defaultOpen={isContentActive}>
101
99
  <CollapsibleTrigger
102
100
  className={cn(
103
- "flex w-full items-center gap-3 rounded-md px-2 py-2 text-sm font-medium transition-colors",
101
+ "flex w-full hover:cursor-pointer items-center gap-3 rounded-md px-2 py-2 text-sm font-medium transition-colors",
104
102
  isContentActive
105
103
  ? "bg-sidebar-accent text-sidebar-accent-foreground"
106
104
  : "text-sidebar-foreground hover:bg-sidebar-accent/50 hover:text-sidebar-accent-foreground",
@@ -117,7 +115,7 @@ export function EmbedSidebar() {
117
115
  type="button"
118
116
  onClick={() => navigate("content")}
119
117
  className={cn(
120
- "flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm transition-colors",
118
+ "flex w-full hover:cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm transition-colors",
121
119
  normalizedPath === "/content"
122
120
  ? "bg-sidebar-accent/60 text-sidebar-accent-foreground"
123
121
  : "text-sidebar-foreground/80 hover:bg-sidebar-accent/30 hover:text-sidebar-accent-foreground"
@@ -131,7 +129,7 @@ export function EmbedSidebar() {
131
129
  type="button"
132
130
  onClick={() => navigateToContentType(type._id)}
133
131
  className={cn(
134
- "flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm transition-colors",
132
+ "flex w-full hover:cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm transition-colors",
135
133
  normalizedPath === `/entries/type/${type._id}`
136
134
  ? "bg-sidebar-accent/60 text-sidebar-accent-foreground"
137
135
  : "text-sidebar-foreground/80 hover:bg-sidebar-accent/30 hover:text-sidebar-accent-foreground"
@@ -154,19 +152,24 @@ export function EmbedSidebar() {
154
152
  </Collapsible>
155
153
  );
156
154
 
155
+ const sidebarWidth = layout.sidebarWidth;
156
+
157
157
  return (
158
158
  <>
159
- <aside className="sticky top-0 z-40 flex h-full flex-col overflow-hidden border-r border-sidebar-border bg-sidebar">
160
- <div className="flex h-14 items-center gap-2 border-b border-sidebar-border px-4">
159
+ <aside
160
+ className="fixed inset-y-0 left-0 z-50 flex flex-col border-r bg-sidebar"
161
+ style={{ width: sidebarWidth }}
162
+ >
163
+ <div className="flex h-14 items-center gap-2 px-4">
161
164
  <button
162
165
  type="button"
163
166
  onClick={() => navigate("dashboard")}
164
167
  className="flex items-center gap-2 font-semibold text-sidebar-foreground"
165
168
  >
166
169
  {branding.logo ? (
167
- <img src={branding.logo} alt={branding.appName} className="size-8" />
170
+ <img src={branding.logo} alt={branding.appName} className="size-8 bg-primary" />
168
171
  ) : (
169
- <div className="flex size-8 items-center justify-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground">
172
+ <div className="flex size-8 items-center justify-center rounded-lg bg-primary text-sidebar-primary-foreground">
170
173
  <Layers className="size-4" />
171
174
  </div>
172
175
  )}
@@ -194,10 +197,10 @@ export function EmbedSidebar() {
194
197
  )}
195
198
  </nav>
196
199
 
197
- <div className="border-t border-sidebar-border p-4">
200
+ <div className="p-4">
198
201
  <div className="flex items-center justify-between text-xs text-sidebar-foreground/60">
199
202
  <span>Version</span>
200
- <span className="font-mono">0.1.0</span>
203
+ <span className="font-mono">0.0.11</span>
201
204
  </div>
202
205
  </div>
203
206
  </aside>
@@ -7,7 +7,7 @@
7
7
  */
8
8
 
9
9
  import { createContext, useContext, type ReactNode } from "react";
10
- import type { BaseAdminAPI } from "convex-cms";
10
+ import type { BaseAdminAPI } from "~/lib/cmsExports";
11
11
 
12
12
  // CmsAdminApi accepts BaseAdminAPI with optional namespaced exports.
13
13
  // This allows the API to work with Convex's FilterApi which removes
@@ -36,6 +36,7 @@
36
36
 
37
37
  import { useConvex } from "convex/react";
38
38
  import { useMemo } from "react";
39
+ import { cn } from "../lib/cn";
39
40
  import { SettingsConfigProvider } from "../contexts/SettingsConfigContext";
40
41
  import {
41
42
  AuthProvider,
@@ -46,7 +47,6 @@ import {
46
47
  import { ThemeProvider } from "../contexts/ThemeContext";
47
48
  import { RouteGuard } from "../components/RouteGuard";
48
49
  import { resolveAdminConfig } from "../lib/admin-config";
49
- import { cn } from "../lib/cn";
50
50
  import type { CmsAdminProps, CmsAdminAuthConfig } from "./types";
51
51
  import { ApiProvider } from "./contexts/ApiContext";
52
52
  import {
@@ -129,6 +129,7 @@ export function CmsAdmin({
129
129
  basePath = "/admin",
130
130
  className,
131
131
  themeMode = "isolated",
132
+ darkModeControl = "independent",
132
133
  initialRoute = "dashboard",
133
134
  onNavigate,
134
135
  }: CmsAdminProps & {
@@ -165,7 +166,7 @@ export function CmsAdmin({
165
166
  return (
166
167
  <div className={cn("h-full", className)} data-cms-admin={themeMode}>
167
168
  <ApiProvider api={api}>
168
- <ThemeProvider>
169
+ <ThemeProvider themeMode={themeMode} darkModeControl={darkModeControl}>
169
170
  <SettingsConfigProvider baseConfig={adminConfig} api={settingsApi}>
170
171
  <AuthProvider
171
172
  getUser={authConfig.getUser}
@@ -26,4 +26,10 @@ export interface CmsAdminProps {
26
26
  * - 'inherit': Admin inherits parent app's CSS variables (for shadcn apps)
27
27
  */
28
28
  themeMode?: "isolated" | "inherit";
29
+ /**
30
+ * Dark mode control behavior:
31
+ * - 'independent' (default): Admin has its own dark mode toggle
32
+ * - 'follow-parent': Admin follows parent app's dark mode (hides toggle in inherit mode)
33
+ */
34
+ darkModeControl?: "independent" | "follow-parent";
29
35
  }
@@ -30,7 +30,7 @@ import {
30
30
  type Action,
31
31
  type OwnershipScope,
32
32
  type Permission,
33
- } from 'convex-cms';
33
+ } from '../../../src/component/index';
34
34
 
35
35
  // =============================================================================
36
36
  // Types
@@ -0,0 +1,432 @@
1
+ @import "tailwindcss";
2
+ @import "tw-animate-css";
3
+ @import "@fontsource-variable/inter";
4
+ @import "@fontsource/jetbrains-mono";
5
+
6
+ @custom-variant dark (&:is(.dark *));
7
+
8
+ :root {
9
+ --background: oklch(0.985 0 0);
10
+ --foreground: oklch(0.19 0 286.2);
11
+ --card: oklch(1 0 0);
12
+ --card-foreground: oklch(0.2 0 286.04);
13
+ --popover: oklch(1 0 0);
14
+ --popover-foreground: oklch(0.145 0.005 285);
15
+ --primary: oklch(0.21 0.01 285.89);
16
+ --primary-foreground: oklch(0.985 0 0);
17
+ --secondary: oklch(0.967 0.001 285);
18
+ --secondary-foreground: oklch(0.24 0 286.25);
19
+ --muted: oklch(0.967 0.001 285);
20
+ --muted-foreground: oklch(0.556 0.01 285);
21
+ --accent: oklch(0.967 0.001 285);
22
+ --accent-foreground: oklch(0.205 0.006 285);
23
+ --destructive: oklch(0.637 0.237 25);
24
+ --destructive-foreground: oklch(0.985 0 0);
25
+ --border: oklch(0.928 0.002 285);
26
+ --input: oklch(0.928 0.002 285);
27
+ --ring: oklch(0.205 0.006 285);
28
+
29
+ --sidebar: oklch(0.985 0 0);
30
+ --sidebar-foreground: oklch(0.371 0.01 285);
31
+ --sidebar-primary: oklch(0.205 0.006 285);
32
+ --sidebar-primary-foreground: oklch(0.985 0 0);
33
+ --sidebar-accent: oklch(0.967 0.001 285);
34
+ --sidebar-accent-foreground: oklch(0.205 0.006 285);
35
+ --sidebar-border: oklch(0.937 0.003 253);
36
+ --sidebar-ring: oklch(0.623 0.214 255);
37
+
38
+ --success: oklch(0.527 0.154 152);
39
+ --success-foreground: oklch(1 0 0);
40
+ --warning: oklch(0.769 0.188 70);
41
+ --warning-foreground: oklch(0 0 0);
42
+ --info: oklch(0.623 0.214 255);
43
+ --info-bg: oklch(0.965 0.03 255);
44
+ --info-foreground: oklch(0.5 0.17 255);
45
+
46
+ --diff-added: oklch(0.527 0.154 152);
47
+ --diff-added-bg: oklch(0.965 0.03 152);
48
+ --diff-added-border: oklch(0.85 0.1 152);
49
+ --diff-added-foreground: oklch(0.45 0.13 152);
50
+ --diff-removed: oklch(0.637 0.237 25);
51
+ --diff-removed-bg: oklch(0.965 0.03 25);
52
+ --diff-removed-border: oklch(0.88 0.09 25);
53
+ --diff-removed-foreground: oklch(0.53 0.18 25);
54
+ --diff-modified: oklch(0.769 0.188 70);
55
+ --diff-modified-bg: oklch(0.965 0.03 70);
56
+ --diff-modified-border: oklch(0.88 0.1 70);
57
+ --diff-modified-foreground: oklch(0.53 0.15 70);
58
+
59
+ --purple: oklch(0.628 0.2 303);
60
+ --purple-bg: oklch(0.965 0.03 303);
61
+ --purple-foreground: oklch(0.45 0.13 303);
62
+
63
+ --chart-1: oklch(0.646 0.17 31);
64
+ --chart-2: oklch(0.52 0.105 180);
65
+ --chart-3: oklch(0.37 0.06 230);
66
+ --chart-4: oklch(0.77 0.13 85);
67
+ --chart-5: oklch(0.72 0.17 55);
68
+
69
+ --radius: 0.5rem;
70
+ }
71
+
72
+ .dark {
73
+ --background: oklch(0.145 0.005 285);
74
+ --foreground: oklch(0.985 0 0);
75
+ --card: oklch(0.18 0.005 285);
76
+ --card-foreground: oklch(0.985 0 0);
77
+ --popover: oklch(0.18 0.005 285);
78
+ --popover-foreground: oklch(0.985 0 0);
79
+ --primary: oklch(0.985 0 0);
80
+ --primary-foreground: oklch(0.205 0.006 285);
81
+ --secondary: oklch(0.25 0.006 285);
82
+ --secondary-foreground: oklch(0.985 0 0);
83
+ --muted: oklch(0.25 0.006 285);
84
+ --muted-foreground: oklch(0.715 0.008 285);
85
+ --accent: oklch(0.25 0.006 285);
86
+ --accent-foreground: oklch(0.985 0 0);
87
+ --destructive: oklch(0.59 0.2 25);
88
+ --destructive-foreground: oklch(0.985 0 0);
89
+ --border: oklch(0.3 0.006 285);
90
+ --input: oklch(0.3 0.006 285);
91
+ --ring: oklch(0.87 0.005 285);
92
+
93
+ --sidebar: oklch(0.205 0.006 285);
94
+ --sidebar-foreground: oklch(0.967 0.001 285);
95
+ --sidebar-primary: oklch(0.55 0.2 255);
96
+ --sidebar-primary-foreground: oklch(1 0 0);
97
+ --sidebar-accent: oklch(0.25 0.006 285);
98
+ --sidebar-accent-foreground: oklch(0.967 0.001 285);
99
+ --sidebar-border: oklch(0.25 0.006 285);
100
+ --sidebar-ring: oklch(0.623 0.214 255);
101
+
102
+ --success: oklch(0.58 0.15 152);
103
+ --success-foreground: oklch(1 0 0);
104
+ --warning: oklch(0.769 0.188 70);
105
+ --warning-foreground: oklch(0 0 0);
106
+ --info: oklch(0.68 0.19 255);
107
+ --info-bg: oklch(0.3 0.08 255);
108
+ --info-foreground: oklch(0.85 0.1 255);
109
+
110
+ --diff-added: oklch(0.58 0.15 152);
111
+ --diff-added-bg: oklch(0.25 0.08 152);
112
+ --diff-added-border: oklch(0.4 0.1 152);
113
+ --diff-added-foreground: oklch(0.75 0.12 152);
114
+ --diff-removed: oklch(0.62 0.18 25);
115
+ --diff-removed-bg: oklch(0.25 0.08 25);
116
+ --diff-removed-border: oklch(0.4 0.1 25);
117
+ --diff-removed-foreground: oklch(0.75 0.12 25);
118
+ --diff-modified: oklch(0.65 0.16 70);
119
+ --diff-modified-bg: oklch(0.25 0.08 70);
120
+ --diff-modified-border: oklch(0.4 0.1 70);
121
+ --diff-modified-foreground: oklch(0.75 0.12 70);
122
+
123
+ --purple: oklch(0.68 0.18 303);
124
+ --purple-bg: oklch(0.3 0.08 303);
125
+ --purple-foreground: oklch(0.85 0.1 303);
126
+
127
+ --chart-1: oklch(0.646 0.17 31);
128
+ --chart-2: oklch(0.52 0.105 180);
129
+ --chart-3: oklch(0.55 0.08 230);
130
+ --chart-4: oklch(0.77 0.13 85);
131
+ --chart-5: oklch(0.72 0.17 55);
132
+ }
133
+
134
+ [data-cms-admin="isolated"] {
135
+ --background: oklch(0.985 0 0);
136
+ --foreground: oklch(0.145 0.005 285);
137
+ --card: oklch(1 0 0);
138
+ --card-foreground: oklch(0.145 0.005 285);
139
+ --popover: oklch(1 0 0);
140
+ --popover-foreground: oklch(0.145 0.005 285);
141
+ --primary: oklch(0.205 0.006 285);
142
+ --primary-foreground: oklch(0.985 0 0);
143
+ --secondary: oklch(0.967 0.001 285);
144
+ --secondary-foreground: oklch(0.205 0.006 285);
145
+ --muted: oklch(0.967 0.001 285);
146
+ --muted-foreground: oklch(0.556 0.01 285);
147
+ --accent: oklch(0.967 0.001 285);
148
+ --accent-foreground: oklch(0.205 0.006 285);
149
+ --destructive: oklch(0.637 0.237 25);
150
+ --destructive-foreground: oklch(0.985 0 0);
151
+ --border: oklch(0.928 0.002 285);
152
+ --input: oklch(0.928 0.002 285);
153
+ --ring: oklch(0.205 0.006 285);
154
+
155
+ --sidebar: oklch(0.985 0 0);
156
+ --sidebar-foreground: oklch(0.371 0.01 285);
157
+ --sidebar-primary: oklch(0.205 0.006 285);
158
+ --sidebar-primary-foreground: oklch(0.985 0 0);
159
+ --sidebar-accent: oklch(0.967 0.001 285);
160
+ --sidebar-accent-foreground: oklch(0.205 0.006 285);
161
+ --sidebar-border: oklch(0.937 0.003 253);
162
+ --sidebar-ring: oklch(0.623 0.214 255);
163
+
164
+ --success: oklch(0.527 0.154 152);
165
+ --success-foreground: oklch(1 0 0);
166
+ --warning: oklch(0.769 0.188 70);
167
+ --warning-foreground: oklch(0 0 0);
168
+ --info: oklch(0.623 0.214 255);
169
+ --info-bg: oklch(0.965 0.03 255);
170
+ --info-foreground: oklch(0.5 0.17 255);
171
+
172
+ --diff-added: oklch(0.527 0.154 152);
173
+ --diff-added-bg: oklch(0.965 0.03 152);
174
+ --diff-added-border: oklch(0.85 0.1 152);
175
+ --diff-added-foreground: oklch(0.45 0.13 152);
176
+ --diff-removed: oklch(0.637 0.237 25);
177
+ --diff-removed-bg: oklch(0.965 0.03 25);
178
+ --diff-removed-border: oklch(0.88 0.09 25);
179
+ --diff-removed-foreground: oklch(0.53 0.18 25);
180
+ --diff-modified: oklch(0.769 0.188 70);
181
+ --diff-modified-bg: oklch(0.965 0.03 70);
182
+ --diff-modified-border: oklch(0.88 0.1 70);
183
+ --diff-modified-foreground: oklch(0.53 0.15 70);
184
+
185
+ --purple: oklch(0.628 0.2 303);
186
+ --purple-bg: oklch(0.965 0.03 303);
187
+ --purple-foreground: oklch(0.45 0.13 303);
188
+
189
+ --chart-1: oklch(0.646 0.17 31);
190
+ --chart-2: oklch(0.52 0.105 180);
191
+ --chart-3: oklch(0.37 0.06 230);
192
+ --chart-4: oklch(0.77 0.13 85);
193
+ --chart-5: oklch(0.72 0.17 55);
194
+
195
+ --radius: 0.5rem;
196
+ }
197
+
198
+ [data-cms-admin="isolated"].dark,
199
+ [data-cms-admin="isolated"] .dark {
200
+ --background: oklch(0.145 0.005 285);
201
+ --foreground: oklch(0.985 0 0);
202
+ --card: oklch(0.18 0.005 285);
203
+ --card-foreground: oklch(0.985 0 0);
204
+ --popover: oklch(0.18 0.005 285);
205
+ --popover-foreground: oklch(0.985 0 0);
206
+ --primary: oklch(0.985 0 0);
207
+ --primary-foreground: oklch(0.205 0.006 285);
208
+ --secondary: oklch(0.25 0.006 285);
209
+ --secondary-foreground: oklch(0.985 0 0);
210
+ --muted: oklch(0.25 0.006 285);
211
+ --muted-foreground: oklch(0.715 0.008 285);
212
+ --accent: oklch(0.25 0.006 285);
213
+ --accent-foreground: oklch(0.985 0 0);
214
+ --destructive: oklch(0.59 0.2 25);
215
+ --destructive-foreground: oklch(0.985 0 0);
216
+ --border: oklch(0.3 0.006 285);
217
+ --input: oklch(0.3 0.006 285);
218
+ --ring: oklch(0.87 0.005 285);
219
+
220
+ --sidebar: oklch(0.205 0.006 285);
221
+ --sidebar-foreground: oklch(0.967 0.001 285);
222
+ --sidebar-primary: oklch(0.55 0.2 255);
223
+ --sidebar-primary-foreground: oklch(1 0 0);
224
+ --sidebar-accent: oklch(0.25 0.006 285);
225
+ --sidebar-accent-foreground: oklch(0.967 0.001 285);
226
+ --sidebar-border: oklch(0.25 0.006 285);
227
+ --sidebar-ring: oklch(0.623 0.214 255);
228
+
229
+ --success: oklch(0.58 0.15 152);
230
+ --success-foreground: oklch(1 0 0);
231
+ --warning: oklch(0.769 0.188 70);
232
+ --warning-foreground: oklch(0 0 0);
233
+ --info: oklch(0.68 0.19 255);
234
+ --info-bg: oklch(0.3 0.08 255);
235
+ --info-foreground: oklch(0.85 0.1 255);
236
+
237
+ --diff-added: oklch(0.58 0.15 152);
238
+ --diff-added-bg: oklch(0.25 0.08 152);
239
+ --diff-added-border: oklch(0.4 0.1 152);
240
+ --diff-added-foreground: oklch(0.75 0.12 152);
241
+ --diff-removed: oklch(0.62 0.18 25);
242
+ --diff-removed-bg: oklch(0.25 0.08 25);
243
+ --diff-removed-border: oklch(0.4 0.1 25);
244
+ --diff-removed-foreground: oklch(0.75 0.12 25);
245
+ --diff-modified: oklch(0.65 0.16 70);
246
+ --diff-modified-bg: oklch(0.25 0.08 70);
247
+ --diff-modified-border: oklch(0.4 0.1 70);
248
+ --diff-modified-foreground: oklch(0.75 0.12 70);
249
+
250
+ --purple: oklch(0.68 0.18 303);
251
+ --purple-bg: oklch(0.3 0.08 303);
252
+ --purple-foreground: oklch(0.85 0.1 303);
253
+
254
+ --chart-1: oklch(0.646 0.17 31);
255
+ --chart-2: oklch(0.52 0.105 180);
256
+ --chart-3: oklch(0.55 0.08 230);
257
+ --chart-4: oklch(0.77 0.13 85);
258
+ --chart-5: oklch(0.72 0.17 55);
259
+ }
260
+
261
+ /* Inherit mode: CSS variables cascade naturally from parent app's :root.
262
+ No definitions needed here - the parent app's variables take precedence. */
263
+
264
+ @theme {
265
+ --font-sans: "Inter Variable", ui-sans-serif, system-ui, sans-serif;
266
+ --font-mono: "JetBrains Mono", ui-monospace, monospace;
267
+
268
+ --sidebar-width: 16rem;
269
+ --sidebar-width-icon: 3rem;
270
+
271
+ --animate-accordion-down: accordion-down 0.2s ease-out;
272
+ --animate-accordion-up: accordion-up 0.2s ease-out;
273
+
274
+ @keyframes accordion-down {
275
+ from {
276
+ height: 0;
277
+ }
278
+ to {
279
+ height: var(--radix-accordion-content-height);
280
+ }
281
+ }
282
+
283
+ @keyframes accordion-up {
284
+ from {
285
+ height: var(--radix-accordion-content-height);
286
+ }
287
+ to {
288
+ height: 0;
289
+ }
290
+ }
291
+ }
292
+
293
+ @theme inline {
294
+ --color-background: var(--background);
295
+ --color-foreground: var(--foreground);
296
+ --color-card: var(--card);
297
+ --color-card-foreground: var(--card-foreground);
298
+ --color-popover: var(--popover);
299
+ --color-popover-foreground: var(--popover-foreground);
300
+ --color-primary: var(--primary);
301
+ --color-primary-foreground: var(--primary-foreground);
302
+ --color-secondary: var(--secondary);
303
+ --color-secondary-foreground: var(--secondary-foreground);
304
+ --color-muted: var(--muted);
305
+ --color-muted-foreground: var(--muted-foreground);
306
+ --color-accent: var(--accent);
307
+ --color-accent-foreground: var(--accent-foreground);
308
+ --color-destructive: var(--destructive);
309
+ --color-destructive-foreground: var(--destructive-foreground);
310
+ --color-border: var(--border);
311
+ --color-input: var(--input);
312
+ --color-ring: var(--ring);
313
+
314
+ --color-sidebar: var(--sidebar);
315
+ --color-sidebar-foreground: var(--sidebar-foreground);
316
+ --color-sidebar-primary: var(--sidebar-primary);
317
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
318
+ --color-sidebar-accent: var(--sidebar-accent);
319
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
320
+ --color-sidebar-border: var(--sidebar-border);
321
+ --color-sidebar-ring: var(--sidebar-ring);
322
+
323
+ --color-diff-added: var(--diff-added);
324
+ --color-diff-added-bg: var(--diff-added-bg);
325
+ --color-diff-added-border: var(--diff-added-border);
326
+ --color-diff-added-foreground: var(--diff-added-foreground);
327
+ --color-diff-removed: var(--diff-removed);
328
+ --color-diff-removed-bg: var(--diff-removed-bg);
329
+ --color-diff-removed-border: var(--diff-removed-border);
330
+ --color-diff-removed-foreground: var(--diff-removed-foreground);
331
+ --color-diff-modified: var(--diff-modified);
332
+ --color-diff-modified-bg: var(--diff-modified-bg);
333
+ --color-diff-modified-border: var(--diff-modified-border);
334
+ --color-diff-modified-foreground: var(--diff-modified-foreground);
335
+
336
+ --color-success: var(--success);
337
+ --color-success-foreground: var(--success-foreground);
338
+ --color-warning: var(--warning);
339
+ --color-warning-foreground: var(--warning-foreground);
340
+ --color-info: var(--info);
341
+ --color-info-bg: var(--info-bg);
342
+ --color-info-foreground: var(--info-foreground);
343
+
344
+ --color-purple: var(--purple);
345
+ --color-purple-bg: var(--purple-bg);
346
+ --color-purple-foreground: var(--purple-foreground);
347
+
348
+ --color-chart-1: var(--chart-1);
349
+ --color-chart-2: var(--chart-2);
350
+ --color-chart-3: var(--chart-3);
351
+ --color-chart-4: var(--chart-4);
352
+ --color-chart-5: var(--chart-5);
353
+
354
+ --radius-sm: calc(var(--radius) - 4px);
355
+ --radius-md: calc(var(--radius) - 2px);
356
+ --radius-lg: var(--radius);
357
+ --radius-xl: calc(var(--radius) + 4px);
358
+ --radius-2xl: calc(var(--radius) + 8px);
359
+ }
360
+
361
+ @layer base {
362
+ * {
363
+ @apply border-border outline-ring/50;
364
+ }
365
+
366
+ body {
367
+ @apply bg-background text-foreground;
368
+ font-feature-settings: "rlig" 1, "calt" 1;
369
+ -webkit-font-smoothing: antialiased;
370
+ -moz-osx-font-smoothing: grayscale;
371
+ }
372
+
373
+ button:not([disabled]),
374
+ [role="button"]:not([disabled]) {
375
+ cursor: pointer;
376
+ }
377
+
378
+ [data-cms-admin] {
379
+ @apply bg-background text-foreground;
380
+ font-feature-settings: "rlig" 1, "calt" 1;
381
+ -webkit-font-smoothing: antialiased;
382
+ -moz-osx-font-smoothing: grayscale;
383
+ }
384
+ }
385
+
386
+ @layer utilities {
387
+ .status-draft {
388
+ background-color: var(--muted);
389
+ color: var(--muted-foreground);
390
+ }
391
+
392
+ .status-published {
393
+ background-color: var(--diff-added-bg);
394
+ color: var(--diff-added-foreground);
395
+ }
396
+
397
+ .status-scheduled {
398
+ background-color: var(--info-bg);
399
+ color: var(--info-foreground);
400
+ }
401
+
402
+ .status-archived {
403
+ background-color: var(--diff-modified-bg);
404
+ color: var(--diff-modified-foreground);
405
+ }
406
+
407
+ .surface-base {
408
+ @apply bg-card border border-border;
409
+ }
410
+
411
+ .surface-elevated {
412
+ @apply bg-card border border-border shadow-sm;
413
+ }
414
+
415
+ .surface-floating {
416
+ @apply bg-popover border border-border shadow-lg;
417
+ }
418
+
419
+ .focus-ring {
420
+ @apply focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2;
421
+ }
422
+
423
+ .scrollbar-none {
424
+ overflow-y: auto;
425
+ scrollbar-width: none;
426
+ -ms-overflow-style: none;
427
+ }
428
+
429
+ .scrollbar-none::-webkit-scrollbar {
430
+ display: none;
431
+ }
432
+ }
@@ -0,0 +1,6 @@
1
+ // Re-export CMS utilities that admin components need
2
+ // Using relative imports to avoid circular dependency with convex-cms package
3
+ export { getRole, getRolePermissions } from '../../../src/client/index';
4
+ export type { RoleName, BaseAdminAPI } from '../../../src/client/index';
5
+ export { useMediaUploadQueue } from '../../../src/react/index';
6
+ export type { UploadQueueFile, UploadQueueFileStatus } from '../../../src/react/index';