@prolibu-suite/cobalt-core 0.9.3 → 0.9.4

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 (244) 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 +11 -5
  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 +87 -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-0caa059c.entry.js +1 -0
  28. package/dist/cobalt/{p-3ced4269.entry.js → p-2828ecf6.entry.js} +1 -1
  29. package/dist/cobalt/p-2f88d151.entry.js +1 -0
  30. package/dist/cobalt/p-409f28bb.entry.js +1 -0
  31. package/dist/cobalt/{p-18af9e44.entry.js → p-568cfe8d.entry.js} +1 -1
  32. package/dist/cobalt/p-6bf814f9.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-f00be11f.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.js +8 -5
  66. package/dist/collection/components/co-icon/iconLoader.js +17 -1
  67. package/dist/collection/components/co-icon-button/co-icon-button.css +7 -0
  68. package/dist/collection/components/co-icon-button/co-icon-button.js +6 -3
  69. package/dist/collection/components/co-input/co-input.css +13 -0
  70. package/dist/collection/components/co-input/co-input.js +21 -0
  71. package/dist/collection/components/co-loader/co-loader.css +5 -3
  72. package/dist/collection/components/co-number-field/co-number-field.js +23 -2
  73. package/dist/collection/components/co-option-list/co-option-list.css +45 -2
  74. package/dist/collection/components/co-option-list/co-option-list.js +468 -18
  75. package/dist/collection/components/co-option-list/optionListLogic.js +25 -0
  76. package/dist/collection/components/co-popover/co-popover.js +1 -1
  77. package/dist/collection/components/co-radio-group/co-radio-group.js +1 -1
  78. package/dist/collection/components/co-ref-field/co-ref-field.css +49 -0
  79. package/dist/collection/components/co-ref-field/co-ref-field.js +240 -12
  80. package/dist/collection/components/co-segmented-bar/co-segmented-bar.js +1 -1
  81. package/dist/collection/components/co-select/co-select.css +19 -0
  82. package/dist/collection/components/co-select/co-select.js +275 -9
  83. package/dist/collection/components/co-sidebar-nav/co-sidebar-nav.js +1 -1
  84. package/dist/collection/components/co-toast/co-toast.js +2 -2
  85. package/dist/collection/components/co-transfer-list/co-transfer-list.js +1 -1
  86. package/dist/collection/utils/fieldChip.js +1 -1
  87. package/dist/collection/utils/fileI18n.js +3 -0
  88. package/dist/components/co-accordion.js +1 -1
  89. package/dist/components/co-action-bar.js +1 -1
  90. package/dist/components/co-audio-player.js +1 -1
  91. package/dist/components/co-autocomplete.js +1 -1
  92. package/dist/components/co-avatar-group.js +1 -1
  93. package/dist/components/co-avatar.js +1 -1
  94. package/dist/components/co-breadcrumb-item.js +1 -1
  95. package/dist/components/co-breadcrumb.js +1 -1
  96. package/dist/components/co-button.js +1 -1
  97. package/dist/components/co-calendar-month.js +1 -1
  98. package/dist/components/co-calendar-timegrid.js +1 -1
  99. package/dist/components/co-calendar.js +1 -1
  100. package/dist/components/co-carousel.js +1 -1
  101. package/dist/components/co-checkbox-group.js +1 -1
  102. package/dist/components/co-checkbox.js +1 -1
  103. package/dist/components/co-chip.js +1 -1
  104. package/dist/components/co-color-picker.js +1 -1
  105. package/dist/components/co-column-picker.js +1 -1
  106. package/dist/components/co-combobox.js +1 -1
  107. package/dist/components/co-command-search.js +1 -1
  108. package/dist/components/co-data-table-pagination.js +1 -1
  109. package/dist/components/co-data-table.js +1 -1
  110. package/dist/components/co-date-field.js +1 -1
  111. package/dist/components/co-date-picker.js +1 -1
  112. package/dist/components/co-date-range-picker.js +1 -1
  113. package/dist/components/co-date-range.js +1 -1
  114. package/dist/components/co-date-time-picker.js +1 -1
  115. package/dist/components/co-drawer.js +1 -1
  116. package/dist/components/co-drive-card.js +1 -1
  117. package/dist/components/co-drop-zone.js +1 -1
  118. package/dist/components/co-emoji-picker.js +1 -1
  119. package/dist/components/co-empty-state.js +1 -1
  120. package/dist/components/co-event-calendar.js +1 -1
  121. package/dist/components/co-event-popover.js +1 -1
  122. package/dist/components/co-fab.js +1 -1
  123. package/dist/components/co-file-field.js +1 -1
  124. package/dist/components/co-file-type-tile.js +1 -1
  125. package/dist/components/co-helper-text.js +1 -1
  126. package/dist/components/co-icon-button.js +1 -1
  127. package/dist/components/co-icon.js +1 -1
  128. package/dist/components/co-input.js +1 -1
  129. package/dist/components/co-json-field.js +1 -1
  130. package/dist/components/co-lightbox.js +1 -1
  131. package/dist/components/co-list-footer.js +1 -1
  132. package/dist/components/co-list-item.js +1 -1
  133. package/dist/components/co-loader.js +1 -1
  134. package/dist/components/co-menu-item.js +1 -1
  135. package/dist/components/co-modal.js +1 -1
  136. package/dist/components/co-number-field.js +1 -1
  137. package/dist/components/co-option-list.js +1 -1
  138. package/dist/components/co-page-header.js +1 -1
  139. package/dist/components/co-phone-field.js +1 -1
  140. package/dist/components/co-radio-group.js +1 -1
  141. package/dist/components/co-rating.js +1 -1
  142. package/dist/components/co-ref-field.js +1 -1
  143. package/dist/components/co-rich-text-editor.js +1 -1
  144. package/dist/components/co-rich-text-toolbar.js +1 -1
  145. package/dist/components/co-select.js +1 -1
  146. package/dist/components/co-sidebar-nav.js +1 -1
  147. package/dist/components/co-slider.js +1 -1
  148. package/dist/components/co-switch.js +1 -1
  149. package/dist/components/co-tab.js +1 -1
  150. package/dist/components/co-tags-field.js +1 -1
  151. package/dist/components/co-textarea.js +1 -1
  152. package/dist/components/co-toast.js +1 -1
  153. package/dist/components/co-toggle-button.js +1 -1
  154. package/dist/components/co-transfer-list.js +1 -1
  155. package/dist/components/co-video.js +1 -1
  156. package/dist/components/{p-CklsvHeL.js → p-B0Dc-I_C.js} +1 -1
  157. package/dist/components/{p-DzoNGEDU.js → p-BH184F0X.js} +1 -1
  158. package/dist/components/{p-BGD3oQ73.js → p-BHYtxTzM.js} +1 -1
  159. package/dist/components/{p-mom5kiBa.js → p-BTQEg3UO.js} +1 -1
  160. package/dist/components/p-BZIB4JDs.js +1 -0
  161. package/dist/components/p-Bbny3WUc.js +1 -0
  162. package/dist/components/{p-D5QJpmqf.js → p-Bxk96Zgc.js} +1 -1
  163. package/dist/components/p-C1Kv3zYZ.js +1 -0
  164. package/dist/components/p-C4U2tbRp.js +1 -0
  165. package/dist/components/{p-CyMaOb1j.js → p-CA_JAK9s.js} +1 -1
  166. package/dist/components/{p-AvSaw4Ua.js → p-CR0izsJC.js} +1 -1
  167. package/dist/components/p-CuZXTvDM.js +1 -0
  168. package/dist/components/{p-_131DL6m.js → p-D4qzGifz.js} +1 -1
  169. package/dist/components/{p-BsQQ7Mki.js → p-D5EdMieb.js} +1 -1
  170. package/dist/components/p-Dabi98BI.js +1 -0
  171. package/dist/components/p-DbipMAyT.js +1 -0
  172. package/dist/components/p-DgUBcJIS.js +1 -0
  173. package/dist/components/p-Dj1EZ5qD.js +1 -0
  174. package/dist/components/{p-DkmKOF60.js → p-P8wvwhM2.js} +1 -1
  175. package/dist/components/{p-nwy6X1QT.js → p-hfGFsvaD.js} +1 -1
  176. package/dist/esm/co-audio-player.entry.js +107 -18
  177. package/dist/esm/co-avatar_2.entry.js +6 -30
  178. package/dist/esm/co-button.entry.js +6 -4
  179. package/dist/esm/co-calendar-month_2.entry.js +59 -2
  180. package/dist/esm/co-checkbox.entry.js +10 -4
  181. package/dist/esm/co-chip_2.entry.js +388 -18
  182. package/dist/esm/co-color-picker.entry.js +36 -3
  183. package/dist/esm/co-combobox.entry.js +44 -4
  184. package/dist/esm/co-event-popover.entry.js +5 -2
  185. package/dist/esm/co-file-field.entry.js +11 -5
  186. package/dist/esm/co-icon-button.entry.js +5 -2
  187. package/dist/esm/co-icon.entry.js +17 -1
  188. package/dist/esm/co-input.entry.js +21 -1
  189. package/dist/esm/co-loader.entry.js +1 -1
  190. package/dist/esm/co-number-field.entry.js +22 -2
  191. package/dist/esm/co-ref-field.entry.js +87 -13
  192. package/dist/esm/co-select.entry.js +273 -8
  193. package/dist/esm/co-tags-field.entry.js +1 -1
  194. package/dist/esm/cobalt.js +1 -1
  195. package/dist/esm/color-BG4WRR22.js +30 -0
  196. package/dist/esm/fieldChip-DsAfq1e0.js +5 -0
  197. package/dist/esm/index-CrtiywTB.js +4 -4
  198. package/dist/esm/loader.js +1 -1
  199. package/dist/types/components/co-audio-player/co-audio-player.d.ts +13 -0
  200. package/dist/types/components/co-audio-player/co-audio-player.utils.d.ts +18 -1
  201. package/dist/types/components/co-button/co-button.d.ts +3 -1
  202. package/dist/types/components/co-calendar-month/co-calendar-month.d.ts +7 -0
  203. package/dist/types/components/co-checkbox/co-checkbox.d.ts +1 -0
  204. package/dist/types/components/co-color-picker/co-color-picker.d.ts +15 -0
  205. package/dist/types/components/co-combobox/co-combobox.d.ts +17 -0
  206. package/dist/types/components/co-icon-button/co-icon-button.d.ts +3 -0
  207. package/dist/types/components/co-input/co-input.d.ts +9 -0
  208. package/dist/types/components/co-number-field/co-number-field.d.ts +9 -0
  209. package/dist/types/components/co-option-list/co-option-list.d.ts +79 -0
  210. package/dist/types/components/co-option-list/optionListLogic.d.ts +23 -1
  211. package/dist/types/components/co-ref-field/co-ref-field.d.ts +46 -0
  212. package/dist/types/components/co-select/co-select.d.ts +67 -0
  213. package/dist/types/components.d.ts +110 -4
  214. package/dist/types/utils/fieldChip.d.ts +5 -0
  215. package/dist/types/utils/fileI18n.d.ts +1 -0
  216. package/package.json +3 -3
  217. package/dist/cjs/fieldChip-xNJPEFcS.js +0 -7
  218. package/dist/cobalt/p-02ac492f.entry.js +0 -1
  219. package/dist/cobalt/p-0ccb672b.entry.js +0 -1
  220. package/dist/cobalt/p-2d81b292.entry.js +0 -1
  221. package/dist/cobalt/p-4a503187.entry.js +0 -1
  222. package/dist/cobalt/p-55566b37.entry.js +0 -1
  223. package/dist/cobalt/p-680d3db8.entry.js +0 -1
  224. package/dist/cobalt/p-7457aa89.entry.js +0 -1
  225. package/dist/cobalt/p-77719335.entry.js +0 -1
  226. package/dist/cobalt/p-8f600512.entry.js +0 -1
  227. package/dist/cobalt/p-CQAYgqA6.js +0 -1
  228. package/dist/cobalt/p-a02db338.entry.js +0 -1
  229. package/dist/cobalt/p-a51d8775.entry.js +0 -1
  230. package/dist/cobalt/p-aafb9d11.entry.js +0 -1
  231. package/dist/cobalt/p-b28dc0fe.entry.js +0 -1
  232. package/dist/cobalt/p-c6b9b9d6.entry.js +0 -1
  233. package/dist/cobalt/p-d4debd6f.entry.js +0 -1
  234. package/dist/cobalt/p-d629fb4e.entry.js +0 -1
  235. package/dist/components/p-B3TkpLNh.js +0 -1
  236. package/dist/components/p-B7hvddnu.js +0 -1
  237. package/dist/components/p-BT5tSgZa.js +0 -1
  238. package/dist/components/p-CXLX8DpD.js +0 -1
  239. package/dist/components/p-DTvb412h.js +0 -1
  240. package/dist/components/p-DvhR3H61.js +0 -1
  241. package/dist/components/p-KWTokD0C.js +0 -1
  242. package/dist/components/p-Q6caHt79.js +0 -1
  243. package/dist/components/p-WWlZiln1.js +0 -1
  244. 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/Documents/Prolibu/prolibu-cobalt/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/Documents/Prolibu/prolibu-cobalt/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,6 +165,12 @@ 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) => {
133
175
  e.stopPropagation();
134
176
  const newValue = this.parsedValue.filter((v) => v !== id);
@@ -281,6 +323,17 @@ export class CoRefField {
281
323
  }
282
324
  else {
283
325
  this.coClose.emit();
326
+ this.restoreTriggerFocus();
327
+ }
328
+ }
329
+ /** Devuelve el foco al trigger al cerrar el panel (Escape, selección),
330
+ * salvo que el cierre venga de un click-outside que ya movió el foco a
331
+ * otro elemento — en ese caso no robarlo. */
332
+ restoreTriggerFocus() {
333
+ var _a;
334
+ const active = document.activeElement;
335
+ if (active === this.el || this.el.contains(active)) {
336
+ (_a = this.triggerEl) === null || _a === void 0 ? void 0 : _a.focus();
284
337
  }
285
338
  }
286
339
  // ── Render helpers ─────────────────────────────────────────
@@ -294,7 +347,7 @@ export class CoRefField {
294
347
  [`co-ref-field--${this.normalizedSize}`]: true,
295
348
  [`co-ref-field--${this.status}`]: this.status !== 'default',
296
349
  '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 }))));
350
+ }, 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
351
  }
299
352
  /**
300
353
  * Leading visual for a selected value / chip. Prefers a real avatar (image
@@ -327,25 +380,32 @@ export class CoRefField {
327
380
  const visible = fixed ? items.slice(0, this.maxChips) : items;
328
381
  const overflow = fixed ? items.length - this.maxChips : responsiveOverflow;
329
382
  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)));
383
+ 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) => {
384
+ // 'fill' mode: the item color IS the chip background (tag look);
385
+ // no leading dot, label/remove flip to contrast via CSS `inherit`.
386
+ const fill = this.colorMode === 'fill' && !!item.color && !(item.image || item.avatar);
387
+ return (
388
+ // Shared field-chip (utils/fieldChip.tsx); the leading avatar /
389
+ // color-dot goes in as children, the "+N" overflow stays here.
390
+ h(FieldChip, { key: item._id, baseClass: "co-ref-field__chip", label: item.label, modifiers: {
391
+ 'co-ref-field__chip--avatar': !!(item.image || item.avatar),
392
+ 'co-ref-field__chip--fill': fill,
393
+ 'co-ref-field__chip--fill-light': fill && isLightColor(item.color),
394
+ 'co-ref-field__chip--clipped': !fixed && i >= visibleCount,
395
+ [`co-ref-field__chip--${this.normalizedSize}`]: true,
396
+ }, 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));
397
+ })), overflow > 0 && h("span", { class: "co-ref-field__chip-overflow" }, "+", overflow)));
338
398
  }
339
399
  renderPanel() {
340
400
  return (h("div", { class: {
341
401
  'co-ref-field__panel': true,
342
402
  'co-ref-field__panel--dark': this.panelTheme === 'dark',
343
403
  '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)))))));
404
+ }, 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
405
  }
346
406
  // ── Main render ────────────────────────────────────────────
347
407
  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)))));
408
+ return (h("div", { key: '6bfad2357faa70a7fe4d71aa61b8eaab589c26f2', class: "co-ref-field" }, (this.label || this.secondaryLabel) && (h("div", { key: '0de5d626d21c9cc3d96b7c39da180369bfd2b228', class: "co-ref-field__labels" }, this.label && (h("label", { key: 'ae25a6e7630ce52208ae0d13c0228fa0cac9496d', class: "co-ref-field__label" }, this.labelIcon && (h("co-icon", { key: 'bce6b7a835f291d658eab0ca3589d39bf5ab7d5c', class: "co-ref-field__label-icon", name: this.labelIcon, size: 16 })), this.label, h(RequiredMark, { key: '84f6a8d95f46674717e1b7e5699790b317a69a67', required: this.required }))), this.secondaryLabel && (h("span", { key: 'f9bbcdcb833a0347b2b2ee050e1ba58f95bb3d40', class: "co-ref-field__secondary-label" }, this.secondaryLabel)))), h("co-popover", { key: '18ac882e39908cd9fdda86d70ed750faca8bc8d1', open: this.isOpen, placement: "bottom-start", matchWidth: !this.panelWidth, offset: 4, onCoOpen: this.handlePopoverOpen, onCoClose: this.handlePopoverClose }, h("div", { key: 'e542d937f4738a7199f38057986931a21fc8462f', slot: "trigger" }, this.renderTrigger()), this.isOpen && this.renderPanel()), this.helperText && (h("div", { key: 'f75928e549c2c1f6f5f0589e105c00b71e85f661', class: `co-ref-field__helper co-ref-field__helper--${this.status}` }, this.status !== 'default' && (h("co-icon", { key: '1f329a60a6b03fdfc77361c8c2287cc55369764f', name: this.status === 'error' ? 'warning-circle' : this.status === 'success' ? 'check-circle' : 'info', size: 14 })), h("span", { key: '5fa6dbe648f63789c496081c9197eac7ac89c9b3' }, this.helperText)))));
349
409
  }
350
410
  static get is() { return "co-ref-field"; }
351
411
  static get encapsulation() { return "shadow"; }
@@ -498,6 +558,46 @@ export class CoRefField {
498
558
  "attribute": "clearable",
499
559
  "defaultValue": "true"
500
560
  },
561
+ "editable": {
562
+ "type": "boolean",
563
+ "mutable": false,
564
+ "complexType": {
565
+ "original": "boolean",
566
+ "resolved": "boolean",
567
+ "references": {}
568
+ },
569
+ "required": false,
570
+ "optional": false,
571
+ "docs": {
572
+ "tags": [],
573
+ "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."
574
+ },
575
+ "getter": false,
576
+ "setter": false,
577
+ "reflect": false,
578
+ "attribute": "editable",
579
+ "defaultValue": "false"
580
+ },
581
+ "editLabel": {
582
+ "type": "string",
583
+ "mutable": false,
584
+ "complexType": {
585
+ "original": "string",
586
+ "resolved": "string",
587
+ "references": {}
588
+ },
589
+ "required": false,
590
+ "optional": false,
591
+ "docs": {
592
+ "tags": [],
593
+ "text": "Accessible name / tooltip for the edit button."
594
+ },
595
+ "getter": false,
596
+ "setter": false,
597
+ "reflect": false,
598
+ "attribute": "edit-label",
599
+ "defaultValue": "'Edit'"
600
+ },
501
601
  "multiple": {
502
602
  "type": "boolean",
503
603
  "mutable": false,
@@ -916,6 +1016,26 @@ export class CoRefField {
916
1016
  "attribute": "panel-theme",
917
1017
  "defaultValue": "'auto'"
918
1018
  },
1019
+ "colorMode": {
1020
+ "type": "string",
1021
+ "mutable": false,
1022
+ "complexType": {
1023
+ "original": "'dot' | 'fill'",
1024
+ "resolved": "\"dot\" | \"fill\"",
1025
+ "references": {}
1026
+ },
1027
+ "required": false,
1028
+ "optional": false,
1029
+ "docs": {
1030
+ "tags": [],
1031
+ "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."
1032
+ },
1033
+ "getter": false,
1034
+ "setter": false,
1035
+ "reflect": false,
1036
+ "attribute": "color-mode",
1037
+ "defaultValue": "'dot'"
1038
+ },
919
1039
  "triggerBadgeIcon": {
920
1040
  "type": "string",
921
1041
  "mutable": false,
@@ -994,6 +1114,46 @@ export class CoRefField {
994
1114
  "reflect": false,
995
1115
  "attribute": "avatar-shape",
996
1116
  "defaultValue": "'circle'"
1117
+ },
1118
+ "pinnable": {
1119
+ "type": "boolean",
1120
+ "mutable": false,
1121
+ "complexType": {
1122
+ "original": "boolean",
1123
+ "resolved": "boolean",
1124
+ "references": {}
1125
+ },
1126
+ "required": false,
1127
+ "optional": false,
1128
+ "docs": {
1129
+ "tags": [],
1130
+ "text": "Push-pin por fila en el panel (forward a co-option-list)."
1131
+ },
1132
+ "getter": false,
1133
+ "setter": false,
1134
+ "reflect": false,
1135
+ "attribute": "pinnable",
1136
+ "defaultValue": "false"
1137
+ },
1138
+ "listReorderable": {
1139
+ "type": "boolean",
1140
+ "mutable": false,
1141
+ "complexType": {
1142
+ "original": "boolean",
1143
+ "resolved": "boolean",
1144
+ "references": {}
1145
+ },
1146
+ "required": false,
1147
+ "optional": false,
1148
+ "docs": {
1149
+ "tags": [],
1150
+ "text": "Drag-reorder de la lista del panel (forward a co-option-list)."
1151
+ },
1152
+ "getter": false,
1153
+ "setter": false,
1154
+ "reflect": false,
1155
+ "attribute": "list-reorderable",
1156
+ "defaultValue": "false"
997
1157
  }
998
1158
  };
999
1159
  }
@@ -1020,7 +1180,7 @@ export class CoRefField {
1020
1180
  "references": {
1021
1181
  "RefFieldOption": {
1022
1182
  "location": "local",
1023
- "path": "/Users/agox/worktrees/cobalt-release-093/packages/core/src/components/co-ref-field/co-ref-field.tsx",
1183
+ "path": "/Users/agox/Documents/Prolibu/prolibu-cobalt/packages/core/src/components/co-ref-field/co-ref-field.tsx",
1024
1184
  "id": "src/components/co-ref-field/co-ref-field.tsx::RefFieldOption"
1025
1185
  }
1026
1186
  }
@@ -1145,6 +1305,63 @@ export class CoRefField {
1145
1305
  "resolved": "void",
1146
1306
  "references": {}
1147
1307
  }
1308
+ }, {
1309
+ "method": "coPinToggle",
1310
+ "name": "coPinToggle",
1311
+ "bubbles": true,
1312
+ "cancelable": true,
1313
+ "composed": true,
1314
+ "docs": {
1315
+ "tags": [],
1316
+ "text": "Re-emisi\u00F3n del toggle de pin de una fila del panel (pinnable)."
1317
+ },
1318
+ "complexType": {
1319
+ "original": "{ item: RefFieldOption }",
1320
+ "resolved": "{ item: RefFieldOption; }",
1321
+ "references": {
1322
+ "RefFieldOption": {
1323
+ "location": "local",
1324
+ "path": "/Users/agox/Documents/Prolibu/prolibu-cobalt/packages/core/src/components/co-ref-field/co-ref-field.tsx",
1325
+ "id": "src/components/co-ref-field/co-ref-field.tsx::RefFieldOption"
1326
+ }
1327
+ }
1328
+ }
1329
+ }, {
1330
+ "method": "coListReorder",
1331
+ "name": "coListReorder",
1332
+ "bubbles": true,
1333
+ "cancelable": true,
1334
+ "composed": true,
1335
+ "docs": {
1336
+ "tags": [],
1337
+ "text": "Re-emisi\u00F3n del drag-reorder de la lista del panel (listReorderable)."
1338
+ },
1339
+ "complexType": {
1340
+ "original": "{ value: string[]; item: RefFieldOption }",
1341
+ "resolved": "{ value: string[]; item: RefFieldOption; }",
1342
+ "references": {
1343
+ "RefFieldOption": {
1344
+ "location": "local",
1345
+ "path": "/Users/agox/Documents/Prolibu/prolibu-cobalt/packages/core/src/components/co-ref-field/co-ref-field.tsx",
1346
+ "id": "src/components/co-ref-field/co-ref-field.tsx::RefFieldOption"
1347
+ }
1348
+ }
1349
+ }
1350
+ }, {
1351
+ "method": "coEditSelected",
1352
+ "name": "coEditSelected",
1353
+ "bubbles": true,
1354
+ "cancelable": true,
1355
+ "composed": true,
1356
+ "docs": {
1357
+ "tags": [],
1358
+ "text": "Pencil click on the single-value trigger. Detail = selected record `_id`."
1359
+ },
1360
+ "complexType": {
1361
+ "original": "string",
1362
+ "resolved": "string",
1363
+ "references": {}
1364
+ }
1148
1365
  }];
1149
1366
  }
1150
1367
  static get elementRef() { return "el"; }
@@ -1155,3 +1372,14 @@ export class CoRefField {
1155
1372
  }];
1156
1373
  }
1157
1374
  }
1375
+ /**
1376
+ * Id del <co-option-list> del panel, target de `aria-controls` del trigger.
1377
+ * Constante (no aleatoria): vive en el shadow root de ESTA instancia, donde
1378
+ * los ids no colisionan con los de otras. Se referencia el HOST de la
1379
+ * primitiva — su listbox interno queda tras su propio shadow boundary y no
1380
+ * es direccionable desde acá (limitación conocida y aceptada).
1381
+ *
1382
+ * El trigger solo emite `aria-controls` mientras `isOpen`: el panel se monta
1383
+ * on-demand, así que cerrado el IDREF quedaría colgante.
1384
+ */
1385
+ 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/Documents/Prolibu/prolibu-cobalt/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;