convex-cms 0.0.9-alpha.9 → 0.0.11-alpha.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.
Files changed (144) hide show
  1. package/README.md +25 -5
  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/ui/sidebar.tsx +1 -1
  6. package/admin/src/contexts/AuthContext.tsx +1 -1
  7. package/admin/src/embed/components/EmbedSidebar.tsx +10 -10
  8. package/admin/src/embed/contexts/ApiContext.tsx +1 -1
  9. package/admin/src/hooks/usePermissions.ts +1 -1
  10. package/admin/src/index.css +432 -0
  11. package/admin/src/lib/cmsExports.ts +6 -0
  12. package/admin/src/pages/DashboardPage.tsx +2 -3
  13. package/admin/src/routes/__root.tsx +1 -1
  14. package/admin-dist/nitro.json +1 -1
  15. package/admin-dist/public/assets/{CmsEmptyState-DTlpzjOI.js → CmsEmptyState-BKeL4DBB.js} +1 -1
  16. package/admin-dist/public/assets/CmsFilterBar-CEpMHd_c.js +1 -0
  17. package/admin-dist/public/assets/{CmsPageHeader-0REGRH4X.js → CmsPageHeader-CIEkTbyH.js} +1 -1
  18. package/admin-dist/public/assets/{CmsStatusBadge-D_n8u8xa.js → CmsStatusBadge-BFMOsfMW.js} +1 -1
  19. package/admin-dist/public/assets/{CmsSurface-BHmvNai4.js → CmsSurface-kqqaFKUI.js} +1 -1
  20. package/admin-dist/public/assets/CmsTable-Db53Exq0.js +1 -0
  21. package/admin-dist/public/assets/ContentEntryEditor-Ct7cHayy.js +4 -0
  22. package/admin-dist/public/assets/TaxonomyFilter-Bm1DI1A7.js +1 -0
  23. package/admin-dist/public/assets/_contentTypeId-BekeCblX.js +1 -0
  24. package/admin-dist/public/assets/{_entryId-jPXz4z9T.js → _entryId-CoZDE0l0.js} +1 -1
  25. package/admin-dist/public/assets/{alert-CG97cMfC.js → alert-CpLdsTGU.js} +1 -1
  26. package/admin-dist/public/assets/{badge-C6qt24oj.js → badge-BQAotc5B.js} +1 -1
  27. package/admin-dist/public/assets/{circle-check-big-PltpxuB1.js → circle-check-big-BF3Y5nES.js} +1 -1
  28. package/admin-dist/public/assets/{command-CJ8i86fd.js → command-lEq6f_Ee.js} +1 -1
  29. package/admin-dist/public/assets/content-DH6k0dN6.js +1 -0
  30. package/admin-dist/public/assets/content-types-DHr9tc2V.js +1 -0
  31. package/admin-dist/public/assets/index-Cf0lbl0G.js +1 -0
  32. package/admin-dist/public/assets/index-D-4wFfgU.css +1 -0
  33. package/admin-dist/public/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  34. package/admin-dist/public/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  35. package/admin-dist/public/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  36. package/admin-dist/public/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  37. package/admin-dist/public/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  38. package/admin-dist/public/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  39. package/admin-dist/public/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  40. package/admin-dist/public/assets/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2 +0 -0
  41. package/admin-dist/public/assets/jetbrains-mono-cyrillic-400-normal-ugxPyKxw.woff +0 -0
  42. package/admin-dist/public/assets/jetbrains-mono-greek-400-normal-B9oWc5Lo.woff +0 -0
  43. package/admin-dist/public/assets/jetbrains-mono-greek-400-normal-C190GLew.woff2 +0 -0
  44. package/admin-dist/public/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
  45. package/admin-dist/public/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
  46. package/admin-dist/public/assets/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2 +0 -0
  47. package/admin-dist/public/assets/jetbrains-mono-latin-ext-400-normal-fXTG6kC5.woff +0 -0
  48. package/admin-dist/public/assets/jetbrains-mono-vietnamese-400-normal-CqNFfHCs.woff +0 -0
  49. package/admin-dist/public/assets/main-B-6700eG.js +137 -0
  50. package/admin-dist/public/assets/media-DY5zD52L.js +1 -0
  51. package/admin-dist/public/assets/{new._contentTypeId-qsvo01mH.js → new._contentTypeId-Dq_NqTQV.js} +1 -1
  52. package/admin-dist/public/assets/{pencil-gAL0R34f.js → pencil-CI_KfxSx.js} +1 -1
  53. package/admin-dist/public/assets/refresh-cw-BrXg9a2r.js +1 -0
  54. package/admin-dist/public/assets/rotate-ccw-PwzxdPxd.js +1 -0
  55. package/admin-dist/public/assets/{scroll-area-CJBhf9pf.js → scroll-area-DX_nZYp8.js} +1 -1
  56. package/admin-dist/public/assets/{search-WXp6KxDJ.js → search-DlwBH4C5.js} +1 -1
  57. package/admin-dist/public/assets/settings-2mx3_ORG.js +1 -0
  58. package/admin-dist/public/assets/{switch-Ck9ecqEX.js → switch-CjPi4DKH.js} +1 -1
  59. package/admin-dist/public/assets/{tabs-vQYu8rjC.js → tabs-B5X37GEM.js} +1 -1
  60. package/admin-dist/public/assets/tanstack-adapter-KSm-nO5L.js +1 -0
  61. package/admin-dist/public/assets/{taxonomies-DvILUNvr.js → taxonomies-CHjJKNlR.js} +1 -1
  62. package/admin-dist/public/assets/trash-Cle-tcqq.js +1 -0
  63. package/admin-dist/public/assets/{useBreadcrumbLabel-tlSh7dtO.js → useBreadcrumbLabel-yZQG_N_3.js} +1 -1
  64. package/admin-dist/public/assets/{usePermissions-BTGdTOJS.js → usePermissions-D6vsoaJf.js} +1 -1
  65. package/admin-dist/server/_libs/convex-helpers.mjs +1077 -2
  66. package/admin-dist/server/_libs/convex.mjs +222 -13
  67. package/admin-dist/server/_libs/lucide-react.mjs +57 -51
  68. package/admin-dist/server/_ssr/{CmsEmptyState-CB6e53i5.mjs → CmsEmptyState-DzzuQG0S.mjs} +1 -1
  69. package/admin-dist/server/_ssr/CmsFilterBar-C5XADS12.mjs +81 -0
  70. package/admin-dist/server/_ssr/{CmsPageHeader-COUHuECp.mjs → CmsPageHeader-DZ6h7smh.mjs} +1 -1
  71. package/admin-dist/server/_ssr/{CmsStatusBadge-kMTL6koE.mjs → CmsStatusBadge-D-YFSAa1.mjs} +3 -3
  72. package/admin-dist/server/_ssr/{CmsSurface-D1HDYjRg.mjs → CmsSurface-Cv51NBLZ.mjs} +1 -1
  73. package/admin-dist/server/_ssr/CmsTable-DG88C5nO.mjs +189 -0
  74. package/admin-dist/server/_ssr/{ContentEntryEditor-Bq8FR_uK.mjs → ContentEntryEditor-CRjwXB17.mjs} +10 -10
  75. package/admin-dist/server/_ssr/{TaxonomyFilter-bm_p4ADg.mjs → TaxonomyFilter-xGwcgtjr.mjs} +3 -3
  76. package/admin-dist/server/_ssr/{_contentTypeId-B7obLmi_.mjs → _contentTypeId-DRCfeKkm.mjs} +53 -12
  77. package/admin-dist/server/_ssr/{_entryId-B4zhQqFg.mjs → _entryId-DULm2TDy.mjs} +11 -11
  78. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-iX3K33p1.mjs +4 -0
  79. package/admin-dist/server/_ssr/{badge-NOEC9bkk.mjs → badge-CbjIvhb6.mjs} +1 -1
  80. package/admin-dist/server/_ssr/{command-h4-OYNBo.mjs → command-xB2uiYps.mjs} +2 -2
  81. package/admin-dist/server/_ssr/{content-CShtLuhK.mjs → content-BfLBaJCZ.mjs} +108 -138
  82. package/admin-dist/server/_ssr/{content-types-PeyRyfbc.mjs → content-types-DZbF6O2q.mjs} +130 -119
  83. package/admin-dist/server/_ssr/{index-CplFXpGg.mjs → index-Cfe8sZv5.mjs} +65 -39
  84. package/admin-dist/server/_ssr/index.mjs +2 -2
  85. package/admin-dist/server/_ssr/{media-QAkNdX54.mjs → media-Bds2AnPC.mjs} +36 -56
  86. package/admin-dist/server/_ssr/{new._contentTypeId-DEJyMphJ.mjs → new._contentTypeId-DGvz_tlW.mjs} +10 -10
  87. package/admin-dist/server/_ssr/{router-CQXMuGMF.mjs → router-DxF7GBcO.mjs} +8804 -4995
  88. package/admin-dist/server/_ssr/{scroll-area-B7zoNyWB.mjs → scroll-area-DLDlXI07.mjs} +1 -1
  89. package/admin-dist/server/_ssr/{settings-CNaqVa4D.mjs → settings-BbaiS6z9.mjs} +13 -10
  90. package/admin-dist/server/_ssr/{switch-BKZhvryc.mjs → switch-Bl89Pfxu.mjs} +1 -1
  91. package/admin-dist/server/_ssr/{tabs-DtIIQxiD.mjs → tabs-QkbR0iir.mjs} +3 -3
  92. package/admin-dist/server/_ssr/{tanstack-adapter-CLavdbUY.mjs → tanstack-adapter-CKknPtcU.mjs} +19 -1
  93. package/admin-dist/server/_ssr/{taxonomies-vIZYICzr.mjs → taxonomies-S_Ontd0z.mjs} +9 -9
  94. package/admin-dist/server/_ssr/{trash-7yGR4-dF.mjs → trash-BzAIsbbN.mjs} +109 -132
  95. package/admin-dist/server/_ssr/{useBreadcrumbLabel-DR5FaAMf.mjs → useBreadcrumbLabel-BjiR1fM_.mjs} +1 -1
  96. package/admin-dist/server/_ssr/{usePermissions-DKkpETj_.mjs → usePermissions-CDHN95Nz.mjs} +1 -1
  97. package/admin-dist/server/index.mjs +284 -165
  98. package/dist/client/admin/contentTypes.d.ts +102 -0
  99. package/dist/client/admin/contentTypes.d.ts.map +1 -1
  100. package/dist/client/admin/index.d.ts +204 -0
  101. package/dist/client/admin/index.d.ts.map +1 -1
  102. package/dist/client/admin/media.d.ts.map +1 -1
  103. package/dist/client/admin/taxonomies.d.ts.map +1 -1
  104. package/dist/client/admin/trash.d.ts.map +1 -1
  105. package/dist/client/admin/validators.d.ts +570 -94
  106. package/dist/client/admin/validators.d.ts.map +1 -1
  107. package/dist/component/_generated/component.d.ts +102 -0
  108. package/dist/component/_generated/component.d.ts.map +1 -1
  109. package/dist/component/contentTypeMutations.d.ts +68 -0
  110. package/dist/component/contentTypeMutations.d.ts.map +1 -1
  111. package/dist/component/contentTypes.d.ts +34 -0
  112. package/dist/component/contentTypes.d.ts.map +1 -1
  113. package/dist/component/ragContentIndexer.d.ts +17 -0
  114. package/dist/component/ragContentIndexer.d.ts.map +1 -1
  115. package/dist/component/schema.d.ts +399 -76
  116. package/dist/component/schema.d.ts.map +1 -1
  117. package/dist/component/schema.js +17 -0
  118. package/dist/component/schema.js.map +1 -1
  119. package/dist/component/taxonomies.d.ts +5 -5
  120. package/dist/component/validators.d.ts +362 -56
  121. package/dist/component/validators.d.ts.map +1 -1
  122. package/dist/test.d.ts +122 -20
  123. package/dist/test.d.ts.map +1 -1
  124. package/package.json +3 -2
  125. package/admin/src/styles/globals.css +0 -82
  126. package/admin/src/styles/tailwind-config.css +0 -111
  127. package/admin/src/styles/theme.css +0 -384
  128. package/admin-dist/public/assets/CmsToolbar-CY6GV2L8.js +0 -1
  129. package/admin-dist/public/assets/ContentEntryEditor-CRgcRkk5.js +0 -4
  130. package/admin-dist/public/assets/TaxonomyFilter-Ohv5Jg9c.js +0 -1
  131. package/admin-dist/public/assets/_contentTypeId-C_vJq22X.js +0 -1
  132. package/admin-dist/public/assets/content-pKaIL2ru.js +0 -1
  133. package/admin-dist/public/assets/content-types-Bl_8I1Re.js +0 -1
  134. package/admin-dist/public/assets/globals-CoCRjt0K.css +0 -1
  135. package/admin-dist/public/assets/index-CtHq_P5q.js +0 -1
  136. package/admin-dist/public/assets/main-CA-4LyFT.js +0 -107
  137. package/admin-dist/public/assets/media-Bl1tBbJQ.js +0 -1
  138. package/admin-dist/public/assets/refresh-cw-sdVUGJNs.js +0 -1
  139. package/admin-dist/public/assets/rotate-ccw-6OcXCcxb.js +0 -1
  140. package/admin-dist/public/assets/settings-D8crrFCn.js +0 -1
  141. package/admin-dist/public/assets/tanstack-adapter-BRt2CUCw.js +0 -1
  142. package/admin-dist/public/assets/trash-YyYaC3L9.js +0 -1
  143. package/admin-dist/server/_ssr/CmsToolbar-NB014hsd.mjs +0 -48
  144. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-DndoqCo7.mjs +0 -4
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [![npm version](https://badge.fury.io/js/convex-cms.svg)](https://www.npmjs.com/package/convex-cms)
4
4
  [![License: Apache-2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
5
5
 
6
- > **Alpha (v0.0.8)** Actively developed. APIs may change. [Report issues](https://github.com/obkaro/convex-cms/issues).
6
+ > **Alpha (v0.0.10)** Actively developed. APIs & docs may change. [Report issues](https://github.com/obkaro/convex-cms/issues).
7
7
 
8
8
  A headless CMS built as a [Convex Component](https://docs.convex.dev/components). Content management that runs inside your Convex app.
9
9
 
@@ -11,6 +11,7 @@ A headless CMS built as a [Convex Component](https://docs.convex.dev/components)
11
11
 
12
12
  [Live Demo](https://convex-cms-example.vercel.app)
13
13
 
14
+
14
15
  ## Quick Start
15
16
 
16
17
  ### 1. Install
@@ -51,6 +52,8 @@ If you're building on Convex and need content management without the overhead of
51
52
  - **Data independence:** CMS that lives in your own convex deployment, extendable and customizable with your convex functions
52
53
  - **Agent-native content management:** Pre-built tools useful for AI agent integration with `@convex-dev/agent`
53
54
 
55
+
56
+
54
57
  ## Features
55
58
 
56
59
  | Feature | What it does |
@@ -62,6 +65,8 @@ If you're building on Convex and need content management without the overhead of
62
65
  | **CLI Admin UI** | Run for local development, content entry, and management |
63
66
  | **Embedded Admin UI** | Ship the admin interface as part of your React app |
64
67
 
68
+
69
+
65
70
  ## In Practice
66
71
 
67
72
  **Full control over the editorial experience?**
@@ -79,7 +84,8 @@ CMS Client + agent tools. Pre-built tools for AI-driven workflows.
79
84
  *Any combination of these features works together seamlessly. Pick what fits your workflow.*
80
85
 
81
86
 
82
- ## Batteries Included
87
+
88
+ ## Included Batteries
83
89
 
84
90
  Leverage included features or extend and customize within your own convex functions to your desire.
85
91
 
@@ -107,6 +113,9 @@ Leverage included features or extend and customize within your own convex functi
107
113
  - **Agent tools.** 23 pre-built tools with Zod schemas for AI integration
108
114
  - **Query builder.** Fluent API for complex content queries
109
115
 
116
+
117
+
118
+
110
119
  ### Admin UI
111
120
  - **Pre-built React interface.** CLI mode for development, embeddable for production
112
121
  - **Visual content editing.** Rich text, media picker, reference selector
@@ -137,8 +146,6 @@ When embedding CmsAdmin in your React app, you can control how it handles CSS va
137
146
  | `isolated` | Admin defines all CSS variables, ignoring parent app styles |
138
147
  | `inherit` | Admin inherits parent's shadcn variables, only defines sidebar fallbacks |
139
148
 
140
- **Critical for Tailwind 4 apps:** If Tailwind utility classes aren't applying to the embedded admin, add a `@source` directive to your app's CSS:
141
-
142
149
  ```css
143
150
  /* your-app/src/index.css */
144
151
  @import "tailwindcss";
@@ -147,6 +154,9 @@ When embedding CmsAdmin in your React app, you can control how it handles CSS va
147
154
 
148
155
  This tells Tailwind to scan the admin's compiled JavaScript for utility classes.
149
156
 
157
+
158
+
159
+
150
160
  ## Documentation
151
161
 
152
162
  | Guide | Description |
@@ -161,23 +171,33 @@ This tells Tailwind to scan the admin's compiled JavaScript for utility classes.
161
171
  | [Agent Tools](./docs/guides/agent-tools.md) | AI agent integration with Zod schemas |
162
172
  | [Integration Patterns](./docs/guides/integration-patterns.md) | Common setups and when to use each |
163
173
 
174
+
164
175
  | Reference | Description |
165
176
  |-----------|-------------|
166
177
  | [Client API](./docs/api/client-api.md) | createCmsClient methods |
167
- | [Admin API](./docs/api/admin-api.md) | 60+ defineAdminAPI functions |
178
+ | [Admin API](./docs/api/admin-api.md) | 100+ defineAdminAPI functions |
168
179
  | [Code-First Schema](./docs/api/code-first-schema.md) | TypeScript-first content types |
169
180
  | [Field Types](./docs/api/field-types.md) | All 13 field types |
170
181
  | [Configuration](./docs/api/configuration.md) | All config options |
171
182
 
183
+
184
+
185
+
172
186
  ## Requirements
173
187
 
174
188
  - Convex ^1.17.0
175
189
  - Node.js 18+
176
190
 
191
+
192
+
193
+
177
194
  ## License
178
195
 
179
196
  Apache-2.0
180
197
 
198
+
199
+
200
+
181
201
  ## Support
182
202
 
183
203
  - [GitHub Issues](https://github.com/obkaro/convex-cms/issues): Bug reports and feature requests
@@ -1,6 +1,6 @@
1
1
  import { useRouterState, useNavigate, Link } from '@tanstack/react-router'
2
2
  import { useAuth, useAdminConfig, useBreadcrumbContext } from '~/contexts'
3
- import { getRole } from 'convex-cms'
3
+ import { getRole } from '~/lib/cmsExports'
4
4
  import {
5
5
  Breadcrumb,
6
6
  BreadcrumbItem,
@@ -27,7 +27,7 @@
27
27
 
28
28
  import type { ReactNode } from 'react';
29
29
  import { useAuth, type PermissionCheck } from '../contexts/AuthContext';
30
- import type { RoleName } from 'convex-cms';
30
+ import type { RoleName } from '~/lib/cmsExports';
31
31
  import { Loader2 } from 'lucide-react';
32
32
 
33
33
  // =============================================================================
@@ -3,7 +3,7 @@ import {
3
3
  useMediaUploadQueue,
4
4
  type UploadQueueFile,
5
5
  type UploadQueueFileStatus,
6
- } from 'convex-cms/react'
6
+ } from '~/lib/cmsExports'
7
7
  import type { FunctionReference } from 'convex/server'
8
8
  import { CmsButton } from '~/components/cmsds/CmsButton'
9
9
  import { cn } from '~/lib/cn'
@@ -478,7 +478,7 @@ const sidebarMenuButtonVariants = cva(
478
478
  variant: {
479
479
  default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
480
480
  outline:
481
- "bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]",
481
+ "bg-background shadow-[0_0_0_1px_var(--sidebar-border)] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_var(--sidebar-accent)]",
482
482
  },
483
483
  size: {
484
484
  default: "h-8 text-sm",
@@ -39,7 +39,7 @@ import {
39
39
  type Resource,
40
40
  type Action,
41
41
  type OwnershipScope,
42
- } from 'convex-cms';
42
+ } from '../../../src/component/index';
43
43
 
44
44
  // =============================================================================
45
45
  // Types
@@ -77,7 +77,7 @@ export function EmbedSidebar() {
77
77
  type="button"
78
78
  onClick={() => handleNavClick(item)}
79
79
  className={cn(
80
- "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",
81
81
  isActive(item.path, item.exact)
82
82
  ? "bg-sidebar-accent text-sidebar-accent-foreground"
83
83
  : "text-sidebar-foreground hover:bg-sidebar-accent/50 hover:text-sidebar-accent-foreground"
@@ -98,7 +98,7 @@ export function EmbedSidebar() {
98
98
  <Collapsible key={item.id} defaultOpen={isContentActive}>
99
99
  <CollapsibleTrigger
100
100
  className={cn(
101
- "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",
102
102
  isContentActive
103
103
  ? "bg-sidebar-accent text-sidebar-accent-foreground"
104
104
  : "text-sidebar-foreground hover:bg-sidebar-accent/50 hover:text-sidebar-accent-foreground",
@@ -115,7 +115,7 @@ export function EmbedSidebar() {
115
115
  type="button"
116
116
  onClick={() => navigate("content")}
117
117
  className={cn(
118
- "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",
119
119
  normalizedPath === "/content"
120
120
  ? "bg-sidebar-accent/60 text-sidebar-accent-foreground"
121
121
  : "text-sidebar-foreground/80 hover:bg-sidebar-accent/30 hover:text-sidebar-accent-foreground"
@@ -129,7 +129,7 @@ export function EmbedSidebar() {
129
129
  type="button"
130
130
  onClick={() => navigateToContentType(type._id)}
131
131
  className={cn(
132
- "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",
133
133
  normalizedPath === `/entries/type/${type._id}`
134
134
  ? "bg-sidebar-accent/60 text-sidebar-accent-foreground"
135
135
  : "text-sidebar-foreground/80 hover:bg-sidebar-accent/30 hover:text-sidebar-accent-foreground"
@@ -157,19 +157,19 @@ export function EmbedSidebar() {
157
157
  return (
158
158
  <>
159
159
  <aside
160
- className="fixed inset-y-0 left-0 z-50 flex flex-col border-r border-sidebar-border bg-sidebar"
160
+ className="fixed inset-y-0 left-0 z-50 flex flex-col border-r bg-sidebar"
161
161
  style={{ width: sidebarWidth }}
162
162
  >
163
- <div className="flex h-14 items-center gap-2 border-b border-sidebar-border px-4">
163
+ <div className="flex h-14 items-center gap-2 px-4">
164
164
  <button
165
165
  type="button"
166
166
  onClick={() => navigate("dashboard")}
167
167
  className="flex items-center gap-2 font-semibold text-sidebar-foreground"
168
168
  >
169
169
  {branding.logo ? (
170
- <img src={branding.logo} alt={branding.appName} className="size-8" />
170
+ <img src={branding.logo} alt={branding.appName} className="size-8 bg-primary" />
171
171
  ) : (
172
- <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">
173
173
  <Layers className="size-4" />
174
174
  </div>
175
175
  )}
@@ -197,10 +197,10 @@ export function EmbedSidebar() {
197
197
  )}
198
198
  </nav>
199
199
 
200
- <div className="border-t border-sidebar-border p-4">
200
+ <div className="p-4">
201
201
  <div className="flex items-center justify-between text-xs text-sidebar-foreground/60">
202
202
  <span>Version</span>
203
- <span className="font-mono">0.1.0</span>
203
+ <span className="font-mono">0.0.11</span>
204
204
  </div>
205
205
  </div>
206
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
@@ -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';