@prolibu-suite/cobalt-core 0.9.3 → 0.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. package/custom-elements.json +375 -25
  2. package/dist/cjs/co-audio-player.cjs.entry.js +107 -18
  3. package/dist/cjs/co-avatar_2.cjs.entry.js +7 -31
  4. package/dist/cjs/co-button.cjs.entry.js +6 -4
  5. package/dist/cjs/co-calendar-month_2.cjs.entry.js +59 -2
  6. package/dist/cjs/co-checkbox.cjs.entry.js +10 -4
  7. package/dist/cjs/co-chip_2.cjs.entry.js +388 -18
  8. package/dist/cjs/co-color-picker.cjs.entry.js +36 -3
  9. package/dist/cjs/co-combobox.cjs.entry.js +44 -4
  10. package/dist/cjs/co-event-popover.cjs.entry.js +5 -2
  11. package/dist/cjs/co-file-field.cjs.entry.js +12 -6
  12. package/dist/cjs/co-icon-button.cjs.entry.js +5 -2
  13. package/dist/cjs/co-icon.cjs.entry.js +17 -1
  14. package/dist/cjs/co-input.cjs.entry.js +21 -1
  15. package/dist/cjs/co-loader.cjs.entry.js +1 -1
  16. package/dist/cjs/co-number-field.cjs.entry.js +22 -2
  17. package/dist/cjs/co-ref-field.cjs.entry.js +99 -13
  18. package/dist/cjs/co-select.cjs.entry.js +273 -8
  19. package/dist/cjs/co-tags-field.cjs.entry.js +1 -1
  20. package/dist/cjs/cobalt.cjs.js +1 -1
  21. package/dist/cjs/color-YhUkm10t.js +32 -0
  22. package/dist/cjs/fieldChip-BLzo9MEV.js +7 -0
  23. package/dist/cjs/index-DK-2Lzmf.js +4 -4
  24. package/dist/cjs/loader.cjs.js +1 -1
  25. package/dist/cobalt/cobalt.esm.js +1 -1
  26. package/dist/cobalt/p-0c463d9a.entry.js +1 -0
  27. package/dist/cobalt/{p-3ced4269.entry.js → p-2828ecf6.entry.js} +1 -1
  28. package/dist/cobalt/p-2f88d151.entry.js +1 -0
  29. package/dist/cobalt/p-409f28bb.entry.js +1 -0
  30. package/dist/cobalt/{p-18af9e44.entry.js → p-568cfe8d.entry.js} +1 -1
  31. package/dist/cobalt/p-6bf814f9.entry.js +1 -0
  32. package/dist/cobalt/p-76420ac1.entry.js +1 -0
  33. package/dist/cobalt/p-7ea87b75.entry.js +1 -0
  34. package/dist/cobalt/p-8b4b3589.entry.js +1 -0
  35. package/dist/cobalt/p-93c68029.entry.js +1 -0
  36. package/dist/cobalt/p-BG4WRR22.js +1 -0
  37. package/dist/cobalt/p-a2d31248.entry.js +1 -0
  38. package/dist/cobalt/p-bcedbd73.entry.js +1 -0
  39. package/dist/cobalt/p-dfd25f1d.entry.js +1 -0
  40. package/dist/cobalt/p-e364b8a5.entry.js +1 -0
  41. package/dist/cobalt/p-e84eda2e.entry.js +1 -0
  42. package/dist/cobalt/p-f25967fb.entry.js +1 -0
  43. package/dist/cobalt/p-f5f1b463.entry.js +1 -0
  44. package/dist/cobalt/p-fef5db54.entry.js +1 -0
  45. package/dist/cobalt/p-mAGnZXRn.js +1 -0
  46. package/dist/collection/components/co-audio-player/co-audio-player.js +81 -17
  47. package/dist/collection/components/co-audio-player/co-audio-player.utils.js +27 -2
  48. package/dist/collection/components/co-autocomplete/co-autocomplete.js +1 -1
  49. package/dist/collection/components/co-avatar/co-avatar.js +5 -1
  50. package/dist/collection/components/co-avatar-group/co-avatar-group.js +1 -1
  51. package/dist/collection/components/co-button/co-button.css +7 -0
  52. package/dist/collection/components/co-button/co-button.js +7 -5
  53. package/dist/collection/components/co-calendar-month/co-calendar-month.js +59 -2
  54. package/dist/collection/components/co-checkbox/co-checkbox.css +22 -0
  55. package/dist/collection/components/co-checkbox/co-checkbox.js +9 -3
  56. package/dist/collection/components/co-checkbox-group/co-checkbox-group.js +1 -1
  57. package/dist/collection/components/co-color-picker/co-color-picker.css +7 -0
  58. package/dist/collection/components/co-color-picker/co-color-picker.js +35 -2
  59. package/dist/collection/components/co-combobox/co-combobox.css +7 -0
  60. package/dist/collection/components/co-combobox/co-combobox.js +44 -4
  61. package/dist/collection/components/co-command-search/co-command-search.js +1 -1
  62. package/dist/collection/components/co-data-table/co-data-table.js +1 -1
  63. package/dist/collection/components/co-date-range-picker/co-date-range-picker.js +2 -2
  64. package/dist/collection/components/co-event-popover/co-event-popover.js +5 -2
  65. package/dist/collection/components/co-file-field/co-file-field.css +2 -0
  66. package/dist/collection/components/co-file-field/co-file-field.js +8 -5
  67. package/dist/collection/components/co-icon/iconLoader.js +17 -1
  68. package/dist/collection/components/co-icon-button/co-icon-button.css +7 -0
  69. package/dist/collection/components/co-icon-button/co-icon-button.js +6 -3
  70. package/dist/collection/components/co-input/co-input.css +13 -0
  71. package/dist/collection/components/co-input/co-input.js +21 -0
  72. package/dist/collection/components/co-loader/co-loader.css +5 -3
  73. package/dist/collection/components/co-number-field/co-number-field.js +23 -2
  74. package/dist/collection/components/co-option-list/co-option-list.css +45 -2
  75. package/dist/collection/components/co-option-list/co-option-list.js +468 -18
  76. package/dist/collection/components/co-option-list/optionListLogic.js +25 -0
  77. package/dist/collection/components/co-popover/co-popover.js +1 -1
  78. package/dist/collection/components/co-radio-group/co-radio-group.js +1 -1
  79. package/dist/collection/components/co-ref-field/co-ref-field.css +49 -0
  80. package/dist/collection/components/co-ref-field/co-ref-field.js +252 -12
  81. package/dist/collection/components/co-segmented-bar/co-segmented-bar.js +1 -1
  82. package/dist/collection/components/co-select/co-select.css +19 -0
  83. package/dist/collection/components/co-select/co-select.js +275 -9
  84. package/dist/collection/components/co-sidebar-nav/co-sidebar-nav.js +1 -1
  85. package/dist/collection/components/co-toast/co-toast.js +2 -2
  86. package/dist/collection/components/co-transfer-list/co-transfer-list.js +1 -1
  87. package/dist/collection/utils/fieldChip.js +1 -1
  88. package/dist/collection/utils/fileI18n.js +3 -0
  89. package/dist/components/co-accordion.js +1 -1
  90. package/dist/components/co-action-bar.js +1 -1
  91. package/dist/components/co-audio-player.js +1 -1
  92. package/dist/components/co-autocomplete.js +1 -1
  93. package/dist/components/co-avatar-group.js +1 -1
  94. package/dist/components/co-avatar.js +1 -1
  95. package/dist/components/co-breadcrumb-item.js +1 -1
  96. package/dist/components/co-breadcrumb.js +1 -1
  97. package/dist/components/co-button.js +1 -1
  98. package/dist/components/co-calendar-month.js +1 -1
  99. package/dist/components/co-calendar-timegrid.js +1 -1
  100. package/dist/components/co-calendar.js +1 -1
  101. package/dist/components/co-carousel.js +1 -1
  102. package/dist/components/co-checkbox-group.js +1 -1
  103. package/dist/components/co-checkbox.js +1 -1
  104. package/dist/components/co-chip.js +1 -1
  105. package/dist/components/co-color-picker.js +1 -1
  106. package/dist/components/co-column-picker.js +1 -1
  107. package/dist/components/co-combobox.js +1 -1
  108. package/dist/components/co-command-search.js +1 -1
  109. package/dist/components/co-data-table-pagination.js +1 -1
  110. package/dist/components/co-data-table.js +1 -1
  111. package/dist/components/co-date-field.js +1 -1
  112. package/dist/components/co-date-picker.js +1 -1
  113. package/dist/components/co-date-range-picker.js +1 -1
  114. package/dist/components/co-date-range.js +1 -1
  115. package/dist/components/co-date-time-picker.js +1 -1
  116. package/dist/components/co-drawer.js +1 -1
  117. package/dist/components/co-drive-card.js +1 -1
  118. package/dist/components/co-drop-zone.js +1 -1
  119. package/dist/components/co-emoji-picker.js +1 -1
  120. package/dist/components/co-empty-state.js +1 -1
  121. package/dist/components/co-event-calendar.js +1 -1
  122. package/dist/components/co-event-popover.js +1 -1
  123. package/dist/components/co-fab.js +1 -1
  124. package/dist/components/co-file-field.js +1 -1
  125. package/dist/components/co-file-type-tile.js +1 -1
  126. package/dist/components/co-helper-text.js +1 -1
  127. package/dist/components/co-icon-button.js +1 -1
  128. package/dist/components/co-icon.js +1 -1
  129. package/dist/components/co-input.js +1 -1
  130. package/dist/components/co-json-field.js +1 -1
  131. package/dist/components/co-lightbox.js +1 -1
  132. package/dist/components/co-list-footer.js +1 -1
  133. package/dist/components/co-list-item.js +1 -1
  134. package/dist/components/co-loader.js +1 -1
  135. package/dist/components/co-menu-item.js +1 -1
  136. package/dist/components/co-modal.js +1 -1
  137. package/dist/components/co-number-field.js +1 -1
  138. package/dist/components/co-option-list.js +1 -1
  139. package/dist/components/co-page-header.js +1 -1
  140. package/dist/components/co-phone-field.js +1 -1
  141. package/dist/components/co-radio-group.js +1 -1
  142. package/dist/components/co-rating.js +1 -1
  143. package/dist/components/co-ref-field.js +1 -1
  144. package/dist/components/co-rich-text-editor.js +1 -1
  145. package/dist/components/co-rich-text-toolbar.js +1 -1
  146. package/dist/components/co-select.js +1 -1
  147. package/dist/components/co-sidebar-nav.js +1 -1
  148. package/dist/components/co-slider.js +1 -1
  149. package/dist/components/co-switch.js +1 -1
  150. package/dist/components/co-tab.js +1 -1
  151. package/dist/components/co-tags-field.js +1 -1
  152. package/dist/components/co-textarea.js +1 -1
  153. package/dist/components/co-toast.js +1 -1
  154. package/dist/components/co-toggle-button.js +1 -1
  155. package/dist/components/co-transfer-list.js +1 -1
  156. package/dist/components/co-video.js +1 -1
  157. package/dist/components/{p-CklsvHeL.js → p-B0Dc-I_C.js} +1 -1
  158. package/dist/components/{p-DzoNGEDU.js → p-BH184F0X.js} +1 -1
  159. package/dist/components/{p-BGD3oQ73.js → p-BHYtxTzM.js} +1 -1
  160. package/dist/components/{p-mom5kiBa.js → p-BTQEg3UO.js} +1 -1
  161. package/dist/components/p-BZIB4JDs.js +1 -0
  162. package/dist/components/p-Bbny3WUc.js +1 -0
  163. package/dist/components/{p-D5QJpmqf.js → p-Bxk96Zgc.js} +1 -1
  164. package/dist/components/p-C1Kv3zYZ.js +1 -0
  165. package/dist/components/p-C4U2tbRp.js +1 -0
  166. package/dist/components/{p-CyMaOb1j.js → p-CA_JAK9s.js} +1 -1
  167. package/dist/components/{p-AvSaw4Ua.js → p-CR0izsJC.js} +1 -1
  168. package/dist/components/p-CuZXTvDM.js +1 -0
  169. package/dist/components/{p-_131DL6m.js → p-D4qzGifz.js} +1 -1
  170. package/dist/components/{p-BsQQ7Mki.js → p-D5EdMieb.js} +1 -1
  171. package/dist/components/p-Dabi98BI.js +1 -0
  172. package/dist/components/p-DbipMAyT.js +1 -0
  173. package/dist/components/p-DgUBcJIS.js +1 -0
  174. package/dist/components/p-Dj1EZ5qD.js +1 -0
  175. package/dist/components/{p-DkmKOF60.js → p-P8wvwhM2.js} +1 -1
  176. package/dist/components/{p-nwy6X1QT.js → p-hfGFsvaD.js} +1 -1
  177. package/dist/esm/co-audio-player.entry.js +107 -18
  178. package/dist/esm/co-avatar_2.entry.js +6 -30
  179. package/dist/esm/co-button.entry.js +6 -4
  180. package/dist/esm/co-calendar-month_2.entry.js +59 -2
  181. package/dist/esm/co-checkbox.entry.js +10 -4
  182. package/dist/esm/co-chip_2.entry.js +388 -18
  183. package/dist/esm/co-color-picker.entry.js +36 -3
  184. package/dist/esm/co-combobox.entry.js +44 -4
  185. package/dist/esm/co-event-popover.entry.js +5 -2
  186. package/dist/esm/co-file-field.entry.js +12 -6
  187. package/dist/esm/co-icon-button.entry.js +5 -2
  188. package/dist/esm/co-icon.entry.js +17 -1
  189. package/dist/esm/co-input.entry.js +21 -1
  190. package/dist/esm/co-loader.entry.js +1 -1
  191. package/dist/esm/co-number-field.entry.js +22 -2
  192. package/dist/esm/co-ref-field.entry.js +99 -13
  193. package/dist/esm/co-select.entry.js +273 -8
  194. package/dist/esm/co-tags-field.entry.js +1 -1
  195. package/dist/esm/cobalt.js +1 -1
  196. package/dist/esm/color-BG4WRR22.js +30 -0
  197. package/dist/esm/fieldChip-DsAfq1e0.js +5 -0
  198. package/dist/esm/index-CrtiywTB.js +4 -4
  199. package/dist/esm/loader.js +1 -1
  200. package/dist/types/components/co-audio-player/co-audio-player.d.ts +13 -0
  201. package/dist/types/components/co-audio-player/co-audio-player.utils.d.ts +18 -1
  202. package/dist/types/components/co-button/co-button.d.ts +3 -1
  203. package/dist/types/components/co-calendar-month/co-calendar-month.d.ts +7 -0
  204. package/dist/types/components/co-checkbox/co-checkbox.d.ts +1 -0
  205. package/dist/types/components/co-color-picker/co-color-picker.d.ts +15 -0
  206. package/dist/types/components/co-combobox/co-combobox.d.ts +17 -0
  207. package/dist/types/components/co-icon-button/co-icon-button.d.ts +3 -0
  208. package/dist/types/components/co-input/co-input.d.ts +9 -0
  209. package/dist/types/components/co-number-field/co-number-field.d.ts +9 -0
  210. package/dist/types/components/co-option-list/co-option-list.d.ts +79 -0
  211. package/dist/types/components/co-option-list/optionListLogic.d.ts +23 -1
  212. package/dist/types/components/co-ref-field/co-ref-field.d.ts +46 -0
  213. package/dist/types/components/co-select/co-select.d.ts +67 -0
  214. package/dist/types/components.d.ts +110 -4
  215. package/dist/types/utils/fieldChip.d.ts +5 -0
  216. package/dist/types/utils/fileI18n.d.ts +1 -0
  217. package/package.json +4 -4
  218. package/dist/cjs/fieldChip-xNJPEFcS.js +0 -7
  219. package/dist/cobalt/p-02ac492f.entry.js +0 -1
  220. package/dist/cobalt/p-0ccb672b.entry.js +0 -1
  221. package/dist/cobalt/p-2d81b292.entry.js +0 -1
  222. package/dist/cobalt/p-4a503187.entry.js +0 -1
  223. package/dist/cobalt/p-55566b37.entry.js +0 -1
  224. package/dist/cobalt/p-680d3db8.entry.js +0 -1
  225. package/dist/cobalt/p-7457aa89.entry.js +0 -1
  226. package/dist/cobalt/p-77719335.entry.js +0 -1
  227. package/dist/cobalt/p-8f600512.entry.js +0 -1
  228. package/dist/cobalt/p-CQAYgqA6.js +0 -1
  229. package/dist/cobalt/p-a02db338.entry.js +0 -1
  230. package/dist/cobalt/p-a51d8775.entry.js +0 -1
  231. package/dist/cobalt/p-aafb9d11.entry.js +0 -1
  232. package/dist/cobalt/p-b28dc0fe.entry.js +0 -1
  233. package/dist/cobalt/p-c6b9b9d6.entry.js +0 -1
  234. package/dist/cobalt/p-d4debd6f.entry.js +0 -1
  235. package/dist/cobalt/p-d629fb4e.entry.js +0 -1
  236. package/dist/components/p-B3TkpLNh.js +0 -1
  237. package/dist/components/p-B7hvddnu.js +0 -1
  238. package/dist/components/p-BT5tSgZa.js +0 -1
  239. package/dist/components/p-CXLX8DpD.js +0 -1
  240. package/dist/components/p-DTvb412h.js +0 -1
  241. package/dist/components/p-DvhR3H61.js +0 -1
  242. package/dist/components/p-KWTokD0C.js +0 -1
  243. package/dist/components/p-Q6caHt79.js +0 -1
  244. package/dist/components/p-WWlZiln1.js +0 -1
  245. package/dist/esm/fieldChip-BZDUy9Z-.js +0 -5
@@ -1,5 +1,22 @@
1
- /** Seconds → "m:ss" (floors; 0 for NaN/negative). */
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;
@@ -23,5 +23,6 @@ export declare class CoCheckbox {
23
23
  /** Fired when the value changes */
24
24
  coChange: EventEmitter<boolean>;
25
25
  private handleClick;
26
+ private handleKeyDown;
26
27
  render(): any;
27
28
  }
@@ -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;