@actuate-media/cms-admin 0.1.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 (295) hide show
  1. package/dist/AdminRoot.d.ts +21 -0
  2. package/dist/AdminRoot.d.ts.map +1 -0
  3. package/dist/AdminRoot.js +136 -0
  4. package/dist/AdminRoot.js.map +1 -0
  5. package/dist/components/Breadcrumbs.d.ts +6 -0
  6. package/dist/components/Breadcrumbs.d.ts.map +1 -0
  7. package/dist/components/Breadcrumbs.js +52 -0
  8. package/dist/components/Breadcrumbs.js.map +1 -0
  9. package/dist/components/CommandPalette.d.ts +7 -0
  10. package/dist/components/CommandPalette.d.ts.map +1 -0
  11. package/dist/components/CommandPalette.js +152 -0
  12. package/dist/components/CommandPalette.js.map +1 -0
  13. package/dist/components/ErrorBoundary.d.ts +17 -0
  14. package/dist/components/ErrorBoundary.d.ts.map +1 -0
  15. package/dist/components/ErrorBoundary.js +24 -0
  16. package/dist/components/ErrorBoundary.js.map +1 -0
  17. package/dist/components/FocalPointPicker.d.ts +9 -0
  18. package/dist/components/FocalPointPicker.d.ts.map +1 -0
  19. package/dist/components/FocalPointPicker.js +19 -0
  20. package/dist/components/FocalPointPicker.js.map +1 -0
  21. package/dist/components/FolderTree.d.ts +28 -0
  22. package/dist/components/FolderTree.d.ts.map +1 -0
  23. package/dist/components/FolderTree.js +198 -0
  24. package/dist/components/FolderTree.js.map +1 -0
  25. package/dist/components/LivePreview.d.ts +10 -0
  26. package/dist/components/LivePreview.d.ts.map +1 -0
  27. package/dist/components/LivePreview.js +62 -0
  28. package/dist/components/LivePreview.js.map +1 -0
  29. package/dist/components/LocaleProvider.d.ts +28 -0
  30. package/dist/components/LocaleProvider.d.ts.map +1 -0
  31. package/dist/components/LocaleProvider.js +29 -0
  32. package/dist/components/LocaleProvider.js.map +1 -0
  33. package/dist/components/LocaleSwitcher.d.ts +2 -0
  34. package/dist/components/LocaleSwitcher.d.ts.map +1 -0
  35. package/dist/components/LocaleSwitcher.js +13 -0
  36. package/dist/components/LocaleSwitcher.js.map +1 -0
  37. package/dist/components/MediaPickerModal.d.ts +8 -0
  38. package/dist/components/MediaPickerModal.d.ts.map +1 -0
  39. package/dist/components/MediaPickerModal.js +53 -0
  40. package/dist/components/MediaPickerModal.js.map +1 -0
  41. package/dist/components/PresenceIndicator.d.ts +7 -0
  42. package/dist/components/PresenceIndicator.d.ts.map +1 -0
  43. package/dist/components/PresenceIndicator.js +37 -0
  44. package/dist/components/PresenceIndicator.js.map +1 -0
  45. package/dist/components/SEOPanel.d.ts +26 -0
  46. package/dist/components/SEOPanel.d.ts.map +1 -0
  47. package/dist/components/SEOPanel.js +249 -0
  48. package/dist/components/SEOPanel.js.map +1 -0
  49. package/dist/components/ThemeProvider.d.ts +13 -0
  50. package/dist/components/ThemeProvider.d.ts.map +1 -0
  51. package/dist/components/ThemeProvider.js +62 -0
  52. package/dist/components/ThemeProvider.js.map +1 -0
  53. package/dist/components/TipTapEditor.d.ts +9 -0
  54. package/dist/components/TipTapEditor.d.ts.map +1 -0
  55. package/dist/components/TipTapEditor.js +167 -0
  56. package/dist/components/TipTapEditor.js.map +1 -0
  57. package/dist/components/VersionHistory.d.ts +9 -0
  58. package/dist/components/VersionHistory.d.ts.map +1 -0
  59. package/dist/components/VersionHistory.js +70 -0
  60. package/dist/components/VersionHistory.js.map +1 -0
  61. package/dist/components/ui/Avatar.d.ts +9 -0
  62. package/dist/components/ui/Avatar.d.ts.map +1 -0
  63. package/dist/components/ui/Avatar.js +21 -0
  64. package/dist/components/ui/Avatar.js.map +1 -0
  65. package/dist/components/ui/Badge.d.ts +5 -0
  66. package/dist/components/ui/Badge.d.ts.map +1 -0
  67. package/dist/components/ui/Badge.js +17 -0
  68. package/dist/components/ui/Badge.js.map +1 -0
  69. package/dist/components/ui/Button.d.ts +12 -0
  70. package/dist/components/ui/Button.d.ts.map +1 -0
  71. package/dist/components/ui/Button.js +17 -0
  72. package/dist/components/ui/Button.js.map +1 -0
  73. package/dist/components/ui/CommandPalette.d.ts +14 -0
  74. package/dist/components/ui/CommandPalette.d.ts.map +1 -0
  75. package/dist/components/ui/CommandPalette.js +52 -0
  76. package/dist/components/ui/CommandPalette.js.map +1 -0
  77. package/dist/components/ui/ConfirmDialog.d.ts +12 -0
  78. package/dist/components/ui/ConfirmDialog.d.ts.map +1 -0
  79. package/dist/components/ui/ConfirmDialog.js +11 -0
  80. package/dist/components/ui/ConfirmDialog.js.map +1 -0
  81. package/dist/components/ui/DataTable.d.ts +30 -0
  82. package/dist/components/ui/DataTable.d.ts.map +1 -0
  83. package/dist/components/ui/DataTable.js +40 -0
  84. package/dist/components/ui/DataTable.js.map +1 -0
  85. package/dist/components/ui/EmptyState.d.ts +10 -0
  86. package/dist/components/ui/EmptyState.d.ts.map +1 -0
  87. package/dist/components/ui/EmptyState.js +6 -0
  88. package/dist/components/ui/EmptyState.js.map +1 -0
  89. package/dist/components/ui/Modal.d.ts +10 -0
  90. package/dist/components/ui/Modal.d.ts.map +1 -0
  91. package/dist/components/ui/Modal.js +19 -0
  92. package/dist/components/ui/Modal.js.map +1 -0
  93. package/dist/components/ui/Pagination.d.ts +9 -0
  94. package/dist/components/ui/Pagination.d.ts.map +1 -0
  95. package/dist/components/ui/Pagination.js +21 -0
  96. package/dist/components/ui/Pagination.js.map +1 -0
  97. package/dist/components/ui/SearchInput.d.ts +7 -0
  98. package/dist/components/ui/SearchInput.d.ts.map +1 -0
  99. package/dist/components/ui/SearchInput.js +6 -0
  100. package/dist/components/ui/SearchInput.js.map +1 -0
  101. package/dist/components/ui/Skeleton.d.ts +9 -0
  102. package/dist/components/ui/Skeleton.d.ts.map +1 -0
  103. package/dist/components/ui/Skeleton.js +11 -0
  104. package/dist/components/ui/Skeleton.js.map +1 -0
  105. package/dist/components/ui/Toast.d.ts +18 -0
  106. package/dist/components/ui/Toast.d.ts.map +1 -0
  107. package/dist/components/ui/Toast.js +29 -0
  108. package/dist/components/ui/Toast.js.map +1 -0
  109. package/dist/components/ui/index.d.ts +25 -0
  110. package/dist/components/ui/index.d.ts.map +1 -0
  111. package/dist/components/ui/index.js +13 -0
  112. package/dist/components/ui/index.js.map +1 -0
  113. package/dist/fields/ArrayField.d.ts +9 -0
  114. package/dist/fields/ArrayField.d.ts.map +1 -0
  115. package/dist/fields/ArrayField.js +21 -0
  116. package/dist/fields/ArrayField.js.map +1 -0
  117. package/dist/fields/BlockBuilderField.d.ts +16 -0
  118. package/dist/fields/BlockBuilderField.d.ts.map +1 -0
  119. package/dist/fields/BlockBuilderField.js +110 -0
  120. package/dist/fields/BlockBuilderField.js.map +1 -0
  121. package/dist/fields/DateField.d.ts +9 -0
  122. package/dist/fields/DateField.d.ts.map +1 -0
  123. package/dist/fields/DateField.js +6 -0
  124. package/dist/fields/DateField.js.map +1 -0
  125. package/dist/fields/FieldRenderer.d.ts +22 -0
  126. package/dist/fields/FieldRenderer.d.ts.map +1 -0
  127. package/dist/fields/FieldRenderer.js +38 -0
  128. package/dist/fields/FieldRenderer.js.map +1 -0
  129. package/dist/fields/GroupField.d.ts +8 -0
  130. package/dist/fields/GroupField.d.ts.map +1 -0
  131. package/dist/fields/GroupField.js +8 -0
  132. package/dist/fields/GroupField.js.map +1 -0
  133. package/dist/fields/MediaField.d.ts +13 -0
  134. package/dist/fields/MediaField.d.ts.map +1 -0
  135. package/dist/fields/MediaField.js +6 -0
  136. package/dist/fields/MediaField.js.map +1 -0
  137. package/dist/fields/NavBuilderField.d.ts +15 -0
  138. package/dist/fields/NavBuilderField.d.ts.map +1 -0
  139. package/dist/fields/NavBuilderField.js +19 -0
  140. package/dist/fields/NavBuilderField.js.map +1 -0
  141. package/dist/fields/NumberField.d.ts +12 -0
  142. package/dist/fields/NumberField.d.ts.map +1 -0
  143. package/dist/fields/NumberField.js +6 -0
  144. package/dist/fields/NumberField.js.map +1 -0
  145. package/dist/fields/RelationshipField.d.ts +13 -0
  146. package/dist/fields/RelationshipField.d.ts.map +1 -0
  147. package/dist/fields/RelationshipField.js +119 -0
  148. package/dist/fields/RelationshipField.js.map +1 -0
  149. package/dist/fields/RichTextField.d.ts +9 -0
  150. package/dist/fields/RichTextField.d.ts.map +1 -0
  151. package/dist/fields/RichTextField.js +7 -0
  152. package/dist/fields/RichTextField.js.map +1 -0
  153. package/dist/fields/SelectField.d.ts +11 -0
  154. package/dist/fields/SelectField.d.ts.map +1 -0
  155. package/dist/fields/SelectField.js +31 -0
  156. package/dist/fields/SelectField.js.map +1 -0
  157. package/dist/fields/SlugField.d.ts +10 -0
  158. package/dist/fields/SlugField.d.ts.map +1 -0
  159. package/dist/fields/SlugField.js +15 -0
  160. package/dist/fields/SlugField.js.map +1 -0
  161. package/dist/fields/TextField.d.ts +11 -0
  162. package/dist/fields/TextField.d.ts.map +1 -0
  163. package/dist/fields/TextField.js +8 -0
  164. package/dist/fields/TextField.js.map +1 -0
  165. package/dist/fields/ToggleField.d.ts +8 -0
  166. package/dist/fields/ToggleField.d.ts.map +1 -0
  167. package/dist/fields/ToggleField.js +6 -0
  168. package/dist/fields/ToggleField.js.map +1 -0
  169. package/dist/fields/block-types.d.ts +18 -0
  170. package/dist/fields/block-types.d.ts.map +1 -0
  171. package/dist/fields/block-types.js +88 -0
  172. package/dist/fields/block-types.js.map +1 -0
  173. package/dist/fields/index.d.ts +18 -0
  174. package/dist/fields/index.d.ts.map +1 -0
  175. package/dist/fields/index.js +16 -0
  176. package/dist/fields/index.js.map +1 -0
  177. package/dist/hooks/useContentLock.d.ts +12 -0
  178. package/dist/hooks/useContentLock.d.ts.map +1 -0
  179. package/dist/hooks/useContentLock.js +38 -0
  180. package/dist/hooks/useContentLock.js.map +1 -0
  181. package/dist/hooks/useDebounce.d.ts +2 -0
  182. package/dist/hooks/useDebounce.d.ts.map +1 -0
  183. package/dist/hooks/useDebounce.js +11 -0
  184. package/dist/hooks/useDebounce.js.map +1 -0
  185. package/dist/hooks/useKeyboardShortcuts.d.ts +6 -0
  186. package/dist/hooks/useKeyboardShortcuts.d.ts.map +1 -0
  187. package/dist/hooks/useKeyboardShortcuts.js +26 -0
  188. package/dist/hooks/useKeyboardShortcuts.js.map +1 -0
  189. package/dist/index.d.ts +52 -0
  190. package/dist/index.d.ts.map +1 -0
  191. package/dist/index.js +39 -0
  192. package/dist/index.js.map +1 -0
  193. package/dist/layout/Header.d.ts +7 -0
  194. package/dist/layout/Header.d.ts.map +1 -0
  195. package/dist/layout/Header.js +18 -0
  196. package/dist/layout/Header.js.map +1 -0
  197. package/dist/layout/Layout.d.ts +10 -0
  198. package/dist/layout/Layout.d.ts.map +1 -0
  199. package/dist/layout/Layout.js +25 -0
  200. package/dist/layout/Layout.js.map +1 -0
  201. package/dist/layout/Sidebar.d.ts +9 -0
  202. package/dist/layout/Sidebar.d.ts.map +1 -0
  203. package/dist/layout/Sidebar.js +63 -0
  204. package/dist/layout/Sidebar.js.map +1 -0
  205. package/dist/lib/api.d.ts +8 -0
  206. package/dist/lib/api.d.ts.map +1 -0
  207. package/dist/lib/api.js +59 -0
  208. package/dist/lib/api.js.map +1 -0
  209. package/dist/lib/search.d.ts +11 -0
  210. package/dist/lib/search.d.ts.map +1 -0
  211. package/dist/lib/search.js +46 -0
  212. package/dist/lib/search.js.map +1 -0
  213. package/dist/lib/useApiData.d.ts +8 -0
  214. package/dist/lib/useApiData.d.ts.map +1 -0
  215. package/dist/lib/useApiData.js +36 -0
  216. package/dist/lib/useApiData.js.map +1 -0
  217. package/dist/lib/utils.d.ts +3 -0
  218. package/dist/lib/utils.d.ts.map +1 -0
  219. package/dist/lib/utils.js +6 -0
  220. package/dist/lib/utils.js.map +1 -0
  221. package/dist/router/index.d.ts +10 -0
  222. package/dist/router/index.d.ts.map +1 -0
  223. package/dist/router/index.js +61 -0
  224. package/dist/router/index.js.map +1 -0
  225. package/dist/views/CollectionList.d.ts +7 -0
  226. package/dist/views/CollectionList.d.ts.map +1 -0
  227. package/dist/views/CollectionList.js +107 -0
  228. package/dist/views/CollectionList.js.map +1 -0
  229. package/dist/views/Dashboard.d.ts +5 -0
  230. package/dist/views/Dashboard.d.ts.map +1 -0
  231. package/dist/views/Dashboard.js +17 -0
  232. package/dist/views/Dashboard.js.map +1 -0
  233. package/dist/views/DocumentEdit.d.ts +8 -0
  234. package/dist/views/DocumentEdit.d.ts.map +1 -0
  235. package/dist/views/DocumentEdit.js +210 -0
  236. package/dist/views/DocumentEdit.js.map +1 -0
  237. package/dist/views/FormEditor.d.ts +6 -0
  238. package/dist/views/FormEditor.d.ts.map +1 -0
  239. package/dist/views/FormEditor.js +126 -0
  240. package/dist/views/FormEditor.js.map +1 -0
  241. package/dist/views/FormSubmissions.d.ts +6 -0
  242. package/dist/views/FormSubmissions.d.ts.map +1 -0
  243. package/dist/views/FormSubmissions.js +88 -0
  244. package/dist/views/FormSubmissions.js.map +1 -0
  245. package/dist/views/Forms.d.ts +5 -0
  246. package/dist/views/Forms.d.ts.map +1 -0
  247. package/dist/views/Forms.js +24 -0
  248. package/dist/views/Forms.js.map +1 -0
  249. package/dist/views/Login.d.ts +10 -0
  250. package/dist/views/Login.d.ts.map +1 -0
  251. package/dist/views/Login.js +83 -0
  252. package/dist/views/Login.js.map +1 -0
  253. package/dist/views/MediaBrowser.d.ts +5 -0
  254. package/dist/views/MediaBrowser.d.ts.map +1 -0
  255. package/dist/views/MediaBrowser.js +245 -0
  256. package/dist/views/MediaBrowser.js.map +1 -0
  257. package/dist/views/PageEditor.d.ts +6 -0
  258. package/dist/views/PageEditor.d.ts.map +1 -0
  259. package/dist/views/PageEditor.js +74 -0
  260. package/dist/views/PageEditor.js.map +1 -0
  261. package/dist/views/Pages.d.ts +5 -0
  262. package/dist/views/Pages.d.ts.map +1 -0
  263. package/dist/views/Pages.js +127 -0
  264. package/dist/views/Pages.js.map +1 -0
  265. package/dist/views/PostEditor.d.ts +6 -0
  266. package/dist/views/PostEditor.d.ts.map +1 -0
  267. package/dist/views/PostEditor.js +79 -0
  268. package/dist/views/PostEditor.js.map +1 -0
  269. package/dist/views/Posts.d.ts +5 -0
  270. package/dist/views/Posts.d.ts.map +1 -0
  271. package/dist/views/Posts.js +67 -0
  272. package/dist/views/Posts.js.map +1 -0
  273. package/dist/views/Redirects.d.ts +5 -0
  274. package/dist/views/Redirects.d.ts.map +1 -0
  275. package/dist/views/Redirects.js +79 -0
  276. package/dist/views/Redirects.js.map +1 -0
  277. package/dist/views/SEO.d.ts +6 -0
  278. package/dist/views/SEO.d.ts.map +1 -0
  279. package/dist/views/SEO.js +120 -0
  280. package/dist/views/SEO.js.map +1 -0
  281. package/dist/views/Settings.d.ts +5 -0
  282. package/dist/views/Settings.d.ts.map +1 -0
  283. package/dist/views/Settings.js +95 -0
  284. package/dist/views/Settings.js.map +1 -0
  285. package/dist/views/SetupWizard.d.ts +13 -0
  286. package/dist/views/SetupWizard.d.ts.map +1 -0
  287. package/dist/views/SetupWizard.js +68 -0
  288. package/dist/views/SetupWizard.js.map +1 -0
  289. package/dist/views/Users.d.ts +5 -0
  290. package/dist/views/Users.d.ts.map +1 -0
  291. package/dist/views/Users.js +69 -0
  292. package/dist/views/Users.js.map +1 -0
  293. package/package.json +71 -0
  294. package/src/styles/tailwind.css +2 -0
  295. package/src/styles/theme.css +175 -0
@@ -0,0 +1,13 @@
1
+ export interface RelationshipFieldProps {
2
+ label: string;
3
+ value?: string | string[];
4
+ onChange: (value: string | string[]) => void;
5
+ multi?: boolean;
6
+ required?: boolean;
7
+ helpText?: string;
8
+ relationTo?: string;
9
+ useAsTitle?: string;
10
+ onNavigate?: (path: string) => void;
11
+ }
12
+ export declare function RelationshipField({ label, value, onChange, multi, required, helpText, relationTo, useAsTitle, onNavigate, }: RelationshipFieldProps): import("react/jsx-runtime").JSX.Element;
13
+ //# sourceMappingURL=RelationshipField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RelationshipField.d.ts","sourceRoot":"","sources":["../../src/fields/RelationshipField.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC;IAC7C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAkCD,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,KAAK,EACL,QAAQ,EACR,KAAa,EACb,QAAQ,EACR,QAAQ,EACR,UAAoB,EACpB,UAAoB,EACpB,UAAU,GACX,EAAE,sBAAsB,2CAwLxB"}
@@ -0,0 +1,119 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState, useEffect, useRef, useCallback } from 'react';
4
+ import { Search, X, Loader2, Plus } from 'lucide-react';
5
+ import { cmsApi } from '../lib/api';
6
+ const STATUS_STYLES = {
7
+ PUBLISHED: 'bg-green-100 text-green-800',
8
+ DRAFT: 'bg-yellow-100 text-yellow-800',
9
+ ARCHIVED: 'bg-gray-100 text-gray-600',
10
+ SCHEDULED: 'bg-blue-100 text-blue-800',
11
+ };
12
+ function relativeTime(dateStr) {
13
+ if (!dateStr)
14
+ return '';
15
+ const diff = Date.now() - new Date(dateStr).getTime();
16
+ const seconds = Math.floor(diff / 1000);
17
+ if (seconds < 60)
18
+ return 'just now';
19
+ const minutes = Math.floor(seconds / 60);
20
+ if (minutes < 60)
21
+ return `${minutes}m ago`;
22
+ const hours = Math.floor(minutes / 60);
23
+ if (hours < 24)
24
+ return `${hours}h ago`;
25
+ const days = Math.floor(hours / 24);
26
+ if (days < 30)
27
+ return `${days}d ago`;
28
+ const months = Math.floor(days / 30);
29
+ if (months < 12)
30
+ return `${months}mo ago`;
31
+ return `${Math.floor(months / 12)}y ago`;
32
+ }
33
+ export function RelationshipField({ label, value, onChange, multi = false, required, helpText, relationTo = 'pages', useAsTitle = 'title', onNavigate, }) {
34
+ const [searchTerm, setSearchTerm] = useState('');
35
+ const [open, setOpen] = useState(false);
36
+ const [options, setOptions] = useState([]);
37
+ const [loading, setLoading] = useState(false);
38
+ const dropdownRef = useRef(null);
39
+ const debounceRef = useRef(null);
40
+ const selectedIds = multi
41
+ ? (Array.isArray(value) ? value : [])
42
+ : (typeof value === 'string' && value ? [value] : []);
43
+ const fetchOptions = useCallback(async (query) => {
44
+ setLoading(true);
45
+ const searchParam = query ? `&search=${encodeURIComponent(query)}` : '';
46
+ const res = await cmsApi(`/collections/${relationTo}?pageSize=50${searchParam}`);
47
+ if (res.data) {
48
+ const docs = res.data.docs ?? [];
49
+ setOptions(docs);
50
+ }
51
+ setLoading(false);
52
+ }, [relationTo]);
53
+ useEffect(() => {
54
+ if (open)
55
+ fetchOptions(searchTerm);
56
+ }, [open]);
57
+ const handleSearch = useCallback((query) => {
58
+ setSearchTerm(query);
59
+ if (debounceRef.current)
60
+ clearTimeout(debounceRef.current);
61
+ debounceRef.current = setTimeout(() => fetchOptions(query), 300);
62
+ }, [fetchOptions]);
63
+ useEffect(() => {
64
+ function handleClickOutside(e) {
65
+ if (dropdownRef.current && !dropdownRef.current.contains(e.target)) {
66
+ setOpen(false);
67
+ }
68
+ }
69
+ document.addEventListener('mousedown', handleClickOutside);
70
+ return () => document.removeEventListener('mousedown', handleClickOutside);
71
+ }, []);
72
+ function getDocTitle(doc) {
73
+ if (doc.title)
74
+ return doc.title;
75
+ const d = doc.data;
76
+ if (d && typeof d === 'object') {
77
+ if (typeof d[useAsTitle] === 'string')
78
+ return d[useAsTitle];
79
+ if (typeof d.title === 'string')
80
+ return d.title;
81
+ if (typeof d.name === 'string')
82
+ return d.name;
83
+ }
84
+ return doc.id;
85
+ }
86
+ function handleToggle(id) {
87
+ if (multi) {
88
+ const next = selectedIds.includes(id)
89
+ ? selectedIds.filter((v) => v !== id)
90
+ : [...selectedIds, id];
91
+ onChange(next);
92
+ }
93
+ else {
94
+ onChange(id);
95
+ setOpen(false);
96
+ }
97
+ }
98
+ function handleRemove(id) {
99
+ if (multi) {
100
+ onChange(selectedIds.filter((v) => v !== id));
101
+ }
102
+ else {
103
+ onChange('');
104
+ }
105
+ }
106
+ const selectedItems = options.filter((opt) => selectedIds.includes(opt.id));
107
+ const unselectedItems = options.filter((opt) => !selectedIds.includes(opt.id));
108
+ function renderOption(opt, isSelected) {
109
+ const status = opt.status ?? opt.data?.status;
110
+ const collection = opt.collection ?? relationTo;
111
+ const statusClass = STATUS_STYLES[status] ?? 'bg-gray-100 text-gray-600';
112
+ return (_jsxs("button", { type: "button", onClick: () => handleToggle(opt.id), className: `flex w-full items-center gap-2 px-3 py-2 text-sm hover:bg-[var(--accent)] ${isSelected ? 'font-medium' : ''}`, children: [_jsxs("div", { className: "flex-1 min-w-0 text-left", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "truncate", children: getDocTitle(opt) }), isSelected && _jsx("span", { className: "shrink-0 text-[var(--primary)]", children: "\u2713" })] }), _jsxs("div", { className: "flex items-center gap-2 mt-0.5", children: [_jsx("span", { className: "text-[10px] text-[var(--muted-foreground)]", children: collection }), opt.updatedAt && (_jsx("span", { className: "text-[10px] text-[var(--muted-foreground)]", children: relativeTime(opt.updatedAt) }))] })] }), status && (_jsx("span", { className: `shrink-0 rounded px-1.5 py-0.5 text-[10px] font-medium ${statusClass}`, children: status }))] }));
113
+ }
114
+ return (_jsxs("div", { className: "relative", ref: dropdownRef, children: [_jsxs("label", { className: "mb-1 block text-sm font-medium", children: [label, required && _jsx("span", { className: "ml-0.5 text-[var(--destructive)]", children: "*" })] }), selectedItems.length > 0 && (_jsx("div", { className: "mb-2 flex flex-wrap gap-1", children: selectedItems.map((item) => (_jsxs("span", { className: "inline-flex items-center gap-1 rounded-md bg-[var(--accent)] px-2 py-1 text-xs", children: [getDocTitle(item), _jsx("button", { type: "button", onClick: () => handleRemove(item.id), className: "hover:text-[var(--destructive)]", children: _jsx(X, { className: "w-3 h-3" }) })] }, item.id))) })), _jsxs("div", { className: "relative", children: [_jsx(Search, { className: "absolute left-2.5 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--muted-foreground)] pointer-events-none" }), _jsx("input", { type: "text", value: searchTerm, onChange: (e) => handleSearch(e.target.value), onFocus: () => setOpen(true), placeholder: `Search ${relationTo}...`, className: "w-full rounded-md border border-[var(--border)] bg-[var(--input-background)] pl-8 pr-3 py-2 text-sm outline-none focus:ring-2 focus:ring-[var(--ring)]" }), loading && (_jsx(Loader2, { className: "absolute right-2.5 top-1/2 -translate-y-1/2 w-4 h-4 animate-spin text-[var(--muted-foreground)]" })), open && (_jsxs("ul", { className: "absolute z-50 mt-1 w-full max-h-60 overflow-y-auto rounded-md border border-[var(--border)] bg-[var(--popover)] py-1 shadow-lg", children: [unselectedItems.map((opt) => (_jsx("li", { children: renderOption(opt, false) }, opt.id))), selectedItems.length > 0 && unselectedItems.length > 0 && (_jsx("li", { className: "border-t border-[var(--border)] my-1" })), selectedItems.map((opt) => (_jsx("li", { children: renderOption(opt, true) }, opt.id))), options.length === 0 && !loading && (_jsx("li", { className: "px-3 py-2 text-sm text-[var(--muted-foreground)]", children: "No results" })), _jsx("li", { className: "border-t border-[var(--border)] mt-1", children: _jsxs("button", { type: "button", onClick: () => {
115
+ setOpen(false);
116
+ onNavigate?.(`/${relationTo}/new`);
117
+ }, className: "flex w-full items-center gap-2 px-3 py-2 text-sm text-[var(--primary)] hover:bg-[var(--accent)]", children: [_jsx(Plus, { className: "w-3.5 h-3.5" }), "Create New"] }) })] }))] }), helpText && (_jsx("p", { className: "mt-1 text-xs text-[var(--muted-foreground)]", children: helpText }))] }));
118
+ }
119
+ //# sourceMappingURL=RelationshipField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RelationshipField.js","sourceRoot":"","sources":["../../src/fields/RelationshipField.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface RichTextFieldProps {
2
+ label: string;
3
+ value?: string;
4
+ onChange: (value: string) => void;
5
+ required?: boolean;
6
+ helpText?: string;
7
+ }
8
+ export declare function RichTextField({ label, value, onChange, required, helpText }: RichTextFieldProps): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=RichTextField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RichTextField.d.ts","sourceRoot":"","sources":["../../src/fields/RichTextField.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,KAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,kBAAkB,2CAapG"}
@@ -0,0 +1,7 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { TipTapEditor } from '../components/TipTapEditor';
4
+ export function RichTextField({ label, value = '', onChange, required, helpText }) {
5
+ return (_jsxs("div", { children: [_jsxs("label", { className: "mb-1 block text-sm font-medium", children: [label, required && _jsx("span", { className: "ml-0.5 text-[var(--destructive)]", children: "*" })] }), _jsx(TipTapEditor, { content: value, onChange: onChange }), helpText && (_jsx("p", { className: "mt-1 text-xs text-[var(--muted-foreground)]", children: helpText }))] }));
6
+ }
7
+ //# sourceMappingURL=RichTextField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RichTextField.js","sourceRoot":"","sources":["../../src/fields/RichTextField.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAU1D,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAsB;IACnG,OAAO,CACL,0BACE,iBAAO,SAAS,EAAC,gCAAgC,aAC9C,KAAK,EACL,QAAQ,IAAI,eAAM,SAAS,EAAC,kCAAkC,kBAAS,IAClE,EACR,KAAC,YAAY,IAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAI,EACnD,QAAQ,IAAI,CACX,YAAG,SAAS,EAAC,6CAA6C,YAAE,QAAQ,GAAK,CAC1E,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface SelectFieldProps {
2
+ label: string;
3
+ value?: string | string[];
4
+ onChange: (value: string | string[]) => void;
5
+ options?: string[];
6
+ multi?: boolean;
7
+ required?: boolean;
8
+ helpText?: string;
9
+ }
10
+ export declare function SelectField({ label, value, onChange, options, multi, required, helpText, }: SelectFieldProps): import("react/jsx-runtime").JSX.Element;
11
+ //# sourceMappingURL=SelectField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectField.d.ts","sourceRoot":"","sources":["../../src/fields/SelectField.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC;IAC7C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,KAAK,EACL,QAAQ,EACR,OAAY,EACZ,KAAa,EACb,QAAQ,EACR,QAAQ,GACT,EAAE,gBAAgB,2CA8FlB"}
@@ -0,0 +1,31 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from 'react';
4
+ export function SelectField({ label, value, onChange, options = [], multi = false, required, helpText, }) {
5
+ const [searchTerm, setSearchTerm] = useState('');
6
+ const [open, setOpen] = useState(false);
7
+ const selectedValues = multi
8
+ ? (Array.isArray(value) ? value : [])
9
+ : [];
10
+ const singleValue = multi ? '' : (typeof value === 'string' ? value : '');
11
+ const filtered = options.filter((opt) => opt.toLowerCase().includes(searchTerm.toLowerCase()));
12
+ function handleSelect(opt) {
13
+ if (multi) {
14
+ const next = selectedValues.includes(opt)
15
+ ? selectedValues.filter((v) => v !== opt)
16
+ : [...selectedValues, opt];
17
+ onChange(next);
18
+ }
19
+ else {
20
+ onChange(opt);
21
+ setOpen(false);
22
+ }
23
+ }
24
+ return (_jsxs("div", { className: "relative", children: [_jsxs("label", { className: "mb-1 block text-sm font-medium", children: [label, required && _jsx("span", { className: "ml-0.5 text-[var(--destructive)]", children: "*" })] }), _jsxs("button", { type: "button", onClick: () => setOpen((o) => !o), className: "flex w-full items-center justify-between rounded-md border border-[var(--border)] bg-[var(--input-background)] px-3 py-2 text-sm", children: [_jsx("span", { className: singleValue || selectedValues.length ? '' : 'text-[var(--muted-foreground)]', children: multi
25
+ ? selectedValues.length ? `${selectedValues.length} selected` : 'Select...'
26
+ : singleValue || 'Select...' }), _jsx("svg", { className: "h-4 w-4 text-[var(--muted-foreground)]", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) })] }), open && (_jsxs("div", { className: "absolute z-50 mt-1 w-full rounded-md border border-[var(--border)] bg-[var(--popover)] shadow-lg", children: [_jsx("div", { className: "border-b border-[var(--border)] p-2", children: _jsx("input", { type: "text", value: searchTerm, onChange: (e) => setSearchTerm(e.target.value), placeholder: "Search...", className: "w-full rounded bg-[var(--input-background)] px-2 py-1 text-sm outline-none" }) }), _jsxs("ul", { className: "max-h-48 overflow-y-auto py-1", children: [filtered.map((opt) => {
27
+ const isSelected = multi ? selectedValues.includes(opt) : singleValue === opt;
28
+ return (_jsx("li", { children: _jsxs("button", { type: "button", onClick: () => handleSelect(opt), className: `flex w-full items-center gap-2 px-3 py-1.5 text-sm hover:bg-[var(--accent)] ${isSelected ? 'font-medium' : ''}`, children: [multi && (_jsx("span", { className: `flex h-4 w-4 items-center justify-center rounded border ${isSelected ? 'border-[var(--primary)] bg-[var(--primary)] text-[var(--primary-foreground)]' : 'border-[var(--border)]'}`, children: isSelected && '✓' })), opt] }) }, opt));
29
+ }), filtered.length === 0 && (_jsx("li", { className: "px-3 py-2 text-sm text-[var(--muted-foreground)]", children: "No options found" }))] })] })), helpText && (_jsx("p", { className: "mt-1 text-xs text-[var(--muted-foreground)]", children: helpText }))] }));
30
+ }
31
+ //# sourceMappingURL=SelectField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectField.js","sourceRoot":"","sources":["../../src/fields/SelectField.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface SlugFieldProps {
2
+ label: string;
3
+ value?: string;
4
+ onChange: (value: string) => void;
5
+ from?: string;
6
+ required?: boolean;
7
+ helpText?: string;
8
+ }
9
+ export declare function SlugField({ label, value, onChange, required, helpText }: SlugFieldProps): import("react/jsx-runtime").JSX.Element;
10
+ //# sourceMappingURL=SlugField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SlugField.d.ts","sourceRoot":"","sources":["../../src/fields/SlugField.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAUD,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,KAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,cAAc,2CA2C5F"}
@@ -0,0 +1,15 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from 'react';
4
+ function toSlug(text) {
5
+ return text
6
+ .toLowerCase()
7
+ .replace(/[^\w\s-]/g, '')
8
+ .replace(/[\s_]+/g, '-')
9
+ .replace(/^-+|-+$/g, '');
10
+ }
11
+ export function SlugField({ label, value = '', onChange, required, helpText }) {
12
+ const [locked, setLocked] = useState(true);
13
+ return (_jsxs("div", { children: [_jsxs("label", { className: "mb-1 block text-sm font-medium", children: [label, required && _jsx("span", { className: "ml-0.5 text-[var(--destructive)]", children: "*" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("div", { className: "flex flex-1 items-center rounded-md border border-[var(--border)] bg-[var(--input-background)]", children: [_jsx("span", { className: "pl-3 text-sm text-[var(--muted-foreground)]", children: "/" }), _jsx("input", { type: "text", value: value, onChange: (e) => onChange(toSlug(e.target.value)), readOnly: locked, className: "flex-1 bg-transparent px-1 py-2 text-sm outline-none" })] }), _jsx("button", { type: "button", onClick: () => setLocked((l) => !l), className: "rounded-md border border-[var(--border)] p-2 text-sm hover:bg-[var(--accent)]", "aria-label": locked ? 'Unlock slug' : 'Lock slug', children: _jsx("svg", { className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: locked ? (_jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z" })) : (_jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z" })) }) })] }), value && (_jsxs("p", { className: "mt-1 text-xs text-[var(--muted-foreground)]", children: ["URL preview: /", value] })), helpText && (_jsx("p", { className: "mt-1 text-xs text-[var(--muted-foreground)]", children: helpText }))] }));
14
+ }
15
+ //# sourceMappingURL=SlugField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SlugField.js","sourceRoot":"","sources":["../../src/fields/SlugField.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,QAAQ,EAAa,MAAM,OAAO,CAAC;AAW5C,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;SACxB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAkB;IAC3F,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE3C,OAAO,CACL,0BACE,iBAAO,SAAS,EAAC,gCAAgC,aAC9C,KAAK,EACL,QAAQ,IAAI,eAAM,SAAS,EAAC,kCAAkC,kBAAS,IAClE,EACR,eAAK,SAAS,EAAC,yBAAyB,aACtC,eAAK,SAAS,EAAC,gGAAgG,aAC7G,eAAM,SAAS,EAAC,6CAA6C,kBAAS,EACtE,gBACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EACjD,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAC,sDAAsD,GAChE,IACE,EACN,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EACnC,SAAS,EAAC,+EAA+E,gBAC7E,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,YAEhD,cAAK,SAAS,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAE,CAAC,YAC1F,MAAM,CAAC,CAAC,CAAC,CACR,eAAM,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,CAAC,EAAC,sGAAsG,GAAG,CAC/J,CAAC,CAAC,CAAC,CACF,eAAM,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,CAAC,EAAC,8FAA8F,GAAG,CACvJ,GACG,GACC,IACL,EACL,KAAK,IAAI,CACR,aAAG,SAAS,EAAC,6CAA6C,+BAAgB,KAAK,IAAK,CACrF,EACA,QAAQ,IAAI,CACX,YAAG,SAAS,EAAC,6CAA6C,YAAE,QAAQ,GAAK,CAC1E,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface TextFieldProps {
2
+ label: string;
3
+ value?: string;
4
+ onChange: (value: string) => void;
5
+ required?: boolean;
6
+ maxLength?: number;
7
+ helpText?: string;
8
+ error?: string;
9
+ }
10
+ export declare function TextField({ label, value, onChange, required, maxLength, helpText, error }: TextFieldProps): import("react/jsx-runtime").JSX.Element;
11
+ //# sourceMappingURL=TextField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextField.d.ts","sourceRoot":"","sources":["../../src/fields/TextField.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,KAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,cAAc,2CAmC9G"}
@@ -0,0 +1,8 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ export function TextField({ label, value = '', onChange, required, maxLength, helpText, error }) {
4
+ const charCount = value.length;
5
+ const hasError = !!error || (maxLength !== undefined && charCount > maxLength);
6
+ return (_jsxs("div", { children: [_jsxs("label", { className: "mb-1 flex items-baseline justify-between text-sm font-medium", children: [_jsxs("span", { children: [label, required && _jsx("span", { className: "ml-0.5 text-[var(--destructive)]", children: "*" })] }), maxLength !== undefined && (_jsxs("span", { className: `text-xs ${hasError ? 'text-[var(--destructive)]' : 'text-[var(--muted-foreground)]'}`, children: [charCount, "/", maxLength] }))] }), _jsx("input", { type: "text", value: value, onChange: (e) => onChange(e.target.value), required: required, maxLength: maxLength, className: `w-full rounded-md border bg-[var(--input-background)] px-3 py-2 text-sm outline-none transition-colors focus:ring-2 focus:ring-[var(--ring)] ${hasError ? 'border-[var(--destructive)]' : 'border-[var(--border)]'}` }), helpText && !error && (_jsx("p", { className: "mt-1 text-xs text-[var(--muted-foreground)]", children: helpText })), error && (_jsx("p", { className: "mt-1 text-xs text-[var(--destructive)]", children: error }))] }));
7
+ }
8
+ //# sourceMappingURL=TextField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextField.js","sourceRoot":"","sources":["../../src/fields/TextField.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAYb,MAAM,UAAU,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAkB;IAC7G,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;IAC/B,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS,GAAG,SAAS,CAAC,CAAC;IAE/E,OAAO,CACL,0BACE,iBAAO,SAAS,EAAC,8DAA8D,aAC7E,2BACG,KAAK,EACL,QAAQ,IAAI,eAAM,SAAS,EAAC,kCAAkC,kBAAS,IACnE,EACN,SAAS,KAAK,SAAS,IAAI,CAC1B,gBAAM,SAAS,EAAE,WAAW,QAAQ,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,gCAAgC,EAAE,aACpG,SAAS,OAAG,SAAS,IACjB,CACR,IACK,EACR,gBACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,gJACT,QAAQ,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,wBAC7C,EAAE,GACF,EACD,QAAQ,IAAI,CAAC,KAAK,IAAI,CACrB,YAAG,SAAS,EAAC,6CAA6C,YAAE,QAAQ,GAAK,CAC1E,EACA,KAAK,IAAI,CACR,YAAG,SAAS,EAAC,wCAAwC,YAAE,KAAK,GAAK,CAClE,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface ToggleFieldProps {
2
+ label: string;
3
+ value?: boolean;
4
+ onChange: (value: boolean) => void;
5
+ helpText?: string;
6
+ }
7
+ export declare function ToggleField({ label, value, onChange, helpText }: ToggleFieldProps): import("react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=ToggleField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToggleField.d.ts","sourceRoot":"","sources":["../../src/fields/ToggleField.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,KAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,gBAAgB,2CA0BzF"}
@@ -0,0 +1,6 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ export function ToggleField({ label, value = false, onChange, helpText }) {
4
+ return (_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { children: [_jsx("span", { className: "text-sm font-medium", children: label }), helpText && (_jsx("p", { className: "text-xs text-[var(--muted-foreground)]", children: helpText }))] }), _jsx("button", { type: "button", role: "switch", "aria-checked": value, onClick: () => onChange(!value), className: `relative inline-flex h-6 w-11 shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors ${value ? 'bg-[var(--primary)]' : 'bg-[var(--muted)]'}`, children: _jsx("span", { className: `pointer-events-none inline-block h-5 w-5 rounded-full bg-white shadow-sm ring-0 transition-transform ${value ? 'translate-x-5' : 'translate-x-0'}` }) })] }));
5
+ }
6
+ //# sourceMappingURL=ToggleField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToggleField.js","sourceRoot":"","sources":["../../src/fields/ToggleField.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AASb,MAAM,UAAU,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAoB;IACxF,OAAO,CACL,eAAK,SAAS,EAAC,mCAAmC,aAChD,0BACE,eAAM,SAAS,EAAC,qBAAqB,YAAE,KAAK,GAAQ,EACnD,QAAQ,IAAI,CACX,YAAG,SAAS,EAAC,wCAAwC,YAAE,QAAQ,GAAK,CACrE,IACG,EACN,iBACE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,QAAQ,kBACC,KAAK,EACnB,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAC/B,SAAS,EAAE,oHACT,KAAK,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,mBAClC,EAAE,YAEF,eACE,SAAS,EAAE,wGACT,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAC5B,EAAE,GACF,GACK,IACL,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ export interface BlockTypeDefinition {
2
+ type: string;
3
+ label: string;
4
+ icon: string;
5
+ description: string;
6
+ fields: {
7
+ name: string;
8
+ type: string;
9
+ label: string;
10
+ required?: boolean;
11
+ options?: {
12
+ value: string;
13
+ label: string;
14
+ }[];
15
+ }[];
16
+ }
17
+ export declare const PRESET_BLOCKS: BlockTypeDefinition[];
18
+ //# sourceMappingURL=block-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-types.d.ts","sourceRoot":"","sources":["../../src/fields/block-types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,EAAE,CAAC;CAC3H;AAED,eAAO,MAAM,aAAa,EAAE,mBAAmB,EAsF9C,CAAC"}
@@ -0,0 +1,88 @@
1
+ export const PRESET_BLOCKS = [
2
+ {
3
+ type: 'hero',
4
+ label: 'Hero',
5
+ icon: 'layout',
6
+ description: 'Full-width hero section with heading and CTA',
7
+ fields: [
8
+ { name: 'heading', type: 'text', label: 'Heading', required: true },
9
+ { name: 'subheading', type: 'text', label: 'Subheading' },
10
+ { name: 'buttonText', type: 'text', label: 'Button Text' },
11
+ { name: 'buttonUrl', type: 'text', label: 'Button URL' },
12
+ { name: 'backgroundImage', type: 'media', label: 'Background Image' },
13
+ { name: 'alignment', type: 'select', label: 'Alignment', options: [
14
+ { value: 'left', label: 'Left' },
15
+ { value: 'center', label: 'Center' },
16
+ { value: 'right', label: 'Right' },
17
+ ] },
18
+ ],
19
+ },
20
+ {
21
+ type: 'cta',
22
+ label: 'Call to Action',
23
+ icon: 'megaphone',
24
+ description: 'Attention-grabbing CTA section',
25
+ fields: [
26
+ { name: 'heading', type: 'text', label: 'Heading', required: true },
27
+ { name: 'description', type: 'text', label: 'Description' },
28
+ { name: 'buttonText', type: 'text', label: 'Button Text', required: true },
29
+ { name: 'buttonUrl', type: 'text', label: 'Button URL', required: true },
30
+ { name: 'style', type: 'select', label: 'Style', options: [
31
+ { value: 'primary', label: 'Primary' },
32
+ { value: 'secondary', label: 'Secondary' },
33
+ { value: 'outline', label: 'Outline' },
34
+ ] },
35
+ ],
36
+ },
37
+ {
38
+ type: 'columns',
39
+ label: 'Columns',
40
+ icon: 'columns',
41
+ description: '2 or 3 column layout with rich text',
42
+ fields: [
43
+ { name: 'columnCount', type: 'select', label: 'Columns', options: [
44
+ { value: '2', label: '2 Columns' },
45
+ { value: '3', label: '3 Columns' },
46
+ ] },
47
+ { name: 'column1', type: 'richText', label: 'Column 1' },
48
+ { name: 'column2', type: 'richText', label: 'Column 2' },
49
+ { name: 'column3', type: 'richText', label: 'Column 3' },
50
+ ],
51
+ },
52
+ {
53
+ type: 'imageText',
54
+ label: 'Image + Text',
55
+ icon: 'image',
56
+ description: 'Image alongside text content',
57
+ fields: [
58
+ { name: 'image', type: 'media', label: 'Image', required: true },
59
+ { name: 'content', type: 'richText', label: 'Content', required: true },
60
+ { name: 'imagePosition', type: 'select', label: 'Image Position', options: [
61
+ { value: 'left', label: 'Left' },
62
+ { value: 'right', label: 'Right' },
63
+ ] },
64
+ ],
65
+ },
66
+ {
67
+ type: 'quote',
68
+ label: 'Quote',
69
+ icon: 'quote',
70
+ description: 'Blockquote with attribution',
71
+ fields: [
72
+ { name: 'text', type: 'text', label: 'Quote Text', required: true },
73
+ { name: 'author', type: 'text', label: 'Author' },
74
+ { name: 'role', type: 'text', label: 'Author Role' },
75
+ ],
76
+ },
77
+ {
78
+ type: 'video',
79
+ label: 'Video Embed',
80
+ icon: 'play',
81
+ description: 'Embedded video from YouTube or Vimeo',
82
+ fields: [
83
+ { name: 'url', type: 'text', label: 'Video URL', required: true },
84
+ { name: 'caption', type: 'text', label: 'Caption' },
85
+ ],
86
+ },
87
+ ];
88
+ //# sourceMappingURL=block-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-types.js","sourceRoot":"","sources":["../../src/fields/block-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export { FieldRenderer } from './FieldRenderer';
2
+ export type { FieldRendererProps, FieldDefinition } from './FieldRenderer';
3
+ export { TextField } from './TextField';
4
+ export { RichTextField } from './RichTextField';
5
+ export { SlugField } from './SlugField';
6
+ export { SelectField } from './SelectField';
7
+ export { MediaField } from './MediaField';
8
+ export { RelationshipField } from './RelationshipField';
9
+ export { DateField } from './DateField';
10
+ export { ToggleField } from './ToggleField';
11
+ export { ArrayField } from './ArrayField';
12
+ export { BlockBuilderField } from './BlockBuilderField';
13
+ export { PRESET_BLOCKS } from './block-types';
14
+ export type { BlockTypeDefinition } from './block-types';
15
+ export { GroupField } from './GroupField';
16
+ export { NavBuilderField } from './NavBuilderField';
17
+ export { NumberField } from './NumberField';
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fields/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,16 @@
1
+ export { FieldRenderer } from './FieldRenderer';
2
+ export { TextField } from './TextField';
3
+ export { RichTextField } from './RichTextField';
4
+ export { SlugField } from './SlugField';
5
+ export { SelectField } from './SelectField';
6
+ export { MediaField } from './MediaField';
7
+ export { RelationshipField } from './RelationshipField';
8
+ export { DateField } from './DateField';
9
+ export { ToggleField } from './ToggleField';
10
+ export { ArrayField } from './ArrayField';
11
+ export { BlockBuilderField } from './BlockBuilderField';
12
+ export { PRESET_BLOCKS } from './block-types';
13
+ export { GroupField } from './GroupField';
14
+ export { NavBuilderField } from './NavBuilderField';
15
+ export { NumberField } from './NumberField';
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fields/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,12 @@
1
+ interface ContentLock {
2
+ lockedBy: string | null;
3
+ lockedAt: Date | null;
4
+ isLocked: boolean;
5
+ isLockedByMe: boolean;
6
+ }
7
+ export declare function useContentLock(documentId: string | undefined, userId: string): ContentLock & {
8
+ acquireLock: () => Promise<boolean>;
9
+ releaseLock: () => Promise<void>;
10
+ };
11
+ export {};
12
+ //# sourceMappingURL=useContentLock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useContentLock.d.ts","sourceRoot":"","sources":["../../src/hooks/useContentLock.ts"],"names":[],"mappings":"AAIA,UAAU,WAAW;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG;IAC5F,WAAW,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC,CAqCA"}
@@ -0,0 +1,38 @@
1
+ 'use client';
2
+ import { useState, useEffect, useCallback } from 'react';
3
+ export function useContentLock(documentId, userId) {
4
+ const [lock, setLock] = useState({
5
+ lockedBy: null,
6
+ lockedAt: null,
7
+ isLocked: false,
8
+ isLockedByMe: false,
9
+ });
10
+ const acquireLock = useCallback(async () => {
11
+ if (!documentId)
12
+ return false;
13
+ setLock({
14
+ lockedBy: userId,
15
+ lockedAt: new Date(),
16
+ isLocked: true,
17
+ isLockedByMe: true,
18
+ });
19
+ return true;
20
+ }, [documentId, userId]);
21
+ const releaseLock = useCallback(async () => {
22
+ setLock({
23
+ lockedBy: null,
24
+ lockedAt: null,
25
+ isLocked: false,
26
+ isLockedByMe: false,
27
+ });
28
+ }, []);
29
+ useEffect(() => {
30
+ return () => {
31
+ if (lock.isLockedByMe) {
32
+ releaseLock();
33
+ }
34
+ };
35
+ }, [lock.isLockedByMe, releaseLock]);
36
+ return { ...lock, acquireLock, releaseLock };
37
+ }
38
+ //# sourceMappingURL=useContentLock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useContentLock.js","sourceRoot":"","sources":["../../src/hooks/useContentLock.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AASzD,MAAM,UAAU,cAAc,CAAC,UAA8B,EAAE,MAAc;IAI3E,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAc;QAC5C,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,KAAK;QACf,YAAY,EAAE,KAAK;KACpB,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACzC,IAAI,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QAC9B,OAAO,CAAC;YACN,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,IAAI,IAAI,EAAE;YACpB,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IAEzB,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACzC,OAAO,CAAC;YACN,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE;YACV,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,WAAW,EAAE,CAAC;YAChB,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;IAErC,OAAO,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function useDebounce<T>(value: T, delayMs: number): T;
2
+ //# sourceMappingURL=useDebounce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDebounce.d.ts","sourceRoot":"","sources":["../../src/hooks/useDebounce.ts"],"names":[],"mappings":"AAIA,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,CAS3D"}
@@ -0,0 +1,11 @@
1
+ 'use client';
2
+ import { useState, useEffect } from 'react';
3
+ export function useDebounce(value, delayMs) {
4
+ const [debouncedValue, setDebouncedValue] = useState(value);
5
+ useEffect(() => {
6
+ const timer = setTimeout(() => setDebouncedValue(value), delayMs);
7
+ return () => clearTimeout(timer);
8
+ }, [value, delayMs]);
9
+ return debouncedValue;
10
+ }
11
+ //# sourceMappingURL=useDebounce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDebounce.js","sourceRoot":"","sources":["../../src/hooks/useDebounce.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5C,MAAM,UAAU,WAAW,CAAI,KAAQ,EAAE,OAAe;IACtD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QAClE,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAErB,OAAO,cAAc,CAAC;AACxB,CAAC"}
@@ -0,0 +1,6 @@
1
+ interface ShortcutMap {
2
+ [combo: string]: (e: KeyboardEvent) => void;
3
+ }
4
+ export declare function useKeyboardShortcuts(shortcuts: ShortcutMap): void;
5
+ export {};
6
+ //# sourceMappingURL=useKeyboardShortcuts.d.ts.map