@mulmoclaude/collection-plugin 0.13.0 → 0.13.2

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.
package/dist/vue.cjs CHANGED
@@ -114,7 +114,7 @@ var i18n = (0, vue_i18n.createI18n)({
114
114
  searchSummary: "Showing {shown} of {total}",
115
115
  noMatchingItems: "No matching items",
116
116
  clearSearch: "Clear search",
117
- flagFilterGroup: "Flag filters",
117
+ flagFilterButton: "Filters",
118
118
  flagFilterAll: "Filter by {label}",
119
119
  flagFilterHide: "Hiding {label}",
120
120
  flagFilterOnly: "Only {label}",
@@ -262,7 +262,7 @@ var i18n = (0, vue_i18n.createI18n)({
262
262
  searchSummary: "{total} 件中 {shown} 件を表示",
263
263
  noMatchingItems: "一致する項目がありません",
264
264
  clearSearch: "検索をクリア",
265
- flagFilterGroup: "フラグで絞り込み",
265
+ flagFilterButton: "絞り込み",
266
266
  flagFilterAll: "{label} で絞り込む",
267
267
  flagFilterHide: "{label} を非表示中",
268
268
  flagFilterOnly: "{label} のみ表示中",
@@ -410,7 +410,7 @@ var i18n = (0, vue_i18n.createI18n)({
410
410
  searchSummary: "显示 {total} 条中的 {shown} 条",
411
411
  noMatchingItems: "没有匹配的项目",
412
412
  clearSearch: "清除搜索",
413
- flagFilterGroup: "标记筛选",
413
+ flagFilterButton: "筛选",
414
414
  flagFilterAll: "按{label}筛选",
415
415
  flagFilterHide: "已隐藏{label}",
416
416
  flagFilterOnly: "仅显示{label}",
@@ -558,7 +558,7 @@ var i18n = (0, vue_i18n.createI18n)({
558
558
  searchSummary: "{total}개 중 {shown}개 표시",
559
559
  noMatchingItems: "일치하는 항목이 없습니다",
560
560
  clearSearch: "검색 지우기",
561
- flagFilterGroup: "플래그 필터",
561
+ flagFilterButton: "필터",
562
562
  flagFilterAll: "{label}(으)로 필터",
563
563
  flagFilterHide: "{label} 숨김",
564
564
  flagFilterOnly: "{label}만 표시",
@@ -706,7 +706,7 @@ var i18n = (0, vue_i18n.createI18n)({
706
706
  searchSummary: "Mostrando {shown} de {total}",
707
707
  noMatchingItems: "No hay elementos coincidentes",
708
708
  clearSearch: "Borrar búsqueda",
709
- flagFilterGroup: "Filtros por indicador",
709
+ flagFilterButton: "Filtros",
710
710
  flagFilterAll: "Filtrar por {label}",
711
711
  flagFilterHide: "Ocultando {label}",
712
712
  flagFilterOnly: "Solo {label}",
@@ -854,7 +854,7 @@ var i18n = (0, vue_i18n.createI18n)({
854
854
  searchSummary: "Mostrando {shown} de {total}",
855
855
  noMatchingItems: "Nenhum item correspondente",
856
856
  clearSearch: "Limpar busca",
857
- flagFilterGroup: "Filtros por marcador",
857
+ flagFilterButton: "Filtros",
858
858
  flagFilterAll: "Filtrar por {label}",
859
859
  flagFilterHide: "Ocultando {label}",
860
860
  flagFilterOnly: "Somente {label}",
@@ -1002,7 +1002,7 @@ var i18n = (0, vue_i18n.createI18n)({
1002
1002
  searchSummary: "Affichage de {shown} sur {total}",
1003
1003
  noMatchingItems: "Aucun élément correspondant",
1004
1004
  clearSearch: "Effacer la recherche",
1005
- flagFilterGroup: "Filtres par indicateur",
1005
+ flagFilterButton: "Filtres",
1006
1006
  flagFilterAll: "Filtrer par {label}",
1007
1007
  flagFilterHide: "{label} masqué",
1008
1008
  flagFilterOnly: "Uniquement {label}",
@@ -1150,7 +1150,7 @@ var i18n = (0, vue_i18n.createI18n)({
1150
1150
  searchSummary: "{shown} von {total} werden angezeigt",
1151
1151
  noMatchingItems: "Keine passenden Einträge",
1152
1152
  clearSearch: "Suche zurücksetzen",
1153
- flagFilterGroup: "Flag-Filter",
1153
+ flagFilterButton: "Filter",
1154
1154
  flagFilterAll: "Nach {label} filtern",
1155
1155
  flagFilterHide: "{label} ausgeblendet",
1156
1156
  flagFilterOnly: "Nur {label}",
@@ -4043,199 +4043,201 @@ var _hoisted_21$3 = {
4043
4043
  var _hoisted_22$3 = ["placeholder", "aria-label"];
4044
4044
  var _hoisted_23$2 = ["aria-label"];
4045
4045
  var _hoisted_24$1 = { class: "flex items-center gap-2" };
4046
- var _hoisted_25$1 = ["aria-label"];
4047
- var _hoisted_26$1 = [
4046
+ var _hoisted_25$1 = ["aria-label", "aria-expanded"];
4047
+ var _hoisted_26$1 = {
4048
+ key: 0,
4049
+ class: "min-w-4 h-4 px-1 flex items-center justify-center rounded-full bg-indigo-600 text-white text-[10px] font-bold"
4050
+ };
4051
+ var _hoisted_27$1 = ["aria-label"];
4052
+ var _hoisted_28 = [
4048
4053
  "title",
4049
4054
  "aria-label",
4050
4055
  "aria-pressed",
4051
4056
  "data-testid",
4052
4057
  "onClick"
4053
4058
  ];
4054
- var _hoisted_27$1 = {
4055
- class: "material-icons text-sm",
4056
- "aria-hidden": "true"
4057
- };
4058
- var _hoisted_28 = ["aria-label"];
4059
- var _hoisted_29 = ["aria-pressed"];
4060
- var _hoisted_30 = ["aria-pressed"];
4059
+ var _hoisted_29 = { class: "flex-1 text-left" };
4060
+ var _hoisted_30 = ["aria-label"];
4061
4061
  var _hoisted_31 = ["aria-pressed"];
4062
- var _hoisted_32 = [
4062
+ var _hoisted_32 = ["aria-pressed"];
4063
+ var _hoisted_33 = ["aria-pressed"];
4064
+ var _hoisted_34 = [
4063
4065
  "aria-pressed",
4064
4066
  "data-testid",
4065
4067
  "onClick"
4066
4068
  ];
4067
- var _hoisted_33 = { class: "material-icons text-sm" };
4068
- var _hoisted_34 = [
4069
+ var _hoisted_35 = { class: "material-icons text-sm" };
4070
+ var _hoisted_36 = [
4069
4071
  "title",
4070
4072
  "aria-label",
4071
4073
  "aria-expanded"
4072
4074
  ];
4073
- var _hoisted_35 = {
4075
+ var _hoisted_37 = {
4074
4076
  key: 0,
4075
4077
  class: "absolute left-0 top-full mt-1 z-20 min-w-max rounded border border-slate-200 bg-white shadow-lg py-1",
4076
4078
  "data-testid": "collection-view-add-menu"
4077
4079
  };
4078
- var _hoisted_36 = ["title", "aria-label"];
4079
- var _hoisted_37 = ["value", "aria-label"];
4080
- var _hoisted_38 = ["value"];
4080
+ var _hoisted_38 = ["title", "aria-label"];
4081
4081
  var _hoisted_39 = ["value", "aria-label"];
4082
4082
  var _hoisted_40 = ["value"];
4083
- var _hoisted_41 = {
4083
+ var _hoisted_41 = ["value", "aria-label"];
4084
+ var _hoisted_42 = ["value"];
4085
+ var _hoisted_43 = {
4084
4086
  key: 4,
4085
4087
  class: "text-[10px] text-slate-400 font-bold uppercase tracking-wider select-none"
4086
4088
  };
4087
- var _hoisted_42 = {
4089
+ var _hoisted_44 = {
4088
4090
  key: 3,
4089
4091
  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",
4090
4092
  "data-testid": "collections-data-issues"
4091
4093
  };
4092
- var _hoisted_43 = { class: "flex-1" };
4093
- var _hoisted_44 = { class: "flex-1 overflow-auto" };
4094
- var _hoisted_45 = {
4094
+ var _hoisted_45 = { class: "flex-1" };
4095
+ var _hoisted_46 = { class: "flex-1 overflow-auto" };
4096
+ var _hoisted_47 = {
4095
4097
  key: 0,
4096
4098
  class: "flex flex-col items-center justify-center py-20 text-sm text-slate-500 gap-3"
4097
4099
  };
4098
- var _hoisted_46 = {
4100
+ var _hoisted_48 = {
4099
4101
  key: 1,
4100
4102
  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"
4101
4103
  };
4102
- var _hoisted_47 = { key: 2 };
4103
- var _hoisted_48 = {
4104
+ var _hoisted_49 = { key: 2 };
4105
+ var _hoisted_50 = {
4104
4106
  key: 3,
4105
4107
  class: "p-4"
4106
4108
  };
4107
- var _hoisted_49 = {
4109
+ var _hoisted_51 = {
4108
4110
  key: 4,
4109
4111
  class: "h-full flex flex-col"
4110
4112
  };
4111
- var _hoisted_50 = {
4113
+ var _hoisted_52 = {
4112
4114
  key: 0,
4113
4115
  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",
4114
4116
  "data-testid": "collections-inline-error"
4115
4117
  };
4116
- var _hoisted_51 = { class: "flex-1" };
4117
- var _hoisted_52 = ["aria-label"];
4118
- var _hoisted_53 = { class: "flex-1 min-h-0 px-3 py-2" };
4119
- var _hoisted_54 = {
4118
+ var _hoisted_53 = { class: "flex-1" };
4119
+ var _hoisted_54 = ["aria-label"];
4120
+ var _hoisted_55 = { class: "flex-1 min-h-0 px-3 py-2" };
4121
+ var _hoisted_56 = {
4120
4122
  key: 5,
4121
4123
  class: "h-full",
4122
4124
  "data-testid": "collection-custom-view-body"
4123
4125
  };
4124
- var _hoisted_55 = {
4126
+ var _hoisted_57 = {
4125
4127
  key: 6,
4126
4128
  class: "flex flex-col items-center justify-center py-20 text-sm text-slate-400 gap-2"
4127
4129
  };
4128
- var _hoisted_56 = { class: "font-semibold text-slate-600" };
4129
- var _hoisted_57 = {
4130
+ var _hoisted_58 = { class: "font-semibold text-slate-600" };
4131
+ var _hoisted_59 = {
4130
4132
  key: 7,
4131
4133
  class: "flex flex-col items-center justify-center py-20 text-sm text-slate-400 gap-2"
4132
4134
  };
4133
- var _hoisted_58 = { class: "font-semibold text-slate-600" };
4134
- var _hoisted_59 = {
4135
+ var _hoisted_60 = { class: "font-semibold text-slate-600" };
4136
+ var _hoisted_61 = {
4135
4137
  key: 8,
4136
4138
  class: "overflow-x-auto [container-type:inline-size]"
4137
4139
  };
4138
- var _hoisted_60 = {
4140
+ var _hoisted_62 = {
4139
4141
  key: 0,
4140
4142
  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",
4141
4143
  "data-testid": "collections-inline-error"
4142
4144
  };
4143
- var _hoisted_61 = { class: "flex-1" };
4144
- var _hoisted_62 = ["aria-label"];
4145
- var _hoisted_63 = { class: "min-w-full text-xs" };
4146
- var _hoisted_64 = { class: "bg-slate-50 border-b border-slate-200" };
4147
- var _hoisted_65 = ["aria-sort"];
4148
- var _hoisted_66 = { class: "flex items-center gap-1" };
4149
- var _hoisted_67 = ["title"];
4150
- var _hoisted_68 = [
4145
+ var _hoisted_63 = { class: "flex-1" };
4146
+ var _hoisted_64 = ["aria-label"];
4147
+ var _hoisted_65 = { class: "min-w-full text-xs" };
4148
+ var _hoisted_66 = { class: "bg-slate-50 border-b border-slate-200" };
4149
+ var _hoisted_67 = ["aria-sort"];
4150
+ var _hoisted_68 = { class: "flex items-center gap-1" };
4151
+ var _hoisted_69 = ["title"];
4152
+ var _hoisted_70 = [
4151
4153
  "data-testid",
4152
4154
  "aria-label",
4153
4155
  "onClick",
4154
4156
  "onPointerenter"
4155
4157
  ];
4156
- var _hoisted_69 = { class: "material-icons text-base align-middle" };
4157
- var _hoisted_70 = { class: "divide-y divide-slate-100 bg-white" };
4158
- var _hoisted_71 = [
4158
+ var _hoisted_71 = { class: "material-icons text-base align-middle" };
4159
+ var _hoisted_72 = { class: "divide-y divide-slate-100 bg-white" };
4160
+ var _hoisted_73 = [
4159
4161
  "aria-label",
4160
4162
  "data-testid",
4161
4163
  "onClick",
4162
4164
  "onKeydown"
4163
4165
  ];
4164
- var _hoisted_72 = [
4166
+ var _hoisted_74 = [
4165
4167
  "checked",
4166
4168
  "disabled",
4167
4169
  "data-testid",
4168
4170
  "aria-label",
4169
4171
  "onChange"
4170
4172
  ];
4171
- var _hoisted_73 = [
4173
+ var _hoisted_75 = [
4172
4174
  "checked",
4173
4175
  "disabled",
4174
4176
  "data-testid",
4175
4177
  "aria-label",
4176
4178
  "onChange"
4177
4179
  ];
4178
- var _hoisted_74 = ["data-testid", "aria-label"];
4179
- var _hoisted_75 = {
4180
+ var _hoisted_76 = ["data-testid", "aria-label"];
4181
+ var _hoisted_77 = {
4180
4182
  key: 3,
4181
4183
  class: "block truncate"
4182
4184
  };
4183
- var _hoisted_76 = [
4185
+ var _hoisted_78 = [
4184
4186
  "href",
4185
4187
  "tabindex",
4186
4188
  "data-testid",
4187
4189
  "onClick",
4188
4190
  "onKeydown"
4189
4191
  ];
4190
- var _hoisted_77 = [
4192
+ var _hoisted_79 = [
4191
4193
  "value",
4192
4194
  "disabled",
4193
4195
  "data-testid",
4194
4196
  "aria-label",
4195
4197
  "onChange"
4196
4198
  ];
4197
- var _hoisted_78 = {
4199
+ var _hoisted_80 = {
4198
4200
  key: 0,
4199
4201
  value: ""
4200
4202
  };
4201
- var _hoisted_79 = ["value"];
4202
- var _hoisted_80 = {
4203
+ var _hoisted_81 = ["value"];
4204
+ var _hoisted_82 = {
4203
4205
  key: 5,
4204
4206
  class: "block truncate tabular-nums font-semibold text-slate-900"
4205
4207
  };
4206
- var _hoisted_81 = {
4208
+ var _hoisted_83 = {
4207
4209
  key: 6,
4208
4210
  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"
4209
4211
  };
4210
- var _hoisted_82 = {
4212
+ var _hoisted_84 = {
4211
4213
  key: 7,
4212
4214
  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"
4213
4215
  };
4214
- var _hoisted_83 = ["data-testid"];
4215
- var _hoisted_84 = ["href", "data-testid"];
4216
- var _hoisted_85 = ["href", "data-testid"];
4217
- var _hoisted_86 = [
4216
+ var _hoisted_85 = ["data-testid"];
4217
+ var _hoisted_86 = ["href", "data-testid"];
4218
+ var _hoisted_87 = ["href", "data-testid"];
4219
+ var _hoisted_88 = [
4218
4220
  "href",
4219
4221
  "data-testid",
4220
4222
  "onClick"
4221
4223
  ];
4222
- var _hoisted_87 = {
4224
+ var _hoisted_89 = {
4223
4225
  key: 12,
4224
4226
  class: "block truncate text-slate-600"
4225
4227
  };
4226
- var _hoisted_88 = { class: "bg-white rounded-2xl shadow-2xl w-full max-w-xl flex flex-col border border-slate-200 overflow-hidden" };
4227
- var _hoisted_89 = { class: "px-6 py-4 border-b border-slate-100 flex items-center gap-3 bg-slate-50/50" };
4228
- var _hoisted_90 = { class: "flex-1" };
4229
- var _hoisted_91 = {
4228
+ var _hoisted_90 = { class: "bg-white rounded-2xl shadow-2xl w-full max-w-xl flex flex-col border border-slate-200 overflow-hidden" };
4229
+ var _hoisted_91 = { class: "px-6 py-4 border-b border-slate-100 flex items-center gap-3 bg-slate-50/50" };
4230
+ var _hoisted_92 = { class: "flex-1" };
4231
+ var _hoisted_93 = {
4230
4232
  id: "collections-chat-title",
4231
4233
  class: "text-sm font-bold text-slate-800 uppercase tracking-wide"
4232
4234
  };
4233
- var _hoisted_92 = { class: "text-xs text-slate-400 font-semibold" };
4234
- var _hoisted_93 = ["aria-label"];
4235
- var _hoisted_94 = { class: "px-6 py-5" };
4236
- var _hoisted_95 = ["placeholder", "onKeydown"];
4237
- var _hoisted_96 = { class: "px-6 py-3.5 border-t border-slate-100 flex items-center justify-end gap-2 bg-slate-50/50" };
4238
- var _hoisted_97 = ["disabled"];
4235
+ var _hoisted_94 = { class: "text-xs text-slate-400 font-semibold" };
4236
+ var _hoisted_95 = ["aria-label"];
4237
+ var _hoisted_96 = { class: "px-6 py-5" };
4238
+ var _hoisted_97 = ["placeholder", "onKeydown"];
4239
+ var _hoisted_98 = { class: "px-6 py-3.5 border-t border-slate-100 flex items-center justify-end gap-2 bg-slate-50/50" };
4240
+ var _hoisted_99 = ["disabled"];
4239
4241
  /** `slug` / `selected` are supplied only in EMBEDDED mode (the
4240
4242
  * `presentCollection` chat card mounts this component and drives both
4241
4243
  * from the tool result). In standalone route mode (the
@@ -4247,6 +4249,10 @@ var _hoisted_97 = ["disabled"];
4247
4249
  * actions send into the current session instead of spawning a new
4248
4250
  * chat (see `runAction` / `submitChat`). */
4249
4251
  var COMPLETION_CHIP_KEY = "__completion";
4252
+ /** The field types that earn a filter-menu entry: declared predicates
4253
+ * (`flag`) plus the fields that ARE a predicate already — a stored
4254
+ * `boolean` and a `toggle`'s projected on/off state. Enums stay out:
4255
+ * they need a value picker, and kanban already slices by enum. */
4250
4256
  var LIVE_REFRESH_DEBOUNCE_MS = 150;
4251
4257
  //#endregion
4252
4258
  //#region src/vue/components/CollectionView.vue
@@ -4382,14 +4388,34 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4382
4388
  return slug ? readCollectionFlagFilters(slug) : {};
4383
4389
  }
4384
4390
  const flagFilters = (0, vue.ref)(storedFlagFiltersFor(activeSlug.value));
4391
+ const CHIP_FIELD_TYPES = /* @__PURE__ */ new Set([
4392
+ "flag",
4393
+ "boolean",
4394
+ "toggle"
4395
+ ]);
4396
+ /** True when an existing FIELD chip already expresses the legacy
4397
+ * completion predicate exactly, so a synthesized "done" chip would be a
4398
+ * duplicate: a boolean `completionField` (done ⇔ `"true"` ⇔ the
4399
+ * boolean's own chip), or a `toggle` projecting the `completionField`
4400
+ * whose `onValue` is the single done value (the todos-schema shape:
4401
+ * toggle "Done" on `status` + `completionDoneValues: ["done"]`). A
4402
+ * superset pair (extra done values) still synthesizes — no field chip
4403
+ * covers it. */
4404
+ function completionCoveredByFieldChip(schema) {
4405
+ const { completionField, completionDoneValues } = schema;
4406
+ if (completionDoneValues?.length !== 1) return false;
4407
+ const [doneValue] = completionDoneValues;
4408
+ if (schema.fields[completionField ?? ""]?.type === "boolean") return doneValue === "true";
4409
+ return Object.values(schema.fields).some((field) => field.type === "toggle" && field.field === completionField && field.onValue === doneValue);
4410
+ }
4385
4411
  const flagChips = (0, vue.computed)(() => {
4386
4412
  const schema = collection.value?.schema;
4387
4413
  if (!schema) return [];
4388
- const chips = Object.entries(schema.fields).filter(([, field]) => field.type === "flag").map(([key, field]) => ({
4414
+ const chips = Object.entries(schema.fields).filter(([, field]) => CHIP_FIELD_TYPES.has(field.type)).map(([key, field]) => ({
4389
4415
  key,
4390
4416
  label: field.label ?? key
4391
4417
  }));
4392
- if (schema.completionField && schema.completionDoneValues && schema.fields[schema.completionField]?.type !== "flag" && schema.fields[COMPLETION_CHIP_KEY] === void 0) chips.push({
4418
+ if (schema.completionField && schema.completionDoneValues && schema.fields[schema.completionField]?.type !== "flag" && !completionCoveredByFieldChip(schema) && schema.fields[COMPLETION_CHIP_KEY] === void 0) chips.push({
4393
4419
  key: COMPLETION_CHIP_KEY,
4394
4420
  label: t("collectionsView.flagDoneChip"),
4395
4421
  synthetic: true
@@ -4412,11 +4438,16 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4412
4438
  return render.deriveRecord(item)[key] === true;
4413
4439
  }
4414
4440
  /** The chip's boolean for one row — `itemIsDone` for the synthesized
4415
- * completion chip, the computed flag value otherwise. */
4441
+ * completion chip, the stored/projected value for `boolean`/`toggle`
4442
+ * fields, the computed flag value otherwise. */
4416
4443
  function chipMatches(chip, item) {
4417
4444
  const schema = collection.value?.schema;
4418
4445
  if (!schema) return false;
4419
- return chip.synthetic ? (0, _mulmoclaude_core_collection.itemIsDone)(schema, item) : flagValueOf(chip.key, item);
4446
+ if (chip.synthetic) return (0, _mulmoclaude_core_collection.itemIsDone)(schema, item);
4447
+ const field = schema.fields[chip.key];
4448
+ if (field?.type === "toggle") return toggleChecked(item, field);
4449
+ if (field?.type === "boolean") return item[chip.key] === true;
4450
+ return flagValueOf(chip.key, item);
4420
4451
  }
4421
4452
  /** `filteredItems` further narrowed by every ACTIVE chip (AND). Consumed
4422
4453
  * only by the table (sortedItems / count summary / empty state). */
@@ -4436,15 +4467,41 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4436
4467
  } : rest;
4437
4468
  }
4438
4469
  function flagChipIcon(key) {
4470
+ return flagFilterMode(key) === "only" ? "check_box" : "check_box_outline_blank";
4471
+ }
4472
+ function flagChipIconClass(key) {
4439
4473
  const mode = flagFilterMode(key);
4440
- return mode === "hide" ? "visibility_off" : mode === "only" ? "filter_alt" : "visibility";
4474
+ if (mode === "hide") return "text-slate-600";
4475
+ if (mode === "only") return "text-indigo-600";
4476
+ return "text-slate-300";
4441
4477
  }
4442
4478
  function flagChipClass(key) {
4443
4479
  const mode = flagFilterMode(key);
4444
- if (mode === "hide") return "bg-slate-600 text-white";
4445
- if (mode === "only") return "bg-indigo-600 text-white";
4446
- return "bg-white text-slate-500 border border-slate-200 hover:bg-slate-50";
4447
- }
4480
+ if (mode === "hide") return "bg-slate-100 text-slate-700";
4481
+ if (mode === "only") return "bg-indigo-50 text-indigo-700";
4482
+ return "text-slate-500";
4483
+ }
4484
+ /** How many chips currently filter (badge on the menu trigger). */
4485
+ const activeFlagFilterCount = (0, vue.computed)(() => flagChips.value.filter((chip) => flagFilterMode(chip.key) !== void 0).length);
4486
+ const filterMenuOpen = (0, vue.ref)(false);
4487
+ const filterMenuRef = (0, vue.ref)(null);
4488
+ /** Shadow-DOM-safe "did this event land inside the element?". A document-level
4489
+ * listener sees `event.target` retargeted to the shadow HOST when the
4490
+ * component is mounted in a shadow root (MulmoTerminal's PluginFrame), so
4491
+ * `element.contains()` is always false there and the menu closes on the
4492
+ * mousedown before the inner button's click can fire. `composedPath()` still
4493
+ * lists the element for open shadow trees — and in the light DOM too, so both
4494
+ * hosts share this one test. */
4495
+ function eventInsideElement(event, element) {
4496
+ return element !== null && event.composedPath().includes(element);
4497
+ }
4498
+ function closeFilterMenuOnOutsideClick(event) {
4499
+ if (!eventInsideElement(event, filterMenuRef.value)) filterMenuOpen.value = false;
4500
+ }
4501
+ (0, vue.watch)(filterMenuOpen, (open) => {
4502
+ if (open) document.addEventListener("mousedown", closeFilterMenuOnOutsideClick);
4503
+ else document.removeEventListener("mousedown", closeFilterMenuOnOutsideClick);
4504
+ });
4448
4505
  function flagChipTitle(chip) {
4449
4506
  const mode = flagFilterMode(chip.key);
4450
4507
  if (mode === "hide") return t("collectionsView.flagFilterHide", { label: chip.label });
@@ -4968,7 +5025,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4968
5025
  addMenuOpen.value = !addMenuOpen.value;
4969
5026
  }
4970
5027
  function closeAddMenuOnOutsideClick(event) {
4971
- if (!addMenuRef.value?.contains(event.target)) addMenuOpen.value = false;
5028
+ if (!eventInsideElement(event, addMenuRef.value)) addMenuOpen.value = false;
4972
5029
  }
4973
5030
  (0, vue.watch)(addMenuOpen, (open) => {
4974
5031
  if (open) document.addEventListener("mousedown", closeAddMenuOnOutsideClick);
@@ -5463,6 +5520,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5463
5520
  anchorOverride.value = null;
5464
5521
  kanbanOverride.value = null;
5465
5522
  addMenuOpen.value = false;
5523
+ filterMenuOpen.value = false;
5466
5524
  sortState.value = storedSortFor(slug);
5467
5525
  flagFilters.value = storedFlagFiltersFor(slug);
5468
5526
  }
@@ -5513,6 +5571,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5513
5571
  clearLiveRefreshTimer();
5514
5572
  if (refreshNoteTimer !== void 0) clearTimeout(refreshNoteTimer);
5515
5573
  document.removeEventListener("mousedown", closeAddMenuOnOutsideClick);
5574
+ document.removeEventListener("mousedown", closeFilterMenuOnOutsideClick);
5516
5575
  });
5517
5576
  (0, vue.watch)([
5518
5577
  activeView,
@@ -5549,9 +5608,9 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5549
5608
  "aria-label": (0, vue.unref)(t)("collectionsView.backToIndex"),
5550
5609
  "data-testid": "collections-back",
5551
5610
  onClick: goBack
5552
- }, [..._cache[27] || (_cache[27] = [(0, vue.createElementVNode)("span", { class: "material-icons text-lg" }, "arrow_back", -1)])], 8, _hoisted_3$5)) : (0, vue.createCommentVNode)("", true),
5611
+ }, [..._cache[28] || (_cache[28] = [(0, vue.createElementVNode)("span", { class: "material-icons text-lg" }, "arrow_back", -1)])], 8, _hoisted_3$5)) : (0, vue.createCommentVNode)("", true),
5553
5612
  collection.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_4$5, [(0, vue.createElementVNode)("span", _hoisted_5$5, (0, vue.toDisplayString)(collection.value.icon), 1)])) : (0, vue.createCommentVNode)("", true),
5554
- (0, vue.createElementVNode)("div", _hoisted_6$4, [(0, vue.createElementVNode)("h1", _hoisted_7$4, (0, vue.toDisplayString)(collection.value?.title ?? (0, vue.unref)(t)("collectionsView.title")), 1), collection.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_8$4, [(0, vue.createTextVNode)((0, vue.toDisplayString)(collection.value.slug) + " ", 1), isReadOnly.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 0 }, [(0, vue.createElementVNode)("span", _hoisted_9$4, [_cache[28] || (_cache[28] = (0, vue.createElementVNode)("span", { class: "material-icons text-[11px]" }, "lock", -1)), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.readonlyChip")), 1)]), dataSourceRoute.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
5613
+ (0, vue.createElementVNode)("div", _hoisted_6$4, [(0, vue.createElementVNode)("h1", _hoisted_7$4, (0, vue.toDisplayString)(collection.value?.title ?? (0, vue.unref)(t)("collectionsView.title")), 1), collection.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_8$4, [(0, vue.createTextVNode)((0, vue.toDisplayString)(collection.value.slug) + " ", 1), isReadOnly.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 0 }, [(0, vue.createElementVNode)("span", _hoisted_9$4, [_cache[29] || (_cache[29] = (0, vue.createElementVNode)("span", { class: "material-icons text-[11px]" }, "lock", -1)), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.readonlyChip")), 1)]), dataSourceRoute.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
5555
5614
  key: 0,
5556
5615
  href: dataSourceRoute.value ?? void 0,
5557
5616
  class: "ml-1 normal-case tracking-normal font-mono font-normal text-slate-500 hover:text-indigo-700 hover:underline",
@@ -5584,7 +5643,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5584
5643
  class: "h-8 px-2.5 flex items-center gap-1 rounded border border-indigo-200 bg-white hover:bg-indigo-50 text-indigo-600 font-bold text-xs transition-colors",
5585
5644
  "data-testid": "collections-chat",
5586
5645
  onClick: openChat
5587
- }, [_cache[29] || (_cache[29] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "forum", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.chat")), 1)])) : (0, vue.createCommentVNode)("", true),
5646
+ }, [_cache[30] || (_cache[30] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "forum", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.chat")), 1)])) : (0, vue.createCommentVNode)("", true),
5588
5647
  ((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(collectionActions.value, (action) => {
5589
5648
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
5590
5649
  key: action.id,
@@ -5601,7 +5660,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5601
5660
  class: "h-8 px-2.5 flex items-center gap-1 rounded bg-indigo-600 hover:bg-indigo-700 text-white font-bold text-xs transition-colors shadow-sm",
5602
5661
  "data-testid": "collections-add-item",
5603
5662
  onClick: openCreate
5604
- }, [_cache[30] || (_cache[30] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "add", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("common.add")), 1)])) : (0, vue.createCommentVNode)("", true),
5663
+ }, [_cache[31] || (_cache[31] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "add", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("common.add")), 1)])) : (0, vue.createCommentVNode)("", true),
5605
5664
  canDeleteCollection.value && !embedded.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
5606
5665
  key: 6,
5607
5666
  type: "button",
@@ -5610,7 +5669,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5610
5669
  "aria-label": (0, vue.unref)(t)("collectionsView.deleteCollection"),
5611
5670
  "data-testid": "collections-delete",
5612
5671
  onClick: confirmCollectionDelete
5613
- }, [..._cache[31] || (_cache[31] = [(0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "delete_forever", -1)])], 8, _hoisted_16$4)) : (0, vue.createCommentVNode)("", true),
5672
+ }, [..._cache[32] || (_cache[32] = [(0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "delete_forever", -1)])], 8, _hoisted_16$4)) : (0, vue.createCommentVNode)("", true),
5614
5673
  canDeleteFeed.value && !embedded.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
5615
5674
  key: 7,
5616
5675
  type: "button",
@@ -5619,11 +5678,11 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5619
5678
  "aria-label": (0, vue.unref)(t)("collectionsView.deleteFeed"),
5620
5679
  "data-testid": "feeds-delete",
5621
5680
  onClick: confirmFeedDelete
5622
- }, [..._cache[32] || (_cache[32] = [(0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "delete_forever", -1)])], 8, _hoisted_17$4)) : (0, vue.createCommentVNode)("", true)
5681
+ }, [..._cache[33] || (_cache[33] = [(0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "delete_forever", -1)])], 8, _hoisted_17$4)) : (0, vue.createCommentVNode)("", true)
5623
5682
  ])) : (0, vue.createCommentVNode)("", true),
5624
- refreshNote.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_18$4, [_cache[33] || (_cache[33] = (0, vue.createElementVNode)("span", { class: "material-icons text-base text-indigo-600" }, "hourglass_top", -1)), (0, vue.createElementVNode)("span", _hoisted_19$3, (0, vue.toDisplayString)(refreshNote.value), 1)])) : (0, vue.createCommentVNode)("", true),
5683
+ refreshNote.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_18$4, [_cache[34] || (_cache[34] = (0, vue.createElementVNode)("span", { class: "material-icons text-base text-indigo-600" }, "hourglass_top", -1)), (0, vue.createElementVNode)("span", _hoisted_19$3, (0, vue.toDisplayString)(refreshNote.value), 1)])) : (0, vue.createCommentVNode)("", true),
5625
5684
  collection.value && (!__props.hideSearch && items.value.length > 0 || !__props.hideViewToggle && (hasCalendar.value || hasKanban.value || hasCustomViews.value || canAddCustomView.value)) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_20$3, [!__props.hideSearch && items.value.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_21$3, [
5626
- _cache[35] || (_cache[35] = (0, vue.createElementVNode)("span", { class: "absolute inset-y-0 left-0 flex items-center pl-3 text-slate-400 pointer-events-none" }, [(0, vue.createElementVNode)("span", { class: "material-icons text-lg" }, "search")], -1)),
5685
+ _cache[36] || (_cache[36] = (0, vue.createElementVNode)("span", { class: "absolute inset-y-0 left-0 flex items-center pl-3 text-slate-400 pointer-events-none" }, [(0, vue.createElementVNode)("span", { class: "material-icons text-lg" }, "search")], -1)),
5627
5686
  (0, vue.withDirectives)((0, vue.createElementVNode)("input", {
5628
5687
  "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => searchQuery.value = $event),
5629
5688
  type: "text",
@@ -5637,25 +5696,48 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5637
5696
  "aria-label": (0, vue.unref)(t)("collectionsView.clearSearch"),
5638
5697
  class: "absolute inset-y-0 right-0 flex items-center pr-2.5 text-slate-400 hover:text-slate-600",
5639
5698
  onClick: _cache[2] || (_cache[2] = ($event) => searchQuery.value = "")
5640
- }, [..._cache[34] || (_cache[34] = [(0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "close", -1)])], 8, _hoisted_23$2)) : (0, vue.createCommentVNode)("", true)
5699
+ }, [..._cache[35] || (_cache[35] = [(0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "close", -1)])], 8, _hoisted_23$2)) : (0, vue.createCommentVNode)("", true)
5641
5700
  ])) : (0, vue.createCommentVNode)("", true), (0, vue.createElementVNode)("div", _hoisted_24$1, [
5642
5701
  activeView.value === "table" && flagChips.value.length > 0 && items.value.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
5643
5702
  key: 0,
5644
- class: "flex items-center gap-0.5",
5703
+ ref_key: "filterMenuRef",
5704
+ ref: filterMenuRef,
5705
+ class: "relative"
5706
+ }, [(0, vue.createElementVNode)("button", {
5707
+ type: "button",
5708
+ class: (0, vue.normalizeClass)(["h-8 px-2.5 flex items-center gap-1 rounded-full text-xs font-medium transition-colors", activeFlagFilterCount.value > 0 ? "bg-indigo-50 text-indigo-700 border border-indigo-300" : "bg-transparent text-slate-500 border border-dashed border-slate-300 hover:bg-slate-50"]),
5709
+ "aria-label": (0, vue.unref)(t)("collectionsView.flagFilterButton"),
5710
+ "aria-expanded": filterMenuOpen.value,
5711
+ "data-testid": "collections-filter-menu",
5712
+ onClick: _cache[3] || (_cache[3] = ($event) => filterMenuOpen.value = !filterMenuOpen.value)
5713
+ }, [
5714
+ _cache[37] || (_cache[37] = (0, vue.createElementVNode)("span", {
5715
+ class: "material-icons text-sm",
5716
+ "aria-hidden": "true"
5717
+ }, "filter_alt", -1)),
5718
+ (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.flagFilterButton")), 1),
5719
+ activeFlagFilterCount.value > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_26$1, (0, vue.toDisplayString)(activeFlagFilterCount.value), 1)) : (0, vue.createCommentVNode)("", true)
5720
+ ], 10, _hoisted_25$1), filterMenuOpen.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
5721
+ key: 0,
5722
+ class: "absolute left-0 top-full mt-1 z-20 min-w-max rounded border border-slate-200 bg-white shadow-lg py-1",
5645
5723
  role: "group",
5646
- "aria-label": (0, vue.unref)(t)("collectionsView.flagFilterGroup")
5724
+ "aria-label": (0, vue.unref)(t)("collectionsView.flagFilterButton"),
5725
+ "data-testid": "collections-filter-menu-panel"
5647
5726
  }, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(flagChips.value, (chip) => {
5648
5727
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
5649
5728
  key: chip.key,
5650
5729
  type: "button",
5651
- class: (0, vue.normalizeClass)(["h-8 px-2.5 flex items-center gap-1 rounded text-xs font-bold transition-colors", flagChipClass(chip.key)]),
5730
+ class: (0, vue.normalizeClass)(["w-full h-8 px-3 flex items-center gap-2 text-xs font-medium transition-colors hover:bg-slate-50", flagChipClass(chip.key)]),
5652
5731
  title: flagChipTitle(chip),
5653
5732
  "aria-label": flagChipTitle(chip),
5654
5733
  "aria-pressed": flagFilterMode(chip.key) !== void 0,
5655
5734
  "data-testid": `collections-flag-chip-${chip.key}`,
5656
5735
  onClick: ($event) => cycleFlagFilter(chip.key)
5657
- }, [(0, vue.createElementVNode)("span", _hoisted_27$1, (0, vue.toDisplayString)(flagChipIcon(chip.key)), 1), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)(chip.label), 1)], 10, _hoisted_26$1);
5658
- }), 128))], 8, _hoisted_25$1)) : (0, vue.createCommentVNode)("", true),
5736
+ }, [(0, vue.createElementVNode)("span", {
5737
+ class: (0, vue.normalizeClass)(["material-icons text-sm", flagChipIconClass(chip.key)]),
5738
+ "aria-hidden": "true"
5739
+ }, (0, vue.toDisplayString)(flagChipIcon(chip.key)), 3), (0, vue.createElementVNode)("span", _hoisted_29, (0, vue.toDisplayString)(chip.label), 1)], 10, _hoisted_28);
5740
+ }), 128))], 8, _hoisted_27$1)) : (0, vue.createCommentVNode)("", true)], 512)) : (0, vue.createCommentVNode)("", true),
5659
5741
  !__props.hideViewToggle && (hasCalendar.value || hasKanban.value || hasCustomViews.value || canAddCustomView.value) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
5660
5742
  key: 1,
5661
5743
  class: "flex gap-0.5",
@@ -5667,24 +5749,24 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5667
5749
  class: (0, vue.normalizeClass)(["h-8 px-2.5 flex items-center gap-1 rounded text-xs font-bold transition-colors", activeView.value === "table" ? "bg-indigo-600 text-white" : "bg-white text-slate-500 border border-slate-200 hover:bg-slate-50"]),
5668
5750
  "aria-pressed": activeView.value === "table",
5669
5751
  "data-testid": "collection-view-toggle-table",
5670
- onClick: _cache[3] || (_cache[3] = ($event) => setView("table"))
5671
- }, [_cache[36] || (_cache[36] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "table_rows", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.viewTable")), 1)], 10, _hoisted_29),
5752
+ onClick: _cache[4] || (_cache[4] = ($event) => setView("table"))
5753
+ }, [_cache[38] || (_cache[38] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "table_rows", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.viewTable")), 1)], 10, _hoisted_31),
5672
5754
  hasCalendar.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
5673
5755
  key: 0,
5674
5756
  type: "button",
5675
5757
  class: (0, vue.normalizeClass)(["h-8 px-2.5 flex items-center gap-1 rounded text-xs font-bold transition-colors", activeView.value === "calendar" ? "bg-indigo-600 text-white" : "bg-white text-slate-500 border border-slate-200 hover:bg-slate-50"]),
5676
5758
  "aria-pressed": activeView.value === "calendar",
5677
5759
  "data-testid": "collection-view-toggle-calendar",
5678
- onClick: _cache[4] || (_cache[4] = ($event) => setView("calendar"))
5679
- }, [_cache[37] || (_cache[37] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "calendar_month", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.viewCalendar")), 1)], 10, _hoisted_30)) : (0, vue.createCommentVNode)("", true),
5760
+ onClick: _cache[5] || (_cache[5] = ($event) => setView("calendar"))
5761
+ }, [_cache[39] || (_cache[39] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "calendar_month", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.viewCalendar")), 1)], 10, _hoisted_32)) : (0, vue.createCommentVNode)("", true),
5680
5762
  hasKanban.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
5681
5763
  key: 1,
5682
5764
  type: "button",
5683
5765
  class: (0, vue.normalizeClass)(["h-8 px-2.5 flex items-center gap-1 rounded text-xs font-bold transition-colors", activeView.value === "kanban" ? "bg-indigo-600 text-white" : "bg-white text-slate-500 border border-slate-200 hover:bg-slate-50"]),
5684
5766
  "aria-pressed": activeView.value === "kanban",
5685
5767
  "data-testid": "collection-view-toggle-kanban",
5686
- onClick: _cache[5] || (_cache[5] = ($event) => setView("kanban"))
5687
- }, [_cache[38] || (_cache[38] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "view_kanban", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.viewKanban")), 1)], 10, _hoisted_31)) : (0, vue.createCommentVNode)("", true),
5768
+ onClick: _cache[6] || (_cache[6] = ($event) => setView("kanban"))
5769
+ }, [_cache[40] || (_cache[40] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "view_kanban", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.viewKanban")), 1)], 10, _hoisted_33)) : (0, vue.createCommentVNode)("", true),
5688
5770
  ((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(customViews.value, (cv) => {
5689
5771
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
5690
5772
  key: cv.id,
@@ -5693,7 +5775,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5693
5775
  "aria-pressed": activeView.value === (0, vue.unref)(customViewKey)(cv.id),
5694
5776
  "data-testid": `collection-view-custom-${cv.id}`,
5695
5777
  onClick: ($event) => setCustomView(cv.id)
5696
- }, [(0, vue.createElementVNode)("span", _hoisted_33, (0, vue.toDisplayString)(cv.icon || (cv.target === "mobile" ? "smartphone" : "dashboard_customize")), 1), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)(cv.label), 1)], 10, _hoisted_32);
5778
+ }, [(0, vue.createElementVNode)("span", _hoisted_35, (0, vue.toDisplayString)(cv.icon || (cv.target === "mobile" ? "smartphone" : "dashboard_customize")), 1), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)(cv.label), 1)], 10, _hoisted_34);
5697
5779
  }), 128)),
5698
5780
  canAddCustomView.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
5699
5781
  key: 2,
@@ -5708,17 +5790,17 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5708
5790
  "aria-expanded": addMenuOpen.value,
5709
5791
  "data-testid": "collection-view-add",
5710
5792
  onClick: onAddViewClick
5711
- }, [..._cache[39] || (_cache[39] = [(0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "add", -1)])], 8, _hoisted_34), addMenuOpen.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_35, [(0, vue.createElementVNode)("button", {
5793
+ }, [..._cache[41] || (_cache[41] = [(0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "add", -1)])], 8, _hoisted_36), addMenuOpen.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_37, [(0, vue.createElementVNode)("button", {
5712
5794
  type: "button",
5713
5795
  class: "w-full h-8 px-3 flex items-center gap-2 text-xs font-bold text-slate-600 hover:bg-slate-50",
5714
5796
  "data-testid": "collection-view-add-desktop",
5715
- onClick: _cache[6] || (_cache[6] = ($event) => addCustomView("desktop"))
5716
- }, [_cache[40] || (_cache[40] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "dashboard_customize", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.addViewDesktop")), 1)]), (0, vue.createElementVNode)("button", {
5797
+ onClick: _cache[7] || (_cache[7] = ($event) => addCustomView("desktop"))
5798
+ }, [_cache[42] || (_cache[42] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "dashboard_customize", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.addViewDesktop")), 1)]), (0, vue.createElementVNode)("button", {
5717
5799
  type: "button",
5718
5800
  class: "w-full h-8 px-3 flex items-center gap-2 text-xs font-bold text-slate-600 hover:bg-slate-50",
5719
5801
  "data-testid": "collection-view-add-mobile",
5720
- onClick: _cache[7] || (_cache[7] = ($event) => addCustomView("mobile"))
5721
- }, [_cache[41] || (_cache[41] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "smartphone", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.addViewMobile")), 1)])])) : (0, vue.createCommentVNode)("", true)], 512)) : (0, vue.createCommentVNode)("", true),
5802
+ onClick: _cache[8] || (_cache[8] = ($event) => addCustomView("mobile"))
5803
+ }, [_cache[43] || (_cache[43] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "smartphone", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.addViewMobile")), 1)])])) : (0, vue.createCommentVNode)("", true)], 512)) : (0, vue.createCommentVNode)("", true),
5722
5804
  canConfigureViews.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
5723
5805
  key: 3,
5724
5806
  type: "button",
@@ -5726,51 +5808,51 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5726
5808
  title: (0, vue.unref)(t)("collectionsView.config.open"),
5727
5809
  "aria-label": (0, vue.unref)(t)("collectionsView.config.open"),
5728
5810
  "data-testid": "collection-config-open",
5729
- onClick: _cache[8] || (_cache[8] = ($event) => configOpen.value = true)
5730
- }, [..._cache[42] || (_cache[42] = [(0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "settings", -1)])], 8, _hoisted_36)) : (0, vue.createCommentVNode)("", true)
5731
- ], 8, _hoisted_28)) : (0, vue.createCommentVNode)("", true),
5811
+ onClick: _cache[9] || (_cache[9] = ($event) => configOpen.value = true)
5812
+ }, [..._cache[44] || (_cache[44] = [(0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "settings", -1)])], 8, _hoisted_38)) : (0, vue.createCommentVNode)("", true)
5813
+ ], 8, _hoisted_30)) : (0, vue.createCommentVNode)("", true),
5732
5814
  calendarActive.value && dateFields.value.length > 1 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("select", {
5733
5815
  key: 2,
5734
5816
  value: calendarAnchorField.value,
5735
5817
  class: "h-8 px-2 rounded border border-slate-200 bg-white text-xs font-semibold text-slate-600 focus:outline-none focus:border-indigo-500 cursor-pointer",
5736
5818
  "aria-label": (0, vue.unref)(t)("collectionsView.calendarFieldLabel"),
5737
5819
  "data-testid": "collection-calendar-field",
5738
- onChange: _cache[9] || (_cache[9] = ($event) => anchorOverride.value = $event.target.value)
5820
+ onChange: _cache[10] || (_cache[10] = ($event) => anchorOverride.value = $event.target.value)
5739
5821
  }, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(dateFields.value, (key) => {
5740
5822
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("option", {
5741
5823
  key,
5742
5824
  value: key
5743
- }, (0, vue.toDisplayString)(collection.value?.schema.fields[key]?.label ?? key), 9, _hoisted_38);
5744
- }), 128))], 40, _hoisted_37)) : (0, vue.createCommentVNode)("", true),
5825
+ }, (0, vue.toDisplayString)(collection.value?.schema.fields[key]?.label ?? key), 9, _hoisted_40);
5826
+ }), 128))], 40, _hoisted_39)) : (0, vue.createCommentVNode)("", true),
5745
5827
  kanbanActive.value && enumFields.value.length > 1 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("select", {
5746
5828
  key: 3,
5747
5829
  value: kanbanGroupField.value,
5748
5830
  class: "h-8 px-2 rounded border border-slate-200 bg-white text-xs font-semibold text-slate-600 focus:outline-none focus:border-indigo-500 cursor-pointer",
5749
5831
  "aria-label": (0, vue.unref)(t)("collectionsView.kanbanFieldLabel"),
5750
5832
  "data-testid": "collection-kanban-field",
5751
- onChange: _cache[10] || (_cache[10] = ($event) => kanbanOverride.value = $event.target.value)
5833
+ onChange: _cache[11] || (_cache[11] = ($event) => kanbanOverride.value = $event.target.value)
5752
5834
  }, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(enumFields.value, (key) => {
5753
5835
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("option", {
5754
5836
  key,
5755
5837
  value: key
5756
- }, (0, vue.toDisplayString)(collection.value?.schema.fields[key]?.label ?? key), 9, _hoisted_40);
5757
- }), 128))], 40, _hoisted_39)) : (0, vue.createCommentVNode)("", true),
5758
- items.value.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_41, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.searchSummary", {
5838
+ }, (0, vue.toDisplayString)(collection.value?.schema.fields[key]?.label ?? key), 9, _hoisted_42);
5839
+ }), 128))], 40, _hoisted_41)) : (0, vue.createCommentVNode)("", true),
5840
+ items.value.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_43, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.searchSummary", {
5759
5841
  shown: activeView.value === "table" ? tableFilteredItems.value.length : filteredItems.value.length,
5760
5842
  total: items.value.length
5761
5843
  })), 1)) : (0, vue.createCommentVNode)("", true)
5762
5844
  ])])) : (0, vue.createCommentVNode)("", true),
5763
- collection.value && dataIssues.value.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_42, [
5764
- _cache[44] || (_cache[44] = (0, vue.createElementVNode)("span", { class: "material-icons text-amber-600" }, "warning", -1)),
5765
- (0, vue.createElementVNode)("span", _hoisted_43, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.dataIssuesDetected", { count: dataIssues.value.length })), 1),
5845
+ collection.value && dataIssues.value.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_44, [
5846
+ _cache[46] || (_cache[46] = (0, vue.createElementVNode)("span", { class: "material-icons text-amber-600" }, "warning", -1)),
5847
+ (0, vue.createElementVNode)("span", _hoisted_45, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.dataIssuesDetected", { count: dataIssues.value.length })), 1),
5766
5848
  (0, vue.createElementVNode)("button", {
5767
5849
  type: "button",
5768
5850
  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",
5769
5851
  "data-testid": "collections-repair",
5770
5852
  onClick: repairCollection
5771
- }, [_cache[43] || (_cache[43] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "build", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.repair")), 1)])
5853
+ }, [_cache[45] || (_cache[45] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "build", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.repair")), 1)])
5772
5854
  ])) : (0, vue.createCommentVNode)("", true),
5773
- (0, vue.createElementVNode)("div", _hoisted_44, [loading.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_45, [_cache[45] || (_cache[45] = (0, vue.createElementVNode)("div", { class: "h-8 w-8 border-2 border-indigo-600/20 border-t-indigo-600 rounded-full animate-spin" }, null, -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("common.loading")), 1)])) : loadError.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_46, [_cache[46] || (_cache[46] = (0, vue.createElementVNode)("span", { class: "material-icons text-red-600" }, "error", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)(loadError.value === "not-found" ? (0, vue.unref)(t)("collectionsView.notFound") : `${(0, vue.unref)(t)("collectionsView.loadFailed")}: ${loadError.value}`), 1)])) : !collection.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_47)) : calendarActive.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_48, [(0, vue.createVNode)(CollectionCalendarView_default, {
5855
+ (0, vue.createElementVNode)("div", _hoisted_46, [loading.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_47, [_cache[47] || (_cache[47] = (0, vue.createElementVNode)("div", { class: "h-8 w-8 border-2 border-indigo-600/20 border-t-indigo-600 rounded-full animate-spin" }, null, -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("common.loading")), 1)])) : loadError.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_48, [_cache[48] || (_cache[48] = (0, vue.createElementVNode)("span", { class: "material-icons text-red-600" }, "error", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)(loadError.value === "not-found" ? (0, vue.unref)(t)("collectionsView.notFound") : `${(0, vue.unref)(t)("collectionsView.loadFailed")}: ${loadError.value}`), 1)])) : !collection.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_49)) : calendarActive.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_50, [(0, vue.createVNode)(CollectionCalendarView_default, {
5774
5856
  schema: collection.value.schema,
5775
5857
  items: filteredItems.value,
5776
5858
  "anchor-field": calendarAnchorField.value,
@@ -5806,7 +5888,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5806
5888
  }, {
5807
5889
  detail: (0, vue.withCtx)(() => [(0, vue.createVNode)(CollectionRecordPanel_default, {
5808
5890
  editing: editing.value,
5809
- "onUpdate:editing": _cache[11] || (_cache[11] = ($event) => editing.value = $event),
5891
+ "onUpdate:editing": _cache[12] || (_cache[12] = ($event) => editing.value = $event),
5810
5892
  collection: collection.value,
5811
5893
  viewing: viewing.value,
5812
5894
  saving: saving.value,
@@ -5826,7 +5908,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5826
5908
  onCancel: cancelEditor,
5827
5909
  onEdit: editFromView,
5828
5910
  onClose: onDayClose,
5829
- onDelete: _cache[12] || (_cache[12] = ($event) => viewing.value && confirmDelete(viewing.value)),
5911
+ onDelete: _cache[13] || (_cache[13] = ($event) => viewing.value && confirmDelete(viewing.value)),
5830
5912
  onRunAction: runAction,
5831
5913
  onItemChat
5832
5914
  }, null, 8, [
@@ -5859,16 +5941,16 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5859
5941
  "selected",
5860
5942
  "can-create",
5861
5943
  "show-detail"
5862
- ])) : (0, vue.createCommentVNode)("", true)])) : kanbanActive.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_49, [inlineError.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_50, [
5863
- _cache[48] || (_cache[48] = (0, vue.createElementVNode)("span", { class: "material-icons text-red-600" }, "error", -1)),
5864
- (0, vue.createElementVNode)("span", _hoisted_51, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.inlineSaveFailed", { error: inlineError.value })), 1),
5944
+ ])) : (0, vue.createCommentVNode)("", true)])) : kanbanActive.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_51, [inlineError.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_52, [
5945
+ _cache[50] || (_cache[50] = (0, vue.createElementVNode)("span", { class: "material-icons text-red-600" }, "error", -1)),
5946
+ (0, vue.createElementVNode)("span", _hoisted_53, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.inlineSaveFailed", { error: inlineError.value })), 1),
5865
5947
  (0, vue.createElementVNode)("button", {
5866
5948
  type: "button",
5867
5949
  class: "h-8 w-8 flex items-center justify-center rounded text-red-600 hover:bg-red-100",
5868
5950
  "aria-label": (0, vue.unref)(t)("common.close"),
5869
- onClick: _cache[13] || (_cache[13] = ($event) => inlineError.value = null)
5870
- }, [..._cache[47] || (_cache[47] = [(0, vue.createElementVNode)("span", { class: "material-icons text-base" }, "close", -1)])], 8, _hoisted_52)
5871
- ])) : (0, vue.createCommentVNode)("", true), (0, vue.createElementVNode)("div", _hoisted_53, [(0, vue.createVNode)(CollectionKanbanView_default, {
5951
+ onClick: _cache[14] || (_cache[14] = ($event) => inlineError.value = null)
5952
+ }, [..._cache[49] || (_cache[49] = [(0, vue.createElementVNode)("span", { class: "material-icons text-base" }, "close", -1)])], 8, _hoisted_54)
5953
+ ])) : (0, vue.createCommentVNode)("", true), (0, vue.createElementVNode)("div", _hoisted_55, [(0, vue.createVNode)(CollectionKanbanView_default, {
5872
5954
  schema: collection.value.schema,
5873
5955
  items: filteredItems.value,
5874
5956
  "group-field": kanbanGroupField.value,
@@ -5884,7 +5966,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5884
5966
  "selected",
5885
5967
  "notified",
5886
5968
  "readonly"
5887
- ])])])) : activeCustomView.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_54, [activeCustomView.value.target === "mobile" ? ((0, vue.openBlock)(), (0, vue.createBlock)(CollectionRemoteViewPreview_default, {
5969
+ ])])])) : activeCustomView.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_56, [activeCustomView.value.target === "mobile" ? ((0, vue.openBlock)(), (0, vue.createBlock)(CollectionRemoteViewPreview_default, {
5888
5970
  key: 0,
5889
5971
  slug: collection.value.slug,
5890
5972
  view: activeCustomView.value,
@@ -5895,32 +5977,32 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5895
5977
  view: activeCustomView.value,
5896
5978
  onOpenItem: onCustomViewOpenItem,
5897
5979
  onStartChat: onCustomViewStartChat
5898
- }, null, 8, ["slug", "view"]))])) : items.value.length === 0 && editing.value?.mode !== "create" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_55, [_cache[49] || (_cache[49] = (0, vue.createElementVNode)("span", { class: "material-icons text-4xl text-slate-300" }, "folder_open", -1)), (0, vue.createElementVNode)("p", _hoisted_56, (0, vue.toDisplayString)((0, vue.unref)(t)(isReadOnly.value ? "collectionsView.itemsEmptyReadonly" : "collectionsView.itemsEmpty")), 1)])) : tableFilteredItems.value.length === 0 && editing.value?.mode !== "create" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_57, [
5899
- _cache[50] || (_cache[50] = (0, vue.createElementVNode)("span", { class: "material-icons text-4xl text-slate-300" }, "search_off", -1)),
5900
- (0, vue.createElementVNode)("p", _hoisted_58, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.noMatchingItems")), 1),
5980
+ }, null, 8, ["slug", "view"]))])) : items.value.length === 0 && editing.value?.mode !== "create" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_57, [_cache[51] || (_cache[51] = (0, vue.createElementVNode)("span", { class: "material-icons text-4xl text-slate-300" }, "folder_open", -1)), (0, vue.createElementVNode)("p", _hoisted_58, (0, vue.toDisplayString)((0, vue.unref)(t)(isReadOnly.value ? "collectionsView.itemsEmptyReadonly" : "collectionsView.itemsEmpty")), 1)])) : tableFilteredItems.value.length === 0 && editing.value?.mode !== "create" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_59, [
5981
+ _cache[52] || (_cache[52] = (0, vue.createElementVNode)("span", { class: "material-icons text-4xl text-slate-300" }, "search_off", -1)),
5982
+ (0, vue.createElementVNode)("p", _hoisted_60, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.noMatchingItems")), 1),
5901
5983
  (0, vue.createElementVNode)("button", {
5902
5984
  type: "button",
5903
5985
  class: "text-xs text-indigo-600 font-semibold hover:underline",
5904
- onClick: _cache[14] || (_cache[14] = ($event) => (searchQuery.value = "", flagFilters.value = {}))
5986
+ onClick: _cache[15] || (_cache[15] = ($event) => (searchQuery.value = "", flagFilters.value = {}))
5905
5987
  }, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.clearSearch")), 1)
5906
- ])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_59, [inlineError.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_60, [
5907
- _cache[52] || (_cache[52] = (0, vue.createElementVNode)("span", { class: "material-icons text-red-600" }, "error", -1)),
5908
- (0, vue.createElementVNode)("span", _hoisted_61, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.inlineSaveFailed", { error: inlineError.value })), 1),
5988
+ ])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_61, [inlineError.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_62, [
5989
+ _cache[54] || (_cache[54] = (0, vue.createElementVNode)("span", { class: "material-icons text-red-600" }, "error", -1)),
5990
+ (0, vue.createElementVNode)("span", _hoisted_63, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.inlineSaveFailed", { error: inlineError.value })), 1),
5909
5991
  (0, vue.createElementVNode)("button", {
5910
5992
  type: "button",
5911
5993
  class: "h-8 w-8 flex items-center justify-center rounded text-red-600 hover:bg-red-100",
5912
5994
  "aria-label": (0, vue.unref)(t)("common.close"),
5913
- onClick: _cache[15] || (_cache[15] = ($event) => inlineError.value = null)
5914
- }, [..._cache[51] || (_cache[51] = [(0, vue.createElementVNode)("span", { class: "material-icons text-base" }, "close", -1)])], 8, _hoisted_62)
5915
- ])) : (0, vue.createCommentVNode)("", true), (0, vue.createElementVNode)("table", _hoisted_63, [(0, vue.createElementVNode)("thead", null, [(0, vue.createElementVNode)("tr", _hoisted_64, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(listColumnFields.value, ([key, field]) => {
5995
+ onClick: _cache[16] || (_cache[16] = ($event) => inlineError.value = null)
5996
+ }, [..._cache[53] || (_cache[53] = [(0, vue.createElementVNode)("span", { class: "material-icons text-base" }, "close", -1)])], 8, _hoisted_64)
5997
+ ])) : (0, vue.createCommentVNode)("", true), (0, vue.createElementVNode)("table", _hoisted_65, [(0, vue.createElementVNode)("thead", null, [(0, vue.createElementVNode)("tr", _hoisted_66, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(listColumnFields.value, ([key, field]) => {
5916
5998
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("th", {
5917
5999
  key,
5918
6000
  "aria-sort": (0, vue.unref)(_mulmoclaude_core_collection.isSortableField)(field) ? sortAriaValue(key) : void 0,
5919
6001
  class: "px-5 py-3 font-bold text-slate-500 text-left uppercase tracking-wider whitespace-nowrap"
5920
- }, [(0, vue.createElementVNode)("div", _hoisted_66, [(0, vue.createElementVNode)("span", {
6002
+ }, [(0, vue.createElementVNode)("div", _hoisted_68, [(0, vue.createElementVNode)("span", {
5921
6003
  class: "truncate max-w-[14rem]",
5922
6004
  title: field.label
5923
- }, (0, vue.toDisplayString)(field.label), 9, _hoisted_67), (0, vue.unref)(_mulmoclaude_core_collection.isSortableField)(field) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
6005
+ }, (0, vue.toDisplayString)(field.label), 9, _hoisted_69), (0, vue.unref)(_mulmoclaude_core_collection.isSortableField)(field) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
5924
6006
  key: 0,
5925
6007
  type: "button",
5926
6008
  class: (0, vue.normalizeClass)(["inline-flex items-center justify-center rounded p-0.5 -my-1 leading-none transition-colors", sortButtonClass(key)]),
@@ -5928,9 +6010,9 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5928
6010
  "aria-label": (0, vue.unref)(t)("collectionsView.sortBy", { field: field.label }),
5929
6011
  onClick: (0, vue.withModifiers)(($event) => cycleSort(key), ["stop"]),
5930
6012
  onPointerenter: ($event) => hoveredSortKey.value = key,
5931
- onPointerleave: _cache[16] || (_cache[16] = ($event) => hoveredSortKey.value = null)
5932
- }, [(0, vue.createElementVNode)("span", _hoisted_69, (0, vue.toDisplayString)(sortIconName(key)), 1)], 42, _hoisted_68)) : (0, vue.createCommentVNode)("", true)])], 8, _hoisted_65);
5933
- }), 128))])]), (0, vue.createElementVNode)("tbody", _hoisted_70, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(sortedItems.value, (item) => {
6013
+ onPointerleave: _cache[17] || (_cache[17] = ($event) => hoveredSortKey.value = null)
6014
+ }, [(0, vue.createElementVNode)("span", _hoisted_71, (0, vue.toDisplayString)(sortIconName(key)), 1)], 42, _hoisted_70)) : (0, vue.createCommentVNode)("", true)])], 8, _hoisted_67);
6015
+ }), 128))])]), (0, vue.createElementVNode)("tbody", _hoisted_72, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(sortedItems.value, (item) => {
5934
6016
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("tr", {
5935
6017
  key: String(item[collection.value.schema.primaryKey] ?? ""),
5936
6018
  class: (0, vue.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" : ""]),
@@ -5952,9 +6034,9 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5952
6034
  class: "h-5 w-5 rounded border-slate-300 text-indigo-600 focus:ring-indigo-500/20 cursor-pointer align-middle disabled:opacity-50 disabled:cursor-not-allowed",
5953
6035
  "data-testid": `collections-inline-toggle-${key}-${item[collection.value.schema.primaryKey]}`,
5954
6036
  "aria-label": field.label,
5955
- onClick: _cache[17] || (_cache[17] = (0, vue.withModifiers)(() => {}, ["stop"])),
6037
+ onClick: _cache[18] || (_cache[18] = (0, vue.withModifiers)(() => {}, ["stop"])),
5956
6038
  onChange: ($event) => commitToggle(item, field)
5957
- }, null, 40, _hoisted_72)) : field.type === "boolean" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("input", {
6039
+ }, null, 40, _hoisted_74)) : field.type === "boolean" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("input", {
5958
6040
  key: 1,
5959
6041
  type: "checkbox",
5960
6042
  checked: item[key] === true,
@@ -5962,15 +6044,15 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5962
6044
  class: "h-5 w-5 rounded border-slate-300 text-indigo-600 focus:ring-indigo-500/20 cursor-pointer align-middle disabled:opacity-50 disabled:cursor-not-allowed",
5963
6045
  "data-testid": `collections-inline-bool-${key}-${item[collection.value.schema.primaryKey]}`,
5964
6046
  "aria-label": field.label,
5965
- onClick: _cache[18] || (_cache[18] = (0, vue.withModifiers)(() => {}, ["stop"])),
6047
+ onClick: _cache[19] || (_cache[19] = (0, vue.withModifiers)(() => {}, ["stop"])),
5966
6048
  onChange: ($event) => commitInlineEdit(item, String(key), field, $event.target.checked)
5967
- }, null, 40, _hoisted_73)) : field.type === "flag" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", {
6049
+ }, null, 40, _hoisted_75)) : field.type === "flag" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", {
5968
6050
  key: 2,
5969
6051
  class: (0, vue.normalizeClass)(["material-icons text-lg align-middle", flagValueOf(String(key), item) ? "text-emerald-600" : "text-slate-300"]),
5970
6052
  "data-testid": `collections-flag-${key}-${item[collection.value.schema.primaryKey]}`,
5971
6053
  "aria-label": `${field.label}: ${(0, vue.unref)(t)(flagValueOf(String(key), item) ? "common.yes" : "common.no")}`,
5972
6054
  role: "img"
5973
- }, (0, vue.toDisplayString)(flagValueOf(String(key), item) ? "check_circle" : "radio_button_unchecked"), 11, _hoisted_74)) : field.type === "ref" && field.to && typeof item[key] === "string" && item[key] ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_75, [(0, vue.createElementVNode)("a", {
6055
+ }, (0, vue.toDisplayString)(flagValueOf(String(key), item) ? "check_circle" : "radio_button_unchecked"), 11, _hoisted_76)) : field.type === "ref" && field.to && typeof item[key] === "string" && item[key] ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_77, [(0, vue.createElementVNode)("a", {
5974
6056
  href: (0, vue.unref)(cui).recordHref?.(field.to, String(item[key])),
5975
6057
  tabindex: (0, vue.unref)(cui).recordHref?.(field.to, String(item[key])) ? void 0 : 0,
5976
6058
  role: "link",
@@ -5978,48 +6060,48 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5978
6060
  "data-testid": `collections-ref-link-${key}-${item[key]}`,
5979
6061
  onClick: ($event) => (0, vue.unref)(activateRefLink)($event, field.to, String(item[key]), true),
5980
6062
  onKeydown: [(0, vue.withKeys)(($event) => (0, vue.unref)(activateRefLink)($event, field.to, String(item[key]), true), ["enter"]), (0, vue.withKeys)(($event) => (0, vue.unref)(activateRefLink)($event, field.to, String(item[key]), true), ["space"])]
5981
- }, (0, vue.toDisplayString)((0, vue.unref)(refDisplay)(field.to, String(item[key]))), 41, _hoisted_76)])) : field.type === "enum" && Array.isArray(field.values) && field.values.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("select", {
6063
+ }, (0, vue.toDisplayString)((0, vue.unref)(refDisplay)(field.to, String(item[key]))), 41, _hoisted_78)])) : field.type === "enum" && Array.isArray(field.values) && field.values.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("select", {
5982
6064
  key: 4,
5983
6065
  value: item[key] == null ? "" : String(item[key]),
5984
6066
  disabled: isReadOnly.value || isRowInlineSaving(item),
5985
6067
  class: (0, vue.normalizeClass)(["rounded-lg border px-2 py-0.5 text-[11px] font-semibold focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500/20 focus:outline-none cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed", enumControlClass(String(key), item[key])]),
5986
6068
  "data-testid": `collections-inline-enum-${key}-${item[collection.value.schema.primaryKey]}`,
5987
6069
  "aria-label": field.label,
5988
- onClick: _cache[19] || (_cache[19] = (0, vue.withModifiers)(() => {}, ["stop"])),
6070
+ onClick: _cache[20] || (_cache[20] = (0, vue.withModifiers)(() => {}, ["stop"])),
5989
6071
  onChange: ($event) => commitInlineEdit(item, String(key), field, $event.target.value)
5990
- }, [showEnumPlaceholder(item, String(key)) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("option", _hoisted_78, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.selectPlaceholder")), 1)) : (0, vue.createCommentVNode)("", true), ((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(field.values, (value) => {
6072
+ }, [showEnumPlaceholder(item, String(key)) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("option", _hoisted_80, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.selectPlaceholder")), 1)) : (0, vue.createCommentVNode)("", true), ((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(field.values, (value) => {
5991
6073
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("option", {
5992
6074
  key: value,
5993
6075
  value
5994
- }, (0, vue.toDisplayString)(value), 9, _hoisted_79);
5995
- }), 128))], 42, _hoisted_77)) : field.type === "money" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_80, (0, vue.toDisplayString)((0, vue.unref)(formatMoney)(item[key], (0, vue.unref)(resolveCurrency)(field, item), (0, vue.unref)(locale))), 1)) : field.type === "table" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_81, [_cache[53] || (_cache[53] = (0, vue.createElementVNode)("span", { class: "material-icons text-[11px]" }, "list", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)(tableSummary(item[key])), 1)])) : field.type === "derived" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_82, (0, vue.toDisplayString)((0, vue.unref)(derivedDisplay)(field, (0, vue.unref)(evaluateDerivedAgainstItem)(field, String(key), item), item)), 1)) : field.type === "rollup" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", {
6076
+ }, (0, vue.toDisplayString)(value), 9, _hoisted_81);
6077
+ }), 128))], 42, _hoisted_79)) : field.type === "money" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_82, (0, vue.toDisplayString)((0, vue.unref)(formatMoney)(item[key], (0, vue.unref)(resolveCurrency)(field, item), (0, vue.unref)(locale))), 1)) : field.type === "table" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_83, [_cache[55] || (_cache[55] = (0, vue.createElementVNode)("span", { class: "material-icons text-[11px]" }, "list", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)(tableSummary(item[key])), 1)])) : field.type === "derived" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_84, (0, vue.toDisplayString)((0, vue.unref)(derivedDisplay)(field, (0, vue.unref)(evaluateDerivedAgainstItem)(field, String(key), item), item)), 1)) : field.type === "rollup" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", {
5996
6078
  key: 8,
5997
6079
  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",
5998
6080
  "data-testid": `collections-rollup-${key}-${item[collection.value.schema.primaryKey]}`
5999
- }, (0, vue.toDisplayString)((0, vue.unref)(render).rollupDisplay(field, item)), 9, _hoisted_83)) : field.type !== "file" && (0, vue.unref)(isExternalUrl)(item[key]) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
6081
+ }, (0, vue.toDisplayString)((0, vue.unref)(render).rollupDisplay(field, item)), 9, _hoisted_85)) : field.type !== "file" && (0, vue.unref)(isExternalUrl)(item[key]) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
6000
6082
  key: 9,
6001
6083
  href: String(item[key]),
6002
6084
  target: "_blank",
6003
6085
  rel: "noopener noreferrer",
6004
6086
  class: "block truncate text-blue-600 hover:text-blue-800 hover:underline font-semibold",
6005
6087
  "data-testid": `collections-url-link-${key}-${item[collection.value.schema.primaryKey]}`,
6006
- onClick: _cache[20] || (_cache[20] = (0, vue.withModifiers)(() => {}, ["stop"]))
6007
- }, (0, vue.toDisplayString)(String(item[key])), 9, _hoisted_84)) : field.type === "file" && (0, vue.unref)(artifactUrl)(item[key]) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
6088
+ onClick: _cache[21] || (_cache[21] = (0, vue.withModifiers)(() => {}, ["stop"]))
6089
+ }, (0, vue.toDisplayString)(String(item[key])), 9, _hoisted_86)) : field.type === "file" && (0, vue.unref)(artifactUrl)(item[key]) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
6008
6090
  key: 10,
6009
6091
  href: (0, vue.unref)(artifactUrl)(item[key]) ?? void 0,
6010
6092
  target: "_blank",
6011
6093
  rel: "noopener noreferrer",
6012
6094
  class: "block truncate text-blue-600 hover:text-blue-800 hover:underline font-semibold",
6013
6095
  "data-testid": `collections-file-link-${key}-${item[collection.value.schema.primaryKey]}`,
6014
- onClick: _cache[21] || (_cache[21] = (0, vue.withModifiers)(() => {}, ["stop"]))
6015
- }, (0, vue.toDisplayString)(String(item[key])), 9, _hoisted_85)) : field.type === "file" && (0, vue.unref)(fileRoutePath)(item[key]) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
6096
+ onClick: _cache[22] || (_cache[22] = (0, vue.withModifiers)(() => {}, ["stop"]))
6097
+ }, (0, vue.toDisplayString)(String(item[key])), 9, _hoisted_87)) : field.type === "file" && (0, vue.unref)(fileRoutePath)(item[key]) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
6016
6098
  key: 11,
6017
6099
  href: (0, vue.unref)(fileRoutePath)(item[key]) ?? void 0,
6018
6100
  class: "block truncate text-blue-600 hover:text-blue-800 hover:underline font-semibold",
6019
6101
  "data-testid": `collections-file-link-${key}-${item[collection.value.schema.primaryKey]}`,
6020
6102
  onClick: ($event) => (0, vue.unref)(activatePathLink)($event, (0, vue.unref)(fileRoutePath)(item[key]) ?? "", true)
6021
- }, (0, vue.toDisplayString)(String(item[key])), 9, _hoisted_86)) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_87, (0, vue.toDisplayString)((0, vue.unref)(formatCell)(item[key], field.type)), 1))], 64)) : (0, vue.createCommentVNode)("", true)]);
6022
- }), 128))], 42, _hoisted_71);
6103
+ }, (0, vue.toDisplayString)(String(item[key])), 9, _hoisted_88)) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_89, (0, vue.toDisplayString)((0, vue.unref)(formatCell)(item[key], field.type)), 1))], 64)) : (0, vue.createCommentVNode)("", true)]);
6104
+ }), 128))], 42, _hoisted_73);
6023
6105
  }), 128))])])]))]),
6024
6106
  collection.value && (viewing.value || editing.value) && !(calendarActive.value && openDay.value) ? ((0, vue.openBlock)(), (0, vue.createBlock)(CollectionRecordModal_default, {
6025
6107
  key: 4,
@@ -6027,7 +6109,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
6027
6109
  }, {
6028
6110
  default: (0, vue.withCtx)(() => [(0, vue.createVNode)(CollectionRecordPanel_default, {
6029
6111
  editing: editing.value,
6030
- "onUpdate:editing": _cache[22] || (_cache[22] = ($event) => editing.value = $event),
6112
+ "onUpdate:editing": _cache[23] || (_cache[23] = ($event) => editing.value = $event),
6031
6113
  collection: collection.value,
6032
6114
  viewing: viewing.value,
6033
6115
  saving: saving.value,
@@ -6047,7 +6129,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
6047
6129
  onCancel: cancelEditor,
6048
6130
  onEdit: editFromView,
6049
6131
  onClose: closeView,
6050
- onDelete: _cache[23] || (_cache[23] = ($event) => viewing.value && confirmDelete(viewing.value)),
6132
+ onDelete: _cache[24] || (_cache[24] = ($event) => viewing.value && confirmDelete(viewing.value)),
6051
6133
  onRunAction: runAction,
6052
6134
  onItemChat
6053
6135
  }, null, 8, [
@@ -6075,7 +6157,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
6075
6157
  action: mutateModal.value.action,
6076
6158
  pending: mutatePending.value,
6077
6159
  error: mutateError.value,
6078
- onClose: _cache[24] || (_cache[24] = ($event) => mutateModal.value = null),
6160
+ onClose: _cache[25] || (_cache[25] = ($event) => mutateModal.value = null),
6079
6161
  onSubmit: submitMutateParams
6080
6162
  }, null, 8, [
6081
6163
  "action",
@@ -6088,7 +6170,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
6088
6170
  title: collection.value.title,
6089
6171
  views: customViews.value,
6090
6172
  onChanged: onViewsChanged,
6091
- onClose: _cache[25] || (_cache[25] = ($event) => configOpen.value = false)
6173
+ onClose: _cache[26] || (_cache[26] = ($event) => configOpen.value = false)
6092
6174
  }, null, 8, [
6093
6175
  "slug",
6094
6176
  "title",
@@ -6103,29 +6185,29 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
6103
6185
  "data-testid": "collections-chat-modal",
6104
6186
  onClick: (0, vue.withModifiers)(closeChat, ["self"]),
6105
6187
  onKeydown: (0, vue.withKeys)(closeChat, ["esc"])
6106
- }, [(0, vue.createElementVNode)("div", _hoisted_88, [
6107
- (0, vue.createElementVNode)("header", _hoisted_89, [
6108
- _cache[55] || (_cache[55] = (0, vue.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" }, [(0, vue.createElementVNode)("span", { class: "material-icons text-lg" }, "forum")], -1)),
6109
- (0, vue.createElementVNode)("div", _hoisted_90, [(0, vue.createElementVNode)("h2", _hoisted_91, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.chatTitle")), 1), (0, vue.createElementVNode)("span", _hoisted_92, (0, vue.toDisplayString)(collection.value.title), 1)]),
6188
+ }, [(0, vue.createElementVNode)("div", _hoisted_90, [
6189
+ (0, vue.createElementVNode)("header", _hoisted_91, [
6190
+ _cache[57] || (_cache[57] = (0, vue.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" }, [(0, vue.createElementVNode)("span", { class: "material-icons text-lg" }, "forum")], -1)),
6191
+ (0, vue.createElementVNode)("div", _hoisted_92, [(0, vue.createElementVNode)("h2", _hoisted_93, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.chatTitle")), 1), (0, vue.createElementVNode)("span", _hoisted_94, (0, vue.toDisplayString)(collection.value.title), 1)]),
6110
6192
  (0, vue.createElementVNode)("button", {
6111
6193
  type: "button",
6112
6194
  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",
6113
6195
  "aria-label": (0, vue.unref)(t)("common.close"),
6114
6196
  "data-testid": "collections-chat-close",
6115
6197
  onClick: closeChat
6116
- }, [..._cache[54] || (_cache[54] = [(0, vue.createElementVNode)("span", { class: "material-icons text-lg" }, "close", -1)])], 8, _hoisted_93)
6198
+ }, [..._cache[56] || (_cache[56] = [(0, vue.createElementVNode)("span", { class: "material-icons text-lg" }, "close", -1)])], 8, _hoisted_95)
6117
6199
  ]),
6118
- (0, vue.createElementVNode)("div", _hoisted_94, [(0, vue.withDirectives)((0, vue.createElementVNode)("textarea", {
6200
+ (0, vue.createElementVNode)("div", _hoisted_96, [(0, vue.withDirectives)((0, vue.createElementVNode)("textarea", {
6119
6201
  ref_key: "chatInputEl",
6120
6202
  ref: chatInputEl,
6121
- "onUpdate:modelValue": _cache[26] || (_cache[26] = ($event) => chatMessage.value = $event),
6203
+ "onUpdate:modelValue": _cache[27] || (_cache[27] = ($event) => chatMessage.value = $event),
6122
6204
  rows: "4",
6123
6205
  placeholder: (0, vue.unref)(t)("collectionsView.chatPlaceholder"),
6124
6206
  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",
6125
6207
  "data-testid": "collections-chat-input",
6126
6208
  onKeydown: [(0, vue.withKeys)((0, vue.withModifiers)(submitChat, ["meta"]), ["enter"]), (0, vue.withKeys)((0, vue.withModifiers)(submitChat, ["ctrl"]), ["enter"])]
6127
- }, null, 40, _hoisted_95), [[vue.vModelText, chatMessage.value]])]),
6128
- (0, vue.createElementVNode)("footer", _hoisted_96, [(0, vue.createElementVNode)("button", {
6209
+ }, null, 40, _hoisted_97), [[vue.vModelText, chatMessage.value]])]),
6210
+ (0, vue.createElementVNode)("footer", _hoisted_98, [(0, vue.createElementVNode)("button", {
6129
6211
  type: "button",
6130
6212
  class: "h-8 px-2.5 rounded text-xs font-bold text-slate-500 hover:bg-slate-200/50 transition-colors",
6131
6213
  "data-testid": "collections-chat-cancel",
@@ -6136,7 +6218,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
6136
6218
  disabled: !chatMessage.value.trim(),
6137
6219
  "data-testid": "collections-chat-send",
6138
6220
  onClick: submitChat
6139
- }, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.chatStart")), 9, _hoisted_97)])
6221
+ }, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.chatStart")), 9, _hoisted_99)])
6140
6222
  ])], 32)) : (0, vue.createCommentVNode)("", true)
6141
6223
  ]);
6142
6224
  };