@mulmoclaude/collection-plugin 0.5.8 → 0.5.11

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 (118) hide show
  1. package/dist/style.css +15 -248
  2. package/dist/vue/collectionViewMode.d.ts +10 -1
  3. package/dist/vue/collectionViewMode.d.ts.map +1 -1
  4. package/dist/vue/components/CollectionCalendarView.vue.d.ts +1 -2
  5. package/dist/vue/components/CollectionCalendarView.vue.d.ts.map +1 -1
  6. package/dist/vue/components/CollectionCustomView.vue.d.ts +1 -1
  7. package/dist/vue/components/CollectionCustomView.vue.d.ts.map +1 -1
  8. package/dist/vue/components/CollectionDayView.vue.d.ts +1 -2
  9. package/dist/vue/components/CollectionDayView.vue.d.ts.map +1 -1
  10. package/dist/vue/components/CollectionEmbedView.vue.d.ts +1 -1
  11. package/dist/vue/components/CollectionEmbedView.vue.d.ts.map +1 -1
  12. package/dist/vue/components/CollectionKanbanView.vue.d.ts +1 -2
  13. package/dist/vue/components/CollectionKanbanView.vue.d.ts.map +1 -1
  14. package/dist/vue/components/CollectionRecordPanel.vue.d.ts +5 -6
  15. package/dist/vue/components/CollectionRecordPanel.vue.d.ts.map +1 -1
  16. package/dist/vue/components/CollectionView.vue.d.ts +18 -3
  17. package/dist/vue/components/CollectionView.vue.d.ts.map +1 -1
  18. package/dist/vue/components/CollectionViewConfigModal.vue.d.ts +1 -1
  19. package/dist/vue/components/CollectionViewConfigModal.vue.d.ts.map +1 -1
  20. package/dist/vue/index.d.ts +2 -2
  21. package/dist/vue/index.d.ts.map +1 -1
  22. package/dist/vue/lang/de.d.ts.map +1 -1
  23. package/dist/vue/lang/en.d.ts +1 -0
  24. package/dist/vue/lang/en.d.ts.map +1 -1
  25. package/dist/vue/lang/es.d.ts.map +1 -1
  26. package/dist/vue/lang/fr.d.ts.map +1 -1
  27. package/dist/vue/lang/index.d.ts +1 -0
  28. package/dist/vue/lang/index.d.ts.map +1 -1
  29. package/dist/vue/lang/ja.d.ts.map +1 -1
  30. package/dist/vue/lang/ko.d.ts.map +1 -1
  31. package/dist/vue/lang/ptBR.d.ts.map +1 -1
  32. package/dist/vue/lang/zh.d.ts.map +1 -1
  33. package/dist/vue/uiContext.d.ts +7 -3
  34. package/dist/vue/uiContext.d.ts.map +1 -1
  35. package/dist/vue/useCollectionRendering.d.ts +1 -2
  36. package/dist/vue/useCollectionRendering.d.ts.map +1 -1
  37. package/dist/vue.cjs +296 -219
  38. package/dist/vue.cjs.map +1 -1
  39. package/dist/vue.js +213 -159
  40. package/dist/vue.js.map +1 -1
  41. package/package.json +10 -20
  42. package/dist/chunk-CKQMccvm.cjs +0 -28
  43. package/dist/core/actionVisible.d.ts +0 -35
  44. package/dist/core/actionVisible.d.ts.map +0 -1
  45. package/dist/core/calendarGrid.d.ts +0 -121
  46. package/dist/core/calendarGrid.d.ts.map +0 -1
  47. package/dist/core/deriveAll.d.ts +0 -39
  48. package/dist/core/deriveAll.d.ts.map +0 -1
  49. package/dist/core/derivedFormula.d.ts +0 -19
  50. package/dist/core/derivedFormula.d.ts.map +0 -1
  51. package/dist/core/draft.d.ts +0 -19
  52. package/dist/core/draft.d.ts.map +0 -1
  53. package/dist/core/enumColors.d.ts +0 -34
  54. package/dist/core/enumColors.d.ts.map +0 -1
  55. package/dist/core/errorMessage.d.ts +0 -5
  56. package/dist/core/errorMessage.d.ts.map +0 -1
  57. package/dist/core/itemLabel.d.ts +0 -13
  58. package/dist/core/itemLabel.d.ts.map +0 -1
  59. package/dist/core/presentCollection.d.ts +0 -14
  60. package/dist/core/presentCollection.d.ts.map +0 -1
  61. package/dist/core/promptSafety.d.ts +0 -2
  62. package/dist/core/promptSafety.d.ts.map +0 -1
  63. package/dist/core/schema.d.ts +0 -356
  64. package/dist/core/schema.d.ts.map +0 -1
  65. package/dist/core/shortHexId.d.ts +0 -9
  66. package/dist/core/shortHexId.d.ts.map +0 -1
  67. package/dist/core/sortItems.d.ts +0 -30
  68. package/dist/core/sortItems.d.ts.map +0 -1
  69. package/dist/core/uiTypes.d.ts +0 -107
  70. package/dist/core/uiTypes.d.ts.map +0 -1
  71. package/dist/deriveAll-BHcs1erT.js +0 -342
  72. package/dist/deriveAll-BHcs1erT.js.map +0 -1
  73. package/dist/deriveAll-BJ0Lvm1Q.cjs +0 -359
  74. package/dist/deriveAll-BJ0Lvm1Q.cjs.map +0 -1
  75. package/dist/index.cjs +0 -57
  76. package/dist/index.d.ts +0 -15
  77. package/dist/index.d.ts.map +0 -1
  78. package/dist/index.js +0 -4
  79. package/dist/promptSafety-B0pPJkfQ.cjs +0 -1020
  80. package/dist/promptSafety-B0pPJkfQ.cjs.map +0 -1
  81. package/dist/promptSafety-DIQ2yDca.js +0 -739
  82. package/dist/promptSafety-DIQ2yDca.js.map +0 -1
  83. package/dist/schema-5P5ZJPrY.cjs +0 -42
  84. package/dist/schema-5P5ZJPrY.cjs.map +0 -1
  85. package/dist/schema-BcnitlL8.js +0 -25
  86. package/dist/schema-BcnitlL8.js.map +0 -1
  87. package/dist/server/atomic.d.ts +0 -2
  88. package/dist/server/atomic.d.ts.map +0 -1
  89. package/dist/server/delete.d.ts +0 -39
  90. package/dist/server/delete.d.ts.map +0 -1
  91. package/dist/server/derive.d.ts +0 -9
  92. package/dist/server/derive.d.ts.map +0 -1
  93. package/dist/server/discoveredCollection.d.ts +0 -19
  94. package/dist/server/discoveredCollection.d.ts.map +0 -1
  95. package/dist/server/discovery.d.ts +0 -228
  96. package/dist/server/discovery.d.ts.map +0 -1
  97. package/dist/server/host.d.ts +0 -78
  98. package/dist/server/host.d.ts.map +0 -1
  99. package/dist/server/index.d.ts +0 -12
  100. package/dist/server/index.d.ts.map +0 -1
  101. package/dist/server/io.d.ts +0 -115
  102. package/dist/server/io.d.ts.map +0 -1
  103. package/dist/server/paths.d.ts +0 -53
  104. package/dist/server/paths.d.ts.map +0 -1
  105. package/dist/server/spawn.d.ts +0 -56
  106. package/dist/server/spawn.d.ts.map +0 -1
  107. package/dist/server/templatePath.d.ts +0 -26
  108. package/dist/server/templatePath.d.ts.map +0 -1
  109. package/dist/server/util.d.ts +0 -4
  110. package/dist/server/util.d.ts.map +0 -1
  111. package/dist/server/validate.d.ts +0 -20
  112. package/dist/server/validate.d.ts.map +0 -1
  113. package/dist/server/views.d.ts +0 -21
  114. package/dist/server/views.d.ts.map +0 -1
  115. package/dist/server.cjs +0 -1759
  116. package/dist/server.cjs.map +0 -1
  117. package/dist/server.js +0 -1709
  118. package/dist/server.js.map +0 -1
package/dist/vue.js CHANGED
@@ -1,5 +1,4 @@
1
- import { A as buildUpdatedRecord, C as dateSortValue, D as numericSortValue, E as nextSortDirection, F as rowFromItem, G as TOOL_DEFINITION, I as actionVisible, L as fieldVisible, M as draftToRecord, N as emptyRow, O as sortItems, P as firstMissingRequiredField, T as isSortableField, W as resolveEnumColor, _ as ymdKey, a as assignLanes, b as labelFieldFor, i as MINUTES_PER_DAY, j as coerceInlineValue, k as stringSortValue, l as dateOf, n as shortHexId, o as bucketRecords, q as executePresentCollection, r as errorMessage, s as buildMonthGrid, t as defangForPrompt, u as daySlice, v as itemIdOf, w as enumSortValue, x as boolSortValue, y as itemLabelOf } from "./promptSafety-DIQ2yDca.js";
2
- import { t as deriveAll } from "./deriveAll-BHcs1erT.js";
1
+ import { MINUTES_PER_DAY, TOOL_DEFINITION, actionVisible, assignLanes, boolSortValue, bucketRecords, buildMonthGrid, buildUpdatedRecord, coerceInlineValue, dateOf, dateSortValue, daySlice, defangForPrompt, deriveAll, draftToRecord, emptyRow, enumSortValue, errorMessage, executePresentCollection, fieldVisible, firstMissingRequiredField, isSortableField, itemIdOf, itemLabelOf, labelFieldFor, nextSortDirection, numericSortValue, resolveEnumColor, rowFromItem, shortHexId, sortItems, stringSortValue, ymdKey } from "@mulmoclaude/core/collection";
3
2
  import { Fragment, Teleport, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, effectScope, mergeModels, nextTick, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, onUnmounted, openBlock, ref, renderList, renderSlot, resolveDynamicComponent, toDisplayString, unref, useModel, vModelCheckbox, vModelDynamic, vModelSelect, vModelText, watch, watchEffect, withCtx, withDirectives, withKeys, withModifiers } from "vue";
4
3
  import { createI18n } from "vue-i18n";
5
4
  import draggable from "vuedraggable";
@@ -61,6 +60,7 @@ var i18n = createI18n({
61
60
  chat: "Chat",
62
61
  refreshFeed: "Refresh",
63
62
  refreshFailed: "Refresh failed: {error}",
63
+ refreshDispatched: "Refresh started in the background.",
64
64
  feedChatSeed: "The \"{slug}\" feed is defined by the schema at `feeds/{slug}/schema.json` and its records live in `{dataPath}/` (one `<id>.json` per record). Using that schema and data, respond to this request: {message}",
65
65
  feedsTitle: "Data-source feeds",
66
66
  feedsEmpty: "No feeds registered yet.",
@@ -164,6 +164,7 @@ var i18n = createI18n({
164
164
  chat: "チャット",
165
165
  refreshFeed: "更新",
166
166
  refreshFailed: "更新に失敗しました: {error}",
167
+ refreshDispatched: "バックグラウンドで更新を開始しました。",
167
168
  feedChatSeed: "フィード「{slug}」はスキーマ `feeds/{slug}/schema.json` で定義され、レコードは `{dataPath}/`(1 レコードにつき `<id>.json` 1 ファイル)に保存されています。このスキーマとデータを使って、次のリクエストに応えてください: {message}",
168
169
  feedsTitle: "データソースフィード",
169
170
  feedsEmpty: "登録されたフィードはありません。",
@@ -267,6 +268,7 @@ var i18n = createI18n({
267
268
  chat: "对话",
268
269
  refreshFeed: "刷新",
269
270
  refreshFailed: "刷新失败:{error}",
271
+ refreshDispatched: "已在后台开始刷新。",
270
272
  feedChatSeed: "订阅源“{slug}”由 schema `feeds/{slug}/schema.json` 定义,其记录保存在 `{dataPath}/`(每条记录一个 `<id>.json` 文件)。请使用该 schema 和数据来响应以下请求:{message}",
271
273
  feedsTitle: "数据源订阅",
272
274
  feedsEmpty: "尚未注册任何订阅源。",
@@ -370,6 +372,7 @@ var i18n = createI18n({
370
372
  chat: "채팅",
371
373
  refreshFeed: "새로고침",
372
374
  refreshFailed: "새로고침 실패: {error}",
375
+ refreshDispatched: "백그라운드에서 새로고침을 시작했습니다.",
373
376
  feedChatSeed: "“{slug}” 피드는 스키마 `feeds/{slug}/schema.json`로 정의되며, 레코드는 `{dataPath}/`(레코드당 `<id>.json` 파일 하나)에 저장됩니다. 이 스키마와 데이터를 사용하여 다음 요청에 응답하세요: {message}",
374
377
  feedsTitle: "데이터 소스 피드",
375
378
  feedsEmpty: "등록된 피드가 없습니다.",
@@ -473,6 +476,7 @@ var i18n = createI18n({
473
476
  chat: "Chat",
474
477
  refreshFeed: "Actualizar",
475
478
  refreshFailed: "Error al actualizar: {error}",
479
+ refreshDispatched: "Actualización iniciada en segundo plano.",
476
480
  feedChatSeed: "El feed «{slug}» está definido por el esquema `feeds/{slug}/schema.json` y sus registros se guardan en `{dataPath}/` (un archivo `<id>.json` por registro). Usa ese esquema y esos datos para responder a esta solicitud: {message}",
477
481
  feedsTitle: "Fuentes de datos",
478
482
  feedsEmpty: "Aún no hay fuentes registradas.",
@@ -576,6 +580,7 @@ var i18n = createI18n({
576
580
  chat: "Chat",
577
581
  refreshFeed: "Atualizar",
578
582
  refreshFailed: "Falha ao atualizar: {error}",
583
+ refreshDispatched: "Atualização iniciada em segundo plano.",
579
584
  feedChatSeed: "O feed \"{slug}\" é definido pelo esquema `feeds/{slug}/schema.json` e seus registros ficam em `{dataPath}/` (um arquivo `<id>.json` por registro). Use esse esquema e esses dados para responder a esta solicitação: {message}",
580
585
  feedsTitle: "Feeds de dados",
581
586
  feedsEmpty: "Nenhum feed registrado ainda.",
@@ -679,6 +684,7 @@ var i18n = createI18n({
679
684
  chat: "Discussion",
680
685
  refreshFeed: "Actualiser",
681
686
  refreshFailed: "Échec de l'actualisation : {error}",
687
+ refreshDispatched: "Actualisation lancée en arrière-plan.",
682
688
  feedChatSeed: "Le flux « {slug} » est défini par le schéma `feeds/{slug}/schema.json` et ses enregistrements se trouvent dans `{dataPath}/` (un fichier `<id>.json` par enregistrement). Utilise ce schéma et ces données pour répondre à cette demande : {message}",
683
689
  feedsTitle: "Flux de données",
684
690
  feedsEmpty: "Aucun flux enregistré pour le moment.",
@@ -782,6 +788,7 @@ var i18n = createI18n({
782
788
  chat: "Chat",
783
789
  refreshFeed: "Aktualisieren",
784
790
  refreshFailed: "Aktualisierung fehlgeschlagen: {error}",
791
+ refreshDispatched: "Aktualisierung im Hintergrund gestartet.",
785
792
  feedChatSeed: "Der Feed {slug} ist durch das Schema `feeds/{slug}/schema.json` definiert und seine Datensätze liegen in `{dataPath}/` (eine `<id>.json`-Datei pro Datensatz). Nutze dieses Schema und diese Daten, um auf die folgende Anfrage zu antworten: {message}",
786
793
  feedsTitle: "Datenquellen-Feeds",
787
794
  feedsEmpty: "Noch keine Feeds registriert.",
@@ -1243,7 +1250,7 @@ var CollectionDayView_default = /* @__PURE__ */ defineComponent({
1243
1250
  return `${String(hour).padStart(2, "0")}:00`;
1244
1251
  }
1245
1252
  const labelField = computed(() => labelFieldFor(props.schema));
1246
- const CHIP_SKIP_TYPES = new Set([
1253
+ const CHIP_SKIP_TYPES = /* @__PURE__ */ new Set([
1247
1254
  "date",
1248
1255
  "datetime",
1249
1256
  "table",
@@ -1326,7 +1333,7 @@ var CollectionDayView_default = /* @__PURE__ */ defineComponent({
1326
1333
  await nextTick();
1327
1334
  dialogEl.value?.focus();
1328
1335
  const earliest = timedEntries.value.reduce((min, entry) => Math.min(min, entry.slice.startMin), MINUTES_PER_DAY);
1329
- if (earliest >= 1440) return;
1336
+ if (earliest >= MINUTES_PER_DAY) return;
1330
1337
  if (scrollEl.value) scrollEl.value.scrollTop = Math.max(0, (earliest - 60) * PX_PER_MIN);
1331
1338
  });
1332
1339
  return (_ctx, _cache) => {
@@ -1907,7 +1914,7 @@ var _hoisted_74$1 = ["disabled"];
1907
1914
  //#region src/vue/components/CollectionRecordPanel.vue
1908
1915
  var CollectionRecordPanel_default = /* @__PURE__ */ defineComponent({
1909
1916
  __name: "CollectionRecordPanel",
1910
- props: /* @__PURE__ */ mergeModels({
1917
+ props: /*@__PURE__*/ mergeModels({
1911
1918
  collection: {},
1912
1919
  viewing: {},
1913
1920
  saving: { type: Boolean },
@@ -1925,7 +1932,7 @@ var CollectionRecordPanel_default = /* @__PURE__ */ defineComponent({
1925
1932
  "editing": { required: true },
1926
1933
  "editingModifiers": {}
1927
1934
  }),
1928
- emits: /* @__PURE__ */ mergeModels([
1935
+ emits: /*@__PURE__*/ mergeModels([
1929
1936
  "submit",
1930
1937
  "cancel",
1931
1938
  "edit",
@@ -2428,7 +2435,7 @@ var _hoisted_3$4 = {
2428
2435
  var _hoisted_4$4 = ["title", "srcdoc"];
2429
2436
  var REMINT_LEAD_MS = 6e4;
2430
2437
  var MIN_REMINT_DELAY_MS = 1e4;
2431
- var CollectionCustomView_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
2438
+ var CollectionCustomView_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
2432
2439
  __name: "CollectionCustomView",
2433
2440
  props: {
2434
2441
  slug: {},
@@ -2557,7 +2564,7 @@ var _plugin_vue_export_helper_default = (sfc, props) => {
2557
2564
  };
2558
2565
  //#endregion
2559
2566
  //#region src/vue/components/CollectionCustomView.vue
2560
- var CollectionCustomView_default = /* @__PURE__ */ _plugin_vue_export_helper_default(CollectionCustomView_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-d5fb7ca6"]]);
2567
+ var CollectionCustomView_default = /*#__PURE__*/ _plugin_vue_export_helper_default(CollectionCustomView_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-aa6e6c2d"]]);
2561
2568
  //#endregion
2562
2569
  //#region src/vue/useCollectionRendering.ts
2563
2570
  function stepForFieldType(type) {
@@ -2613,7 +2620,7 @@ function useCollectionRendering(collection, locale) {
2613
2620
  async function loadLinkedCollections(schema, expectedSlug) {
2614
2621
  const refTargets = new Set(uniqueRefTargets(schema));
2615
2622
  const embedTargets = new Set(uniqueEmbedTargets(schema));
2616
- const allTargets = [...new Set([...refTargets, ...embedTargets])];
2623
+ const allTargets = [.../* @__PURE__ */ new Set([...refTargets, ...embedTargets])];
2617
2624
  if (allTargets.length === 0) return;
2618
2625
  const binding = collectionUi();
2619
2626
  const results = await Promise.all(allTargets.map(async (target) => {
@@ -2818,6 +2825,24 @@ function useCollectionRendering(collection, locale) {
2818
2825
  }
2819
2826
  //#endregion
2820
2827
  //#region src/vue/collectionViewMode.ts
2828
+ /** Build the `custom:<id>` selector key for a custom view. */
2829
+ function customViewKey(viewId) {
2830
+ return `custom:${viewId}`;
2831
+ }
2832
+ /** Every view mode a schema can render, in selector order: `table`
2833
+ * always, `calendar` when a `date`/`datetime` field exists, `kanban`
2834
+ * when an `enum` field exists, then each declared custom view. Mirrors
2835
+ * the field-derived gating inside `CollectionView` (hasCalendar /
2836
+ * hasKanban / customViews) so callers outside that component — e.g. the
2837
+ * dashboard's per-tile view picker — offer exactly the same choices. */
2838
+ function applicableViewModes(schema) {
2839
+ const modes = ["table"];
2840
+ const fields = Object.values(schema.fields);
2841
+ if (fields.some((field) => field.type === "date" || field.type === "datetime")) modes.push("calendar");
2842
+ if (fields.some((field) => field.type === "enum")) modes.push("kanban");
2843
+ for (const view of schema.views ?? []) modes.push(customViewKey(view.id));
2844
+ return modes;
2845
+ }
2821
2846
  var STORAGE_KEY = "collection_view_modes";
2822
2847
  var SORT_STORAGE_KEY = "collection_sorts";
2823
2848
  var BUILT_IN_MODES = [
@@ -2886,7 +2911,10 @@ function writeCollectionSort(slug, sort) {
2886
2911
  //#endregion
2887
2912
  //#region src/vue/components/CollectionView.vue?vue&type=script&setup=true&lang.ts
2888
2913
  var _hoisted_1$4 = { class: "h-full flex flex-col bg-slate-50/30" };
2889
- var _hoisted_2$3 = { class: "flex items-center gap-3 px-6 py-2 border-b border-slate-200 bg-white" };
2914
+ var _hoisted_2$3 = {
2915
+ key: 0,
2916
+ class: "flex items-center gap-3 px-6 py-2 border-b border-slate-200 bg-white"
2917
+ };
2890
2918
  var _hoisted_3$3 = ["title", "aria-label"];
2891
2919
  var _hoisted_4$3 = {
2892
2920
  key: 1,
@@ -2913,186 +2941,192 @@ var _hoisted_12$2 = {
2913
2941
  var _hoisted_13$2 = ["title", "aria-label"];
2914
2942
  var _hoisted_14$2 = ["title", "aria-label"];
2915
2943
  var _hoisted_15$2 = {
2916
- key: 0,
2944
+ key: 1,
2945
+ class: "mx-6 mt-2 rounded-lg border border-indigo-200 bg-indigo-50/60 px-4 py-2 text-sm text-indigo-800 flex items-center gap-2",
2946
+ "data-testid": "collections-refresh-note"
2947
+ };
2948
+ var _hoisted_16$1 = { class: "flex-1" };
2949
+ var _hoisted_17$1 = {
2950
+ key: 2,
2917
2951
  class: "px-6 py-3 bg-white border-b border-slate-100 flex items-center justify-between gap-4"
2918
2952
  };
2919
- var _hoisted_16$1 = {
2953
+ var _hoisted_18$1 = {
2920
2954
  key: 0,
2921
2955
  class: "relative flex-1 max-w-md"
2922
2956
  };
2923
- var _hoisted_17$1 = ["placeholder", "aria-label"];
2924
- var _hoisted_18$1 = ["aria-label"];
2925
- var _hoisted_19$1 = { class: "flex items-center gap-2" };
2957
+ var _hoisted_19$1 = ["placeholder", "aria-label"];
2926
2958
  var _hoisted_20$1 = ["aria-label"];
2927
- var _hoisted_21$1 = ["aria-pressed"];
2928
- var _hoisted_22$1 = ["aria-pressed"];
2959
+ var _hoisted_21$1 = { class: "flex items-center gap-2" };
2960
+ var _hoisted_22$1 = ["aria-label"];
2929
2961
  var _hoisted_23$1 = ["aria-pressed"];
2930
- var _hoisted_24 = [
2962
+ var _hoisted_24 = ["aria-pressed"];
2963
+ var _hoisted_25 = ["aria-pressed"];
2964
+ var _hoisted_26 = [
2931
2965
  "aria-pressed",
2932
2966
  "data-testid",
2933
2967
  "onClick"
2934
2968
  ];
2935
- var _hoisted_25 = { class: "material-icons text-sm" };
2936
- var _hoisted_26 = ["title", "aria-label"];
2937
- var _hoisted_27 = ["title", "aria-label"];
2938
- var _hoisted_28 = ["value", "aria-label"];
2939
- var _hoisted_29 = ["value"];
2969
+ var _hoisted_27 = { class: "material-icons text-sm" };
2970
+ var _hoisted_28 = ["title", "aria-label"];
2971
+ var _hoisted_29 = ["title", "aria-label"];
2940
2972
  var _hoisted_30 = ["value", "aria-label"];
2941
2973
  var _hoisted_31 = ["value"];
2942
- var _hoisted_32 = {
2974
+ var _hoisted_32 = ["value", "aria-label"];
2975
+ var _hoisted_33 = ["value"];
2976
+ var _hoisted_34 = {
2943
2977
  key: 3,
2944
2978
  class: "text-[10px] text-slate-400 font-bold uppercase tracking-wider select-none"
2945
2979
  };
2946
- var _hoisted_33 = {
2947
- key: 1,
2980
+ var _hoisted_35 = {
2981
+ key: 3,
2948
2982
  class: "mx-6 mt-4 rounded-xl border border-amber-200 bg-amber-50/60 p-4 text-sm text-amber-900 shadow-sm flex items-center gap-3",
2949
2983
  "data-testid": "collections-data-issues"
2950
2984
  };
2951
- var _hoisted_34 = { class: "flex-1" };
2952
- var _hoisted_35 = { class: "flex-1 overflow-auto" };
2953
- var _hoisted_36 = {
2985
+ var _hoisted_36 = { class: "flex-1" };
2986
+ var _hoisted_37 = { class: "flex-1 overflow-auto" };
2987
+ var _hoisted_38 = {
2954
2988
  key: 0,
2955
2989
  class: "flex flex-col items-center justify-center py-20 text-sm text-slate-500 gap-3"
2956
2990
  };
2957
- var _hoisted_37 = {
2991
+ var _hoisted_39 = {
2958
2992
  key: 1,
2959
2993
  class: "m-6 rounded-xl border border-red-200 bg-red-50/50 p-4 text-sm text-red-800 shadow-sm flex items-center gap-3"
2960
2994
  };
2961
- var _hoisted_38 = { key: 2 };
2962
- var _hoisted_39 = {
2995
+ var _hoisted_40 = { key: 2 };
2996
+ var _hoisted_41 = {
2963
2997
  key: 3,
2964
2998
  class: "p-4"
2965
2999
  };
2966
- var _hoisted_40 = {
3000
+ var _hoisted_42 = {
2967
3001
  key: 4,
2968
3002
  class: "h-full flex flex-col"
2969
3003
  };
2970
- var _hoisted_41 = {
3004
+ var _hoisted_43 = {
2971
3005
  key: 0,
2972
3006
  class: "m-3 mb-0 rounded-xl border border-red-200 bg-red-50/50 p-4 text-sm text-red-800 shadow-sm flex items-center gap-3",
2973
3007
  "data-testid": "collections-inline-error"
2974
3008
  };
2975
- var _hoisted_42 = { class: "flex-1" };
2976
- var _hoisted_43 = ["aria-label"];
2977
- var _hoisted_44 = { class: "flex-1 min-h-0 px-3 py-2" };
2978
- var _hoisted_45 = {
3009
+ var _hoisted_44 = { class: "flex-1" };
3010
+ var _hoisted_45 = ["aria-label"];
3011
+ var _hoisted_46 = { class: "flex-1 min-h-0 px-3 py-2" };
3012
+ var _hoisted_47 = {
2979
3013
  key: 5,
2980
3014
  class: "h-full",
2981
3015
  "data-testid": "collection-custom-view-body"
2982
3016
  };
2983
- var _hoisted_46 = {
3017
+ var _hoisted_48 = {
2984
3018
  key: 6,
2985
3019
  class: "flex flex-col items-center justify-center py-20 text-sm text-slate-400 gap-2"
2986
3020
  };
2987
- var _hoisted_47 = { class: "font-semibold text-slate-600" };
2988
- var _hoisted_48 = {
3021
+ var _hoisted_49 = { class: "font-semibold text-slate-600" };
3022
+ var _hoisted_50 = {
2989
3023
  key: 7,
2990
3024
  class: "flex flex-col items-center justify-center py-20 text-sm text-slate-400 gap-2"
2991
3025
  };
2992
- var _hoisted_49 = { class: "font-semibold text-slate-600" };
2993
- var _hoisted_50 = {
3026
+ var _hoisted_51 = { class: "font-semibold text-slate-600" };
3027
+ var _hoisted_52 = {
2994
3028
  key: 8,
2995
3029
  class: "overflow-x-auto [container-type:inline-size]"
2996
3030
  };
2997
- var _hoisted_51 = {
3031
+ var _hoisted_53 = {
2998
3032
  key: 0,
2999
3033
  class: "m-4 rounded-xl border border-red-200 bg-red-50/50 p-4 text-sm text-red-800 shadow-sm flex items-center gap-3",
3000
3034
  "data-testid": "collections-inline-error"
3001
3035
  };
3002
- var _hoisted_52 = { class: "flex-1" };
3003
- var _hoisted_53 = ["aria-label"];
3004
- var _hoisted_54 = { class: "min-w-full text-xs" };
3005
- var _hoisted_55 = { class: "bg-slate-50 border-b border-slate-200" };
3006
- var _hoisted_56 = ["aria-sort"];
3007
- var _hoisted_57 = { class: "flex items-center gap-1" };
3008
- var _hoisted_58 = ["title"];
3009
- var _hoisted_59 = [
3036
+ var _hoisted_54 = { class: "flex-1" };
3037
+ var _hoisted_55 = ["aria-label"];
3038
+ var _hoisted_56 = { class: "min-w-full text-xs" };
3039
+ var _hoisted_57 = { class: "bg-slate-50 border-b border-slate-200" };
3040
+ var _hoisted_58 = ["aria-sort"];
3041
+ var _hoisted_59 = { class: "flex items-center gap-1" };
3042
+ var _hoisted_60 = ["title"];
3043
+ var _hoisted_61 = [
3010
3044
  "data-testid",
3011
3045
  "aria-label",
3012
3046
  "onClick",
3013
3047
  "onPointerenter"
3014
3048
  ];
3015
- var _hoisted_60 = { class: "material-icons text-base align-middle" };
3016
- var _hoisted_61 = { class: "divide-y divide-slate-100 bg-white" };
3017
- var _hoisted_62 = [
3049
+ var _hoisted_62 = { class: "material-icons text-base align-middle" };
3050
+ var _hoisted_63 = { class: "divide-y divide-slate-100 bg-white" };
3051
+ var _hoisted_64 = [
3018
3052
  "aria-label",
3019
3053
  "data-testid",
3020
3054
  "onClick",
3021
3055
  "onKeydown"
3022
3056
  ];
3023
- var _hoisted_63 = [
3057
+ var _hoisted_65 = [
3024
3058
  "checked",
3025
3059
  "disabled",
3026
3060
  "data-testid",
3027
3061
  "aria-label",
3028
3062
  "onChange"
3029
3063
  ];
3030
- var _hoisted_64 = [
3064
+ var _hoisted_66 = [
3031
3065
  "checked",
3032
3066
  "disabled",
3033
3067
  "data-testid",
3034
3068
  "aria-label",
3035
3069
  "onChange"
3036
3070
  ];
3037
- var _hoisted_65 = {
3071
+ var _hoisted_67 = {
3038
3072
  key: 2,
3039
3073
  class: "block truncate"
3040
3074
  };
3041
- var _hoisted_66 = [
3075
+ var _hoisted_68 = [
3042
3076
  "href",
3043
3077
  "tabindex",
3044
3078
  "data-testid",
3045
3079
  "onClick",
3046
3080
  "onKeydown"
3047
3081
  ];
3048
- var _hoisted_67 = [
3082
+ var _hoisted_69 = [
3049
3083
  "value",
3050
3084
  "disabled",
3051
3085
  "data-testid",
3052
3086
  "aria-label",
3053
3087
  "onChange"
3054
3088
  ];
3055
- var _hoisted_68 = {
3089
+ var _hoisted_70 = {
3056
3090
  key: 0,
3057
3091
  value: ""
3058
3092
  };
3059
- var _hoisted_69 = ["value"];
3060
- var _hoisted_70 = {
3093
+ var _hoisted_71 = ["value"];
3094
+ var _hoisted_72 = {
3061
3095
  key: 4,
3062
3096
  class: "block truncate tabular-nums font-semibold text-slate-900"
3063
3097
  };
3064
- var _hoisted_71 = {
3098
+ var _hoisted_73 = {
3065
3099
  key: 5,
3066
3100
  class: "inline-flex items-center gap-1 px-2 py-0.5 rounded-lg text-[10px] font-bold bg-slate-100 text-slate-600 border border-slate-200/40"
3067
3101
  };
3068
- var _hoisted_72 = {
3102
+ var _hoisted_74 = {
3069
3103
  key: 6,
3070
3104
  class: "inline-block truncate tabular-nums font-bold text-indigo-900 bg-indigo-50/50 px-1.5 py-0.5 rounded border border-indigo-100/50"
3071
3105
  };
3072
- var _hoisted_73 = ["href", "data-testid"];
3073
- var _hoisted_74 = ["href", "data-testid"];
3074
- var _hoisted_75 = [
3106
+ var _hoisted_75 = ["href", "data-testid"];
3107
+ var _hoisted_76 = ["href", "data-testid"];
3108
+ var _hoisted_77 = [
3075
3109
  "href",
3076
3110
  "data-testid",
3077
3111
  "onClick"
3078
3112
  ];
3079
- var _hoisted_76 = {
3113
+ var _hoisted_78 = {
3080
3114
  key: 10,
3081
3115
  class: "block truncate text-slate-600"
3082
3116
  };
3083
- var _hoisted_77 = { class: "bg-white rounded-2xl shadow-2xl w-full max-w-xl flex flex-col border border-slate-200 overflow-hidden" };
3084
- var _hoisted_78 = { class: "px-6 py-4 border-b border-slate-100 flex items-center gap-3 bg-slate-50/50" };
3085
- var _hoisted_79 = { class: "flex-1" };
3086
- var _hoisted_80 = {
3117
+ var _hoisted_79 = { class: "bg-white rounded-2xl shadow-2xl w-full max-w-xl flex flex-col border border-slate-200 overflow-hidden" };
3118
+ var _hoisted_80 = { class: "px-6 py-4 border-b border-slate-100 flex items-center gap-3 bg-slate-50/50" };
3119
+ var _hoisted_81 = { class: "flex-1" };
3120
+ var _hoisted_82 = {
3087
3121
  id: "collections-chat-title",
3088
3122
  class: "text-sm font-bold text-slate-800 uppercase tracking-wide"
3089
3123
  };
3090
- var _hoisted_81 = { class: "text-xs text-slate-400 font-semibold" };
3091
- var _hoisted_82 = ["aria-label"];
3092
- var _hoisted_83 = { class: "px-6 py-5" };
3093
- var _hoisted_84 = ["placeholder", "onKeydown"];
3094
- var _hoisted_85 = { class: "px-6 py-3.5 border-t border-slate-100 flex items-center justify-end gap-2 bg-slate-50/50" };
3095
- var _hoisted_86 = ["disabled"];
3124
+ var _hoisted_83 = { class: "text-xs text-slate-400 font-semibold" };
3125
+ var _hoisted_84 = ["aria-label"];
3126
+ var _hoisted_85 = { class: "px-6 py-5" };
3127
+ var _hoisted_86 = ["placeholder", "onKeydown"];
3128
+ var _hoisted_87 = { class: "px-6 py-3.5 border-t border-slate-100 flex items-center justify-end gap-2 bg-slate-50/50" };
3129
+ var _hoisted_88 = ["disabled"];
3096
3130
  /** `slug` / `selected` are supplied only in EMBEDDED mode (the
3097
3131
  * `presentCollection` chat card mounts this component and drives both
3098
3132
  * from the tool result). In standalone route mode (the
@@ -3114,7 +3148,10 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
3114
3148
  sendTextMessage: { type: Function },
3115
3149
  initialView: {},
3116
3150
  initialAnchorField: {},
3117
- initialGroupField: {}
3151
+ initialGroupField: {},
3152
+ hideViewToggle: { type: Boolean },
3153
+ hideHeader: { type: Boolean },
3154
+ hideSearch: { type: Boolean }
3118
3155
  },
3119
3156
  emits: ["select", "viewStateChange"],
3120
3157
  setup(__props, { emit: __emit }) {
@@ -3152,6 +3189,11 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
3152
3189
  });
3153
3190
  /** True while a feed collection's manual refresh is in flight. */
3154
3191
  const refreshing = ref(false);
3192
+ /** Transient note shown after an agent-ingest Refresh dispatches a background
3193
+ * worker (records update asynchronously, so there's nothing to show inline).
3194
+ * Auto-clears; `refreshNoteTimer` cancels a pending clear on re-trigger. */
3195
+ const refreshNote = ref(null);
3196
+ let refreshNoteTimer;
3155
3197
  /** Slug already auto-refreshed on first open — prevents a reload loop
3156
3198
  * (the auto-refresh reloads the view, which would re-trigger otherwise). */
3157
3199
  const autoRefreshedSlug = ref(null);
@@ -3334,7 +3376,21 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
3334
3376
  return;
3335
3377
  }
3336
3378
  await loadCollection(current.slug);
3337
- if (result.data.errors.length > 0) inlineError.value = t("collectionsView.refreshFailed", { error: result.data.errors.join("; ") });
3379
+ if (result.data.errors.length > 0) {
3380
+ inlineError.value = t("collectionsView.refreshFailed", { error: result.data.errors.join("; ") });
3381
+ return;
3382
+ }
3383
+ if (result.data.dispatched) if (result.data.chatId && cui.navigate) cui.navigate(`/chat/${result.data.chatId}`);
3384
+ else showRefreshNote(t("collectionsView.refreshDispatched"));
3385
+ }
3386
+ /** Show a transient refresh note, replacing any pending auto-clear. */
3387
+ function showRefreshNote(message) {
3388
+ refreshNote.value = message;
3389
+ if (refreshNoteTimer !== void 0) clearTimeout(refreshNoteTimer);
3390
+ refreshNoteTimer = setTimeout(() => {
3391
+ refreshNote.value = null;
3392
+ refreshNoteTimer = void 0;
3393
+ }, 6e3);
3338
3394
  }
3339
3395
  /** Collection-level header actions. No `when` predicate (no record). */
3340
3396
  const collectionActions = computed(() => collection.value?.schema.collectionActions ?? []);
@@ -3427,11 +3483,11 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
3427
3483
  * (`feeds/<slug>/schema.json` and `<dataPath>/`) and let it act on the
3428
3484
  * request directly. */
3429
3485
  function buildChatSeed(slug, message, itemId) {
3430
- const schema = collection.value?.schema;
3431
- if (!schema?.ingest) return itemId ? `/${slug} id=${itemId} ${message}` : `/${slug} ${message}`;
3486
+ const current = collection.value;
3487
+ if (current?.source !== "feed") return itemId ? `/${slug} id=${itemId} ${message}` : `/${slug} ${message}`;
3432
3488
  return t("collectionsView.feedChatSeed", {
3433
3489
  slug,
3434
- dataPath: schema.dataPath ?? `data/feeds/${slug}`,
3490
+ dataPath: current.schema.dataPath ?? `data/feeds/${slug}`,
3435
3491
  message: itemId ? `(for record \`${itemId}\`) ${message}` : message
3436
3492
  });
3437
3493
  }
@@ -3515,7 +3571,7 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
3515
3571
  function maybeAutoRefreshFeed(slug) {
3516
3572
  if (embedded.value) return;
3517
3573
  const current = collection.value;
3518
- if (current?.slug !== slug || !current.schema.ingest) return;
3574
+ if (current?.slug !== slug || current.source !== "feed") return;
3519
3575
  if (items.value.length > 0 || autoRefreshedSlug.value === slug) return;
3520
3576
  autoRefreshedSlug.value = slug;
3521
3577
  refreshFeed();
@@ -3539,7 +3595,7 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
3539
3595
  if (!current) return false;
3540
3596
  return current.source === "project" && !current.slug.startsWith("mc-");
3541
3597
  });
3542
- const isFeed = computed(() => Boolean(collection.value?.schema.ingest));
3598
+ const isFeed = computed(() => collection.value?.source === "feed");
3543
3599
  const canDeleteFeed = computed(() => isFeed.value && !embedded.value);
3544
3600
  const isFeedRoute = computed(() => !embedded.value && cui.isFeedRoute());
3545
3601
  /** The view to open with: the embedded card's restored `initialView` if
@@ -3602,7 +3658,7 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
3602
3658
  function addCustomView() {
3603
3659
  const current = collection.value;
3604
3660
  if (!current) return;
3605
- const base = current.schema.ingest ? `feeds/${current.slug}` : `data/skills/${current.slug}`;
3661
+ const base = current.source === "feed" ? `feeds/${current.slug}` : `data/skills/${current.slug}`;
3606
3662
  const prompt = t("collectionsView.addViewPrompt", {
3607
3663
  title: current.title,
3608
3664
  base
@@ -3660,10 +3716,6 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
3660
3716
  function setCustomView(viewId) {
3661
3717
  view.value = `custom:${viewId}`;
3662
3718
  }
3663
- /** Selector-key for a custom view, for active-state comparison in the template. */
3664
- function customViewKey(viewId) {
3665
- return `custom:${viewId}`;
3666
- }
3667
3719
  /** A short, slug-safe id not already used by a loaded record. Collisions
3668
3720
  * are astronomically unlikely (32 bits), but we still re-roll a few
3669
3721
  * times against the in-memory set before giving up and using the last
@@ -4141,6 +4193,7 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
4141
4193
  changeUnsub?.();
4142
4194
  changeUnsub = null;
4143
4195
  clearLiveRefreshTimer();
4196
+ if (refreshNoteTimer !== void 0) clearTimeout(refreshNoteTimer);
4144
4197
  });
4145
4198
  watch([
4146
4199
  activeView,
@@ -4166,7 +4219,7 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
4166
4219
  });
4167
4220
  return (_ctx, _cache) => {
4168
4221
  return openBlock(), createElementBlock("div", _hoisted_1$4, [
4169
- createElementVNode("header", _hoisted_2$3, [
4222
+ !__props.hideHeader ? (openBlock(), createElementBlock("header", _hoisted_2$3, [
4170
4223
  !embedded.value ? (openBlock(), createElementBlock("button", {
4171
4224
  key: 0,
4172
4225
  type: "button",
@@ -4240,25 +4293,26 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
4240
4293
  "data-testid": "feeds-delete",
4241
4294
  onClick: confirmFeedDelete
4242
4295
  }, [..._cache[27] || (_cache[27] = [createElementVNode("span", { class: "material-icons text-sm" }, "delete_forever", -1)])], 8, _hoisted_14$2)) : createCommentVNode("", true)
4243
- ]),
4244
- collection.value && (items.value.length > 0 || hasCalendar.value || hasKanban.value || hasCustomViews.value || canAddCustomView.value) ? (openBlock(), createElementBlock("div", _hoisted_15$2, [items.value.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_16$1, [
4245
- _cache[29] || (_cache[29] = createElementVNode("span", { class: "absolute inset-y-0 left-0 flex items-center pl-3 text-slate-400 pointer-events-none" }, [createElementVNode("span", { class: "material-icons text-lg" }, "search")], -1)),
4296
+ ])) : createCommentVNode("", true),
4297
+ refreshNote.value ? (openBlock(), createElementBlock("div", _hoisted_15$2, [_cache[28] || (_cache[28] = createElementVNode("span", { class: "material-icons text-base text-indigo-600" }, "hourglass_top", -1)), createElementVNode("span", _hoisted_16$1, toDisplayString(refreshNote.value), 1)])) : createCommentVNode("", true),
4298
+ collection.value && (!__props.hideSearch && items.value.length > 0 || !__props.hideViewToggle && (hasCalendar.value || hasKanban.value || hasCustomViews.value || canAddCustomView.value)) ? (openBlock(), createElementBlock("div", _hoisted_17$1, [!__props.hideSearch && items.value.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_18$1, [
4299
+ _cache[30] || (_cache[30] = createElementVNode("span", { class: "absolute inset-y-0 left-0 flex items-center pl-3 text-slate-400 pointer-events-none" }, [createElementVNode("span", { class: "material-icons text-lg" }, "search")], -1)),
4246
4300
  withDirectives(createElementVNode("input", {
4247
4301
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => searchQuery.value = $event),
4248
4302
  type: "text",
4249
4303
  placeholder: unref(t)("collectionsView.searchPlaceholder"),
4250
4304
  "aria-label": unref(t)("collectionsView.searchPlaceholder"),
4251
4305
  class: "w-full bg-slate-50 border border-slate-200/80 rounded-xl pl-9 pr-8 py-1.5 text-xs placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-indigo-500/20 focus:border-indigo-500 focus:bg-white transition-all font-medium"
4252
- }, null, 8, _hoisted_17$1), [[vModelText, searchQuery.value]]),
4306
+ }, null, 8, _hoisted_19$1), [[vModelText, searchQuery.value]]),
4253
4307
  searchQuery.value ? (openBlock(), createElementBlock("button", {
4254
4308
  key: 0,
4255
4309
  type: "button",
4256
4310
  "aria-label": unref(t)("collectionsView.clearSearch"),
4257
4311
  class: "absolute inset-y-0 right-0 flex items-center pr-2.5 text-slate-400 hover:text-slate-600",
4258
4312
  onClick: _cache[1] || (_cache[1] = ($event) => searchQuery.value = "")
4259
- }, [..._cache[28] || (_cache[28] = [createElementVNode("span", { class: "material-icons text-sm" }, "close", -1)])], 8, _hoisted_18$1)) : createCommentVNode("", true)
4260
- ])) : createCommentVNode("", true), createElementVNode("div", _hoisted_19$1, [
4261
- hasCalendar.value || hasKanban.value || hasCustomViews.value || canAddCustomView.value ? (openBlock(), createElementBlock("div", {
4313
+ }, [..._cache[29] || (_cache[29] = [createElementVNode("span", { class: "material-icons text-sm" }, "close", -1)])], 8, _hoisted_20$1)) : createCommentVNode("", true)
4314
+ ])) : createCommentVNode("", true), createElementVNode("div", _hoisted_21$1, [
4315
+ !__props.hideViewToggle && (hasCalendar.value || hasKanban.value || hasCustomViews.value || canAddCustomView.value) ? (openBlock(), createElementBlock("div", {
4262
4316
  key: 0,
4263
4317
  class: "flex gap-0.5",
4264
4318
  role: "group",
@@ -4270,7 +4324,7 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
4270
4324
  "aria-pressed": activeView.value === "table",
4271
4325
  "data-testid": "collection-view-toggle-table",
4272
4326
  onClick: _cache[2] || (_cache[2] = ($event) => setView("table"))
4273
- }, [_cache[30] || (_cache[30] = createElementVNode("span", { class: "material-icons text-sm" }, "table_rows", -1)), createElementVNode("span", null, toDisplayString(unref(t)("collectionsView.viewTable")), 1)], 10, _hoisted_21$1),
4327
+ }, [_cache[31] || (_cache[31] = createElementVNode("span", { class: "material-icons text-sm" }, "table_rows", -1)), createElementVNode("span", null, toDisplayString(unref(t)("collectionsView.viewTable")), 1)], 10, _hoisted_23$1),
4274
4328
  hasCalendar.value ? (openBlock(), createElementBlock("button", {
4275
4329
  key: 0,
4276
4330
  type: "button",
@@ -4278,7 +4332,7 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
4278
4332
  "aria-pressed": activeView.value === "calendar",
4279
4333
  "data-testid": "collection-view-toggle-calendar",
4280
4334
  onClick: _cache[3] || (_cache[3] = ($event) => setView("calendar"))
4281
- }, [_cache[31] || (_cache[31] = createElementVNode("span", { class: "material-icons text-sm" }, "calendar_month", -1)), createElementVNode("span", null, toDisplayString(unref(t)("collectionsView.viewCalendar")), 1)], 10, _hoisted_22$1)) : createCommentVNode("", true),
4335
+ }, [_cache[32] || (_cache[32] = createElementVNode("span", { class: "material-icons text-sm" }, "calendar_month", -1)), createElementVNode("span", null, toDisplayString(unref(t)("collectionsView.viewCalendar")), 1)], 10, _hoisted_24)) : createCommentVNode("", true),
4282
4336
  hasKanban.value ? (openBlock(), createElementBlock("button", {
4283
4337
  key: 1,
4284
4338
  type: "button",
@@ -4286,16 +4340,16 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
4286
4340
  "aria-pressed": activeView.value === "kanban",
4287
4341
  "data-testid": "collection-view-toggle-kanban",
4288
4342
  onClick: _cache[4] || (_cache[4] = ($event) => setView("kanban"))
4289
- }, [_cache[32] || (_cache[32] = createElementVNode("span", { class: "material-icons text-sm" }, "view_kanban", -1)), createElementVNode("span", null, toDisplayString(unref(t)("collectionsView.viewKanban")), 1)], 10, _hoisted_23$1)) : createCommentVNode("", true),
4343
+ }, [_cache[33] || (_cache[33] = createElementVNode("span", { class: "material-icons text-sm" }, "view_kanban", -1)), createElementVNode("span", null, toDisplayString(unref(t)("collectionsView.viewKanban")), 1)], 10, _hoisted_25)) : createCommentVNode("", true),
4290
4344
  (openBlock(true), createElementBlock(Fragment, null, renderList(customViews.value, (cv) => {
4291
4345
  return openBlock(), createElementBlock("button", {
4292
4346
  key: cv.id,
4293
4347
  type: "button",
4294
- class: normalizeClass(["h-8 px-2.5 flex items-center gap-1 rounded text-xs font-bold transition-colors", activeView.value === customViewKey(cv.id) ? "bg-indigo-600 text-white" : "bg-white text-slate-500 border border-slate-200 hover:bg-slate-50"]),
4295
- "aria-pressed": activeView.value === customViewKey(cv.id),
4348
+ class: normalizeClass(["h-8 px-2.5 flex items-center gap-1 rounded text-xs font-bold transition-colors", activeView.value === unref(customViewKey)(cv.id) ? "bg-indigo-600 text-white" : "bg-white text-slate-500 border border-slate-200 hover:bg-slate-50"]),
4349
+ "aria-pressed": activeView.value === unref(customViewKey)(cv.id),
4296
4350
  "data-testid": `collection-view-custom-${cv.id}`,
4297
4351
  onClick: ($event) => setCustomView(cv.id)
4298
- }, [createElementVNode("span", _hoisted_25, toDisplayString(cv.icon || "dashboard_customize"), 1), createElementVNode("span", null, toDisplayString(cv.label), 1)], 10, _hoisted_24);
4352
+ }, [createElementVNode("span", _hoisted_27, toDisplayString(cv.icon || "dashboard_customize"), 1), createElementVNode("span", null, toDisplayString(cv.label), 1)], 10, _hoisted_26);
4299
4353
  }), 128)),
4300
4354
  canAddCustomView.value ? (openBlock(), createElementBlock("button", {
4301
4355
  key: 2,
@@ -4305,7 +4359,7 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
4305
4359
  "aria-label": unref(t)("collectionsView.addView"),
4306
4360
  "data-testid": "collection-view-add",
4307
4361
  onClick: addCustomView
4308
- }, [..._cache[33] || (_cache[33] = [createElementVNode("span", { class: "material-icons text-sm" }, "add", -1)])], 8, _hoisted_26)) : createCommentVNode("", true),
4362
+ }, [..._cache[34] || (_cache[34] = [createElementVNode("span", { class: "material-icons text-sm" }, "add", -1)])], 8, _hoisted_28)) : createCommentVNode("", true),
4309
4363
  canConfigureViews.value ? (openBlock(), createElementBlock("button", {
4310
4364
  key: 3,
4311
4365
  type: "button",
@@ -4314,8 +4368,8 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
4314
4368
  "aria-label": unref(t)("collectionsView.config.open"),
4315
4369
  "data-testid": "collection-config-open",
4316
4370
  onClick: _cache[5] || (_cache[5] = ($event) => configOpen.value = true)
4317
- }, [..._cache[34] || (_cache[34] = [createElementVNode("span", { class: "material-icons text-sm" }, "settings", -1)])], 8, _hoisted_27)) : createCommentVNode("", true)
4318
- ], 8, _hoisted_20$1)) : createCommentVNode("", true),
4371
+ }, [..._cache[35] || (_cache[35] = [createElementVNode("span", { class: "material-icons text-sm" }, "settings", -1)])], 8, _hoisted_29)) : createCommentVNode("", true)
4372
+ ], 8, _hoisted_22$1)) : createCommentVNode("", true),
4319
4373
  calendarActive.value && dateFields.value.length > 1 ? (openBlock(), createElementBlock("select", {
4320
4374
  key: 1,
4321
4375
  value: calendarAnchorField.value,
@@ -4327,8 +4381,8 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
4327
4381
  return openBlock(), createElementBlock("option", {
4328
4382
  key,
4329
4383
  value: key
4330
- }, toDisplayString(collection.value?.schema.fields[key]?.label ?? key), 9, _hoisted_29);
4331
- }), 128))], 40, _hoisted_28)) : createCommentVNode("", true),
4384
+ }, toDisplayString(collection.value?.schema.fields[key]?.label ?? key), 9, _hoisted_31);
4385
+ }), 128))], 40, _hoisted_30)) : createCommentVNode("", true),
4332
4386
  kanbanActive.value && enumFields.value.length > 1 ? (openBlock(), createElementBlock("select", {
4333
4387
  key: 2,
4334
4388
  value: kanbanGroupField.value,
@@ -4340,24 +4394,24 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
4340
4394
  return openBlock(), createElementBlock("option", {
4341
4395
  key,
4342
4396
  value: key
4343
- }, toDisplayString(collection.value?.schema.fields[key]?.label ?? key), 9, _hoisted_31);
4344
- }), 128))], 40, _hoisted_30)) : createCommentVNode("", true),
4345
- items.value.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_32, toDisplayString(unref(t)("collectionsView.searchSummary", {
4397
+ }, toDisplayString(collection.value?.schema.fields[key]?.label ?? key), 9, _hoisted_33);
4398
+ }), 128))], 40, _hoisted_32)) : createCommentVNode("", true),
4399
+ items.value.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_34, toDisplayString(unref(t)("collectionsView.searchSummary", {
4346
4400
  shown: filteredItems.value.length,
4347
4401
  total: items.value.length
4348
4402
  })), 1)) : createCommentVNode("", true)
4349
4403
  ])])) : createCommentVNode("", true),
4350
- collection.value && dataIssues.value.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_33, [
4351
- _cache[36] || (_cache[36] = createElementVNode("span", { class: "material-icons text-amber-600" }, "warning", -1)),
4352
- createElementVNode("span", _hoisted_34, toDisplayString(unref(t)("collectionsView.dataIssuesDetected", { count: dataIssues.value.length })), 1),
4404
+ collection.value && dataIssues.value.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_35, [
4405
+ _cache[37] || (_cache[37] = createElementVNode("span", { class: "material-icons text-amber-600" }, "warning", -1)),
4406
+ createElementVNode("span", _hoisted_36, toDisplayString(unref(t)("collectionsView.dataIssuesDetected", { count: dataIssues.value.length })), 1),
4353
4407
  createElementVNode("button", {
4354
4408
  type: "button",
4355
4409
  class: "h-8 px-2.5 flex items-center gap-1 rounded border border-amber-300 bg-white hover:bg-amber-100 text-amber-700 font-bold text-xs transition-colors",
4356
4410
  "data-testid": "collections-repair",
4357
4411
  onClick: repairCollection
4358
- }, [_cache[35] || (_cache[35] = createElementVNode("span", { class: "material-icons text-sm" }, "build", -1)), createElementVNode("span", null, toDisplayString(unref(t)("collectionsView.repair")), 1)])
4412
+ }, [_cache[36] || (_cache[36] = createElementVNode("span", { class: "material-icons text-sm" }, "build", -1)), createElementVNode("span", null, toDisplayString(unref(t)("collectionsView.repair")), 1)])
4359
4413
  ])) : createCommentVNode("", true),
4360
- createElementVNode("div", _hoisted_35, [loading.value ? (openBlock(), createElementBlock("div", _hoisted_36, [_cache[37] || (_cache[37] = createElementVNode("div", { class: "h-8 w-8 border-2 border-indigo-600/20 border-t-indigo-600 rounded-full animate-spin" }, null, -1)), createElementVNode("span", null, toDisplayString(unref(t)("common.loading")), 1)])) : loadError.value ? (openBlock(), createElementBlock("div", _hoisted_37, [_cache[38] || (_cache[38] = createElementVNode("span", { class: "material-icons text-red-600" }, "error", -1)), createElementVNode("span", null, toDisplayString(loadError.value === "not-found" ? unref(t)("collectionsView.notFound") : `${unref(t)("collectionsView.loadFailed")}: ${loadError.value}`), 1)])) : !collection.value ? (openBlock(), createElementBlock("div", _hoisted_38)) : calendarActive.value ? (openBlock(), createElementBlock("div", _hoisted_39, [createVNode(CollectionCalendarView_default, {
4414
+ createElementVNode("div", _hoisted_37, [loading.value ? (openBlock(), createElementBlock("div", _hoisted_38, [_cache[38] || (_cache[38] = createElementVNode("div", { class: "h-8 w-8 border-2 border-indigo-600/20 border-t-indigo-600 rounded-full animate-spin" }, null, -1)), createElementVNode("span", null, toDisplayString(unref(t)("common.loading")), 1)])) : loadError.value ? (openBlock(), createElementBlock("div", _hoisted_39, [_cache[39] || (_cache[39] = createElementVNode("span", { class: "material-icons text-red-600" }, "error", -1)), createElementVNode("span", null, toDisplayString(loadError.value === "not-found" ? unref(t)("collectionsView.notFound") : `${unref(t)("collectionsView.loadFailed")}: ${loadError.value}`), 1)])) : !collection.value ? (openBlock(), createElementBlock("div", _hoisted_40)) : calendarActive.value ? (openBlock(), createElementBlock("div", _hoisted_41, [createVNode(CollectionCalendarView_default, {
4361
4415
  schema: collection.value.schema,
4362
4416
  items: filteredItems.value,
4363
4417
  "anchor-field": calendarAnchorField.value,
@@ -4442,16 +4496,16 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
4442
4496
  "selected",
4443
4497
  "can-create",
4444
4498
  "show-detail"
4445
- ])) : createCommentVNode("", true)])) : kanbanActive.value ? (openBlock(), createElementBlock("div", _hoisted_40, [inlineError.value ? (openBlock(), createElementBlock("div", _hoisted_41, [
4446
- _cache[40] || (_cache[40] = createElementVNode("span", { class: "material-icons text-red-600" }, "error", -1)),
4447
- createElementVNode("span", _hoisted_42, toDisplayString(unref(t)("collectionsView.inlineSaveFailed", { error: inlineError.value })), 1),
4499
+ ])) : createCommentVNode("", true)])) : kanbanActive.value ? (openBlock(), createElementBlock("div", _hoisted_42, [inlineError.value ? (openBlock(), createElementBlock("div", _hoisted_43, [
4500
+ _cache[41] || (_cache[41] = createElementVNode("span", { class: "material-icons text-red-600" }, "error", -1)),
4501
+ createElementVNode("span", _hoisted_44, toDisplayString(unref(t)("collectionsView.inlineSaveFailed", { error: inlineError.value })), 1),
4448
4502
  createElementVNode("button", {
4449
4503
  type: "button",
4450
4504
  class: "h-8 w-8 flex items-center justify-center rounded text-red-600 hover:bg-red-100",
4451
4505
  "aria-label": unref(t)("common.close"),
4452
4506
  onClick: _cache[10] || (_cache[10] = ($event) => inlineError.value = null)
4453
- }, [..._cache[39] || (_cache[39] = [createElementVNode("span", { class: "material-icons text-base" }, "close", -1)])], 8, _hoisted_43)
4454
- ])) : createCommentVNode("", true), createElementVNode("div", _hoisted_44, [createVNode(CollectionKanbanView_default, {
4507
+ }, [..._cache[40] || (_cache[40] = [createElementVNode("span", { class: "material-icons text-base" }, "close", -1)])], 8, _hoisted_45)
4508
+ ])) : createCommentVNode("", true), createElementVNode("div", _hoisted_46, [createVNode(CollectionKanbanView_default, {
4455
4509
  schema: collection.value.schema,
4456
4510
  items: filteredItems.value,
4457
4511
  "group-field": kanbanGroupField.value,
@@ -4465,37 +4519,37 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
4465
4519
  "group-field",
4466
4520
  "selected",
4467
4521
  "notified"
4468
- ])])])) : activeCustomView.value ? (openBlock(), createElementBlock("div", _hoisted_45, [createVNode(CollectionCustomView_default, {
4522
+ ])])])) : activeCustomView.value ? (openBlock(), createElementBlock("div", _hoisted_47, [createVNode(CollectionCustomView_default, {
4469
4523
  slug: collection.value.slug,
4470
4524
  view: activeCustomView.value,
4471
4525
  onOpenItem: onCustomViewOpenItem,
4472
4526
  onStartChat: onCustomViewStartChat
4473
- }, null, 8, ["slug", "view"])])) : items.value.length === 0 && editing.value?.mode !== "create" ? (openBlock(), createElementBlock("div", _hoisted_46, [_cache[41] || (_cache[41] = createElementVNode("span", { class: "material-icons text-4xl text-slate-300" }, "folder_open", -1)), createElementVNode("p", _hoisted_47, toDisplayString(unref(t)("collectionsView.itemsEmpty")), 1)])) : filteredItems.value.length === 0 && editing.value?.mode !== "create" ? (openBlock(), createElementBlock("div", _hoisted_48, [
4474
- _cache[42] || (_cache[42] = createElementVNode("span", { class: "material-icons text-4xl text-slate-300" }, "search_off", -1)),
4475
- createElementVNode("p", _hoisted_49, toDisplayString(unref(t)("collectionsView.noMatchingItems")), 1),
4527
+ }, null, 8, ["slug", "view"])])) : items.value.length === 0 && editing.value?.mode !== "create" ? (openBlock(), createElementBlock("div", _hoisted_48, [_cache[42] || (_cache[42] = createElementVNode("span", { class: "material-icons text-4xl text-slate-300" }, "folder_open", -1)), createElementVNode("p", _hoisted_49, toDisplayString(unref(t)("collectionsView.itemsEmpty")), 1)])) : filteredItems.value.length === 0 && editing.value?.mode !== "create" ? (openBlock(), createElementBlock("div", _hoisted_50, [
4528
+ _cache[43] || (_cache[43] = createElementVNode("span", { class: "material-icons text-4xl text-slate-300" }, "search_off", -1)),
4529
+ createElementVNode("p", _hoisted_51, toDisplayString(unref(t)("collectionsView.noMatchingItems")), 1),
4476
4530
  createElementVNode("button", {
4477
4531
  type: "button",
4478
4532
  class: "text-xs text-indigo-600 font-semibold hover:underline",
4479
4533
  onClick: _cache[11] || (_cache[11] = ($event) => searchQuery.value = "")
4480
4534
  }, toDisplayString(unref(t)("collectionsView.clearSearch")), 1)
4481
- ])) : (openBlock(), createElementBlock("div", _hoisted_50, [inlineError.value ? (openBlock(), createElementBlock("div", _hoisted_51, [
4482
- _cache[44] || (_cache[44] = createElementVNode("span", { class: "material-icons text-red-600" }, "error", -1)),
4483
- createElementVNode("span", _hoisted_52, toDisplayString(unref(t)("collectionsView.inlineSaveFailed", { error: inlineError.value })), 1),
4535
+ ])) : (openBlock(), createElementBlock("div", _hoisted_52, [inlineError.value ? (openBlock(), createElementBlock("div", _hoisted_53, [
4536
+ _cache[45] || (_cache[45] = createElementVNode("span", { class: "material-icons text-red-600" }, "error", -1)),
4537
+ createElementVNode("span", _hoisted_54, toDisplayString(unref(t)("collectionsView.inlineSaveFailed", { error: inlineError.value })), 1),
4484
4538
  createElementVNode("button", {
4485
4539
  type: "button",
4486
4540
  class: "h-8 w-8 flex items-center justify-center rounded text-red-600 hover:bg-red-100",
4487
4541
  "aria-label": unref(t)("common.close"),
4488
4542
  onClick: _cache[12] || (_cache[12] = ($event) => inlineError.value = null)
4489
- }, [..._cache[43] || (_cache[43] = [createElementVNode("span", { class: "material-icons text-base" }, "close", -1)])], 8, _hoisted_53)
4490
- ])) : createCommentVNode("", true), createElementVNode("table", _hoisted_54, [createElementVNode("thead", null, [createElementVNode("tr", _hoisted_55, [(openBlock(true), createElementBlock(Fragment, null, renderList(listColumnFields.value, ([key, field]) => {
4543
+ }, [..._cache[44] || (_cache[44] = [createElementVNode("span", { class: "material-icons text-base" }, "close", -1)])], 8, _hoisted_55)
4544
+ ])) : createCommentVNode("", true), createElementVNode("table", _hoisted_56, [createElementVNode("thead", null, [createElementVNode("tr", _hoisted_57, [(openBlock(true), createElementBlock(Fragment, null, renderList(listColumnFields.value, ([key, field]) => {
4491
4545
  return openBlock(), createElementBlock("th", {
4492
4546
  key,
4493
4547
  "aria-sort": unref(isSortableField)(field) ? sortAriaValue(key) : void 0,
4494
4548
  class: "px-5 py-3 font-bold text-slate-500 text-left uppercase tracking-wider whitespace-nowrap"
4495
- }, [createElementVNode("div", _hoisted_57, [createElementVNode("span", {
4549
+ }, [createElementVNode("div", _hoisted_59, [createElementVNode("span", {
4496
4550
  class: "truncate max-w-[14rem]",
4497
4551
  title: field.label
4498
- }, toDisplayString(field.label), 9, _hoisted_58), unref(isSortableField)(field) ? (openBlock(), createElementBlock("button", {
4552
+ }, toDisplayString(field.label), 9, _hoisted_60), unref(isSortableField)(field) ? (openBlock(), createElementBlock("button", {
4499
4553
  key: 0,
4500
4554
  type: "button",
4501
4555
  class: normalizeClass(["inline-flex items-center justify-center rounded p-0.5 -my-1 leading-none transition-colors", sortButtonClass(key)]),
@@ -4504,8 +4558,8 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
4504
4558
  onClick: withModifiers(($event) => cycleSort(key), ["stop"]),
4505
4559
  onPointerenter: ($event) => hoveredSortKey.value = key,
4506
4560
  onPointerleave: _cache[13] || (_cache[13] = ($event) => hoveredSortKey.value = null)
4507
- }, [createElementVNode("span", _hoisted_60, toDisplayString(sortIconName(key)), 1)], 42, _hoisted_59)) : createCommentVNode("", true)])], 8, _hoisted_56);
4508
- }), 128))])]), createElementVNode("tbody", _hoisted_61, [(openBlock(true), createElementBlock(Fragment, null, renderList(sortedItems.value, (item) => {
4561
+ }, [createElementVNode("span", _hoisted_62, toDisplayString(sortIconName(key)), 1)], 42, _hoisted_61)) : createCommentVNode("", true)])], 8, _hoisted_58);
4562
+ }), 128))])]), createElementVNode("tbody", _hoisted_63, [(openBlock(true), createElementBlock(Fragment, null, renderList(sortedItems.value, (item) => {
4509
4563
  return openBlock(), createElementBlock("tr", {
4510
4564
  key: String(item[collection.value.schema.primaryKey] ?? ""),
4511
4565
  class: normalizeClass(["hover:bg-slate-50/70 cursor-pointer transition-colors focus:outline-none focus:bg-indigo-50/30", isRowOpen(item) || isEditingRow(item) ? "bg-indigo-50/40" : ""]),
@@ -4529,7 +4583,7 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
4529
4583
  "aria-label": field.label,
4530
4584
  onClick: _cache[14] || (_cache[14] = withModifiers(() => {}, ["stop"])),
4531
4585
  onChange: ($event) => commitToggle(item, field)
4532
- }, null, 40, _hoisted_63)) : field.type === "boolean" ? (openBlock(), createElementBlock("input", {
4586
+ }, null, 40, _hoisted_65)) : field.type === "boolean" ? (openBlock(), createElementBlock("input", {
4533
4587
  key: 1,
4534
4588
  type: "checkbox",
4535
4589
  checked: item[key] === true,
@@ -4539,7 +4593,7 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
4539
4593
  "aria-label": field.label,
4540
4594
  onClick: _cache[15] || (_cache[15] = withModifiers(() => {}, ["stop"])),
4541
4595
  onChange: ($event) => commitInlineEdit(item, String(key), field, $event.target.checked)
4542
- }, null, 40, _hoisted_64)) : field.type === "ref" && field.to && typeof item[key] === "string" && item[key] ? (openBlock(), createElementBlock("span", _hoisted_65, [createElementVNode("a", {
4596
+ }, null, 40, _hoisted_66)) : field.type === "ref" && field.to && typeof item[key] === "string" && item[key] ? (openBlock(), createElementBlock("span", _hoisted_67, [createElementVNode("a", {
4543
4597
  href: unref(cui).recordHref?.(field.to, String(item[key])),
4544
4598
  tabindex: unref(cui).recordHref?.(field.to, String(item[key])) ? void 0 : 0,
4545
4599
  role: "link",
@@ -4547,7 +4601,7 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
4547
4601
  "data-testid": `collections-ref-link-${key}-${item[key]}`,
4548
4602
  onClick: ($event) => unref(activateRefLink)($event, field.to, String(item[key]), true),
4549
4603
  onKeydown: [withKeys(($event) => unref(activateRefLink)($event, field.to, String(item[key]), true), ["enter"]), withKeys(($event) => unref(activateRefLink)($event, field.to, String(item[key]), true), ["space"])]
4550
- }, toDisplayString(unref(refDisplay)(field.to, String(item[key]))), 41, _hoisted_66)])) : field.type === "enum" && Array.isArray(field.values) && field.values.length > 0 ? (openBlock(), createElementBlock("select", {
4604
+ }, toDisplayString(unref(refDisplay)(field.to, String(item[key]))), 41, _hoisted_68)])) : field.type === "enum" && Array.isArray(field.values) && field.values.length > 0 ? (openBlock(), createElementBlock("select", {
4551
4605
  key: 3,
4552
4606
  value: item[key] == null ? "" : String(item[key]),
4553
4607
  disabled: isRowInlineSaving(item),
@@ -4556,12 +4610,12 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
4556
4610
  "aria-label": field.label,
4557
4611
  onClick: _cache[16] || (_cache[16] = withModifiers(() => {}, ["stop"])),
4558
4612
  onChange: ($event) => commitInlineEdit(item, String(key), field, $event.target.value)
4559
- }, [showEnumPlaceholder(item, String(key)) ? (openBlock(), createElementBlock("option", _hoisted_68, toDisplayString(unref(t)("collectionsView.selectPlaceholder")), 1)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(field.values, (value) => {
4613
+ }, [showEnumPlaceholder(item, String(key)) ? (openBlock(), createElementBlock("option", _hoisted_70, toDisplayString(unref(t)("collectionsView.selectPlaceholder")), 1)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(field.values, (value) => {
4560
4614
  return openBlock(), createElementBlock("option", {
4561
4615
  key: value,
4562
4616
  value
4563
- }, toDisplayString(value), 9, _hoisted_69);
4564
- }), 128))], 42, _hoisted_67)) : field.type === "money" ? (openBlock(), createElementBlock("span", _hoisted_70, toDisplayString(unref(formatMoney)(item[key], unref(resolveCurrency)(field, item), unref(locale))), 1)) : field.type === "table" ? (openBlock(), createElementBlock("span", _hoisted_71, [_cache[45] || (_cache[45] = createElementVNode("span", { class: "material-icons text-[11px]" }, "list", -1)), createElementVNode("span", null, toDisplayString(tableSummary(item[key])), 1)])) : field.type === "derived" ? (openBlock(), createElementBlock("span", _hoisted_72, toDisplayString(unref(derivedDisplay)(field, unref(evaluateDerivedAgainstItem)(field, String(key), item), item)), 1)) : field.type !== "file" && unref(isExternalUrl)(item[key]) ? (openBlock(), createElementBlock("a", {
4617
+ }, toDisplayString(value), 9, _hoisted_71);
4618
+ }), 128))], 42, _hoisted_69)) : field.type === "money" ? (openBlock(), createElementBlock("span", _hoisted_72, toDisplayString(unref(formatMoney)(item[key], unref(resolveCurrency)(field, item), unref(locale))), 1)) : field.type === "table" ? (openBlock(), createElementBlock("span", _hoisted_73, [_cache[46] || (_cache[46] = createElementVNode("span", { class: "material-icons text-[11px]" }, "list", -1)), createElementVNode("span", null, toDisplayString(tableSummary(item[key])), 1)])) : field.type === "derived" ? (openBlock(), createElementBlock("span", _hoisted_74, toDisplayString(unref(derivedDisplay)(field, unref(evaluateDerivedAgainstItem)(field, String(key), item), item)), 1)) : field.type !== "file" && unref(isExternalUrl)(item[key]) ? (openBlock(), createElementBlock("a", {
4565
4619
  key: 7,
4566
4620
  href: String(item[key]),
4567
4621
  target: "_blank",
@@ -4569,7 +4623,7 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
4569
4623
  class: "block truncate text-blue-600 hover:text-blue-800 hover:underline font-semibold",
4570
4624
  "data-testid": `collections-url-link-${key}-${item[collection.value.schema.primaryKey]}`,
4571
4625
  onClick: _cache[17] || (_cache[17] = withModifiers(() => {}, ["stop"]))
4572
- }, toDisplayString(String(item[key])), 9, _hoisted_73)) : field.type === "file" && unref(artifactUrl)(item[key]) ? (openBlock(), createElementBlock("a", {
4626
+ }, toDisplayString(String(item[key])), 9, _hoisted_75)) : field.type === "file" && unref(artifactUrl)(item[key]) ? (openBlock(), createElementBlock("a", {
4573
4627
  key: 8,
4574
4628
  href: unref(artifactUrl)(item[key]) ?? void 0,
4575
4629
  target: "_blank",
@@ -4577,17 +4631,17 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
4577
4631
  class: "block truncate text-blue-600 hover:text-blue-800 hover:underline font-semibold",
4578
4632
  "data-testid": `collections-file-link-${key}-${item[collection.value.schema.primaryKey]}`,
4579
4633
  onClick: _cache[18] || (_cache[18] = withModifiers(() => {}, ["stop"]))
4580
- }, toDisplayString(String(item[key])), 9, _hoisted_74)) : field.type === "file" && unref(fileRoutePath)(item[key]) ? (openBlock(), createElementBlock("a", {
4634
+ }, toDisplayString(String(item[key])), 9, _hoisted_76)) : field.type === "file" && unref(fileRoutePath)(item[key]) ? (openBlock(), createElementBlock("a", {
4581
4635
  key: 9,
4582
4636
  href: unref(fileRoutePath)(item[key]) ?? void 0,
4583
4637
  class: "block truncate text-blue-600 hover:text-blue-800 hover:underline font-semibold",
4584
4638
  "data-testid": `collections-file-link-${key}-${item[collection.value.schema.primaryKey]}`,
4585
4639
  onClick: ($event) => unref(activatePathLink)($event, unref(fileRoutePath)(item[key]) ?? "", true)
4586
- }, toDisplayString(String(item[key])), 9, _hoisted_75)) : (openBlock(), createElementBlock("span", _hoisted_76, toDisplayString(unref(formatCell)(item[key], field.type)), 1))], 64)) : createCommentVNode("", true)]);
4587
- }), 128))], 42, _hoisted_62);
4640
+ }, toDisplayString(String(item[key])), 9, _hoisted_77)) : (openBlock(), createElementBlock("span", _hoisted_78, toDisplayString(unref(formatCell)(item[key], field.type)), 1))], 64)) : createCommentVNode("", true)]);
4641
+ }), 128))], 42, _hoisted_64);
4588
4642
  }), 128))])])]))]),
4589
4643
  collection.value && (viewing.value || editing.value) && !(calendarActive.value && openDay.value) ? (openBlock(), createBlock(CollectionRecordModal_default, {
4590
- key: 2,
4644
+ key: 4,
4591
4645
  onClose: closeRecordModal
4592
4646
  }, {
4593
4647
  default: withCtx(() => [createVNode(CollectionRecordPanel_default, {
@@ -4632,7 +4686,7 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
4632
4686
  _: 1
4633
4687
  })) : createCommentVNode("", true),
4634
4688
  configOpen.value && collection.value ? (openBlock(), createBlock(CollectionViewConfigModal_default, {
4635
- key: 3,
4689
+ key: 5,
4636
4690
  slug: collection.value.slug,
4637
4691
  title: collection.value.title,
4638
4692
  views: customViews.value,
@@ -4644,7 +4698,7 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
4644
4698
  "views"
4645
4699
  ])) : createCommentVNode("", true),
4646
4700
  chatOpen.value && collection.value ? (openBlock(), createElementBlock("div", {
4647
- key: 4,
4701
+ key: 6,
4648
4702
  class: "fixed inset-0 z-30 flex items-center justify-center bg-slate-900/60 backdrop-blur-sm p-4 transition-all duration-300",
4649
4703
  role: "dialog",
4650
4704
  "aria-modal": "true",
@@ -4652,19 +4706,19 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
4652
4706
  "data-testid": "collections-chat-modal",
4653
4707
  onClick: withModifiers(closeChat, ["self"]),
4654
4708
  onKeydown: withKeys(closeChat, ["esc"])
4655
- }, [createElementVNode("div", _hoisted_77, [
4656
- createElementVNode("header", _hoisted_78, [
4657
- _cache[47] || (_cache[47] = createElementVNode("div", { class: "h-9 w-9 flex items-center justify-center rounded-xl bg-indigo-50 text-indigo-600 border border-indigo-100/50" }, [createElementVNode("span", { class: "material-icons text-lg" }, "forum")], -1)),
4658
- createElementVNode("div", _hoisted_79, [createElementVNode("h2", _hoisted_80, toDisplayString(unref(t)("collectionsView.chatTitle")), 1), createElementVNode("span", _hoisted_81, toDisplayString(collection.value.title), 1)]),
4709
+ }, [createElementVNode("div", _hoisted_79, [
4710
+ createElementVNode("header", _hoisted_80, [
4711
+ _cache[48] || (_cache[48] = createElementVNode("div", { class: "h-9 w-9 flex items-center justify-center rounded-xl bg-indigo-50 text-indigo-600 border border-indigo-100/50" }, [createElementVNode("span", { class: "material-icons text-lg" }, "forum")], -1)),
4712
+ createElementVNode("div", _hoisted_81, [createElementVNode("h2", _hoisted_82, toDisplayString(unref(t)("collectionsView.chatTitle")), 1), createElementVNode("span", _hoisted_83, toDisplayString(collection.value.title), 1)]),
4659
4713
  createElementVNode("button", {
4660
4714
  type: "button",
4661
4715
  class: "h-8 w-8 flex items-center justify-center rounded text-slate-400 hover:bg-slate-200/50 hover:text-slate-600 transition-colors",
4662
4716
  "aria-label": unref(t)("common.close"),
4663
4717
  "data-testid": "collections-chat-close",
4664
4718
  onClick: closeChat
4665
- }, [..._cache[46] || (_cache[46] = [createElementVNode("span", { class: "material-icons text-lg" }, "close", -1)])], 8, _hoisted_82)
4719
+ }, [..._cache[47] || (_cache[47] = [createElementVNode("span", { class: "material-icons text-lg" }, "close", -1)])], 8, _hoisted_84)
4666
4720
  ]),
4667
- createElementVNode("div", _hoisted_83, [withDirectives(createElementVNode("textarea", {
4721
+ createElementVNode("div", _hoisted_85, [withDirectives(createElementVNode("textarea", {
4668
4722
  ref_key: "chatInputEl",
4669
4723
  ref: chatInputEl,
4670
4724
  "onUpdate:modelValue": _cache[22] || (_cache[22] = ($event) => chatMessage.value = $event),
@@ -4673,8 +4727,8 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
4673
4727
  class: "w-full bg-slate-50 border border-slate-200/80 rounded-xl px-3 py-2.5 text-sm placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-indigo-500/20 focus:border-indigo-500 focus:bg-white transition-all resize-none",
4674
4728
  "data-testid": "collections-chat-input",
4675
4729
  onKeydown: [withKeys(withModifiers(submitChat, ["meta"]), ["enter"]), withKeys(withModifiers(submitChat, ["ctrl"]), ["enter"])]
4676
- }, null, 40, _hoisted_84), [[vModelText, chatMessage.value]])]),
4677
- createElementVNode("footer", _hoisted_85, [createElementVNode("button", {
4730
+ }, null, 40, _hoisted_86), [[vModelText, chatMessage.value]])]),
4731
+ createElementVNode("footer", _hoisted_87, [createElementVNode("button", {
4678
4732
  type: "button",
4679
4733
  class: "h-8 px-2.5 rounded text-xs font-bold text-slate-500 hover:bg-slate-200/50 transition-colors",
4680
4734
  "data-testid": "collections-chat-cancel",
@@ -4685,7 +4739,7 @@ var CollectionView_default = /* @__PURE__ */ defineComponent({
4685
4739
  disabled: !chatMessage.value.trim(),
4686
4740
  "data-testid": "collections-chat-send",
4687
4741
  onClick: submitChat
4688
- }, toDisplayString(unref(t)("collectionsView.chatStart")), 9, _hoisted_86)])
4742
+ }, toDisplayString(unref(t)("collectionsView.chatStart")), 9, _hoisted_88)])
4689
4743
  ])], 32)) : createCommentVNode("", true)
4690
4744
  ]);
4691
4745
  };
@@ -5117,6 +5171,6 @@ var plugin = {
5117
5171
  previewComponent: Preview_default
5118
5172
  };
5119
5173
  //#endregion
5120
- export { CollectionCalendarView_default as CollectionCalendarView, CollectionCustomView_default as CollectionCustomView, CollectionDayView_default as CollectionDayView, CollectionEmbedView_default as CollectionEmbedView, CollectionKanbanView_default as CollectionKanbanView, CollectionRecordModal_default as CollectionRecordModal, CollectionRecordPanel_default as CollectionRecordPanel, CollectionView_default as CollectionView, CollectionViewConfigModal_default as CollectionViewConfigModal, CollectionsIndexView_default as CollectionsIndexView, FeedsView_default as FeedsView, Preview_default as PresentCollectionPreview, View_default as PresentCollectionView, collectionUi, configureCollectionUi, plugin, readCollectionSort, readCollectionViewMode, useCollectionRendering, writeCollectionSort, writeCollectionViewMode };
5174
+ export { CollectionCalendarView_default as CollectionCalendarView, CollectionCustomView_default as CollectionCustomView, CollectionDayView_default as CollectionDayView, CollectionEmbedView_default as CollectionEmbedView, CollectionKanbanView_default as CollectionKanbanView, CollectionRecordModal_default as CollectionRecordModal, CollectionRecordPanel_default as CollectionRecordPanel, CollectionView_default as CollectionView, CollectionViewConfigModal_default as CollectionViewConfigModal, CollectionsIndexView_default as CollectionsIndexView, FeedsView_default as FeedsView, Preview_default as PresentCollectionPreview, View_default as PresentCollectionView, applicableViewModes, collectionUi, configureCollectionUi, customViewKey, plugin, readCollectionSort, readCollectionViewMode, useCollectionRendering, writeCollectionSort, writeCollectionViewMode };
5121
5175
 
5122
5176
  //# sourceMappingURL=vue.js.map