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