@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.
- package/custom-elements.json +375 -25
- package/dist/cjs/co-audio-player.cjs.entry.js +107 -18
- package/dist/cjs/co-avatar_2.cjs.entry.js +7 -31
- package/dist/cjs/co-button.cjs.entry.js +6 -4
- package/dist/cjs/co-calendar-month_2.cjs.entry.js +59 -2
- package/dist/cjs/co-checkbox.cjs.entry.js +10 -4
- package/dist/cjs/co-chip_2.cjs.entry.js +388 -18
- package/dist/cjs/co-color-picker.cjs.entry.js +36 -3
- package/dist/cjs/co-combobox.cjs.entry.js +44 -4
- package/dist/cjs/co-event-popover.cjs.entry.js +5 -2
- package/dist/cjs/co-file-field.cjs.entry.js +12 -6
- package/dist/cjs/co-icon-button.cjs.entry.js +5 -2
- package/dist/cjs/co-icon.cjs.entry.js +17 -1
- package/dist/cjs/co-input.cjs.entry.js +21 -1
- package/dist/cjs/co-loader.cjs.entry.js +1 -1
- package/dist/cjs/co-number-field.cjs.entry.js +22 -2
- package/dist/cjs/co-ref-field.cjs.entry.js +99 -13
- package/dist/cjs/co-select.cjs.entry.js +273 -8
- package/dist/cjs/co-tags-field.cjs.entry.js +1 -1
- package/dist/cjs/cobalt.cjs.js +1 -1
- package/dist/cjs/color-YhUkm10t.js +32 -0
- package/dist/cjs/fieldChip-BLzo9MEV.js +7 -0
- package/dist/cjs/index-DK-2Lzmf.js +4 -4
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cobalt/cobalt.esm.js +1 -1
- package/dist/cobalt/p-0c463d9a.entry.js +1 -0
- package/dist/cobalt/{p-3ced4269.entry.js → p-2828ecf6.entry.js} +1 -1
- package/dist/cobalt/p-2f88d151.entry.js +1 -0
- package/dist/cobalt/p-409f28bb.entry.js +1 -0
- package/dist/cobalt/{p-18af9e44.entry.js → p-568cfe8d.entry.js} +1 -1
- package/dist/cobalt/p-6bf814f9.entry.js +1 -0
- package/dist/cobalt/p-76420ac1.entry.js +1 -0
- package/dist/cobalt/p-7ea87b75.entry.js +1 -0
- package/dist/cobalt/p-8b4b3589.entry.js +1 -0
- package/dist/cobalt/p-93c68029.entry.js +1 -0
- package/dist/cobalt/p-BG4WRR22.js +1 -0
- package/dist/cobalt/p-a2d31248.entry.js +1 -0
- package/dist/cobalt/p-bcedbd73.entry.js +1 -0
- package/dist/cobalt/p-dfd25f1d.entry.js +1 -0
- package/dist/cobalt/p-e364b8a5.entry.js +1 -0
- package/dist/cobalt/p-e84eda2e.entry.js +1 -0
- package/dist/cobalt/p-f25967fb.entry.js +1 -0
- package/dist/cobalt/p-f5f1b463.entry.js +1 -0
- package/dist/cobalt/p-fef5db54.entry.js +1 -0
- package/dist/cobalt/p-mAGnZXRn.js +1 -0
- package/dist/collection/components/co-audio-player/co-audio-player.js +81 -17
- package/dist/collection/components/co-audio-player/co-audio-player.utils.js +27 -2
- package/dist/collection/components/co-autocomplete/co-autocomplete.js +1 -1
- package/dist/collection/components/co-avatar/co-avatar.js +5 -1
- package/dist/collection/components/co-avatar-group/co-avatar-group.js +1 -1
- package/dist/collection/components/co-button/co-button.css +7 -0
- package/dist/collection/components/co-button/co-button.js +7 -5
- package/dist/collection/components/co-calendar-month/co-calendar-month.js +59 -2
- package/dist/collection/components/co-checkbox/co-checkbox.css +22 -0
- package/dist/collection/components/co-checkbox/co-checkbox.js +9 -3
- package/dist/collection/components/co-checkbox-group/co-checkbox-group.js +1 -1
- package/dist/collection/components/co-color-picker/co-color-picker.css +7 -0
- package/dist/collection/components/co-color-picker/co-color-picker.js +35 -2
- package/dist/collection/components/co-combobox/co-combobox.css +7 -0
- package/dist/collection/components/co-combobox/co-combobox.js +44 -4
- package/dist/collection/components/co-command-search/co-command-search.js +1 -1
- package/dist/collection/components/co-data-table/co-data-table.js +1 -1
- package/dist/collection/components/co-date-range-picker/co-date-range-picker.js +2 -2
- package/dist/collection/components/co-event-popover/co-event-popover.js +5 -2
- package/dist/collection/components/co-file-field/co-file-field.css +2 -0
- package/dist/collection/components/co-file-field/co-file-field.js +8 -5
- package/dist/collection/components/co-icon/iconLoader.js +17 -1
- package/dist/collection/components/co-icon-button/co-icon-button.css +7 -0
- package/dist/collection/components/co-icon-button/co-icon-button.js +6 -3
- package/dist/collection/components/co-input/co-input.css +13 -0
- package/dist/collection/components/co-input/co-input.js +21 -0
- package/dist/collection/components/co-loader/co-loader.css +5 -3
- package/dist/collection/components/co-number-field/co-number-field.js +23 -2
- package/dist/collection/components/co-option-list/co-option-list.css +45 -2
- package/dist/collection/components/co-option-list/co-option-list.js +468 -18
- package/dist/collection/components/co-option-list/optionListLogic.js +25 -0
- package/dist/collection/components/co-popover/co-popover.js +1 -1
- package/dist/collection/components/co-radio-group/co-radio-group.js +1 -1
- package/dist/collection/components/co-ref-field/co-ref-field.css +49 -0
- package/dist/collection/components/co-ref-field/co-ref-field.js +252 -12
- package/dist/collection/components/co-segmented-bar/co-segmented-bar.js +1 -1
- package/dist/collection/components/co-select/co-select.css +19 -0
- package/dist/collection/components/co-select/co-select.js +275 -9
- package/dist/collection/components/co-sidebar-nav/co-sidebar-nav.js +1 -1
- package/dist/collection/components/co-toast/co-toast.js +2 -2
- package/dist/collection/components/co-transfer-list/co-transfer-list.js +1 -1
- package/dist/collection/utils/fieldChip.js +1 -1
- package/dist/collection/utils/fileI18n.js +3 -0
- package/dist/components/co-accordion.js +1 -1
- package/dist/components/co-action-bar.js +1 -1
- package/dist/components/co-audio-player.js +1 -1
- package/dist/components/co-autocomplete.js +1 -1
- package/dist/components/co-avatar-group.js +1 -1
- package/dist/components/co-avatar.js +1 -1
- package/dist/components/co-breadcrumb-item.js +1 -1
- package/dist/components/co-breadcrumb.js +1 -1
- package/dist/components/co-button.js +1 -1
- package/dist/components/co-calendar-month.js +1 -1
- package/dist/components/co-calendar-timegrid.js +1 -1
- package/dist/components/co-calendar.js +1 -1
- package/dist/components/co-carousel.js +1 -1
- package/dist/components/co-checkbox-group.js +1 -1
- package/dist/components/co-checkbox.js +1 -1
- package/dist/components/co-chip.js +1 -1
- package/dist/components/co-color-picker.js +1 -1
- package/dist/components/co-column-picker.js +1 -1
- package/dist/components/co-combobox.js +1 -1
- package/dist/components/co-command-search.js +1 -1
- package/dist/components/co-data-table-pagination.js +1 -1
- package/dist/components/co-data-table.js +1 -1
- package/dist/components/co-date-field.js +1 -1
- package/dist/components/co-date-picker.js +1 -1
- package/dist/components/co-date-range-picker.js +1 -1
- package/dist/components/co-date-range.js +1 -1
- package/dist/components/co-date-time-picker.js +1 -1
- package/dist/components/co-drawer.js +1 -1
- package/dist/components/co-drive-card.js +1 -1
- package/dist/components/co-drop-zone.js +1 -1
- package/dist/components/co-emoji-picker.js +1 -1
- package/dist/components/co-empty-state.js +1 -1
- package/dist/components/co-event-calendar.js +1 -1
- package/dist/components/co-event-popover.js +1 -1
- package/dist/components/co-fab.js +1 -1
- package/dist/components/co-file-field.js +1 -1
- package/dist/components/co-file-type-tile.js +1 -1
- package/dist/components/co-helper-text.js +1 -1
- package/dist/components/co-icon-button.js +1 -1
- package/dist/components/co-icon.js +1 -1
- package/dist/components/co-input.js +1 -1
- package/dist/components/co-json-field.js +1 -1
- package/dist/components/co-lightbox.js +1 -1
- package/dist/components/co-list-footer.js +1 -1
- package/dist/components/co-list-item.js +1 -1
- package/dist/components/co-loader.js +1 -1
- package/dist/components/co-menu-item.js +1 -1
- package/dist/components/co-modal.js +1 -1
- package/dist/components/co-number-field.js +1 -1
- package/dist/components/co-option-list.js +1 -1
- package/dist/components/co-page-header.js +1 -1
- package/dist/components/co-phone-field.js +1 -1
- package/dist/components/co-radio-group.js +1 -1
- package/dist/components/co-rating.js +1 -1
- package/dist/components/co-ref-field.js +1 -1
- package/dist/components/co-rich-text-editor.js +1 -1
- package/dist/components/co-rich-text-toolbar.js +1 -1
- package/dist/components/co-select.js +1 -1
- package/dist/components/co-sidebar-nav.js +1 -1
- package/dist/components/co-slider.js +1 -1
- package/dist/components/co-switch.js +1 -1
- package/dist/components/co-tab.js +1 -1
- package/dist/components/co-tags-field.js +1 -1
- package/dist/components/co-textarea.js +1 -1
- package/dist/components/co-toast.js +1 -1
- package/dist/components/co-toggle-button.js +1 -1
- package/dist/components/co-transfer-list.js +1 -1
- package/dist/components/co-video.js +1 -1
- package/dist/components/{p-CklsvHeL.js → p-B0Dc-I_C.js} +1 -1
- package/dist/components/{p-DzoNGEDU.js → p-BH184F0X.js} +1 -1
- package/dist/components/{p-BGD3oQ73.js → p-BHYtxTzM.js} +1 -1
- package/dist/components/{p-mom5kiBa.js → p-BTQEg3UO.js} +1 -1
- package/dist/components/p-BZIB4JDs.js +1 -0
- package/dist/components/p-Bbny3WUc.js +1 -0
- package/dist/components/{p-D5QJpmqf.js → p-Bxk96Zgc.js} +1 -1
- package/dist/components/p-C1Kv3zYZ.js +1 -0
- package/dist/components/p-C4U2tbRp.js +1 -0
- package/dist/components/{p-CyMaOb1j.js → p-CA_JAK9s.js} +1 -1
- package/dist/components/{p-AvSaw4Ua.js → p-CR0izsJC.js} +1 -1
- package/dist/components/p-CuZXTvDM.js +1 -0
- package/dist/components/{p-_131DL6m.js → p-D4qzGifz.js} +1 -1
- package/dist/components/{p-BsQQ7Mki.js → p-D5EdMieb.js} +1 -1
- package/dist/components/p-Dabi98BI.js +1 -0
- package/dist/components/p-DbipMAyT.js +1 -0
- package/dist/components/p-DgUBcJIS.js +1 -0
- package/dist/components/p-Dj1EZ5qD.js +1 -0
- package/dist/components/{p-DkmKOF60.js → p-P8wvwhM2.js} +1 -1
- package/dist/components/{p-nwy6X1QT.js → p-hfGFsvaD.js} +1 -1
- package/dist/esm/co-audio-player.entry.js +107 -18
- package/dist/esm/co-avatar_2.entry.js +6 -30
- package/dist/esm/co-button.entry.js +6 -4
- package/dist/esm/co-calendar-month_2.entry.js +59 -2
- package/dist/esm/co-checkbox.entry.js +10 -4
- package/dist/esm/co-chip_2.entry.js +388 -18
- package/dist/esm/co-color-picker.entry.js +36 -3
- package/dist/esm/co-combobox.entry.js +44 -4
- package/dist/esm/co-event-popover.entry.js +5 -2
- package/dist/esm/co-file-field.entry.js +12 -6
- package/dist/esm/co-icon-button.entry.js +5 -2
- package/dist/esm/co-icon.entry.js +17 -1
- package/dist/esm/co-input.entry.js +21 -1
- package/dist/esm/co-loader.entry.js +1 -1
- package/dist/esm/co-number-field.entry.js +22 -2
- package/dist/esm/co-ref-field.entry.js +99 -13
- package/dist/esm/co-select.entry.js +273 -8
- package/dist/esm/co-tags-field.entry.js +1 -1
- package/dist/esm/cobalt.js +1 -1
- package/dist/esm/color-BG4WRR22.js +30 -0
- package/dist/esm/fieldChip-DsAfq1e0.js +5 -0
- package/dist/esm/index-CrtiywTB.js +4 -4
- package/dist/esm/loader.js +1 -1
- package/dist/types/components/co-audio-player/co-audio-player.d.ts +13 -0
- package/dist/types/components/co-audio-player/co-audio-player.utils.d.ts +18 -1
- package/dist/types/components/co-button/co-button.d.ts +3 -1
- package/dist/types/components/co-calendar-month/co-calendar-month.d.ts +7 -0
- package/dist/types/components/co-checkbox/co-checkbox.d.ts +1 -0
- package/dist/types/components/co-color-picker/co-color-picker.d.ts +15 -0
- package/dist/types/components/co-combobox/co-combobox.d.ts +17 -0
- package/dist/types/components/co-icon-button/co-icon-button.d.ts +3 -0
- package/dist/types/components/co-input/co-input.d.ts +9 -0
- package/dist/types/components/co-number-field/co-number-field.d.ts +9 -0
- package/dist/types/components/co-option-list/co-option-list.d.ts +79 -0
- package/dist/types/components/co-option-list/optionListLogic.d.ts +23 -1
- package/dist/types/components/co-ref-field/co-ref-field.d.ts +46 -0
- package/dist/types/components/co-select/co-select.d.ts +67 -0
- package/dist/types/components.d.ts +110 -4
- package/dist/types/utils/fieldChip.d.ts +5 -0
- package/dist/types/utils/fileI18n.d.ts +1 -0
- package/package.json +4 -4
- package/dist/cjs/fieldChip-xNJPEFcS.js +0 -7
- package/dist/cobalt/p-02ac492f.entry.js +0 -1
- package/dist/cobalt/p-0ccb672b.entry.js +0 -1
- package/dist/cobalt/p-2d81b292.entry.js +0 -1
- package/dist/cobalt/p-4a503187.entry.js +0 -1
- package/dist/cobalt/p-55566b37.entry.js +0 -1
- package/dist/cobalt/p-680d3db8.entry.js +0 -1
- package/dist/cobalt/p-7457aa89.entry.js +0 -1
- package/dist/cobalt/p-77719335.entry.js +0 -1
- package/dist/cobalt/p-8f600512.entry.js +0 -1
- package/dist/cobalt/p-CQAYgqA6.js +0 -1
- package/dist/cobalt/p-a02db338.entry.js +0 -1
- package/dist/cobalt/p-a51d8775.entry.js +0 -1
- package/dist/cobalt/p-aafb9d11.entry.js +0 -1
- package/dist/cobalt/p-b28dc0fe.entry.js +0 -1
- package/dist/cobalt/p-c6b9b9d6.entry.js +0 -1
- package/dist/cobalt/p-d4debd6f.entry.js +0 -1
- package/dist/cobalt/p-d629fb4e.entry.js +0 -1
- package/dist/components/p-B3TkpLNh.js +0 -1
- package/dist/components/p-B7hvddnu.js +0 -1
- package/dist/components/p-BT5tSgZa.js +0 -1
- package/dist/components/p-CXLX8DpD.js +0 -1
- package/dist/components/p-DTvb412h.js +0 -1
- package/dist/components/p-DvhR3H61.js +0 -1
- package/dist/components/p-KWTokD0C.js +0 -1
- package/dist/components/p-Q6caHt79.js +0 -1
- package/dist/components/p-WWlZiln1.js +0 -1
- package/dist/esm/fieldChip-BZDUy9Z-.js +0 -5
|
@@ -161,6 +161,17 @@ function buildRows(items) {
|
|
|
161
161
|
}
|
|
162
162
|
/** Mueve `fromId` a la posición de `toId` en `order`. No muta el input;
|
|
163
163
|
* devuelve el mismo array (referencia) si es no-op. */
|
|
164
|
+
/**
|
|
165
|
+
* Universo del drag del bloque seleccionado: los ids seleccionados VIVOS en su
|
|
166
|
+
* orden visible. A diferencia del snapshot (congelado al abrir), incluye lo
|
|
167
|
+
* seleccionado durante la sesión del panel — sin esto, esos ítems renderizan
|
|
168
|
+
* handle pero el drop los rechaza, y un reorder del snapshot emitiría un value
|
|
169
|
+
* truncado (pierde las selecciones frescas).
|
|
170
|
+
*/
|
|
171
|
+
function liveSelectedOrder(items, selectedIds) {
|
|
172
|
+
const sel = new Set(selectedIds);
|
|
173
|
+
return items.filter((i) => sel.has(i._id)).map((i) => i._id);
|
|
174
|
+
}
|
|
164
175
|
function reorderIds(order, fromId, toId) {
|
|
165
176
|
if (fromId === toId)
|
|
166
177
|
return order;
|
|
@@ -172,6 +183,13 @@ function reorderIds(order, fromId, toId) {
|
|
|
172
183
|
next.splice(to, 0, next.splice(from, 1)[0]);
|
|
173
184
|
return next;
|
|
174
185
|
}
|
|
186
|
+
/** Reorder de lista completa: los extremos pineados son inválidos (ni origen ni
|
|
187
|
+
* destino) — devuelve la misma referencia, señal de no-op para el caller. */
|
|
188
|
+
function listReorderIds(order, fromId, toId, isPinned) {
|
|
189
|
+
if (isPinned(fromId) || isPinned(toId))
|
|
190
|
+
return order;
|
|
191
|
+
return reorderIds(order, fromId, toId);
|
|
192
|
+
}
|
|
175
193
|
/** Siguiente highlight: wrap, salta disabled. -1 = sin items navegables. */
|
|
176
194
|
function nextActiveIndex(current, delta, items) {
|
|
177
195
|
const positions = [];
|
|
@@ -186,6 +204,13 @@ function nextActiveIndex(current, delta, items) {
|
|
|
186
204
|
return delta === 1 ? positions[0] : positions[positions.length - 1];
|
|
187
205
|
return positions[(at + delta + positions.length) % positions.length];
|
|
188
206
|
}
|
|
207
|
+
/** Highlight inicial de la sesión del panel: primera fila seleccionada
|
|
208
|
+
* NAVEGABLE en orden visible (contrato de scrollToSelected, paridad
|
|
209
|
+
* resetActiveIndex de co-select). -1 = nada que anclar. */
|
|
210
|
+
function selectedActiveIndex(items, selectedIds) {
|
|
211
|
+
const sel = new Set(selectedIds);
|
|
212
|
+
return items.findIndex((it) => sel.has(it._id) && !it.disabled);
|
|
213
|
+
}
|
|
189
214
|
/** `total > 0` tiene precedencia (deriva remaining); si no, vale `hasMoreProp`. */
|
|
190
215
|
function deriveMore(count, total, hasMoreProp) {
|
|
191
216
|
if (total > 0)
|
|
@@ -203,7 +228,7 @@ function virtualSlice(scrollTop, count) {
|
|
|
203
228
|
return { totalHeight, startIdx, endIdx, offsetY: startIdx * VIRTUAL_ITEM_HEIGHT };
|
|
204
229
|
}
|
|
205
230
|
|
|
206
|
-
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}`;
|
|
231
|
+
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}`;
|
|
207
232
|
|
|
208
233
|
const CoOptionList = class {
|
|
209
234
|
constructor(hostRef) {
|
|
@@ -214,6 +239,8 @@ const CoOptionList = class {
|
|
|
214
239
|
this.coClearSelection = createEvent(this, "coClearSelection", 1);
|
|
215
240
|
this.coRemoveItem = createEvent(this, "coRemoveItem", 1);
|
|
216
241
|
this.coReorder = createEvent(this, "coReorder", 1);
|
|
242
|
+
this.coPinToggle = createEvent(this, "coPinToggle", 1);
|
|
243
|
+
this.coListReorder = createEvent(this, "coListReorder", 1);
|
|
217
244
|
// ── Data (controlada) ──────────────────────────────────────
|
|
218
245
|
/** JSON string o array de OptionListItem. */
|
|
219
246
|
this.items = '[]';
|
|
@@ -230,6 +257,13 @@ const CoOptionList = class {
|
|
|
230
257
|
this.removableItems = false;
|
|
231
258
|
/** Habilita reorder por drag del bloque de seleccionados (selected-first). */
|
|
232
259
|
this.reorderable = false;
|
|
260
|
+
/** Botón push-pin por fila (siempre visible). Emite coPinToggle; el estado
|
|
261
|
+
* pinned viene en item.pinned — el componente NO lo muta (controlado). */
|
|
262
|
+
this.pinnable = false;
|
|
263
|
+
/** Drag-reorder de la LISTA completa (no del bloque seleccionado): handle en
|
|
264
|
+
* filas no-pineadas, emite coListReorder con el orden visible completo.
|
|
265
|
+
* Independiente de multiple/selectedFirst. No soportado con `virtual`. */
|
|
266
|
+
this.listReorderable = false;
|
|
233
267
|
// ── Search integrado (opcional) ────────────────────────────
|
|
234
268
|
this.searchable = false;
|
|
235
269
|
this.searchPlaceholder = 'Search…';
|
|
@@ -269,9 +303,13 @@ const CoOptionList = class {
|
|
|
269
303
|
this.overKey = '';
|
|
270
304
|
/** Dirección del drop sobre overKey (true = el ítem cae DESPUÉS del target). */
|
|
271
305
|
this.dropAfter = false;
|
|
306
|
+
/** Longitud de lista para la que ya se pidió un fill (ver fillViewport). */
|
|
307
|
+
this.lastFillLen = -1;
|
|
272
308
|
/** Snapshot selected-first (ver snapshotOrder). */
|
|
273
309
|
this.sortSnapshot = new Set();
|
|
274
310
|
this.displaySnapshot = [];
|
|
311
|
+
/** Orden del live-preview en curso (drag por puntero del bloque seleccionado). */
|
|
312
|
+
this.previewOrder = [];
|
|
275
313
|
/**
|
|
276
314
|
* Enter sobre un control real (footer, fila clear) activa ese control
|
|
277
315
|
* nativamente — nunca el highlight (regla heredada de CellRefPicker).
|
|
@@ -294,15 +332,95 @@ const CoOptionList = class {
|
|
|
294
332
|
const v = e.target.value;
|
|
295
333
|
this.term = v;
|
|
296
334
|
this.activeIndex = -1;
|
|
335
|
+
// Resultset nuevo: re-habilita fillViewport aunque venga del mismo largo.
|
|
336
|
+
this.lastFillLen = -1;
|
|
297
337
|
if (this.debounceTimer)
|
|
298
338
|
clearTimeout(this.debounceTimer);
|
|
299
339
|
this.debounceTimer = setTimeout(() => this.coSearch.emit(v), this.searchDebounce);
|
|
300
340
|
};
|
|
341
|
+
this.onPtrMove = (e) => {
|
|
342
|
+
const d = this.ptrDrag;
|
|
343
|
+
if (!d)
|
|
344
|
+
return;
|
|
345
|
+
if (!d.started) {
|
|
346
|
+
if (Math.abs(e.clientY - d.startY) < 3)
|
|
347
|
+
return; // umbral: no secuestrar clicks
|
|
348
|
+
d.started = true;
|
|
349
|
+
this.dragKey = d.id; // → clase --lifted
|
|
350
|
+
this.previewOrder = d.originOrder;
|
|
351
|
+
this.el.style.userSelect = 'none';
|
|
352
|
+
// Selección fresca fuera del bloque: entra al bloque al levantarla (FLIP),
|
|
353
|
+
// así la geometría de slots (blockTop + i×pitch) vale toda la sesión.
|
|
354
|
+
if (!this.sortSnapshot.has(d.id))
|
|
355
|
+
this.applyPreview([...d.originOrder]);
|
|
356
|
+
}
|
|
357
|
+
e.preventDefault();
|
|
358
|
+
const n = this.previewOrder.length;
|
|
359
|
+
const min = d.blockTop;
|
|
360
|
+
const max = d.blockTop + (n - 1) * d.pitch;
|
|
361
|
+
d.desiredTop = Math.max(min, Math.min(max, e.clientY - d.grabDY));
|
|
362
|
+
this.positionLifted();
|
|
363
|
+
const i = this.previewOrder.indexOf(d.id);
|
|
364
|
+
const j = Math.max(0, Math.min(n - 1, Math.round((d.desiredTop - d.blockTop) / d.pitch)));
|
|
365
|
+
if (j !== i && i !== -1) {
|
|
366
|
+
const next = [...this.previewOrder];
|
|
367
|
+
next.splice(j, 0, next.splice(i, 1)[0]);
|
|
368
|
+
this.applyPreview(next);
|
|
369
|
+
}
|
|
370
|
+
};
|
|
371
|
+
this.onPtrUp = () => {
|
|
372
|
+
const d = this.ptrDrag;
|
|
373
|
+
this.removePtrListeners();
|
|
374
|
+
this.ptrDrag = undefined;
|
|
375
|
+
if (!d || !d.started)
|
|
376
|
+
return;
|
|
377
|
+
// El browser genera un click sintético tras el pointerup del drag; si cae
|
|
378
|
+
// sobre una fila dispara pick() y DESELECCIONA el ítem recién soltado.
|
|
379
|
+
// Supresor de un solo click, auto-removido en el próximo macrotask.
|
|
380
|
+
const suppress = (ev) => { ev.stopPropagation(); ev.preventDefault(); };
|
|
381
|
+
window.addEventListener('click', suppress, true);
|
|
382
|
+
setTimeout(() => window.removeEventListener('click', suppress, true), 0);
|
|
383
|
+
this.settleLifted(d);
|
|
384
|
+
if (this.previewOrder.length && this.previewOrder.join(' ') !== d.originOrder.join(' ')) {
|
|
385
|
+
const byId = new Map(this.displaySnapshot.map((x) => [x._id, x]));
|
|
386
|
+
this.coReorder.emit({ value: this.previewOrder, item: byId.get(d.id) });
|
|
387
|
+
}
|
|
388
|
+
this.previewOrder = [];
|
|
389
|
+
};
|
|
390
|
+
this.onPtrKey = (e) => {
|
|
391
|
+
var _a;
|
|
392
|
+
if (e.key !== 'Escape' || !this.ptrDrag)
|
|
393
|
+
return;
|
|
394
|
+
e.stopPropagation(); // el ESC del drag no debe cerrar el popover host
|
|
395
|
+
e.preventDefault();
|
|
396
|
+
const d = this.ptrDrag;
|
|
397
|
+
this.removePtrListeners();
|
|
398
|
+
this.ptrDrag = undefined;
|
|
399
|
+
if (!d.started)
|
|
400
|
+
return;
|
|
401
|
+
if (this.displaySnapshot !== d.originDisplay) {
|
|
402
|
+
// Hubo preview: restaurar snapshots originales — FLIP con spring para la
|
|
403
|
+
// fila que vuelve (captura ANTES de restaurar, incluye su transform actual).
|
|
404
|
+
this.pendingFlip = { tops: this.captureRowTops(), movedId: d.id, spring: true };
|
|
405
|
+
const row = (_a = this.el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector(`.co-option-list__option[data-id="${CSS.escape(d.id)}"]`);
|
|
406
|
+
if (row) {
|
|
407
|
+
row.style.transition = 'none';
|
|
408
|
+
row.style.transform = '';
|
|
409
|
+
}
|
|
410
|
+
this.displaySnapshot = d.originDisplay;
|
|
411
|
+
this.sortSnapshot = d.originSort;
|
|
412
|
+
this.dragKey = '';
|
|
413
|
+
this.el.style.userSelect = '';
|
|
414
|
+
}
|
|
415
|
+
else {
|
|
416
|
+
this.settleLifted(d);
|
|
417
|
+
}
|
|
418
|
+
this.previewOrder = [];
|
|
419
|
+
};
|
|
301
420
|
this.handleRowDragEnd = () => { this.resetDragState(); };
|
|
302
421
|
this.handleRowDragLeave = (e, id) => {
|
|
303
|
-
// Limpia el highlight al salir de la fila (evita drop-target stale
|
|
304
|
-
//
|
|
305
|
-
// también dispara al entrar a un hijo, no solo al salir de la fila.
|
|
422
|
+
// Limpia el highlight al salir de la fila (evita drop-target stale). Guard
|
|
423
|
+
// `contains`: dragleave también dispara al entrar a un hijo de la fila.
|
|
306
424
|
if (this.overKey === id && !e.currentTarget.contains(e.relatedTarget)) {
|
|
307
425
|
this.overKey = '';
|
|
308
426
|
}
|
|
@@ -348,6 +466,11 @@ const CoOptionList = class {
|
|
|
348
466
|
this.maybeLoadMore(vp.scrollTop, vp.clientHeight, vp.scrollHeight);
|
|
349
467
|
});
|
|
350
468
|
}
|
|
469
|
+
this.fillViewport();
|
|
470
|
+
this.runFlip();
|
|
471
|
+
// Re-ancla la fila lifted tras cada re-render del preview: su slot de layout
|
|
472
|
+
// cambió, pero su posición visual la dicta el puntero.
|
|
473
|
+
this.positionLifted();
|
|
351
474
|
}
|
|
352
475
|
connectedCallback() {
|
|
353
476
|
window.addEventListener('mouseup', this.disarmDrag);
|
|
@@ -359,6 +482,7 @@ const CoOptionList = class {
|
|
|
359
482
|
(_a = this.osInstance) === null || _a === void 0 ? void 0 : _a.destroy();
|
|
360
483
|
this.osInstance = undefined;
|
|
361
484
|
window.removeEventListener('mouseup', this.disarmDrag);
|
|
485
|
+
this.removePtrListeners();
|
|
362
486
|
}
|
|
363
487
|
onItemsChange() {
|
|
364
488
|
// Nueva página / nuevos resultados: si autoHighlight, re-resalta la primera fila
|
|
@@ -399,6 +523,45 @@ const CoOptionList = class {
|
|
|
399
523
|
await new Promise((resolve) => requestAnimationFrame(() => resolve()));
|
|
400
524
|
}
|
|
401
525
|
}
|
|
526
|
+
/**
|
|
527
|
+
* Ancla la sesión del panel en la selección: highlight sobre la primera fila
|
|
528
|
+
* seleccionada y scroll hasta dejarla visible (paridad resetActiveIndex de
|
|
529
|
+
* co-select). El host la llama al ABRIR su panel — la lista queda montada
|
|
530
|
+
* entre aperturas y no sabe cuándo se abre (mismo contrato que
|
|
531
|
+
* focusSearch/snapshotOrder). Espera layout real igual que focusSearch: el
|
|
532
|
+
* panel se hace visible frames después y un scroll sobre subtree oculto se
|
|
533
|
+
* clampea a 0 en silencio.
|
|
534
|
+
*/
|
|
535
|
+
async scrollToSelected() {
|
|
536
|
+
var _a, _b, _c, _d;
|
|
537
|
+
const idx = selectedActiveIndex(this.orderedItems, this.selectedIds);
|
|
538
|
+
if (idx === -1)
|
|
539
|
+
return;
|
|
540
|
+
this.activeIndex = idx;
|
|
541
|
+
for (let i = 0; i < 20; i++) {
|
|
542
|
+
const vp = (_b = (_a = this.osInstance) === null || _a === void 0 ? void 0 : _a.elements().viewport) !== null && _b !== void 0 ? _b : this.optionsEl;
|
|
543
|
+
if (vp && vp.clientHeight > 0) {
|
|
544
|
+
if (this.virtual) {
|
|
545
|
+
// Fila fuera del slice virtual: no hay nodo al que hacer scrollIntoView —
|
|
546
|
+
// misma matemática 'nearest' que co-select, sobre la ventana virtual.
|
|
547
|
+
const rowTop = idx * VIRTUAL_ITEM_HEIGHT;
|
|
548
|
+
let target = vp.scrollTop;
|
|
549
|
+
if (rowTop < target)
|
|
550
|
+
target = rowTop;
|
|
551
|
+
else if (rowTop + VIRTUAL_ITEM_HEIGHT > target + vp.clientHeight) {
|
|
552
|
+
target = rowTop + VIRTUAL_ITEM_HEIGHT - vp.clientHeight;
|
|
553
|
+
}
|
|
554
|
+
this.scrollTop = target;
|
|
555
|
+
vp.scrollTop = target;
|
|
556
|
+
}
|
|
557
|
+
else {
|
|
558
|
+
(_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' });
|
|
559
|
+
}
|
|
560
|
+
return;
|
|
561
|
+
}
|
|
562
|
+
await new Promise((resolve) => requestAnimationFrame(() => resolve()));
|
|
563
|
+
}
|
|
564
|
+
}
|
|
402
565
|
/** Navegación para hosts con input externo. true = tecla consumida (host hace preventDefault). */
|
|
403
566
|
async handleKey(e) {
|
|
404
567
|
return this.processKey(e.key);
|
|
@@ -469,6 +632,16 @@ const CoOptionList = class {
|
|
|
469
632
|
}
|
|
470
633
|
}
|
|
471
634
|
// ── Reorder (drag del bloque selected-first) ───────────────
|
|
635
|
+
/** true = drag de lista completa; el modo selected-block (chips multiple) tiene prioridad
|
|
636
|
+
* si ambos están activos (no coexisten en la práctica). */
|
|
637
|
+
get listDragActive() {
|
|
638
|
+
return this.listReorderable && !(this.reorderable && this.selectedFirst);
|
|
639
|
+
}
|
|
640
|
+
/** Universo del drag de LISTA COMPLETA (listReorderable). El bloque
|
|
641
|
+
* seleccionado usa `previewOrder` (live-preview, ver handleRowDragStart). */
|
|
642
|
+
dragOrderIds() {
|
|
643
|
+
return this.orderedItems.map((i) => i._id);
|
|
644
|
+
}
|
|
472
645
|
handleRowDragStart(e, id) {
|
|
473
646
|
if (this.armedKey !== id) {
|
|
474
647
|
e.preventDefault();
|
|
@@ -489,22 +662,179 @@ const CoOptionList = class {
|
|
|
489
662
|
this.overKey = id;
|
|
490
663
|
// Dirección: al arrastrar hacia abajo (from<to) el ítem cae DESPUÉS del target
|
|
491
664
|
// (semántica de reorderIds) → el indicador va en el borde inferior; hacia arriba, superior.
|
|
492
|
-
const ids = this.
|
|
665
|
+
const ids = this.dragOrderIds();
|
|
493
666
|
this.dropAfter = ids.indexOf(this.dragKey) < ids.indexOf(id);
|
|
494
667
|
}
|
|
668
|
+
// ── Drag por puntero (bloque seleccionado, estilo motion.dev) ──
|
|
669
|
+
// La fila agarrada sigue al puntero 1:1 (transform, sin el ghost nativo del
|
|
670
|
+
// browser) con lift (sombra + escala); las demás se apartan EN VIVO con FLIP.
|
|
671
|
+
// Soltar confirma (emite coReorder); ESC revierte con settle.
|
|
672
|
+
/** Aplica un orden de preview al bloque seleccionado con FLIP (todo ease-out;
|
|
673
|
+
* la fila lifted queda fuera del FLIP — su posición la dicta el puntero). */
|
|
674
|
+
applyPreview(next) {
|
|
675
|
+
this.pendingFlip = { tops: this.captureRowTops(), movedId: this.dragKey, spring: false };
|
|
676
|
+
const byId = new Map(this.orderedItems.map((i) => [i._id, i]));
|
|
677
|
+
for (const d of this.displaySnapshot)
|
|
678
|
+
if (!byId.has(d._id))
|
|
679
|
+
byId.set(d._id, d);
|
|
680
|
+
this.sortSnapshot = new Set(next);
|
|
681
|
+
this.displaySnapshot = next.map((x) => byId.get(x)).filter(Boolean);
|
|
682
|
+
this.previewOrder = next;
|
|
683
|
+
}
|
|
684
|
+
startPointerDrag(e, id) {
|
|
685
|
+
var _a;
|
|
686
|
+
if (e.button !== 0 || this.ptrDrag)
|
|
687
|
+
return;
|
|
688
|
+
const order = liveSelectedOrder(this.orderedItems, this.selectedIds);
|
|
689
|
+
if (!order.includes(id))
|
|
690
|
+
return;
|
|
691
|
+
const row = e.currentTarget.closest('.co-option-list__option');
|
|
692
|
+
if (!row)
|
|
693
|
+
return;
|
|
694
|
+
e.preventDefault();
|
|
695
|
+
e.stopPropagation();
|
|
696
|
+
const rect = row.getBoundingClientRect();
|
|
697
|
+
// Pitch MEDIDO de la lista real (alto de fila + gap): las filas de este
|
|
698
|
+
// panel son content-driven (nombre + email ≈ 44px), NO el alto fijo de la
|
|
699
|
+
// lista virtual — asumir VIRTUAL_ITEM_HEIGHT desvía el slot y la fila
|
|
700
|
+
// aterriza fuera de lugar al soltar.
|
|
701
|
+
const rows = (_a = this.el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelectorAll('.co-option-list__option[data-id]');
|
|
702
|
+
const first = rows === null || rows === void 0 ? void 0 : rows[0];
|
|
703
|
+
const pitch = (rows && rows.length >= 2)
|
|
704
|
+
? rows[1].getBoundingClientRect().top - rows[0].getBoundingClientRect().top
|
|
705
|
+
: rect.height || VIRTUAL_ITEM_HEIGHT;
|
|
706
|
+
// Top geométrico del slot 0: primera fila renderizada − su índice × pitch
|
|
707
|
+
// (la fila agarrada puede vivir FUERA del bloque si es una selección
|
|
708
|
+
// fresca, por eso no sirve de ancla).
|
|
709
|
+
const firstIdx = first ? this.orderedItems.findIndex((i) => i._id === first.dataset.id) : 0;
|
|
710
|
+
const blockTop = first
|
|
711
|
+
? first.getBoundingClientRect().top - Math.max(0, firstIdx) * pitch
|
|
712
|
+
: rect.top;
|
|
713
|
+
this.ptrDrag = {
|
|
714
|
+
id,
|
|
715
|
+
grabDY: e.clientY - rect.top,
|
|
716
|
+
blockTop,
|
|
717
|
+
pitch,
|
|
718
|
+
originOrder: order,
|
|
719
|
+
originDisplay: this.displaySnapshot,
|
|
720
|
+
originSort: this.sortSnapshot,
|
|
721
|
+
desiredTop: rect.top,
|
|
722
|
+
startY: e.clientY,
|
|
723
|
+
started: false,
|
|
724
|
+
};
|
|
725
|
+
window.addEventListener('pointermove', this.onPtrMove);
|
|
726
|
+
window.addEventListener('pointerup', this.onPtrUp);
|
|
727
|
+
window.addEventListener('keydown', this.onPtrKey, true);
|
|
728
|
+
}
|
|
729
|
+
/** Posiciona la fila lifted bajo el puntero (transform sobre su slot de layout). */
|
|
730
|
+
positionLifted() {
|
|
731
|
+
var _a;
|
|
732
|
+
const d = this.ptrDrag;
|
|
733
|
+
if (!d || !d.started)
|
|
734
|
+
return;
|
|
735
|
+
const row = (_a = this.el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector(`.co-option-list__option[data-id="${CSS.escape(d.id)}"]`);
|
|
736
|
+
if (!row)
|
|
737
|
+
return;
|
|
738
|
+
const idx = this.previewOrder.indexOf(d.id);
|
|
739
|
+
if (idx === -1)
|
|
740
|
+
return;
|
|
741
|
+
const layoutTop = d.blockTop + idx * d.pitch;
|
|
742
|
+
row.style.transition = 'none';
|
|
743
|
+
row.style.transform = `translateY(${d.desiredTop - layoutTop}px) scale(1.02)`;
|
|
744
|
+
}
|
|
745
|
+
/** Settle de la fila lifted: de su posición visual actual a su slot, con spring. */
|
|
746
|
+
settleLifted(d) {
|
|
747
|
+
var _a;
|
|
748
|
+
const row = (_a = this.el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector(`.co-option-list__option[data-id="${CSS.escape(d.id)}"]`);
|
|
749
|
+
const done = () => {
|
|
750
|
+
this.dragKey = '';
|
|
751
|
+
this.el.style.userSelect = '';
|
|
752
|
+
};
|
|
753
|
+
if (!row) {
|
|
754
|
+
done();
|
|
755
|
+
return;
|
|
756
|
+
}
|
|
757
|
+
row.style.transition = 'transform var(--co-motion-duration-base) var(--co-motion-ease-spring)';
|
|
758
|
+
row.style.transform = '';
|
|
759
|
+
row.addEventListener('transitionend', () => { row.style.transition = ''; done(); }, { once: true });
|
|
760
|
+
}
|
|
761
|
+
removePtrListeners() {
|
|
762
|
+
window.removeEventListener('pointermove', this.onPtrMove);
|
|
763
|
+
window.removeEventListener('pointerup', this.onPtrUp);
|
|
764
|
+
window.removeEventListener('keydown', this.onPtrKey, true);
|
|
765
|
+
}
|
|
495
766
|
handleRowDrop(e, id) {
|
|
496
767
|
e.preventDefault();
|
|
497
768
|
e.stopPropagation();
|
|
498
769
|
const fromId = this.dragKey;
|
|
499
|
-
const order = this.
|
|
770
|
+
const order = this.dragOrderIds();
|
|
500
771
|
this.resetDragState();
|
|
501
|
-
// Solo reordenar dentro del bloque seleccionado
|
|
502
772
|
if (fromId === id || !order.includes(fromId) || !order.includes(id))
|
|
503
773
|
return;
|
|
504
|
-
const
|
|
505
|
-
const
|
|
506
|
-
|
|
507
|
-
|
|
774
|
+
const byId = new Map(this.orderedItems.map((i) => [i._id, i]));
|
|
775
|
+
const next = listReorderIds(order, fromId, id, (x) => { var _a; return !!((_a = byId.get(x)) === null || _a === void 0 ? void 0 : _a.pinned); });
|
|
776
|
+
if (next === order)
|
|
777
|
+
return; // extremo pineado o no-op
|
|
778
|
+
this.coListReorder.emit({ value: next, item: byId.get(fromId) });
|
|
779
|
+
}
|
|
780
|
+
captureRowTops() {
|
|
781
|
+
var _a;
|
|
782
|
+
const tops = new Map();
|
|
783
|
+
(_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));
|
|
784
|
+
return tops;
|
|
785
|
+
}
|
|
786
|
+
/**
|
|
787
|
+
* FLIP de cada reacomodo (swap del live-preview y revert): las filas arrancan
|
|
788
|
+
* desplazadas a su posición visual anterior (transform) y transicionan a la
|
|
789
|
+
* nueva. Solo transform, con tokens de motion (reduced-motion se resuelve
|
|
790
|
+
* global vía zeroing). Swaps mid-drag: todo ease-out (fluido, sin rebote);
|
|
791
|
+
* spring solo para la fila movida en el settle del revert.
|
|
792
|
+
* Batcheado (writes → reads → writes, un solo flush) y robusto a interrupciones:
|
|
793
|
+
* neutraliza transforms de un FLIP anterior ANTES de medir el layout nuevo.
|
|
794
|
+
*/
|
|
795
|
+
runFlip() {
|
|
796
|
+
var _a, _b, _c;
|
|
797
|
+
if (!this.pendingFlip)
|
|
798
|
+
return;
|
|
799
|
+
const { tops, movedId, spring } = this.pendingFlip;
|
|
800
|
+
this.pendingFlip = undefined;
|
|
801
|
+
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 : []);
|
|
802
|
+
// La fila lifted (drag por puntero activo) queda FUERA del FLIP: su posición
|
|
803
|
+
// la dicta el puntero (positionLifted re-ancla tras el render).
|
|
804
|
+
const liftedId = ((_c = this.ptrDrag) === null || _c === void 0 ? void 0 : _c.started) ? this.ptrDrag.id : null;
|
|
805
|
+
for (const row of rows) {
|
|
806
|
+
if (row.dataset.id === liftedId)
|
|
807
|
+
continue;
|
|
808
|
+
row.style.transition = 'none';
|
|
809
|
+
row.style.transform = '';
|
|
810
|
+
}
|
|
811
|
+
const moves = [];
|
|
812
|
+
for (const row of rows) {
|
|
813
|
+
const id = row.dataset.id;
|
|
814
|
+
if (id === liftedId)
|
|
815
|
+
continue;
|
|
816
|
+
const first = tops.get(id);
|
|
817
|
+
if (first === undefined)
|
|
818
|
+
continue;
|
|
819
|
+
const delta = first - row.getBoundingClientRect().top;
|
|
820
|
+
if (delta)
|
|
821
|
+
moves.push({ row, delta, spring: spring && id === movedId });
|
|
822
|
+
}
|
|
823
|
+
for (const { row, delta } of moves)
|
|
824
|
+
row.style.transform = `translateY(${delta}px)`;
|
|
825
|
+
for (const row of rows) {
|
|
826
|
+
if (row.dataset.id === liftedId)
|
|
827
|
+
continue;
|
|
828
|
+
const mv = moves.find((m) => m.row === row);
|
|
829
|
+
if (!mv) {
|
|
830
|
+
row.style.transition = '';
|
|
831
|
+
continue;
|
|
832
|
+
}
|
|
833
|
+
const ease = mv.spring ? 'var(--co-motion-ease-spring)' : 'var(--co-motion-ease-out)';
|
|
834
|
+
row.style.transition = `transform var(--co-motion-duration-base) ${ease}`;
|
|
835
|
+
row.style.transform = '';
|
|
836
|
+
row.addEventListener('transitionend', () => { row.style.transition = ''; }, { once: true });
|
|
837
|
+
}
|
|
508
838
|
}
|
|
509
839
|
resetDragState() {
|
|
510
840
|
this.armedKey = '';
|
|
@@ -519,6 +849,30 @@ const CoOptionList = class {
|
|
|
519
849
|
if (hasMore && scrollTop + clientHeight >= scrollHeight - 40)
|
|
520
850
|
this.coLoadMore.emit();
|
|
521
851
|
}
|
|
852
|
+
/** El infinite scroll asume que cada página desborda el contenedor. Con
|
|
853
|
+
* paneles altos (--co-option-list-max-height) una página puede caber entera
|
|
854
|
+
* → sin overflow no hay evento de scroll y la paginación queda muerta. Tras
|
|
855
|
+
* cada render, si el contenido no deja distancia scrolleable (mismo slack
|
|
856
|
+
* de 40px que maybeLoadMore) y hay más resultados, pide otra página. Se
|
|
857
|
+
* emite UNA vez por longitud de lista: si el host no responde no re-emite,
|
|
858
|
+
* y el append de la página siguiente re-habilita el check. */
|
|
859
|
+
fillViewport() {
|
|
860
|
+
var _a, _b;
|
|
861
|
+
const count = this.parsedItems.length;
|
|
862
|
+
if (this.loading || count === 0 || count === this.lastFillLen)
|
|
863
|
+
return;
|
|
864
|
+
const { hasMore } = deriveMore(count, this.total, this.hasMore);
|
|
865
|
+
if (!hasMore)
|
|
866
|
+
return;
|
|
867
|
+
const vp = (_b = (_a = this.osInstance) === null || _a === void 0 ? void 0 : _a.elements().viewport) !== null && _b !== void 0 ? _b : this.optionsEl;
|
|
868
|
+
// clientHeight 0 = panel oculto/sin layout: las métricas mienten, no pedir.
|
|
869
|
+
if (!vp || vp.clientHeight === 0)
|
|
870
|
+
return;
|
|
871
|
+
if (vp.scrollHeight - vp.clientHeight <= 40) {
|
|
872
|
+
this.lastFillLen = count;
|
|
873
|
+
this.coLoadMore.emit();
|
|
874
|
+
}
|
|
875
|
+
}
|
|
522
876
|
scrollActiveIntoView() {
|
|
523
877
|
requestAnimationFrame(() => {
|
|
524
878
|
var _a, _b;
|
|
@@ -543,18 +897,34 @@ const CoOptionList = class {
|
|
|
543
897
|
return label;
|
|
544
898
|
return [seg.pre, h("span", { class: "co-option-list__match" }, seg.match), seg.post];
|
|
545
899
|
}
|
|
900
|
+
/** Pill junto al label. Con `tooltip` va envuelto en un `co-tooltip` — el
|
|
901
|
+
* label del badge se abrevia (3 letras en el de workspace) y sin el texto
|
|
902
|
+
* completo al hover no hay forma de saber a qué se refiere. Sin `tooltip`
|
|
903
|
+
* renderiza el span pelado, igual que antes (mismo patrón que la prop
|
|
904
|
+
* `name` de co-avatar). */
|
|
905
|
+
renderBadge(badge) {
|
|
906
|
+
const pill = (h("span", { class: "co-option-list__badge", style: badge.color ? { backgroundColor: badge.color, color: 'var(--co-color-base-blanco, #fff)' } : undefined }, badge.label));
|
|
907
|
+
if (!badge.tooltip)
|
|
908
|
+
return pill;
|
|
909
|
+
return (h("co-tooltip", { class: "co-option-list__badge-tip", content: badge.tooltip }, pill));
|
|
910
|
+
}
|
|
546
911
|
renderRow(item, index, selectedIds) {
|
|
547
912
|
const isSelected = selectedIds.includes(item._id);
|
|
548
|
-
|
|
913
|
+
// Dos modos de drag EXCLUYENTES: bloque seleccionado = drag por puntero
|
|
914
|
+
// (motion.dev-like); lista completa (listReorderable) = HTML5 DnD con
|
|
915
|
+
// indicador de línea.
|
|
916
|
+
const ptrDragRow = !this.listDragActive && this.reorderable && this.selectedFirst && isSelected && !this.term;
|
|
917
|
+
const listDragRow = this.listDragActive && !item.pinned && !this.term;
|
|
549
918
|
return (h("div", { class: {
|
|
550
919
|
'co-option-list__option': true,
|
|
551
920
|
'co-option-list__option--selected': isSelected,
|
|
552
921
|
'co-option-list__option--active': index === this.activeIndex,
|
|
553
922
|
'co-option-list__option--disabled': !!item.disabled,
|
|
554
|
-
'co-option-list__option--dragging': this.dragKey === item._id,
|
|
555
|
-
'co-option-list__option--
|
|
556
|
-
'co-option-list__option--drop-
|
|
557
|
-
|
|
923
|
+
'co-option-list__option--dragging': this.listDragActive && this.dragKey === item._id,
|
|
924
|
+
'co-option-list__option--lifted': !this.listDragActive && this.dragKey === item._id,
|
|
925
|
+
'co-option-list__option--drop-before': this.listDragActive && this.overKey === item._id && !this.dropAfter,
|
|
926
|
+
'co-option-list__option--drop-after': this.listDragActive && this.overKey === item._id && this.dropAfter,
|
|
927
|
+
}, key: item._id, id: `co-optlist-${index}`, "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; }, 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) && (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() }, h("co-icon", { name: "dots-six-vertical", size: 16 }))), this.renderLeading(item), h("div", { class: "co-option-list__text" }, h("span", { class: "co-option-list__title" }, h("span", { class: "co-option-list__label", style: item.labelColor ? { color: item.labelColor, fontWeight: '600' } : undefined }, this.renderLabelText(item.label)), item.suffix && h("span", { class: "co-option-list__suffix" }, "- ", item.suffix), item.badge && this.renderBadge(item.badge)), item.description && h("span", { class: "co-option-list__desc" }, item.description)), this.pinnable && (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 }); } }, h("co-icon", { name: "push-pin", size: 16, weight: item.pinned ? 'fill' : 'regular' }))), isSelected && this.removableItems && this.multiple && (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); } }, h("co-icon", { name: "x-circle", size: 16, weight: "fill" }))), isSelected && !this.removableItems && this.selectedAffordance === 'deselect' && (h("button", { class: "co-option-list__row-action", type: "button", tabIndex: -1, "aria-label": `Deselect ${item.label}`, onClick: (e) => { e.stopPropagation(); this.deselectItem(item); } }, h("co-icon", { name: "x-circle", size: 16, weight: "fill" }))), isSelected && !this.removableItems && this.selectedAffordance === 'check' && (h("co-icon", { name: "check", size: 16, class: "co-option-list__check" }))));
|
|
558
928
|
}
|
|
559
929
|
renderVirtual(items, selectedIds) {
|
|
560
930
|
const { totalHeight, startIdx, endIdx, offsetY } = virtualSlice(this.scrollTop, items.length);
|
|
@@ -565,11 +935,11 @@ const CoOptionList = class {
|
|
|
565
935
|
const selectedIds = this.selectedIds;
|
|
566
936
|
const { hasMore, remaining } = deriveMore(this.parsedItems.length, this.total, this.hasMore);
|
|
567
937
|
const showClear = !!this.clearOptionLabel && selectedIds.length > 0;
|
|
568
|
-
return (h("div", { key: '
|
|
938
|
+
return (h("div", { key: 'a5754821517230b914fd9f23b024afc523e4ee9d', class: "co-option-list", onKeyDown: this.onRootKeyDown }, this.searchable && (h("div", { key: '9988f2e6834b5c8cf4c4832d609fb6665c9a46cc', class: "co-option-list__search", part: "search" }, h("co-icon", { key: '8b8f2e72fb6f9aa9b498455757aefe943627af80', name: "magnifying-glass", size: 16 }), 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" }))), 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 }, h("div", { key: '8087c3de1d857b562918a358f98a7a195cbe66d7', class: "co-option-list__inner" }, showClear && (h("button", { key: 'b067aedd7e0dbb29db12c35d0d217147359bc5f7', class: "co-option-list__clear-row", type: "button", onClick: () => this.coClearSelection.emit() }, h("co-icon", { key: '406e84a7bcc5d8509383527caa0f49d5f93fda53', name: "x-circle", size: 14 }), h("span", { key: '9347b010b58d51363a68aab65781cae7de31cca1' }, this.clearOptionLabel))), this.loading && items.length === 0 && (h("div", { key: '774fcb348a3553a945b70de822621ee24e410808', class: "co-option-list__loading" }, h("co-loader", { key: 'f760bf3ec0b27cfd0c57e2a56a613b8390faa935', size: "sm" }))), !this.loading && items.length === 0 && (h("div", { key: 'f018550513d4057bdbddaf64846ba7d4cd016a45', class: "co-option-list__empty" }, h("co-icon", { key: '7925a8b7c385389b1d59548d5d550a0d7f0d163e', name: "magnifying-glass", size: 20 }), h("span", { key: 'b31e52eef274434599db7ff217a9bfc634ebdf7f' }, this.emptyMessage))), items.length > 0 && this.virtual
|
|
569
939
|
? this.renderVirtual(items, selectedIds)
|
|
570
940
|
: buildRows(items).map((row) => row.kind === 'header'
|
|
571
941
|
? h("div", { class: "co-option-list__group", role: "presentation" }, row.label)
|
|
572
|
-
: this.renderRow(row.item, row.index, selectedIds)), this.loading && items.length > 0 && (h("div", { key: '
|
|
942
|
+
: this.renderRow(row.item, row.index, selectedIds)), this.loading && items.length > 0 && (h("div", { key: '7de231a83a96a2aca0cb240a68c3c9e6ab9b475c', class: "co-option-list__loading-more" }, h("co-loader", { key: '087234fb45c3cbea3bd3f2888957d3b2751753ad', size: "sm" }))), !this.loading && hasMore && remaining > 0 && (h("div", { key: '456bc75bb53a3f0d01f7fd850ca4b8227baf326d', class: "co-option-list__more" }, remaining, " more results")))), h("slot", { key: '2935b1dd65ec2409c18c3f72e0200d5ed1c19323', name: "footer" })));
|
|
573
943
|
}
|
|
574
944
|
get el() { return getElement(this); }
|
|
575
945
|
static get watchers() { return {
|