@prolibu-suite/cobalt-core 0.9.3 → 0.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. package/custom-elements.json +375 -25
  2. package/dist/cjs/co-audio-player.cjs.entry.js +107 -18
  3. package/dist/cjs/co-avatar_2.cjs.entry.js +7 -31
  4. package/dist/cjs/co-button.cjs.entry.js +6 -4
  5. package/dist/cjs/co-calendar-month_2.cjs.entry.js +59 -2
  6. package/dist/cjs/co-checkbox.cjs.entry.js +10 -4
  7. package/dist/cjs/co-chip_2.cjs.entry.js +388 -18
  8. package/dist/cjs/co-color-picker.cjs.entry.js +36 -3
  9. package/dist/cjs/co-combobox.cjs.entry.js +44 -4
  10. package/dist/cjs/co-event-popover.cjs.entry.js +5 -2
  11. package/dist/cjs/co-file-field.cjs.entry.js +12 -6
  12. package/dist/cjs/co-icon-button.cjs.entry.js +5 -2
  13. package/dist/cjs/co-icon.cjs.entry.js +17 -1
  14. package/dist/cjs/co-input.cjs.entry.js +21 -1
  15. package/dist/cjs/co-loader.cjs.entry.js +1 -1
  16. package/dist/cjs/co-number-field.cjs.entry.js +22 -2
  17. package/dist/cjs/co-ref-field.cjs.entry.js +99 -13
  18. package/dist/cjs/co-select.cjs.entry.js +273 -8
  19. package/dist/cjs/co-tags-field.cjs.entry.js +1 -1
  20. package/dist/cjs/cobalt.cjs.js +1 -1
  21. package/dist/cjs/color-YhUkm10t.js +32 -0
  22. package/dist/cjs/fieldChip-BLzo9MEV.js +7 -0
  23. package/dist/cjs/index-DK-2Lzmf.js +4 -4
  24. package/dist/cjs/loader.cjs.js +1 -1
  25. package/dist/cobalt/cobalt.esm.js +1 -1
  26. package/dist/cobalt/p-0c463d9a.entry.js +1 -0
  27. package/dist/cobalt/{p-3ced4269.entry.js → p-2828ecf6.entry.js} +1 -1
  28. package/dist/cobalt/p-2f88d151.entry.js +1 -0
  29. package/dist/cobalt/p-409f28bb.entry.js +1 -0
  30. package/dist/cobalt/{p-18af9e44.entry.js → p-568cfe8d.entry.js} +1 -1
  31. package/dist/cobalt/p-6bf814f9.entry.js +1 -0
  32. package/dist/cobalt/p-76420ac1.entry.js +1 -0
  33. package/dist/cobalt/p-7ea87b75.entry.js +1 -0
  34. package/dist/cobalt/p-8b4b3589.entry.js +1 -0
  35. package/dist/cobalt/p-93c68029.entry.js +1 -0
  36. package/dist/cobalt/p-BG4WRR22.js +1 -0
  37. package/dist/cobalt/p-a2d31248.entry.js +1 -0
  38. package/dist/cobalt/p-bcedbd73.entry.js +1 -0
  39. package/dist/cobalt/p-dfd25f1d.entry.js +1 -0
  40. package/dist/cobalt/p-e364b8a5.entry.js +1 -0
  41. package/dist/cobalt/p-e84eda2e.entry.js +1 -0
  42. package/dist/cobalt/p-f25967fb.entry.js +1 -0
  43. package/dist/cobalt/p-f5f1b463.entry.js +1 -0
  44. package/dist/cobalt/p-fef5db54.entry.js +1 -0
  45. package/dist/cobalt/p-mAGnZXRn.js +1 -0
  46. package/dist/collection/components/co-audio-player/co-audio-player.js +81 -17
  47. package/dist/collection/components/co-audio-player/co-audio-player.utils.js +27 -2
  48. package/dist/collection/components/co-autocomplete/co-autocomplete.js +1 -1
  49. package/dist/collection/components/co-avatar/co-avatar.js +5 -1
  50. package/dist/collection/components/co-avatar-group/co-avatar-group.js +1 -1
  51. package/dist/collection/components/co-button/co-button.css +7 -0
  52. package/dist/collection/components/co-button/co-button.js +7 -5
  53. package/dist/collection/components/co-calendar-month/co-calendar-month.js +59 -2
  54. package/dist/collection/components/co-checkbox/co-checkbox.css +22 -0
  55. package/dist/collection/components/co-checkbox/co-checkbox.js +9 -3
  56. package/dist/collection/components/co-checkbox-group/co-checkbox-group.js +1 -1
  57. package/dist/collection/components/co-color-picker/co-color-picker.css +7 -0
  58. package/dist/collection/components/co-color-picker/co-color-picker.js +35 -2
  59. package/dist/collection/components/co-combobox/co-combobox.css +7 -0
  60. package/dist/collection/components/co-combobox/co-combobox.js +44 -4
  61. package/dist/collection/components/co-command-search/co-command-search.js +1 -1
  62. package/dist/collection/components/co-data-table/co-data-table.js +1 -1
  63. package/dist/collection/components/co-date-range-picker/co-date-range-picker.js +2 -2
  64. package/dist/collection/components/co-event-popover/co-event-popover.js +5 -2
  65. package/dist/collection/components/co-file-field/co-file-field.css +2 -0
  66. package/dist/collection/components/co-file-field/co-file-field.js +8 -5
  67. package/dist/collection/components/co-icon/iconLoader.js +17 -1
  68. package/dist/collection/components/co-icon-button/co-icon-button.css +7 -0
  69. package/dist/collection/components/co-icon-button/co-icon-button.js +6 -3
  70. package/dist/collection/components/co-input/co-input.css +13 -0
  71. package/dist/collection/components/co-input/co-input.js +21 -0
  72. package/dist/collection/components/co-loader/co-loader.css +5 -3
  73. package/dist/collection/components/co-number-field/co-number-field.js +23 -2
  74. package/dist/collection/components/co-option-list/co-option-list.css +45 -2
  75. package/dist/collection/components/co-option-list/co-option-list.js +468 -18
  76. package/dist/collection/components/co-option-list/optionListLogic.js +25 -0
  77. package/dist/collection/components/co-popover/co-popover.js +1 -1
  78. package/dist/collection/components/co-radio-group/co-radio-group.js +1 -1
  79. package/dist/collection/components/co-ref-field/co-ref-field.css +49 -0
  80. package/dist/collection/components/co-ref-field/co-ref-field.js +252 -12
  81. package/dist/collection/components/co-segmented-bar/co-segmented-bar.js +1 -1
  82. package/dist/collection/components/co-select/co-select.css +19 -0
  83. package/dist/collection/components/co-select/co-select.js +275 -9
  84. package/dist/collection/components/co-sidebar-nav/co-sidebar-nav.js +1 -1
  85. package/dist/collection/components/co-toast/co-toast.js +2 -2
  86. package/dist/collection/components/co-transfer-list/co-transfer-list.js +1 -1
  87. package/dist/collection/utils/fieldChip.js +1 -1
  88. package/dist/collection/utils/fileI18n.js +3 -0
  89. package/dist/components/co-accordion.js +1 -1
  90. package/dist/components/co-action-bar.js +1 -1
  91. package/dist/components/co-audio-player.js +1 -1
  92. package/dist/components/co-autocomplete.js +1 -1
  93. package/dist/components/co-avatar-group.js +1 -1
  94. package/dist/components/co-avatar.js +1 -1
  95. package/dist/components/co-breadcrumb-item.js +1 -1
  96. package/dist/components/co-breadcrumb.js +1 -1
  97. package/dist/components/co-button.js +1 -1
  98. package/dist/components/co-calendar-month.js +1 -1
  99. package/dist/components/co-calendar-timegrid.js +1 -1
  100. package/dist/components/co-calendar.js +1 -1
  101. package/dist/components/co-carousel.js +1 -1
  102. package/dist/components/co-checkbox-group.js +1 -1
  103. package/dist/components/co-checkbox.js +1 -1
  104. package/dist/components/co-chip.js +1 -1
  105. package/dist/components/co-color-picker.js +1 -1
  106. package/dist/components/co-column-picker.js +1 -1
  107. package/dist/components/co-combobox.js +1 -1
  108. package/dist/components/co-command-search.js +1 -1
  109. package/dist/components/co-data-table-pagination.js +1 -1
  110. package/dist/components/co-data-table.js +1 -1
  111. package/dist/components/co-date-field.js +1 -1
  112. package/dist/components/co-date-picker.js +1 -1
  113. package/dist/components/co-date-range-picker.js +1 -1
  114. package/dist/components/co-date-range.js +1 -1
  115. package/dist/components/co-date-time-picker.js +1 -1
  116. package/dist/components/co-drawer.js +1 -1
  117. package/dist/components/co-drive-card.js +1 -1
  118. package/dist/components/co-drop-zone.js +1 -1
  119. package/dist/components/co-emoji-picker.js +1 -1
  120. package/dist/components/co-empty-state.js +1 -1
  121. package/dist/components/co-event-calendar.js +1 -1
  122. package/dist/components/co-event-popover.js +1 -1
  123. package/dist/components/co-fab.js +1 -1
  124. package/dist/components/co-file-field.js +1 -1
  125. package/dist/components/co-file-type-tile.js +1 -1
  126. package/dist/components/co-helper-text.js +1 -1
  127. package/dist/components/co-icon-button.js +1 -1
  128. package/dist/components/co-icon.js +1 -1
  129. package/dist/components/co-input.js +1 -1
  130. package/dist/components/co-json-field.js +1 -1
  131. package/dist/components/co-lightbox.js +1 -1
  132. package/dist/components/co-list-footer.js +1 -1
  133. package/dist/components/co-list-item.js +1 -1
  134. package/dist/components/co-loader.js +1 -1
  135. package/dist/components/co-menu-item.js +1 -1
  136. package/dist/components/co-modal.js +1 -1
  137. package/dist/components/co-number-field.js +1 -1
  138. package/dist/components/co-option-list.js +1 -1
  139. package/dist/components/co-page-header.js +1 -1
  140. package/dist/components/co-phone-field.js +1 -1
  141. package/dist/components/co-radio-group.js +1 -1
  142. package/dist/components/co-rating.js +1 -1
  143. package/dist/components/co-ref-field.js +1 -1
  144. package/dist/components/co-rich-text-editor.js +1 -1
  145. package/dist/components/co-rich-text-toolbar.js +1 -1
  146. package/dist/components/co-select.js +1 -1
  147. package/dist/components/co-sidebar-nav.js +1 -1
  148. package/dist/components/co-slider.js +1 -1
  149. package/dist/components/co-switch.js +1 -1
  150. package/dist/components/co-tab.js +1 -1
  151. package/dist/components/co-tags-field.js +1 -1
  152. package/dist/components/co-textarea.js +1 -1
  153. package/dist/components/co-toast.js +1 -1
  154. package/dist/components/co-toggle-button.js +1 -1
  155. package/dist/components/co-transfer-list.js +1 -1
  156. package/dist/components/co-video.js +1 -1
  157. package/dist/components/{p-CklsvHeL.js → p-B0Dc-I_C.js} +1 -1
  158. package/dist/components/{p-DzoNGEDU.js → p-BH184F0X.js} +1 -1
  159. package/dist/components/{p-BGD3oQ73.js → p-BHYtxTzM.js} +1 -1
  160. package/dist/components/{p-mom5kiBa.js → p-BTQEg3UO.js} +1 -1
  161. package/dist/components/p-BZIB4JDs.js +1 -0
  162. package/dist/components/p-Bbny3WUc.js +1 -0
  163. package/dist/components/{p-D5QJpmqf.js → p-Bxk96Zgc.js} +1 -1
  164. package/dist/components/p-C1Kv3zYZ.js +1 -0
  165. package/dist/components/p-C4U2tbRp.js +1 -0
  166. package/dist/components/{p-CyMaOb1j.js → p-CA_JAK9s.js} +1 -1
  167. package/dist/components/{p-AvSaw4Ua.js → p-CR0izsJC.js} +1 -1
  168. package/dist/components/p-CuZXTvDM.js +1 -0
  169. package/dist/components/{p-_131DL6m.js → p-D4qzGifz.js} +1 -1
  170. package/dist/components/{p-BsQQ7Mki.js → p-D5EdMieb.js} +1 -1
  171. package/dist/components/p-Dabi98BI.js +1 -0
  172. package/dist/components/p-DbipMAyT.js +1 -0
  173. package/dist/components/p-DgUBcJIS.js +1 -0
  174. package/dist/components/p-Dj1EZ5qD.js +1 -0
  175. package/dist/components/{p-DkmKOF60.js → p-P8wvwhM2.js} +1 -1
  176. package/dist/components/{p-nwy6X1QT.js → p-hfGFsvaD.js} +1 -1
  177. package/dist/esm/co-audio-player.entry.js +107 -18
  178. package/dist/esm/co-avatar_2.entry.js +6 -30
  179. package/dist/esm/co-button.entry.js +6 -4
  180. package/dist/esm/co-calendar-month_2.entry.js +59 -2
  181. package/dist/esm/co-checkbox.entry.js +10 -4
  182. package/dist/esm/co-chip_2.entry.js +388 -18
  183. package/dist/esm/co-color-picker.entry.js +36 -3
  184. package/dist/esm/co-combobox.entry.js +44 -4
  185. package/dist/esm/co-event-popover.entry.js +5 -2
  186. package/dist/esm/co-file-field.entry.js +12 -6
  187. package/dist/esm/co-icon-button.entry.js +5 -2
  188. package/dist/esm/co-icon.entry.js +17 -1
  189. package/dist/esm/co-input.entry.js +21 -1
  190. package/dist/esm/co-loader.entry.js +1 -1
  191. package/dist/esm/co-number-field.entry.js +22 -2
  192. package/dist/esm/co-ref-field.entry.js +99 -13
  193. package/dist/esm/co-select.entry.js +273 -8
  194. package/dist/esm/co-tags-field.entry.js +1 -1
  195. package/dist/esm/cobalt.js +1 -1
  196. package/dist/esm/color-BG4WRR22.js +30 -0
  197. package/dist/esm/fieldChip-DsAfq1e0.js +5 -0
  198. package/dist/esm/index-CrtiywTB.js +4 -4
  199. package/dist/esm/loader.js +1 -1
  200. package/dist/types/components/co-audio-player/co-audio-player.d.ts +13 -0
  201. package/dist/types/components/co-audio-player/co-audio-player.utils.d.ts +18 -1
  202. package/dist/types/components/co-button/co-button.d.ts +3 -1
  203. package/dist/types/components/co-calendar-month/co-calendar-month.d.ts +7 -0
  204. package/dist/types/components/co-checkbox/co-checkbox.d.ts +1 -0
  205. package/dist/types/components/co-color-picker/co-color-picker.d.ts +15 -0
  206. package/dist/types/components/co-combobox/co-combobox.d.ts +17 -0
  207. package/dist/types/components/co-icon-button/co-icon-button.d.ts +3 -0
  208. package/dist/types/components/co-input/co-input.d.ts +9 -0
  209. package/dist/types/components/co-number-field/co-number-field.d.ts +9 -0
  210. package/dist/types/components/co-option-list/co-option-list.d.ts +79 -0
  211. package/dist/types/components/co-option-list/optionListLogic.d.ts +23 -1
  212. package/dist/types/components/co-ref-field/co-ref-field.d.ts +46 -0
  213. package/dist/types/components/co-select/co-select.d.ts +67 -0
  214. package/dist/types/components.d.ts +110 -4
  215. package/dist/types/utils/fieldChip.d.ts +5 -0
  216. package/dist/types/utils/fileI18n.d.ts +1 -0
  217. package/package.json +4 -4
  218. package/dist/cjs/fieldChip-xNJPEFcS.js +0 -7
  219. package/dist/cobalt/p-02ac492f.entry.js +0 -1
  220. package/dist/cobalt/p-0ccb672b.entry.js +0 -1
  221. package/dist/cobalt/p-2d81b292.entry.js +0 -1
  222. package/dist/cobalt/p-4a503187.entry.js +0 -1
  223. package/dist/cobalt/p-55566b37.entry.js +0 -1
  224. package/dist/cobalt/p-680d3db8.entry.js +0 -1
  225. package/dist/cobalt/p-7457aa89.entry.js +0 -1
  226. package/dist/cobalt/p-77719335.entry.js +0 -1
  227. package/dist/cobalt/p-8f600512.entry.js +0 -1
  228. package/dist/cobalt/p-CQAYgqA6.js +0 -1
  229. package/dist/cobalt/p-a02db338.entry.js +0 -1
  230. package/dist/cobalt/p-a51d8775.entry.js +0 -1
  231. package/dist/cobalt/p-aafb9d11.entry.js +0 -1
  232. package/dist/cobalt/p-b28dc0fe.entry.js +0 -1
  233. package/dist/cobalt/p-c6b9b9d6.entry.js +0 -1
  234. package/dist/cobalt/p-d4debd6f.entry.js +0 -1
  235. package/dist/cobalt/p-d629fb4e.entry.js +0 -1
  236. package/dist/components/p-B3TkpLNh.js +0 -1
  237. package/dist/components/p-B7hvddnu.js +0 -1
  238. package/dist/components/p-BT5tSgZa.js +0 -1
  239. package/dist/components/p-CXLX8DpD.js +0 -1
  240. package/dist/components/p-DTvb412h.js +0 -1
  241. package/dist/components/p-DvhR3H61.js +0 -1
  242. package/dist/components/p-KWTokD0C.js +0 -1
  243. package/dist/components/p-Q6caHt79.js +0 -1
  244. package/dist/components/p-WWlZiln1.js +0 -1
  245. package/dist/esm/fieldChip-BZDUy9Z-.js +0 -5
@@ -70,6 +70,17 @@ export function buildRows(items) {
70
70
  }
71
71
  /** Mueve `fromId` a la posición de `toId` en `order`. No muta el input;
72
72
  * devuelve el mismo array (referencia) si es no-op. */
73
+ /**
74
+ * Universo del drag del bloque seleccionado: los ids seleccionados VIVOS en su
75
+ * orden visible. A diferencia del snapshot (congelado al abrir), incluye lo
76
+ * seleccionado durante la sesión del panel — sin esto, esos ítems renderizan
77
+ * handle pero el drop los rechaza, y un reorder del snapshot emitiría un value
78
+ * truncado (pierde las selecciones frescas).
79
+ */
80
+ export function liveSelectedOrder(items, selectedIds) {
81
+ const sel = new Set(selectedIds);
82
+ return items.filter((i) => sel.has(i._id)).map((i) => i._id);
83
+ }
73
84
  export function reorderIds(order, fromId, toId) {
74
85
  if (fromId === toId)
75
86
  return order;
@@ -81,6 +92,13 @@ export function reorderIds(order, fromId, toId) {
81
92
  next.splice(to, 0, next.splice(from, 1)[0]);
82
93
  return next;
83
94
  }
95
+ /** Reorder de lista completa: los extremos pineados son inválidos (ni origen ni
96
+ * destino) — devuelve la misma referencia, señal de no-op para el caller. */
97
+ export function listReorderIds(order, fromId, toId, isPinned) {
98
+ if (isPinned(fromId) || isPinned(toId))
99
+ return order;
100
+ return reorderIds(order, fromId, toId);
101
+ }
84
102
  /** Siguiente highlight: wrap, salta disabled. -1 = sin items navegables. */
85
103
  export function nextActiveIndex(current, delta, items) {
86
104
  const positions = [];
@@ -95,6 +113,13 @@ export function nextActiveIndex(current, delta, items) {
95
113
  return delta === 1 ? positions[0] : positions[positions.length - 1];
96
114
  return positions[(at + delta + positions.length) % positions.length];
97
115
  }
116
+ /** Highlight inicial de la sesión del panel: primera fila seleccionada
117
+ * NAVEGABLE en orden visible (contrato de scrollToSelected, paridad
118
+ * resetActiveIndex de co-select). -1 = nada que anclar. */
119
+ export function selectedActiveIndex(items, selectedIds) {
120
+ const sel = new Set(selectedIds);
121
+ return items.findIndex((it) => sel.has(it._id) && !it.disabled);
122
+ }
98
123
  /** `total > 0` tiene precedencia (deriva remaining); si no, vale `hasMoreProp`. */
99
124
  export function deriveMore(count, total, hasMoreProp) {
100
125
  if (total > 0)
@@ -322,7 +322,7 @@ export class CoPopover {
322
322
  "references": {
323
323
  "PopoverPlacement": {
324
324
  "location": "local",
325
- "path": "/Users/agox/worktrees/cobalt-release-093/packages/core/src/components/co-popover/co-popover.tsx",
325
+ "path": "/Users/agox/worktrees/cobalt-rel-095/packages/core/src/components/co-popover/co-popover.tsx",
326
326
  "id": "src/components/co-popover/co-popover.tsx::PopoverPlacement"
327
327
  }
328
328
  }
@@ -219,7 +219,7 @@ export class CoRadioGroup {
219
219
  "references": {
220
220
  "RadioOption": {
221
221
  "location": "local",
222
- "path": "/Users/agox/worktrees/cobalt-release-093/packages/core/src/components/co-radio-group/co-radio-group.tsx",
222
+ "path": "/Users/agox/worktrees/cobalt-rel-095/packages/core/src/components/co-radio-group/co-radio-group.tsx",
223
223
  "id": "src/components/co-radio-group/co-radio-group.tsx::RadioOption"
224
224
  }
225
225
  }
@@ -109,6 +109,14 @@
109
109
  box-shadow: 0 0 0 2px var(--co-semantic-border-focus-ring);
110
110
  }
111
111
 
112
+ /* Anillo de foco por teclado — mismo trazo que el estado abierto. Solo
113
+ :focus-visible: el click de mouse no debe encenderlo. */
114
+ .co-ref-field__trigger:focus-visible {
115
+ outline: none;
116
+ border-color: var(--co-semantic-border-focus);
117
+ box-shadow: 0 0 0 2px var(--co-semantic-border-focus-ring);
118
+ }
119
+
112
120
  .co-ref-field--disabled {
113
121
  background: var(--co-semantic-surface-disabled);
114
122
  border-color: transparent;
@@ -194,6 +202,23 @@
194
202
  color: var(--co-semantic-text-default);
195
203
  }
196
204
 
205
+ .co-ref-field__edit {
206
+ flex-shrink: 0;
207
+ display: flex;
208
+ align-items: center;
209
+ padding: 0;
210
+ margin: 0;
211
+ border: none;
212
+ background: transparent;
213
+ cursor: pointer;
214
+ color: var(--co-semantic-text-muted);
215
+ transition: color var(--co-motion-duration-fast) var(--co-motion-ease-out);
216
+ }
217
+
218
+ .co-ref-field__edit:hover {
219
+ color: var(--co-semantic-text-default);
220
+ }
221
+
197
222
  /* ── Selected single value ──────────────────────────────── */
198
223
  .co-ref-field__selected {
199
224
  display: flex;
@@ -299,6 +324,30 @@
299
324
  flex-shrink: 0;
300
325
  }
301
326
 
327
+ /* colorMode='fill': the item color is the chip background (inline style);
328
+ label + remove flip to WCAG-contrast ink. Dot-less, so keep the dot chips'
329
+ min-height via the size modifiers (unchanged). Radius 6px = co-chip square
330
+ (the tag chip spec) — NOT the neutral chips' full pill. */
331
+ .co-ref-field__chip--fill {
332
+ color: var(--co-color-base-blanco);
333
+ border-radius: var(--co-spacing-sm);
334
+ }
335
+ .co-ref-field__chip--fill-light { color: var(--co-color-base-negro); }
336
+
337
+ .co-ref-field__chip--fill .co-ref-field__chip-label,
338
+ .co-ref-field__chip--fill .co-ref-field__chip-remove {
339
+ color: inherit;
340
+ }
341
+
342
+ .co-ref-field__chip--fill .co-ref-field__chip-remove {
343
+ opacity: 0.72;
344
+ }
345
+
346
+ .co-ref-field__chip--fill .co-ref-field__chip-remove:hover {
347
+ color: inherit;
348
+ opacity: 1;
349
+ }
350
+
302
351
  .co-ref-field__chip-label {
303
352
  color: var(--co-semantic-text-default);
304
353
  white-space: nowrap;
@@ -1,6 +1,7 @@
1
1
  import { h } from "@stencil/core";
2
2
  import { RequiredMark } from "../../utils/requiredMark";
3
3
  import { FieldChip } from "../../utils/fieldChip";
4
+ import { isLightColor } from "../../utils/color";
4
5
  export class CoRefField {
5
6
  constructor() {
6
7
  /** Whether the field is required (renders a required marker on the label). */
@@ -8,6 +9,12 @@ export class CoRefField {
8
9
  this.placeholder = 'Select…';
9
10
  this.disabled = false;
10
11
  this.clearable = true;
12
+ /** Shows a pencil button on the single-value trigger that emits
13
+ * `coEditSelected` with the selected record id. The host owns policy
14
+ * (permissions, what opens) — the component only paints and emits. */
15
+ this.editable = false;
16
+ /** Accessible name / tooltip for the edit button. */
17
+ this.editLabel = 'Edit';
11
18
  this.multiple = false;
12
19
  this.status = 'default';
13
20
  /** Label layout: vertical (label above) or horizontal (label beside) */
@@ -56,6 +63,13 @@ export class CoRefField {
56
63
  this.maxChips = 0;
57
64
  /** Panel color theme. 'auto' follows trigger, 'dark' forces dark panel, 'light' forces light. */
58
65
  this.panelTheme = 'auto';
66
+ /**
67
+ * How `item.color` paints the selected chips (multiple mode).
68
+ * 'dot' (default) = neutral chip with a leading 8px color dot.
69
+ * 'fill' = the color becomes the chip BACKGROUND (label/remove switch to
70
+ * WCAG-contrast text) — the tag look. Avatar/image items keep the avatar.
71
+ */
72
+ this.colorMode = 'dot';
59
73
  /**
60
74
  * Phosphor icon rendered as a small status badge after the selected label in
61
75
  * the trigger (e.g. 'funnel' = strict workspace filter active). Only shows
@@ -71,6 +85,10 @@ export class CoRefField {
71
85
  * a smooth squircle. The avatar border can be themed via --co-avatar-border-color.
72
86
  */
73
87
  this.avatarShape = 'circle';
88
+ /** Push-pin por fila en el panel (forward a co-option-list). */
89
+ this.pinnable = false;
90
+ /** Drag-reorder de la lista del panel (forward a co-option-list). */
91
+ this.listReorderable = false;
74
92
  this.isOpen = false;
75
93
  /** How many trailing chips don't fit the trigger width (responsive mode). */
76
94
  this.overflowCount = 0;
@@ -87,6 +105,24 @@ export class CoRefField {
87
105
  if (this.disabled)
88
106
  e.stopPropagation();
89
107
  };
108
+ this.handleTriggerKeyDown = (e) => {
109
+ if (this.disabled)
110
+ return;
111
+ // Solo las teclas del PROPIO trigger togglean el panel. Los botones
112
+ // internos (clear, "x" de los chips) llevan tabIndex={-1} pero quedan
113
+ // focuseados al clickearlos: su Enter/Space debe activarlos de forma
114
+ // nativa, no abrir/cerrar el panel bajo ellos.
115
+ if (e.target !== this.triggerEl)
116
+ return;
117
+ if (e.key === 'Enter' || e.key === ' ') {
118
+ e.preventDefault();
119
+ this.isOpen = !this.isOpen;
120
+ }
121
+ else if (e.key === 'ArrowDown' && !this.isOpen) {
122
+ e.preventDefault();
123
+ this.isOpen = true;
124
+ }
125
+ };
90
126
  /** Change de la co-option-list: `value: null` = deselección explícita (la X
91
127
  * de la fila) → mismo camino que la X del trigger (clear + coClear). El
92
128
  * resto sigue por handleOptionClick con el ítem. */
@@ -129,11 +165,29 @@ export class CoRefField {
129
165
  this.value = this.multiple ? '[]' : '';
130
166
  this.coClear.emit();
131
167
  };
168
+ this.handleEditClick = (e) => {
169
+ e.stopPropagation();
170
+ const selected = this.effectiveDisplayItems[0];
171
+ if (selected)
172
+ this.coEditSelected.emit(selected._id);
173
+ };
132
174
  this.handleRemoveChip = (id, e) => {
175
+ var _a;
133
176
  e.stopPropagation();
177
+ // `?? {_id, label:id}`: el chip quitado SIEMPRE está en la lista que los
178
+ // pinta, pero `find` es `T | undefined` para el compilador — y un item
179
+ // con el id crudo es mejor payload que romper el tipo del evento.
180
+ const removed = (_a = this.effectiveDisplayItems.find((o) => o._id === id)) !== null && _a !== void 0 ? _a : { _id: id, label: id };
134
181
  const newValue = this.parsedValue.filter((v) => v !== id);
135
182
  this.value = JSON.stringify(newValue);
136
183
  this.coRemove.emit(id);
184
+ // …y TAMBIÉN por el contrato normal de cambio. `coRemove` sólo lleva el id
185
+ // quitado, así que un host que escuche el evento estándar (lo natural: es
186
+ // el mismo cambio de selección que un deselect del panel, que sí emite
187
+ // coChange) no se enteraba: el chip desaparecía de la pantalla y el modelo
188
+ // del host quedaba intacto. Emitir ambos mantiene la compatibilidad de
189
+ // `coRemove` y quita la trampa.
190
+ this.coChange.emit({ value: newValue, item: removed });
137
191
  };
138
192
  this.handleFooterPrimary = () => {
139
193
  this.coFooterPrimary.emit();
@@ -281,6 +335,17 @@ export class CoRefField {
281
335
  }
282
336
  else {
283
337
  this.coClose.emit();
338
+ this.restoreTriggerFocus();
339
+ }
340
+ }
341
+ /** Devuelve el foco al trigger al cerrar el panel (Escape, selección),
342
+ * salvo que el cierre venga de un click-outside que ya movió el foco a
343
+ * otro elemento — en ese caso no robarlo. */
344
+ restoreTriggerFocus() {
345
+ var _a;
346
+ const active = document.activeElement;
347
+ if (active === this.el || this.el.contains(active)) {
348
+ (_a = this.triggerEl) === null || _a === void 0 ? void 0 : _a.focus();
284
349
  }
285
350
  }
286
351
  // ── Render helpers ─────────────────────────────────────────
@@ -294,7 +359,7 @@ export class CoRefField {
294
359
  [`co-ref-field--${this.normalizedSize}`]: true,
295
360
  [`co-ref-field--${this.status}`]: this.status !== 'default',
296
361
  'co-ref-field--flat': this.variant === 'flat',
297
- }, onClick: this.handleTriggerClick }, this.iconLeft && (h("span", { class: "co-ref-field__icon" }, h("co-icon", { name: this.iconLeft, size: 16 }))), h("div", { class: "co-ref-field__value" }, !hasValue && h("span", { class: "co-ref-field__placeholder", part: "trigger-placeholder" }, this.placeholder), hasValue && !this.multiple && this.renderSingleValue(selected[0]), hasValue && this.multiple && this.renderMultipleValue(selected)), hasValue && this.triggerBadgeIcon && (h("span", { class: "co-ref-field__trigger-badge", part: "trigger-badge", role: "img", title: this.triggerBadgeLabel || undefined, "aria-label": this.triggerBadgeLabel || undefined }, h("co-icon", { name: this.triggerBadgeIcon, size: 11, weight: "fill" }))), hasValue && this.clearable && !this.disabled && (h("button", { class: "co-ref-field__clear", part: "trigger-clear", onClick: this.handleClear, type: "button" }, h("co-icon", { name: "x", size: 14 }))), h("span", { class: "co-ref-field__caret", part: "trigger-chevron" }, h("co-icon", { name: "caret-up-down", size: 16 }))));
362
+ }, role: "combobox", "aria-expanded": this.isOpen ? 'true' : 'false', "aria-haspopup": "listbox", "aria-label": this.label || undefined, "aria-disabled": this.disabled ? 'true' : undefined, "aria-controls": this.isOpen ? CoRefField.LIST_ID : undefined, tabIndex: this.disabled ? -1 : 0, ref: (el) => (this.triggerEl = el), onClick: this.handleTriggerClick, onKeyDown: this.handleTriggerKeyDown }, this.iconLeft && (h("span", { class: "co-ref-field__icon" }, h("co-icon", { name: this.iconLeft, size: 16 }))), h("div", { class: "co-ref-field__value" }, !hasValue && h("span", { class: "co-ref-field__placeholder", part: "trigger-placeholder" }, this.placeholder), hasValue && !this.multiple && this.renderSingleValue(selected[0]), hasValue && this.multiple && this.renderMultipleValue(selected)), hasValue && this.triggerBadgeIcon && (h("span", { class: "co-ref-field__trigger-badge", part: "trigger-badge", role: "img", title: this.triggerBadgeLabel || undefined, "aria-label": this.triggerBadgeLabel || undefined }, h("co-icon", { name: this.triggerBadgeIcon, size: 11, weight: "fill" }))), hasValue && !this.multiple && this.editable && !this.disabled && (h("button", { class: "co-ref-field__edit", part: "trigger-edit", tabIndex: -1, onClick: this.handleEditClick, type: "button", title: this.editLabel || undefined, "aria-label": this.editLabel || undefined }, h("co-icon", { name: "pencil-simple", size: 14 }))), hasValue && this.clearable && !this.disabled && (h("button", { class: "co-ref-field__clear", part: "trigger-clear", tabIndex: -1, onClick: this.handleClear, type: "button" }, h("co-icon", { name: "x", size: 14 }))), h("span", { class: "co-ref-field__caret", part: "trigger-chevron" }, h("co-icon", { name: "caret-up-down", size: 16 }))));
298
363
  }
299
364
  /**
300
365
  * Leading visual for a selected value / chip. Prefers a real avatar (image
@@ -327,25 +392,32 @@ export class CoRefField {
327
392
  const visible = fixed ? items.slice(0, this.maxChips) : items;
328
393
  const overflow = fixed ? items.length - this.maxChips : responsiveOverflow;
329
394
  const visibleCount = items.length - (fixed ? 0 : responsiveOverflow);
330
- return (h("div", { class: "co-ref-field__chips-row" }, h("div", { class: "co-ref-field__chips", ref: (el) => (this.chipsEl = el) }, visible.map((item, i) => (
331
- // Shared field-chip (utils/fieldChip.tsx); the leading avatar /
332
- // color-dot goes in as children, the "+N" overflow stays here.
333
- h(FieldChip, { key: item._id, baseClass: "co-ref-field__chip", label: item.label, modifiers: {
334
- 'co-ref-field__chip--avatar': !!(item.image || item.avatar),
335
- 'co-ref-field__chip--clipped': !fixed && i >= visibleCount,
336
- [`co-ref-field__chip--${this.normalizedSize}`]: true,
337
- }, onRemove: (e) => this.handleRemoveChip(item._id, e) }, item.image || item.avatar ? (this.renderItemAvatar(item)) : item.color ? (h("span", { class: "co-ref-field__chip-dot", style: { backgroundColor: item.color } })) : null)))), overflow > 0 && h("span", { class: "co-ref-field__chip-overflow" }, "+", overflow)));
395
+ return (h("div", { class: "co-ref-field__chips-row" }, h("div", { class: "co-ref-field__chips", ref: (el) => (this.chipsEl = el) }, visible.map((item, i) => {
396
+ // 'fill' mode: the item color IS the chip background (tag look);
397
+ // no leading dot, label/remove flip to contrast via CSS `inherit`.
398
+ const fill = this.colorMode === 'fill' && !!item.color && !(item.image || item.avatar);
399
+ return (
400
+ // Shared field-chip (utils/fieldChip.tsx); the leading avatar /
401
+ // color-dot goes in as children, the "+N" overflow stays here.
402
+ h(FieldChip, { key: item._id, baseClass: "co-ref-field__chip", label: item.label, modifiers: {
403
+ 'co-ref-field__chip--avatar': !!(item.image || item.avatar),
404
+ 'co-ref-field__chip--fill': fill,
405
+ 'co-ref-field__chip--fill-light': fill && isLightColor(item.color),
406
+ 'co-ref-field__chip--clipped': !fixed && i >= visibleCount,
407
+ [`co-ref-field__chip--${this.normalizedSize}`]: true,
408
+ }, style: fill ? { backgroundColor: item.color } : undefined, onRemove: (e) => this.handleRemoveChip(item._id, e) }, item.image || item.avatar ? (this.renderItemAvatar(item)) : item.color && !fill ? (h("span", { class: "co-ref-field__chip-dot", style: { backgroundColor: item.color } })) : null));
409
+ })), overflow > 0 && h("span", { class: "co-ref-field__chip-overflow" }, "+", overflow)));
338
410
  }
339
411
  renderPanel() {
340
412
  return (h("div", { class: {
341
413
  'co-ref-field__panel': true,
342
414
  'co-ref-field__panel--dark': this.panelTheme === 'dark',
343
415
  'co-ref-field__panel--light': this.panelTheme === 'light',
344
- }, style: this.panelWidth ? { width: this.panelWidth } : undefined }, h("co-option-list", { ref: (el) => (this.optionListEl = el), items: typeof this.options === 'string' ? this.options : JSON.stringify(this.options), value: this.value, selectedItems: typeof this.selectedDisplay === 'string' ? this.selectedDisplay : JSON.stringify(this.selectedDisplay), multiple: this.multiple, selectedFirst: this.multiple, reorderable: this.multiple, selectedAffordance: "deselect", searchable: this.searchable, searchPlaceholder: this.searchPlaceholder, searchDebounce: this.searchDebounce, loading: this.loading, total: this.total, emptyMessage: this.emptyMessage, avatarShape: this.avatarShape, onCoSearch: (e) => this.coSearch.emit(e.detail), onCoChange: (e) => this.handleListChange(e.detail), onCoReorder: (e) => this.handleReorder(e.detail), onCoLoadMore: () => this.coLoadMore.emit() }, h("slot", { name: "panel-footer", slot: "footer" }), this.showFooter && (h("div", { class: "co-ref-field__footer", slot: "footer" }, this.footerSecondaryLabel && (h("button", { class: "co-ref-field__footer-btn co-ref-field__footer-btn--secondary", type: "button", onClick: this.handleFooterSecondary }, h("co-icon", { name: "plus", size: 16 }), h("span", null, this.footerSecondaryLabel))), h("button", { class: "co-ref-field__footer-btn co-ref-field__footer-btn--primary", type: "button", onClick: this.handleFooterPrimary }, h("co-icon", { name: "check", size: 16 }), h("span", null, this.footerPrimaryLabel)))))));
416
+ }, style: this.panelWidth ? { width: this.panelWidth } : undefined }, h("co-option-list", { id: CoRefField.LIST_ID, ref: (el) => (this.optionListEl = el), items: typeof this.options === 'string' ? this.options : JSON.stringify(this.options), value: this.value, selectedItems: typeof this.selectedDisplay === 'string' ? this.selectedDisplay : JSON.stringify(this.selectedDisplay), multiple: this.multiple, selectedFirst: this.multiple, reorderable: this.multiple, pinnable: this.pinnable, listReorderable: this.listReorderable, selectedAffordance: "deselect", searchable: this.searchable, searchPlaceholder: this.searchPlaceholder, searchDebounce: this.searchDebounce, loading: this.loading, total: this.total, emptyMessage: this.emptyMessage, avatarShape: this.avatarShape, onCoSearch: (e) => this.coSearch.emit(e.detail), onCoChange: (e) => this.handleListChange(e.detail), onCoReorder: (e) => this.handleReorder(e.detail), onCoPinToggle: (e) => this.coPinToggle.emit(e.detail), onCoListReorder: (e) => this.coListReorder.emit(e.detail), onCoLoadMore: () => this.coLoadMore.emit() }, h("slot", { name: "panel-footer", slot: "footer" }), this.showFooter && (h("div", { class: "co-ref-field__footer", slot: "footer" }, this.footerSecondaryLabel && (h("button", { class: "co-ref-field__footer-btn co-ref-field__footer-btn--secondary", type: "button", onClick: this.handleFooterSecondary }, h("co-icon", { name: "plus", size: 16 }), h("span", null, this.footerSecondaryLabel))), h("button", { class: "co-ref-field__footer-btn co-ref-field__footer-btn--primary", type: "button", onClick: this.handleFooterPrimary }, h("co-icon", { name: "check", size: 16 }), h("span", null, this.footerPrimaryLabel)))))));
345
417
  }
346
418
  // ── Main render ────────────────────────────────────────────
347
419
  render() {
348
- return (h("div", { key: '2947ab90a0811a53bc77263f96f13da30a2ed975', class: "co-ref-field" }, (this.label || this.secondaryLabel) && (h("div", { key: '5e16afd2e37e56191e019cdf4be27aea292836eb', class: "co-ref-field__labels" }, this.label && (h("label", { key: '28b97b7f577fa1a1ea2c2c9a8bbd31aa9915ef7f', class: "co-ref-field__label" }, this.labelIcon && (h("co-icon", { key: 'a02fdfc4ebd37c6b7fe1ff84788fb5b94b11c5bf', class: "co-ref-field__label-icon", name: this.labelIcon, size: 16 })), this.label, h(RequiredMark, { key: '933bb1d1d78894a9d127d0666f184a470bbe621f', required: this.required }))), this.secondaryLabel && (h("span", { key: 'cfe226e11e1cafb1187a90c4bba8abfe2318a9ca', class: "co-ref-field__secondary-label" }, this.secondaryLabel)))), h("co-popover", { key: 'd6fb3e669735e53c4b01269a69c018d703761758', open: this.isOpen, placement: "bottom-start", matchWidth: !this.panelWidth, offset: 4, onCoOpen: this.handlePopoverOpen, onCoClose: this.handlePopoverClose }, h("div", { key: '7f80d30580f77a23b38f85a4771b6fb1170f6791', slot: "trigger" }, this.renderTrigger()), this.isOpen && this.renderPanel()), this.helperText && (h("div", { key: '9ed05c93faee76f9d4ff18f41f8ae1e8ce60a734', class: `co-ref-field__helper co-ref-field__helper--${this.status}` }, this.status !== 'default' && (h("co-icon", { key: 'ffcb659c5dd52bc6f8b14ca982d0cba5f4089529', name: this.status === 'error' ? 'warning-circle' : this.status === 'success' ? 'check-circle' : 'info', size: 14 })), h("span", { key: 'ab0f53e7e2ade7d635389767b0b31d89844697ae' }, this.helperText)))));
420
+ return (h("div", { key: '8904995ce46d0552556775029316fa42c0d1261e', class: "co-ref-field" }, (this.label || this.secondaryLabel) && (h("div", { key: 'a3b1d77f18f04b0233d5cf9c5b18c484b60d06e4', class: "co-ref-field__labels" }, this.label && (h("label", { key: '837c1f52807a6b258874d4984fdd3aafd48737ed', class: "co-ref-field__label" }, this.labelIcon && (h("co-icon", { key: 'c9e74495eac50df1f9f074f3a25b3be7bcf36d1c', class: "co-ref-field__label-icon", name: this.labelIcon, size: 16 })), this.label, h(RequiredMark, { key: '49a4366d6fc20c7ddbad31d020a1d45ea4134554', required: this.required }))), this.secondaryLabel && (h("span", { key: '4f9dd9e68d79642cfafd16a71e51747599668f9e', class: "co-ref-field__secondary-label" }, this.secondaryLabel)))), h("co-popover", { key: '91ad529d27a62ccbcb8acac7f23cee7ac2ca33ce', open: this.isOpen, placement: "bottom-start", matchWidth: !this.panelWidth, offset: 4, onCoOpen: this.handlePopoverOpen, onCoClose: this.handlePopoverClose }, h("div", { key: '809b6f7e0f64ffd7c6151c1fae340114f5887e72', slot: "trigger" }, this.renderTrigger()), this.isOpen && this.renderPanel()), this.helperText && (h("div", { key: '4089f6e3cd993ce620742d619282d12542e87057', class: `co-ref-field__helper co-ref-field__helper--${this.status}` }, this.status !== 'default' && (h("co-icon", { key: '3d9e658ba0cc04034778911930837f1268afeedd', name: this.status === 'error' ? 'warning-circle' : this.status === 'success' ? 'check-circle' : 'info', size: 14 })), h("span", { key: '8c26be0575794b6f8b410f1fd0b71efd715d5324' }, this.helperText)))));
349
421
  }
350
422
  static get is() { return "co-ref-field"; }
351
423
  static get encapsulation() { return "shadow"; }
@@ -498,6 +570,46 @@ export class CoRefField {
498
570
  "attribute": "clearable",
499
571
  "defaultValue": "true"
500
572
  },
573
+ "editable": {
574
+ "type": "boolean",
575
+ "mutable": false,
576
+ "complexType": {
577
+ "original": "boolean",
578
+ "resolved": "boolean",
579
+ "references": {}
580
+ },
581
+ "required": false,
582
+ "optional": false,
583
+ "docs": {
584
+ "tags": [],
585
+ "text": "Shows a pencil button on the single-value trigger that emits\n`coEditSelected` with the selected record id. The host owns policy\n(permissions, what opens) \u2014 the component only paints and emits."
586
+ },
587
+ "getter": false,
588
+ "setter": false,
589
+ "reflect": false,
590
+ "attribute": "editable",
591
+ "defaultValue": "false"
592
+ },
593
+ "editLabel": {
594
+ "type": "string",
595
+ "mutable": false,
596
+ "complexType": {
597
+ "original": "string",
598
+ "resolved": "string",
599
+ "references": {}
600
+ },
601
+ "required": false,
602
+ "optional": false,
603
+ "docs": {
604
+ "tags": [],
605
+ "text": "Accessible name / tooltip for the edit button."
606
+ },
607
+ "getter": false,
608
+ "setter": false,
609
+ "reflect": false,
610
+ "attribute": "edit-label",
611
+ "defaultValue": "'Edit'"
612
+ },
501
613
  "multiple": {
502
614
  "type": "boolean",
503
615
  "mutable": false,
@@ -916,6 +1028,26 @@ export class CoRefField {
916
1028
  "attribute": "panel-theme",
917
1029
  "defaultValue": "'auto'"
918
1030
  },
1031
+ "colorMode": {
1032
+ "type": "string",
1033
+ "mutable": false,
1034
+ "complexType": {
1035
+ "original": "'dot' | 'fill'",
1036
+ "resolved": "\"dot\" | \"fill\"",
1037
+ "references": {}
1038
+ },
1039
+ "required": false,
1040
+ "optional": false,
1041
+ "docs": {
1042
+ "tags": [],
1043
+ "text": "How `item.color` paints the selected chips (multiple mode).\n'dot' (default) = neutral chip with a leading 8px color dot.\n'fill' = the color becomes the chip BACKGROUND (label/remove switch to\nWCAG-contrast text) \u2014 the tag look. Avatar/image items keep the avatar."
1044
+ },
1045
+ "getter": false,
1046
+ "setter": false,
1047
+ "reflect": false,
1048
+ "attribute": "color-mode",
1049
+ "defaultValue": "'dot'"
1050
+ },
919
1051
  "triggerBadgeIcon": {
920
1052
  "type": "string",
921
1053
  "mutable": false,
@@ -994,6 +1126,46 @@ export class CoRefField {
994
1126
  "reflect": false,
995
1127
  "attribute": "avatar-shape",
996
1128
  "defaultValue": "'circle'"
1129
+ },
1130
+ "pinnable": {
1131
+ "type": "boolean",
1132
+ "mutable": false,
1133
+ "complexType": {
1134
+ "original": "boolean",
1135
+ "resolved": "boolean",
1136
+ "references": {}
1137
+ },
1138
+ "required": false,
1139
+ "optional": false,
1140
+ "docs": {
1141
+ "tags": [],
1142
+ "text": "Push-pin por fila en el panel (forward a co-option-list)."
1143
+ },
1144
+ "getter": false,
1145
+ "setter": false,
1146
+ "reflect": false,
1147
+ "attribute": "pinnable",
1148
+ "defaultValue": "false"
1149
+ },
1150
+ "listReorderable": {
1151
+ "type": "boolean",
1152
+ "mutable": false,
1153
+ "complexType": {
1154
+ "original": "boolean",
1155
+ "resolved": "boolean",
1156
+ "references": {}
1157
+ },
1158
+ "required": false,
1159
+ "optional": false,
1160
+ "docs": {
1161
+ "tags": [],
1162
+ "text": "Drag-reorder de la lista del panel (forward a co-option-list)."
1163
+ },
1164
+ "getter": false,
1165
+ "setter": false,
1166
+ "reflect": false,
1167
+ "attribute": "list-reorderable",
1168
+ "defaultValue": "false"
997
1169
  }
998
1170
  };
999
1171
  }
@@ -1020,7 +1192,7 @@ export class CoRefField {
1020
1192
  "references": {
1021
1193
  "RefFieldOption": {
1022
1194
  "location": "local",
1023
- "path": "/Users/agox/worktrees/cobalt-release-093/packages/core/src/components/co-ref-field/co-ref-field.tsx",
1195
+ "path": "/Users/agox/worktrees/cobalt-rel-095/packages/core/src/components/co-ref-field/co-ref-field.tsx",
1024
1196
  "id": "src/components/co-ref-field/co-ref-field.tsx::RefFieldOption"
1025
1197
  }
1026
1198
  }
@@ -1145,6 +1317,63 @@ export class CoRefField {
1145
1317
  "resolved": "void",
1146
1318
  "references": {}
1147
1319
  }
1320
+ }, {
1321
+ "method": "coPinToggle",
1322
+ "name": "coPinToggle",
1323
+ "bubbles": true,
1324
+ "cancelable": true,
1325
+ "composed": true,
1326
+ "docs": {
1327
+ "tags": [],
1328
+ "text": "Re-emisi\u00F3n del toggle de pin de una fila del panel (pinnable)."
1329
+ },
1330
+ "complexType": {
1331
+ "original": "{ item: RefFieldOption }",
1332
+ "resolved": "{ item: RefFieldOption; }",
1333
+ "references": {
1334
+ "RefFieldOption": {
1335
+ "location": "local",
1336
+ "path": "/Users/agox/worktrees/cobalt-rel-095/packages/core/src/components/co-ref-field/co-ref-field.tsx",
1337
+ "id": "src/components/co-ref-field/co-ref-field.tsx::RefFieldOption"
1338
+ }
1339
+ }
1340
+ }
1341
+ }, {
1342
+ "method": "coListReorder",
1343
+ "name": "coListReorder",
1344
+ "bubbles": true,
1345
+ "cancelable": true,
1346
+ "composed": true,
1347
+ "docs": {
1348
+ "tags": [],
1349
+ "text": "Re-emisi\u00F3n del drag-reorder de la lista del panel (listReorderable)."
1350
+ },
1351
+ "complexType": {
1352
+ "original": "{ value: string[]; item: RefFieldOption }",
1353
+ "resolved": "{ value: string[]; item: RefFieldOption; }",
1354
+ "references": {
1355
+ "RefFieldOption": {
1356
+ "location": "local",
1357
+ "path": "/Users/agox/worktrees/cobalt-rel-095/packages/core/src/components/co-ref-field/co-ref-field.tsx",
1358
+ "id": "src/components/co-ref-field/co-ref-field.tsx::RefFieldOption"
1359
+ }
1360
+ }
1361
+ }
1362
+ }, {
1363
+ "method": "coEditSelected",
1364
+ "name": "coEditSelected",
1365
+ "bubbles": true,
1366
+ "cancelable": true,
1367
+ "composed": true,
1368
+ "docs": {
1369
+ "tags": [],
1370
+ "text": "Pencil click on the single-value trigger. Detail = selected record `_id`."
1371
+ },
1372
+ "complexType": {
1373
+ "original": "string",
1374
+ "resolved": "string",
1375
+ "references": {}
1376
+ }
1148
1377
  }];
1149
1378
  }
1150
1379
  static get elementRef() { return "el"; }
@@ -1155,3 +1384,14 @@ export class CoRefField {
1155
1384
  }];
1156
1385
  }
1157
1386
  }
1387
+ /**
1388
+ * Id del <co-option-list> del panel, target de `aria-controls` del trigger.
1389
+ * Constante (no aleatoria): vive en el shadow root de ESTA instancia, donde
1390
+ * los ids no colisionan con los de otras. Se referencia el HOST de la
1391
+ * primitiva — su listbox interno queda tras su propio shadow boundary y no
1392
+ * es direccionable desde acá (limitación conocida y aceptada).
1393
+ *
1394
+ * El trigger solo emite `aria-controls` mientras `isOpen`: el panel se monta
1395
+ * on-demand, así que cerrado el IDREF quedaría colgante.
1396
+ */
1397
+ CoRefField.LIST_ID = 'co-ref-field-list';
@@ -154,7 +154,7 @@ export class CoSegmentedBar {
154
154
  "references": {
155
155
  "CoSegment": {
156
156
  "location": "local",
157
- "path": "/Users/agox/worktrees/cobalt-release-093/packages/core/src/components/co-segmented-bar/co-segmented-bar.tsx",
157
+ "path": "/Users/agox/worktrees/cobalt-rel-095/packages/core/src/components/co-segmented-bar/co-segmented-bar.tsx",
158
158
  "id": "src/components/co-segmented-bar/co-segmented-bar.tsx::CoSegment"
159
159
  }
160
160
  }
@@ -818,9 +818,19 @@ html[data-overlayscrollbars-viewport~=scrollbarHidden] > body::-webkit-scrollbar
818
818
  box-shadow: 0 0 0 2px var(--co-semantic-border-focus-ring);
819
819
  }
820
820
 
821
+ /* Anillo de foco por teclado — mismo trazo que el estado abierto. */
822
+ .co-select__trigger:focus-visible {
823
+ outline: none;
824
+ border-color: var(--co-semantic-border-focus);
825
+ box-shadow: 0 0 0 2px var(--co-semantic-border-focus-ring);
826
+ }
827
+
821
828
  .co-select--disabled .co-select__trigger {
822
829
  background: var(--co-semantic-surface-disabled);
823
830
  border-color: transparent;
831
+ /* Un focus() programático sobre el trigger deshabilitado si no pintaría el
832
+ anillo del :focus-visible. */
833
+ box-shadow: none;
824
834
  cursor: not-allowed;
825
835
  }
826
836
 
@@ -978,6 +988,15 @@ html[data-overlayscrollbars-viewport~=scrollbarHidden] > body::-webkit-scrollbar
978
988
  background: var(--co-semantic-surface-muted);
979
989
  }
980
990
 
991
+ /* Opción resaltada por teclado (`aria-activedescendant`). Va DESPUÉS de
992
+ * `--selected` a propósito: sobre una opción ya elegida tiene que ganar, si no
993
+ * el usuario de teclado pierde de vista dónde está parado. Mismo gris que el
994
+ * hover — el check sigue distinguiendo lo seleccionado (igual que
995
+ * co-option-list). */
996
+ .co-select__option--active {
997
+ background: var(--co-semantic-surface-hover);
998
+ }
999
+
981
1000
  .co-select__option--disabled {
982
1001
  opacity: 0.4;
983
1002
  cursor: not-allowed;