@mdxui/do 3.0.0 → 4.0.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 (52) hide show
  1. package/README.md +80 -275
  2. package/dist/app/index.d.ts +125 -125
  3. package/dist/app/index.js +8 -7
  4. package/dist/breadcrumbs-C9Qn3S7d.d.ts +81 -0
  5. package/dist/capnweb-client-Bq78FtEA.d.ts +229 -0
  6. package/dist/chunk-3XKYQRXY.js +192 -0
  7. package/dist/chunk-3XKYQRXY.js.map +1 -0
  8. package/dist/{chunk-JWKIONEO.js → chunk-5SHZZC7L.js} +3 -3
  9. package/dist/{chunk-JWKIONEO.js.map → chunk-5SHZZC7L.js.map} +1 -1
  10. package/dist/{chunk-YGIBMNRH.js → chunk-7UFINK3Q.js} +30 -27
  11. package/dist/chunk-7UFINK3Q.js.map +1 -0
  12. package/dist/{chunk-5AWTQDRF.js → chunk-JJLAES6W.js} +2 -2
  13. package/dist/{chunk-5AWTQDRF.js.map → chunk-JJLAES6W.js.map} +1 -1
  14. package/dist/{chunk-NTSEARBC.js → chunk-KT52UU3U.js} +473 -203
  15. package/dist/chunk-KT52UU3U.js.map +1 -0
  16. package/dist/{chunk-EQVOEEQO.js → chunk-LJIWB7KE.js} +2 -2
  17. package/dist/{chunk-EQVOEEQO.js.map → chunk-LJIWB7KE.js.map} +1 -1
  18. package/dist/{chunk-IESVTECE.js → chunk-NA652ART.js} +64 -4
  19. package/dist/chunk-NA652ART.js.map +1 -0
  20. package/dist/chunk-OVLO7UOH.js +1071 -0
  21. package/dist/chunk-OVLO7UOH.js.map +1 -0
  22. package/dist/chunk-WMNT4OIE.js +249 -0
  23. package/dist/chunk-WMNT4OIE.js.map +1 -0
  24. package/dist/components/index.d.ts +20 -1
  25. package/dist/components/index.js +2 -1
  26. package/dist/{config-CmZBQQaT.d.ts → config-CxvpD8Y6.d.ts} +2 -13
  27. package/dist/{do-C-t9UgjT.d.ts → do-D27i5bU0.d.ts} +2 -1
  28. package/dist/{errors-B4Oyyj4Z.d.ts → errors-DratdVIz.d.ts} +1 -1
  29. package/dist/hooks/index.d.ts +30 -3
  30. package/dist/hooks/index.js +4 -4
  31. package/dist/hooks/things/index.d.ts +2 -2
  32. package/dist/hooks/things/index.js +3 -3
  33. package/dist/index.d.ts +76 -14
  34. package/dist/index.js +9 -8
  35. package/dist/lib/index.d.ts +703 -5
  36. package/dist/lib/index.js +2 -2
  37. package/dist/providers/index.d.ts +7 -123
  38. package/dist/providers/index.js +2 -2
  39. package/dist/{query-keys-BC901wog.d.ts → query-keys-CZNFikIi.d.ts} +3 -3
  40. package/dist/schemas/index.d.ts +5 -5
  41. package/dist/{thing-BVhCTzOi.d.ts → thing-BF25aUtJ.d.ts} +68 -68
  42. package/dist/types/index.d.ts +445 -445
  43. package/dist/views/index.d.ts +1 -1
  44. package/dist/views/index.js +6 -6
  45. package/package.json +2 -2
  46. package/dist/chunk-FO3N7SXV.js +0 -469
  47. package/dist/chunk-FO3N7SXV.js.map +0 -1
  48. package/dist/chunk-IESVTECE.js.map +0 -1
  49. package/dist/chunk-NTSEARBC.js.map +0 -1
  50. package/dist/chunk-OWEAW4U6.js +0 -116
  51. package/dist/chunk-OWEAW4U6.js.map +0 -1
  52. package/dist/chunk-YGIBMNRH.js.map +0 -1
@@ -0,0 +1,192 @@
1
+ import { Input, CommandDialog, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem, CommandSeparator, Breadcrumb, BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbPage, BreadcrumbSeparator, DropdownMenu, DropdownMenuTrigger, BreadcrumbEllipsis, DropdownMenuContent, DropdownMenuItem } from '@mdxui/primitives';
2
+ import { Search, Server, History, Plus } from 'lucide-react';
3
+ import * as React from 'react';
4
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
5
+
6
+ // src/components/endpoint-selector.tsx
7
+ function useIsMac() {
8
+ const [isMac, setIsMac] = React.useState(false);
9
+ React.useEffect(() => {
10
+ setIsMac(navigator.platform.toUpperCase().indexOf("MAC") >= 0);
11
+ }, []);
12
+ return isMac;
13
+ }
14
+ function EndpointSelector({
15
+ endpoint,
16
+ onEndpointChange,
17
+ recentEndpoints = [],
18
+ placeholder = "Connect to DO...",
19
+ className
20
+ }) {
21
+ const [open, setOpen] = React.useState(false);
22
+ const [customEndpoint, setCustomEndpoint] = React.useState("");
23
+ const isMac = useIsMac();
24
+ React.useEffect(() => {
25
+ function handleKeyDown(e) {
26
+ if ((e.metaKey || e.ctrlKey) && e.key === "k") {
27
+ e.preventDefault();
28
+ setOpen((prev) => !prev);
29
+ }
30
+ }
31
+ document.addEventListener("keydown", handleKeyDown);
32
+ return () => document.removeEventListener("keydown", handleKeyDown);
33
+ }, []);
34
+ const handleSelect = (url) => {
35
+ onEndpointChange(url);
36
+ setOpen(false);
37
+ setCustomEndpoint("");
38
+ };
39
+ const handleCustomSubmit = () => {
40
+ if (customEndpoint.trim()) {
41
+ handleSelect(customEndpoint.trim());
42
+ }
43
+ };
44
+ const formatEndpoint = (url) => {
45
+ try {
46
+ const parsed = new URL(url);
47
+ return parsed.hostname;
48
+ } catch {
49
+ return url;
50
+ }
51
+ };
52
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
53
+ /* @__PURE__ */ jsx("div", { className, children: /* @__PURE__ */ jsxs("div", { className: "relative w-full", children: [
54
+ /* @__PURE__ */ jsx(Search, { className: "absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground" }),
55
+ /* @__PURE__ */ jsx(
56
+ Input,
57
+ {
58
+ type: "text",
59
+ placeholder,
60
+ value: formatEndpoint(endpoint),
61
+ readOnly: true,
62
+ onClick: () => setOpen(true),
63
+ className: "w-full cursor-pointer pl-9 pr-12 shadow-none"
64
+ }
65
+ ),
66
+ /* @__PURE__ */ jsx("kbd", { className: "pointer-events-none absolute right-3 top-1/2 hidden -translate-y-1/2 select-none rounded-sm border border-border bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground sm:inline-block", children: isMac ? "\u2318K" : "Ctrl+K" })
67
+ ] }) }),
68
+ /* @__PURE__ */ jsxs(
69
+ CommandDialog,
70
+ {
71
+ open,
72
+ onOpenChange: setOpen,
73
+ title: "Connect to DO",
74
+ description: "Select a DO server endpoint to connect to",
75
+ children: [
76
+ /* @__PURE__ */ jsx(CommandInput, { placeholder: "Search endpoints or enter URL..." }),
77
+ /* @__PURE__ */ jsxs(CommandList, { children: [
78
+ /* @__PURE__ */ jsx(CommandEmpty, { children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 py-2", children: [
79
+ /* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: "No endpoints found" }),
80
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "Enter a URL above to connect to a custom endpoint" })
81
+ ] }) }),
82
+ /* @__PURE__ */ jsx(CommandGroup, { heading: "Current", children: /* @__PURE__ */ jsxs(
83
+ CommandItem,
84
+ {
85
+ value: endpoint,
86
+ onSelect: () => handleSelect(endpoint),
87
+ children: [
88
+ /* @__PURE__ */ jsx(Server, { className: "text-primary" }),
89
+ /* @__PURE__ */ jsx("span", { className: "flex-1 font-medium", children: formatEndpoint(endpoint) }),
90
+ /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: "Connected" })
91
+ ]
92
+ }
93
+ ) }),
94
+ recentEndpoints.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
95
+ /* @__PURE__ */ jsx(CommandSeparator, {}),
96
+ /* @__PURE__ */ jsx(CommandGroup, { heading: "Recent", children: recentEndpoints.filter((url) => url !== endpoint).map((url) => /* @__PURE__ */ jsxs(
97
+ CommandItem,
98
+ {
99
+ value: url,
100
+ onSelect: () => handleSelect(url),
101
+ children: [
102
+ /* @__PURE__ */ jsx(History, { className: "text-muted-foreground" }),
103
+ /* @__PURE__ */ jsx("span", { className: "flex-1", children: formatEndpoint(url) })
104
+ ]
105
+ },
106
+ url
107
+ )) })
108
+ ] }),
109
+ /* @__PURE__ */ jsx(CommandSeparator, {}),
110
+ /* @__PURE__ */ jsx(CommandGroup, { heading: "Custom", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 px-2 py-1.5", children: [
111
+ /* @__PURE__ */ jsx(Plus, { className: "size-4 shrink-0 text-muted-foreground" }),
112
+ /* @__PURE__ */ jsx(
113
+ "input",
114
+ {
115
+ type: "text",
116
+ placeholder: "Enter endpoint URL...",
117
+ value: customEndpoint,
118
+ onChange: (e) => setCustomEndpoint(e.target.value),
119
+ onKeyDown: (e) => {
120
+ if (e.key === "Enter") {
121
+ e.preventDefault();
122
+ handleCustomSubmit();
123
+ }
124
+ e.stopPropagation();
125
+ },
126
+ className: "flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground"
127
+ }
128
+ ),
129
+ customEndpoint && /* @__PURE__ */ jsx(
130
+ "button",
131
+ {
132
+ type: "button",
133
+ onClick: handleCustomSubmit,
134
+ className: "rounded-sm bg-primary px-2 py-1 text-xs font-medium text-primary-foreground hover:bg-primary/90",
135
+ children: "Connect"
136
+ }
137
+ )
138
+ ] }) })
139
+ ] })
140
+ ]
141
+ }
142
+ )
143
+ ] });
144
+ }
145
+ function DefaultLink({ href, children, className, onClick }) {
146
+ return /* @__PURE__ */ jsx("a", { href, className, onClick, children });
147
+ }
148
+ function Breadcrumbs({
149
+ items,
150
+ LinkComponent = DefaultLink,
151
+ className,
152
+ maxItems = 4,
153
+ separator
154
+ }) {
155
+ if (!items || items.length === 0) {
156
+ return null;
157
+ }
158
+ const shouldCollapse = items.length > maxItems;
159
+ const visibleItems = shouldCollapse ? [items[0], ...items.slice(-(maxItems - 1))] : items;
160
+ const hiddenItems = shouldCollapse ? items.slice(1, -(maxItems - 1)) : [];
161
+ return /* @__PURE__ */ jsx(Breadcrumb, { className, children: /* @__PURE__ */ jsx(BreadcrumbList, { children: visibleItems.map((item, index) => {
162
+ const isLast = index === visibleItems.length - 1;
163
+ const isFirst = index === 0;
164
+ if (shouldCollapse && isFirst) {
165
+ return /* @__PURE__ */ jsxs(React.Fragment, { children: [
166
+ /* @__PURE__ */ jsx(BreadcrumbItem, { children: item.href ? /* @__PURE__ */ jsx(BreadcrumbLink, { asChild: true, children: /* @__PURE__ */ jsx(LinkComponent, { href: item.href, children: item.label }) }) : /* @__PURE__ */ jsx(BreadcrumbPage, { children: item.label }) }),
167
+ /* @__PURE__ */ jsx(BreadcrumbSeparator, { children: separator }),
168
+ /* @__PURE__ */ jsx(BreadcrumbItem, { children: /* @__PURE__ */ jsxs(DropdownMenu, { children: [
169
+ /* @__PURE__ */ jsx(
170
+ DropdownMenuTrigger,
171
+ {
172
+ className: "flex items-center gap-1 hover:text-foreground",
173
+ "aria-label": "Show hidden breadcrumbs",
174
+ children: /* @__PURE__ */ jsx(BreadcrumbEllipsis, { className: "size-4" })
175
+ }
176
+ ),
177
+ /* @__PURE__ */ jsx(DropdownMenuContent, { align: "start", children: hiddenItems.map((hiddenItem) => /* @__PURE__ */ jsx(DropdownMenuItem, { asChild: true, children: /* @__PURE__ */ jsx(LinkComponent, { href: hiddenItem.href || "#", children: hiddenItem.label }) }, hiddenItem.label)) })
178
+ ] }) }),
179
+ /* @__PURE__ */ jsx(BreadcrumbSeparator, { children: separator })
180
+ ] }, item.label);
181
+ }
182
+ return /* @__PURE__ */ jsxs(React.Fragment, { children: [
183
+ /* @__PURE__ */ jsx(BreadcrumbItem, { children: isLast ? /* @__PURE__ */ jsx(BreadcrumbPage, { children: item.label }) : item.href ? /* @__PURE__ */ jsx(BreadcrumbLink, { asChild: true, children: /* @__PURE__ */ jsx(LinkComponent, { href: item.href, children: item.label }) }) : /* @__PURE__ */ jsx(BreadcrumbPage, { children: item.label }) }),
184
+ !isLast && /* @__PURE__ */ jsx(BreadcrumbSeparator, { children: separator })
185
+ ] }, item.label);
186
+ }) }) });
187
+ }
188
+ Breadcrumbs.displayName = "Breadcrumbs";
189
+
190
+ export { Breadcrumbs, EndpointSelector };
191
+ //# sourceMappingURL=chunk-3XKYQRXY.js.map
192
+ //# sourceMappingURL=chunk-3XKYQRXY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/endpoint-selector.tsx","../src/components/breadcrumbs.tsx"],"names":["jsx","jsxs","React2"],"mappings":"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","file":"chunk-3XKYQRXY.js","sourcesContent":["\"use client\"\n\n/**\n * EndpointSelector Component\n *\n * A command palette-style input for selecting/changing the DO server endpoint.\n * Supports keyboard shortcuts (⌘K on Mac, Ctrl+K on Windows).\n */\n\nimport {\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n Input,\n} from \"@mdxui/primitives\"\nimport { History, Plus, Search, Server } from \"lucide-react\"\nimport * as React from \"react\"\n\nexport interface EndpointSelectorProps {\n /** Current endpoint URL */\n endpoint: string\n /** Callback when endpoint changes */\n onEndpointChange: (endpoint: string) => void\n /** Recent endpoints for quick selection */\n recentEndpoints?: string[]\n /** Placeholder text for the trigger input */\n placeholder?: string\n /** Additional class name for the trigger */\n className?: string\n}\n\n/**\n * Detects if the current platform is Mac\n */\nfunction useIsMac() {\n const [isMac, setIsMac] = React.useState(false)\n\n React.useEffect(() => {\n setIsMac(navigator.platform.toUpperCase().indexOf(\"MAC\") >= 0)\n }, [])\n\n return isMac\n}\n\n/**\n * EndpointSelector - Search-like input that opens a command palette for endpoint selection\n */\nexport function EndpointSelector({\n endpoint,\n onEndpointChange,\n recentEndpoints = [],\n placeholder = \"Connect to DO...\",\n className,\n}: EndpointSelectorProps) {\n const [open, setOpen] = React.useState(false)\n const [customEndpoint, setCustomEndpoint] = React.useState(\"\")\n const isMac = useIsMac()\n\n // Global keyboard shortcut handler\n React.useEffect(() => {\n function handleKeyDown(e: KeyboardEvent) {\n // ⌘K on Mac, Ctrl+K on Windows/Linux\n if ((e.metaKey || e.ctrlKey) && e.key === \"k\") {\n e.preventDefault()\n setOpen((prev) => !prev)\n }\n }\n\n document.addEventListener(\"keydown\", handleKeyDown)\n return () => document.removeEventListener(\"keydown\", handleKeyDown)\n }, [])\n\n // Handle selecting an endpoint\n const handleSelect = (url: string) => {\n onEndpointChange(url)\n setOpen(false)\n setCustomEndpoint(\"\")\n }\n\n // Handle custom endpoint submission\n const handleCustomSubmit = () => {\n if (customEndpoint.trim()) {\n handleSelect(customEndpoint.trim())\n }\n }\n\n // Format endpoint URL for display (show just the hostname)\n const formatEndpoint = (url: string) => {\n try {\n const parsed = new URL(url)\n return parsed.hostname\n } catch {\n return url\n }\n }\n\n return (\n <>\n {/* Trigger - search-like input */}\n <div className={className}>\n <div className=\"relative w-full\">\n <Search className=\"absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n type=\"text\"\n placeholder={placeholder}\n value={formatEndpoint(endpoint)}\n readOnly\n onClick={() => setOpen(true)}\n className=\"w-full cursor-pointer pl-9 pr-12 shadow-none\"\n />\n <kbd className=\"pointer-events-none absolute right-3 top-1/2 hidden -translate-y-1/2 select-none rounded-sm border border-border bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground sm:inline-block\">\n {isMac ? \"⌘K\" : \"Ctrl+K\"}\n </kbd>\n </div>\n </div>\n\n {/* Command Dialog */}\n <CommandDialog\n open={open}\n onOpenChange={setOpen}\n title=\"Connect to DO\"\n description=\"Select a DO server endpoint to connect to\"\n >\n <CommandInput placeholder=\"Search endpoints or enter URL...\" />\n <CommandList>\n <CommandEmpty>\n <div className=\"flex flex-col gap-2 py-2\">\n <p className=\"text-muted-foreground\">No endpoints found</p>\n <p className=\"text-xs text-muted-foreground\">\n Enter a URL above to connect to a custom endpoint\n </p>\n </div>\n </CommandEmpty>\n\n {/* Current endpoint */}\n <CommandGroup heading=\"Current\">\n <CommandItem\n value={endpoint}\n onSelect={() => handleSelect(endpoint)}\n >\n <Server className=\"text-primary\" />\n <span className=\"flex-1 font-medium\">\n {formatEndpoint(endpoint)}\n </span>\n <span className=\"text-xs text-muted-foreground\">Connected</span>\n </CommandItem>\n </CommandGroup>\n\n {/* Recent endpoints */}\n {recentEndpoints.length > 0 && (\n <>\n <CommandSeparator />\n <CommandGroup heading=\"Recent\">\n {recentEndpoints\n .filter((url) => url !== endpoint)\n .map((url) => (\n <CommandItem\n key={url}\n value={url}\n onSelect={() => handleSelect(url)}\n >\n <History className=\"text-muted-foreground\" />\n <span className=\"flex-1\">{formatEndpoint(url)}</span>\n </CommandItem>\n ))}\n </CommandGroup>\n </>\n )}\n\n {/* Custom endpoint entry */}\n <CommandSeparator />\n <CommandGroup heading=\"Custom\">\n <div className=\"flex items-center gap-2 px-2 py-1.5\">\n <Plus className=\"size-4 shrink-0 text-muted-foreground\" />\n <input\n type=\"text\"\n placeholder=\"Enter endpoint URL...\"\n value={customEndpoint}\n onChange={(e) => setCustomEndpoint(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault()\n handleCustomSubmit()\n }\n // Prevent cmdk from handling this\n e.stopPropagation()\n }}\n className=\"flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground\"\n />\n {customEndpoint && (\n <button\n type=\"button\"\n onClick={handleCustomSubmit}\n className=\"rounded-sm bg-primary px-2 py-1 text-xs font-medium text-primary-foreground hover:bg-primary/90\"\n >\n Connect\n </button>\n )}\n </div>\n </CommandGroup>\n </CommandList>\n </CommandDialog>\n </>\n )\n}\n","'use client'\n\n/**\n * Breadcrumbs Component\n *\n * Router-agnostic breadcrumbs that can work with any Link component.\n * Uses @mdxui/primitives breadcrumb components under the hood.\n */\n\nimport {\n Breadcrumb,\n BreadcrumbEllipsis,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@mdxui/primitives'\nimport * as React from 'react'\n\n/**\n * Props for the Link component\n */\nexport interface BreadcrumbLinkProps {\n href: string\n children: React.ReactNode\n className?: string\n onClick?: () => void\n}\n\n/**\n * Single breadcrumb item configuration\n */\nexport interface BreadcrumbItemConfig {\n /** Display label */\n label: string\n /** Route path - last item should not have href */\n href?: string\n}\n\n/**\n * Props for the Breadcrumbs component\n */\nexport interface BreadcrumbsProps {\n /** Array of breadcrumb items */\n items: BreadcrumbItemConfig[]\n /** Custom link component (e.g., Next.js Link, TanStack Link) */\n LinkComponent?: React.ComponentType<BreadcrumbLinkProps>\n /** Additional class names */\n className?: string\n /** Maximum items to show before collapsing */\n maxItems?: number\n /** Custom separator element */\n separator?: React.ReactNode\n}\n\n/**\n * Default link component using a plain anchor tag\n */\nfunction DefaultLink({ href, children, className, onClick }: BreadcrumbLinkProps) {\n return (\n <a href={href} className={className} onClick={onClick}>\n {children}\n </a>\n )\n}\n\n/**\n * Breadcrumbs provides navigation context showing the user's location.\n *\n * Features:\n * - Router-agnostic - works with any Link component\n * - Automatic collapse with dropdown for long paths\n * - Accessible breadcrumb semantics\n * - Custom separator support\n *\n * @example\n * ```tsx\n * // With default anchor tags\n * <Breadcrumbs\n * items={[\n * { label: 'Home', href: '/' },\n * { label: 'Users', href: '/users' },\n * { label: 'John Doe' },\n * ]}\n * />\n *\n * // With TanStack Router Link\n * import { Link } from '@tanstack/react-router'\n *\n * <Breadcrumbs\n * items={breadcrumbItems}\n * LinkComponent={({ href, children, className }) => (\n * <Link to={href} className={className}>{children}</Link>\n * )}\n * />\n *\n * // With Next.js Link\n * import NextLink from 'next/link'\n *\n * <Breadcrumbs\n * items={breadcrumbItems}\n * LinkComponent={NextLink}\n * />\n * ```\n */\nexport function Breadcrumbs({\n items,\n LinkComponent = DefaultLink,\n className,\n maxItems = 4,\n separator,\n}: BreadcrumbsProps) {\n // Handle empty items\n if (!items || items.length === 0) {\n return null\n }\n\n // Determine if we need to collapse items\n const shouldCollapse = items.length > maxItems\n const visibleItems = shouldCollapse\n ? [items[0], ...items.slice(-(maxItems - 1))]\n : items\n const hiddenItems = shouldCollapse\n ? items.slice(1, -(maxItems - 1))\n : []\n\n return (\n <Breadcrumb className={className}>\n <BreadcrumbList>\n {visibleItems.map((item, index) => {\n const isLast = index === visibleItems.length - 1\n const isFirst = index === 0\n\n // Insert ellipsis after first item if collapsing\n if (shouldCollapse && isFirst) {\n return (\n <React.Fragment key={item.label}>\n <BreadcrumbItem>\n {item.href ? (\n <BreadcrumbLink asChild>\n <LinkComponent href={item.href}>{item.label}</LinkComponent>\n </BreadcrumbLink>\n ) : (\n <BreadcrumbPage>{item.label}</BreadcrumbPage>\n )}\n </BreadcrumbItem>\n <BreadcrumbSeparator>{separator}</BreadcrumbSeparator>\n <BreadcrumbItem>\n <DropdownMenu>\n <DropdownMenuTrigger\n className=\"flex items-center gap-1 hover:text-foreground\"\n aria-label=\"Show hidden breadcrumbs\"\n >\n <BreadcrumbEllipsis className=\"size-4\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n {hiddenItems.map((hiddenItem) => (\n <DropdownMenuItem key={hiddenItem.label} asChild>\n <LinkComponent href={hiddenItem.href || '#'}>\n {hiddenItem.label}\n </LinkComponent>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </BreadcrumbItem>\n <BreadcrumbSeparator>{separator}</BreadcrumbSeparator>\n </React.Fragment>\n )\n }\n\n return (\n <React.Fragment key={item.label}>\n <BreadcrumbItem>\n {isLast ? (\n <BreadcrumbPage>{item.label}</BreadcrumbPage>\n ) : item.href ? (\n <BreadcrumbLink asChild>\n <LinkComponent href={item.href}>{item.label}</LinkComponent>\n </BreadcrumbLink>\n ) : (\n <BreadcrumbPage>{item.label}</BreadcrumbPage>\n )}\n </BreadcrumbItem>\n {!isLast && <BreadcrumbSeparator>{separator}</BreadcrumbSeparator>}\n </React.Fragment>\n )\n })}\n </BreadcrumbList>\n </Breadcrumb>\n )\n}\n\nBreadcrumbs.displayName = 'Breadcrumbs'\n"]}
@@ -1,5 +1,5 @@
1
1
  import { thingsKeys } from './chunk-4KXVN3EQ.js';
2
- import { useDO, useDataProviderSafe } from './chunk-FO3N7SXV.js';
2
+ import { useDO, useDataProviderSafe } from './chunk-WMNT4OIE.js';
3
3
  import { ThingFilterSchema, ThingSortSchema, ThingPaginationSchema, ThingCreateInputSchema, ThingUpdateInputSchema, ThingDeleteOptionsSchema } from './chunk-GGO5GW72.js';
4
4
  import { useQuery, useQueryClient, useMutation } from '@tanstack/react-query';
5
5
  import { useMemo } from 'react';
@@ -230,5 +230,5 @@ function useDeleteThing(nsOrParams, type, id) {
230
230
  }
231
231
 
232
232
  export { useCreateThing, useDeleteThing, useThing, useThingVersions, useThings, useTypeStats, useUpdateThing };
233
- //# sourceMappingURL=chunk-JWKIONEO.js.map
234
- //# sourceMappingURL=chunk-JWKIONEO.js.map
233
+ //# sourceMappingURL=chunk-5SHZZC7L.js.map
234
+ //# sourceMappingURL=chunk-5SHZZC7L.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks/things/queries.ts","../src/hooks/things/mutations.ts"],"names":["isThingParams","result"],"mappings":"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","file":"chunk-JWKIONEO.js","sourcesContent":["'use client'\n\n/**\n * Query hooks for Things\n *\n * Provides reactive data access to Things via React Query + @dotdo/client RPC.\n * Automatic caching, background refetching, and cache invalidation.\n */\n\nimport { useQuery } from '@tanstack/react-query'\nimport { useMemo } from 'react'\nimport { useDeepCompareMemo } from 'use-deep-compare'\nimport { useDO } from '../../providers/do-provider'\nimport { thingsKeys } from '../../lib/query-keys'\nimport type {\n Thing,\n ThingFilter,\n ThingSort,\n ThingPagination,\n ThingQueryResult,\n ThingVersion,\n TypeStats,\n} from '../../types'\nimport {\n ThingFilterSchema,\n ThingSortSchema,\n ThingPaginationSchema,\n} from '../../types/schemas'\nimport type {\n UseThingsResult,\n UseThingResult,\n UseThingVersionsResult,\n UseTypeStatsResult,\n ThingParams,\n TypeStatsParams,\n} from './types'\n\n// ============================================================================\n// Helper to detect object-based API usage\n// ============================================================================\n\n/**\n * Type guard to check if argument is a ThingParams object\n */\nfunction isThingParams(arg: unknown): arg is ThingParams {\n return (\n typeof arg === 'object' &&\n arg !== null &&\n 'ns' in arg &&\n 'type' in arg &&\n 'id' in arg &&\n typeof (arg as ThingParams).ns === 'string' &&\n typeof (arg as ThingParams).type === 'string' &&\n typeof (arg as ThingParams).id === 'string'\n )\n}\n\n/**\n * Type guard to check if argument is a TypeStatsParams object\n */\nfunction isTypeStatsParams(arg: unknown): arg is TypeStatsParams {\n return (\n typeof arg === 'object' &&\n arg !== null &&\n 'ns' in arg &&\n 'type' in arg &&\n typeof (arg as TypeStatsParams).ns === 'string' &&\n typeof (arg as TypeStatsParams).type === 'string'\n )\n}\n\n/**\n * Hook to fetch a list of Things\n *\n * Uses React Query for caching with @dotdo/client RPC for data fetching.\n */\nexport function useThings(\n filter: ThingFilter = {},\n sort?: ThingSort,\n pagination?: ThingPagination\n): UseThingsResult {\n const { client, namespace } = useDO()\n\n // Build query key with merged namespace\n // Use deep comparison for object dependencies to avoid unnecessary recomputations\n const queryKey = useDeepCompareMemo(\n () => thingsKeys.list({ ...filter, ns: filter.ns ?? namespace }, sort, pagination),\n [filter, namespace, sort, pagination]\n )\n\n const query = useQuery({\n queryKey,\n queryFn: async () => {\n // Validate inputs before API call\n const validatedFilter = ThingFilterSchema.parse(filter)\n const validatedSort = sort ? ThingSortSchema.parse(sort) : undefined\n const validatedPagination = pagination ? ThingPaginationSchema.parse(pagination) : undefined\n\n // Use @dotdo/client RPC for data fetching\n const result = await (client as any).Thing.list({\n filter: { ...validatedFilter, ns: validatedFilter.ns ?? namespace },\n sort: validatedSort,\n pagination: validatedPagination,\n })\n return result as ThingQueryResult\n },\n })\n\n return {\n data: query.data ?? null,\n isLoading: query.isLoading,\n error: query.error,\n refetch: query.refetch,\n queryKey,\n isRefetching: query.isRefetching,\n isFetching: query.isFetching,\n status: query.status,\n }\n}\n\n/**\n * Hook to fetch a single Thing\n *\n * Uses React Query for caching with @dotdo/client RPC calls.\n *\n * @example Object-based API (preferred)\n * ```tsx\n * const { data } = useThing({ ns: 'default', type: 'Task', id: 'task-123' })\n * ```\n *\n * @example Positional API (deprecated)\n * ```tsx\n * const { data } = useThing('default', 'Task', 'task-123')\n * ```\n */\nexport function useThing(params: ThingParams): UseThingResult\n/**\n * @deprecated Use object-based API: `useThing({ ns, type, id })` instead\n */\nexport function useThing(ns: string, type: string, id: string): UseThingResult\nexport function useThing(\n nsOrParams: string | ThingParams,\n type?: string,\n id?: string\n): UseThingResult {\n // Normalize parameters - support both object and positional APIs\n const ns = isThingParams(nsOrParams) ? nsOrParams.ns : nsOrParams\n const thingType = isThingParams(nsOrParams) ? nsOrParams.type : type!\n const thingId = isThingParams(nsOrParams) ? nsOrParams.id : id!\n\n const { client } = useDO()\n\n const queryKey = useMemo(() => thingsKeys.detail(ns, thingType, thingId), [ns, thingType, thingId])\n\n const query = useQuery({\n queryKey,\n queryFn: async () => {\n const result = await (client as any).Thing.get({ ns, type: thingType, id: thingId })\n return result as Thing\n },\n enabled: Boolean(ns && thingType && thingId),\n })\n\n return {\n data: query.data ?? null,\n isLoading: query.isLoading,\n error: query.error,\n refetch: query.refetch,\n queryKey,\n isRefetching: query.isRefetching,\n isFetching: query.isFetching,\n status: query.status,\n }\n}\n\n/**\n * Hook to fetch Thing version history\n *\n * @example Object-based API (preferred)\n * ```tsx\n * const { data } = useThingVersions({ ns: 'default', type: 'Task', id: 'task-123' })\n * ```\n *\n * @example Positional API (deprecated)\n * ```tsx\n * const { data } = useThingVersions('default', 'Task', 'task-123')\n * ```\n */\nexport function useThingVersions(params: ThingParams): UseThingVersionsResult\n/**\n * @deprecated Use object-based API: `useThingVersions({ ns, type, id })` instead\n */\nexport function useThingVersions(ns: string, type: string, id: string): UseThingVersionsResult\nexport function useThingVersions(\n nsOrParams: string | ThingParams,\n type?: string,\n id?: string\n): UseThingVersionsResult {\n // Normalize parameters - support both object and positional APIs\n const ns = isThingParams(nsOrParams) ? nsOrParams.ns : nsOrParams\n const thingType = isThingParams(nsOrParams) ? nsOrParams.type : type!\n const thingId = isThingParams(nsOrParams) ? nsOrParams.id : id!\n\n const { client } = useDO()\n\n const queryKey = useMemo(() => thingsKeys.versions(ns, thingType, thingId), [ns, thingType, thingId])\n\n const query = useQuery({\n queryKey,\n queryFn: async () => {\n const result = await (client as any).Thing.versions({ ns, type: thingType, id: thingId })\n return result as ThingVersion[]\n },\n enabled: Boolean(ns && thingType && thingId),\n })\n\n return {\n data: query.data ?? null,\n isLoading: query.isLoading,\n error: query.error,\n refetch: query.refetch,\n queryKey,\n isRefetching: query.isRefetching,\n isFetching: query.isFetching,\n status: query.status,\n }\n}\n\n/**\n * Hook to fetch type statistics\n *\n * @example Object-based API (preferred)\n * ```tsx\n * const { data } = useTypeStats({ ns: 'default', type: 'Task' })\n * ```\n *\n * @example Positional API (deprecated)\n * ```tsx\n * const { data } = useTypeStats('default', 'Task')\n * ```\n */\nexport function useTypeStats(params: TypeStatsParams): UseTypeStatsResult\n/**\n * @deprecated Use object-based API: `useTypeStats({ ns, type })` instead\n */\nexport function useTypeStats(ns: string, type: string): UseTypeStatsResult\nexport function useTypeStats(\n nsOrParams: string | TypeStatsParams,\n type?: string\n): UseTypeStatsResult {\n // Normalize parameters - support both object and positional APIs\n const ns = isTypeStatsParams(nsOrParams) ? nsOrParams.ns : nsOrParams\n const thingType = isTypeStatsParams(nsOrParams) ? nsOrParams.type : type!\n\n const { client } = useDO()\n\n const queryKey = useMemo(() => thingsKeys.typeStats(ns, thingType), [ns, thingType])\n\n const query = useQuery({\n queryKey,\n queryFn: async () => {\n const result = await (client as any).Thing.stats({ ns, type: thingType })\n return result as TypeStats\n },\n enabled: Boolean(ns && thingType),\n })\n\n return {\n data: query.data ?? null,\n isLoading: query.isLoading,\n error: query.error,\n refetch: query.refetch,\n queryKey,\n isRefetching: query.isRefetching,\n isFetching: query.isFetching,\n status: query.status,\n }\n}\n","'use client'\n\n/**\n * Mutation hooks for Things\n *\n * Provides create, update, and delete operations with automatic cache invalidation.\n * Uses @dotdo/client RPC for backend communication.\n */\n\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useDO, useDataProviderSafe } from '../../providers/do-provider'\nimport { thingsKeys } from '../../lib/query-keys'\nimport type { Thing, ThingCreateInput, ThingUpdateInput } from '../../types'\nimport {\n ThingCreateInputSchema,\n ThingUpdateInputSchema,\n ThingDeleteOptionsSchema,\n} from '../../types/schemas'\nimport type {\n UseCreateThingResult,\n UseUpdateThingResult,\n UseDeleteThingResult,\n ThingParams,\n} from './types'\n\n// ============================================================================\n// Helper to detect object-based API usage\n// ============================================================================\n\n/**\n * Type guard to check if argument is a ThingParams object\n */\nfunction isThingParams(arg: unknown): arg is ThingParams {\n return (\n typeof arg === 'object' &&\n arg !== null &&\n 'ns' in arg &&\n 'type' in arg &&\n 'id' in arg &&\n typeof (arg as ThingParams).ns === 'string' &&\n typeof (arg as ThingParams).type === 'string' &&\n typeof (arg as ThingParams).id === 'string'\n )\n}\n\n/**\n * Hook to create a Thing\n *\n * Automatically invalidates the things list cache on success.\n *\n * Supports two modes:\n * 1. **DataProvider mode**: Uses DataProvider.create() when available (via DoDataProviderProvider)\n * 2. **RPC mode**: Uses @dotdo/client for backend communication\n */\nexport function useCreateThing(): UseCreateThingResult {\n const { client, namespace } = useDO()\n const queryClient = useQueryClient()\n const dataProvider = useDataProviderSafe()\n\n const mutation = useMutation({\n mutationFn: async (input: ThingCreateInput): Promise<Thing> => {\n // Validate input before API call\n const validatedInput = ThingCreateInputSchema.parse(input)\n\n // Priority 1: Use DataProvider if available\n if (dataProvider) {\n const result = await dataProvider.create<Thing>('Thing', {\n data: {\n type: validatedInput.type,\n name: validatedInput.name,\n data: validatedInput.data,\n ns: validatedInput.ns ?? namespace,\n variant: validatedInput.variant,\n },\n })\n return result.data\n }\n\n // Priority 2: Use @dotdo/client RPC\n // The client is a dynamic proxy - we can call any method\n const result = await (client as any).Thing.create(validatedInput)\n return result as Thing\n },\n onSuccess: () => {\n // Invalidate all things queries to refetch\n queryClient.invalidateQueries({ queryKey: thingsKeys.all })\n },\n })\n\n return {\n mutate: mutation.mutate,\n mutateAsync: mutation.mutateAsync,\n isLoading: mutation.isPending,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n }\n}\n\n/**\n * Hook to update a Thing\n *\n * Automatically invalidates the related cache entries on success.\n *\n * @example Object-based API (preferred)\n * ```tsx\n * const updateThing = useUpdateThing({ ns: 'default', type: 'Task', id: 'task-123' })\n * updateThing.mutate({ name: 'Updated Task' })\n * ```\n */\nexport function useUpdateThing(params: ThingParams): UseUpdateThingResult\n/**\n * @deprecated Use object-based API: `useUpdateThing({ ns, type, id })` instead\n */\nexport function useUpdateThing(ns: string, type: string, id: string): UseUpdateThingResult\nexport function useUpdateThing(\n nsOrParams: string | ThingParams,\n type?: string,\n id?: string\n): UseUpdateThingResult {\n // Normalize parameters - support both object and positional APIs\n const ns = isThingParams(nsOrParams) ? nsOrParams.ns : nsOrParams\n const thingType = isThingParams(nsOrParams) ? nsOrParams.type : type!\n const thingId = isThingParams(nsOrParams) ? nsOrParams.id : id!\n\n const { client } = useDO()\n const queryClient = useQueryClient()\n const dataProvider = useDataProviderSafe()\n\n const mutation = useMutation({\n mutationFn: async (input: ThingUpdateInput): Promise<Thing> => {\n // Validate input before API call\n const validatedInput = ThingUpdateInputSchema.parse(input)\n\n // Priority 1: Use DataProvider if available\n if (dataProvider) {\n const result = await dataProvider.update<Thing>('Thing', {\n id: thingId,\n data: {\n ...validatedInput,\n ns,\n type: thingType,\n },\n })\n return result.data\n }\n\n // Priority 2: Use @dotdo/client RPC\n const result = await (client as any).Thing.update({\n ns,\n type: thingType,\n id: thingId,\n ...validatedInput,\n })\n return result as Thing\n },\n onSuccess: (data) => {\n // Update the cache for this specific thing\n queryClient.setQueryData(thingsKeys.detail(ns, thingType, thingId), data)\n // Invalidate list queries\n queryClient.invalidateQueries({ queryKey: thingsKeys.lists() })\n },\n })\n\n return {\n mutate: mutation.mutate,\n mutateAsync: mutation.mutateAsync,\n isLoading: mutation.isPending,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n }\n}\n\n/**\n * Hook to delete a Thing (soft delete by default)\n *\n * Automatically invalidates the related cache entries on success.\n *\n * @example Object-based API (preferred)\n * ```tsx\n * const deleteThing = useDeleteThing({ ns: 'default', type: 'Task', id: 'task-123' })\n * deleteThing.mutate() // soft delete\n * deleteThing.mutate({ hard: true }) // hard delete\n * ```\n */\nexport function useDeleteThing(params: ThingParams): UseDeleteThingResult\n/**\n * @deprecated Use object-based API: `useDeleteThing({ ns, type, id })` instead\n */\nexport function useDeleteThing(ns: string, type: string, id: string): UseDeleteThingResult\nexport function useDeleteThing(\n nsOrParams: string | ThingParams,\n type?: string,\n id?: string\n): UseDeleteThingResult {\n // Normalize parameters - support both object and positional APIs\n const ns = isThingParams(nsOrParams) ? nsOrParams.ns : nsOrParams\n const thingType = isThingParams(nsOrParams) ? nsOrParams.type : type!\n const thingId = isThingParams(nsOrParams) ? nsOrParams.id : id!\n\n const { client } = useDO()\n const queryClient = useQueryClient()\n const dataProvider = useDataProviderSafe()\n\n const mutation = useMutation({\n mutationFn: async (options?: { hard?: boolean }): Promise<void> => {\n // Validate options before API call\n const validatedOptions = options ? ThingDeleteOptionsSchema.parse(options) : {}\n const hard = validatedOptions.hard ?? false\n\n // Priority 1: Use DataProvider if available (soft delete only)\n if (dataProvider && !hard) {\n await dataProvider.delete('Thing', { id: thingId })\n return\n }\n\n // Priority 2: Use @dotdo/client RPC\n await (client as any).Thing.delete({ ns, type: thingType, id: thingId, hard })\n },\n onSuccess: () => {\n // Remove from cache\n queryClient.removeQueries({ queryKey: thingsKeys.detail(ns, thingType, thingId) })\n // Invalidate list queries\n queryClient.invalidateQueries({ queryKey: thingsKeys.lists() })\n },\n })\n\n return {\n mutate: mutation.mutate,\n mutateAsync: mutation.mutateAsync,\n isLoading: mutation.isPending,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/hooks/things/queries.ts","../src/hooks/things/mutations.ts"],"names":["isThingParams","result"],"mappings":"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","file":"chunk-5SHZZC7L.js","sourcesContent":["'use client'\n\n/**\n * Query hooks for Things\n *\n * Provides reactive data access to Things via React Query + @dotdo/client RPC.\n * Automatic caching, background refetching, and cache invalidation.\n */\n\nimport { useQuery } from '@tanstack/react-query'\nimport { useMemo } from 'react'\nimport { useDeepCompareMemo } from 'use-deep-compare'\nimport { useDO } from '../../providers/do-provider'\nimport { thingsKeys } from '../../lib/query-keys'\nimport type {\n Thing,\n ThingFilter,\n ThingSort,\n ThingPagination,\n ThingQueryResult,\n ThingVersion,\n TypeStats,\n} from '../../types'\nimport {\n ThingFilterSchema,\n ThingSortSchema,\n ThingPaginationSchema,\n} from '../../types/schemas'\nimport type {\n UseThingsResult,\n UseThingResult,\n UseThingVersionsResult,\n UseTypeStatsResult,\n ThingParams,\n TypeStatsParams,\n} from './types'\n\n// ============================================================================\n// Helper to detect object-based API usage\n// ============================================================================\n\n/**\n * Type guard to check if argument is a ThingParams object\n */\nfunction isThingParams(arg: unknown): arg is ThingParams {\n return (\n typeof arg === 'object' &&\n arg !== null &&\n 'ns' in arg &&\n 'type' in arg &&\n 'id' in arg &&\n typeof (arg as ThingParams).ns === 'string' &&\n typeof (arg as ThingParams).type === 'string' &&\n typeof (arg as ThingParams).id === 'string'\n )\n}\n\n/**\n * Type guard to check if argument is a TypeStatsParams object\n */\nfunction isTypeStatsParams(arg: unknown): arg is TypeStatsParams {\n return (\n typeof arg === 'object' &&\n arg !== null &&\n 'ns' in arg &&\n 'type' in arg &&\n typeof (arg as TypeStatsParams).ns === 'string' &&\n typeof (arg as TypeStatsParams).type === 'string'\n )\n}\n\n/**\n * Hook to fetch a list of Things\n *\n * Uses React Query for caching with @dotdo/client RPC for data fetching.\n */\nexport function useThings(\n filter: ThingFilter = {},\n sort?: ThingSort,\n pagination?: ThingPagination\n): UseThingsResult {\n const { client, namespace } = useDO()\n\n // Build query key with merged namespace\n // Use deep comparison for object dependencies to avoid unnecessary recomputations\n const queryKey = useDeepCompareMemo(\n () => thingsKeys.list({ ...filter, ns: filter.ns ?? namespace }, sort, pagination),\n [filter, namespace, sort, pagination]\n )\n\n const query = useQuery({\n queryKey,\n queryFn: async () => {\n // Validate inputs before API call\n const validatedFilter = ThingFilterSchema.parse(filter)\n const validatedSort = sort ? ThingSortSchema.parse(sort) : undefined\n const validatedPagination = pagination ? ThingPaginationSchema.parse(pagination) : undefined\n\n // Use @dotdo/client RPC for data fetching\n const result = await (client as any).Thing.list({\n filter: { ...validatedFilter, ns: validatedFilter.ns ?? namespace },\n sort: validatedSort,\n pagination: validatedPagination,\n })\n return result as ThingQueryResult\n },\n })\n\n return {\n data: query.data ?? null,\n isLoading: query.isLoading,\n error: query.error,\n refetch: query.refetch,\n queryKey,\n isRefetching: query.isRefetching,\n isFetching: query.isFetching,\n status: query.status,\n }\n}\n\n/**\n * Hook to fetch a single Thing\n *\n * Uses React Query for caching with @dotdo/client RPC calls.\n *\n * @example Object-based API (preferred)\n * ```tsx\n * const { data } = useThing({ ns: 'default', type: 'Task', id: 'task-123' })\n * ```\n *\n * @example Positional API (deprecated)\n * ```tsx\n * const { data } = useThing('default', 'Task', 'task-123')\n * ```\n */\nexport function useThing(params: ThingParams): UseThingResult\n/**\n * @deprecated Use object-based API: `useThing({ ns, type, id })` instead\n */\nexport function useThing(ns: string, type: string, id: string): UseThingResult\nexport function useThing(\n nsOrParams: string | ThingParams,\n type?: string,\n id?: string\n): UseThingResult {\n // Normalize parameters - support both object and positional APIs\n const ns = isThingParams(nsOrParams) ? nsOrParams.ns : nsOrParams\n const thingType = isThingParams(nsOrParams) ? nsOrParams.type : type!\n const thingId = isThingParams(nsOrParams) ? nsOrParams.id : id!\n\n const { client } = useDO()\n\n const queryKey = useMemo(() => thingsKeys.detail(ns, thingType, thingId), [ns, thingType, thingId])\n\n const query = useQuery({\n queryKey,\n queryFn: async () => {\n const result = await (client as any).Thing.get({ ns, type: thingType, id: thingId })\n return result as Thing\n },\n enabled: Boolean(ns && thingType && thingId),\n })\n\n return {\n data: query.data ?? null,\n isLoading: query.isLoading,\n error: query.error,\n refetch: query.refetch,\n queryKey,\n isRefetching: query.isRefetching,\n isFetching: query.isFetching,\n status: query.status,\n }\n}\n\n/**\n * Hook to fetch Thing version history\n *\n * @example Object-based API (preferred)\n * ```tsx\n * const { data } = useThingVersions({ ns: 'default', type: 'Task', id: 'task-123' })\n * ```\n *\n * @example Positional API (deprecated)\n * ```tsx\n * const { data } = useThingVersions('default', 'Task', 'task-123')\n * ```\n */\nexport function useThingVersions(params: ThingParams): UseThingVersionsResult\n/**\n * @deprecated Use object-based API: `useThingVersions({ ns, type, id })` instead\n */\nexport function useThingVersions(ns: string, type: string, id: string): UseThingVersionsResult\nexport function useThingVersions(\n nsOrParams: string | ThingParams,\n type?: string,\n id?: string\n): UseThingVersionsResult {\n // Normalize parameters - support both object and positional APIs\n const ns = isThingParams(nsOrParams) ? nsOrParams.ns : nsOrParams\n const thingType = isThingParams(nsOrParams) ? nsOrParams.type : type!\n const thingId = isThingParams(nsOrParams) ? nsOrParams.id : id!\n\n const { client } = useDO()\n\n const queryKey = useMemo(() => thingsKeys.versions(ns, thingType, thingId), [ns, thingType, thingId])\n\n const query = useQuery({\n queryKey,\n queryFn: async () => {\n const result = await (client as any).Thing.versions({ ns, type: thingType, id: thingId })\n return result as ThingVersion[]\n },\n enabled: Boolean(ns && thingType && thingId),\n })\n\n return {\n data: query.data ?? null,\n isLoading: query.isLoading,\n error: query.error,\n refetch: query.refetch,\n queryKey,\n isRefetching: query.isRefetching,\n isFetching: query.isFetching,\n status: query.status,\n }\n}\n\n/**\n * Hook to fetch type statistics\n *\n * @example Object-based API (preferred)\n * ```tsx\n * const { data } = useTypeStats({ ns: 'default', type: 'Task' })\n * ```\n *\n * @example Positional API (deprecated)\n * ```tsx\n * const { data } = useTypeStats('default', 'Task')\n * ```\n */\nexport function useTypeStats(params: TypeStatsParams): UseTypeStatsResult\n/**\n * @deprecated Use object-based API: `useTypeStats({ ns, type })` instead\n */\nexport function useTypeStats(ns: string, type: string): UseTypeStatsResult\nexport function useTypeStats(\n nsOrParams: string | TypeStatsParams,\n type?: string\n): UseTypeStatsResult {\n // Normalize parameters - support both object and positional APIs\n const ns = isTypeStatsParams(nsOrParams) ? nsOrParams.ns : nsOrParams\n const thingType = isTypeStatsParams(nsOrParams) ? nsOrParams.type : type!\n\n const { client } = useDO()\n\n const queryKey = useMemo(() => thingsKeys.typeStats(ns, thingType), [ns, thingType])\n\n const query = useQuery({\n queryKey,\n queryFn: async () => {\n const result = await (client as any).Thing.stats({ ns, type: thingType })\n return result as TypeStats\n },\n enabled: Boolean(ns && thingType),\n })\n\n return {\n data: query.data ?? null,\n isLoading: query.isLoading,\n error: query.error,\n refetch: query.refetch,\n queryKey,\n isRefetching: query.isRefetching,\n isFetching: query.isFetching,\n status: query.status,\n }\n}\n","'use client'\n\n/**\n * Mutation hooks for Things\n *\n * Provides create, update, and delete operations with automatic cache invalidation.\n * Uses @dotdo/client RPC for backend communication.\n */\n\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useDO, useDataProviderSafe } from '../../providers/do-provider'\nimport { thingsKeys } from '../../lib/query-keys'\nimport type { Thing, ThingCreateInput, ThingUpdateInput } from '../../types'\nimport {\n ThingCreateInputSchema,\n ThingUpdateInputSchema,\n ThingDeleteOptionsSchema,\n} from '../../types/schemas'\nimport type {\n UseCreateThingResult,\n UseUpdateThingResult,\n UseDeleteThingResult,\n ThingParams,\n} from './types'\n\n// ============================================================================\n// Helper to detect object-based API usage\n// ============================================================================\n\n/**\n * Type guard to check if argument is a ThingParams object\n */\nfunction isThingParams(arg: unknown): arg is ThingParams {\n return (\n typeof arg === 'object' &&\n arg !== null &&\n 'ns' in arg &&\n 'type' in arg &&\n 'id' in arg &&\n typeof (arg as ThingParams).ns === 'string' &&\n typeof (arg as ThingParams).type === 'string' &&\n typeof (arg as ThingParams).id === 'string'\n )\n}\n\n/**\n * Hook to create a Thing\n *\n * Automatically invalidates the things list cache on success.\n *\n * Supports two modes:\n * 1. **DataProvider mode**: Uses DataProvider.create() when available (via DoDataProviderProvider)\n * 2. **RPC mode**: Uses @dotdo/client for backend communication\n */\nexport function useCreateThing(): UseCreateThingResult {\n const { client, namespace } = useDO()\n const queryClient = useQueryClient()\n const dataProvider = useDataProviderSafe()\n\n const mutation = useMutation({\n mutationFn: async (input: ThingCreateInput): Promise<Thing> => {\n // Validate input before API call\n const validatedInput = ThingCreateInputSchema.parse(input)\n\n // Priority 1: Use DataProvider if available\n if (dataProvider) {\n const result = await dataProvider.create<Thing>('Thing', {\n data: {\n type: validatedInput.type,\n name: validatedInput.name,\n data: validatedInput.data,\n ns: validatedInput.ns ?? namespace,\n variant: validatedInput.variant,\n },\n })\n return result.data\n }\n\n // Priority 2: Use @dotdo/client RPC\n // The client is a dynamic proxy - we can call any method\n const result = await (client as any).Thing.create(validatedInput)\n return result as Thing\n },\n onSuccess: () => {\n // Invalidate all things queries to refetch\n queryClient.invalidateQueries({ queryKey: thingsKeys.all })\n },\n })\n\n return {\n mutate: mutation.mutate,\n mutateAsync: mutation.mutateAsync,\n isLoading: mutation.isPending,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n }\n}\n\n/**\n * Hook to update a Thing\n *\n * Automatically invalidates the related cache entries on success.\n *\n * @example Object-based API (preferred)\n * ```tsx\n * const updateThing = useUpdateThing({ ns: 'default', type: 'Task', id: 'task-123' })\n * updateThing.mutate({ name: 'Updated Task' })\n * ```\n */\nexport function useUpdateThing(params: ThingParams): UseUpdateThingResult\n/**\n * @deprecated Use object-based API: `useUpdateThing({ ns, type, id })` instead\n */\nexport function useUpdateThing(ns: string, type: string, id: string): UseUpdateThingResult\nexport function useUpdateThing(\n nsOrParams: string | ThingParams,\n type?: string,\n id?: string\n): UseUpdateThingResult {\n // Normalize parameters - support both object and positional APIs\n const ns = isThingParams(nsOrParams) ? nsOrParams.ns : nsOrParams\n const thingType = isThingParams(nsOrParams) ? nsOrParams.type : type!\n const thingId = isThingParams(nsOrParams) ? nsOrParams.id : id!\n\n const { client } = useDO()\n const queryClient = useQueryClient()\n const dataProvider = useDataProviderSafe()\n\n const mutation = useMutation({\n mutationFn: async (input: ThingUpdateInput): Promise<Thing> => {\n // Validate input before API call\n const validatedInput = ThingUpdateInputSchema.parse(input)\n\n // Priority 1: Use DataProvider if available\n if (dataProvider) {\n const result = await dataProvider.update<Thing>('Thing', {\n id: thingId,\n data: {\n ...validatedInput,\n ns,\n type: thingType,\n },\n })\n return result.data\n }\n\n // Priority 2: Use @dotdo/client RPC\n const result = await (client as any).Thing.update({\n ns,\n type: thingType,\n id: thingId,\n ...validatedInput,\n })\n return result as Thing\n },\n onSuccess: (data) => {\n // Update the cache for this specific thing\n queryClient.setQueryData(thingsKeys.detail(ns, thingType, thingId), data)\n // Invalidate list queries\n queryClient.invalidateQueries({ queryKey: thingsKeys.lists() })\n },\n })\n\n return {\n mutate: mutation.mutate,\n mutateAsync: mutation.mutateAsync,\n isLoading: mutation.isPending,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n }\n}\n\n/**\n * Hook to delete a Thing (soft delete by default)\n *\n * Automatically invalidates the related cache entries on success.\n *\n * @example Object-based API (preferred)\n * ```tsx\n * const deleteThing = useDeleteThing({ ns: 'default', type: 'Task', id: 'task-123' })\n * deleteThing.mutate() // soft delete\n * deleteThing.mutate({ hard: true }) // hard delete\n * ```\n */\nexport function useDeleteThing(params: ThingParams): UseDeleteThingResult\n/**\n * @deprecated Use object-based API: `useDeleteThing({ ns, type, id })` instead\n */\nexport function useDeleteThing(ns: string, type: string, id: string): UseDeleteThingResult\nexport function useDeleteThing(\n nsOrParams: string | ThingParams,\n type?: string,\n id?: string\n): UseDeleteThingResult {\n // Normalize parameters - support both object and positional APIs\n const ns = isThingParams(nsOrParams) ? nsOrParams.ns : nsOrParams\n const thingType = isThingParams(nsOrParams) ? nsOrParams.type : type!\n const thingId = isThingParams(nsOrParams) ? nsOrParams.id : id!\n\n const { client } = useDO()\n const queryClient = useQueryClient()\n const dataProvider = useDataProviderSafe()\n\n const mutation = useMutation({\n mutationFn: async (options?: { hard?: boolean }): Promise<void> => {\n // Validate options before API call\n const validatedOptions = options ? ThingDeleteOptionsSchema.parse(options) : {}\n const hard = validatedOptions.hard ?? false\n\n // Priority 1: Use DataProvider if available (soft delete only)\n if (dataProvider && !hard) {\n await dataProvider.delete('Thing', { id: thingId })\n return\n }\n\n // Priority 2: Use @dotdo/client RPC\n await (client as any).Thing.delete({ ns, type: thingType, id: thingId, hard })\n },\n onSuccess: () => {\n // Remove from cache\n queryClient.removeQueries({ queryKey: thingsKeys.detail(ns, thingType, thingId) })\n // Invalidate list queries\n queryClient.invalidateQueries({ queryKey: thingsKeys.lists() })\n },\n })\n\n return {\n mutate: mutation.mutate,\n mutateAsync: mutation.mutateAsync,\n isLoading: mutation.isPending,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n }\n}\n"]}
@@ -1,12 +1,12 @@
1
- import { useNamespaces, useTypes } from './chunk-IESVTECE.js';
2
- import { useCreateThing, useThings, useThing, useUpdateThing, useDeleteThing } from './chunk-JWKIONEO.js';
3
- import { useDO } from './chunk-FO3N7SXV.js';
1
+ import { useNamespaces, useTypes } from './chunk-NA652ART.js';
2
+ import { useCreateThing, useThings, useThing, useUpdateThing, useDeleteThing } from './chunk-5SHZZC7L.js';
3
+ import { useDO } from './chunk-WMNT4OIE.js';
4
4
  import { cn } from './chunk-Y52IEYVM.js';
5
5
  import * as React4 from 'react';
6
6
  import { parseQuery, applyQueryFilter, DataSidebar, DataSidebarTrigger, QuerySearch, ViewSwitcher, DataFilterPopover, DatabaseListView, DatabaseTableView, DatabaseCardView, DatabaseCodeView, applyFilters, useEditHistory, DatabaseSidebar, TableEditorToolbar, DatabaseGrid, QueryView, FormatView, ColumnEditorPanel, TableCreatorPanel, DocumentSidebar, DocumentViewToolbar, DocumentEditor, FunctionSidebar, FunctionViewToolbar, SDKEditor } from '@mdxui/admin';
7
7
  export { DataFilterPopover, DataSidebar, DataSidebarTrigger, FILTER_OPERATOR_OPTIONS } from '@mdxui/admin';
8
8
  import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, Label, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, Input, Textarea, DialogFooter, Button, Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription, Badge, ScrollArea, SheetFooter, Tooltip, TooltipTrigger, TooltipContent, TooltipProvider, AlertDialog, AlertDialogTrigger, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuCheckboxItem, DropdownMenuItem, Toaster } from '@mdxui/primitives';
9
- import { Hash, Save, Pencil, Copy, X, Trash2, Columns3, Plus, MoreVertical, Download, RefreshCw, Database, ExternalLink, Calendar, Clock } from 'lucide-react';
9
+ import { Hash, Save, Pencil, Copy, Shapes, X, Trash2, Columns3, Plus, MoreVertical, Download, RefreshCw, Database, ExternalLink, Calendar, Clock } from 'lucide-react';
10
10
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
11
11
  import { toast } from 'sonner';
12
12
 
@@ -439,9 +439,7 @@ function DataBrowserView({
439
439
  className
440
440
  }) {
441
441
  const { namespace: contextNamespace, client } = useDO();
442
- const [selectedNamespace, setSelectedNamespace] = React4.useState(
443
- initialNamespace ?? contextNamespace
444
- );
442
+ const selectedNamespace = initialNamespace ?? contextNamespace;
445
443
  const [selectedType, setSelectedType] = React4.useState(
446
444
  initialType
447
445
  );
@@ -458,7 +456,7 @@ function DataBrowserView({
458
456
  const [hiddenColumns, setHiddenColumns] = React4.useState(
459
457
  /* @__PURE__ */ new Set()
460
458
  );
461
- const { data: namespaces, error: namespacesError } = useNamespaces();
459
+ const { error: namespacesError } = useNamespaces();
462
460
  const { data: types, error: typesError } = useTypes({ ns: selectedNamespace });
463
461
  const filter = React4.useMemo(() => {
464
462
  const f = { ns: selectedNamespace };
@@ -585,7 +583,13 @@ function DataBrowserView({
585
583
  DataSidebar,
586
584
  {
587
585
  title: "Types",
588
- items: types?.map((t) => ({ id: t.id, name: t.name, label: t.label })),
586
+ items: types?.map(
587
+ (t) => ({
588
+ id: t.id,
589
+ name: t.name,
590
+ label: t.label
591
+ })
592
+ ),
589
593
  selectedItem: selectedType,
590
594
  onSelectItem: setSelectedType,
591
595
  collapsed: sidebarCollapsed,
@@ -604,20 +608,8 @@ function DataBrowserView({
604
608
  onToggle: () => setSidebarCollapsed(!sidebarCollapsed)
605
609
  }
606
610
  ),
607
- /* @__PURE__ */ jsx(
608
- "select",
609
- {
610
- value: selectedNamespace,
611
- onChange: (e) => {
612
- setSelectedNamespace(e.target.value);
613
- setSelectedType(void 0);
614
- },
615
- className: "h-8 rounded-md border border-input bg-background px-2 text-sm",
616
- children: namespaces?.map((ns) => /* @__PURE__ */ jsx("option", { value: ns.name, children: ns.name }, ns.id))
617
- }
618
- ),
619
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "/" }),
620
- /* @__PURE__ */ jsx("span", { className: "font-medium text-sm", children: selectedType ?? "All Types" })
611
+ /* @__PURE__ */ jsx(Shapes, { className: "h-4 w-4 text-muted-foreground hidden sm:block" }),
612
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold hidden sm:inline", children: selectedType ?? "All Things" })
621
613
  ] }),
622
614
  /* @__PURE__ */ jsx("div", { className: "hidden sm:flex flex-1" }),
623
615
  /* @__PURE__ */ jsx(
@@ -1142,14 +1134,23 @@ function DataGridView({
1142
1134
  async (newRow) => {
1143
1135
  if (readOnly || !selectedType) return;
1144
1136
  try {
1137
+ const name = newRow.name || `New ${selectedType}`;
1138
+ const cleanData = {};
1139
+ for (const [key, value] of Object.entries(newRow)) {
1140
+ if (["id", "createdAt", "updatedAt", "_ns", "_type"].includes(key)) continue;
1141
+ if (value === null || value === void 0) continue;
1142
+ cleanData[key] = value;
1143
+ }
1145
1144
  await client.Thing.create({
1146
1145
  ns: selectedNamespace,
1147
1146
  type: selectedType,
1148
- data: newRow
1147
+ name,
1148
+ data: cleanData
1149
1149
  });
1150
1150
  await refetch();
1151
1151
  toast.success("Row added successfully");
1152
1152
  } catch (err) {
1153
+ console.error("[@mdxui/do] Failed to create row:", err);
1153
1154
  toast.error(`Failed to create row: ${err instanceof Error ? err.message : "Unknown error"}`);
1154
1155
  }
1155
1156
  },
@@ -1384,16 +1385,18 @@ function DataGridView({
1384
1385
  },
1385
1386
  onDuplicateRow: async (_rowId, row) => {
1386
1387
  if (!selectedType) return;
1387
- const { id, _ns, _type, ...data } = row;
1388
+ const { id, _ns, _type, name, ...data } = row;
1388
1389
  try {
1389
1390
  await client.Thing.create({
1390
1391
  ns: selectedNamespace,
1391
1392
  type: selectedType,
1393
+ name: `${name || selectedType} (copy)`,
1392
1394
  data
1393
1395
  });
1394
1396
  await refetch();
1395
1397
  toast.success("Row duplicated");
1396
1398
  } catch (err) {
1399
+ console.error("[@mdxui/do] Failed to duplicate row:", err);
1397
1400
  toast.error(`Failed to duplicate row: ${err instanceof Error ? err.message : "Unknown error"}`);
1398
1401
  }
1399
1402
  },
@@ -1987,5 +1990,5 @@ function FunctionEditorView({
1987
1990
  FunctionEditorView.displayName = "FunctionEditorView";
1988
1991
 
1989
1992
  export { CreateDialog, DataBrowserView, DataGridView, DetailSheet, DocumentEditorView, FunctionEditorView, exportToJSON, formatDate, formatFieldName, isISODateString };
1990
- //# sourceMappingURL=chunk-YGIBMNRH.js.map
1991
- //# sourceMappingURL=chunk-YGIBMNRH.js.map
1993
+ //# sourceMappingURL=chunk-7UFINK3Q.js.map
1994
+ //# sourceMappingURL=chunk-7UFINK3Q.js.map