convex-cms 0.0.3 → 0.0.5-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/README.md +109 -13
  2. package/admin-dist/nitro.json +1 -1
  3. package/admin-dist/public/assets/{CmsEmptyState-CRswfTzk.js → CmsEmptyState-CiMQwSQV.js} +2 -2
  4. package/admin-dist/public/assets/{CmsPageHeader-CirpXndm.js → CmsPageHeader-ohOq0luT.js} +1 -1
  5. package/admin-dist/public/assets/{CmsStatusBadge-CbEUpQu-.js → CmsStatusBadge-BdNf0V9v.js} +1 -1
  6. package/admin-dist/public/assets/CmsSurface-CWup6Jh7.js +1 -0
  7. package/admin-dist/public/assets/{CmsToolbar-BI2nZOXp.js → CmsToolbar-cEBlCHa3.js} +1 -1
  8. package/admin-dist/public/assets/{ContentEntryEditor-CBeCyK_m.js → ContentEntryEditor-BY5ypfUs.js} +1 -1
  9. package/admin-dist/public/assets/{ErrorState-BIVaWmom.js → ErrorState-C4nJ-ml4.js} +1 -1
  10. package/admin-dist/public/assets/{TaxonomyFilter-ChaY6Y_x.js → TaxonomyFilter-BgE_SR_O.js} +1 -1
  11. package/admin-dist/public/assets/{_contentTypeId-DQ8k_Rvw.js → _contentTypeId-DtZectcC.js} +1 -1
  12. package/admin-dist/public/assets/{_entryId-CKU_glsK.js → _entryId-BpSmrfAm.js} +1 -1
  13. package/admin-dist/public/assets/alert-Bf2l8kxw.js +1 -0
  14. package/admin-dist/public/assets/{badge-hvUOzpVZ.js → badge-qPrc4AUM.js} +1 -1
  15. package/admin-dist/public/assets/{circle-check-big-CF_pR17r.js → circle-check-big-Dgozy3vV.js} +1 -1
  16. package/admin-dist/public/assets/{command-DU82cJlt.js → command-QOmNhlb0.js} +1 -1
  17. package/admin-dist/public/assets/content-OEBGlxg1.js +1 -0
  18. package/admin-dist/public/assets/content-types-CjQliqVV.js +2 -0
  19. package/admin-dist/public/assets/{globals-CS6BZ0zp.css → globals-hAmgC66w.css} +1 -1
  20. package/admin-dist/public/assets/index-BH_ECMhv.js +1 -0
  21. package/admin-dist/public/assets/{label-KNtpL71g.js → label-DCsUdvFh.js} +1 -1
  22. package/admin-dist/public/assets/{link-2-Bw2aI4V4.js → link-2-Czw1N61H.js} +1 -1
  23. package/admin-dist/public/assets/{list-sYepHjt_.js → list-DtCsXj8-.js} +1 -1
  24. package/admin-dist/public/assets/{main-CKj5yfEi.js → main-CXgkZMhe.js} +3 -3
  25. package/admin-dist/public/assets/{media-Bkrkffm7.js → media-DTJ3-ViE.js} +1 -1
  26. package/admin-dist/public/assets/{new._contentTypeId-C3LstjNs.js → new._contentTypeId-CoTDxKzf.js} +1 -1
  27. package/admin-dist/public/assets/{plus-DUn8v_Xf.js → plus-xCFJK0RC.js} +1 -1
  28. package/admin-dist/public/assets/{rotate-ccw-DJEoHcRI.js → rotate-ccw-DIqK63wY.js} +1 -1
  29. package/admin-dist/public/assets/scroll-area-B-yrE66a.js +1 -0
  30. package/admin-dist/public/assets/{search-MuAUDJKR.js → search-CbCbboeU.js} +1 -1
  31. package/admin-dist/public/assets/select-Co3TZFJb.js +1 -0
  32. package/admin-dist/public/assets/settings-BspTTv_o.js +1 -0
  33. package/admin-dist/public/assets/switch-CfavASmR.js +1 -0
  34. package/admin-dist/public/assets/tabs-CN5s5u2W.js +1 -0
  35. package/admin-dist/public/assets/tanstack-adapter-npeE3RdY.js +1 -0
  36. package/admin-dist/public/assets/taxonomies-CgG46fIF.js +1 -0
  37. package/admin-dist/public/assets/{textarea-BTy7nwzR.js → textarea-BJ0XFZpT.js} +1 -1
  38. package/admin-dist/public/assets/trash-B3daldm5.js +1 -0
  39. package/admin-dist/public/assets/{triangle-alert-E52Vfeuh.js → triangle-alert-BZRcqsUg.js} +1 -1
  40. package/admin-dist/public/assets/useBreadcrumbLabel-DwZlwvFF.js +1 -0
  41. package/admin-dist/public/assets/{usePermissions-Basjs9BT.js → usePermissions-C1JQhfqb.js} +1 -1
  42. package/admin-dist/server/_chunks/_libs/@tanstack/react-router.mjs +7 -0
  43. package/admin-dist/server/_ssr/{badge-6BsP37vG.mjs → CmsButton-B45JAKR1.mjs} +33 -33
  44. package/admin-dist/server/_ssr/{CmsEmptyState-DU7-7-mV.mjs → CmsEmptyState-D_BQFAVR.mjs} +2 -2
  45. package/admin-dist/server/_ssr/{CmsPageHeader-CseW0AHm.mjs → CmsPageHeader-CrUZA59A.mjs} +1 -1
  46. package/admin-dist/server/_ssr/{CmsStatusBadge-B_pi4KCp.mjs → CmsStatusBadge-B-sj6yaj.mjs} +2 -2
  47. package/admin-dist/server/_ssr/CmsSurface-DKJZhpjk.mjs +44 -0
  48. package/admin-dist/server/_ssr/{CmsToolbar-X75ex6ek.mjs → CmsToolbar-ByaW5iXf.mjs} +2 -2
  49. package/admin-dist/server/_ssr/{ContentEntryEditor-CepusRsA.mjs → ContentEntryEditor-D3_Jb1dq.mjs} +11 -11
  50. package/admin-dist/server/_ssr/{TaxonomyFilter-Bwrq0-cz.mjs → TaxonomyFilter-BRJkuCtA.mjs} +4 -4
  51. package/admin-dist/server/_ssr/{_contentTypeId-BqYKEcLr.mjs → _contentTypeId-B9kA6CaM.mjs} +11 -11
  52. package/admin-dist/server/_ssr/{_entryId-CRfnqeDf.mjs → _entryId-BddcMkZN.mjs} +14 -14
  53. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-Dd7AmelK.mjs +4 -0
  54. package/admin-dist/server/_ssr/{command-fy8epIKf.mjs → command-CGtVr8Gb.mjs} +1 -1
  55. package/admin-dist/server/_ssr/{content-B5RhL7uW.mjs → content-D1tbeOd0.mjs} +201 -86
  56. package/admin-dist/server/_ssr/{content-types-BIOqCQYN.mjs → content-types-BZqY_BER.mjs} +279 -103
  57. package/admin-dist/server/_ssr/{index-DHSHDPt1.mjs → index-BIdq4xaC.mjs} +88 -17
  58. package/admin-dist/server/_ssr/index.mjs +2 -2
  59. package/admin-dist/server/_ssr/{label-C8Dko1j7.mjs → label-T-QNKAr6.mjs} +1 -1
  60. package/admin-dist/server/_ssr/{media-CSx3XttC.mjs → media-C-xqjBrl.mjs} +40 -40
  61. package/admin-dist/server/_ssr/{new._contentTypeId-DzanEZQM.mjs → new._contentTypeId-DWic9cRq.mjs} +13 -13
  62. package/admin-dist/server/_ssr/{router-DDWcF-kt.mjs → router-D1BMAMJT.mjs} +11 -11
  63. package/admin-dist/server/_ssr/{scroll-area-bjPYwhXN.mjs → scroll-area-C0pic_WA.mjs} +1 -1
  64. package/admin-dist/server/_ssr/{select-BUhDDf4T.mjs → select-CqmuN2F6.mjs} +1 -1
  65. package/admin-dist/server/_ssr/{settings-DAsxnw2q.mjs → settings-CAkncGGV.mjs} +211 -129
  66. package/admin-dist/server/_ssr/{switch-BgyRtQ1Z.mjs → switch-CgmuJkT9.mjs} +1 -1
  67. package/admin-dist/server/_ssr/{tabs-DzMdRB1A.mjs → tabs-CnMj0aRy.mjs} +5 -3
  68. package/admin-dist/server/_ssr/tanstack-adapter-BXZrMauE.mjs +119 -0
  69. package/admin-dist/server/_ssr/{taxonomies-C8j8g5Q5.mjs → taxonomies-thl3BfVm.mjs} +168 -68
  70. package/admin-dist/server/_ssr/{textarea-9jNeYJSc.mjs → textarea-4K5OJgeh.mjs} +1 -1
  71. package/admin-dist/server/_ssr/{trash-DYMxwhZB.mjs → trash-B40Gx5zP.mjs} +206 -86
  72. package/admin-dist/server/_ssr/{useBreadcrumbLabel-FNSAr2Ha.mjs → useBreadcrumbLabel-rn-fL4zV.mjs} +1 -1
  73. package/admin-dist/server/_ssr/{usePermissions-BJGGahrJ.mjs → usePermissions-CKeM6_Vw.mjs} +1 -1
  74. package/admin-dist/server/index.mjs +194 -180
  75. package/dist/cli/commands/init.d.ts +6 -0
  76. package/dist/cli/commands/init.d.ts.map +1 -0
  77. package/dist/cli/commands/init.js +156 -0
  78. package/dist/cli/commands/init.js.map +1 -0
  79. package/dist/cli/index.js +6 -0
  80. package/dist/cli/index.js.map +1 -1
  81. package/dist/client/admin-config.d.ts +2 -2
  82. package/dist/client/admin-config.js +2 -2
  83. package/dist/client/adminApi.d.ts +1877 -1851
  84. package/dist/client/adminApi.d.ts.map +1 -1
  85. package/dist/client/adminApi.js +649 -629
  86. package/dist/client/adminApi.js.map +1 -1
  87. package/dist/client/agentTools.d.ts +7 -17
  88. package/dist/client/agentTools.d.ts.map +1 -1
  89. package/dist/client/agentTools.js +4 -4
  90. package/dist/client/index.d.ts +4 -4
  91. package/dist/client/index.d.ts.map +1 -1
  92. package/dist/client/index.js +4 -4
  93. package/dist/client/index.js.map +1 -1
  94. package/dist/client/schema/codegen.d.ts +2 -2
  95. package/dist/client/schema/codegen.d.ts.map +1 -1
  96. package/dist/client/schema/codegen.js +3 -3
  97. package/dist/client/schema/codegen.js.map +1 -1
  98. package/dist/client/schema/defineContentType.d.ts +3 -3
  99. package/dist/client/schema/defineContentType.js +3 -3
  100. package/dist/client/schema/index.d.ts +7 -7
  101. package/dist/client/schema/index.d.ts.map +1 -1
  102. package/dist/client/schema/index.js +5 -5
  103. package/dist/client/schema/index.js.map +1 -1
  104. package/dist/client/schema/schemaDrift.d.ts +1 -1
  105. package/dist/client/schema/schemaDrift.js +1 -1
  106. package/dist/client/schema/typedClient.d.ts +2 -2
  107. package/dist/client/schema/typedClient.js +2 -2
  108. package/dist/client/schema/types.d.ts +1 -1
  109. package/dist/client/schema/types.js +1 -1
  110. package/dist/client/wrapper.d.ts +108 -65
  111. package/dist/client/wrapper.d.ts.map +1 -1
  112. package/dist/client/wrapper.js +22 -22
  113. package/dist/client/wrapper.js.map +1 -1
  114. package/dist/component/convex.config.d.ts +2 -2
  115. package/dist/component/convex.config.js +2 -2
  116. package/dist/component/index.d.ts +1 -1
  117. package/dist/component/index.js +1 -1
  118. package/dist/component/lib/ragContentChunker.d.ts +1 -1
  119. package/dist/component/lib/ragContentChunker.js +1 -1
  120. package/dist/component/roles.d.ts +1 -1
  121. package/dist/component/roles.js +1 -1
  122. package/dist/react/index.d.ts +2 -2
  123. package/dist/react/index.d.ts.map +1 -1
  124. package/dist/react/index.js +13 -7
  125. package/dist/react/index.js.map +1 -1
  126. package/dist/test.d.ts +2 -2
  127. package/dist/test.js +2 -2
  128. package/package.json +31 -11
  129. package/admin-dist/public/assets/alert-BXjTqrwQ.js +0 -1
  130. package/admin-dist/public/assets/content-_LXl3pp7.js +0 -1
  131. package/admin-dist/public/assets/content-types-KjxaXGxY.js +0 -2
  132. package/admin-dist/public/assets/index-DNGIZHL-.js +0 -1
  133. package/admin-dist/public/assets/scroll-area-DfIlT0in.js +0 -1
  134. package/admin-dist/public/assets/select-BD29IXCI.js +0 -1
  135. package/admin-dist/public/assets/settings-DmMyn_6A.js +0 -1
  136. package/admin-dist/public/assets/switch-h3Rrnl5i.js +0 -1
  137. package/admin-dist/public/assets/tabs-imc8h-Dp.js +0 -1
  138. package/admin-dist/public/assets/taxonomies-dAsrT65H.js +0 -1
  139. package/admin-dist/public/assets/trash-SAWKZZHv.js +0 -1
  140. package/admin-dist/public/assets/useBreadcrumbLabel-BECBMCzM.js +0 -1
  141. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-BwDlABVk.mjs +0 -4
  142. package/admin-dist/server/_ssr/alert-CVt45UUP.mjs +0 -92
@@ -1,16 +1,17 @@
1
- import { r as reactExports, j as jsxRuntimeExports } from "../_chunks/_libs/react.mjs";
2
- import { L as Link } from "../_chunks/_libs/@tanstack/react-router.mjs";
3
- import { a as api, c as cn } from "./router-DDWcF-kt.mjs";
4
- import { I as Input, a as Checkbox, C as CmsEmptyState, c as CmsDialog } from "./CmsEmptyState-DU7-7-mV.mjs";
5
- import { C as CmsButton, B as Badge } from "./badge-6BsP37vG.mjs";
6
- import { L as Label } from "./label-C8Dko1j7.mjs";
7
- import { T as Textarea } from "./textarea-9jNeYJSc.mjs";
8
- import { S as Select, a as SelectTrigger, b as SelectValue, c as SelectContent, d as SelectItem } from "./select-BUhDDf4T.mjs";
1
+ import { j as jsxRuntimeExports, r as reactExports } from "../_chunks/_libs/react.mjs";
2
+ import { a as api, c as cn } from "./router-D1BMAMJT.mjs";
3
+ import { C as CmsButton, B as Badge } from "./CmsButton-B45JAKR1.mjs";
4
+ import { I as Input, a as Checkbox, C as CmsEmptyState, c as CmsDialog } from "./CmsEmptyState-D_BQFAVR.mjs";
5
+ import { L as Label } from "./label-T-QNKAr6.mjs";
6
+ import { T as Textarea } from "./textarea-4K5OJgeh.mjs";
7
+ import { S as Select, a as SelectTrigger, b as SelectValue, c as SelectContent, d as SelectItem } from "./select-CqmuN2F6.mjs";
9
8
  import { E as ErrorState, a as ErrorAlert } from "./ErrorState-cI-bKLez.mjs";
10
- import { C as CmsPageHeader } from "./CmsPageHeader-CseW0AHm.mjs";
11
- import { C as CmsToolbar } from "./CmsToolbar-X75ex6ek.mjs";
9
+ import { C as CmsPageHeader } from "./CmsPageHeader-CrUZA59A.mjs";
10
+ import { C as CmsToolbar } from "./CmsToolbar-ByaW5iXf.mjs";
11
+ import { u as useTanStackNavigation } from "./tanstack-adapter-BXZrMauE.mjs";
12
12
  import { u as useQuery, d as useMutation } from "../_libs/convex.mjs";
13
13
  import { ad as Grid3x3, ae as List, Q as Plus, N as Search, af as FileType, W as Pencil, ag as TextAlignStart, ah as FolderOpen, V as Tag, d as ChevronDown, p as Braces, I as Image, a8 as Link2, u as Calendar, T as ToggleLeft, r as Hash, ai as ChevronUp, X, O as TriangleAlert } from "../_libs/lucide-react.mjs";
14
+ import "../_chunks/_libs/@tanstack/react-router.mjs";
14
15
  import "../_libs/tiny-warning.mjs";
15
16
  import "../_chunks/_libs/@tanstack/router-core.mjs";
16
17
  import "../_libs/cookie-es.mjs";
@@ -987,7 +988,7 @@ const FIELD_ICONS = {
987
988
  tags: /* @__PURE__ */ jsxRuntimeExports.jsx(Tag, { className: "size-3" }),
988
989
  category: /* @__PURE__ */ jsxRuntimeExports.jsx(FolderOpen, { className: "size-3" })
989
990
  };
990
- function ContentTypesPage() {
991
+ function ContentTypesPage({ api: api2, navigation }) {
991
992
  const [searchQuery, setSearchQuery] = reactExports.useState("");
992
993
  const [viewMode, setViewMode] = reactExports.useState("grid");
993
994
  const [showActiveOnly, setShowActiveOnly] = reactExports.useState(true);
@@ -1000,7 +1001,7 @@ function ContentTypesPage() {
1000
1001
  const handleContentTypeUpdated = reactExports.useCallback(() => {
1001
1002
  setEditingContentType(null);
1002
1003
  }, []);
1003
- const contentTypesResult = useQuery(api.contentTypes.list, {
1004
+ const contentTypesResult = useQuery(api2.contentTypes.list, {
1004
1005
  isActive: showActiveOnly ? true : void 0,
1005
1006
  includeEntryCounts: true
1006
1007
  });
@@ -1016,7 +1017,9 @@ function ContentTypesPage() {
1016
1017
  return contentTypes;
1017
1018
  }
1018
1019
  const query = searchQuery.toLowerCase();
1019
- return contentTypes.filter((type) => type.name.toLowerCase().includes(query) || type.displayName.toLowerCase().includes(query));
1020
+ return contentTypes.filter(
1021
+ (type) => type.name.toLowerCase().includes(query) || type.displayName.toLowerCase().includes(query)
1022
+ );
1020
1023
  }, [contentTypes, searchQuery]);
1021
1024
  const formatDate = (timestamp) => {
1022
1025
  return new Date(timestamp).toLocaleDateString("en-US", {
@@ -1046,76 +1049,198 @@ function ContentTypesPage() {
1046
1049
  };
1047
1050
  if (error && !isLoading) {
1048
1051
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-6 p-6", children: [
1049
- /* @__PURE__ */ jsxRuntimeExports.jsx(CmsPageHeader, { title: "Content Types", description: "Define the structure of your content with custom fields and validation rules." }),
1050
- /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorState, { error, title: "Failed to load content types", onRetry: handleRetry })
1052
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1053
+ CmsPageHeader,
1054
+ {
1055
+ title: "Content Types",
1056
+ description: "Define the structure of your content with custom fields and validation rules."
1057
+ }
1058
+ ),
1059
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1060
+ ErrorState,
1061
+ {
1062
+ error,
1063
+ title: "Failed to load content types",
1064
+ onRetry: handleRetry
1065
+ }
1066
+ )
1051
1067
  ] });
1052
1068
  }
1053
1069
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-6 p-6", children: [
1054
- /* @__PURE__ */ jsxRuntimeExports.jsx(CmsPageHeader, { title: "Content Types", description: "Define the structure of your content with custom fields and validation rules." }),
1055
- error && !dismissedError && /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorAlert, { error, onDismiss: () => setDismissedError(true), onRetry: handleRetry }),
1056
- /* @__PURE__ */ jsxRuntimeExports.jsx(CmsToolbar, { left: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3", children: [
1057
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative", children: [
1058
- /* @__PURE__ */ jsxRuntimeExports.jsx(Search, { className: "absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground" }),
1059
- /* @__PURE__ */ jsxRuntimeExports.jsx(Input, { type: "search", placeholder: "Search content types...", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), className: "w-64 pl-9" })
1060
- ] }),
1061
- /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "flex cursor-pointer items-center gap-2 text-sm", children: [
1062
- /* @__PURE__ */ jsxRuntimeExports.jsx(Checkbox, { checked: showActiveOnly, onCheckedChange: (checked) => setShowActiveOnly(checked) }),
1063
- "Active only"
1064
- ] })
1065
- ] }), right: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
1066
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex rounded-md border bg-muted/30", children: [
1067
- /* @__PURE__ */ jsxRuntimeExports.jsx("button", { className: cn("rounded-l-md p-2 transition-colors", viewMode === "grid" ? "bg-background shadow-sm" : "hover:bg-muted/50"), onClick: () => setViewMode("grid"), title: "Grid view", "aria-label": "Grid view", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Grid3x3, { className: "size-4" }) }),
1068
- /* @__PURE__ */ jsxRuntimeExports.jsx("button", { className: cn("rounded-r-md p-2 transition-colors", viewMode === "list" ? "bg-background shadow-sm" : "hover:bg-muted/50"), onClick: () => setViewMode("list"), title: "List view", "aria-label": "List view", children: /* @__PURE__ */ jsxRuntimeExports.jsx(List, { className: "size-4" }) })
1069
- ] }),
1070
- /* @__PURE__ */ jsxRuntimeExports.jsxs(CmsButton, { onClick: () => setShowCreateModal(true), "data-testid": "create-content-type-button", children: [
1071
- /* @__PURE__ */ jsxRuntimeExports.jsx(Plus, { className: "size-4" }),
1072
- "Create Content Type"
1073
- ] })
1074
- ] }) }),
1075
- isLoading ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center justify-center py-12", children: [
1076
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "size-8 animate-spin rounded-full border-2 border-muted border-t-primary" }),
1077
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-4 text-sm text-muted-foreground", children: "Loading content types..." })
1078
- ] }) : filteredContentTypes.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx(CmsEmptyState, { icon: /* @__PURE__ */ jsxRuntimeExports.jsx(FileType, { className: "size-6" }), title: searchQuery ? "No content types match your search" : "No content types defined", description: searchQuery ? "Try adjusting your search query or filters." : "Content types define the schema for your content. Create one to get started." }) : viewMode === "grid" ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4", children: filteredContentTypes.map((contentType) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "group flex flex-col rounded-lg border bg-card p-4 transition-all hover:border-primary/50 hover:shadow-md", children: [
1079
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-3 flex items-center justify-between", children: [
1080
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex size-10 items-center justify-center rounded-md bg-muted text-muted-foreground", children: /* @__PURE__ */ jsxRuntimeExports.jsx(FileType, { className: "size-5" }) }),
1081
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1.5", children: [
1082
- !contentType.isActive && /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { variant: "secondary", className: "text-xs font-normal", children: "Inactive" }),
1083
- contentType.singleton && /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { variant: "secondary", className: "border-amber-200 bg-amber-50 text-xs font-normal text-amber-700", children: "Singleton" }),
1084
- /* @__PURE__ */ jsxRuntimeExports.jsx("button", { onClick: () => setEditingContentType(contentType), className: "rounded p-1.5 text-muted-foreground opacity-0 transition-all hover:bg-muted hover:text-foreground group-hover:opacity-100", title: "Edit content type", "aria-label": "Edit content type", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Pencil, { className: "size-4" }) })
1085
- ] })
1086
- ] }),
1087
- /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: "/entries/type/$contentTypeId", params: {
1088
- contentTypeId: contentType._id
1089
- }, className: "flex flex-1 flex-col", children: [
1090
- /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-base font-semibold text-foreground", children: contentType.displayName }),
1091
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-0.5 text-xs text-muted-foreground", children: contentType.name }),
1092
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-3 flex items-center gap-4", children: [
1093
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center", children: [
1094
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-lg font-semibold text-foreground", children: contentType.fields.length }),
1095
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: contentType.fields.length === 1 ? "Field" : "Fields" })
1070
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1071
+ CmsPageHeader,
1072
+ {
1073
+ title: "Content Types",
1074
+ description: "Define the structure of your content with custom fields and validation rules."
1075
+ }
1076
+ ),
1077
+ error && !dismissedError && /* @__PURE__ */ jsxRuntimeExports.jsx(
1078
+ ErrorAlert,
1079
+ {
1080
+ error,
1081
+ onDismiss: () => setDismissedError(true),
1082
+ onRetry: handleRetry
1083
+ }
1084
+ ),
1085
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1086
+ CmsToolbar,
1087
+ {
1088
+ left: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3", children: [
1089
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative", children: [
1090
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Search, { className: "absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground" }),
1091
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1092
+ Input,
1093
+ {
1094
+ type: "search",
1095
+ placeholder: "Search content types...",
1096
+ value: searchQuery,
1097
+ onChange: (e) => setSearchQuery(e.target.value),
1098
+ className: "w-64 pl-9"
1099
+ }
1100
+ )
1096
1101
  ] }),
1097
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center", children: [
1098
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-lg font-semibold text-foreground", children: contentType.entryCount ?? 0 }),
1099
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: contentType.entryCount === 1 ? "Entry" : "Entries" })
1100
- ] })
1101
- ] }),
1102
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-3 flex flex-wrap gap-1.5", children: [
1103
- contentType.fields.slice(0, 4).map((field) => /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "flex items-center gap-1 rounded-md bg-muted px-1.5 py-0.5 text-xs text-muted-foreground", title: field.label, children: [
1104
- FIELD_ICONS[field.type] || /* @__PURE__ */ jsxRuntimeExports.jsx(TextAlignStart, { className: "size-3" }),
1105
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: field.label })
1106
- ] }, field.name)),
1107
- contentType.fields.length > 4 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "rounded-md bg-muted px-1.5 py-0.5 text-xs text-muted-foreground", children: [
1108
- "+",
1109
- contentType.fields.length - 4,
1110
- " more"
1102
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "flex cursor-pointer items-center gap-2 text-sm", children: [
1103
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1104
+ Checkbox,
1105
+ {
1106
+ checked: showActiveOnly,
1107
+ onCheckedChange: (checked) => setShowActiveOnly(checked)
1108
+ }
1109
+ ),
1110
+ "Active only"
1111
1111
  ] })
1112
1112
  ] }),
1113
- /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "mt-auto pt-3 text-xs text-muted-foreground", children: [
1114
- "Updated ",
1115
- getRelativeTime(contentType._creationTime)
1113
+ right: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
1114
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex rounded-md border bg-muted/30", children: [
1115
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1116
+ "button",
1117
+ {
1118
+ className: cn(
1119
+ "rounded-l-md p-2 transition-colors",
1120
+ viewMode === "grid" ? "bg-background shadow-sm" : "hover:bg-muted/50"
1121
+ ),
1122
+ onClick: () => setViewMode("grid"),
1123
+ title: "Grid view",
1124
+ "aria-label": "Grid view",
1125
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(Grid3x3, { className: "size-4" })
1126
+ }
1127
+ ),
1128
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1129
+ "button",
1130
+ {
1131
+ className: cn(
1132
+ "rounded-r-md p-2 transition-colors",
1133
+ viewMode === "list" ? "bg-background shadow-sm" : "hover:bg-muted/50"
1134
+ ),
1135
+ onClick: () => setViewMode("list"),
1136
+ title: "List view",
1137
+ "aria-label": "List view",
1138
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(List, { className: "size-4" })
1139
+ }
1140
+ )
1141
+ ] }),
1142
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
1143
+ CmsButton,
1144
+ {
1145
+ onClick: () => setShowCreateModal(true),
1146
+ "data-testid": "create-content-type-button",
1147
+ children: [
1148
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Plus, { className: "size-4" }),
1149
+ "Create Content Type"
1150
+ ]
1151
+ }
1152
+ )
1116
1153
  ] })
1117
- ] })
1118
- ] }, contentType._id)) }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "rounded-lg border bg-card", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("table", { className: "w-full", children: [
1154
+ }
1155
+ ),
1156
+ isLoading ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center justify-center py-12", children: [
1157
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "size-8 animate-spin rounded-full border-2 border-muted border-t-primary" }),
1158
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-4 text-sm text-muted-foreground", children: "Loading content types..." })
1159
+ ] }) : filteredContentTypes.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx(
1160
+ CmsEmptyState,
1161
+ {
1162
+ icon: /* @__PURE__ */ jsxRuntimeExports.jsx(FileType, { className: "size-6" }),
1163
+ title: searchQuery ? "No content types match your search" : "No content types defined",
1164
+ description: searchQuery ? "Try adjusting your search query or filters." : "Content types define the schema for your content. Create one to get started."
1165
+ }
1166
+ ) : viewMode === "grid" ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4", children: filteredContentTypes.map((contentType) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
1167
+ "div",
1168
+ {
1169
+ className: "group flex flex-col rounded-lg border bg-card p-4 transition-all hover:border-primary/50 hover:shadow-md",
1170
+ children: [
1171
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-3 flex items-center justify-between", children: [
1172
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex size-10 items-center justify-center rounded-md bg-muted text-muted-foreground", children: /* @__PURE__ */ jsxRuntimeExports.jsx(FileType, { className: "size-5" }) }),
1173
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1.5", children: [
1174
+ !contentType.isActive && /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { variant: "secondary", className: "text-xs font-normal", children: "Inactive" }),
1175
+ contentType.singleton && /* @__PURE__ */ jsxRuntimeExports.jsx(
1176
+ Badge,
1177
+ {
1178
+ variant: "secondary",
1179
+ className: "border-amber-200 bg-amber-50 text-xs font-normal text-amber-700",
1180
+ children: "Singleton"
1181
+ }
1182
+ ),
1183
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1184
+ "button",
1185
+ {
1186
+ onClick: () => setEditingContentType(contentType),
1187
+ className: "rounded p-1.5 text-muted-foreground opacity-0 transition-all hover:bg-muted hover:text-foreground group-hover:opacity-100",
1188
+ title: "Edit content type",
1189
+ "aria-label": "Edit content type",
1190
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(Pencil, { className: "size-4" })
1191
+ }
1192
+ )
1193
+ ] })
1194
+ ] }),
1195
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
1196
+ "button",
1197
+ {
1198
+ type: "button",
1199
+ onClick: () => navigation.navigateToContentType(contentType._id),
1200
+ className: "flex flex-1 flex-col text-left",
1201
+ children: [
1202
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-base font-semibold text-foreground", children: contentType.displayName }),
1203
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-0.5 text-xs text-muted-foreground", children: contentType.name }),
1204
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-3 flex items-center gap-4", children: [
1205
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center", children: [
1206
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-lg font-semibold text-foreground", children: contentType.fields.length }),
1207
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: contentType.fields.length === 1 ? "Field" : "Fields" })
1208
+ ] }),
1209
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center", children: [
1210
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-lg font-semibold text-foreground", children: contentType.entryCount ?? 0 }),
1211
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: contentType.entryCount === 1 ? "Entry" : "Entries" })
1212
+ ] })
1213
+ ] }),
1214
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-3 flex flex-wrap gap-1.5", children: [
1215
+ contentType.fields.slice(0, 4).map((field) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
1216
+ "span",
1217
+ {
1218
+ className: "flex items-center gap-1 rounded-md bg-muted px-1.5 py-0.5 text-xs text-muted-foreground",
1219
+ title: field.label,
1220
+ children: [
1221
+ FIELD_ICONS[field.type] || /* @__PURE__ */ jsxRuntimeExports.jsx(TextAlignStart, { className: "size-3" }),
1222
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: field.label })
1223
+ ]
1224
+ },
1225
+ field.name
1226
+ )),
1227
+ contentType.fields.length > 4 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "rounded-md bg-muted px-1.5 py-0.5 text-xs text-muted-foreground", children: [
1228
+ "+",
1229
+ contentType.fields.length - 4,
1230
+ " more"
1231
+ ] })
1232
+ ] }),
1233
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "mt-auto pt-3 text-xs text-muted-foreground", children: [
1234
+ "Updated ",
1235
+ getRelativeTime(contentType._creationTime)
1236
+ ] })
1237
+ ]
1238
+ }
1239
+ )
1240
+ ]
1241
+ },
1242
+ contentType._id
1243
+ )) }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "rounded-lg border bg-card", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("table", { className: "w-full", children: [
1119
1244
  /* @__PURE__ */ jsxRuntimeExports.jsx("thead", { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("tr", { className: "border-b", children: [
1120
1245
  /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "p-3 text-left text-sm font-medium text-muted-foreground", children: "Name" }),
1121
1246
  /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "p-3 text-left text-sm font-medium text-muted-foreground", children: "Fields" }),
@@ -1124,28 +1249,66 @@ function ContentTypesPage() {
1124
1249
  /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "p-3 text-left text-sm font-medium text-muted-foreground", children: "Last Updated" }),
1125
1250
  /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "p-3 text-left text-sm font-medium text-muted-foreground", children: "Actions" })
1126
1251
  ] }) }),
1127
- /* @__PURE__ */ jsxRuntimeExports.jsx("tbody", { children: filteredContentTypes.map((contentType) => /* @__PURE__ */ jsxRuntimeExports.jsxs("tr", { className: "border-b last:border-0 transition-colors hover:bg-muted/50", children: [
1128
- /* @__PURE__ */ jsxRuntimeExports.jsxs("td", { className: "p-3", children: [
1129
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-medium text-foreground", children: contentType.displayName }),
1130
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: contentType.name })
1131
- ] }),
1132
- /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "p-3 text-sm text-muted-foreground", children: contentType.fields.length }),
1133
- /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "p-3 text-sm text-muted-foreground", children: contentType.entryCount ?? 0 }),
1134
- /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "p-3", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1.5", children: [
1135
- /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { variant: contentType.isActive ? "default" : "secondary", className: cn("text-xs font-normal", contentType.isActive && "border-emerald-200 bg-emerald-50 text-emerald-700"), children: contentType.isActive ? "Active" : "Inactive" }),
1136
- contentType.singleton && /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { variant: "secondary", className: "border-amber-200 bg-amber-50 text-xs font-normal text-amber-700", children: "Singleton" })
1137
- ] }) }),
1138
- /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "p-3 text-sm text-muted-foreground", children: formatDate(contentType._creationTime) }),
1139
- /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "p-3", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
1140
- /* @__PURE__ */ jsxRuntimeExports.jsxs(CmsButton, { variant: "outline", size: "sm", onClick: () => setEditingContentType(contentType), children: [
1141
- /* @__PURE__ */ jsxRuntimeExports.jsx(Pencil, { className: "size-3.5" }),
1142
- "Edit"
1143
- ] }),
1144
- /* @__PURE__ */ jsxRuntimeExports.jsx(CmsButton, { variant: "outline", size: "sm", asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/entries/type/$contentTypeId", params: {
1145
- contentTypeId: contentType._id
1146
- }, children: "View Entries" }) })
1147
- ] }) })
1148
- ] }, contentType._id)) })
1252
+ /* @__PURE__ */ jsxRuntimeExports.jsx("tbody", { children: filteredContentTypes.map((contentType) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
1253
+ "tr",
1254
+ {
1255
+ className: "border-b last:border-0 transition-colors hover:bg-muted/50",
1256
+ children: [
1257
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("td", { className: "p-3", children: [
1258
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-medium text-foreground", children: contentType.displayName }),
1259
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: contentType.name })
1260
+ ] }),
1261
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "p-3 text-sm text-muted-foreground", children: contentType.fields.length }),
1262
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "p-3 text-sm text-muted-foreground", children: contentType.entryCount ?? 0 }),
1263
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "p-3", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1.5", children: [
1264
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1265
+ Badge,
1266
+ {
1267
+ variant: contentType.isActive ? "default" : "secondary",
1268
+ className: cn(
1269
+ "text-xs font-normal",
1270
+ contentType.isActive && "border-emerald-200 bg-emerald-50 text-emerald-700"
1271
+ ),
1272
+ children: contentType.isActive ? "Active" : "Inactive"
1273
+ }
1274
+ ),
1275
+ contentType.singleton && /* @__PURE__ */ jsxRuntimeExports.jsx(
1276
+ Badge,
1277
+ {
1278
+ variant: "secondary",
1279
+ className: "border-amber-200 bg-amber-50 text-xs font-normal text-amber-700",
1280
+ children: "Singleton"
1281
+ }
1282
+ )
1283
+ ] }) }),
1284
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "p-3 text-sm text-muted-foreground", children: formatDate(contentType._creationTime) }),
1285
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "p-3", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
1286
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
1287
+ CmsButton,
1288
+ {
1289
+ variant: "outline",
1290
+ size: "sm",
1291
+ onClick: () => setEditingContentType(contentType),
1292
+ children: [
1293
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Pencil, { className: "size-3.5" }),
1294
+ "Edit"
1295
+ ]
1296
+ }
1297
+ ),
1298
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1299
+ CmsButton,
1300
+ {
1301
+ variant: "outline",
1302
+ size: "sm",
1303
+ onClick: () => navigation.navigateToContentType(contentType._id),
1304
+ children: "View Entries"
1305
+ }
1306
+ )
1307
+ ] }) })
1308
+ ]
1309
+ },
1310
+ contentType._id
1311
+ )) })
1149
1312
  ] }) }),
1150
1313
  !isLoading && filteredContentTypes.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-center text-sm text-muted-foreground", children: [
1151
1314
  "Showing ",
@@ -1155,12 +1318,25 @@ function ContentTypesPage() {
1155
1318
  " content type",
1156
1319
  contentTypes.length !== 1 ? "s" : ""
1157
1320
  ] }),
1158
- /* @__PURE__ */ jsxRuntimeExports.jsx(ContentTypeFormModal, { isOpen: showCreateModal || !!editingContentType, onClose: () => {
1159
- setShowCreateModal(false);
1160
- setEditingContentType(null);
1161
- }, contentType: editingContentType, onCreated: handleContentTypeCreated, onUpdated: handleContentTypeUpdated })
1321
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1322
+ ContentTypeFormModal,
1323
+ {
1324
+ isOpen: showCreateModal || !!editingContentType,
1325
+ onClose: () => {
1326
+ setShowCreateModal(false);
1327
+ setEditingContentType(null);
1328
+ },
1329
+ contentType: editingContentType,
1330
+ onCreated: handleContentTypeCreated,
1331
+ onUpdated: handleContentTypeUpdated
1332
+ }
1333
+ )
1162
1334
  ] });
1163
1335
  }
1336
+ function ContentTypesRoute() {
1337
+ const navigation = useTanStackNavigation();
1338
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(ContentTypesPage, { api, navigation });
1339
+ }
1164
1340
  export {
1165
- ContentTypesPage as component
1341
+ ContentTypesRoute as component
1166
1342
  };
@@ -1,9 +1,10 @@
1
1
  import { j as jsxRuntimeExports } from "../_chunks/_libs/react.mjs";
2
- import { L as Link } from "../_chunks/_libs/@tanstack/react-router.mjs";
3
- import { a as api, c as cn } from "./router-DDWcF-kt.mjs";
4
- import { C as CmsPageHeader } from "./CmsPageHeader-CseW0AHm.mjs";
2
+ import { a as api, c as cn } from "./router-D1BMAMJT.mjs";
3
+ import { C as CmsPageHeader } from "./CmsPageHeader-CrUZA59A.mjs";
4
+ import { u as useTanStackNavigation } from "./tanstack-adapter-BXZrMauE.mjs";
5
5
  import { u as useQuery } from "../_libs/convex.mjs";
6
6
  import { J as FileText, I as Image, a as Layers, x as Settings, ak as TrendingUp } from "../_libs/lucide-react.mjs";
7
+ import "../_chunks/_libs/@tanstack/react-router.mjs";
7
8
  import "../_libs/tiny-warning.mjs";
8
9
  import "../_chunks/_libs/@tanstack/router-core.mjs";
9
10
  import "../_libs/cookie-es.mjs";
@@ -138,17 +139,55 @@ function Skeleton({ className, ...props }) {
138
139
  }
139
140
  );
140
141
  }
141
- function DashboardPage() {
142
- const stats = useQuery(api.stats.getDashboardStats);
142
+ function DashboardPage({ api: api2, navigation }) {
143
+ const stats = useQuery(api2.stats.getDashboardStats);
143
144
  const isLoading = stats === void 0;
144
145
  const hasError = stats === null;
145
146
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-8", children: [
146
- /* @__PURE__ */ jsxRuntimeExports.jsx(CmsPageHeader, { title: "Dashboard", description: "Welcome to Convex CMS Admin. Manage your content, media, and publishing workflows." }),
147
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
148
+ CmsPageHeader,
149
+ {
150
+ title: "Dashboard",
151
+ description: "Welcome to Convex CMS Admin. Manage your content, media, and publishing workflows."
152
+ }
153
+ ),
147
154
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-4", children: [
148
- /* @__PURE__ */ jsxRuntimeExports.jsx(DashboardCard, { title: "Content Entries", description: "Create and manage your content", href: "/content", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "size-5" }) }),
149
- /* @__PURE__ */ jsxRuntimeExports.jsx(DashboardCard, { title: "Media Library", description: "Upload and organize media assets", href: "/media", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Image, { className: "size-5" }) }),
150
- /* @__PURE__ */ jsxRuntimeExports.jsx(DashboardCard, { title: "Content Types", description: "Define content schemas and fields", href: "/content-types", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Layers, { className: "size-5" }) }),
151
- /* @__PURE__ */ jsxRuntimeExports.jsx(DashboardCard, { title: "Settings", description: "Configure CMS settings", href: "/settings", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Settings, { className: "size-5" }) })
155
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
156
+ DashboardCard,
157
+ {
158
+ title: "Content Entries",
159
+ description: "Create and manage your content",
160
+ onClick: () => navigation.navigate("/content"),
161
+ icon: /* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "size-5" })
162
+ }
163
+ ),
164
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
165
+ DashboardCard,
166
+ {
167
+ title: "Media Library",
168
+ description: "Upload and organize media assets",
169
+ onClick: () => navigation.navigate("/media"),
170
+ icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Image, { className: "size-5" })
171
+ }
172
+ ),
173
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
174
+ DashboardCard,
175
+ {
176
+ title: "Content Types",
177
+ description: "Define content schemas and fields",
178
+ onClick: () => navigation.navigate("/content-types"),
179
+ icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Layers, { className: "size-5" })
180
+ }
181
+ ),
182
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
183
+ DashboardCard,
184
+ {
185
+ title: "Settings",
186
+ description: "Configure CMS settings",
187
+ onClick: () => navigation.navigate("/settings"),
188
+ icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Settings, { className: "size-5" })
189
+ }
190
+ )
152
191
  ] }),
153
192
  /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "space-y-4", children: [
154
193
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
@@ -156,10 +195,38 @@ function DashboardPage() {
156
195
  /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-lg font-semibold", children: "Quick Stats" })
157
196
  ] }),
158
197
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-4", children: [
159
- /* @__PURE__ */ jsxRuntimeExports.jsx(StatCard, { label: "Content Types", value: isLoading ? void 0 : hasError ? "—" : String(stats.contentTypes), isLoading }),
160
- /* @__PURE__ */ jsxRuntimeExports.jsx(StatCard, { label: "Content Entries", value: isLoading ? void 0 : hasError ? "—" : String(stats.contentEntries), isLoading }),
161
- /* @__PURE__ */ jsxRuntimeExports.jsx(StatCard, { label: "Media Assets", value: isLoading ? void 0 : hasError ? "—" : String(stats.mediaAssets), isLoading }),
162
- /* @__PURE__ */ jsxRuntimeExports.jsx(StatCard, { label: "Published", value: isLoading ? void 0 : hasError ? "—" : String(stats.published), isLoading })
198
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
199
+ StatCard,
200
+ {
201
+ label: "Content Types",
202
+ value: isLoading ? void 0 : hasError ? "—" : String(stats.contentTypes),
203
+ isLoading
204
+ }
205
+ ),
206
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
207
+ StatCard,
208
+ {
209
+ label: "Content Entries",
210
+ value: isLoading ? void 0 : hasError ? "—" : String(stats.contentEntries),
211
+ isLoading
212
+ }
213
+ ),
214
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
215
+ StatCard,
216
+ {
217
+ label: "Media Assets",
218
+ value: isLoading ? void 0 : hasError ? "—" : String(stats.mediaAssets),
219
+ isLoading
220
+ }
221
+ ),
222
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
223
+ StatCard,
224
+ {
225
+ label: "Published",
226
+ value: isLoading ? void 0 : hasError ? "—" : String(stats.published),
227
+ isLoading
228
+ }
229
+ )
163
230
  ] })
164
231
  ] })
165
232
  ] });
@@ -167,10 +234,10 @@ function DashboardPage() {
167
234
  function DashboardCard({
168
235
  title,
169
236
  description,
170
- href,
237
+ onClick,
171
238
  icon
172
239
  }) {
173
- return /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: href, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { className: "transition-colors hover:bg-accent/50", children: [
240
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("button", { type: "button", onClick, className: "text-left", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { className: "h-full transition-colors hover:bg-accent/50", children: [
174
241
  /* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, { className: "pb-2", children: [
175
242
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mb-2 flex size-10 items-center justify-center rounded-lg bg-primary/10 text-primary", children: icon }),
176
243
  /* @__PURE__ */ jsxRuntimeExports.jsx(CardTitle, { className: "text-base", children: title })
@@ -188,6 +255,10 @@ function StatCard({
188
255
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-muted-foreground", children: label })
189
256
  ] }) });
190
257
  }
258
+ function DashboardRoute() {
259
+ const navigation = useTanStackNavigation();
260
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(DashboardPage, { api, navigation });
261
+ }
191
262
  export {
192
- DashboardPage as component
263
+ DashboardRoute as component
193
264
  };
@@ -440,7 +440,7 @@ function getResponse() {
440
440
  return event.res;
441
441
  }
442
442
  async function getStartManifest(matchedRoutes) {
443
- const { tsrStartManifest } = await import("./_tanstack-start-manifest_v-BwDlABVk.mjs");
443
+ const { tsrStartManifest } = await import("./_tanstack-start-manifest_v-Dd7AmelK.mjs");
444
444
  const startManifest = tsrStartManifest();
445
445
  const rootRoute = startManifest.routes[rootRouteId] = startManifest.routes[rootRouteId] || {};
446
446
  rootRoute.assets = rootRoute.assets || [];
@@ -915,7 +915,7 @@ function getStartResponseHeaders(opts) {
915
915
  let entriesPromise;
916
916
  let manifestPromise;
917
917
  async function loadEntries() {
918
- const routerEntry = await import("./router-DDWcF-kt.mjs").then((n) => n.s);
918
+ const routerEntry = await import("./router-D1BMAMJT.mjs").then((n) => n.s);
919
919
  const startEntry = await import("./start-HYkvq4Ni.mjs");
920
920
  return { startEntry, routerEntry };
921
921
  }
@@ -1,6 +1,6 @@
1
1
  import { j as jsxRuntimeExports } from "../_chunks/_libs/react.mjs";
2
2
  import { R as Root } from "../_chunks/_libs/@radix-ui/react-label.mjs";
3
- import { c as cn } from "./router-DDWcF-kt.mjs";
3
+ import { c as cn } from "./router-D1BMAMJT.mjs";
4
4
  function Label({
5
5
  className,
6
6
  ...props