@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
@@ -163,6 +163,17 @@ function buildRows(items) {
163
163
  }
164
164
  /** Mueve `fromId` a la posición de `toId` en `order`. No muta el input;
165
165
  * devuelve el mismo array (referencia) si es no-op. */
166
+ /**
167
+ * Universo del drag del bloque seleccionado: los ids seleccionados VIVOS en su
168
+ * orden visible. A diferencia del snapshot (congelado al abrir), incluye lo
169
+ * seleccionado durante la sesión del panel — sin esto, esos ítems renderizan
170
+ * handle pero el drop los rechaza, y un reorder del snapshot emitiría un value
171
+ * truncado (pierde las selecciones frescas).
172
+ */
173
+ function liveSelectedOrder(items, selectedIds) {
174
+ const sel = new Set(selectedIds);
175
+ return items.filter((i) => sel.has(i._id)).map((i) => i._id);
176
+ }
166
177
  function reorderIds(order, fromId, toId) {
167
178
  if (fromId === toId)
168
179
  return order;
@@ -174,6 +185,13 @@ function reorderIds(order, fromId, toId) {
174
185
  next.splice(to, 0, next.splice(from, 1)[0]);
175
186
  return next;
176
187
  }
188
+ /** Reorder de lista completa: los extremos pineados son inválidos (ni origen ni
189
+ * destino) — devuelve la misma referencia, señal de no-op para el caller. */
190
+ function listReorderIds(order, fromId, toId, isPinned) {
191
+ if (isPinned(fromId) || isPinned(toId))
192
+ return order;
193
+ return reorderIds(order, fromId, toId);
194
+ }
177
195
  /** Siguiente highlight: wrap, salta disabled. -1 = sin items navegables. */
178
196
  function nextActiveIndex(current, delta, items) {
179
197
  const positions = [];
@@ -188,6 +206,13 @@ function nextActiveIndex(current, delta, items) {
188
206
  return delta === 1 ? positions[0] : positions[positions.length - 1];
189
207
  return positions[(at + delta + positions.length) % positions.length];
190
208
  }
209
+ /** Highlight inicial de la sesión del panel: primera fila seleccionada
210
+ * NAVEGABLE en orden visible (contrato de scrollToSelected, paridad
211
+ * resetActiveIndex de co-select). -1 = nada que anclar. */
212
+ function selectedActiveIndex(items, selectedIds) {
213
+ const sel = new Set(selectedIds);
214
+ return items.findIndex((it) => sel.has(it._id) && !it.disabled);
215
+ }
191
216
  /** `total > 0` tiene precedencia (deriva remaining); si no, vale `hasMoreProp`. */
192
217
  function deriveMore(count, total, hasMoreProp) {
193
218
  if (total > 0)
@@ -205,7 +230,7 @@ function virtualSlice(scrollTop, count) {
205
230
  return { totalHeight, startIdx, endIdx, offsetY: startIdx * VIRTUAL_ITEM_HEIGHT };
206
231
  }
207
232
 
208
- const coOptionListCss = () => `.os-size-observer,.os-size-observer-listener{scroll-behavior:auto !important;direction:inherit;pointer-events:none;overflow:hidden;visibility:hidden;box-sizing:border-box}.os-size-observer,.os-size-observer-listener,.os-size-observer-listener-item,.os-size-observer-listener-item-final{writing-mode:horizontal-tb;position:absolute;left:0;top:0}.os-size-observer{z-index:-1;contain:strict;display:flex;flex-direction:row;flex-wrap:nowrap;padding:inherit;border:inherit;box-sizing:inherit;margin:-133px;top:0;right:0;bottom:0;left:0;transform:scale(0.1)}.os-size-observer::before{content:"";flex:none;box-sizing:inherit;padding:10px;width:10px;height:10px}.os-size-observer-appear{animation:os-size-observer-appear-animation 1ms forwards}.os-size-observer-listener{box-sizing:border-box;position:relative;flex:auto;padding:inherit;border:inherit;margin:-133px;transform:scale(calc(1 / 0.1))}.os-size-observer-listener.ltr{margin-right:-266px;margin-left:0}.os-size-observer-listener.rtl{margin-left:-266px;margin-right:0}.os-size-observer-listener:empty::before{content:"";width:100%;height:100%}.os-size-observer-listener:empty::before,.os-size-observer-listener>.os-size-observer-listener-item{display:block;position:relative;padding:inherit;border:inherit;box-sizing:content-box;flex:auto}.os-size-observer-listener-scroll{box-sizing:border-box;display:flex}.os-size-observer-listener-item{right:0;bottom:0;overflow:hidden;direction:ltr;flex:none}.os-size-observer-listener-item-final{transition:none}@keyframes os-size-observer-appear-animation{from{cursor:auto}to{cursor:none}}.os-trinsic-observer{flex:none;box-sizing:border-box;position:relative;max-width:0px;max-height:1px;padding:0;margin:0;border:none;overflow:hidden;z-index:-1;height:0;top:calc(100% + 1px);contain:strict}.os-trinsic-observer:not(:empty){height:calc(100% + 1px);top:-1px}.os-trinsic-observer:not(:empty)>.os-size-observer{width:1000%;height:1000%;min-height:1px;min-width:1px}html[data-overlayscrollbars-body]{overflow:hidden}html[data-overlayscrollbars-body],html[data-overlayscrollbars-body]>body{width:100%;height:100%;margin:0}html[data-overlayscrollbars-body]>body{overflow:visible;margin:0}[data-overlayscrollbars]{position:relative}[data-overlayscrollbars~=host],[data-overlayscrollbars-padding]{display:flex;align-items:stretch !important;flex-direction:row !important;flex-wrap:nowrap !important;scroll-behavior:auto !important}[data-overlayscrollbars-padding],[data-overlayscrollbars-viewport]:not([data-overlayscrollbars]){box-sizing:inherit;position:relative;flex:auto;height:auto;width:100%;min-width:0;padding:0;margin:0;border:none;z-index:0}[data-overlayscrollbars-viewport]:not([data-overlayscrollbars]){--os-vaw:0;--os-vah:0;outline:none}[data-overlayscrollbars-viewport]:not([data-overlayscrollbars]):focus{outline:none}[data-overlayscrollbars-viewport][data-overlayscrollbars-viewport~=arrange]::before{content:"";position:absolute;pointer-events:none;z-index:-1;min-width:1px;min-height:1px;width:var(--os-vaw);height:var(--os-vah)}[data-overlayscrollbars~=host],[data-overlayscrollbars-padding]{overflow:hidden !important}[data-overlayscrollbars~=host][data-overlayscrollbars~=noClipping],[data-overlayscrollbars-padding~=noClipping]{overflow:visible !important}[data-overlayscrollbars-viewport]{--os-viewport-overflow-x:hidden;--os-viewport-overflow-y:hidden;overflow-x:var(--os-viewport-overflow-x);overflow-y:var(--os-viewport-overflow-y)}[data-overlayscrollbars-viewport~=overflowXVisible]{--os-viewport-overflow-x:visible}[data-overlayscrollbars-viewport~=overflowXHidden]{--os-viewport-overflow-x:hidden}[data-overlayscrollbars-viewport~=overflowXScroll]{--os-viewport-overflow-x:scroll}[data-overlayscrollbars-viewport~=overflowYVisible]{--os-viewport-overflow-y:visible}[data-overlayscrollbars-viewport~=overflowYHidden]{--os-viewport-overflow-y:hidden}[data-overlayscrollbars-viewport~=overflowYScroll]{--os-viewport-overflow-y:scroll}[data-overlayscrollbars-viewport~=overflowImportant]{overflow-x:var(--os-viewport-overflow-x) !important;overflow-y:var(--os-viewport-overflow-y) !important}[data-overlayscrollbars-viewport~=noContent]:not(#osFakeId){font-size:0 !important;line-height:0 !important}[data-overlayscrollbars-viewport~=noContent]:not(#osFakeId)::before,[data-overlayscrollbars-viewport~=noContent]:not(#osFakeId)::after,[data-overlayscrollbars-viewport~=noContent]:not(#osFakeId)>*:not(#osFakeId){display:none !important;position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border-width:0 !important}[data-overlayscrollbars-viewport~=measuring],[data-overlayscrollbars-viewport~=scrolling]{scroll-behavior:auto !important;scroll-snap-type:none !important}[data-overlayscrollbars-viewport~=measuring][data-overlayscrollbars-viewport~=overflowXVisible]{overflow-x:hidden !important}[data-overlayscrollbars-viewport~=measuring][data-overlayscrollbars-viewport~=overflowYVisible]{overflow-y:hidden !important}[data-overlayscrollbars-content]{box-sizing:inherit}[data-overlayscrollbars-contents]:not(#osFakeId):not([data-overlayscrollbars-padding]):not([data-overlayscrollbars-viewport]):not([data-overlayscrollbars-content]){display:contents}[data-overlayscrollbars-grid],[data-overlayscrollbars-grid] [data-overlayscrollbars-padding]{display:grid;grid-template:1fr/1fr}[data-overlayscrollbars-grid]>[data-overlayscrollbars-padding],[data-overlayscrollbars-grid]>[data-overlayscrollbars-viewport],[data-overlayscrollbars-grid]>[data-overlayscrollbars-padding]>[data-overlayscrollbars-viewport]{height:auto !important;width:auto !important}@property --os-scroll-percent{syntax:"<number>";inherits:true;initial-value:0}@property --os-viewport-percent{syntax:"<number>";inherits:true;initial-value:0}.os-scrollbar{--os-viewport-percent:0;--os-scroll-percent:0;--os-scroll-direction:0;--os-scroll-percent-directional:calc( var(--os-scroll-percent) - (var(--os-scroll-percent) + (1 - var(--os-scroll-percent)) * -1) * var(--os-scroll-direction) )}.os-scrollbar{contain:size layout;contain:size layout style;transition:opacity 0.15s, visibility 0.15s, top 0.15s, right 0.15s, bottom 0.15s, left 0.15s;pointer-events:none;position:absolute;opacity:0;visibility:hidden}body>.os-scrollbar{position:fixed;z-index:99999}.os-scrollbar-transitionless{transition:none !important}.os-scrollbar-track{position:relative;padding:0 !important;border:none !important}.os-scrollbar-handle{position:absolute}.os-scrollbar-track,.os-scrollbar-handle{pointer-events:none;width:100%;height:100%}.os-scrollbar.os-scrollbar-track-interactive .os-scrollbar-track,.os-scrollbar.os-scrollbar-handle-interactive .os-scrollbar-handle{pointer-events:auto;touch-action:none}.os-scrollbar-horizontal{bottom:0;left:0}.os-scrollbar-vertical{top:0;right:0}.os-scrollbar-rtl.os-scrollbar-horizontal{right:0}.os-scrollbar-rtl.os-scrollbar-vertical{right:auto;left:0}.os-scrollbar-visible{opacity:1;visibility:visible}.os-scrollbar-auto-hide.os-scrollbar-auto-hide-hidden{opacity:0;visibility:hidden}.os-scrollbar-interaction.os-scrollbar-visible{opacity:1;visibility:visible}.os-scrollbar-unusable,.os-scrollbar-unusable *,.os-scrollbar-wheel,.os-scrollbar-wheel *{pointer-events:none !important}.os-scrollbar-unusable .os-scrollbar-handle{opacity:0 !important;transition:none !important}.os-scrollbar-horizontal .os-scrollbar-handle{bottom:0;left:calc(var(--os-scroll-percent-directional) * 100%);transform:translateX(calc(var(--os-scroll-percent-directional) * -100%));width:calc(var(--os-viewport-percent) * 100%)}.os-scrollbar-vertical .os-scrollbar-handle{right:0;top:calc(var(--os-scroll-percent-directional) * 100%);transform:translateY(calc(var(--os-scroll-percent-directional) * -100%));height:calc(var(--os-viewport-percent) * 100%)}@supports (container-type: size){.os-scrollbar-track{container-type:size}.os-scrollbar-horizontal .os-scrollbar-handle{left:auto;transform:translateX(calc(var(--os-scroll-percent-directional) * 100cqw + var(--os-scroll-percent-directional) * -100%))}.os-scrollbar-vertical .os-scrollbar-handle{top:auto;transform:translateY(calc(var(--os-scroll-percent-directional) * 100cqh + var(--os-scroll-percent-directional) * -100%))}.os-scrollbar-rtl.os-scrollbar-horizontal .os-scrollbar-handle{right:auto;left:0}}.os-scrollbar-rtl.os-scrollbar-vertical .os-scrollbar-handle{right:auto;left:0}.os-scrollbar.os-scrollbar-horizontal.os-scrollbar-cornerless,.os-scrollbar.os-scrollbar-horizontal.os-scrollbar-cornerless.os-scrollbar-rtl{left:0;right:0}.os-scrollbar.os-scrollbar-vertical.os-scrollbar-cornerless,.os-scrollbar.os-scrollbar-vertical.os-scrollbar-cornerless.os-scrollbar-rtl{top:0;bottom:0}@media print{.os-scrollbar{display:none}}.os-scrollbar{--os-size:0;--os-padding-perpendicular:0;--os-padding-axis:0;--os-track-border-radius:0;--os-track-bg:none;--os-track-bg-hover:none;--os-track-bg-active:none;--os-track-border:none;--os-track-border-hover:none;--os-track-border-active:none;--os-handle-border-radius:0;--os-handle-bg:none;--os-handle-bg-hover:none;--os-handle-bg-active:none;--os-handle-border:none;--os-handle-border-hover:none;--os-handle-border-active:none;--os-handle-min-size:33px;--os-handle-max-size:none;--os-handle-perpendicular-size:100%;--os-handle-perpendicular-size-hover:100%;--os-handle-perpendicular-size-active:100%;--os-handle-interactive-area-offset:0}.os-scrollbar-track{border:var(--os-track-border);border-radius:var(--os-track-border-radius);background:var(--os-track-bg);transition:opacity 0.15s, background-color 0.15s, border-color 0.15s}.os-scrollbar-track:hover{border:var(--os-track-border-hover);background:var(--os-track-bg-hover)}.os-scrollbar-track:active{border:var(--os-track-border-active);background:var(--os-track-bg-active)}.os-scrollbar-handle{border:var(--os-handle-border);border-radius:var(--os-handle-border-radius);background:var(--os-handle-bg)}.os-scrollbar-handle:hover{border:var(--os-handle-border-hover);background:var(--os-handle-bg-hover)}.os-scrollbar-handle:active{border:var(--os-handle-border-active);background:var(--os-handle-bg-active)}.os-scrollbar-track:before,.os-scrollbar-handle:before{content:"";position:absolute;left:0;right:0;top:0;bottom:0;display:block}.os-scrollbar-horizontal{padding:var(--os-padding-perpendicular) var(--os-padding-axis);right:var(--os-size);height:var(--os-size)}.os-scrollbar-horizontal.os-scrollbar-rtl{left:var(--os-size);right:0}.os-scrollbar-horizontal .os-scrollbar-track:before{top:calc(var(--os-padding-perpendicular) * -1);bottom:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-horizontal .os-scrollbar-handle{min-width:var(--os-handle-min-size);max-width:var(--os-handle-max-size);height:var(--os-handle-perpendicular-size);transition:opacity 0.15s, background-color 0.15s, border-color 0.15s, height 0.15s}.os-scrollbar-horizontal .os-scrollbar-handle:before{top:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);bottom:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-horizontal:hover .os-scrollbar-handle{height:var(--os-handle-perpendicular-size-hover)}.os-scrollbar-horizontal:active .os-scrollbar-handle{height:var(--os-handle-perpendicular-size-active)}.os-scrollbar-vertical{padding:var(--os-padding-axis) var(--os-padding-perpendicular);bottom:var(--os-size);width:var(--os-size)}.os-scrollbar-vertical .os-scrollbar-track:before{left:calc(var(--os-padding-perpendicular) * -1);right:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-vertical .os-scrollbar-handle{min-height:var(--os-handle-min-size);max-height:var(--os-handle-max-size);width:var(--os-handle-perpendicular-size);transition:opacity 0.15s, background-color 0.15s, border-color 0.15s, width 0.15s}.os-scrollbar-vertical .os-scrollbar-handle:before{left:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);right:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-vertical.os-scrollbar-rtl .os-scrollbar-handle:before{right:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);left:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-vertical:hover .os-scrollbar-handle{width:var(--os-handle-perpendicular-size-hover)}.os-scrollbar-vertical:active .os-scrollbar-handle{width:var(--os-handle-perpendicular-size-active)}[data-overlayscrollbars-viewport~=measuring]>.os-scrollbar,.os-theme-none.os-scrollbar{display:none !important}.os-theme-dark,.os-theme-light{box-sizing:border-box;--os-size:10px;--os-padding-perpendicular:2px;--os-padding-axis:2px;--os-track-border-radius:10px;--os-handle-interactive-area-offset:4px;--os-handle-border-radius:10px}.os-theme-dark{--os-handle-bg:rgba(0, 0, 0, 0.44);--os-handle-bg-hover:rgba(0, 0, 0, 0.55);--os-handle-bg-active:rgba(0, 0, 0, 0.66)}.os-theme-light{--os-handle-bg:rgba(255, 255, 255, 0.44);--os-handle-bg-hover:rgba(255, 255, 255, 0.55);--os-handle-bg-active:rgba(255, 255, 255, 0.66)}[data-overlayscrollbars-initialize]:not([data-overlayscrollbars-viewport]),[data-overlayscrollbars-viewport~=scrollbarHidden],html[data-overlayscrollbars-viewport~=scrollbarHidden]>body{scrollbar-width:none !important}[data-overlayscrollbars-initialize]:not([data-overlayscrollbars-viewport])::-webkit-scrollbar,[data-overlayscrollbars-initialize]:not([data-overlayscrollbars-viewport])::-webkit-scrollbar-corner,[data-overlayscrollbars-viewport~=scrollbarHidden]::-webkit-scrollbar,[data-overlayscrollbars-viewport~=scrollbarHidden]::-webkit-scrollbar-corner,html[data-overlayscrollbars-viewport~=scrollbarHidden]>body::-webkit-scrollbar,html[data-overlayscrollbars-viewport~=scrollbarHidden]>body::-webkit-scrollbar-corner{-webkit-appearance:none !important;appearance:none !important;display:none !important;width:0 !important;height:0 !important}[data-overlayscrollbars-initialize]:not([data-overlayscrollbars]):not(html):not(body){overflow:auto}:host{display:block;font-family:var(--co-font-family-primary, 'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif)}.co-option-list{display:flex;flex-direction:column;min-width:0}.co-option-list__search{display:flex;align-items:center;gap:var(--co-spacing-sm, 6px);height:32px;box-sizing:border-box;margin:var(--co-spacing-md, 12px) var(--co-spacing-md, 12px) 0;padding:0 var(--co-spacing-sm2, 8px) 0 var(--co-spacing-xs, 4px);border:1px solid var(--co-semantic-border-subtle, rgba(31, 28, 27, 0.08));border-radius:var(--co-border-radius-xs, 8px);color:var(--co-semantic-text-muted, #888888)}.co-option-list__search:focus-within{border-color:var(--co-semantic-border-focus, rgba(31, 28, 27, 0.25))}.co-option-list__search co-icon{flex-shrink:0;width:24px;display:flex;align-items:center;justify-content:center;opacity:0.7}.co-option-list__search-input{flex:1;min-width:0;border:0;outline:none;background:transparent;padding:0;font-family:var(--co-font-family-primary, 'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif);font-size:var(--co-font-size-14, 14px);font-weight:500;letter-spacing:var(--co-font-letter-spacing-body, -0.03em);line-height:1;color:var(--co-semantic-text-default, #1f1c1b)}.co-option-list__search-input::placeholder{color:var(--co-semantic-text-muted, #888888)}.co-option-list__options{max-height:280px;overflow-y:auto;overflow-x:hidden;padding:var(--co-spacing-md, 12px)}.co-option-list__inner{display:flex;flex-direction:column;gap:var(--co-spacing-xxs, 2px);min-width:0}.os-scrollbar.os-theme-co{--os-size:10px;--os-padding-perpendicular:2px;--os-padding-axis:2px;--os-track-bg:transparent;--os-handle-border-radius:var(--co-border-radius-full, 9999px);--os-handle-bg:var(--co-color-opacity-negro-16, rgba(31, 28, 27, 0.16));--os-handle-bg-hover:var(--co-color-opacity-negro-25, rgba(31, 28, 27, 0.25));--os-handle-bg-active:var(--co-color-opacity-negro-50, rgba(31, 28, 27, 0.5));--os-handle-min-size:24px}.co-option-list__option{display:flex;align-items:center;gap:var(--co-spacing-sm2, 8px);min-width:0;min-height:32px;box-sizing:border-box;padding:var(--co-spacing-xs, 4px) var(--co-spacing-sm2, 8px) var(--co-spacing-xs, 4px) var(--co-spacing-xs, 4px);border-radius:var(--co-border-radius-xs, 8px);cursor:pointer;font-size:var(--co-font-size-14, 14px);letter-spacing:var(--co-font-letter-spacing-body, -0.03em);color:var(--co-semantic-text-default, #1f1c1b);transition:background var(--co-motion-duration-fast) var(--co-motion-ease-out)}.co-option-list__spacer .co-option-list__option{height:32px;margin-bottom:var(--co-spacing-xxs, 2px)}.co-option-list__option--active{background:var(--co-semantic-surface-hover, rgba(31, 28, 27, 0.04))}.co-option-list__option--selected{background:var(--co-semantic-surface-hover, rgba(31, 28, 27, 0.04))}.co-option-list__option--disabled{opacity:0.5;cursor:not-allowed}.co-option-list__avatar,.co-option-list__icon{flex-shrink:0}.co-option-list__icon{margin:0 var(--co-spacing-xs, 4px)}.co-option-list__dot{flex-shrink:0;width:10px;height:10px;margin:0 7px;border-radius:var(--co-border-radius-full, 9999px)}.co-option-list__text{display:flex;flex-direction:column;gap:var(--co-spacing-xxs, 2px);flex:1;min-width:0}.co-option-list__title{display:flex;align-items:center;gap:var(--co-spacing-xs, 4px);min-width:0}.co-option-list__label{font-weight:400;line-height:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.co-option-list__suffix{color:var(--co-semantic-text-secondary, #585858);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-shrink:1}.co-option-list__badge{flex-shrink:0;padding:0 var(--co-spacing-xs, 4px);border-radius:var(--co-border-radius-full, 9999px);background:var(--co-semantic-surface-hover, rgba(31, 28, 27, 0.04));color:var(--co-semantic-text-default, #1f1c1b);font-size:var(--co-font-size-10, 10px);font-weight:600;line-height:16px}.co-option-list__desc{font-size:var(--co-font-size-12, 12px);color:var(--co-semantic-text-muted, #888888);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.co-option-list__match{color:var(--co-color-primary-azul, #2563eb);font-weight:700}.co-option-list__check{flex-shrink:0;color:var(--co-semantic-text-default, #1f1c1b)}.co-option-list__row-action{flex-shrink:0;display:inline-flex;align-items:center;border:0;background:transparent;padding:0;cursor:pointer;color:var(--co-semantic-text-muted, #888888);transition:color var(--co-motion-duration-fast) var(--co-motion-ease-out)}.co-option-list__row-action:hover{color:var(--co-semantic-text-default, #1f1c1b)}.co-option-list__drag-handle{display:inline-flex;align-items:center;cursor:grab;color:var(--co-semantic-text-muted);margin-right:var(--co-spacing-xs);flex:0 0 auto}.co-option-list__drag-handle:active{cursor:grabbing}.co-option-list__option--dragging{opacity:0.5}.co-option-list__option--drop-before{box-shadow:inset 0 2px 0 0 var(--co-semantic-border-focus)}.co-option-list__option--drop-after{box-shadow:inset 0 -2px 0 0 var(--co-semantic-border-focus)}.co-option-list__group{padding:var(--co-spacing-sm2, 8px) var(--co-spacing-xs, 4px) var(--co-spacing-xs, 4px);font-family:var(--co-font-family-mono, 'Geist Mono', 'SFMono-Regular', Consolas, 'Liberation Mono', monospace);font-size:var(--co-font-size-10, 10px);font-weight:400;text-transform:uppercase;letter-spacing:var(--co-font-letter-spacing-overline, 0.08em);line-height:1.1;color:var(--co-semantic-text-default, #1f1c1b)}.co-option-list__clear-row{display:flex;align-items:center;gap:var(--co-spacing-sm2, 8px);width:100%;min-height:32px;box-sizing:border-box;border:0;background:transparent;padding:var(--co-spacing-xs, 4px) var(--co-spacing-sm2, 8px);border-radius:var(--co-border-radius-xs, 8px);cursor:pointer;text-align:left;font-family:var(--co-font-family-primary, 'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif);font-size:var(--co-font-size-14, 14px);letter-spacing:var(--co-font-letter-spacing-body, -0.03em);color:var(--co-semantic-text-secondary, #585858)}.co-option-list__clear-row:hover{background:var(--co-semantic-surface-hover, rgba(31, 28, 27, 0.04))}.co-option-list__loading,.co-option-list__loading-more{display:flex;justify-content:center;padding:var(--co-spacing-sm, 6px)}.co-option-list__empty{display:flex;align-items:center;gap:var(--co-spacing-sm2, 8px);padding:var(--co-spacing-md, 12px) var(--co-spacing-xs, 4px);font-size:var(--co-font-size-14, 14px);color:var(--co-semantic-text-muted, #888888)}.co-option-list__more{padding:var(--co-spacing-xs, 4px) var(--co-spacing-sm, 6px);font-size:var(--co-font-size-12, 12px);color:var(--co-semantic-text-muted, #888888);text-align:center}.co-option-list__option:focus-visible,.co-option-list__clear-row:focus-visible{outline:2px solid var(--co-semantic-border-focus, rgba(31, 28, 27, 0.25));outline-offset:-2px}`;
233
+ const coOptionListCss = () => `.os-size-observer,.os-size-observer-listener{scroll-behavior:auto !important;direction:inherit;pointer-events:none;overflow:hidden;visibility:hidden;box-sizing:border-box}.os-size-observer,.os-size-observer-listener,.os-size-observer-listener-item,.os-size-observer-listener-item-final{writing-mode:horizontal-tb;position:absolute;left:0;top:0}.os-size-observer{z-index:-1;contain:strict;display:flex;flex-direction:row;flex-wrap:nowrap;padding:inherit;border:inherit;box-sizing:inherit;margin:-133px;top:0;right:0;bottom:0;left:0;transform:scale(0.1)}.os-size-observer::before{content:"";flex:none;box-sizing:inherit;padding:10px;width:10px;height:10px}.os-size-observer-appear{animation:os-size-observer-appear-animation 1ms forwards}.os-size-observer-listener{box-sizing:border-box;position:relative;flex:auto;padding:inherit;border:inherit;margin:-133px;transform:scale(calc(1 / 0.1))}.os-size-observer-listener.ltr{margin-right:-266px;margin-left:0}.os-size-observer-listener.rtl{margin-left:-266px;margin-right:0}.os-size-observer-listener:empty::before{content:"";width:100%;height:100%}.os-size-observer-listener:empty::before,.os-size-observer-listener>.os-size-observer-listener-item{display:block;position:relative;padding:inherit;border:inherit;box-sizing:content-box;flex:auto}.os-size-observer-listener-scroll{box-sizing:border-box;display:flex}.os-size-observer-listener-item{right:0;bottom:0;overflow:hidden;direction:ltr;flex:none}.os-size-observer-listener-item-final{transition:none}@keyframes os-size-observer-appear-animation{from{cursor:auto}to{cursor:none}}.os-trinsic-observer{flex:none;box-sizing:border-box;position:relative;max-width:0px;max-height:1px;padding:0;margin:0;border:none;overflow:hidden;z-index:-1;height:0;top:calc(100% + 1px);contain:strict}.os-trinsic-observer:not(:empty){height:calc(100% + 1px);top:-1px}.os-trinsic-observer:not(:empty)>.os-size-observer{width:1000%;height:1000%;min-height:1px;min-width:1px}html[data-overlayscrollbars-body]{overflow:hidden}html[data-overlayscrollbars-body],html[data-overlayscrollbars-body]>body{width:100%;height:100%;margin:0}html[data-overlayscrollbars-body]>body{overflow:visible;margin:0}[data-overlayscrollbars]{position:relative}[data-overlayscrollbars~=host],[data-overlayscrollbars-padding]{display:flex;align-items:stretch !important;flex-direction:row !important;flex-wrap:nowrap !important;scroll-behavior:auto !important}[data-overlayscrollbars-padding],[data-overlayscrollbars-viewport]:not([data-overlayscrollbars]){box-sizing:inherit;position:relative;flex:auto;height:auto;width:100%;min-width:0;padding:0;margin:0;border:none;z-index:0}[data-overlayscrollbars-viewport]:not([data-overlayscrollbars]){--os-vaw:0;--os-vah:0;outline:none}[data-overlayscrollbars-viewport]:not([data-overlayscrollbars]):focus{outline:none}[data-overlayscrollbars-viewport][data-overlayscrollbars-viewport~=arrange]::before{content:"";position:absolute;pointer-events:none;z-index:-1;min-width:1px;min-height:1px;width:var(--os-vaw);height:var(--os-vah)}[data-overlayscrollbars~=host],[data-overlayscrollbars-padding]{overflow:hidden !important}[data-overlayscrollbars~=host][data-overlayscrollbars~=noClipping],[data-overlayscrollbars-padding~=noClipping]{overflow:visible !important}[data-overlayscrollbars-viewport]{--os-viewport-overflow-x:hidden;--os-viewport-overflow-y:hidden;overflow-x:var(--os-viewport-overflow-x);overflow-y:var(--os-viewport-overflow-y)}[data-overlayscrollbars-viewport~=overflowXVisible]{--os-viewport-overflow-x:visible}[data-overlayscrollbars-viewport~=overflowXHidden]{--os-viewport-overflow-x:hidden}[data-overlayscrollbars-viewport~=overflowXScroll]{--os-viewport-overflow-x:scroll}[data-overlayscrollbars-viewport~=overflowYVisible]{--os-viewport-overflow-y:visible}[data-overlayscrollbars-viewport~=overflowYHidden]{--os-viewport-overflow-y:hidden}[data-overlayscrollbars-viewport~=overflowYScroll]{--os-viewport-overflow-y:scroll}[data-overlayscrollbars-viewport~=overflowImportant]{overflow-x:var(--os-viewport-overflow-x) !important;overflow-y:var(--os-viewport-overflow-y) !important}[data-overlayscrollbars-viewport~=noContent]:not(#osFakeId){font-size:0 !important;line-height:0 !important}[data-overlayscrollbars-viewport~=noContent]:not(#osFakeId)::before,[data-overlayscrollbars-viewport~=noContent]:not(#osFakeId)::after,[data-overlayscrollbars-viewport~=noContent]:not(#osFakeId)>*:not(#osFakeId){display:none !important;position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border-width:0 !important}[data-overlayscrollbars-viewport~=measuring],[data-overlayscrollbars-viewport~=scrolling]{scroll-behavior:auto !important;scroll-snap-type:none !important}[data-overlayscrollbars-viewport~=measuring][data-overlayscrollbars-viewport~=overflowXVisible]{overflow-x:hidden !important}[data-overlayscrollbars-viewport~=measuring][data-overlayscrollbars-viewport~=overflowYVisible]{overflow-y:hidden !important}[data-overlayscrollbars-content]{box-sizing:inherit}[data-overlayscrollbars-contents]:not(#osFakeId):not([data-overlayscrollbars-padding]):not([data-overlayscrollbars-viewport]):not([data-overlayscrollbars-content]){display:contents}[data-overlayscrollbars-grid],[data-overlayscrollbars-grid] [data-overlayscrollbars-padding]{display:grid;grid-template:1fr/1fr}[data-overlayscrollbars-grid]>[data-overlayscrollbars-padding],[data-overlayscrollbars-grid]>[data-overlayscrollbars-viewport],[data-overlayscrollbars-grid]>[data-overlayscrollbars-padding]>[data-overlayscrollbars-viewport]{height:auto !important;width:auto !important}@property --os-scroll-percent{syntax:"<number>";inherits:true;initial-value:0}@property --os-viewport-percent{syntax:"<number>";inherits:true;initial-value:0}.os-scrollbar{--os-viewport-percent:0;--os-scroll-percent:0;--os-scroll-direction:0;--os-scroll-percent-directional:calc( var(--os-scroll-percent) - (var(--os-scroll-percent) + (1 - var(--os-scroll-percent)) * -1) * var(--os-scroll-direction) )}.os-scrollbar{contain:size layout;contain:size layout style;transition:opacity 0.15s, visibility 0.15s, top 0.15s, right 0.15s, bottom 0.15s, left 0.15s;pointer-events:none;position:absolute;opacity:0;visibility:hidden}body>.os-scrollbar{position:fixed;z-index:99999}.os-scrollbar-transitionless{transition:none !important}.os-scrollbar-track{position:relative;padding:0 !important;border:none !important}.os-scrollbar-handle{position:absolute}.os-scrollbar-track,.os-scrollbar-handle{pointer-events:none;width:100%;height:100%}.os-scrollbar.os-scrollbar-track-interactive .os-scrollbar-track,.os-scrollbar.os-scrollbar-handle-interactive .os-scrollbar-handle{pointer-events:auto;touch-action:none}.os-scrollbar-horizontal{bottom:0;left:0}.os-scrollbar-vertical{top:0;right:0}.os-scrollbar-rtl.os-scrollbar-horizontal{right:0}.os-scrollbar-rtl.os-scrollbar-vertical{right:auto;left:0}.os-scrollbar-visible{opacity:1;visibility:visible}.os-scrollbar-auto-hide.os-scrollbar-auto-hide-hidden{opacity:0;visibility:hidden}.os-scrollbar-interaction.os-scrollbar-visible{opacity:1;visibility:visible}.os-scrollbar-unusable,.os-scrollbar-unusable *,.os-scrollbar-wheel,.os-scrollbar-wheel *{pointer-events:none !important}.os-scrollbar-unusable .os-scrollbar-handle{opacity:0 !important;transition:none !important}.os-scrollbar-horizontal .os-scrollbar-handle{bottom:0;left:calc(var(--os-scroll-percent-directional) * 100%);transform:translateX(calc(var(--os-scroll-percent-directional) * -100%));width:calc(var(--os-viewport-percent) * 100%)}.os-scrollbar-vertical .os-scrollbar-handle{right:0;top:calc(var(--os-scroll-percent-directional) * 100%);transform:translateY(calc(var(--os-scroll-percent-directional) * -100%));height:calc(var(--os-viewport-percent) * 100%)}@supports (container-type: size){.os-scrollbar-track{container-type:size}.os-scrollbar-horizontal .os-scrollbar-handle{left:auto;transform:translateX(calc(var(--os-scroll-percent-directional) * 100cqw + var(--os-scroll-percent-directional) * -100%))}.os-scrollbar-vertical .os-scrollbar-handle{top:auto;transform:translateY(calc(var(--os-scroll-percent-directional) * 100cqh + var(--os-scroll-percent-directional) * -100%))}.os-scrollbar-rtl.os-scrollbar-horizontal .os-scrollbar-handle{right:auto;left:0}}.os-scrollbar-rtl.os-scrollbar-vertical .os-scrollbar-handle{right:auto;left:0}.os-scrollbar.os-scrollbar-horizontal.os-scrollbar-cornerless,.os-scrollbar.os-scrollbar-horizontal.os-scrollbar-cornerless.os-scrollbar-rtl{left:0;right:0}.os-scrollbar.os-scrollbar-vertical.os-scrollbar-cornerless,.os-scrollbar.os-scrollbar-vertical.os-scrollbar-cornerless.os-scrollbar-rtl{top:0;bottom:0}@media print{.os-scrollbar{display:none}}.os-scrollbar{--os-size:0;--os-padding-perpendicular:0;--os-padding-axis:0;--os-track-border-radius:0;--os-track-bg:none;--os-track-bg-hover:none;--os-track-bg-active:none;--os-track-border:none;--os-track-border-hover:none;--os-track-border-active:none;--os-handle-border-radius:0;--os-handle-bg:none;--os-handle-bg-hover:none;--os-handle-bg-active:none;--os-handle-border:none;--os-handle-border-hover:none;--os-handle-border-active:none;--os-handle-min-size:33px;--os-handle-max-size:none;--os-handle-perpendicular-size:100%;--os-handle-perpendicular-size-hover:100%;--os-handle-perpendicular-size-active:100%;--os-handle-interactive-area-offset:0}.os-scrollbar-track{border:var(--os-track-border);border-radius:var(--os-track-border-radius);background:var(--os-track-bg);transition:opacity 0.15s, background-color 0.15s, border-color 0.15s}.os-scrollbar-track:hover{border:var(--os-track-border-hover);background:var(--os-track-bg-hover)}.os-scrollbar-track:active{border:var(--os-track-border-active);background:var(--os-track-bg-active)}.os-scrollbar-handle{border:var(--os-handle-border);border-radius:var(--os-handle-border-radius);background:var(--os-handle-bg)}.os-scrollbar-handle:hover{border:var(--os-handle-border-hover);background:var(--os-handle-bg-hover)}.os-scrollbar-handle:active{border:var(--os-handle-border-active);background:var(--os-handle-bg-active)}.os-scrollbar-track:before,.os-scrollbar-handle:before{content:"";position:absolute;left:0;right:0;top:0;bottom:0;display:block}.os-scrollbar-horizontal{padding:var(--os-padding-perpendicular) var(--os-padding-axis);right:var(--os-size);height:var(--os-size)}.os-scrollbar-horizontal.os-scrollbar-rtl{left:var(--os-size);right:0}.os-scrollbar-horizontal .os-scrollbar-track:before{top:calc(var(--os-padding-perpendicular) * -1);bottom:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-horizontal .os-scrollbar-handle{min-width:var(--os-handle-min-size);max-width:var(--os-handle-max-size);height:var(--os-handle-perpendicular-size);transition:opacity 0.15s, background-color 0.15s, border-color 0.15s, height 0.15s}.os-scrollbar-horizontal .os-scrollbar-handle:before{top:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);bottom:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-horizontal:hover .os-scrollbar-handle{height:var(--os-handle-perpendicular-size-hover)}.os-scrollbar-horizontal:active .os-scrollbar-handle{height:var(--os-handle-perpendicular-size-active)}.os-scrollbar-vertical{padding:var(--os-padding-axis) var(--os-padding-perpendicular);bottom:var(--os-size);width:var(--os-size)}.os-scrollbar-vertical .os-scrollbar-track:before{left:calc(var(--os-padding-perpendicular) * -1);right:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-vertical .os-scrollbar-handle{min-height:var(--os-handle-min-size);max-height:var(--os-handle-max-size);width:var(--os-handle-perpendicular-size);transition:opacity 0.15s, background-color 0.15s, border-color 0.15s, width 0.15s}.os-scrollbar-vertical .os-scrollbar-handle:before{left:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);right:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-vertical.os-scrollbar-rtl .os-scrollbar-handle:before{right:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);left:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-vertical:hover .os-scrollbar-handle{width:var(--os-handle-perpendicular-size-hover)}.os-scrollbar-vertical:active .os-scrollbar-handle{width:var(--os-handle-perpendicular-size-active)}[data-overlayscrollbars-viewport~=measuring]>.os-scrollbar,.os-theme-none.os-scrollbar{display:none !important}.os-theme-dark,.os-theme-light{box-sizing:border-box;--os-size:10px;--os-padding-perpendicular:2px;--os-padding-axis:2px;--os-track-border-radius:10px;--os-handle-interactive-area-offset:4px;--os-handle-border-radius:10px}.os-theme-dark{--os-handle-bg:rgba(0, 0, 0, 0.44);--os-handle-bg-hover:rgba(0, 0, 0, 0.55);--os-handle-bg-active:rgba(0, 0, 0, 0.66)}.os-theme-light{--os-handle-bg:rgba(255, 255, 255, 0.44);--os-handle-bg-hover:rgba(255, 255, 255, 0.55);--os-handle-bg-active:rgba(255, 255, 255, 0.66)}[data-overlayscrollbars-initialize]:not([data-overlayscrollbars-viewport]),[data-overlayscrollbars-viewport~=scrollbarHidden],html[data-overlayscrollbars-viewport~=scrollbarHidden]>body{scrollbar-width:none !important}[data-overlayscrollbars-initialize]:not([data-overlayscrollbars-viewport])::-webkit-scrollbar,[data-overlayscrollbars-initialize]:not([data-overlayscrollbars-viewport])::-webkit-scrollbar-corner,[data-overlayscrollbars-viewport~=scrollbarHidden]::-webkit-scrollbar,[data-overlayscrollbars-viewport~=scrollbarHidden]::-webkit-scrollbar-corner,html[data-overlayscrollbars-viewport~=scrollbarHidden]>body::-webkit-scrollbar,html[data-overlayscrollbars-viewport~=scrollbarHidden]>body::-webkit-scrollbar-corner{-webkit-appearance:none !important;appearance:none !important;display:none !important;width:0 !important;height:0 !important}[data-overlayscrollbars-initialize]:not([data-overlayscrollbars]):not(html):not(body){overflow:auto}:host{display:block;font-family:var(--co-font-family-primary, 'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif)}.co-option-list{display:flex;flex-direction:column;min-width:0}.co-option-list__search{display:flex;align-items:center;gap:var(--co-spacing-sm, 6px);height:32px;box-sizing:border-box;margin:var(--co-spacing-md, 12px) var(--co-spacing-md, 12px) 0;padding:0 var(--co-spacing-sm2, 8px) 0 var(--co-spacing-xs, 4px);border:1px solid var(--co-semantic-border-subtle, rgba(31, 28, 27, 0.08));border-radius:var(--co-border-radius-xs, 8px);color:var(--co-semantic-text-muted, #888888)}.co-option-list__search:focus-within{border-color:var(--co-semantic-border-focus, rgba(31, 28, 27, 0.25))}.co-option-list__search co-icon{flex-shrink:0;width:24px;display:flex;align-items:center;justify-content:center;opacity:0.7}.co-option-list__search-input{flex:1;min-width:0;border:0;outline:none;background:transparent;padding:0;font-family:var(--co-font-family-primary, 'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif);font-size:var(--co-font-size-14, 14px);font-weight:500;letter-spacing:var(--co-font-letter-spacing-body, -0.03em);line-height:1;color:var(--co-semantic-text-default, #1f1c1b)}.co-option-list__search-input::placeholder{color:var(--co-semantic-text-muted, #888888)}.co-option-list__options{max-height:var(--co-option-list-max-height, 280px);overflow-y:auto;overflow-x:hidden;padding:var(--co-spacing-md, 12px)}.co-option-list__inner{display:flex;flex-direction:column;gap:var(--co-spacing-xxs, 2px);min-width:0}.os-scrollbar.os-theme-co{--os-size:10px;--os-padding-perpendicular:2px;--os-padding-axis:2px;--os-track-bg:transparent;--os-handle-border-radius:var(--co-border-radius-full, 9999px);--os-handle-bg:var(--co-color-opacity-negro-16, rgba(31, 28, 27, 0.16));--os-handle-bg-hover:var(--co-color-opacity-negro-25, rgba(31, 28, 27, 0.25));--os-handle-bg-active:var(--co-color-opacity-negro-50, rgba(31, 28, 27, 0.5));--os-handle-min-size:24px}.co-option-list__option{display:flex;align-items:center;gap:var(--co-spacing-sm2, 8px);min-width:0;min-height:32px;box-sizing:border-box;padding:var(--co-spacing-xs, 4px) var(--co-spacing-sm2, 8px) var(--co-spacing-xs, 4px) var(--co-spacing-xs, 4px);border-radius:var(--co-border-radius-xs, 8px);cursor:pointer;font-size:var(--co-font-size-14, 14px);letter-spacing:var(--co-font-letter-spacing-body, -0.03em);color:var(--co-semantic-text-default, #1f1c1b);transition:background var(--co-motion-duration-fast) var(--co-motion-ease-out), opacity var(--co-motion-duration-fast) var(--co-motion-ease-out)}.co-option-list__spacer .co-option-list__option{height:32px;margin-bottom:var(--co-spacing-xxs, 2px)}.co-option-list__option--active{background:var(--co-semantic-surface-hover, rgba(31, 28, 27, 0.04))}.co-option-list__option--selected{background:var(--co-semantic-surface-hover, rgba(31, 28, 27, 0.04))}.co-option-list__option--disabled{opacity:0.5;cursor:not-allowed}.co-option-list__avatar,.co-option-list__icon{flex-shrink:0}.co-option-list__icon{margin:0 var(--co-spacing-xs, 4px)}.co-option-list__dot{flex-shrink:0;width:10px;height:10px;margin:0 7px;border-radius:var(--co-border-radius-full, 9999px)}.co-option-list__text{display:flex;flex-direction:column;gap:var(--co-spacing-xxs, 2px);flex:1;min-width:0}.co-option-list__title{display:flex;align-items:center;gap:var(--co-spacing-xs, 4px);min-width:0}.co-option-list__label{font-weight:400;line-height:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.co-option-list__suffix{color:var(--co-semantic-text-secondary, #585858);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-shrink:1}.co-option-list__badge{flex-shrink:0;padding:0 var(--co-spacing-xs, 4px);border-radius:var(--co-border-radius-full, 9999px);background:var(--co-semantic-surface-hover, rgba(31, 28, 27, 0.04));color:var(--co-semantic-text-default, #1f1c1b);font-size:var(--co-font-size-10, 10px);font-weight:600;line-height:16px}.co-option-list__badge-tip{display:inline-flex;align-items:center;flex-shrink:0}.co-option-list__desc{font-size:var(--co-font-size-12, 12px);color:var(--co-semantic-text-muted, #888888);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.co-option-list__match{color:var(--co-color-primary-azul, #2563eb);font-weight:700}.co-option-list__check{flex-shrink:0;color:var(--co-semantic-text-default, #1f1c1b)}.co-option-list__row-action{flex-shrink:0;display:inline-flex;align-items:center;border:0;background:transparent;padding:0;cursor:pointer;color:var(--co-semantic-text-muted, #888888);transition:color var(--co-motion-duration-fast) var(--co-motion-ease-out)}.co-option-list__row-action:hover{color:var(--co-semantic-text-default, #1f1c1b)}.co-option-list__pin{flex-shrink:0;display:flex;align-items:center;justify-content:center;border:0;padding:var(--co-spacing-xxs, 2px);background:transparent;cursor:pointer;border-radius:var(--co-border-radius-xxs, 4px);color:var(--co-semantic-text-muted, #888888)}.co-option-list__pin:hover{color:var(--co-semantic-text-default, #1f1c1b)}.co-option-list__pin--active{color:var(--co-semantic-text-default, #1f1c1b)}.co-option-list__drag-handle{display:inline-flex;align-items:center;cursor:grab;color:var(--co-semantic-text-muted);margin-right:var(--co-spacing-xs);flex:0 0 auto}.co-option-list__drag-handle:active{cursor:grabbing}.co-option-list__drag-handle{touch-action:none}.co-option-list__option--dragging{opacity:0.5}.co-option-list__option--lifted{position:relative;z-index:2;background:var(--co-semantic-surface-page, #fff);box-shadow:var(--co-shadow-lg);cursor:grabbing}.co-option-list__option--drop-before{box-shadow:inset 0 2px 0 0 var(--co-semantic-border-focus)}.co-option-list__option--drop-after{box-shadow:inset 0 -2px 0 0 var(--co-semantic-border-focus)}.co-option-list__group{padding:var(--co-spacing-sm2, 8px) var(--co-spacing-xs, 4px) var(--co-spacing-xs, 4px);font-family:var(--co-font-family-mono, 'Geist Mono', 'SFMono-Regular', Consolas, 'Liberation Mono', monospace);font-size:var(--co-font-size-10, 10px);font-weight:400;text-transform:uppercase;letter-spacing:var(--co-font-letter-spacing-overline, 0.08em);line-height:1.1;color:var(--co-semantic-text-default, #1f1c1b)}.co-option-list__clear-row{display:flex;align-items:center;gap:var(--co-spacing-sm2, 8px);width:100%;min-height:32px;box-sizing:border-box;border:0;background:transparent;padding:var(--co-spacing-xs, 4px) var(--co-spacing-sm2, 8px);border-radius:var(--co-border-radius-xs, 8px);cursor:pointer;text-align:left;font-family:var(--co-font-family-primary, 'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif);font-size:var(--co-font-size-14, 14px);letter-spacing:var(--co-font-letter-spacing-body, -0.03em);color:var(--co-semantic-text-secondary, #585858)}.co-option-list__clear-row:hover{background:var(--co-semantic-surface-hover, rgba(31, 28, 27, 0.04))}.co-option-list__loading,.co-option-list__loading-more{display:flex;justify-content:center;padding:var(--co-spacing-sm, 6px)}.co-option-list__empty{display:flex;align-items:center;gap:var(--co-spacing-sm2, 8px);padding:var(--co-spacing-md, 12px) var(--co-spacing-xs, 4px);font-size:var(--co-font-size-14, 14px);color:var(--co-semantic-text-muted, #888888)}.co-option-list__more{padding:var(--co-spacing-xs, 4px) var(--co-spacing-sm, 6px);font-size:var(--co-font-size-12, 12px);color:var(--co-semantic-text-muted, #888888);text-align:center}.co-option-list__option:focus-visible,.co-option-list__clear-row:focus-visible{outline:2px solid var(--co-semantic-border-focus, rgba(31, 28, 27, 0.25));outline-offset:-2px}`;
209
234
 
210
235
  const CoOptionList = class {
211
236
  constructor(hostRef) {
@@ -216,6 +241,8 @@ const CoOptionList = class {
216
241
  this.coClearSelection = index.createEvent(this, "coClearSelection", 1);
217
242
  this.coRemoveItem = index.createEvent(this, "coRemoveItem", 1);
218
243
  this.coReorder = index.createEvent(this, "coReorder", 1);
244
+ this.coPinToggle = index.createEvent(this, "coPinToggle", 1);
245
+ this.coListReorder = index.createEvent(this, "coListReorder", 1);
219
246
  // ── Data (controlada) ──────────────────────────────────────
220
247
  /** JSON string o array de OptionListItem. */
221
248
  this.items = '[]';
@@ -232,6 +259,13 @@ const CoOptionList = class {
232
259
  this.removableItems = false;
233
260
  /** Habilita reorder por drag del bloque de seleccionados (selected-first). */
234
261
  this.reorderable = false;
262
+ /** Botón push-pin por fila (siempre visible). Emite coPinToggle; el estado
263
+ * pinned viene en item.pinned — el componente NO lo muta (controlado). */
264
+ this.pinnable = false;
265
+ /** Drag-reorder de la LISTA completa (no del bloque seleccionado): handle en
266
+ * filas no-pineadas, emite coListReorder con el orden visible completo.
267
+ * Independiente de multiple/selectedFirst. No soportado con `virtual`. */
268
+ this.listReorderable = false;
235
269
  // ── Search integrado (opcional) ────────────────────────────
236
270
  this.searchable = false;
237
271
  this.searchPlaceholder = 'Search…';
@@ -271,9 +305,13 @@ const CoOptionList = class {
271
305
  this.overKey = '';
272
306
  /** Dirección del drop sobre overKey (true = el ítem cae DESPUÉS del target). */
273
307
  this.dropAfter = false;
308
+ /** Longitud de lista para la que ya se pidió un fill (ver fillViewport). */
309
+ this.lastFillLen = -1;
274
310
  /** Snapshot selected-first (ver snapshotOrder). */
275
311
  this.sortSnapshot = new Set();
276
312
  this.displaySnapshot = [];
313
+ /** Orden del live-preview en curso (drag por puntero del bloque seleccionado). */
314
+ this.previewOrder = [];
277
315
  /**
278
316
  * Enter sobre un control real (footer, fila clear) activa ese control
279
317
  * nativamente — nunca el highlight (regla heredada de CellRefPicker).
@@ -296,15 +334,95 @@ const CoOptionList = class {
296
334
  const v = e.target.value;
297
335
  this.term = v;
298
336
  this.activeIndex = -1;
337
+ // Resultset nuevo: re-habilita fillViewport aunque venga del mismo largo.
338
+ this.lastFillLen = -1;
299
339
  if (this.debounceTimer)
300
340
  clearTimeout(this.debounceTimer);
301
341
  this.debounceTimer = setTimeout(() => this.coSearch.emit(v), this.searchDebounce);
302
342
  };
343
+ this.onPtrMove = (e) => {
344
+ const d = this.ptrDrag;
345
+ if (!d)
346
+ return;
347
+ if (!d.started) {
348
+ if (Math.abs(e.clientY - d.startY) < 3)
349
+ return; // umbral: no secuestrar clicks
350
+ d.started = true;
351
+ this.dragKey = d.id; // → clase --lifted
352
+ this.previewOrder = d.originOrder;
353
+ this.el.style.userSelect = 'none';
354
+ // Selección fresca fuera del bloque: entra al bloque al levantarla (FLIP),
355
+ // así la geometría de slots (blockTop + i×pitch) vale toda la sesión.
356
+ if (!this.sortSnapshot.has(d.id))
357
+ this.applyPreview([...d.originOrder]);
358
+ }
359
+ e.preventDefault();
360
+ const n = this.previewOrder.length;
361
+ const min = d.blockTop;
362
+ const max = d.blockTop + (n - 1) * d.pitch;
363
+ d.desiredTop = Math.max(min, Math.min(max, e.clientY - d.grabDY));
364
+ this.positionLifted();
365
+ const i = this.previewOrder.indexOf(d.id);
366
+ const j = Math.max(0, Math.min(n - 1, Math.round((d.desiredTop - d.blockTop) / d.pitch)));
367
+ if (j !== i && i !== -1) {
368
+ const next = [...this.previewOrder];
369
+ next.splice(j, 0, next.splice(i, 1)[0]);
370
+ this.applyPreview(next);
371
+ }
372
+ };
373
+ this.onPtrUp = () => {
374
+ const d = this.ptrDrag;
375
+ this.removePtrListeners();
376
+ this.ptrDrag = undefined;
377
+ if (!d || !d.started)
378
+ return;
379
+ // El browser genera un click sintético tras el pointerup del drag; si cae
380
+ // sobre una fila dispara pick() y DESELECCIONA el ítem recién soltado.
381
+ // Supresor de un solo click, auto-removido en el próximo macrotask.
382
+ const suppress = (ev) => { ev.stopPropagation(); ev.preventDefault(); };
383
+ window.addEventListener('click', suppress, true);
384
+ setTimeout(() => window.removeEventListener('click', suppress, true), 0);
385
+ this.settleLifted(d);
386
+ if (this.previewOrder.length && this.previewOrder.join(' ') !== d.originOrder.join(' ')) {
387
+ const byId = new Map(this.displaySnapshot.map((x) => [x._id, x]));
388
+ this.coReorder.emit({ value: this.previewOrder, item: byId.get(d.id) });
389
+ }
390
+ this.previewOrder = [];
391
+ };
392
+ this.onPtrKey = (e) => {
393
+ var _a;
394
+ if (e.key !== 'Escape' || !this.ptrDrag)
395
+ return;
396
+ e.stopPropagation(); // el ESC del drag no debe cerrar el popover host
397
+ e.preventDefault();
398
+ const d = this.ptrDrag;
399
+ this.removePtrListeners();
400
+ this.ptrDrag = undefined;
401
+ if (!d.started)
402
+ return;
403
+ if (this.displaySnapshot !== d.originDisplay) {
404
+ // Hubo preview: restaurar snapshots originales — FLIP con spring para la
405
+ // fila que vuelve (captura ANTES de restaurar, incluye su transform actual).
406
+ this.pendingFlip = { tops: this.captureRowTops(), movedId: d.id, spring: true };
407
+ const row = (_a = this.el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector(`.co-option-list__option[data-id="${CSS.escape(d.id)}"]`);
408
+ if (row) {
409
+ row.style.transition = 'none';
410
+ row.style.transform = '';
411
+ }
412
+ this.displaySnapshot = d.originDisplay;
413
+ this.sortSnapshot = d.originSort;
414
+ this.dragKey = '';
415
+ this.el.style.userSelect = '';
416
+ }
417
+ else {
418
+ this.settleLifted(d);
419
+ }
420
+ this.previewOrder = [];
421
+ };
303
422
  this.handleRowDragEnd = () => { this.resetDragState(); };
304
423
  this.handleRowDragLeave = (e, id) => {
305
- // Limpia el highlight al salir de la fila (evita drop-target stale al pasar sobre
306
- // el bloque no-seleccionado, que no tiene onDragOver). Guard `contains`: dragleave
307
- // también dispara al entrar a un hijo, no solo al salir de la fila.
424
+ // Limpia el highlight al salir de la fila (evita drop-target stale). Guard
425
+ // `contains`: dragleave también dispara al entrar a un hijo de la fila.
308
426
  if (this.overKey === id && !e.currentTarget.contains(e.relatedTarget)) {
309
427
  this.overKey = '';
310
428
  }
@@ -350,6 +468,11 @@ const CoOptionList = class {
350
468
  this.maybeLoadMore(vp.scrollTop, vp.clientHeight, vp.scrollHeight);
351
469
  });
352
470
  }
471
+ this.fillViewport();
472
+ this.runFlip();
473
+ // Re-ancla la fila lifted tras cada re-render del preview: su slot de layout
474
+ // cambió, pero su posición visual la dicta el puntero.
475
+ this.positionLifted();
353
476
  }
354
477
  connectedCallback() {
355
478
  window.addEventListener('mouseup', this.disarmDrag);
@@ -361,6 +484,7 @@ const CoOptionList = class {
361
484
  (_a = this.osInstance) === null || _a === void 0 ? void 0 : _a.destroy();
362
485
  this.osInstance = undefined;
363
486
  window.removeEventListener('mouseup', this.disarmDrag);
487
+ this.removePtrListeners();
364
488
  }
365
489
  onItemsChange() {
366
490
  // Nueva página / nuevos resultados: si autoHighlight, re-resalta la primera fila
@@ -401,6 +525,45 @@ const CoOptionList = class {
401
525
  await new Promise((resolve) => requestAnimationFrame(() => resolve()));
402
526
  }
403
527
  }
528
+ /**
529
+ * Ancla la sesión del panel en la selección: highlight sobre la primera fila
530
+ * seleccionada y scroll hasta dejarla visible (paridad resetActiveIndex de
531
+ * co-select). El host la llama al ABRIR su panel — la lista queda montada
532
+ * entre aperturas y no sabe cuándo se abre (mismo contrato que
533
+ * focusSearch/snapshotOrder). Espera layout real igual que focusSearch: el
534
+ * panel se hace visible frames después y un scroll sobre subtree oculto se
535
+ * clampea a 0 en silencio.
536
+ */
537
+ async scrollToSelected() {
538
+ var _a, _b, _c, _d;
539
+ const idx = selectedActiveIndex(this.orderedItems, this.selectedIds);
540
+ if (idx === -1)
541
+ return;
542
+ this.activeIndex = idx;
543
+ for (let i = 0; i < 20; i++) {
544
+ const vp = (_b = (_a = this.osInstance) === null || _a === void 0 ? void 0 : _a.elements().viewport) !== null && _b !== void 0 ? _b : this.optionsEl;
545
+ if (vp && vp.clientHeight > 0) {
546
+ if (this.virtual) {
547
+ // Fila fuera del slice virtual: no hay nodo al que hacer scrollIntoView —
548
+ // misma matemática 'nearest' que co-select, sobre la ventana virtual.
549
+ const rowTop = idx * VIRTUAL_ITEM_HEIGHT;
550
+ let target = vp.scrollTop;
551
+ if (rowTop < target)
552
+ target = rowTop;
553
+ else if (rowTop + VIRTUAL_ITEM_HEIGHT > target + vp.clientHeight) {
554
+ target = rowTop + VIRTUAL_ITEM_HEIGHT - vp.clientHeight;
555
+ }
556
+ this.scrollTop = target;
557
+ vp.scrollTop = target;
558
+ }
559
+ else {
560
+ (_d = (_c = this.el.shadowRoot) === null || _c === void 0 ? void 0 : _c.getElementById(`co-optlist-${idx}`)) === null || _d === void 0 ? void 0 : _d.scrollIntoView({ block: 'nearest' });
561
+ }
562
+ return;
563
+ }
564
+ await new Promise((resolve) => requestAnimationFrame(() => resolve()));
565
+ }
566
+ }
404
567
  /** Navegación para hosts con input externo. true = tecla consumida (host hace preventDefault). */
405
568
  async handleKey(e) {
406
569
  return this.processKey(e.key);
@@ -471,6 +634,16 @@ const CoOptionList = class {
471
634
  }
472
635
  }
473
636
  // ── Reorder (drag del bloque selected-first) ───────────────
637
+ /** true = drag de lista completa; el modo selected-block (chips multiple) tiene prioridad
638
+ * si ambos están activos (no coexisten en la práctica). */
639
+ get listDragActive() {
640
+ return this.listReorderable && !(this.reorderable && this.selectedFirst);
641
+ }
642
+ /** Universo del drag de LISTA COMPLETA (listReorderable). El bloque
643
+ * seleccionado usa `previewOrder` (live-preview, ver handleRowDragStart). */
644
+ dragOrderIds() {
645
+ return this.orderedItems.map((i) => i._id);
646
+ }
474
647
  handleRowDragStart(e, id) {
475
648
  if (this.armedKey !== id) {
476
649
  e.preventDefault();
@@ -491,22 +664,179 @@ const CoOptionList = class {
491
664
  this.overKey = id;
492
665
  // Dirección: al arrastrar hacia abajo (from<to) el ítem cae DESPUÉS del target
493
666
  // (semántica de reorderIds) → el indicador va en el borde inferior; hacia arriba, superior.
494
- const ids = this.displaySnapshot.map((d) => d._id);
667
+ const ids = this.dragOrderIds();
495
668
  this.dropAfter = ids.indexOf(this.dragKey) < ids.indexOf(id);
496
669
  }
670
+ // ── Drag por puntero (bloque seleccionado, estilo motion.dev) ──
671
+ // La fila agarrada sigue al puntero 1:1 (transform, sin el ghost nativo del
672
+ // browser) con lift (sombra + escala); las demás se apartan EN VIVO con FLIP.
673
+ // Soltar confirma (emite coReorder); ESC revierte con settle.
674
+ /** Aplica un orden de preview al bloque seleccionado con FLIP (todo ease-out;
675
+ * la fila lifted queda fuera del FLIP — su posición la dicta el puntero). */
676
+ applyPreview(next) {
677
+ this.pendingFlip = { tops: this.captureRowTops(), movedId: this.dragKey, spring: false };
678
+ const byId = new Map(this.orderedItems.map((i) => [i._id, i]));
679
+ for (const d of this.displaySnapshot)
680
+ if (!byId.has(d._id))
681
+ byId.set(d._id, d);
682
+ this.sortSnapshot = new Set(next);
683
+ this.displaySnapshot = next.map((x) => byId.get(x)).filter(Boolean);
684
+ this.previewOrder = next;
685
+ }
686
+ startPointerDrag(e, id) {
687
+ var _a;
688
+ if (e.button !== 0 || this.ptrDrag)
689
+ return;
690
+ const order = liveSelectedOrder(this.orderedItems, this.selectedIds);
691
+ if (!order.includes(id))
692
+ return;
693
+ const row = e.currentTarget.closest('.co-option-list__option');
694
+ if (!row)
695
+ return;
696
+ e.preventDefault();
697
+ e.stopPropagation();
698
+ const rect = row.getBoundingClientRect();
699
+ // Pitch MEDIDO de la lista real (alto de fila + gap): las filas de este
700
+ // panel son content-driven (nombre + email ≈ 44px), NO el alto fijo de la
701
+ // lista virtual — asumir VIRTUAL_ITEM_HEIGHT desvía el slot y la fila
702
+ // aterriza fuera de lugar al soltar.
703
+ const rows = (_a = this.el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelectorAll('.co-option-list__option[data-id]');
704
+ const first = rows === null || rows === void 0 ? void 0 : rows[0];
705
+ const pitch = (rows && rows.length >= 2)
706
+ ? rows[1].getBoundingClientRect().top - rows[0].getBoundingClientRect().top
707
+ : rect.height || VIRTUAL_ITEM_HEIGHT;
708
+ // Top geométrico del slot 0: primera fila renderizada − su índice × pitch
709
+ // (la fila agarrada puede vivir FUERA del bloque si es una selección
710
+ // fresca, por eso no sirve de ancla).
711
+ const firstIdx = first ? this.orderedItems.findIndex((i) => i._id === first.dataset.id) : 0;
712
+ const blockTop = first
713
+ ? first.getBoundingClientRect().top - Math.max(0, firstIdx) * pitch
714
+ : rect.top;
715
+ this.ptrDrag = {
716
+ id,
717
+ grabDY: e.clientY - rect.top,
718
+ blockTop,
719
+ pitch,
720
+ originOrder: order,
721
+ originDisplay: this.displaySnapshot,
722
+ originSort: this.sortSnapshot,
723
+ desiredTop: rect.top,
724
+ startY: e.clientY,
725
+ started: false,
726
+ };
727
+ window.addEventListener('pointermove', this.onPtrMove);
728
+ window.addEventListener('pointerup', this.onPtrUp);
729
+ window.addEventListener('keydown', this.onPtrKey, true);
730
+ }
731
+ /** Posiciona la fila lifted bajo el puntero (transform sobre su slot de layout). */
732
+ positionLifted() {
733
+ var _a;
734
+ const d = this.ptrDrag;
735
+ if (!d || !d.started)
736
+ return;
737
+ const row = (_a = this.el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector(`.co-option-list__option[data-id="${CSS.escape(d.id)}"]`);
738
+ if (!row)
739
+ return;
740
+ const idx = this.previewOrder.indexOf(d.id);
741
+ if (idx === -1)
742
+ return;
743
+ const layoutTop = d.blockTop + idx * d.pitch;
744
+ row.style.transition = 'none';
745
+ row.style.transform = `translateY(${d.desiredTop - layoutTop}px) scale(1.02)`;
746
+ }
747
+ /** Settle de la fila lifted: de su posición visual actual a su slot, con spring. */
748
+ settleLifted(d) {
749
+ var _a;
750
+ const row = (_a = this.el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector(`.co-option-list__option[data-id="${CSS.escape(d.id)}"]`);
751
+ const done = () => {
752
+ this.dragKey = '';
753
+ this.el.style.userSelect = '';
754
+ };
755
+ if (!row) {
756
+ done();
757
+ return;
758
+ }
759
+ row.style.transition = 'transform var(--co-motion-duration-base) var(--co-motion-ease-spring)';
760
+ row.style.transform = '';
761
+ row.addEventListener('transitionend', () => { row.style.transition = ''; done(); }, { once: true });
762
+ }
763
+ removePtrListeners() {
764
+ window.removeEventListener('pointermove', this.onPtrMove);
765
+ window.removeEventListener('pointerup', this.onPtrUp);
766
+ window.removeEventListener('keydown', this.onPtrKey, true);
767
+ }
497
768
  handleRowDrop(e, id) {
498
769
  e.preventDefault();
499
770
  e.stopPropagation();
500
771
  const fromId = this.dragKey;
501
- const order = this.displaySnapshot.map((d) => d._id);
772
+ const order = this.dragOrderIds();
502
773
  this.resetDragState();
503
- // Solo reordenar dentro del bloque seleccionado
504
774
  if (fromId === id || !order.includes(fromId) || !order.includes(id))
505
775
  return;
506
- const next = reorderIds(order, fromId, id);
507
- const byId = new Map(this.displaySnapshot.map((d) => [d._id, d]));
508
- this.displaySnapshot = next.map((x) => byId.get(x)); // reflow en vivo del panel
509
- this.coReorder.emit({ value: next, item: byId.get(fromId) });
776
+ const byId = new Map(this.orderedItems.map((i) => [i._id, i]));
777
+ const next = listReorderIds(order, fromId, id, (x) => { var _a; return !!((_a = byId.get(x)) === null || _a === void 0 ? void 0 : _a.pinned); });
778
+ if (next === order)
779
+ return; // extremo pineado o no-op
780
+ this.coListReorder.emit({ value: next, item: byId.get(fromId) });
781
+ }
782
+ captureRowTops() {
783
+ var _a;
784
+ const tops = new Map();
785
+ (_a = this.el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelectorAll('.co-option-list__option[data-id]').forEach((row) => tops.set(row.dataset.id, row.getBoundingClientRect().top));
786
+ return tops;
787
+ }
788
+ /**
789
+ * FLIP de cada reacomodo (swap del live-preview y revert): las filas arrancan
790
+ * desplazadas a su posición visual anterior (transform) y transicionan a la
791
+ * nueva. Solo transform, con tokens de motion (reduced-motion se resuelve
792
+ * global vía zeroing). Swaps mid-drag: todo ease-out (fluido, sin rebote);
793
+ * spring solo para la fila movida en el settle del revert.
794
+ * Batcheado (writes → reads → writes, un solo flush) y robusto a interrupciones:
795
+ * neutraliza transforms de un FLIP anterior ANTES de medir el layout nuevo.
796
+ */
797
+ runFlip() {
798
+ var _a, _b, _c;
799
+ if (!this.pendingFlip)
800
+ return;
801
+ const { tops, movedId, spring } = this.pendingFlip;
802
+ this.pendingFlip = undefined;
803
+ const rows = Array.from((_b = (_a = this.el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelectorAll('.co-option-list__option[data-id]')) !== null && _b !== void 0 ? _b : []);
804
+ // La fila lifted (drag por puntero activo) queda FUERA del FLIP: su posición
805
+ // la dicta el puntero (positionLifted re-ancla tras el render).
806
+ const liftedId = ((_c = this.ptrDrag) === null || _c === void 0 ? void 0 : _c.started) ? this.ptrDrag.id : null;
807
+ for (const row of rows) {
808
+ if (row.dataset.id === liftedId)
809
+ continue;
810
+ row.style.transition = 'none';
811
+ row.style.transform = '';
812
+ }
813
+ const moves = [];
814
+ for (const row of rows) {
815
+ const id = row.dataset.id;
816
+ if (id === liftedId)
817
+ continue;
818
+ const first = tops.get(id);
819
+ if (first === undefined)
820
+ continue;
821
+ const delta = first - row.getBoundingClientRect().top;
822
+ if (delta)
823
+ moves.push({ row, delta, spring: spring && id === movedId });
824
+ }
825
+ for (const { row, delta } of moves)
826
+ row.style.transform = `translateY(${delta}px)`;
827
+ for (const row of rows) {
828
+ if (row.dataset.id === liftedId)
829
+ continue;
830
+ const mv = moves.find((m) => m.row === row);
831
+ if (!mv) {
832
+ row.style.transition = '';
833
+ continue;
834
+ }
835
+ const ease = mv.spring ? 'var(--co-motion-ease-spring)' : 'var(--co-motion-ease-out)';
836
+ row.style.transition = `transform var(--co-motion-duration-base) ${ease}`;
837
+ row.style.transform = '';
838
+ row.addEventListener('transitionend', () => { row.style.transition = ''; }, { once: true });
839
+ }
510
840
  }
511
841
  resetDragState() {
512
842
  this.armedKey = '';
@@ -521,6 +851,30 @@ const CoOptionList = class {
521
851
  if (hasMore && scrollTop + clientHeight >= scrollHeight - 40)
522
852
  this.coLoadMore.emit();
523
853
  }
854
+ /** El infinite scroll asume que cada página desborda el contenedor. Con
855
+ * paneles altos (--co-option-list-max-height) una página puede caber entera
856
+ * → sin overflow no hay evento de scroll y la paginación queda muerta. Tras
857
+ * cada render, si el contenido no deja distancia scrolleable (mismo slack
858
+ * de 40px que maybeLoadMore) y hay más resultados, pide otra página. Se
859
+ * emite UNA vez por longitud de lista: si el host no responde no re-emite,
860
+ * y el append de la página siguiente re-habilita el check. */
861
+ fillViewport() {
862
+ var _a, _b;
863
+ const count = this.parsedItems.length;
864
+ if (this.loading || count === 0 || count === this.lastFillLen)
865
+ return;
866
+ const { hasMore } = deriveMore(count, this.total, this.hasMore);
867
+ if (!hasMore)
868
+ return;
869
+ const vp = (_b = (_a = this.osInstance) === null || _a === void 0 ? void 0 : _a.elements().viewport) !== null && _b !== void 0 ? _b : this.optionsEl;
870
+ // clientHeight 0 = panel oculto/sin layout: las métricas mienten, no pedir.
871
+ if (!vp || vp.clientHeight === 0)
872
+ return;
873
+ if (vp.scrollHeight - vp.clientHeight <= 40) {
874
+ this.lastFillLen = count;
875
+ this.coLoadMore.emit();
876
+ }
877
+ }
524
878
  scrollActiveIntoView() {
525
879
  requestAnimationFrame(() => {
526
880
  var _a, _b;
@@ -545,18 +899,34 @@ const CoOptionList = class {
545
899
  return label;
546
900
  return [seg.pre, index.h("span", { class: "co-option-list__match" }, seg.match), seg.post];
547
901
  }
902
+ /** Pill junto al label. Con `tooltip` va envuelto en un `co-tooltip` — el
903
+ * label del badge se abrevia (3 letras en el de workspace) y sin el texto
904
+ * completo al hover no hay forma de saber a qué se refiere. Sin `tooltip`
905
+ * renderiza el span pelado, igual que antes (mismo patrón que la prop
906
+ * `name` de co-avatar). */
907
+ renderBadge(badge) {
908
+ const pill = (index.h("span", { class: "co-option-list__badge", style: badge.color ? { backgroundColor: badge.color, color: 'var(--co-color-base-blanco, #fff)' } : undefined }, badge.label));
909
+ if (!badge.tooltip)
910
+ return pill;
911
+ return (index.h("co-tooltip", { class: "co-option-list__badge-tip", content: badge.tooltip }, pill));
912
+ }
548
913
  renderRow(item, index$1, selectedIds) {
549
914
  const isSelected = selectedIds.includes(item._id);
550
- const canDrag = this.reorderable && this.selectedFirst && isSelected && !this.term;
915
+ // Dos modos de drag EXCLUYENTES: bloque seleccionado = drag por puntero
916
+ // (motion.dev-like); lista completa (listReorderable) = HTML5 DnD con
917
+ // indicador de línea.
918
+ const ptrDragRow = !this.listDragActive && this.reorderable && this.selectedFirst && isSelected && !this.term;
919
+ const listDragRow = this.listDragActive && !item.pinned && !this.term;
551
920
  return (index.h("div", { class: {
552
921
  'co-option-list__option': true,
553
922
  'co-option-list__option--selected': isSelected,
554
923
  'co-option-list__option--active': index$1 === this.activeIndex,
555
924
  'co-option-list__option--disabled': !!item.disabled,
556
- 'co-option-list__option--dragging': this.dragKey === item._id,
557
- 'co-option-list__option--drop-before': this.overKey === item._id && !this.dropAfter,
558
- 'co-option-list__option--drop-after': this.overKey === item._id && this.dropAfter,
559
- }, key: item._id, id: `co-optlist-${index$1}`, role: "option", "aria-selected": isSelected ? 'true' : 'false', "aria-disabled": item.disabled ? 'true' : 'false', draggable: canDrag && this.armedKey === item._id, onClick: () => !item.disabled && this.pick(item), onMouseEnter: () => { this.activeIndex = index$1; }, onDragStart: canDrag ? (e) => this.handleRowDragStart(e, item._id) : undefined, onDragOver: canDrag ? (e) => this.handleRowDragOver(e, item._id) : undefined, onDrop: canDrag ? (e) => this.handleRowDrop(e, item._id) : undefined, onDragEnd: canDrag ? this.handleRowDragEnd : undefined, onDragLeave: canDrag ? (e) => this.handleRowDragLeave(e, item._id) : undefined }, canDrag && (index.h("span", { class: "co-option-list__drag-handle", part: "drag-handle", title: "Drag to reorder", onMouseDown: () => (this.armedKey = item._id), onClick: (e) => e.stopPropagation() }, index.h("co-icon", { name: "dots-six-vertical", size: 16 }))), this.renderLeading(item), index.h("div", { class: "co-option-list__text" }, index.h("span", { class: "co-option-list__title" }, index.h("span", { class: "co-option-list__label", style: item.labelColor ? { color: item.labelColor, fontWeight: '600' } : undefined }, this.renderLabelText(item.label)), item.suffix && index.h("span", { class: "co-option-list__suffix" }, "- ", item.suffix), item.badge && (index.h("span", { class: "co-option-list__badge", style: item.badge.color ? { backgroundColor: item.badge.color, color: 'var(--co-color-base-blanco, #fff)' } : undefined }, item.badge.label))), item.description && index.h("span", { class: "co-option-list__desc" }, item.description)), isSelected && this.removableItems && this.multiple && (index.h("button", { class: "co-option-list__row-action", type: "button", tabIndex: -1, "aria-label": `Remove ${item.label}`, onClick: (e) => { e.stopPropagation(); this.coRemoveItem.emit(item._id); } }, index.h("co-icon", { name: "x-circle", size: 16, weight: "fill" }))), isSelected && !this.removableItems && this.selectedAffordance === 'deselect' && (index.h("button", { class: "co-option-list__row-action", type: "button", tabIndex: -1, "aria-label": `Deselect ${item.label}`, onClick: (e) => { e.stopPropagation(); this.deselectItem(item); } }, index.h("co-icon", { name: "x-circle", size: 16, weight: "fill" }))), isSelected && !this.removableItems && this.selectedAffordance === 'check' && (index.h("co-icon", { name: "check", size: 16, class: "co-option-list__check" }))));
925
+ 'co-option-list__option--dragging': this.listDragActive && this.dragKey === item._id,
926
+ 'co-option-list__option--lifted': !this.listDragActive && this.dragKey === item._id,
927
+ 'co-option-list__option--drop-before': this.listDragActive && this.overKey === item._id && !this.dropAfter,
928
+ 'co-option-list__option--drop-after': this.listDragActive && this.overKey === item._id && this.dropAfter,
929
+ }, key: item._id, id: `co-optlist-${index$1}`, "data-id": item._id, role: "option", "aria-selected": isSelected ? 'true' : 'false', "aria-disabled": item.disabled ? 'true' : 'false', draggable: listDragRow && this.armedKey === item._id, onClick: () => !item.disabled && this.pick(item), onMouseEnter: () => { this.activeIndex = index$1; }, onDragStart: listDragRow ? (e) => this.handleRowDragStart(e, item._id) : undefined, onDragOver: listDragRow ? (e) => this.handleRowDragOver(e, item._id) : undefined, onDrop: listDragRow ? (e) => this.handleRowDrop(e, item._id) : undefined, onDragEnd: listDragRow ? this.handleRowDragEnd : undefined, onDragLeave: listDragRow ? (e) => this.handleRowDragLeave(e, item._id) : undefined }, (ptrDragRow || listDragRow) && (index.h("span", { class: "co-option-list__drag-handle", part: "drag-handle", title: "Drag to reorder", onMouseDown: listDragRow ? () => (this.armedKey = item._id) : undefined, onPointerDown: ptrDragRow ? (e) => this.startPointerDrag(e, item._id) : undefined, onClick: (e) => e.stopPropagation() }, index.h("co-icon", { name: "dots-six-vertical", size: 16 }))), this.renderLeading(item), index.h("div", { class: "co-option-list__text" }, index.h("span", { class: "co-option-list__title" }, index.h("span", { class: "co-option-list__label", style: item.labelColor ? { color: item.labelColor, fontWeight: '600' } : undefined }, this.renderLabelText(item.label)), item.suffix && index.h("span", { class: "co-option-list__suffix" }, "- ", item.suffix), item.badge && this.renderBadge(item.badge)), item.description && index.h("span", { class: "co-option-list__desc" }, item.description)), this.pinnable && (index.h("button", { class: { 'co-option-list__pin': true, 'co-option-list__pin--active': !!item.pinned }, type: "button", tabIndex: -1, "aria-label": item.pinned ? `Unpin ${item.label}` : `Pin ${item.label}`, "aria-pressed": item.pinned ? 'true' : 'false', onClick: (e) => { e.stopPropagation(); this.coPinToggle.emit({ item }); } }, index.h("co-icon", { name: "push-pin", size: 16, weight: item.pinned ? 'fill' : 'regular' }))), isSelected && this.removableItems && this.multiple && (index.h("button", { class: "co-option-list__row-action", type: "button", tabIndex: -1, "aria-label": `Remove ${item.label}`, onClick: (e) => { e.stopPropagation(); this.coRemoveItem.emit(item._id); } }, index.h("co-icon", { name: "x-circle", size: 16, weight: "fill" }))), isSelected && !this.removableItems && this.selectedAffordance === 'deselect' && (index.h("button", { class: "co-option-list__row-action", type: "button", tabIndex: -1, "aria-label": `Deselect ${item.label}`, onClick: (e) => { e.stopPropagation(); this.deselectItem(item); } }, index.h("co-icon", { name: "x-circle", size: 16, weight: "fill" }))), isSelected && !this.removableItems && this.selectedAffordance === 'check' && (index.h("co-icon", { name: "check", size: 16, class: "co-option-list__check" }))));
560
930
  }
561
931
  renderVirtual(items, selectedIds) {
562
932
  const { totalHeight, startIdx, endIdx, offsetY } = virtualSlice(this.scrollTop, items.length);
@@ -567,11 +937,11 @@ const CoOptionList = class {
567
937
  const selectedIds = this.selectedIds;
568
938
  const { hasMore, remaining } = deriveMore(this.parsedItems.length, this.total, this.hasMore);
569
939
  const showClear = !!this.clearOptionLabel && selectedIds.length > 0;
570
- return (index.h("div", { key: '1002a1993d3a13db23898cba6b8bd14aade3d8ac', class: "co-option-list", onKeyDown: this.onRootKeyDown }, this.searchable && (index.h("div", { key: 'a3f6d8a19f4dc7d7aac1898b053de0ccabc5ce6d', class: "co-option-list__search", part: "search" }, index.h("co-icon", { key: 'a3972500879ae7e5941841a13bf03af6dccc10f0', name: "magnifying-glass", size: 16 }), index.h("input", { key: '37861b77d5848ad9b8d0cfaf7c7ac2699e51000f', class: "co-option-list__search-input", type: "text", placeholder: this.searchPlaceholder, value: this.term, onInput: this.onSearchInput, ref: (el) => (this.searchInputEl = el), role: "combobox", "aria-expanded": "true", "aria-autocomplete": "list" }))), index.h("div", { key: '652fbbbbb6145c8c6bffc354a1435c09bc3a4e62', class: "co-option-list__options", part: "options", role: "listbox", "aria-multiselectable": this.multiple ? 'true' : 'false', ref: (el) => (this.optionsEl = el), onScroll: this.onNativeScroll }, index.h("div", { key: 'e0b68873c27f2d08a9edc0196384b3f75bd95e05', class: "co-option-list__inner" }, showClear && (index.h("button", { key: '7e4716349f9af4980fac732fdfe4013fc81e7b18', class: "co-option-list__clear-row", type: "button", onClick: () => this.coClearSelection.emit() }, index.h("co-icon", { key: '3d23e2a85e9387f364b0a5c705ca034020c83e43', name: "x-circle", size: 14 }), index.h("span", { key: '8fcc642763adbba7ca79507d53f18de157c61443' }, this.clearOptionLabel))), this.loading && items.length === 0 && (index.h("div", { key: '3ea9842f365d5e51338ff5799fccb27ca7bfe466', class: "co-option-list__loading" }, index.h("co-loader", { key: '306972ee829c41ae32ba69bd02b4dec839842a03', size: "sm" }))), !this.loading && items.length === 0 && (index.h("div", { key: 'b184393bc7348370fc6fc84ff7a38584a7fc2fd5', class: "co-option-list__empty" }, index.h("co-icon", { key: '39e9e495a62f285d22bbb5197227d48a52dd5c40', name: "magnifying-glass", size: 20 }), index.h("span", { key: '6faefea453fbf0ce3083c863b9c822a1902466b3' }, this.emptyMessage))), items.length > 0 && this.virtual
940
+ return (index.h("div", { key: 'a5754821517230b914fd9f23b024afc523e4ee9d', class: "co-option-list", onKeyDown: this.onRootKeyDown }, this.searchable && (index.h("div", { key: '9988f2e6834b5c8cf4c4832d609fb6665c9a46cc', class: "co-option-list__search", part: "search" }, index.h("co-icon", { key: '8b8f2e72fb6f9aa9b498455757aefe943627af80', name: "magnifying-glass", size: 16 }), index.h("input", { key: 'e434b657655cb855ef77611671db90a7e8f78850', class: "co-option-list__search-input", type: "text", placeholder: this.searchPlaceholder, value: this.term, onInput: this.onSearchInput, ref: (el) => (this.searchInputEl = el), role: "combobox", "aria-expanded": "true", "aria-autocomplete": "list" }))), index.h("div", { key: '9e3c8ff1cb005274b74cf50b1c8db469958bbfc0', class: "co-option-list__options", part: "options", role: "listbox", "aria-multiselectable": this.multiple ? 'true' : 'false', ref: (el) => (this.optionsEl = el), onScroll: this.onNativeScroll }, index.h("div", { key: '8087c3de1d857b562918a358f98a7a195cbe66d7', class: "co-option-list__inner" }, showClear && (index.h("button", { key: 'b067aedd7e0dbb29db12c35d0d217147359bc5f7', class: "co-option-list__clear-row", type: "button", onClick: () => this.coClearSelection.emit() }, index.h("co-icon", { key: '406e84a7bcc5d8509383527caa0f49d5f93fda53', name: "x-circle", size: 14 }), index.h("span", { key: '9347b010b58d51363a68aab65781cae7de31cca1' }, this.clearOptionLabel))), this.loading && items.length === 0 && (index.h("div", { key: '774fcb348a3553a945b70de822621ee24e410808', class: "co-option-list__loading" }, index.h("co-loader", { key: 'f760bf3ec0b27cfd0c57e2a56a613b8390faa935', size: "sm" }))), !this.loading && items.length === 0 && (index.h("div", { key: 'f018550513d4057bdbddaf64846ba7d4cd016a45', class: "co-option-list__empty" }, index.h("co-icon", { key: '7925a8b7c385389b1d59548d5d550a0d7f0d163e', name: "magnifying-glass", size: 20 }), index.h("span", { key: 'b31e52eef274434599db7ff217a9bfc634ebdf7f' }, this.emptyMessage))), items.length > 0 && this.virtual
571
941
  ? this.renderVirtual(items, selectedIds)
572
942
  : buildRows(items).map((row) => row.kind === 'header'
573
943
  ? index.h("div", { class: "co-option-list__group", role: "presentation" }, row.label)
574
- : this.renderRow(row.item, row.index, selectedIds)), this.loading && items.length > 0 && (index.h("div", { key: '9a4cc5cf05196070febf62c6bf309b45fe8f5974', class: "co-option-list__loading-more" }, index.h("co-loader", { key: '0eb546749b37b5cd83d88bc6c40b34b3b5b04532', size: "sm" }))), !this.loading && hasMore && remaining > 0 && (index.h("div", { key: '06c4deab21fe6c56dcda175ba9b4f37add4c2e8a', class: "co-option-list__more" }, remaining, " more results")))), index.h("slot", { key: 'eaa788987749e25086a3be92df591e767c33c65b', name: "footer" })));
944
+ : this.renderRow(row.item, row.index, selectedIds)), this.loading && items.length > 0 && (index.h("div", { key: '7de231a83a96a2aca0cb240a68c3c9e6ab9b475c', class: "co-option-list__loading-more" }, index.h("co-loader", { key: '087234fb45c3cbea3bd3f2888957d3b2751753ad', size: "sm" }))), !this.loading && hasMore && remaining > 0 && (index.h("div", { key: '456bc75bb53a3f0d01f7fd850ca4b8227baf326d', class: "co-option-list__more" }, remaining, " more results")))), index.h("slot", { key: '2935b1dd65ec2409c18c3f72e0200d5ed1c19323', name: "footer" })));
575
945
  }
576
946
  get el() { return index.getElement(this); }
577
947
  static get watchers() { return {