@hiai-gg/docsmint 0.3.7 → 0.3.8

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 (196) hide show
  1. package/backend/src/lib/logger.ts +45 -15
  2. package/dist/backend/index.js +238 -150
  3. package/dist/frontend/CategoryDialog-DphkZqIB.js +611 -0
  4. package/dist/frontend/ConfirmDialog-BLF3x_hr.js +214 -0
  5. package/dist/frontend/CreateSnapshotDialog-D5vPvFTL.js +216 -0
  6. package/dist/frontend/DatePicker-CLNTdvTk.js +259 -0
  7. package/dist/frontend/DeleteDialog-DxYFJivN.js +174 -0
  8. package/dist/frontend/FolderDialog-CRVZM2Oi.js +250 -0
  9. package/dist/frontend/FolderNode-C2zG7uii.js +298 -0
  10. package/dist/frontend/FolderTreeSelector-CyB8y2Sm.js +103 -0
  11. package/dist/frontend/Icon-CooFj4Ee.js +64 -0
  12. package/dist/frontend/SettingsDialog-DCM4-N6_.js +1016 -0
  13. package/dist/frontend/ShareDialog-DYu3RKQu.js +165 -0
  14. package/dist/frontend/TagCreateDialog-DXQs2bL9.js +260 -0
  15. package/dist/frontend/camera-iKXDOOWT.js +29 -0
  16. package/dist/frontend/check-D-UuvBuh.js +25 -0
  17. package/dist/frontend/chevron-down-CiPtYyFh.js +25 -0
  18. package/dist/frontend/circle-check-tSPE1V6t.js +29 -0
  19. package/dist/frontend/clock-DJHbHZb8.js +29 -0
  20. package/dist/frontend/{bundle-mjs-CP6Owz-8.js → clsx-C7bIvsDS.js} +16 -1
  21. package/dist/frontend/components/category-dialog.js +1 -1
  22. package/dist/frontend/components/create-snapshot-dialog.js +1 -1
  23. package/dist/frontend/components/delete-dialog.js +1 -1
  24. package/dist/frontend/components/editor/document-editor.js +1364 -1353
  25. package/dist/frontend/components/editor/document-title.js +25 -25
  26. package/dist/frontend/components/editor/markdown-toggle.js +45 -45
  27. package/dist/frontend/components/folder-node.js +1 -1
  28. package/dist/frontend/components/folder-tree-selector.js +1 -1
  29. package/dist/frontend/components/save-as-dialog.js +169 -151
  30. package/dist/frontend/components/settings.js +1 -1
  31. package/dist/frontend/components/share-dialog.js +1 -1
  32. package/dist/frontend/components/sidebar.js +1161 -1153
  33. package/dist/frontend/components/tag-create-dialog.js +1 -1
  34. package/dist/frontend/components/version-history.js +188 -187
  35. package/dist/frontend/copy-GppwRMjX.js +32 -0
  36. package/dist/frontend/dashboard.js +1188 -1156
  37. package/dist/frontend/dialog-D6NxYVmy.js +213 -0
  38. package/dist/frontend/doc-tabs.js +2 -2
  39. package/dist/frontend/ellipsis-vertical-P9MHvCps.js +530 -0
  40. package/dist/frontend/extension.js +8 -8
  41. package/dist/frontend/{floating-layer-anchor-C51M4l6v.js → floating-layer-anchor-CPwucTfd.js} +1414 -1412
  42. package/dist/frontend/folder-DeWhnD7O.js +45 -0
  43. package/dist/frontend/folder-refresh.js +1 -1
  44. package/dist/frontend/input-B5Rak-5G.js +23 -0
  45. package/dist/frontend/keyboard.js +1 -1
  46. package/dist/frontend/{keyboard.svelte-D7H8DihC.js → keyboard.svelte-CApmX0vl.js} +53 -53
  47. package/dist/frontend/label-CW9rxoAb.js +30 -0
  48. package/dist/frontend/{loader-circle-Bk-WFz9g.js → loader-circle-BA6aLO71.js} +86 -85
  49. package/dist/frontend/rotate-ccw-B4Q7brmV.js +25 -0
  50. package/dist/frontend/search.js +680 -654
  51. package/dist/frontend/select-value-sF86Geyh.js +1446 -0
  52. package/dist/frontend/shared-document.js +94 -94
  53. package/dist/frontend/subfolders-refresh-store.svelte-B2dKVmgz.js +65 -0
  54. package/dist/frontend/tag-HxRazVN_.js +54 -0
  55. package/dist/frontend/tag-store.svelte-CqrUXo0o.js +29 -0
  56. package/dist/frontend/textarea-i1720bE7.js +23 -0
  57. package/dist/frontend/theme.js +1 -1
  58. package/dist/frontend/theme.svelte-DKfCy12k.js +49 -0
  59. package/dist/frontend/{utils-C0OW2678.js → utils-CffiyuTo.js} +2 -3
  60. package/dist/frontend/{utils-D8kmM3ub.js → utils-hzdMVeCv.js} +2 -3
  61. package/dist/frontend/utils.js +1 -1
  62. package/dist/frontend/x-CzBsnJ2x.js +25 -0
  63. package/dist/frontend-ssr/api/attachments.js +2 -0
  64. package/dist/frontend-ssr/api/categories.js +2 -0
  65. package/dist/frontend-ssr/api/documents.js +2 -0
  66. package/dist/frontend-ssr/api/folders.js +2 -0
  67. package/dist/frontend-ssr/api/settings.js +2 -0
  68. package/dist/frontend-ssr/api/share.js +2 -0
  69. package/dist/frontend-ssr/api/tags.js +2 -0
  70. package/dist/frontend-ssr/assets/CategoryDialog-C2xaZKHq.js +584 -0
  71. package/dist/frontend-ssr/assets/ConfirmDialog-DjMFKc0V.js +420 -0
  72. package/dist/frontend-ssr/assets/CreateSnapshotDialog-BRw1xJW1.js +214 -0
  73. package/dist/frontend-ssr/assets/DatePicker-DnXniwlZ.js +312 -0
  74. package/dist/frontend-ssr/assets/DeleteDialog-BCfZy3Zn.js +154 -0
  75. package/dist/frontend-ssr/assets/FolderDialog-Dq7I2cKZ.js +429 -0
  76. package/dist/frontend-ssr/assets/FolderNode-DRfBfpft.js +171 -0
  77. package/dist/frontend-ssr/assets/FolderTreeSelector-DZNZ2oI6.js +147 -0
  78. package/dist/frontend-ssr/assets/Icon-B0Zqppjo.js +231 -0
  79. package/dist/frontend-ssr/assets/SettingsDialog-CX8Noa8A.js +1107 -0
  80. package/dist/frontend-ssr/assets/ShareDialog-Cge49ZdJ.js +54 -0
  81. package/dist/frontend-ssr/assets/TagCreateDialog-EAChgBF-.js +264 -0
  82. package/dist/frontend-ssr/assets/api-keys-DFqX39MT.js +35 -0
  83. package/dist/frontend-ssr/assets/attachments-CWBxE3Vz.js +85 -0
  84. package/dist/frontend-ssr/assets/auth-client-x26kqY8Z.js +1286 -0
  85. package/dist/frontend-ssr/assets/camera-CdxscTw-.js +84 -0
  86. package/dist/frontend-ssr/assets/categories-AOqgcsn4.js +75 -0
  87. package/dist/frontend-ssr/assets/chevron-down-CSSNGNh_.js +80 -0
  88. package/dist/frontend-ssr/assets/chevron-right-B4p7Sk6X.js +80 -0
  89. package/dist/frontend-ssr/assets/circle-check-CI1v4vYh.js +84 -0
  90. package/dist/frontend-ssr/assets/client-DZMkDkDn.js +129 -0
  91. package/dist/frontend-ssr/assets/clipboard-CXOaoz2W.js +30 -0
  92. package/dist/frontend-ssr/assets/clock-IL-eX2di.js +84 -0
  93. package/dist/frontend-ssr/assets/context-jz1GGEUi.js +45 -0
  94. package/dist/frontend-ssr/assets/copy-CjV57nGQ.js +87 -0
  95. package/dist/frontend-ssr/assets/db-CnxeO66n.js +65 -0
  96. package/dist/frontend-ssr/assets/dialog-BOV1u6zP.js +157 -0
  97. package/dist/frontend-ssr/assets/dndzone-DMvTO_Jz.js +2114 -0
  98. package/dist/frontend-ssr/assets/document-drop-coordinator-CEaYACsC.js +109 -0
  99. package/dist/frontend-ssr/assets/documents-BnOTRdTY.js +108 -0
  100. package/dist/frontend-ssr/assets/editorExtensions-DUzwndMy.js +186 -0
  101. package/dist/frontend-ssr/assets/ellipsis-vertical-C-0hgkZn.js +555 -0
  102. package/dist/frontend-ssr/assets/floating-layer-anchor-uzw9K8qN.js +6114 -0
  103. package/dist/frontend-ssr/assets/folder-DChhG7qN.js +80 -0
  104. package/dist/frontend-ssr/assets/folders-CTfbS24J.js +127 -0
  105. package/dist/frontend-ssr/assets/identity-B3uHoDtf.js +99 -0
  106. package/dist/frontend-ssr/assets/input-DezGsU3y.js +19 -0
  107. package/dist/frontend-ssr/assets/keyboard.svelte-BgF47N3L.js +174 -0
  108. package/dist/frontend-ssr/assets/label-Bj8-TfFN.js +21 -0
  109. package/dist/frontend-ssr/assets/loader-circle-DZsrZ-er.js +80 -0
  110. package/dist/frontend-ssr/assets/markdown-CjqvGi5W.js +20 -0
  111. package/dist/frontend-ssr/assets/messages-DhXqlcJI.js +11125 -0
  112. package/dist/frontend-ssr/assets/resolve-BqHozBXl.js +32 -0
  113. package/dist/frontend-ssr/assets/rotate-ccw-BlgWwaiq.js +80 -0
  114. package/dist/frontend-ssr/assets/select-value-DngdSmLI.js +1526 -0
  115. package/dist/frontend-ssr/assets/settings-E6qSAWM2.js +64 -0
  116. package/dist/frontend-ssr/assets/share-BTBJelxA.js +30 -0
  117. package/dist/frontend-ssr/assets/subfolders-refresh-store.svelte-DAh4gT16.js +77 -0
  118. package/dist/frontend-ssr/assets/tag-GZEuGWk1.js +166 -0
  119. package/dist/frontend-ssr/assets/tag-store.svelte-DPodKj6Z.js +21 -0
  120. package/dist/frontend-ssr/assets/tags-BId2wdYd.js +49 -0
  121. package/dist/frontend-ssr/assets/textarea-Dev-qSEc.js +21 -0
  122. package/dist/frontend-ssr/assets/theme.svelte-Co0-ssaD.js +67 -0
  123. package/dist/frontend-ssr/assets/utils-DtlPPXpJ.js +9 -0
  124. package/dist/frontend-ssr/assets/utils-DvZnctjz.js +23 -0
  125. package/dist/frontend-ssr/collaboration.js +39 -0
  126. package/dist/frontend-ssr/components/category-dialog.js +2 -0
  127. package/dist/frontend-ssr/components/create-snapshot-dialog.js +2 -0
  128. package/dist/frontend-ssr/components/delete-dialog.js +2 -0
  129. package/dist/frontend-ssr/components/editor/document-editor.js +2499 -0
  130. package/dist/frontend-ssr/components/editor/document-title.js +11 -0
  131. package/dist/frontend-ssr/components/editor/docx-serializer.js +186 -0
  132. package/dist/frontend-ssr/components/editor/extensions.js +2 -0
  133. package/dist/frontend-ssr/components/editor/markdown-toggle.js +20 -0
  134. package/dist/frontend-ssr/components/editor/markdown.js +2 -0
  135. package/dist/frontend-ssr/components/folder-node.js +2 -0
  136. package/dist/frontend-ssr/components/folder-tree-selector.js +2 -0
  137. package/dist/frontend-ssr/components/save-as-dialog.js +280 -0
  138. package/dist/frontend-ssr/components/settings.js +2 -0
  139. package/dist/frontend-ssr/components/share-dialog.js +2 -0
  140. package/dist/frontend-ssr/components/sidebar.js +2033 -0
  141. package/dist/frontend-ssr/components/tag-create-dialog.js +2 -0
  142. package/dist/frontend-ssr/components/version-history.js +370 -0
  143. package/dist/frontend-ssr/dashboard.js +2542 -0
  144. package/dist/frontend-ssr/doc-tabs.js +23 -0
  145. package/dist/frontend-ssr/document-drop-coordinator.js +2 -0
  146. package/dist/frontend-ssr/extension.js +13 -0
  147. package/dist/frontend-ssr/folder-refresh.js +2 -0
  148. package/dist/frontend-ssr/i18n.js +10 -0
  149. package/dist/frontend-ssr/keyboard.js +2 -0
  150. package/dist/frontend-ssr/offline/identity.js +2 -0
  151. package/dist/frontend-ssr/search.js +332 -0
  152. package/dist/frontend-ssr/shared-document.js +273 -0
  153. package/dist/frontend-ssr/theme.js +9 -0
  154. package/dist/frontend-ssr/types.js +1 -0
  155. package/dist/frontend-ssr/utils/clipboard.js +2 -0
  156. package/dist/frontend-ssr/utils/dndzone.js +2 -0
  157. package/dist/frontend-ssr/utils.js +2 -0
  158. package/package.json +22 -1
  159. package/packages/cli/src/index.ts +1 -1
  160. package/packages/db/src/schema.ts +3 -0
  161. package/packages/mcp-server/src/index.ts +1 -1
  162. package/dist/frontend/CategoryDialog--rIE7FrH.js +0 -580
  163. package/dist/frontend/ConfirmDialog-Cpzyb55f.js +0 -212
  164. package/dist/frontend/CreateSnapshotDialog-CmkV-n2A.js +0 -216
  165. package/dist/frontend/DatePicker-Byynca7V.js +0 -257
  166. package/dist/frontend/DeleteDialog-ap6nOywZ.js +0 -174
  167. package/dist/frontend/FolderDialog-DmN_trV0.js +0 -247
  168. package/dist/frontend/FolderNode-C4B8a2fd.js +0 -317
  169. package/dist/frontend/FolderTreeSelector-D6ijiZTA.js +0 -100
  170. package/dist/frontend/Icon-DtNo0N1U.js +0 -64
  171. package/dist/frontend/SettingsDialog-2kTaTXAs.js +0 -992
  172. package/dist/frontend/ShareDialog-BBDGNF5n.js +0 -165
  173. package/dist/frontend/TagCreateDialog-DiLZnJo4.js +0 -258
  174. package/dist/frontend/camera-B7dAOd4s.js +0 -28
  175. package/dist/frontend/check-CDwRlG9T.js +0 -24
  176. package/dist/frontend/chevron-down-B7ZrjUmT.js +0 -24
  177. package/dist/frontend/circle-check-CDqeMB2d.js +0 -28
  178. package/dist/frontend/client-Bc5Fzx40.js +0 -2785
  179. package/dist/frontend/clock-Ck5Sn-Zl.js +0 -28
  180. package/dist/frontend/clsx-nmtDPO_P.js +0 -16
  181. package/dist/frontend/copy-CMAA6GP0.js +0 -31
  182. package/dist/frontend/dialog-BDkiG42a.js +0 -213
  183. package/dist/frontend/disclose-version-5I57E3LD.js +0 -3
  184. package/dist/frontend/ellipsis-vertical-BBuPldbW.js +0 -519
  185. package/dist/frontend/folder-TQjKY4yn.js +0 -44
  186. package/dist/frontend/index-client-jobkrWVL.js +0 -86
  187. package/dist/frontend/input-CBI6p4Xl.js +0 -23
  188. package/dist/frontend/label-C-GkhEp4.js +0 -30
  189. package/dist/frontend/rotate-ccw-CleZtJ5D.js +0 -24
  190. package/dist/frontend/select-value-CvrWRkXW.js +0 -1436
  191. package/dist/frontend/subfolders-refresh-store.svelte-BsheoQma.js +0 -65
  192. package/dist/frontend/tag-Dx3SmucJ.js +0 -53
  193. package/dist/frontend/tag-store.svelte-CIaF4sdZ.js +0 -29
  194. package/dist/frontend/textarea-Dfp78XlL.js +0 -23
  195. package/dist/frontend/theme.svelte-CROg1Hi5.js +0 -49
  196. package/dist/frontend/x-DaTdeDXv.js +0 -24
@@ -0,0 +1,584 @@
1
+ import { _ as categories_update_error, b as categories_edit_title, f as categories_delete_success_description, fn as action_create, g as categories_delete_error, gn as action_save, h as categories_delete_title, hn as action_cancel, m as categories_delete_description, mn as action_delete, p as categories_delete_success, v as categories_create_error, x as categories_create_title, y as categories_name_placeholder } from "./messages-DhXqlcJI.js";
2
+ import { a as Dialog, i as Dialog_description, n as Dialog_header, o as Button, r as Dialog_footer, t as Dialog_title } from "./dialog-BOV1u6zP.js";
3
+ import { a as Select, i as Select_content, n as Select_trigger, r as Select_item, t as Select_value } from "./select-value-DngdSmLI.js";
4
+ import { t as Label } from "./label-Bj8-TfFN.js";
5
+ import { t as Copy } from "./copy-CjV57nGQ.js";
6
+ import { t as Circle_check } from "./circle-check-CI1v4vYh.js";
7
+ import { t as Loader_circle } from "./loader-circle-DZsrZ-er.js";
8
+ import { t as Input } from "./input-DezGsU3y.js";
9
+ import { a as listApiKeys, n as categoryIdFromScopes, o as revealCategoryApiKey, r as createCategoryApiKey, s as revokeApiKey, t as apiKeyClipboardValue } from "./api-keys-DFqX39MT.js";
10
+ import * as $ from "svelte/internal/server";
11
+ //#region src/lib/components/sidebar/category-dialog-feedback.ts
12
+ function categoryDialogErrorMessage(error, fallback) {
13
+ if (typeof error === "object" && error !== null && "status" in error && error.status === 409) return "A category with this name already exists.";
14
+ if (error instanceof Error && error.message.trim().length > 0) return error.message;
15
+ return fallback;
16
+ }
17
+ //#endregion
18
+ //#region src/lib/components/sidebar/CategoryDialog.svelte
19
+ function CategoryDialog($$renderer, $$props) {
20
+ $$renderer.component(($$renderer) => {
21
+ const Select$1 = {
22
+ Root: Select,
23
+ Content: Select_content,
24
+ Item: Select_item,
25
+ Trigger: Select_trigger,
26
+ Value: Select_value
27
+ };
28
+ let { open = false, mode, category, onSave, onDelete, onClose } = $$props;
29
+ let name = "";
30
+ let error = null;
31
+ let busy = false;
32
+ let apiMode = "unavailable";
33
+ let apiPermissionRead = false;
34
+ let apiPermissionEdit = false;
35
+ let apiPermissionWrite = false;
36
+ let categoryKeys = [];
37
+ let issuedKeys = {};
38
+ let latestIssuedId = null;
39
+ let keyBusy = false;
40
+ let createdCategoryName = null;
41
+ let createdCategoryKey = null;
42
+ let deletedCategoryName = null;
43
+ const latestIssuedKey = $.derived(() => latestIssuedId ? issuedKeys[latestIssuedId] : void 0);
44
+ async function refreshCategoryKeys(categoryId) {
45
+ categoryKeys = (await listApiKeys()).keys.filter((key) => categoryIdFromScopes(key.scopes) === categoryId);
46
+ }
47
+ async function issueCategoryKey() {
48
+ if (!category?.id) return;
49
+ keyBusy = true;
50
+ try {
51
+ const issued = await createCategoryApiKey(category.id);
52
+ issuedKeys = {
53
+ ...issuedKeys,
54
+ [issued.id]: issued.key
55
+ };
56
+ latestIssuedId = issued.id;
57
+ await refreshCategoryKeys(category.id);
58
+ } catch (err) {
59
+ error = err instanceof Error ? err.message : "Failed to create category API key";
60
+ } finally {
61
+ keyBusy = false;
62
+ }
63
+ }
64
+ async function revokeCategoryKey(id) {
65
+ if (!category?.id) return;
66
+ keyBusy = true;
67
+ try {
68
+ await revokeApiKey(id);
69
+ const { [id]: _revoked, ...remainingIssuedKeys } = issuedKeys;
70
+ issuedKeys = remainingIssuedKeys;
71
+ if (latestIssuedId === id) latestIssuedId = null;
72
+ await refreshCategoryKeys(category.id);
73
+ } finally {
74
+ keyBusy = false;
75
+ }
76
+ }
77
+ async function copyCategoryKey(key) {
78
+ const rawKey = issuedKeys[key.id] ?? await revealCategoryApiKey(key.id);
79
+ await navigator.clipboard.writeText(apiKeyClipboardValue(key, rawKey));
80
+ }
81
+ const trimmedName = $.derived(() => name.trim());
82
+ const isDeleteMode = $.derived(() => mode === "delete");
83
+ const hasAnyPermission = $.derived(() => apiPermissionRead || apiPermissionEdit || apiPermissionWrite);
84
+ const title = $.derived(() => deletedCategoryName ? categories_delete_success() : isDeleteMode() ? categories_delete_title() : mode === "edit" ? categories_edit_title() : categories_create_title());
85
+ const submitLabel = $.derived(() => isDeleteMode() ? action_delete() : mode === "edit" ? action_save() : action_create());
86
+ function normalizeApiMode(value) {
87
+ if (value === "category") return "category";
88
+ if (value === "global") return "global";
89
+ return "unavailable";
90
+ }
91
+ function applyPermissionPreset(preset) {
92
+ if (preset === "read") {
93
+ apiPermissionRead = true;
94
+ apiPermissionEdit = false;
95
+ apiPermissionWrite = false;
96
+ return;
97
+ }
98
+ if (preset === "write") {
99
+ apiPermissionRead = false;
100
+ apiPermissionEdit = false;
101
+ apiPermissionWrite = true;
102
+ return;
103
+ }
104
+ if (preset === "read-write") {
105
+ apiPermissionRead = true;
106
+ apiPermissionEdit = false;
107
+ apiPermissionWrite = true;
108
+ return;
109
+ }
110
+ apiPermissionRead = true;
111
+ apiPermissionEdit = true;
112
+ apiPermissionWrite = true;
113
+ }
114
+ async function handleSubmit(e) {
115
+ e?.preventDefault();
116
+ if (busy) return;
117
+ if (isDeleteMode()) {
118
+ if (!onDelete) {
119
+ close();
120
+ return;
121
+ }
122
+ busy = true;
123
+ try {
124
+ await onDelete();
125
+ deletedCategoryName = category?.name ?? "Category";
126
+ } catch (err) {
127
+ console.error("CategoryDialog: delete failed", err);
128
+ error = err instanceof Error ? err.message : categories_delete_error();
129
+ } finally {
130
+ busy = false;
131
+ }
132
+ return;
133
+ }
134
+ if (trimmedName().length === 0) {
135
+ error = "Name is required";
136
+ return;
137
+ }
138
+ if (apiMode !== "unavailable" && !hasAnyPermission()) {
139
+ error = "Select at least one permission";
140
+ return;
141
+ }
142
+ if (!onSave) {
143
+ close();
144
+ return;
145
+ }
146
+ error = null;
147
+ busy = true;
148
+ try {
149
+ const savedCategory = await onSave({
150
+ name: trimmedName(),
151
+ apiMode: normalizeApiMode(apiMode),
152
+ apiPermissionRead: apiMode === "unavailable" ? false : apiPermissionRead,
153
+ apiPermissionEdit: apiMode === "unavailable" ? false : apiPermissionEdit,
154
+ apiPermissionWrite: apiMode === "unavailable" ? false : apiPermissionWrite
155
+ });
156
+ if (mode === "create" && savedCategory) {
157
+ createdCategoryName = savedCategory.name;
158
+ if (apiMode === "category") try {
159
+ createdCategoryKey = (await createCategoryApiKey(savedCategory.id)).key;
160
+ } catch (keyError) {
161
+ error = `Category created, but its API key could not be created: ${categoryDialogErrorMessage(keyError, "Unknown error")}`;
162
+ }
163
+ return;
164
+ }
165
+ close();
166
+ } catch (err) {
167
+ console.error("CategoryDialog: save failed", err);
168
+ error = categoryDialogErrorMessage(err, mode === "edit" ? categories_update_error() : categories_create_error());
169
+ } finally {
170
+ busy = false;
171
+ }
172
+ }
173
+ function close() {
174
+ if (busy) return;
175
+ open = false;
176
+ onClose?.();
177
+ }
178
+ function handleDialogOpenChange(next) {
179
+ if (!next && busy) {
180
+ open = true;
181
+ return;
182
+ }
183
+ if (!next) close();
184
+ }
185
+ let $$settled = true;
186
+ let $$inner_renderer;
187
+ function $$render_inner($$renderer) {
188
+ Dialog($$renderer, {
189
+ onOpenChange: handleDialogOpenChange,
190
+ get open() {
191
+ return open;
192
+ },
193
+ set open($$value) {
194
+ open = $$value;
195
+ $$settled = false;
196
+ },
197
+ children: ($$renderer) => {
198
+ Dialog_header($$renderer, {
199
+ children: ($$renderer) => {
200
+ Dialog_title($$renderer, {
201
+ children: ($$renderer) => {
202
+ $$renderer.push(`<!---->${$.escape(title())}`);
203
+ },
204
+ $$slots: { default: true }
205
+ });
206
+ $$renderer.push(`<!----> `);
207
+ if (deletedCategoryName) {
208
+ $$renderer.push("<!--[0-->");
209
+ Dialog_description($$renderer, {
210
+ children: ($$renderer) => {
211
+ $$renderer.push(`<span class="font-medium text-foreground">“${$.escape(deletedCategoryName)}”</span> ${$.escape(categories_delete_success_description())}`);
212
+ },
213
+ $$slots: { default: true }
214
+ });
215
+ } else if (isDeleteMode()) {
216
+ $$renderer.push("<!--[1-->");
217
+ Dialog_description($$renderer, {
218
+ children: ($$renderer) => {
219
+ $$renderer.push(`<!---->Delete <span class="font-medium text-foreground">“${$.escape(category?.name ?? "Category")}”</span>?
220
+ ${$.escape(categories_delete_description())}`);
221
+ },
222
+ $$slots: { default: true }
223
+ });
224
+ } else {
225
+ $$renderer.push("<!--[-1-->");
226
+ Dialog_description($$renderer, {
227
+ children: ($$renderer) => {
228
+ $$renderer.push(`<!---->${$.escape(categories_name_placeholder())}`);
229
+ },
230
+ $$slots: { default: true }
231
+ });
232
+ }
233
+ $$renderer.push(`<!--]-->`);
234
+ },
235
+ $$slots: { default: true }
236
+ });
237
+ $$renderer.push(`<!----> `);
238
+ if (deletedCategoryName) {
239
+ $$renderer.push("<!--[0-->");
240
+ $$renderer.push(`<div class="flex items-start gap-3 rounded-lg border border-primary/30 bg-primary/10 p-4" role="status" aria-live="polite">`);
241
+ Circle_check($$renderer, { class: "mt-0.5 size-5 shrink-0 text-primary" });
242
+ $$renderer.push(`<!----> <div><p class="text-sm font-medium text-foreground">${$.escape(categories_delete_success())}</p> <p class="text-sm text-muted-foreground"><span class="font-medium text-foreground">“${$.escape(deletedCategoryName)}”</span> ${$.escape(categories_delete_success_description())}</p></div></div>`);
243
+ } else if (createdCategoryName) {
244
+ $$renderer.push("<!--[1-->");
245
+ $$renderer.push(`<div class="space-y-3 rounded-lg border border-primary/30 bg-primary/10 p-4" role="status" aria-live="polite"><div class="flex items-start gap-3">`);
246
+ Circle_check($$renderer, { class: "mt-0.5 size-5 shrink-0 text-primary" });
247
+ $$renderer.push(`<!----> <div><p class="text-sm font-medium text-foreground">Category created</p> <p class="text-sm text-muted-foreground">${$.escape(createdCategoryName)} is ready to use.</p></div></div> `);
248
+ if (createdCategoryKey) {
249
+ $$renderer.push("<!--[0-->");
250
+ $$renderer.push(`<div class="rounded-md border border-primary/20 bg-background/80 p-3"><p class="text-xs font-medium text-foreground">Copy the API key now. It remains available in Settings → API.</p> <code class="mt-2 block break-all rounded bg-muted p-2 text-xs text-foreground">${$.escape(createdCategoryKey)}</code> `);
251
+ Button($$renderer, {
252
+ type: "button",
253
+ size: "sm",
254
+ variant: "outline",
255
+ class: "mt-2",
256
+ onclick: () => navigator.clipboard.writeText(createdCategoryKey ?? ""),
257
+ children: ($$renderer) => {
258
+ Copy($$renderer, { class: "mr-1 size-3.5" });
259
+ $$renderer.push(`<!----> Copy API key`);
260
+ },
261
+ $$slots: { default: true }
262
+ });
263
+ $$renderer.push(`<!----></div>`);
264
+ } else $$renderer.push("<!--[-1-->");
265
+ $$renderer.push(`<!--]--> `);
266
+ if (error) {
267
+ $$renderer.push("<!--[0-->");
268
+ $$renderer.push(`<p class="text-xs text-destructive" role="alert">${$.escape(error)}</p>`);
269
+ } else $$renderer.push("<!--[-1-->");
270
+ $$renderer.push(`<!--]--></div>`);
271
+ } else if (!isDeleteMode()) {
272
+ $$renderer.push("<!--[2-->");
273
+ $$renderer.push(`<form class="space-y-4"><div class="space-y-2">`);
274
+ Label($$renderer, {
275
+ for: "category-dialog-name",
276
+ children: ($$renderer) => {
277
+ $$renderer.push(`<!---->${$.escape(categories_name_placeholder())}`);
278
+ },
279
+ $$slots: { default: true }
280
+ });
281
+ $$renderer.push(`<!----> `);
282
+ Input($$renderer, {
283
+ id: "category-dialog-name",
284
+ name: "name",
285
+ type: "text",
286
+ placeholder: categories_name_placeholder(),
287
+ maxlength: 255,
288
+ required: true,
289
+ disabled: busy,
290
+ "aria-invalid": error ? "true" : void 0,
291
+ "aria-describedby": error ? "category-dialog-name-error" : void 0,
292
+ autocomplete: "off",
293
+ get value() {
294
+ return name;
295
+ },
296
+ set value($$value) {
297
+ name = $$value;
298
+ $$settled = false;
299
+ }
300
+ });
301
+ $$renderer.push(`<!----> `);
302
+ if (error) {
303
+ $$renderer.push("<!--[0-->");
304
+ $$renderer.push(`<p id="category-dialog-name-error" class="text-xs text-destructive" role="alert">${$.escape(error)}</p>`);
305
+ } else $$renderer.push("<!--[-1-->");
306
+ $$renderer.push(`<!--]--></div> <div class="space-y-2">`);
307
+ Label($$renderer, {
308
+ for: "category-dialog-api-mode",
309
+ children: ($$renderer) => {
310
+ $$renderer.push(`<!---->API access`);
311
+ },
312
+ $$slots: { default: true }
313
+ });
314
+ $$renderer.push(`<!----> `);
315
+ if (Select$1.Root) {
316
+ $$renderer.push("<!--[-->");
317
+ Select$1.Root($$renderer, {
318
+ type: "single",
319
+ value: apiMode,
320
+ disabled: busy,
321
+ onValueChange: (value) => {
322
+ if (value === "unavailable" || value === "global" || value === "category") apiMode = value;
323
+ },
324
+ children: ($$renderer) => {
325
+ if (Select$1.Trigger) {
326
+ $$renderer.push("<!--[-->");
327
+ Select$1.Trigger($$renderer, {
328
+ id: "category-dialog-api-mode",
329
+ class: "h-10 w-full",
330
+ children: ($$renderer) => {
331
+ if (Select$1.Value) {
332
+ $$renderer.push("<!--[-->");
333
+ Select$1.Value($$renderer, {
334
+ placeholder: "Select API access",
335
+ children: ($$renderer) => {
336
+ $$renderer.push(`<!---->${$.escape(apiMode === "unavailable" ? "Unavailable" : apiMode === "global" ? "Global" : "Category API")}`);
337
+ },
338
+ $$slots: { default: true }
339
+ });
340
+ $$renderer.push("<!--]-->");
341
+ } else {
342
+ $$renderer.push("<!--[!-->");
343
+ $$renderer.push("<!--]-->");
344
+ }
345
+ },
346
+ $$slots: { default: true }
347
+ });
348
+ $$renderer.push("<!--]-->");
349
+ } else {
350
+ $$renderer.push("<!--[!-->");
351
+ $$renderer.push("<!--]-->");
352
+ }
353
+ $$renderer.push(` `);
354
+ if (Select$1.Content) {
355
+ $$renderer.push("<!--[-->");
356
+ Select$1.Content($$renderer, {
357
+ children: ($$renderer) => {
358
+ if (Select$1.Item) {
359
+ $$renderer.push("<!--[-->");
360
+ Select$1.Item($$renderer, {
361
+ value: "unavailable",
362
+ children: ($$renderer) => {
363
+ $$renderer.push(`<!---->Unavailable`);
364
+ },
365
+ $$slots: { default: true }
366
+ });
367
+ $$renderer.push("<!--]-->");
368
+ } else {
369
+ $$renderer.push("<!--[!-->");
370
+ $$renderer.push("<!--]-->");
371
+ }
372
+ $$renderer.push(` `);
373
+ if (Select$1.Item) {
374
+ $$renderer.push("<!--[-->");
375
+ Select$1.Item($$renderer, {
376
+ value: "global",
377
+ children: ($$renderer) => {
378
+ $$renderer.push(`<!---->Global`);
379
+ },
380
+ $$slots: { default: true }
381
+ });
382
+ $$renderer.push("<!--]-->");
383
+ } else {
384
+ $$renderer.push("<!--[!-->");
385
+ $$renderer.push("<!--]-->");
386
+ }
387
+ $$renderer.push(` `);
388
+ if (Select$1.Item) {
389
+ $$renderer.push("<!--[-->");
390
+ Select$1.Item($$renderer, {
391
+ value: "category",
392
+ children: ($$renderer) => {
393
+ $$renderer.push(`<!---->Category API`);
394
+ },
395
+ $$slots: { default: true }
396
+ });
397
+ $$renderer.push("<!--]-->");
398
+ } else {
399
+ $$renderer.push("<!--[!-->");
400
+ $$renderer.push("<!--]-->");
401
+ }
402
+ },
403
+ $$slots: { default: true }
404
+ });
405
+ $$renderer.push("<!--]-->");
406
+ } else {
407
+ $$renderer.push("<!--[!-->");
408
+ $$renderer.push("<!--]-->");
409
+ }
410
+ },
411
+ $$slots: { default: true }
412
+ });
413
+ $$renderer.push("<!--]-->");
414
+ } else {
415
+ $$renderer.push("<!--[!-->");
416
+ $$renderer.push("<!--]-->");
417
+ }
418
+ $$renderer.push(`</div> `);
419
+ if (apiMode !== "unavailable") {
420
+ $$renderer.push("<!--[0-->");
421
+ $$renderer.push(`<div class="space-y-3 rounded-md border border-border/70 bg-muted/30 p-3"><div class="flex flex-wrap items-center justify-between gap-2">`);
422
+ Label($$renderer, {
423
+ class: "text-sm",
424
+ children: ($$renderer) => {
425
+ $$renderer.push(`<!---->Permissions`);
426
+ },
427
+ $$slots: { default: true }
428
+ });
429
+ $$renderer.push(`<!----> <div class="flex flex-wrap gap-2">`);
430
+ Button($$renderer, {
431
+ type: "button",
432
+ variant: "outline",
433
+ size: "sm",
434
+ onclick: () => applyPermissionPreset("read-write"),
435
+ children: ($$renderer) => {
436
+ $$renderer.push(`<!---->Read / Write`);
437
+ },
438
+ $$slots: { default: true }
439
+ });
440
+ $$renderer.push(`<!----> `);
441
+ Button($$renderer, {
442
+ type: "button",
443
+ variant: "outline",
444
+ size: "sm",
445
+ onclick: () => applyPermissionPreset("read-edit-write"),
446
+ children: ($$renderer) => {
447
+ $$renderer.push(`<!---->Read / Edit / Write`);
448
+ },
449
+ $$slots: { default: true }
450
+ });
451
+ $$renderer.push(`<!----></div></div> <div class="grid gap-2 sm:grid-cols-3"><label class="flex items-center gap-2 rounded-md border border-border/60 bg-background px-3 py-2 text-sm"><input${$.attr("checked", apiPermissionRead, true)}${$.attr("disabled", busy, true)} type="checkbox" class="size-4 rounded border-input"/> <span>Read</span></label> <label class="flex items-center gap-2 rounded-md border border-border/60 bg-background px-3 py-2 text-sm"><input${$.attr("checked", apiPermissionEdit, true)}${$.attr("disabled", busy, true)} type="checkbox" class="size-4 rounded border-input"/> <span>Edit</span></label> <label class="flex items-center gap-2 rounded-md border border-border/60 bg-background px-3 py-2 text-sm"><input${$.attr("checked", apiPermissionWrite, true)}${$.attr("disabled", busy, true)} type="checkbox" class="size-4 rounded border-input"/> <span>Write</span></label></div></div>`);
452
+ } else $$renderer.push("<!--[-1-->");
453
+ $$renderer.push(`<!--]--> `);
454
+ if (mode === "edit" && apiMode === "category" && category?.id) {
455
+ $$renderer.push("<!--[0-->");
456
+ $$renderer.push(`<div class="space-y-3 rounded-md border border-border/70 p-3"><div class="flex items-center justify-between gap-2"><div>`);
457
+ Label($$renderer, {
458
+ children: ($$renderer) => {
459
+ $$renderer.push(`<!---->Category API keys`);
460
+ },
461
+ $$slots: { default: true }
462
+ });
463
+ $$renderer.push(`<!----><p class="text-xs text-muted-foreground">Keys inherit the saved permissions above.</p></div> `);
464
+ Button($$renderer, {
465
+ type: "button",
466
+ size: "sm",
467
+ onclick: issueCategoryKey,
468
+ disabled: busy || keyBusy || category.apiMode !== "category",
469
+ children: ($$renderer) => {
470
+ $$renderer.push(`<!---->Create key`);
471
+ },
472
+ $$slots: { default: true }
473
+ });
474
+ $$renderer.push(`<!----></div> `);
475
+ if (category.apiMode !== "category") {
476
+ $$renderer.push("<!--[0-->");
477
+ $$renderer.push(`<p class="text-xs text-muted-foreground">Save Category API access first, then reopen settings to issue a key.</p>`);
478
+ } else $$renderer.push("<!--[-1-->");
479
+ $$renderer.push(`<!--]--> `);
480
+ if (latestIssuedKey()) {
481
+ $$renderer.push("<!--[0-->");
482
+ $$renderer.push(`<div class="rounded-lg border border-primary/30 bg-primary/10 p-3 text-primary"><p class="text-xs font-medium">Copy now — this raw key is shown once.</p> <code class="mt-1 block break-all rounded bg-background/80 p-2 text-xs text-foreground">${$.escape(latestIssuedKey())}</code> `);
483
+ Button($$renderer, {
484
+ type: "button",
485
+ size: "sm",
486
+ variant: "outline",
487
+ class: "mt-2",
488
+ onclick: () => navigator.clipboard.writeText(latestIssuedKey()),
489
+ children: ($$renderer) => {
490
+ $$renderer.push(`<!---->Copy key`);
491
+ },
492
+ $$slots: { default: true }
493
+ });
494
+ $$renderer.push(`<!----></div>`);
495
+ } else $$renderer.push("<!--[-1-->");
496
+ $$renderer.push(`<!--]--> <div class="max-h-48 space-y-2 overflow-y-auto pr-1"><!--[-->`);
497
+ const each_array = $.ensure_array_like(categoryKeys);
498
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
499
+ let key = each_array[$$index];
500
+ $$renderer.push(`<div class="flex items-center justify-between gap-3 rounded-md bg-muted/40 px-3 py-2 text-xs"><span>${$.escape(key.name)} · ${$.escape(key.prefix)}…</span> <div class="flex shrink-0 gap-2">`);
501
+ Button($$renderer, {
502
+ type: "button",
503
+ size: "sm",
504
+ variant: "outline",
505
+ onclick: () => copyCategoryKey(key),
506
+ disabled: !key.recoverable && !issuedKeys[key.id],
507
+ children: ($$renderer) => {
508
+ $$renderer.push(`<!---->${$.escape(key.recoverable || issuedKeys[key.id] ? "Copy key" : "Rotate to enable copy")}`);
509
+ },
510
+ $$slots: { default: true }
511
+ });
512
+ $$renderer.push(`<!----> `);
513
+ Button($$renderer, {
514
+ type: "button",
515
+ size: "sm",
516
+ variant: "destructive",
517
+ onclick: () => revokeCategoryKey(key.id),
518
+ disabled: keyBusy,
519
+ children: ($$renderer) => {
520
+ $$renderer.push(`<!---->Revoke`);
521
+ },
522
+ $$slots: { default: true }
523
+ });
524
+ $$renderer.push(`<!----></div></div>`);
525
+ }
526
+ $$renderer.push(`<!--]--></div></div>`);
527
+ } else $$renderer.push("<!--[-1-->");
528
+ $$renderer.push(`<!--]--></form>`);
529
+ } else if (error) {
530
+ $$renderer.push("<!--[3-->");
531
+ $$renderer.push(`<p class="text-xs text-destructive" role="alert">${$.escape(error)}</p>`);
532
+ } else $$renderer.push("<!--[-1-->");
533
+ $$renderer.push(`<!--]--> `);
534
+ Dialog_footer($$renderer, {
535
+ class: "gap-2 max-sm:flex-col max-sm:items-stretch",
536
+ children: ($$renderer) => {
537
+ if (!createdCategoryName && !deletedCategoryName) {
538
+ $$renderer.push("<!--[0-->");
539
+ Button($$renderer, {
540
+ variant: "outline",
541
+ type: "button",
542
+ onclick: close,
543
+ disabled: busy,
544
+ children: ($$renderer) => {
545
+ $$renderer.push(`<!---->${$.escape(action_cancel())}`);
546
+ },
547
+ $$slots: { default: true }
548
+ });
549
+ } else $$renderer.push("<!--[-1-->");
550
+ $$renderer.push(`<!--]--> `);
551
+ Button($$renderer, {
552
+ type: isDeleteMode() ? "button" : "submit",
553
+ variant: isDeleteMode() ? "destructive" : "default",
554
+ onclick: createdCategoryName || deletedCategoryName ? close : handleSubmit,
555
+ disabled: busy || !isDeleteMode() && !createdCategoryName && !deletedCategoryName && trimmedName().length === 0,
556
+ children: ($$renderer) => {
557
+ if (busy) {
558
+ $$renderer.push("<!--[0-->");
559
+ Loader_circle($$renderer, { class: "mr-1 size-4 animate-spin" });
560
+ } else $$renderer.push("<!--[-1-->");
561
+ $$renderer.push(`<!--]--> ${$.escape(createdCategoryName || deletedCategoryName ? "Done" : submitLabel())}`);
562
+ },
563
+ $$slots: { default: true }
564
+ });
565
+ $$renderer.push(`<!---->`);
566
+ },
567
+ $$slots: { default: true }
568
+ });
569
+ $$renderer.push(`<!---->`);
570
+ },
571
+ $$slots: { default: true }
572
+ });
573
+ }
574
+ do {
575
+ $$settled = true;
576
+ $$inner_renderer = $$renderer.copy();
577
+ $$render_inner($$inner_renderer);
578
+ } while (!$$settled);
579
+ $$renderer.subsume($$inner_renderer);
580
+ $.bind_props($$props, { open });
581
+ });
582
+ }
583
+ //#endregion
584
+ export { CategoryDialog as t };