@prolibu-suite/cobalt-core 0.9.3 → 0.9.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +11 -5
- 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 +87 -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-0caa059c.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-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-f00be11f.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.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 +240 -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 +11 -5
- 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 +87 -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 +3 -3
- 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
|
@@ -1,5 +1,22 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/** Rendered in place of `m:ss` while a time is not known.
|
|
2
|
+
*
|
|
3
|
+
* Not an error state: `<audio>.duration` is `Infinity` for any container whose
|
|
4
|
+
* header carries no duration — every blob `MediaRecorder` produces, i.e. every
|
|
5
|
+
* freshly recorded voice note — and Chrome keeps it that way until the clip has
|
|
6
|
+
* been played end to end. `0:00` there would read as a zero-length recording;
|
|
7
|
+
* `--:--` reads as "not known yet", which is the truth. */
|
|
8
|
+
export declare const UNKNOWN_TIME = "--:--";
|
|
9
|
+
/** Seconds → "m:ss" (floors). Anything that is not a finite, non-negative number
|
|
10
|
+
* (`Infinity`, `NaN`, negatives) → `UNKNOWN_TIME` — never `"Infinity:NaN"`. */
|
|
2
11
|
export declare function formatTime(seconds: number): string;
|
|
12
|
+
/** Picks the duration to trust (seconds), or `NaN` when neither source knows it.
|
|
13
|
+
*
|
|
14
|
+
* `<audio>.duration` is authoritative *when it is a real number*. It is not for
|
|
15
|
+
* a duration-less container (see `UNKNOWN_TIME`), where it reports `Infinity`.
|
|
16
|
+
* The WebAudio decode the player already runs to draw the waveform does know the
|
|
17
|
+
* real length (`AudioBuffer.duration`), so it is the fallback. `0` from either
|
|
18
|
+
* source means "empty/unknown" too, so it never wins. */
|
|
19
|
+
export declare function resolveDuration(fromAudio: number, fromDecode: number): number;
|
|
3
20
|
/** Downsample raw PCM to `bars` peak heights, each normalized to a 0..1 fraction. */
|
|
4
21
|
export declare function resamplePeaks(channelData: Float32Array | number[], bars: number): number[];
|
|
5
22
|
/** Deterministic pseudo-waveform (stable render + testable — no Math.random). */
|
|
@@ -19,7 +19,9 @@ export declare class CoButton {
|
|
|
19
19
|
* `variant="danger" surface="dark"`.
|
|
20
20
|
*/
|
|
21
21
|
surface: 'light' | 'dark';
|
|
22
|
-
/** Disabled state
|
|
22
|
+
/** Disabled state. Reflected so :host([disabled]) can kill pointer-events —
|
|
23
|
+
* the inner button's own pointer-events:none re-targets clicks to the host,
|
|
24
|
+
* where consumers' click listeners live. */
|
|
23
25
|
disabled: boolean;
|
|
24
26
|
/** Text label (alternative to default slot) */
|
|
25
27
|
label?: string;
|
|
@@ -76,10 +76,14 @@ export declare class CoCalendarMonth {
|
|
|
76
76
|
rect?: DOMRect;
|
|
77
77
|
}>;
|
|
78
78
|
private onPointerUp;
|
|
79
|
+
private onPointerMove;
|
|
79
80
|
private nowTimer?;
|
|
80
81
|
/** Root ref para el classList imperativo del FIX D (sin @State: no debe
|
|
81
82
|
* disparar un render por celda cruzada durante el drag). */
|
|
82
83
|
private rootEl?;
|
|
84
|
+
private dragArmedId;
|
|
85
|
+
private dragStartPointer;
|
|
86
|
+
private suppressNextClick;
|
|
83
87
|
/** Memo de layoutMonth/matrix/segByWeek/byId por identidad de inputs. Durante
|
|
84
88
|
* el drag-over de celdas (pointerenter → dragOverDate @State) ninguno de estos
|
|
85
89
|
* inputs cambia → hit puro, sin recomputar layoutMonth/getMonthMatrix/segByWeek. */
|
|
@@ -108,6 +112,9 @@ export declare class CoCalendarMonth {
|
|
|
108
112
|
* celda cruzada). No es @State a propósito: no debe disparar un render. */
|
|
109
113
|
private setInteracting;
|
|
110
114
|
private startDrag;
|
|
115
|
+
/** Arma → activa el drag al cruzar el umbral (ver DRAG_THRESHOLD_PX). Antes de
|
|
116
|
+
* eso no toca dragId/interacting, así el click nativo del chip sigue vivo. */
|
|
117
|
+
private trackDrag;
|
|
111
118
|
private finishDrag;
|
|
112
119
|
private getLayouts;
|
|
113
120
|
private renderChip;
|
|
@@ -11,6 +11,16 @@ import { type ColorPreset } from './presets';
|
|
|
11
11
|
*/
|
|
12
12
|
export declare class CoColorPicker {
|
|
13
13
|
el: HTMLElement;
|
|
14
|
+
/**
|
|
15
|
+
* Id del panel de presets, target de `aria-controls` del trigger. Constante
|
|
16
|
+
* (no aleatoria): vive en el shadow root de ESTA instancia, donde los ids no
|
|
17
|
+
* colisionan con los de otras.
|
|
18
|
+
*
|
|
19
|
+
* El trigger solo emite `aria-controls` mientras `isOpen`: el panel se monta
|
|
20
|
+
* on-demand, así que cerrado el IDREF quedaría colgante.
|
|
21
|
+
*/
|
|
22
|
+
private static readonly PANEL_ID;
|
|
23
|
+
private triggerEl?;
|
|
14
24
|
/** Current color value as hex string (e.g. "#0066FF"). */
|
|
15
25
|
value: string;
|
|
16
26
|
/** Field label. */
|
|
@@ -43,6 +53,11 @@ export declare class CoColorPicker {
|
|
|
43
53
|
private get parsedPresets();
|
|
44
54
|
private handlePopoverOpen;
|
|
45
55
|
private handlePopoverClose;
|
|
56
|
+
private handleTriggerKeyDown;
|
|
57
|
+
/** Devuelve el foco al trigger al cerrar el panel (Escape, selección),
|
|
58
|
+
* salvo que el cierre venga de un click-outside que ya movió el foco a
|
|
59
|
+
* otro elemento — en ese caso no robarlo. */
|
|
60
|
+
private restoreTriggerFocus;
|
|
46
61
|
private handleSwatchClick;
|
|
47
62
|
private get statusIcon();
|
|
48
63
|
private handleCopy;
|
|
@@ -50,6 +50,18 @@ export declare class CoCombobox {
|
|
|
50
50
|
searchQuery: string;
|
|
51
51
|
overflowCount: number;
|
|
52
52
|
el: HTMLElement;
|
|
53
|
+
/**
|
|
54
|
+
* Id del <co-option-list> del dropdown, target de `aria-controls` del
|
|
55
|
+
* trigger. Constante (no aleatoria): vive en el shadow root de ESTA
|
|
56
|
+
* instancia, donde los ids no colisionan con los de otras. Se referencia el
|
|
57
|
+
* HOST de la primitiva — su listbox interno queda tras su propio shadow
|
|
58
|
+
* boundary y no es direccionable desde acá (limitación conocida y aceptada).
|
|
59
|
+
*
|
|
60
|
+
* El trigger solo emite `aria-controls` mientras `isOpen`: la lista se monta
|
|
61
|
+
* on-demand, así que cerrado el IDREF quedaría colgante.
|
|
62
|
+
*/
|
|
63
|
+
private static readonly LIST_ID;
|
|
64
|
+
private triggerEl?;
|
|
53
65
|
private chipContainerEl?;
|
|
54
66
|
private optionListEl?;
|
|
55
67
|
private resizeObserver?;
|
|
@@ -92,6 +104,11 @@ export declare class CoCombobox {
|
|
|
92
104
|
componentDidRender(): void;
|
|
93
105
|
private calcOverflow;
|
|
94
106
|
private handleTriggerClick;
|
|
107
|
+
private handleTriggerKeyDown;
|
|
108
|
+
/** Devuelve el foco al trigger al cerrar el panel (Escape, selección),
|
|
109
|
+
* salvo que el cierre venga de un click-outside que ya movió el foco a
|
|
110
|
+
* otro elemento — en ese caso no robarlo. */
|
|
111
|
+
private restoreTriggerFocus;
|
|
95
112
|
private handlePopoverOpen;
|
|
96
113
|
private handlePopoverClose;
|
|
97
114
|
private handleClear;
|
|
@@ -29,6 +29,9 @@ export declare class CoIconButton {
|
|
|
29
29
|
*/
|
|
30
30
|
iconSize?: number;
|
|
31
31
|
/** Disabled state */
|
|
32
|
+
/** Reflected so :host([disabled]) can kill pointer-events — the inner
|
|
33
|
+
* button's pointer-events:none re-targets clicks to the host, where
|
|
34
|
+
* consumers' click listeners live. */
|
|
32
35
|
disabled: boolean;
|
|
33
36
|
/** Accessible label */
|
|
34
37
|
label: string;
|
|
@@ -18,6 +18,15 @@ export declare class CoInput {
|
|
|
18
18
|
placeholder: string;
|
|
19
19
|
/** Current value */
|
|
20
20
|
value: string;
|
|
21
|
+
/**
|
|
22
|
+
* Refleja en el <input> los cambios de `value` que vienen de AFUERA (host que
|
|
23
|
+
* setea la prop programáticamente: cálculos, refresh, seed diferido). El
|
|
24
|
+
* <input> controlado de Stencil no repinta ante esos cambios bajo el lazy
|
|
25
|
+
* loader; escribir `inputEl.value` a mano lo sincroniza. Guard `hasFocus`:
|
|
26
|
+
* mientras el usuario tipea NO lo pisamos (movería el caret). Mismo patrón que
|
|
27
|
+
* co-number-field.onValueChange.
|
|
28
|
+
*/
|
|
29
|
+
onValueChange(next: string): void;
|
|
21
30
|
/** Helper text displayed below the input */
|
|
22
31
|
helperText?: string;
|
|
23
32
|
/** Disabled state */
|
|
@@ -9,6 +9,15 @@ export declare class CoNumberField {
|
|
|
9
9
|
layout: 'vertical' | 'horizontal';
|
|
10
10
|
status: 'default' | 'error' | 'success' | 'warning' | 'info';
|
|
11
11
|
value: number | null;
|
|
12
|
+
/**
|
|
13
|
+
* Refleja en el <input> los cambios de `value` que vienen de AFUERA (host que
|
|
14
|
+
* setea la prop: refresh de tasas, seed al abrir un form, cálculos). El render
|
|
15
|
+
* de Stencil no repinta el input controlado ante esos cambios bajo el lazy
|
|
16
|
+
* loader (verificado en vivo 2026-08-20: prop=0.000326 y el input seguía en
|
|
17
|
+
* "0"). Escribir `inputEl.value` a mano lo sincroniza. Guard `focused`: mientras
|
|
18
|
+
* el usuario tipea, su propio input manda — no lo pisamos (movería el caret).
|
|
19
|
+
*/
|
|
20
|
+
onValueChange(): void;
|
|
12
21
|
min?: number;
|
|
13
22
|
max?: number;
|
|
14
23
|
step: number;
|
|
@@ -27,6 +27,13 @@ export declare class CoOptionList {
|
|
|
27
27
|
removableItems: boolean;
|
|
28
28
|
/** Habilita reorder por drag del bloque de seleccionados (selected-first). */
|
|
29
29
|
reorderable: boolean;
|
|
30
|
+
/** Botón push-pin por fila (siempre visible). Emite coPinToggle; el estado
|
|
31
|
+
* pinned viene en item.pinned — el componente NO lo muta (controlado). */
|
|
32
|
+
pinnable: boolean;
|
|
33
|
+
/** Drag-reorder de la LISTA completa (no del bloque seleccionado): handle en
|
|
34
|
+
* filas no-pineadas, emite coListReorder con el orden visible completo.
|
|
35
|
+
* Independiente de multiple/selectedFirst. No soportado con `virtual`. */
|
|
36
|
+
listReorderable: boolean;
|
|
30
37
|
searchable: boolean;
|
|
31
38
|
searchPlaceholder: string;
|
|
32
39
|
searchDebounce: number;
|
|
@@ -64,6 +71,15 @@ export declare class CoOptionList {
|
|
|
64
71
|
value: string[];
|
|
65
72
|
item: OptionListItem;
|
|
66
73
|
}>;
|
|
74
|
+
/** Toggle de pin de una fila (pinnable). */
|
|
75
|
+
coPinToggle: EventEmitter<{
|
|
76
|
+
item: OptionListItem;
|
|
77
|
+
}>;
|
|
78
|
+
/** Drag-reorder de lista completa (listReorderable): orden visible + ítem movido. */
|
|
79
|
+
coListReorder: EventEmitter<{
|
|
80
|
+
value: string[];
|
|
81
|
+
item: OptionListItem;
|
|
82
|
+
}>;
|
|
67
83
|
term: string;
|
|
68
84
|
activeIndex: number;
|
|
69
85
|
scrollTop: number;
|
|
@@ -78,10 +94,20 @@ export declare class CoOptionList {
|
|
|
78
94
|
private searchInputEl?;
|
|
79
95
|
private optionsEl?;
|
|
80
96
|
private osInstance?;
|
|
97
|
+
/** Longitud de lista para la que ya se pidió un fill (ver fillViewport). */
|
|
98
|
+
private lastFillLen;
|
|
81
99
|
private debounceTimer?;
|
|
82
100
|
/** Snapshot selected-first (ver snapshotOrder). */
|
|
83
101
|
private sortSnapshot;
|
|
84
102
|
private displaySnapshot;
|
|
103
|
+
/** FLIP del settle post-drop: tops por id capturados ANTES de mutar el orden.
|
|
104
|
+
* `spring` = momento expresivo (solo el settle del revert), no los swaps. */
|
|
105
|
+
private pendingFlip?;
|
|
106
|
+
/** Orden del live-preview en curso (drag por puntero del bloque seleccionado). */
|
|
107
|
+
private previewOrder;
|
|
108
|
+
/** Drag por puntero (estilo motion.dev: la fila sigue al cursor, sin ghost
|
|
109
|
+
* nativo). Solo bloque seleccionado; listReorderable sigue en HTML5 DnD. */
|
|
110
|
+
private ptrDrag?;
|
|
85
111
|
private get parsedItems();
|
|
86
112
|
private get selectedIds();
|
|
87
113
|
private get orderedItems();
|
|
@@ -99,6 +125,16 @@ export declare class CoOptionList {
|
|
|
99
125
|
* sobre subtree oculto es no-op silencioso. Reintenta ~20 frames.
|
|
100
126
|
*/
|
|
101
127
|
focusSearch(): Promise<void>;
|
|
128
|
+
/**
|
|
129
|
+
* Ancla la sesión del panel en la selección: highlight sobre la primera fila
|
|
130
|
+
* seleccionada y scroll hasta dejarla visible (paridad resetActiveIndex de
|
|
131
|
+
* co-select). El host la llama al ABRIR su panel — la lista queda montada
|
|
132
|
+
* entre aperturas y no sabe cuándo se abre (mismo contrato que
|
|
133
|
+
* focusSearch/snapshotOrder). Espera layout real igual que focusSearch: el
|
|
134
|
+
* panel se hace visible frames después y un scroll sobre subtree oculto se
|
|
135
|
+
* clampea a 0 en silencio.
|
|
136
|
+
*/
|
|
137
|
+
scrollToSelected(): Promise<void>;
|
|
102
138
|
/** Navegación para hosts con input externo. true = tecla consumida (host hace preventDefault). */
|
|
103
139
|
handleKey(e: KeyboardEvent): Promise<boolean>;
|
|
104
140
|
private takeSnapshot;
|
|
@@ -114,18 +150,61 @@ export declare class CoOptionList {
|
|
|
114
150
|
* consumidor jamás se enteraba y la X parecía muerta (bug del workspace). */
|
|
115
151
|
private deselectItem;
|
|
116
152
|
private pick;
|
|
153
|
+
/** true = drag de lista completa; el modo selected-block (chips multiple) tiene prioridad
|
|
154
|
+
* si ambos están activos (no coexisten en la práctica). */
|
|
155
|
+
private get listDragActive();
|
|
156
|
+
/** Universo del drag de LISTA COMPLETA (listReorderable). El bloque
|
|
157
|
+
* seleccionado usa `previewOrder` (live-preview, ver handleRowDragStart). */
|
|
158
|
+
private dragOrderIds;
|
|
117
159
|
private handleRowDragStart;
|
|
118
160
|
private handleRowDragOver;
|
|
161
|
+
/** Aplica un orden de preview al bloque seleccionado con FLIP (todo ease-out;
|
|
162
|
+
* la fila lifted queda fuera del FLIP — su posición la dicta el puntero). */
|
|
163
|
+
private applyPreview;
|
|
164
|
+
private startPointerDrag;
|
|
165
|
+
private onPtrMove;
|
|
166
|
+
/** Posiciona la fila lifted bajo el puntero (transform sobre su slot de layout). */
|
|
167
|
+
private positionLifted;
|
|
168
|
+
private onPtrUp;
|
|
169
|
+
private onPtrKey;
|
|
170
|
+
/** Settle de la fila lifted: de su posición visual actual a su slot, con spring. */
|
|
171
|
+
private settleLifted;
|
|
172
|
+
private removePtrListeners;
|
|
119
173
|
private handleRowDrop;
|
|
174
|
+
private captureRowTops;
|
|
175
|
+
/**
|
|
176
|
+
* FLIP de cada reacomodo (swap del live-preview y revert): las filas arrancan
|
|
177
|
+
* desplazadas a su posición visual anterior (transform) y transicionan a la
|
|
178
|
+
* nueva. Solo transform, con tokens de motion (reduced-motion se resuelve
|
|
179
|
+
* global vía zeroing). Swaps mid-drag: todo ease-out (fluido, sin rebote);
|
|
180
|
+
* spring solo para la fila movida en el settle del revert.
|
|
181
|
+
* Batcheado (writes → reads → writes, un solo flush) y robusto a interrupciones:
|
|
182
|
+
* neutraliza transforms de un FLIP anterior ANTES de medir el layout nuevo.
|
|
183
|
+
*/
|
|
184
|
+
private runFlip;
|
|
120
185
|
private handleRowDragEnd;
|
|
121
186
|
private handleRowDragLeave;
|
|
122
187
|
private disarmDrag;
|
|
123
188
|
private resetDragState;
|
|
124
189
|
private maybeLoadMore;
|
|
190
|
+
/** El infinite scroll asume que cada página desborda el contenedor. Con
|
|
191
|
+
* paneles altos (--co-option-list-max-height) una página puede caber entera
|
|
192
|
+
* → sin overflow no hay evento de scroll y la paginación queda muerta. Tras
|
|
193
|
+
* cada render, si el contenido no deja distancia scrolleable (mismo slack
|
|
194
|
+
* de 40px que maybeLoadMore) y hay más resultados, pide otra página. Se
|
|
195
|
+
* emite UNA vez por longitud de lista: si el host no responde no re-emite,
|
|
196
|
+
* y el append de la página siguiente re-habilita el check. */
|
|
197
|
+
private fillViewport;
|
|
125
198
|
private onNativeScroll;
|
|
126
199
|
private scrollActiveIntoView;
|
|
127
200
|
private renderLeading;
|
|
128
201
|
private renderLabelText;
|
|
202
|
+
/** Pill junto al label. Con `tooltip` va envuelto en un `co-tooltip` — el
|
|
203
|
+
* label del badge se abrevia (3 letras en el de workspace) y sin el texto
|
|
204
|
+
* completo al hover no hay forma de saber a qué se refiere. Sin `tooltip`
|
|
205
|
+
* renderiza el span pelado, igual que antes (mismo patrón que la prop
|
|
206
|
+
* `name` de co-avatar). */
|
|
207
|
+
private renderBadge;
|
|
129
208
|
private renderRow;
|
|
130
209
|
private renderVirtual;
|
|
131
210
|
render(): any;
|
|
@@ -7,10 +7,15 @@ export interface OptionListItem {
|
|
|
7
7
|
description?: string;
|
|
8
8
|
/** Texto secundario junto al label, renderizado como "- suffix". */
|
|
9
9
|
suffix?: string;
|
|
10
|
-
/** Pill junto al label (generaliza el workspace badge de suite-v2).
|
|
10
|
+
/** Pill junto al label (generaliza el workspace badge de suite-v2).
|
|
11
|
+
* `tooltip` (opcional): texto completo al hover — el pill se abrevia (3
|
|
12
|
+
* letras en el badge de workspace) y sin esto no hay forma de saber qué
|
|
13
|
+
* dice. Con `tooltip` el pill se envuelve en un `co-tooltip`; sin él
|
|
14
|
+
* renderiza exactamente igual que antes. */
|
|
11
15
|
badge?: {
|
|
12
16
|
label: string;
|
|
13
17
|
color?: string;
|
|
18
|
+
tooltip?: string;
|
|
14
19
|
};
|
|
15
20
|
/** Phosphor icon como leading visual (si no hay avatar/color). */
|
|
16
21
|
icon?: string;
|
|
@@ -23,6 +28,8 @@ export interface OptionListItem {
|
|
|
23
28
|
/** Header de sección: se inserta uno al CAMBIAR de group (patrón ⌘K). */
|
|
24
29
|
group?: string;
|
|
25
30
|
disabled?: boolean;
|
|
31
|
+
/** Fila pineada por el usuario: pinta el push-pin fill y queda excluida del drag de lista. */
|
|
32
|
+
pinned?: boolean;
|
|
26
33
|
}
|
|
27
34
|
export type OptionListRow = {
|
|
28
35
|
kind: 'header';
|
|
@@ -53,9 +60,24 @@ export declare function orderItems(items: OptionListItem[], snapshotIds: Set<str
|
|
|
53
60
|
export declare function buildRows(items: OptionListItem[]): OptionListRow[];
|
|
54
61
|
/** Mueve `fromId` a la posición de `toId` en `order`. No muta el input;
|
|
55
62
|
* devuelve el mismo array (referencia) si es no-op. */
|
|
63
|
+
/**
|
|
64
|
+
* Universo del drag del bloque seleccionado: los ids seleccionados VIVOS en su
|
|
65
|
+
* orden visible. A diferencia del snapshot (congelado al abrir), incluye lo
|
|
66
|
+
* seleccionado durante la sesión del panel — sin esto, esos ítems renderizan
|
|
67
|
+
* handle pero el drop los rechaza, y un reorder del snapshot emitiría un value
|
|
68
|
+
* truncado (pierde las selecciones frescas).
|
|
69
|
+
*/
|
|
70
|
+
export declare function liveSelectedOrder(items: OptionListItem[], selectedIds: string[]): string[];
|
|
56
71
|
export declare function reorderIds(order: string[], fromId: string, toId: string): string[];
|
|
72
|
+
/** Reorder de lista completa: los extremos pineados son inválidos (ni origen ni
|
|
73
|
+
* destino) — devuelve la misma referencia, señal de no-op para el caller. */
|
|
74
|
+
export declare function listReorderIds(order: string[], fromId: string, toId: string, isPinned: (id: string) => boolean): string[];
|
|
57
75
|
/** Siguiente highlight: wrap, salta disabled. -1 = sin items navegables. */
|
|
58
76
|
export declare function nextActiveIndex(current: number, delta: 1 | -1, items: OptionListItem[]): number;
|
|
77
|
+
/** Highlight inicial de la sesión del panel: primera fila seleccionada
|
|
78
|
+
* NAVEGABLE en orden visible (contrato de scrollToSelected, paridad
|
|
79
|
+
* resetActiveIndex de co-select). -1 = nada que anclar. */
|
|
80
|
+
export declare function selectedActiveIndex(items: OptionListItem[], selectedIds: string[]): number;
|
|
59
81
|
/** `total > 0` tiene precedencia (deriva remaining); si no, vale `hasMoreProp`. */
|
|
60
82
|
export declare function deriveMore(count: number, total: number, hasMoreProp: boolean): {
|
|
61
83
|
hasMore: boolean;
|
|
@@ -29,6 +29,12 @@ export declare class CoRefField {
|
|
|
29
29
|
placeholder: string;
|
|
30
30
|
disabled: boolean;
|
|
31
31
|
clearable: boolean;
|
|
32
|
+
/** Shows a pencil button on the single-value trigger that emits
|
|
33
|
+
* `coEditSelected` with the selected record id. The host owns policy
|
|
34
|
+
* (permissions, what opens) — the component only paints and emits. */
|
|
35
|
+
editable: boolean;
|
|
36
|
+
/** Accessible name / tooltip for the edit button. */
|
|
37
|
+
editLabel: string;
|
|
32
38
|
multiple: boolean;
|
|
33
39
|
status: 'default' | 'error' | 'success' | 'warning';
|
|
34
40
|
helperText?: string;
|
|
@@ -78,6 +84,13 @@ export declare class CoRefField {
|
|
|
78
84
|
maxChips: number;
|
|
79
85
|
/** Panel color theme. 'auto' follows trigger, 'dark' forces dark panel, 'light' forces light. */
|
|
80
86
|
panelTheme: 'auto' | 'dark' | 'light';
|
|
87
|
+
/**
|
|
88
|
+
* How `item.color` paints the selected chips (multiple mode).
|
|
89
|
+
* 'dot' (default) = neutral chip with a leading 8px color dot.
|
|
90
|
+
* 'fill' = the color becomes the chip BACKGROUND (label/remove switch to
|
|
91
|
+
* WCAG-contrast text) — the tag look. Avatar/image items keep the avatar.
|
|
92
|
+
*/
|
|
93
|
+
colorMode: 'dot' | 'fill';
|
|
81
94
|
/**
|
|
82
95
|
* Phosphor icon rendered as a small status badge after the selected label in
|
|
83
96
|
* the trigger (e.g. 'funnel' = strict workspace filter active). Only shows
|
|
@@ -101,6 +114,10 @@ export declare class CoRefField {
|
|
|
101
114
|
* a smooth squircle. The avatar border can be themed via --co-avatar-border-color.
|
|
102
115
|
*/
|
|
103
116
|
avatarShape: 'circle' | 'square';
|
|
117
|
+
/** Push-pin por fila en el panel (forward a co-option-list). */
|
|
118
|
+
pinnable: boolean;
|
|
119
|
+
/** Drag-reorder de la lista del panel (forward a co-option-list). */
|
|
120
|
+
listReorderable: boolean;
|
|
104
121
|
coChange: EventEmitter<{
|
|
105
122
|
value: string | string[];
|
|
106
123
|
item: RefFieldOption;
|
|
@@ -113,7 +130,30 @@ export declare class CoRefField {
|
|
|
113
130
|
coRemove: EventEmitter<string>;
|
|
114
131
|
coFooterPrimary: EventEmitter<void>;
|
|
115
132
|
coFooterSecondary: EventEmitter<void>;
|
|
133
|
+
/** Re-emisión del toggle de pin de una fila del panel (pinnable). */
|
|
134
|
+
coPinToggle: EventEmitter<{
|
|
135
|
+
item: RefFieldOption;
|
|
136
|
+
}>;
|
|
137
|
+
/** Re-emisión del drag-reorder de la lista del panel (listReorderable). */
|
|
138
|
+
coListReorder: EventEmitter<{
|
|
139
|
+
value: string[];
|
|
140
|
+
item: RefFieldOption;
|
|
141
|
+
}>;
|
|
142
|
+
/** Pencil click on the single-value trigger. Detail = selected record `_id`. */
|
|
143
|
+
coEditSelected: EventEmitter<string>;
|
|
116
144
|
el: HTMLElement;
|
|
145
|
+
private triggerEl?;
|
|
146
|
+
/**
|
|
147
|
+
* Id del <co-option-list> del panel, target de `aria-controls` del trigger.
|
|
148
|
+
* Constante (no aleatoria): vive en el shadow root de ESTA instancia, donde
|
|
149
|
+
* los ids no colisionan con los de otras. Se referencia el HOST de la
|
|
150
|
+
* primitiva — su listbox interno queda tras su propio shadow boundary y no
|
|
151
|
+
* es direccionable desde acá (limitación conocida y aceptada).
|
|
152
|
+
*
|
|
153
|
+
* El trigger solo emite `aria-controls` mientras `isOpen`: el panel se monta
|
|
154
|
+
* on-demand, así que cerrado el IDREF quedaría colgante.
|
|
155
|
+
*/
|
|
156
|
+
private static readonly LIST_ID;
|
|
117
157
|
isOpen: boolean;
|
|
118
158
|
/** How many trailing chips don't fit the trigger width (responsive mode). */
|
|
119
159
|
overflowCount: number;
|
|
@@ -146,6 +186,11 @@ export declare class CoRefField {
|
|
|
146
186
|
private handlePopoverOpen;
|
|
147
187
|
private handlePopoverClose;
|
|
148
188
|
private handleTriggerClick;
|
|
189
|
+
private handleTriggerKeyDown;
|
|
190
|
+
/** Devuelve el foco al trigger al cerrar el panel (Escape, selección),
|
|
191
|
+
* salvo que el cierre venga de un click-outside que ya movió el foco a
|
|
192
|
+
* otro elemento — en ese caso no robarlo. */
|
|
193
|
+
private restoreTriggerFocus;
|
|
149
194
|
/** Change de la co-option-list: `value: null` = deselección explícita (la X
|
|
150
195
|
* de la fila) → mismo camino que la X del trigger (clear + coClear). El
|
|
151
196
|
* resto sigue por handleOptionClick con el ítem. */
|
|
@@ -153,6 +198,7 @@ export declare class CoRefField {
|
|
|
153
198
|
private handleOptionClick;
|
|
154
199
|
private handleReorder;
|
|
155
200
|
private handleClear;
|
|
201
|
+
private handleEditClick;
|
|
156
202
|
private handleRemoveChip;
|
|
157
203
|
private handleFooterPrimary;
|
|
158
204
|
private handleFooterSecondary;
|
|
@@ -41,13 +41,34 @@ export declare class CoSelect {
|
|
|
41
41
|
scrollTop: number;
|
|
42
42
|
searchText: string;
|
|
43
43
|
private sortSnapshot;
|
|
44
|
+
/** Índice (sobre `filteredOptions`) de la opción resaltada por teclado.
|
|
45
|
+
* Patrón APG de combobox: el foco NUNCA baja a las opciones — queda en el
|
|
46
|
+
* trigger (o en el search input) y esto viaja por `aria-activedescendant`. */
|
|
47
|
+
activeIndex: number;
|
|
44
48
|
el: HTMLElement;
|
|
49
|
+
private triggerEl?;
|
|
45
50
|
private optionsContainerEl?;
|
|
46
51
|
private osInstance?;
|
|
47
52
|
private searchInputEl?;
|
|
53
|
+
/** Scroll pendiente hacia la opción activa, resuelto en componentDidRender. */
|
|
54
|
+
private pendingActiveScroll;
|
|
55
|
+
private activeScrollFrames;
|
|
48
56
|
private static readonly ITEM_HEIGHT;
|
|
49
57
|
private static readonly VIEWPORT_ITEMS;
|
|
50
58
|
private static readonly OVERSCAN;
|
|
59
|
+
/** Ids del shadow root (únicos por instancia sin sufijos aleatorios).
|
|
60
|
+
* Acá `aria-controls` se emite SIEMPRE (no solo abierto) porque este nodo
|
|
61
|
+
* listbox es permanente en el shadow root — el IDREF nunca cuelga. En
|
|
62
|
+
* co-ref-field/co-combobox/co-color-picker el panel se monta on-demand, así
|
|
63
|
+
* que ahí `aria-controls` va solo con el panel abierto: no unificar en la
|
|
64
|
+
* dirección equivocada. */
|
|
65
|
+
private static readonly LISTBOX_ID;
|
|
66
|
+
/** Frames que esperamos a que el panel tenga layout para escribir el scroll.
|
|
67
|
+
* Holgado a propósito (~0.8s a 60Hz): dentro de un co-modal/drawer animado el
|
|
68
|
+
* layout llega tarde y con 12 frames el flush se rendía a mitad de camino —
|
|
69
|
+
* el scroll quedaba clampeado en cualquier parte de la lista en vez de en la
|
|
70
|
+
* opción seleccionada. El loop corta solo al verificar el write o al cerrar. */
|
|
71
|
+
private static readonly ACTIVE_SCROLL_MAX_FRAMES;
|
|
51
72
|
coChange: EventEmitter<string | string[]>;
|
|
52
73
|
coClear: EventEmitter<void>;
|
|
53
74
|
/** Click en el botón primario del footer (el panel se cierra solo). */
|
|
@@ -67,9 +88,54 @@ export declare class CoSelect {
|
|
|
67
88
|
private get selectedOption();
|
|
68
89
|
private get displayText();
|
|
69
90
|
private get statusIcon();
|
|
91
|
+
private optionId;
|
|
92
|
+
/** Al abrir, la activa arranca en la opción seleccionada (la primera de ellas
|
|
93
|
+
* en multiple) para que las flechas continúen desde donde el usuario está. */
|
|
94
|
+
private resetActiveIndex;
|
|
70
95
|
onOpenChange(open: boolean): void;
|
|
71
96
|
private handleSearchInput;
|
|
72
97
|
private handleTriggerClick;
|
|
98
|
+
private handleTriggerKeyDown;
|
|
99
|
+
/** Apertura por TECLADO. Congela el orden selected-first ANTES de mover
|
|
100
|
+
* `isOpen` para que el @Watch calcule la opción activa sobre la lista
|
|
101
|
+
* definitiva; por mouse eso ya lo garantiza handlePopoverOpen, que corre
|
|
102
|
+
* antes del cambio de estado. */
|
|
103
|
+
private openPanel;
|
|
104
|
+
/** Navegación del panel abierto, compartida por el trigger (caso
|
|
105
|
+
* no-searchable, donde el foco se queda ahí) y el search input (caso
|
|
106
|
+
* searchable, donde las flechas no deben mover el caret). Devuelve `true`
|
|
107
|
+
* si consumió la tecla — con el panel cerrado no consume nada, así el
|
|
108
|
+
* comportamiento del trigger (Enter/Space togglean, ArrowDown abre) queda
|
|
109
|
+
* intacto. */
|
|
110
|
+
private handleNavKeyDown;
|
|
111
|
+
private setActiveIndex;
|
|
112
|
+
/** Enter/Space sobre una opción deshabilitada no hace nada — igual que el
|
|
113
|
+
* click (la tecla igual se consume: el panel abierto no togglea). */
|
|
114
|
+
private activateActiveOption;
|
|
115
|
+
/** Deja la opción activa dentro de la ventana virtual (state) y agenda el
|
|
116
|
+
* scroll real para después del próximo render. */
|
|
117
|
+
private scrollActiveIntoView;
|
|
118
|
+
/** Alinea el scroll REAL con la ventana virtual ya renderizada.
|
|
119
|
+
*
|
|
120
|
+
* Escribe `scrollTop` DIRECTO sobre el viewport de OverlayScrollbars: el
|
|
121
|
+
* `[role="listbox"]` queda en `overflow:hidden` y OS monta su propio
|
|
122
|
+
* elemento scrolleable, así que `scrollIntoView` desde el nodo de la opción
|
|
123
|
+
* no siempre encuentra un ancestro que scrollee. Y reintenta unos frames
|
|
124
|
+
* porque en la APERTURA el panel del popover todavía no tiene layout (su
|
|
125
|
+
* ciclo de posicionamiento son 2 rAF): sin layout el `scrollTop` se clampea
|
|
126
|
+
* a 0 en silencio y el usuario ve el panel EN BLANCO con la fila activa
|
|
127
|
+
* renderizada fuera del área visible. */
|
|
128
|
+
private flushActiveScroll;
|
|
129
|
+
/** Enfoca el search esperando visibilidad real (paridad focusSearch de
|
|
130
|
+
* co-option-list): el panel se posiciona 2+ rAF después de abrir — y más
|
|
131
|
+
* tarde dentro de un modal/drawer animado — y focus() sobre un subtree sin
|
|
132
|
+
* layout es no-op silencioso. Un solo rAF dejaba el buscador sin foco en
|
|
133
|
+
* esos hosts. Reintenta ~20 frames; aborta si el panel se cerró. */
|
|
134
|
+
private focusSearchWhenVisible;
|
|
135
|
+
/** Devuelve el foco al trigger al cerrar el panel (Escape, selección),
|
|
136
|
+
* salvo que el cierre venga de un click-outside que ya movió el foco a
|
|
137
|
+
* otro elemento — en ese caso no robarlo. */
|
|
138
|
+
private restoreTriggerFocus;
|
|
73
139
|
private handlePopoverOpen;
|
|
74
140
|
private handlePopoverClose;
|
|
75
141
|
private handleClear;
|
|
@@ -77,6 +143,7 @@ export declare class CoSelect {
|
|
|
77
143
|
private handleOptionClick;
|
|
78
144
|
private syncOverlayScrollbars;
|
|
79
145
|
componentDidRender(): void;
|
|
146
|
+
componentWillLoad(): void;
|
|
80
147
|
disconnectedCallback(): void;
|
|
81
148
|
/** Option label with the matched substring wrapped for highlighting. */
|
|
82
149
|
private renderLabel;
|