@mulmoclaude/collection-plugin 0.13.0 → 0.13.1

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,31 @@ 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
+ function closeFilterMenuOnOutsideClick(event) {
4489
+ if (!filterMenuRef.value?.contains(event.target)) filterMenuOpen.value = false;
4490
+ }
4491
+ (0, vue.watch)(filterMenuOpen, (open) => {
4492
+ if (open) document.addEventListener("mousedown", closeFilterMenuOnOutsideClick);
4493
+ else document.removeEventListener("mousedown", closeFilterMenuOnOutsideClick);
4494
+ });
4448
4495
  function flagChipTitle(chip) {
4449
4496
  const mode = flagFilterMode(chip.key);
4450
4497
  if (mode === "hide") return t("collectionsView.flagFilterHide", { label: chip.label });
@@ -5463,6 +5510,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5463
5510
  anchorOverride.value = null;
5464
5511
  kanbanOverride.value = null;
5465
5512
  addMenuOpen.value = false;
5513
+ filterMenuOpen.value = false;
5466
5514
  sortState.value = storedSortFor(slug);
5467
5515
  flagFilters.value = storedFlagFiltersFor(slug);
5468
5516
  }
@@ -5513,6 +5561,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5513
5561
  clearLiveRefreshTimer();
5514
5562
  if (refreshNoteTimer !== void 0) clearTimeout(refreshNoteTimer);
5515
5563
  document.removeEventListener("mousedown", closeAddMenuOnOutsideClick);
5564
+ document.removeEventListener("mousedown", closeFilterMenuOnOutsideClick);
5516
5565
  });
5517
5566
  (0, vue.watch)([
5518
5567
  activeView,
@@ -5549,9 +5598,9 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5549
5598
  "aria-label": (0, vue.unref)(t)("collectionsView.backToIndex"),
5550
5599
  "data-testid": "collections-back",
5551
5600
  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),
5601
+ }, [..._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
5602
  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", {
5603
+ (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
5604
  key: 0,
5556
5605
  href: dataSourceRoute.value ?? void 0,
5557
5606
  class: "ml-1 normal-case tracking-normal font-mono font-normal text-slate-500 hover:text-indigo-700 hover:underline",
@@ -5584,7 +5633,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5584
5633
  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
5634
  "data-testid": "collections-chat",
5586
5635
  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),
5636
+ }, [_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
5637
  ((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(collectionActions.value, (action) => {
5589
5638
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
5590
5639
  key: action.id,
@@ -5601,7 +5650,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5601
5650
  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
5651
  "data-testid": "collections-add-item",
5603
5652
  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),
5653
+ }, [_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
5654
  canDeleteCollection.value && !embedded.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
5606
5655
  key: 6,
5607
5656
  type: "button",
@@ -5610,7 +5659,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5610
5659
  "aria-label": (0, vue.unref)(t)("collectionsView.deleteCollection"),
5611
5660
  "data-testid": "collections-delete",
5612
5661
  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),
5662
+ }, [..._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
5663
  canDeleteFeed.value && !embedded.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
5615
5664
  key: 7,
5616
5665
  type: "button",
@@ -5619,11 +5668,11 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5619
5668
  "aria-label": (0, vue.unref)(t)("collectionsView.deleteFeed"),
5620
5669
  "data-testid": "feeds-delete",
5621
5670
  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)
5671
+ }, [..._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
5672
  ])) : (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),
5673
+ 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
5674
  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)),
5675
+ _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
5676
  (0, vue.withDirectives)((0, vue.createElementVNode)("input", {
5628
5677
  "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => searchQuery.value = $event),
5629
5678
  type: "text",
@@ -5637,25 +5686,48 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5637
5686
  "aria-label": (0, vue.unref)(t)("collectionsView.clearSearch"),
5638
5687
  class: "absolute inset-y-0 right-0 flex items-center pr-2.5 text-slate-400 hover:text-slate-600",
5639
5688
  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)
5689
+ }, [..._cache[35] || (_cache[35] = [(0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "close", -1)])], 8, _hoisted_23$2)) : (0, vue.createCommentVNode)("", true)
5641
5690
  ])) : (0, vue.createCommentVNode)("", true), (0, vue.createElementVNode)("div", _hoisted_24$1, [
5642
5691
  activeView.value === "table" && flagChips.value.length > 0 && items.value.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
5643
5692
  key: 0,
5644
- class: "flex items-center gap-0.5",
5693
+ ref_key: "filterMenuRef",
5694
+ ref: filterMenuRef,
5695
+ class: "relative"
5696
+ }, [(0, vue.createElementVNode)("button", {
5697
+ type: "button",
5698
+ 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"]),
5699
+ "aria-label": (0, vue.unref)(t)("collectionsView.flagFilterButton"),
5700
+ "aria-expanded": filterMenuOpen.value,
5701
+ "data-testid": "collections-filter-menu",
5702
+ onClick: _cache[3] || (_cache[3] = ($event) => filterMenuOpen.value = !filterMenuOpen.value)
5703
+ }, [
5704
+ _cache[37] || (_cache[37] = (0, vue.createElementVNode)("span", {
5705
+ class: "material-icons text-sm",
5706
+ "aria-hidden": "true"
5707
+ }, "filter_alt", -1)),
5708
+ (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.flagFilterButton")), 1),
5709
+ activeFlagFilterCount.value > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_26$1, (0, vue.toDisplayString)(activeFlagFilterCount.value), 1)) : (0, vue.createCommentVNode)("", true)
5710
+ ], 10, _hoisted_25$1), filterMenuOpen.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
5711
+ key: 0,
5712
+ 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
5713
  role: "group",
5646
- "aria-label": (0, vue.unref)(t)("collectionsView.flagFilterGroup")
5714
+ "aria-label": (0, vue.unref)(t)("collectionsView.flagFilterButton"),
5715
+ "data-testid": "collections-filter-menu-panel"
5647
5716
  }, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(flagChips.value, (chip) => {
5648
5717
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
5649
5718
  key: chip.key,
5650
5719
  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)]),
5720
+ 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
5721
  title: flagChipTitle(chip),
5653
5722
  "aria-label": flagChipTitle(chip),
5654
5723
  "aria-pressed": flagFilterMode(chip.key) !== void 0,
5655
5724
  "data-testid": `collections-flag-chip-${chip.key}`,
5656
5725
  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),
5726
+ }, [(0, vue.createElementVNode)("span", {
5727
+ class: (0, vue.normalizeClass)(["material-icons text-sm", flagChipIconClass(chip.key)]),
5728
+ "aria-hidden": "true"
5729
+ }, (0, vue.toDisplayString)(flagChipIcon(chip.key)), 3), (0, vue.createElementVNode)("span", _hoisted_29, (0, vue.toDisplayString)(chip.label), 1)], 10, _hoisted_28);
5730
+ }), 128))], 8, _hoisted_27$1)) : (0, vue.createCommentVNode)("", true)], 512)) : (0, vue.createCommentVNode)("", true),
5659
5731
  !__props.hideViewToggle && (hasCalendar.value || hasKanban.value || hasCustomViews.value || canAddCustomView.value) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
5660
5732
  key: 1,
5661
5733
  class: "flex gap-0.5",
@@ -5667,24 +5739,24 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5667
5739
  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
5740
  "aria-pressed": activeView.value === "table",
5669
5741
  "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),
5742
+ onClick: _cache[4] || (_cache[4] = ($event) => setView("table"))
5743
+ }, [_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
5744
  hasCalendar.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
5673
5745
  key: 0,
5674
5746
  type: "button",
5675
5747
  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
5748
  "aria-pressed": activeView.value === "calendar",
5677
5749
  "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),
5750
+ onClick: _cache[5] || (_cache[5] = ($event) => setView("calendar"))
5751
+ }, [_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
5752
  hasKanban.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
5681
5753
  key: 1,
5682
5754
  type: "button",
5683
5755
  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
5756
  "aria-pressed": activeView.value === "kanban",
5685
5757
  "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),
5758
+ onClick: _cache[6] || (_cache[6] = ($event) => setView("kanban"))
5759
+ }, [_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
5760
  ((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(customViews.value, (cv) => {
5689
5761
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
5690
5762
  key: cv.id,
@@ -5693,7 +5765,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5693
5765
  "aria-pressed": activeView.value === (0, vue.unref)(customViewKey)(cv.id),
5694
5766
  "data-testid": `collection-view-custom-${cv.id}`,
5695
5767
  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);
5768
+ }, [(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
5769
  }), 128)),
5698
5770
  canAddCustomView.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
5699
5771
  key: 2,
@@ -5708,17 +5780,17 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5708
5780
  "aria-expanded": addMenuOpen.value,
5709
5781
  "data-testid": "collection-view-add",
5710
5782
  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", {
5783
+ }, [..._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
5784
  type: "button",
5713
5785
  class: "w-full h-8 px-3 flex items-center gap-2 text-xs font-bold text-slate-600 hover:bg-slate-50",
5714
5786
  "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", {
5787
+ onClick: _cache[7] || (_cache[7] = ($event) => addCustomView("desktop"))
5788
+ }, [_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
5789
  type: "button",
5718
5790
  class: "w-full h-8 px-3 flex items-center gap-2 text-xs font-bold text-slate-600 hover:bg-slate-50",
5719
5791
  "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),
5792
+ onClick: _cache[8] || (_cache[8] = ($event) => addCustomView("mobile"))
5793
+ }, [_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
5794
  canConfigureViews.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
5723
5795
  key: 3,
5724
5796
  type: "button",
@@ -5726,51 +5798,51 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5726
5798
  title: (0, vue.unref)(t)("collectionsView.config.open"),
5727
5799
  "aria-label": (0, vue.unref)(t)("collectionsView.config.open"),
5728
5800
  "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),
5801
+ onClick: _cache[9] || (_cache[9] = ($event) => configOpen.value = true)
5802
+ }, [..._cache[44] || (_cache[44] = [(0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "settings", -1)])], 8, _hoisted_38)) : (0, vue.createCommentVNode)("", true)
5803
+ ], 8, _hoisted_30)) : (0, vue.createCommentVNode)("", true),
5732
5804
  calendarActive.value && dateFields.value.length > 1 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("select", {
5733
5805
  key: 2,
5734
5806
  value: calendarAnchorField.value,
5735
5807
  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
5808
  "aria-label": (0, vue.unref)(t)("collectionsView.calendarFieldLabel"),
5737
5809
  "data-testid": "collection-calendar-field",
5738
- onChange: _cache[9] || (_cache[9] = ($event) => anchorOverride.value = $event.target.value)
5810
+ onChange: _cache[10] || (_cache[10] = ($event) => anchorOverride.value = $event.target.value)
5739
5811
  }, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(dateFields.value, (key) => {
5740
5812
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("option", {
5741
5813
  key,
5742
5814
  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),
5815
+ }, (0, vue.toDisplayString)(collection.value?.schema.fields[key]?.label ?? key), 9, _hoisted_40);
5816
+ }), 128))], 40, _hoisted_39)) : (0, vue.createCommentVNode)("", true),
5745
5817
  kanbanActive.value && enumFields.value.length > 1 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("select", {
5746
5818
  key: 3,
5747
5819
  value: kanbanGroupField.value,
5748
5820
  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
5821
  "aria-label": (0, vue.unref)(t)("collectionsView.kanbanFieldLabel"),
5750
5822
  "data-testid": "collection-kanban-field",
5751
- onChange: _cache[10] || (_cache[10] = ($event) => kanbanOverride.value = $event.target.value)
5823
+ onChange: _cache[11] || (_cache[11] = ($event) => kanbanOverride.value = $event.target.value)
5752
5824
  }, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(enumFields.value, (key) => {
5753
5825
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("option", {
5754
5826
  key,
5755
5827
  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", {
5828
+ }, (0, vue.toDisplayString)(collection.value?.schema.fields[key]?.label ?? key), 9, _hoisted_42);
5829
+ }), 128))], 40, _hoisted_41)) : (0, vue.createCommentVNode)("", true),
5830
+ items.value.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_43, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.searchSummary", {
5759
5831
  shown: activeView.value === "table" ? tableFilteredItems.value.length : filteredItems.value.length,
5760
5832
  total: items.value.length
5761
5833
  })), 1)) : (0, vue.createCommentVNode)("", true)
5762
5834
  ])])) : (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),
5835
+ collection.value && dataIssues.value.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_44, [
5836
+ _cache[46] || (_cache[46] = (0, vue.createElementVNode)("span", { class: "material-icons text-amber-600" }, "warning", -1)),
5837
+ (0, vue.createElementVNode)("span", _hoisted_45, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.dataIssuesDetected", { count: dataIssues.value.length })), 1),
5766
5838
  (0, vue.createElementVNode)("button", {
5767
5839
  type: "button",
5768
5840
  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
5841
  "data-testid": "collections-repair",
5770
5842
  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)])
5843
+ }, [_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
5844
  ])) : (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, {
5845
+ (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
5846
  schema: collection.value.schema,
5775
5847
  items: filteredItems.value,
5776
5848
  "anchor-field": calendarAnchorField.value,
@@ -5806,7 +5878,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5806
5878
  }, {
5807
5879
  detail: (0, vue.withCtx)(() => [(0, vue.createVNode)(CollectionRecordPanel_default, {
5808
5880
  editing: editing.value,
5809
- "onUpdate:editing": _cache[11] || (_cache[11] = ($event) => editing.value = $event),
5881
+ "onUpdate:editing": _cache[12] || (_cache[12] = ($event) => editing.value = $event),
5810
5882
  collection: collection.value,
5811
5883
  viewing: viewing.value,
5812
5884
  saving: saving.value,
@@ -5826,7 +5898,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5826
5898
  onCancel: cancelEditor,
5827
5899
  onEdit: editFromView,
5828
5900
  onClose: onDayClose,
5829
- onDelete: _cache[12] || (_cache[12] = ($event) => viewing.value && confirmDelete(viewing.value)),
5901
+ onDelete: _cache[13] || (_cache[13] = ($event) => viewing.value && confirmDelete(viewing.value)),
5830
5902
  onRunAction: runAction,
5831
5903
  onItemChat
5832
5904
  }, null, 8, [
@@ -5859,16 +5931,16 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5859
5931
  "selected",
5860
5932
  "can-create",
5861
5933
  "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),
5934
+ ])) : (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, [
5935
+ _cache[50] || (_cache[50] = (0, vue.createElementVNode)("span", { class: "material-icons text-red-600" }, "error", -1)),
5936
+ (0, vue.createElementVNode)("span", _hoisted_53, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.inlineSaveFailed", { error: inlineError.value })), 1),
5865
5937
  (0, vue.createElementVNode)("button", {
5866
5938
  type: "button",
5867
5939
  class: "h-8 w-8 flex items-center justify-center rounded text-red-600 hover:bg-red-100",
5868
5940
  "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, {
5941
+ onClick: _cache[14] || (_cache[14] = ($event) => inlineError.value = null)
5942
+ }, [..._cache[49] || (_cache[49] = [(0, vue.createElementVNode)("span", { class: "material-icons text-base" }, "close", -1)])], 8, _hoisted_54)
5943
+ ])) : (0, vue.createCommentVNode)("", true), (0, vue.createElementVNode)("div", _hoisted_55, [(0, vue.createVNode)(CollectionKanbanView_default, {
5872
5944
  schema: collection.value.schema,
5873
5945
  items: filteredItems.value,
5874
5946
  "group-field": kanbanGroupField.value,
@@ -5884,7 +5956,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5884
5956
  "selected",
5885
5957
  "notified",
5886
5958
  "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, {
5959
+ ])])])) : activeCustomView.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_56, [activeCustomView.value.target === "mobile" ? ((0, vue.openBlock)(), (0, vue.createBlock)(CollectionRemoteViewPreview_default, {
5888
5960
  key: 0,
5889
5961
  slug: collection.value.slug,
5890
5962
  view: activeCustomView.value,
@@ -5895,32 +5967,32 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5895
5967
  view: activeCustomView.value,
5896
5968
  onOpenItem: onCustomViewOpenItem,
5897
5969
  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),
5970
+ }, 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, [
5971
+ _cache[52] || (_cache[52] = (0, vue.createElementVNode)("span", { class: "material-icons text-4xl text-slate-300" }, "search_off", -1)),
5972
+ (0, vue.createElementVNode)("p", _hoisted_60, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.noMatchingItems")), 1),
5901
5973
  (0, vue.createElementVNode)("button", {
5902
5974
  type: "button",
5903
5975
  class: "text-xs text-indigo-600 font-semibold hover:underline",
5904
- onClick: _cache[14] || (_cache[14] = ($event) => (searchQuery.value = "", flagFilters.value = {}))
5976
+ onClick: _cache[15] || (_cache[15] = ($event) => (searchQuery.value = "", flagFilters.value = {}))
5905
5977
  }, (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),
5978
+ ])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_61, [inlineError.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_62, [
5979
+ _cache[54] || (_cache[54] = (0, vue.createElementVNode)("span", { class: "material-icons text-red-600" }, "error", -1)),
5980
+ (0, vue.createElementVNode)("span", _hoisted_63, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.inlineSaveFailed", { error: inlineError.value })), 1),
5909
5981
  (0, vue.createElementVNode)("button", {
5910
5982
  type: "button",
5911
5983
  class: "h-8 w-8 flex items-center justify-center rounded text-red-600 hover:bg-red-100",
5912
5984
  "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]) => {
5985
+ onClick: _cache[16] || (_cache[16] = ($event) => inlineError.value = null)
5986
+ }, [..._cache[53] || (_cache[53] = [(0, vue.createElementVNode)("span", { class: "material-icons text-base" }, "close", -1)])], 8, _hoisted_64)
5987
+ ])) : (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
5988
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("th", {
5917
5989
  key,
5918
5990
  "aria-sort": (0, vue.unref)(_mulmoclaude_core_collection.isSortableField)(field) ? sortAriaValue(key) : void 0,
5919
5991
  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", {
5992
+ }, [(0, vue.createElementVNode)("div", _hoisted_68, [(0, vue.createElementVNode)("span", {
5921
5993
  class: "truncate max-w-[14rem]",
5922
5994
  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", {
5995
+ }, (0, vue.toDisplayString)(field.label), 9, _hoisted_69), (0, vue.unref)(_mulmoclaude_core_collection.isSortableField)(field) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
5924
5996
  key: 0,
5925
5997
  type: "button",
5926
5998
  class: (0, vue.normalizeClass)(["inline-flex items-center justify-center rounded p-0.5 -my-1 leading-none transition-colors", sortButtonClass(key)]),
@@ -5928,9 +6000,9 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5928
6000
  "aria-label": (0, vue.unref)(t)("collectionsView.sortBy", { field: field.label }),
5929
6001
  onClick: (0, vue.withModifiers)(($event) => cycleSort(key), ["stop"]),
5930
6002
  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) => {
6003
+ onPointerleave: _cache[17] || (_cache[17] = ($event) => hoveredSortKey.value = null)
6004
+ }, [(0, vue.createElementVNode)("span", _hoisted_71, (0, vue.toDisplayString)(sortIconName(key)), 1)], 42, _hoisted_70)) : (0, vue.createCommentVNode)("", true)])], 8, _hoisted_67);
6005
+ }), 128))])]), (0, vue.createElementVNode)("tbody", _hoisted_72, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(sortedItems.value, (item) => {
5934
6006
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("tr", {
5935
6007
  key: String(item[collection.value.schema.primaryKey] ?? ""),
5936
6008
  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 +6024,9 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5952
6024
  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
6025
  "data-testid": `collections-inline-toggle-${key}-${item[collection.value.schema.primaryKey]}`,
5954
6026
  "aria-label": field.label,
5955
- onClick: _cache[17] || (_cache[17] = (0, vue.withModifiers)(() => {}, ["stop"])),
6027
+ onClick: _cache[18] || (_cache[18] = (0, vue.withModifiers)(() => {}, ["stop"])),
5956
6028
  onChange: ($event) => commitToggle(item, field)
5957
- }, null, 40, _hoisted_72)) : field.type === "boolean" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("input", {
6029
+ }, null, 40, _hoisted_74)) : field.type === "boolean" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("input", {
5958
6030
  key: 1,
5959
6031
  type: "checkbox",
5960
6032
  checked: item[key] === true,
@@ -5962,15 +6034,15 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5962
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",
5963
6035
  "data-testid": `collections-inline-bool-${key}-${item[collection.value.schema.primaryKey]}`,
5964
6036
  "aria-label": field.label,
5965
- onClick: _cache[18] || (_cache[18] = (0, vue.withModifiers)(() => {}, ["stop"])),
6037
+ onClick: _cache[19] || (_cache[19] = (0, vue.withModifiers)(() => {}, ["stop"])),
5966
6038
  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", {
6039
+ }, null, 40, _hoisted_75)) : field.type === "flag" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", {
5968
6040
  key: 2,
5969
6041
  class: (0, vue.normalizeClass)(["material-icons text-lg align-middle", flagValueOf(String(key), item) ? "text-emerald-600" : "text-slate-300"]),
5970
6042
  "data-testid": `collections-flag-${key}-${item[collection.value.schema.primaryKey]}`,
5971
6043
  "aria-label": `${field.label}: ${(0, vue.unref)(t)(flagValueOf(String(key), item) ? "common.yes" : "common.no")}`,
5972
6044
  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", {
6045
+ }, (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
6046
  href: (0, vue.unref)(cui).recordHref?.(field.to, String(item[key])),
5975
6047
  tabindex: (0, vue.unref)(cui).recordHref?.(field.to, String(item[key])) ? void 0 : 0,
5976
6048
  role: "link",
@@ -5978,48 +6050,48 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
5978
6050
  "data-testid": `collections-ref-link-${key}-${item[key]}`,
5979
6051
  onClick: ($event) => (0, vue.unref)(activateRefLink)($event, field.to, String(item[key]), true),
5980
6052
  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", {
6053
+ }, (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
6054
  key: 4,
5983
6055
  value: item[key] == null ? "" : String(item[key]),
5984
6056
  disabled: isReadOnly.value || isRowInlineSaving(item),
5985
6057
  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
6058
  "data-testid": `collections-inline-enum-${key}-${item[collection.value.schema.primaryKey]}`,
5987
6059
  "aria-label": field.label,
5988
- onClick: _cache[19] || (_cache[19] = (0, vue.withModifiers)(() => {}, ["stop"])),
6060
+ onClick: _cache[20] || (_cache[20] = (0, vue.withModifiers)(() => {}, ["stop"])),
5989
6061
  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) => {
6062
+ }, [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
6063
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("option", {
5992
6064
  key: value,
5993
6065
  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", {
6066
+ }, (0, vue.toDisplayString)(value), 9, _hoisted_81);
6067
+ }), 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
6068
  key: 8,
5997
6069
  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
6070
  "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", {
6071
+ }, (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
6072
  key: 9,
6001
6073
  href: String(item[key]),
6002
6074
  target: "_blank",
6003
6075
  rel: "noopener noreferrer",
6004
6076
  class: "block truncate text-blue-600 hover:text-blue-800 hover:underline font-semibold",
6005
6077
  "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", {
6078
+ onClick: _cache[21] || (_cache[21] = (0, vue.withModifiers)(() => {}, ["stop"]))
6079
+ }, (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
6080
  key: 10,
6009
6081
  href: (0, vue.unref)(artifactUrl)(item[key]) ?? void 0,
6010
6082
  target: "_blank",
6011
6083
  rel: "noopener noreferrer",
6012
6084
  class: "block truncate text-blue-600 hover:text-blue-800 hover:underline font-semibold",
6013
6085
  "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", {
6086
+ onClick: _cache[22] || (_cache[22] = (0, vue.withModifiers)(() => {}, ["stop"]))
6087
+ }, (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
6088
  key: 11,
6017
6089
  href: (0, vue.unref)(fileRoutePath)(item[key]) ?? void 0,
6018
6090
  class: "block truncate text-blue-600 hover:text-blue-800 hover:underline font-semibold",
6019
6091
  "data-testid": `collections-file-link-${key}-${item[collection.value.schema.primaryKey]}`,
6020
6092
  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);
6093
+ }, (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)]);
6094
+ }), 128))], 42, _hoisted_73);
6023
6095
  }), 128))])])]))]),
6024
6096
  collection.value && (viewing.value || editing.value) && !(calendarActive.value && openDay.value) ? ((0, vue.openBlock)(), (0, vue.createBlock)(CollectionRecordModal_default, {
6025
6097
  key: 4,
@@ -6027,7 +6099,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
6027
6099
  }, {
6028
6100
  default: (0, vue.withCtx)(() => [(0, vue.createVNode)(CollectionRecordPanel_default, {
6029
6101
  editing: editing.value,
6030
- "onUpdate:editing": _cache[22] || (_cache[22] = ($event) => editing.value = $event),
6102
+ "onUpdate:editing": _cache[23] || (_cache[23] = ($event) => editing.value = $event),
6031
6103
  collection: collection.value,
6032
6104
  viewing: viewing.value,
6033
6105
  saving: saving.value,
@@ -6047,7 +6119,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
6047
6119
  onCancel: cancelEditor,
6048
6120
  onEdit: editFromView,
6049
6121
  onClose: closeView,
6050
- onDelete: _cache[23] || (_cache[23] = ($event) => viewing.value && confirmDelete(viewing.value)),
6122
+ onDelete: _cache[24] || (_cache[24] = ($event) => viewing.value && confirmDelete(viewing.value)),
6051
6123
  onRunAction: runAction,
6052
6124
  onItemChat
6053
6125
  }, null, 8, [
@@ -6075,7 +6147,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
6075
6147
  action: mutateModal.value.action,
6076
6148
  pending: mutatePending.value,
6077
6149
  error: mutateError.value,
6078
- onClose: _cache[24] || (_cache[24] = ($event) => mutateModal.value = null),
6150
+ onClose: _cache[25] || (_cache[25] = ($event) => mutateModal.value = null),
6079
6151
  onSubmit: submitMutateParams
6080
6152
  }, null, 8, [
6081
6153
  "action",
@@ -6088,7 +6160,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
6088
6160
  title: collection.value.title,
6089
6161
  views: customViews.value,
6090
6162
  onChanged: onViewsChanged,
6091
- onClose: _cache[25] || (_cache[25] = ($event) => configOpen.value = false)
6163
+ onClose: _cache[26] || (_cache[26] = ($event) => configOpen.value = false)
6092
6164
  }, null, 8, [
6093
6165
  "slug",
6094
6166
  "title",
@@ -6103,29 +6175,29 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
6103
6175
  "data-testid": "collections-chat-modal",
6104
6176
  onClick: (0, vue.withModifiers)(closeChat, ["self"]),
6105
6177
  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)]),
6178
+ }, [(0, vue.createElementVNode)("div", _hoisted_90, [
6179
+ (0, vue.createElementVNode)("header", _hoisted_91, [
6180
+ _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)),
6181
+ (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
6182
  (0, vue.createElementVNode)("button", {
6111
6183
  type: "button",
6112
6184
  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
6185
  "aria-label": (0, vue.unref)(t)("common.close"),
6114
6186
  "data-testid": "collections-chat-close",
6115
6187
  onClick: closeChat
6116
- }, [..._cache[54] || (_cache[54] = [(0, vue.createElementVNode)("span", { class: "material-icons text-lg" }, "close", -1)])], 8, _hoisted_93)
6188
+ }, [..._cache[56] || (_cache[56] = [(0, vue.createElementVNode)("span", { class: "material-icons text-lg" }, "close", -1)])], 8, _hoisted_95)
6117
6189
  ]),
6118
- (0, vue.createElementVNode)("div", _hoisted_94, [(0, vue.withDirectives)((0, vue.createElementVNode)("textarea", {
6190
+ (0, vue.createElementVNode)("div", _hoisted_96, [(0, vue.withDirectives)((0, vue.createElementVNode)("textarea", {
6119
6191
  ref_key: "chatInputEl",
6120
6192
  ref: chatInputEl,
6121
- "onUpdate:modelValue": _cache[26] || (_cache[26] = ($event) => chatMessage.value = $event),
6193
+ "onUpdate:modelValue": _cache[27] || (_cache[27] = ($event) => chatMessage.value = $event),
6122
6194
  rows: "4",
6123
6195
  placeholder: (0, vue.unref)(t)("collectionsView.chatPlaceholder"),
6124
6196
  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
6197
  "data-testid": "collections-chat-input",
6126
6198
  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", {
6199
+ }, null, 40, _hoisted_97), [[vue.vModelText, chatMessage.value]])]),
6200
+ (0, vue.createElementVNode)("footer", _hoisted_98, [(0, vue.createElementVNode)("button", {
6129
6201
  type: "button",
6130
6202
  class: "h-8 px-2.5 rounded text-xs font-bold text-slate-500 hover:bg-slate-200/50 transition-colors",
6131
6203
  "data-testid": "collections-chat-cancel",
@@ -6136,7 +6208,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
6136
6208
  disabled: !chatMessage.value.trim(),
6137
6209
  "data-testid": "collections-chat-send",
6138
6210
  onClick: submitChat
6139
- }, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.chatStart")), 9, _hoisted_97)])
6211
+ }, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.chatStart")), 9, _hoisted_99)])
6140
6212
  ])], 32)) : (0, vue.createCommentVNode)("", true)
6141
6213
  ]);
6142
6214
  };