@prolibu-suite/cobalt-core 0.9.0 → 0.9.2

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 (495) hide show
  1. package/custom-elements.json +589 -27
  2. package/dist/cjs/co-accordion.cjs.entry.js +2 -2
  3. package/dist/cjs/co-action-bar.cjs.entry.js +2 -2
  4. package/dist/cjs/co-app-shell.cjs.entry.js +2 -2
  5. package/dist/cjs/co-audio-player.cjs.entry.js +3 -3
  6. package/dist/cjs/co-autocomplete.cjs.entry.js +1 -1
  7. package/dist/cjs/co-avatar_2.cjs.entry.js +2 -2
  8. package/dist/cjs/co-badge.cjs.entry.js +1 -1
  9. package/dist/cjs/co-bottom-sheet.cjs.entry.js +10 -11
  10. package/dist/cjs/co-breadcrumb-item.cjs.entry.js +2 -2
  11. package/dist/cjs/co-breadcrumb.cjs.entry.js +1 -1
  12. package/dist/cjs/co-button-group.cjs.entry.js +2 -2
  13. package/dist/cjs/co-button.cjs.entry.js +2 -2
  14. package/dist/cjs/co-calendar-month_2.cjs.entry.js +3 -3
  15. package/dist/cjs/co-calendar_3.cjs.entry.js +42 -7
  16. package/dist/cjs/co-card.cjs.entry.js +2 -2
  17. package/dist/cjs/co-carousel-item.cjs.entry.js +1 -1
  18. package/dist/cjs/co-carousel.cjs.entry.js +2 -2
  19. package/dist/cjs/co-checkbox.cjs.entry.js +3 -3
  20. package/dist/cjs/co-chip_2.cjs.entry.js +11 -11
  21. package/dist/cjs/co-color-picker.cjs.entry.js +2 -2
  22. package/dist/cjs/co-column-picker.cjs.entry.js +2 -2
  23. package/dist/cjs/co-combobox.cjs.entry.js +1 -1
  24. package/dist/cjs/co-data-table-pagination.cjs.entry.js +4 -4
  25. package/dist/cjs/co-data-table.cjs.entry.js +127 -8
  26. package/dist/cjs/co-date-range.cjs.entry.js +1 -1
  27. package/dist/cjs/co-date-time-picker.cjs.entry.js +2 -2
  28. package/dist/cjs/co-drive-card.cjs.entry.js +1 -1
  29. package/dist/cjs/co-drop-zone.cjs.entry.js +1 -1
  30. package/dist/cjs/co-emoji-picker.cjs.entry.js +2808 -0
  31. package/dist/cjs/co-empty-state.cjs.entry.js +2 -2
  32. package/dist/cjs/co-event-calendar.cjs.entry.js +2 -2
  33. package/dist/cjs/co-event-popover.cjs.entry.js +1 -1
  34. package/dist/cjs/co-fab.cjs.entry.js +3 -3
  35. package/dist/cjs/co-file-field.cjs.entry.js +5 -5
  36. package/dist/cjs/co-file-type-tile.cjs.entry.js +2 -2
  37. package/dist/cjs/co-helper-text.cjs.entry.js +2 -2
  38. package/dist/cjs/co-icon-button.cjs.entry.js +2 -2
  39. package/dist/cjs/co-icon.cjs.entry.js +2 -2
  40. package/dist/cjs/co-json-field.cjs.entry.js +3 -3
  41. package/dist/cjs/co-lightbox.cjs.entry.js +4 -4
  42. package/dist/cjs/co-list-footer.cjs.entry.js +1 -1
  43. package/dist/cjs/co-list-item.cjs.entry.js +4 -4
  44. package/dist/cjs/co-media-thumb.cjs.entry.js +2 -2
  45. package/dist/cjs/co-menu-divider.cjs.entry.js +1 -1
  46. package/dist/cjs/co-menu.cjs.entry.js +1 -1
  47. package/dist/cjs/co-modal.cjs.entry.js +9 -3
  48. package/dist/cjs/co-navbar.cjs.entry.js +2 -2
  49. package/dist/cjs/co-number-field.cjs.entry.js +2 -2
  50. package/dist/cjs/co-overlay.cjs.entry.js +1 -1
  51. package/dist/cjs/co-page-header.cjs.entry.js +1 -1
  52. package/dist/cjs/co-phone-field.cjs.entry.js +1 -1
  53. package/dist/cjs/co-popover.cjs.entry.js +49 -3
  54. package/dist/cjs/co-progress-bar.cjs.entry.js +2 -2
  55. package/dist/cjs/co-progress-circle.cjs.entry.js +2 -2
  56. package/dist/cjs/co-provider-logo_2.cjs.entry.js +1 -1
  57. package/dist/cjs/co-radio.cjs.entry.js +3 -3
  58. package/dist/cjs/co-rating.cjs.entry.js +3 -3
  59. package/dist/cjs/co-ref-field.cjs.entry.js +13 -4
  60. package/dist/cjs/co-rich-text-editor.cjs.entry.js +3 -3
  61. package/dist/cjs/co-row.cjs.entry.js +2 -2
  62. package/dist/cjs/co-select.cjs.entry.js +13 -4
  63. package/dist/cjs/co-separator.cjs.entry.js +1 -1
  64. package/dist/cjs/co-sidebar-nav.cjs.entry.js +2 -2
  65. package/dist/cjs/co-sidebar.cjs.entry.js +2 -2
  66. package/dist/cjs/co-slider.cjs.entry.js +2 -2
  67. package/dist/cjs/co-switch.cjs.entry.js +3 -3
  68. package/dist/cjs/co-tab-group.cjs.entry.js +2 -2
  69. package/dist/cjs/co-tab.cjs.entry.js +2 -2
  70. package/dist/cjs/co-tags-field.cjs.entry.js +5 -5
  71. package/dist/cjs/co-textarea.cjs.entry.js +4 -4
  72. package/dist/cjs/co-toast.cjs.entry.js +2 -2
  73. package/dist/cjs/co-toggle-button-group.cjs.entry.js +2 -2
  74. package/dist/cjs/co-toggle-button.cjs.entry.js +2 -2
  75. package/dist/cjs/co-transfer-list.cjs.entry.js +2 -2
  76. package/dist/cjs/co-video.cjs.entry.js +2 -2
  77. package/dist/cjs/cobalt.cjs.js +1 -1
  78. package/dist/cjs/emojiNames.es-BjpSEJ0c.js +1925 -0
  79. package/dist/cjs/emojiNames.pt-DWupaZMJ.js +1925 -0
  80. package/dist/cjs/index-DK-2Lzmf.js +16 -12
  81. package/dist/cjs/loader.cjs.js +1 -1
  82. package/dist/cjs/slotContent-Bm9RcM_Q.js +34 -0
  83. package/dist/cobalt/cobalt.esm.js +1 -1
  84. package/dist/cobalt/{p-142506d9.entry.js → p-02ac492f.entry.js} +1 -1
  85. package/dist/cobalt/p-07904986.entry.js +1 -0
  86. package/dist/cobalt/{p-24e93fcb.entry.js → p-07d570a6.entry.js} +1 -1
  87. package/dist/cobalt/p-09799193.entry.js +1 -0
  88. package/dist/cobalt/{p-e5b5ae89.entry.js → p-0ccb672b.entry.js} +1 -1
  89. package/dist/cobalt/{p-49bde154.entry.js → p-0e91e5c4.entry.js} +1 -1
  90. package/dist/cobalt/{p-724b9b54.entry.js → p-17ae943c.entry.js} +1 -1
  91. package/dist/cobalt/{p-fa5c25d6.entry.js → p-18af9e44.entry.js} +1 -1
  92. package/dist/cobalt/{p-b9ac1f25.entry.js → p-18d34b01.entry.js} +1 -1
  93. package/dist/cobalt/{p-d7b00e5f.entry.js → p-1c68bc41.entry.js} +1 -1
  94. package/dist/cobalt/{p-2a9ba4c8.entry.js → p-2114c036.entry.js} +1 -1
  95. package/dist/cobalt/{p-37541725.entry.js → p-23a103a0.entry.js} +1 -1
  96. package/dist/cobalt/{p-7255ab63.entry.js → p-23b3ff3f.entry.js} +1 -1
  97. package/dist/cobalt/{p-baeb5d55.entry.js → p-2d329ac8.entry.js} +1 -1
  98. package/dist/cobalt/{p-417ce874.entry.js → p-2d81b292.entry.js} +1 -1
  99. package/dist/cobalt/{p-b64b0a07.entry.js → p-316c62c0.entry.js} +1 -1
  100. package/dist/cobalt/{p-c3c2087e.entry.js → p-33ea4a90.entry.js} +1 -1
  101. package/dist/cobalt/{p-8a93beb0.entry.js → p-342e1da4.entry.js} +1 -1
  102. package/dist/cobalt/p-3495fda1.entry.js +1 -0
  103. package/dist/cobalt/{p-5f1b273b.entry.js → p-36197363.entry.js} +1 -1
  104. package/dist/cobalt/{p-2d0354cc.entry.js → p-3f0eed59.entry.js} +1 -1
  105. package/dist/cobalt/{p-6d532475.entry.js → p-43bd298d.entry.js} +1 -1
  106. package/dist/cobalt/{p-81866f71.entry.js → p-4a503187.entry.js} +1 -1
  107. package/dist/cobalt/{p-c7a809c7.entry.js → p-4b083da4.entry.js} +1 -1
  108. package/dist/cobalt/{p-f1284fcd.entry.js → p-4c7e3984.entry.js} +1 -1
  109. package/dist/cobalt/p-4f754c9a.entry.js +1 -0
  110. package/dist/cobalt/p-54ae807d.entry.js +1 -0
  111. package/dist/cobalt/{p-d21da71a.entry.js → p-55566b37.entry.js} +1 -1
  112. package/dist/cobalt/p-682b3313.entry.js +1 -0
  113. package/dist/cobalt/{p-a5d84c7a.entry.js → p-7457aa89.entry.js} +1 -1
  114. package/dist/cobalt/{p-8b7a4f6c.entry.js → p-77719335.entry.js} +1 -1
  115. package/dist/cobalt/{p-94a8a119.entry.js → p-7c5e846a.entry.js} +1 -1
  116. package/dist/cobalt/{p-9c2ce487.entry.js → p-7c88163e.entry.js} +1 -1
  117. package/dist/cobalt/{p-12a0ae24.entry.js → p-7cf4b4ae.entry.js} +1 -1
  118. package/dist/cobalt/{p-3ac316e0.entry.js → p-7e53e9c8.entry.js} +1 -1
  119. package/dist/cobalt/{p-e99832a9.entry.js → p-8183f56f.entry.js} +1 -1
  120. package/dist/cobalt/p-8345b25f.entry.js +1 -0
  121. package/dist/cobalt/{p-b004c3bb.entry.js → p-88a0659f.entry.js} +1 -1
  122. package/dist/cobalt/{p-87fc5aed.entry.js → p-89e38c5e.entry.js} +1 -1
  123. package/dist/cobalt/{p-a074f2ba.entry.js → p-8eb485c8.entry.js} +1 -1
  124. package/dist/cobalt/{p-c31f5c1b.entry.js → p-8f38e24d.entry.js} +1 -1
  125. package/dist/cobalt/{p-f52f61d4.entry.js → p-8f600512.entry.js} +1 -1
  126. package/dist/cobalt/{p-09fe6ece.entry.js → p-95efe661.entry.js} +1 -1
  127. package/dist/cobalt/{p-c42c505c.entry.js → p-983af614.entry.js} +1 -1
  128. package/dist/cobalt/p-B6oiFdUY.js +1 -0
  129. package/dist/cobalt/p-CBX_oabB.js +1 -0
  130. package/dist/cobalt/p-a02db338.entry.js +1 -0
  131. package/dist/cobalt/{p-19f5d480.entry.js → p-a51d8775.entry.js} +1 -1
  132. package/dist/cobalt/{p-d3c765e3.entry.js → p-a6357340.entry.js} +1 -1
  133. package/dist/cobalt/p-a6b5cadd.entry.js +1 -0
  134. package/dist/cobalt/{p-5d7c26f2.entry.js → p-a8c64cc3.entry.js} +1 -1
  135. package/dist/cobalt/{p-19706923.entry.js → p-a9096b5c.entry.js} +1 -1
  136. package/dist/cobalt/{p-b800e107.entry.js → p-a9b29cc2.entry.js} +1 -1
  137. package/dist/cobalt/p-aafb9d11.entry.js +1 -0
  138. package/dist/cobalt/{p-cc72557d.entry.js → p-ab45d9bd.entry.js} +1 -1
  139. package/dist/cobalt/{p-43b1f8fb.entry.js → p-ac466658.entry.js} +1 -1
  140. package/dist/cobalt/{p-3ecc29fa.entry.js → p-ac91259e.entry.js} +1 -1
  141. package/dist/cobalt/{p-a45e2c00.entry.js → p-b0319a2d.entry.js} +1 -1
  142. package/dist/cobalt/{p-8206c7c0.entry.js → p-b8581787.entry.js} +1 -1
  143. package/dist/cobalt/{p-debe0d79.entry.js → p-bfc2a849.entry.js} +1 -1
  144. package/dist/cobalt/{p-4e2379e4.entry.js → p-c1e7fb32.entry.js} +1 -1
  145. package/dist/cobalt/{p-21832273.entry.js → p-c5684c79.entry.js} +1 -1
  146. package/dist/cobalt/p-c6b9b9d6.entry.js +1 -0
  147. package/dist/cobalt/{p-ed2ca588.entry.js → p-ce35c898.entry.js} +1 -1
  148. package/dist/cobalt/{p-e5296961.entry.js → p-d15d3a97.entry.js} +1 -1
  149. package/dist/cobalt/p-d40a465f.entry.js +1 -0
  150. package/dist/cobalt/{p-d85a751d.entry.js → p-d4debd6f.entry.js} +1 -1
  151. package/dist/cobalt/{p-7ec85887.entry.js → p-d629fb4e.entry.js} +1 -1
  152. package/dist/cobalt/p-da18b5f4.entry.js +1 -0
  153. package/dist/cobalt/{p-360714ae.entry.js → p-dca4cd5f.entry.js} +1 -1
  154. package/dist/cobalt/{p-a530bec2.entry.js → p-dea43204.entry.js} +1 -1
  155. package/dist/cobalt/{p-f4cebc1f.entry.js → p-dfcf667d.entry.js} +1 -1
  156. package/dist/cobalt/{p-9fe9e2fe.entry.js → p-e5495539.entry.js} +1 -1
  157. package/dist/cobalt/{p-39bce45f.entry.js → p-e8878cf9.entry.js} +1 -1
  158. package/dist/cobalt/{p-39007b6c.entry.js → p-ef5e1167.entry.js} +1 -1
  159. package/dist/cobalt/{p-b1ef5107.entry.js → p-fabe5fb2.entry.js} +1 -1
  160. package/dist/cobalt/{p-76dff399.entry.js → p-fb3a095b.entry.js} +1 -1
  161. package/dist/cobalt/p-reaWaY4g.js +1 -0
  162. package/dist/collection/collection-manifest.json +1 -0
  163. package/dist/collection/components/co-accordion/co-accordion.js +2 -2
  164. package/dist/collection/components/co-action-bar/co-action-bar.js +2 -2
  165. package/dist/collection/components/co-app-shell/co-app-shell.js +2 -2
  166. package/dist/collection/components/co-audio-player/co-audio-player.js +3 -3
  167. package/dist/collection/components/co-autocomplete/co-autocomplete.css +1 -1
  168. package/dist/collection/components/co-autocomplete/co-autocomplete.js +1 -1
  169. package/dist/collection/components/co-avatar-group/co-avatar-group.js +1 -1
  170. package/dist/collection/components/co-badge/co-badge.js +1 -1
  171. package/dist/collection/components/co-bottom-sheet/co-bottom-sheet.js +10 -11
  172. package/dist/collection/components/co-breadcrumb/co-breadcrumb.js +1 -1
  173. package/dist/collection/components/co-breadcrumb-item/co-breadcrumb-item.js +2 -2
  174. package/dist/collection/components/co-button/co-button.js +2 -2
  175. package/dist/collection/components/co-button-group/co-button-group.js +2 -2
  176. package/dist/collection/components/co-calendar/co-calendar.js +1 -1
  177. package/dist/collection/components/co-calendar-month/co-calendar-month.js +1 -1
  178. package/dist/collection/components/co-calendar-timegrid/co-calendar-timegrid.js +2 -2
  179. package/dist/collection/components/co-card/co-card.js +2 -2
  180. package/dist/collection/components/co-carousel/co-carousel.js +2 -2
  181. package/dist/collection/components/co-carousel-item/co-carousel-item.js +1 -1
  182. package/dist/collection/components/co-checkbox/co-checkbox.js +3 -3
  183. package/dist/collection/components/co-checkbox-group/co-checkbox-group.js +1 -1
  184. package/dist/collection/components/co-chip/co-chip.js +2 -2
  185. package/dist/collection/components/co-color-picker/co-color-picker.js +2 -2
  186. package/dist/collection/components/co-column-picker/co-column-picker.js +2 -2
  187. package/dist/collection/components/co-combobox/co-combobox.css +3 -1
  188. package/dist/collection/components/co-combobox/co-combobox.js +1 -1
  189. package/dist/collection/components/co-command-search/co-command-search.js +1 -1
  190. package/dist/collection/components/co-data-table/co-data-table.css +33 -0
  191. package/dist/collection/components/co-data-table/co-data-table.js +90 -8
  192. package/dist/collection/components/co-data-table-pagination/co-data-table-pagination.js +4 -4
  193. package/dist/collection/components/co-date-field/co-date-field.js +4 -4
  194. package/dist/collection/components/co-date-range/co-date-range.js +1 -1
  195. package/dist/collection/components/co-date-range-picker/co-date-range-picker.js +2 -2
  196. package/dist/collection/components/co-date-time-picker/co-date-time-picker.js +2 -2
  197. package/dist/collection/components/co-drawer/co-drawer.css +5 -2
  198. package/dist/collection/components/co-drawer/co-drawer.js +43 -1
  199. package/dist/collection/components/co-drive-card/co-drive-card.js +1 -1
  200. package/dist/collection/components/co-drop-zone/co-drop-zone.js +1 -1
  201. package/dist/collection/components/co-emoji-picker/co-emoji-picker.css +290 -0
  202. package/dist/collection/components/co-emoji-picker/co-emoji-picker.js +682 -0
  203. package/dist/collection/components/co-emoji-picker/emojiData.js +1953 -0
  204. package/dist/collection/components/co-emoji-picker/emojiNames.es.js +1922 -0
  205. package/dist/collection/components/co-emoji-picker/emojiNames.pt.js +1922 -0
  206. package/dist/collection/components/co-emoji-picker/emojiPickerLogic.js +375 -0
  207. package/dist/collection/components/co-empty-state/co-empty-state.js +2 -2
  208. package/dist/collection/components/co-event-calendar/co-event-calendar.js +2 -2
  209. package/dist/collection/components/co-event-popover/co-event-popover.js +1 -1
  210. package/dist/collection/components/co-fab/co-fab.css +8 -5
  211. package/dist/collection/components/co-fab/co-fab.js +2 -2
  212. package/dist/collection/components/co-file-field/co-file-field.js +5 -5
  213. package/dist/collection/components/co-file-type-tile/co-file-type-tile.js +2 -2
  214. package/dist/collection/components/co-helper-text/co-helper-text.js +2 -2
  215. package/dist/collection/components/co-icon/co-icon.js +2 -2
  216. package/dist/collection/components/co-icon-button/co-icon-button.css +25 -0
  217. package/dist/collection/components/co-icon-button/co-icon-button.js +1 -1
  218. package/dist/collection/components/co-json-field/co-json-field.js +3 -3
  219. package/dist/collection/components/co-lightbox/co-lightbox.js +4 -4
  220. package/dist/collection/components/co-list-footer/co-list-footer.js +1 -1
  221. package/dist/collection/components/co-list-item/co-list-item.js +4 -4
  222. package/dist/collection/components/co-media-thumb/co-media-thumb.js +2 -2
  223. package/dist/collection/components/co-menu/co-menu.js +1 -1
  224. package/dist/collection/components/co-menu-divider/co-menu-divider.js +1 -1
  225. package/dist/collection/components/co-modal/co-modal.css +3 -1
  226. package/dist/collection/components/co-modal/co-modal.js +13 -2
  227. package/dist/collection/components/co-navbar/co-navbar.js +2 -2
  228. package/dist/collection/components/co-number-field/co-number-field.js +2 -2
  229. package/dist/collection/components/co-option-list/co-option-list.css +11 -9
  230. package/dist/collection/components/co-option-list/co-option-list.js +8 -8
  231. package/dist/collection/components/co-overlay/co-overlay.js +1 -1
  232. package/dist/collection/components/co-page-header/co-page-header.js +1 -1
  233. package/dist/collection/components/co-phone-field/co-phone-field.js +1 -1
  234. package/dist/collection/components/co-popover/co-popover.js +27 -5
  235. package/dist/collection/components/co-progress-bar/co-progress-bar.js +2 -2
  236. package/dist/collection/components/co-progress-circle/co-progress-circle.js +2 -2
  237. package/dist/collection/components/co-radio/co-radio.js +3 -3
  238. package/dist/collection/components/co-radio-group/co-radio-group.js +1 -1
  239. package/dist/collection/components/co-rating/co-rating.js +3 -3
  240. package/dist/collection/components/co-ref-field/co-ref-field.css +15 -0
  241. package/dist/collection/components/co-ref-field/co-ref-field.js +72 -4
  242. package/dist/collection/components/co-rich-text-editor/co-rich-text-editor.js +3 -3
  243. package/dist/collection/components/co-row/co-row.js +2 -2
  244. package/dist/collection/components/co-segmented-bar/co-segmented-bar.js +1 -1
  245. package/dist/collection/components/co-select/co-select.js +68 -5
  246. package/dist/collection/components/co-separator/co-separator.js +1 -1
  247. package/dist/collection/components/co-sidebar/co-sidebar.js +2 -2
  248. package/dist/collection/components/co-sidebar-nav/co-sidebar-nav.js +3 -3
  249. package/dist/collection/components/co-skeleton/co-skeleton.js +1 -1
  250. package/dist/collection/components/co-slider/co-slider.js +2 -2
  251. package/dist/collection/components/co-switch/co-switch.js +3 -3
  252. package/dist/collection/components/co-tab/co-tab.js +2 -2
  253. package/dist/collection/components/co-tab-group/co-tab-group.js +2 -2
  254. package/dist/collection/components/co-tags-field/co-tags-field.js +5 -5
  255. package/dist/collection/components/co-textarea/co-textarea.js +4 -4
  256. package/dist/collection/components/co-toast/co-toast.js +4 -4
  257. package/dist/collection/components/co-toggle-button/co-toggle-button.js +2 -2
  258. package/dist/collection/components/co-toggle-button-group/co-toggle-button-group.js +2 -2
  259. package/dist/collection/components/co-tooltip/co-tooltip.js +2 -2
  260. package/dist/collection/components/co-transfer-list/co-transfer-list.js +3 -3
  261. package/dist/collection/components/co-video/co-video.js +2 -2
  262. package/dist/collection/utils/columnResize.js +37 -0
  263. package/dist/collection/utils/emojiI18n.js +92 -0
  264. package/dist/collection/utils/popover-stack.js +28 -0
  265. package/dist/collection/utils/slotContent.js +30 -0
  266. package/dist/components/co-accordion.js +1 -1
  267. package/dist/components/co-action-bar.js +1 -1
  268. package/dist/components/co-app-shell.js +1 -1
  269. package/dist/components/co-audio-player.js +1 -1
  270. package/dist/components/co-autocomplete.js +1 -1
  271. package/dist/components/co-avatar-group.js +1 -1
  272. package/dist/components/co-avatar.js +1 -1
  273. package/dist/components/co-badge.js +1 -1
  274. package/dist/components/co-bottom-sheet.js +1 -1
  275. package/dist/components/co-breadcrumb-item.js +1 -1
  276. package/dist/components/co-breadcrumb.js +1 -1
  277. package/dist/components/co-button-group.js +1 -1
  278. package/dist/components/co-button.js +1 -1
  279. package/dist/components/co-calendar-month.js +1 -1
  280. package/dist/components/co-calendar-timegrid.js +1 -1
  281. package/dist/components/co-calendar.js +1 -1
  282. package/dist/components/co-card.js +1 -1
  283. package/dist/components/co-carousel-item.js +1 -1
  284. package/dist/components/co-carousel.js +1 -1
  285. package/dist/components/co-checkbox-group.js +1 -1
  286. package/dist/components/co-checkbox.js +1 -1
  287. package/dist/components/co-chip.js +1 -1
  288. package/dist/components/co-color-picker.js +1 -1
  289. package/dist/components/co-column-picker.js +1 -1
  290. package/dist/components/co-combobox.js +1 -1
  291. package/dist/components/co-command-search.js +1 -1
  292. package/dist/components/co-data-table-pagination.js +1 -1
  293. package/dist/components/co-data-table.js +1 -1
  294. package/dist/components/co-date-field.js +1 -1
  295. package/dist/components/co-date-picker.js +1 -1
  296. package/dist/components/co-date-range-picker.js +1 -1
  297. package/dist/components/co-date-range.js +1 -1
  298. package/dist/components/co-date-time-picker.js +1 -1
  299. package/dist/components/co-drawer.js +1 -1
  300. package/dist/components/co-drive-card.js +1 -1
  301. package/dist/components/co-drop-zone.js +1 -1
  302. package/dist/components/co-emoji-picker.d.ts +11 -0
  303. package/dist/components/co-emoji-picker.js +1 -0
  304. package/dist/components/co-empty-state.js +1 -1
  305. package/dist/components/co-event-calendar.js +1 -1
  306. package/dist/components/co-event-popover.js +1 -1
  307. package/dist/components/co-fab.js +1 -1
  308. package/dist/components/co-file-field.js +1 -1
  309. package/dist/components/co-file-type-tile.js +1 -1
  310. package/dist/components/co-helper-text.js +1 -1
  311. package/dist/components/co-icon-button.js +1 -1
  312. package/dist/components/co-icon.js +1 -1
  313. package/dist/components/co-input.js +1 -1
  314. package/dist/components/co-json-field.js +1 -1
  315. package/dist/components/co-lightbox.js +1 -1
  316. package/dist/components/co-list-footer.js +1 -1
  317. package/dist/components/co-list-item.js +1 -1
  318. package/dist/components/co-media-thumb.js +1 -1
  319. package/dist/components/co-menu-divider.js +1 -1
  320. package/dist/components/co-menu-item.js +1 -1
  321. package/dist/components/co-menu.js +1 -1
  322. package/dist/components/co-modal.js +1 -1
  323. package/dist/components/co-navbar.js +1 -1
  324. package/dist/components/co-number-field.js +1 -1
  325. package/dist/components/co-option-list.js +1 -1
  326. package/dist/components/co-overlay.js +1 -1
  327. package/dist/components/co-page-header.js +1 -1
  328. package/dist/components/co-phone-field.js +1 -1
  329. package/dist/components/co-popover.js +1 -1
  330. package/dist/components/co-progress-bar.js +1 -1
  331. package/dist/components/co-progress-circle.js +1 -1
  332. package/dist/components/co-radio-group.js +1 -1
  333. package/dist/components/co-radio.js +1 -1
  334. package/dist/components/co-rating.js +1 -1
  335. package/dist/components/co-ref-field.js +1 -1
  336. package/dist/components/co-rich-text-editor.js +1 -1
  337. package/dist/components/co-rich-text-toolbar.js +1 -1
  338. package/dist/components/co-row.js +1 -1
  339. package/dist/components/co-select.js +1 -1
  340. package/dist/components/co-separator.js +1 -1
  341. package/dist/components/co-sidebar-nav.js +1 -1
  342. package/dist/components/co-sidebar.js +1 -1
  343. package/dist/components/co-skeleton.js +1 -1
  344. package/dist/components/co-slider.js +1 -1
  345. package/dist/components/co-switch.js +1 -1
  346. package/dist/components/co-tab-group.js +1 -1
  347. package/dist/components/co-tab.js +1 -1
  348. package/dist/components/co-tags-field.js +1 -1
  349. package/dist/components/co-textarea.js +1 -1
  350. package/dist/components/co-toast.js +1 -1
  351. package/dist/components/co-toggle-button-group.js +1 -1
  352. package/dist/components/co-toggle-button.js +1 -1
  353. package/dist/components/co-tooltip.js +1 -1
  354. package/dist/components/co-transfer-list.js +1 -1
  355. package/dist/components/co-video.js +1 -1
  356. package/dist/components/p-AvSaw4Ua.js +1 -0
  357. package/dist/components/p-B3TkpLNh.js +1 -0
  358. package/dist/components/p-B6oiFdUY.js +1 -0
  359. package/dist/components/{p-CmxZEGYq.js → p-B7hvddnu.js} +1 -1
  360. package/dist/components/{p-Ce0ZJcks.js → p-BGD3oQ73.js} +1 -1
  361. package/dist/components/{p-CJNo2JDc.js → p-BT5tSgZa.js} +1 -1
  362. package/dist/components/{p-CYv2ig6I.js → p-BsQQ7Mki.js} +1 -1
  363. package/dist/components/p-CBX_oabB.js +1 -0
  364. package/dist/components/{p-Cv5yuGLz.js → p-CXLX8DpD.js} +1 -1
  365. package/dist/components/{p-DFT1qsVu.js → p-CklsvHeL.js} +1 -1
  366. package/dist/components/{p-CKKBJaNB.js → p-CyMaOb1j.js} +1 -1
  367. package/dist/components/{p-xvWmYN3W.js → p-D5QJpmqf.js} +1 -1
  368. package/dist/components/{p-BlvsTlsS.js → p-D6OUW6oW.js} +1 -1
  369. package/dist/components/p-DP0bbhfN.js +1 -0
  370. package/dist/components/{p-BUE9mBqk.js → p-DTvb412h.js} +1 -1
  371. package/dist/components/{p-Bsll5Ofy.js → p-DkmKOF60.js} +1 -1
  372. package/dist/components/{p-re2gJwnQ.js → p-DolCkNsL.js} +1 -1
  373. package/dist/components/{p-CkQqqKRp.js → p-KWTokD0C.js} +1 -1
  374. package/dist/components/{p-BCnjq3jN.js → p-Q6caHt79.js} +1 -1
  375. package/dist/components/{p-2zy1K6zg.js → p-WWlZiln1.js} +1 -1
  376. package/dist/components/{p-DAaKsGqj.js → p-_131DL6m.js} +1 -1
  377. package/dist/components/{p-ushHimOL.js → p-gI62K3Be.js} +1 -1
  378. package/dist/components/{p-_YYd42XM.js → p-mom5kiBa.js} +1 -1
  379. package/dist/components/p-nwy6X1QT.js +1 -0
  380. package/dist/components/p-reaWaY4g.js +1 -0
  381. package/dist/esm/co-accordion.entry.js +2 -2
  382. package/dist/esm/co-action-bar.entry.js +2 -2
  383. package/dist/esm/co-app-shell.entry.js +2 -2
  384. package/dist/esm/co-audio-player.entry.js +3 -3
  385. package/dist/esm/co-autocomplete.entry.js +1 -1
  386. package/dist/esm/co-avatar_2.entry.js +2 -2
  387. package/dist/esm/co-badge.entry.js +1 -1
  388. package/dist/esm/co-bottom-sheet.entry.js +10 -11
  389. package/dist/esm/co-breadcrumb-item.entry.js +2 -2
  390. package/dist/esm/co-breadcrumb.entry.js +1 -1
  391. package/dist/esm/co-button-group.entry.js +2 -2
  392. package/dist/esm/co-button.entry.js +2 -2
  393. package/dist/esm/co-calendar-month_2.entry.js +3 -3
  394. package/dist/esm/co-calendar_3.entry.js +42 -7
  395. package/dist/esm/co-card.entry.js +2 -2
  396. package/dist/esm/co-carousel-item.entry.js +1 -1
  397. package/dist/esm/co-carousel.entry.js +2 -2
  398. package/dist/esm/co-checkbox.entry.js +3 -3
  399. package/dist/esm/co-chip_2.entry.js +11 -11
  400. package/dist/esm/co-color-picker.entry.js +2 -2
  401. package/dist/esm/co-column-picker.entry.js +2 -2
  402. package/dist/esm/co-combobox.entry.js +1 -1
  403. package/dist/esm/co-data-table-pagination.entry.js +4 -4
  404. package/dist/esm/co-data-table.entry.js +127 -8
  405. package/dist/esm/co-date-range.entry.js +1 -1
  406. package/dist/esm/co-date-time-picker.entry.js +2 -2
  407. package/dist/esm/co-drive-card.entry.js +1 -1
  408. package/dist/esm/co-drop-zone.entry.js +1 -1
  409. package/dist/esm/co-emoji-picker.entry.js +2806 -0
  410. package/dist/esm/co-empty-state.entry.js +2 -2
  411. package/dist/esm/co-event-calendar.entry.js +2 -2
  412. package/dist/esm/co-event-popover.entry.js +1 -1
  413. package/dist/esm/co-fab.entry.js +3 -3
  414. package/dist/esm/co-file-field.entry.js +5 -5
  415. package/dist/esm/co-file-type-tile.entry.js +2 -2
  416. package/dist/esm/co-helper-text.entry.js +2 -2
  417. package/dist/esm/co-icon-button.entry.js +2 -2
  418. package/dist/esm/co-icon.entry.js +2 -2
  419. package/dist/esm/co-json-field.entry.js +3 -3
  420. package/dist/esm/co-lightbox.entry.js +4 -4
  421. package/dist/esm/co-list-footer.entry.js +1 -1
  422. package/dist/esm/co-list-item.entry.js +4 -4
  423. package/dist/esm/co-media-thumb.entry.js +2 -2
  424. package/dist/esm/co-menu-divider.entry.js +1 -1
  425. package/dist/esm/co-menu.entry.js +1 -1
  426. package/dist/esm/co-modal.entry.js +9 -3
  427. package/dist/esm/co-navbar.entry.js +2 -2
  428. package/dist/esm/co-number-field.entry.js +2 -2
  429. package/dist/esm/co-overlay.entry.js +1 -1
  430. package/dist/esm/co-page-header.entry.js +1 -1
  431. package/dist/esm/co-phone-field.entry.js +1 -1
  432. package/dist/esm/co-popover.entry.js +49 -3
  433. package/dist/esm/co-progress-bar.entry.js +2 -2
  434. package/dist/esm/co-progress-circle.entry.js +2 -2
  435. package/dist/esm/co-provider-logo_2.entry.js +1 -1
  436. package/dist/esm/co-radio.entry.js +3 -3
  437. package/dist/esm/co-rating.entry.js +3 -3
  438. package/dist/esm/co-ref-field.entry.js +13 -4
  439. package/dist/esm/co-rich-text-editor.entry.js +3 -3
  440. package/dist/esm/co-row.entry.js +2 -2
  441. package/dist/esm/co-select.entry.js +13 -4
  442. package/dist/esm/co-separator.entry.js +1 -1
  443. package/dist/esm/co-sidebar-nav.entry.js +2 -2
  444. package/dist/esm/co-sidebar.entry.js +2 -2
  445. package/dist/esm/co-slider.entry.js +2 -2
  446. package/dist/esm/co-switch.entry.js +3 -3
  447. package/dist/esm/co-tab-group.entry.js +2 -2
  448. package/dist/esm/co-tab.entry.js +2 -2
  449. package/dist/esm/co-tags-field.entry.js +5 -5
  450. package/dist/esm/co-textarea.entry.js +4 -4
  451. package/dist/esm/co-toast.entry.js +2 -2
  452. package/dist/esm/co-toggle-button-group.entry.js +2 -2
  453. package/dist/esm/co-toggle-button.entry.js +2 -2
  454. package/dist/esm/co-transfer-list.entry.js +2 -2
  455. package/dist/esm/co-video.entry.js +2 -2
  456. package/dist/esm/cobalt.js +1 -1
  457. package/dist/esm/emojiNames.es-reaWaY4g.js +1923 -0
  458. package/dist/esm/emojiNames.pt-B6oiFdUY.js +1923 -0
  459. package/dist/esm/index-CrtiywTB.js +16 -12
  460. package/dist/esm/loader.js +1 -1
  461. package/dist/esm/slotContent-CBX_oabB.js +32 -0
  462. package/dist/types/components/co-bottom-sheet/co-bottom-sheet.d.ts +0 -1
  463. package/dist/types/components/co-data-table/co-data-table.d.ts +5 -0
  464. package/dist/types/components/co-drawer/co-drawer.d.ts +23 -0
  465. package/dist/types/components/co-emoji-picker/co-emoji-picker.d.ts +145 -0
  466. package/dist/types/components/co-emoji-picker/emojiData.d.ts +24 -0
  467. package/dist/types/components/co-emoji-picker/emojiNames.es.d.ts +12 -0
  468. package/dist/types/components/co-emoji-picker/emojiNames.pt.d.ts +12 -0
  469. package/dist/types/components/co-emoji-picker/emojiPickerLogic.d.ts +149 -0
  470. package/dist/types/components/co-modal/co-modal.d.ts +2 -0
  471. package/dist/types/components/co-popover/co-popover.d.ts +8 -1
  472. package/dist/types/components/co-ref-field/co-ref-field.d.ts +17 -0
  473. package/dist/types/components/co-select/co-select.d.ts +7 -0
  474. package/dist/types/components.d.ts +255 -2
  475. package/dist/types/utils/columnResize.d.ts +42 -0
  476. package/dist/types/utils/emojiI18n.d.ts +22 -0
  477. package/dist/types/utils/popover-stack.d.ts +5 -0
  478. package/dist/types/utils/slotContent.d.ts +19 -0
  479. package/package.json +4 -4
  480. package/dist/cobalt/p-212ed2ba.entry.js +0 -1
  481. package/dist/cobalt/p-2aeb1471.entry.js +0 -1
  482. package/dist/cobalt/p-30ec230e.entry.js +0 -1
  483. package/dist/cobalt/p-5ddebd10.entry.js +0 -1
  484. package/dist/cobalt/p-5f0f5d4b.entry.js +0 -1
  485. package/dist/cobalt/p-7521ec0c.entry.js +0 -1
  486. package/dist/cobalt/p-77593319.entry.js +0 -1
  487. package/dist/cobalt/p-7a2dab23.entry.js +0 -1
  488. package/dist/cobalt/p-e054cb52.entry.js +0 -1
  489. package/dist/cobalt/p-e612b43c.entry.js +0 -1
  490. package/dist/cobalt/p-e7e34852.entry.js +0 -1
  491. package/dist/cobalt/p-f1731fe9.entry.js +0 -1
  492. package/dist/components/p-Bh2__nEw.js +0 -1
  493. package/dist/components/p-BiefJDu3.js +0 -1
  494. package/dist/components/p-CL4dicvk.js +0 -1
  495. package/dist/components/p-DTJsO_Eg.js +0 -1
@@ -0,0 +1,375 @@
1
+ // emojiPickerLogic.ts — lógica pura de co-emoji-picker (patrón optionListLogic /
2
+ // commandSearchLogic: todo lo testeable sin DOM vive acá).
3
+ import { rankByMatch } from "../../utils/normalizeText";
4
+ import { EMOJI_CATEGORIES, EMOJI_PACKED, EMOJI_TONE_FLAGS } from "./emojiData";
5
+ /** Categoría sintética de recientes: va primera y solo existe si hay historial. */
6
+ export const RECENT_CATEGORY = 'recent';
7
+ /** Alto uniforme de fila (header y grilla) en px. Uniforme a propósito: la
8
+ * virtualización se reduce a `top = row * ROW_HEIGHT`, sin prefix-sums. */
9
+ export const ROW_HEIGHT = 36;
10
+ /** Filas de más renderizadas arriba y abajo del viewport. */
11
+ export const OVERSCAN = 2;
12
+ /** Columnas por defecto (espejo del default de la prop `columns`). */
13
+ export const DEFAULT_COLUMNS = 8;
14
+ /** Offset del espacio de índices de los recientes (ver `EmojiEntry.index`). */
15
+ export const RECENT_INDEX_BASE = 1000000;
16
+ // ── Dataset ─────────────────────────────────────────────────────────────────
17
+ let cachedEntries = null;
18
+ /**
19
+ * Desempaqueta EMOJI_PACKED a entradas. Memoizado a nivel de módulo: se paga
20
+ * UNA vez por documento aunque se monten varios pickers.
21
+ */
22
+ export function getEmojiEntries() {
23
+ if (cachedEntries)
24
+ return cachedEntries;
25
+ const out = [];
26
+ let index = 0;
27
+ EMOJI_PACKED.forEach((packed, catIdx) => {
28
+ var _a;
29
+ const category = EMOJI_CATEGORIES[catIdx];
30
+ const flags = (_a = EMOJI_TONE_FLAGS[catIdx]) !== null && _a !== void 0 ? _a : '';
31
+ let inCat = 0;
32
+ for (const line of packed.split('\n')) {
33
+ const sep = line.indexOf(' ');
34
+ if (sep < 0)
35
+ continue;
36
+ out.push({
37
+ char: line.slice(0, sep),
38
+ name: line.slice(sep + 1),
39
+ category,
40
+ index,
41
+ nameIndex: index,
42
+ tone: flags[inCat] || '0',
43
+ });
44
+ index++;
45
+ inCat++;
46
+ }
47
+ });
48
+ cachedEntries = out;
49
+ return out;
50
+ }
51
+ /** Cargadores estáticos (specifier literal) — sin ellos el bundler no puede
52
+ * partir el chunk y los packs volverían al bundle principal. */
53
+ const LOCALE_LOADERS = {
54
+ es: () => import('./emojiNames.es'),
55
+ pt: () => import('./emojiNames.pt'),
56
+ };
57
+ /** Locales con pack de nombres propio. El resto usa los nombres en inglés. */
58
+ export function hasLocalePack(lang) {
59
+ return lang in LOCALE_LOADERS;
60
+ }
61
+ /**
62
+ * Nombres localizados, alineados por índice global con `getEmojiEntries()`.
63
+ * Devuelve null si el locale no tiene pack o si la carga falla — el llamador
64
+ * cae a los nombres en inglés (degradación, nunca excepción).
65
+ */
66
+ export async function loadLocaleNames(lang) {
67
+ const loader = LOCALE_LOADERS[lang];
68
+ if (!loader)
69
+ return null;
70
+ try {
71
+ const mod = await loader();
72
+ return mod.default.flatMap((packed) => packed.split('\n'));
73
+ }
74
+ catch (_a) {
75
+ return null;
76
+ }
77
+ }
78
+ // ── Tono de piel ────────────────────────────────────────────────────────────
79
+ /** Los 5 modificadores Fitzpatrick, en orden claro → oscuro (U+1F3FB..U+1F3FF). */
80
+ export const SKIN_TONES = ['\u{1F3FB}', '\u{1F3FC}', '\u{1F3FD}', '\u{1F3FE}', '\u{1F3FF}'];
81
+ /** Claves estables de la API pública: '' = por defecto (amarillo). */
82
+ export const SKIN_TONE_KEYS = ['', 'light', 'medium-light', 'medium', 'medium-dark', 'dark'];
83
+ /** Codepoints de persona que pueden repetirse en una secuencia (flag '2'). */
84
+ const PERSON_CPS = new Set(['\u{1F468}', '\u{1F469}', '\u{1F9D1}']);
85
+ const VS16 = '️';
86
+ /** Modificador correspondiente a una clave pública, o '' si no aplica. */
87
+ export function toneFromKey(key) {
88
+ const i = SKIN_TONE_KEYS.indexOf(key);
89
+ return i > 0 ? SKIN_TONES[i - 1] : '';
90
+ }
91
+ /**
92
+ * Aplica un modificador de tono a un emoji según su flag.
93
+ *
94
+ * Reglas (las dos que exige Unicode, no una aproximación):
95
+ * - El modificador REEMPLAZA al selector de variación U+FE0F que siga a la
96
+ * base: ✌️ (270C FE0F) + medio = 270C 1F3FD, no 270C FE0F 1F3FD. Solo al de
97
+ * la base — el FE0F de un componente posterior (♀️ en 🕵️‍♀️) se conserva.
98
+ * - Las secuencias multi-persona (flag '2') llevan el modificador en CADA
99
+ * persona: 👩‍❤️‍👨 tonado es 1F469 tono 200D 2764 FE0F 200D 1F468 tono. Con uno
100
+ * solo la secuencia deja de ser RGI y el navegador la parte en dos glifos.
101
+ */
102
+ export function applySkinTone(char, flag, tone) {
103
+ if (!tone || flag === '0')
104
+ return char;
105
+ const cps = Array.from(char);
106
+ if (flag === '2') {
107
+ let out = '';
108
+ for (const cp of cps) {
109
+ out += cp;
110
+ if (PERSON_CPS.has(cp))
111
+ out += tone;
112
+ }
113
+ return out;
114
+ }
115
+ const rest = cps.slice(1);
116
+ if (rest[0] === VS16)
117
+ rest.shift();
118
+ return cps[0] + tone + rest.join('');
119
+ }
120
+ /** Quita todo modificador de tono de un carácter (para volver a la base). */
121
+ export function stripSkinTone(char) {
122
+ const tones = [...SKIN_TONES];
123
+ return Array.from(char)
124
+ .filter((cp) => !tones.includes(cp))
125
+ .join('');
126
+ }
127
+ // ── Recientes ───────────────────────────────────────────────────────────────
128
+ let cachedByChar = null;
129
+ let cachedByKey = null;
130
+ /**
131
+ * Clave de búsqueda tolerante: sin modificadores de tono y sin selectores de
132
+ * variación.
133
+ *
134
+ * Hace falta porque el modificador de tono SE COME el U+FE0F de la base, y ese
135
+ * FE0F puede estar en medio de la secuencia: 🕵️‍♂️ es `1F575 FE0F 200D 2642 FE0F`
136
+ * y tonado queda `1F575 1F3FD 200D 2642 FE0F`. Destonar no lo devuelve, y
137
+ * re-anexar un FE0F al final tampoco — habría que reinsertarlo en la posición
138
+ * correcta. Normalizar ambos lados es más simple y no depende de adivinar dónde
139
+ * iba.
140
+ */
141
+ function normalizeKey(char) {
142
+ const tones = [...SKIN_TONES];
143
+ return Array.from(char)
144
+ .filter((cp) => cp !== VS16 && !tones.includes(cp))
145
+ .join('');
146
+ }
147
+ /** Índices char → entrada del dataset. Memoizados igual que `getEmojiEntries`. */
148
+ function entriesByChar() {
149
+ if (!cachedByChar || !cachedByKey) {
150
+ const exact = new Map();
151
+ const normalized = new Map();
152
+ for (const e of getEmojiEntries()) {
153
+ exact.set(e.char, e);
154
+ // Primero gana: si dos formas normalizan igual, la de menor índice manda.
155
+ const key = normalizeKey(e.char);
156
+ if (!normalized.has(key))
157
+ normalized.set(key, e);
158
+ }
159
+ cachedByChar = exact;
160
+ cachedByKey = normalized;
161
+ }
162
+ return { exact: cachedByChar, normalized: cachedByKey };
163
+ }
164
+ /**
165
+ * Resuelve un carácter (posiblemente tonado) a su entrada del dataset. Prueba la
166
+ * forma exacta —el caso común, sin costo— y cae a la clave normalizada.
167
+ */
168
+ export function resolveEmoji(char) {
169
+ var _a;
170
+ if (typeof char !== 'string' || !char)
171
+ return undefined;
172
+ const { exact, normalized } = entriesByChar();
173
+ return (_a = exact.get(char)) !== null && _a !== void 0 ? _a : normalized.get(normalizeKey(char));
174
+ }
175
+ /**
176
+ * Entradas para la fila de recientes. Los caracteres los da el consumidor (es
177
+ * el dueño del historial), así que acá se sanea: se descarta lo que no resuelve
178
+ * contra el dataset, se deduplica conservando el orden, y se recorta a `max`.
179
+ *
180
+ * El carácter se conserva TAL CUAL vino —con su tono— y por eso la entrada sale
181
+ * con `tone: '0'`: ya está resuelto, no hay que volver a tonarlo.
182
+ */
183
+ export function buildRecentEntries(recent, max) {
184
+ if (!Array.isArray(recent) || recent.length === 0)
185
+ return [];
186
+ const out = [];
187
+ const seen = new Set();
188
+ for (const char of recent) {
189
+ if (typeof char !== 'string' || !char || seen.has(char))
190
+ continue;
191
+ const base = resolveEmoji(char);
192
+ if (!base)
193
+ continue;
194
+ seen.add(char);
195
+ out.push({
196
+ char,
197
+ name: base.name,
198
+ category: RECENT_CATEGORY,
199
+ index: RECENT_INDEX_BASE + out.length,
200
+ nameIndex: base.nameIndex,
201
+ tone: '0',
202
+ });
203
+ if (out.length >= max)
204
+ break;
205
+ }
206
+ return out;
207
+ }
208
+ /**
209
+ * Lista de recientes actualizada tras elegir `emoji` (MRU: más reciente
210
+ * primero, sin repetidos, recortada a `max`). Es una función pura para que el
211
+ * consumidor —dueño de la persistencia— no tenga que reimplementar la política.
212
+ */
213
+ export function pushRecent(recent, emoji, max) {
214
+ const prev = Array.isArray(recent) ? recent : [];
215
+ return [emoji, ...prev.filter((c) => c !== emoji)].slice(0, Math.max(1, max));
216
+ }
217
+ // ── Búsqueda ────────────────────────────────────────────────────────────────
218
+ /**
219
+ * Filtra por nombre, rankeando por relevancia (`rankByMatch`: exacto > prefijo >
220
+ * prefijo de palabra > substring), insensible a acentos y mayúsculas.
221
+ *
222
+ * Cuando hay pack de locale busca contra el nombre localizado Y el inglés: los
223
+ * emoji sin traducción CLDR (la mayoría de las banderas) siguen siendo
224
+ * encontrables, y quien tipea en inglés sobre una UI en español también acierta.
225
+ */
226
+ export function searchEmojis(entries, query, localeNames) {
227
+ // Tolera undefined: es un punto de entrada público y el valor viene de una
228
+ // @State/@Prop que un consumidor puede dejar sin setear.
229
+ if (!String(query !== null && query !== void 0 ? query : '').trim())
230
+ return entries;
231
+ return rankByMatch(entries, query, (e) => {
232
+ const localized = localeNames === null || localeNames === void 0 ? void 0 : localeNames[e.nameIndex];
233
+ return localized && localized !== e.name ? [localized, e.name] : e.name;
234
+ });
235
+ }
236
+ /** Nombre a mostrar (tooltip / aria-label) para una entrada. */
237
+ export function displayName(entry, localeNames) {
238
+ var _a;
239
+ return (_a = localeNames === null || localeNames === void 0 ? void 0 : localeNames[entry.nameIndex]) !== null && _a !== void 0 ? _a : entry.name;
240
+ }
241
+ // ── Layout de grilla ────────────────────────────────────────────────────────
242
+ /**
243
+ * Aplana a filas de render. `grouped` inserta un header por categoría (modo
244
+ * idle); en modo búsqueda los resultados van en una grilla continua, porque
245
+ * vienen ordenados por relevancia y no por categoría.
246
+ */
247
+ export function layoutRows(entries, columns, grouped) {
248
+ // `Math.max(1, undefined)` es NaN y partiría la grilla en silencio.
249
+ const cols = Number.isFinite(columns) ? Math.max(1, Math.floor(columns)) : DEFAULT_COLUMNS;
250
+ const rows = [];
251
+ const pushGrid = (list) => {
252
+ for (let i = 0; i < list.length; i += cols)
253
+ rows.push({ kind: 'emoji', entries: list.slice(i, i + cols) });
254
+ };
255
+ if (!grouped) {
256
+ pushGrid(entries);
257
+ return rows;
258
+ }
259
+ let current = null;
260
+ let bucket = [];
261
+ for (const entry of entries) {
262
+ if (entry.category !== current) {
263
+ if (bucket.length)
264
+ pushGrid(bucket);
265
+ bucket = [];
266
+ current = entry.category;
267
+ rows.push({ kind: 'header', category: current });
268
+ }
269
+ bucket.push(entry);
270
+ }
271
+ if (bucket.length)
272
+ pushGrid(bucket);
273
+ return rows;
274
+ }
275
+ /** Posición (fila, columna) de cada índice global dentro de un layout. */
276
+ export function buildPositionMap(rows) {
277
+ const map = new Map();
278
+ rows.forEach((row, r) => {
279
+ if (row.kind !== 'emoji')
280
+ return;
281
+ row.entries.forEach((entry, c) => map.set(entry.index, { row: r, col: c }));
282
+ });
283
+ return map;
284
+ }
285
+ /** Índice de fila donde arranca cada categoría (para el salto del strip). */
286
+ export function categoryRowStarts(rows) {
287
+ const map = new Map();
288
+ rows.forEach((row, r) => {
289
+ if (row.kind === 'header' && !map.has(row.category))
290
+ map.set(row.category, r);
291
+ });
292
+ return map;
293
+ }
294
+ /** Categoría visible al tope del scroll — resalta el botón del strip. */
295
+ export function categoryAtRow(rows, rowIdx) {
296
+ var _a;
297
+ for (let r = Math.min(rowIdx, rows.length - 1); r >= 0; r--) {
298
+ const row = rows[r];
299
+ if ((row === null || row === void 0 ? void 0 : row.kind) === 'header')
300
+ return row.category;
301
+ if ((row === null || row === void 0 ? void 0 : row.kind) === 'emoji') {
302
+ const cat = (_a = row.entries[0]) === null || _a === void 0 ? void 0 : _a.category;
303
+ if (cat)
304
+ return cat;
305
+ }
306
+ }
307
+ return null;
308
+ }
309
+ // ── Virtualización ──────────────────────────────────────────────────────────
310
+ /**
311
+ * Ventana de filas a renderizar. 1906 emoji son ~240 filas: sin esto el panel
312
+ * monta ~1900 botones por apertura. Con la ventana quedan ~13 filas (~104
313
+ * botones) sin importar el tamaño del dataset.
314
+ */
315
+ export function virtualSlice(scrollTop, viewportHeight, rowCount) {
316
+ const visible = Math.max(1, Math.ceil(viewportHeight / ROW_HEIGHT));
317
+ const start = Math.max(0, Math.floor(scrollTop / ROW_HEIGHT) - OVERSCAN);
318
+ const end = Math.min(rowCount, start + visible + OVERSCAN * 2);
319
+ return { totalHeight: rowCount * ROW_HEIGHT, start, end, offsetY: start * ROW_HEIGHT };
320
+ }
321
+ /** Filas de salto de PageUp/PageDown. */
322
+ const PAGE_ROWS = 5;
323
+ /**
324
+ * Siguiente índice global activo tras una tecla de navegación, o el actual si
325
+ * el movimiento no lleva a ninguna celda.
326
+ *
327
+ * Trabaja sobre el layout (no sobre el array plano) para que las filas
328
+ * parciales del final de cada categoría y los headers intercalados se comporten
329
+ * como los ve el usuario: bajar desde una fila corta cae en la última celda de
330
+ * la fila de abajo, y los headers se saltan solos.
331
+ */
332
+ export function moveActive(rows, positions, activeIndex, key) {
333
+ const flat = [];
334
+ for (const row of rows)
335
+ if (row.kind === 'emoji')
336
+ for (const e of row.entries)
337
+ flat.push(e.index);
338
+ if (flat.length === 0)
339
+ return -1;
340
+ if (activeIndex < 0 || !positions.has(activeIndex)) {
341
+ return key === 'ArrowUp' || key === 'End' || key === 'PageUp' ? flat[flat.length - 1] : flat[0];
342
+ }
343
+ const at = positions.get(activeIndex);
344
+ if (key === 'ArrowRight' || key === 'ArrowLeft') {
345
+ const linear = flat.indexOf(activeIndex);
346
+ const next = linear + (key === 'ArrowRight' ? 1 : -1);
347
+ return next < 0 || next >= flat.length ? activeIndex : flat[next];
348
+ }
349
+ if (key === 'Home')
350
+ return flat[0];
351
+ if (key === 'End')
352
+ return flat[flat.length - 1];
353
+ const step = key === 'ArrowDown' ? 1 : key === 'ArrowUp' ? -1 : key === 'PageDown' ? PAGE_ROWS : -PAGE_ROWS;
354
+ return seekRow(rows, at, step, activeIndex);
355
+ }
356
+ /** Busca la celda más cercana a `col` avanzando de a `step` filas, saltando
357
+ * headers. Devuelve `fallback` si no hay ninguna fila de grilla en esa
358
+ * dirección (ya estás en el borde). */
359
+ function seekRow(rows, at, step, fallback) {
360
+ const dir = step > 0 ? 1 : -1;
361
+ let remaining = Math.abs(step);
362
+ let r = at.row;
363
+ let last = fallback;
364
+ while (remaining > 0) {
365
+ r += dir;
366
+ while (r >= 0 && r < rows.length && rows[r].kind !== 'emoji')
367
+ r += dir;
368
+ if (r < 0 || r >= rows.length)
369
+ break;
370
+ const row = rows[r];
371
+ last = row.entries[Math.min(at.col, row.entries.length - 1)].index;
372
+ remaining--;
373
+ }
374
+ return last;
375
+ }
@@ -13,11 +13,11 @@ export class CoEmptyState {
13
13
  render() {
14
14
  var _a;
15
15
  const iconWeight = (_a = this.iconWeight) !== null && _a !== void 0 ? _a : (this.variant === 'card' ? 'regular' : 'light');
16
- return (h("div", { key: 'fd0802c7ab379e2ff69d181a89e82f9af50c7eb7', class: {
16
+ return (h("div", { key: 'e113826d18559a68ffae18ccf6529eea99d1e3e1', class: {
17
17
  'co-empty-state': true,
18
18
  [`co-empty-state--${this.variant}`]: true,
19
19
  [`co-empty-state--${this.size}`]: true,
20
- }, part: "empty-state" }, this.icon && (h("div", { key: '0e37fbc4e087c5bc5ac69eee01cecd9fcde09f49', class: "co-empty-state__icon" }, h("co-icon", { key: '0e75bba07af87b883e7cb236800282af51c4b84f', name: this.icon, size: 40, weight: iconWeight }))), this.heading && (h("div", { key: '69ea3039e73b48f77fa6e58d673802d34506c4ef', class: "co-empty-state__heading" }, this.heading)), this.description && (h("div", { key: '223d8321af110cbde025a59e3677338abee0cc33', class: "co-empty-state__description" }, this.description)), h("div", { key: 'bfba2044eacf53aae426fb99dc1f2d5314a0b8e6', class: "co-empty-state__actions" }, h("slot", { key: 'b22df42a753f9ca5797b373a611421e07881d3e1' }))));
20
+ }, part: "empty-state" }, this.icon && (h("div", { key: 'ada3644ee8b42e431b7d433f2240a3500caa2876', class: "co-empty-state__icon" }, h("co-icon", { key: 'ecfbb6c8ffefa7e919859a960bc56390f0c1403d', name: this.icon, size: 40, weight: iconWeight }))), this.heading && (h("div", { key: '3473ab221979388c12fb4f5c9dd4a0816f0a9eea', class: "co-empty-state__heading" }, this.heading)), this.description && (h("div", { key: '55065da69e04e5ac3d6859b28ecdb452320b9263', class: "co-empty-state__description" }, this.description)), h("div", { key: '2842e7935653e51f42fb389827abf7db433a00a4', class: "co-empty-state__actions" }, h("slot", { key: 'ed90d3aaced375020cfb4af1c1d44077fbba0f17' }))));
21
21
  }
22
22
  static get is() { return "co-empty-state"; }
23
23
  static get encapsulation() { return "shadow"; }
@@ -223,10 +223,10 @@ export class CoEventCalendar {
223
223
  const t = getDateStrings(this.locale);
224
224
  const views = this.viewsList;
225
225
  const a = parseISO(this.anchor);
226
- return (h("div", { key: '5fc690577299cbb5d2e4e75d41279ee6f49b9e80', class: "cal" }, h("div", { key: '55b342eacfa324b5eb3e1c819948aba5783e028e', class: "cal__toolbar", part: "toolbar" }, h("button", { key: '7e190cb82abe886d5740b314aeacc136732e0538', type: "button", class: "cal__btn", onClick: this.goToday }, (_a = t.today) !== null && _a !== void 0 ? _a : 'Today'), h("div", { key: '0d12537595e3fb72a7214e968cd952ce68f09b90', class: "cal__title-group" }, h("button", { key: '7d658998a4df6144b9b7752103cae448eb9bea6e', type: "button", class: "cal__icon-btn", "aria-label": t.prevMonth, onClick: this.goPrev }, h("co-icon", { key: '4b793fef900dfd76f1356b1e78c7f5ed10b3da4f', name: "caret-left", size: 16 })), h("h2", { key: '0461afb4b372f7c95b528f5746b2ba6008181dcc', class: "cal__title", "aria-live": "polite" }, this.title()), h("button", { key: '7b169bb04482f6049f4af0c19cf8bf86a962dabf', type: "button", class: "cal__icon-btn", "aria-label": t.nextMonth, onClick: this.goNext }, h("co-icon", { key: 'b426d015251b5a476e2cd34b01d1c7d5d92be71d', name: "caret-right", size: 16 }))), views.length > 1 ? (h("div", { class: "cal__views", role: "tablist" }, views.map((v) => {
226
+ return (h("div", { key: 'd0a147fee3fa5ad01d40dacbbc2a0b1adf8f3808', class: "cal" }, h("div", { key: '35feaa81dc6f139fcced1ee691864b1587b19931', class: "cal__toolbar", part: "toolbar" }, h("button", { key: 'd05cf866772e81bacd7c904ff31d7f5032431672', type: "button", class: "cal__btn", onClick: this.goToday }, (_a = t.today) !== null && _a !== void 0 ? _a : 'Today'), h("div", { key: 'b3c1389ec39de8121d807c8eec944751245b2324', class: "cal__title-group" }, h("button", { key: '17224b09c008cf0d5bae8e585f3ffc7981bf63bb', type: "button", class: "cal__icon-btn", "aria-label": t.prevMonth, onClick: this.goPrev }, h("co-icon", { key: '2bf18c14b972a6a2b0136e67279b743b69074060', name: "caret-left", size: 16 })), h("h2", { key: '7ad21c7a35e45355870f699ecbbe79099de7e7e6', class: "cal__title", "aria-live": "polite" }, this.title()), h("button", { key: '4bb0d0287b41b4f100d09c9627afeb91bc5b57d7', type: "button", class: "cal__icon-btn", "aria-label": t.nextMonth, onClick: this.goNext }, h("co-icon", { key: '9bf5ab51b1d31e4d5c8274be1ca5b71ef96335a1', name: "caret-right", size: 16 }))), views.length > 1 ? (h("div", { class: "cal__views", role: "tablist" }, views.map((v) => {
227
227
  var _a;
228
228
  return (h("button", { type: "button", role: "tab", "aria-selected": this.view === v ? 'true' : 'false', class: { 'cal__view-btn': true, 'cal__view-btn--active': this.view === v }, onClick: () => this.switchView(v) }, (_a = t[v]) !== null && _a !== void 0 ? _a : v));
229
- }))) : (h("span", { class: "cal__views-spacer" }))), h("div", { key: '417cc54fe753d802f30d13992fef86d055c823a3', class: "cal__body", part: "body" }, this.view === 'month' ? (h("co-calendar-month", { loading: this.loading, events: this.normalized, year: a.year, month: a.month, locale: this.locale, firstDayOfWeek: this.firstDayOfWeek, timeZone: this.tz, minDate: this.minDate, maxDate: this.maxDate, editable: this.editable, selectable: this.selectable, maxLanes: this.dayMaxEvents, onCoDaySelect: this.handleDaySelect, onCoEventClick: this.handleEventClick, onCoEventDblClick: this.handleEventDblClick, onCoEventDrop: this.handleEventDrop, onCoMoreClick: this.handleMoreClick })) : this.view === 'week' || this.view === 'day' ? (h("co-calendar-timegrid", { loading: this.loading, events: this.normalized, dates: this.visibleDates, locale: this.locale, timeZone: this.tz, editable: this.editable, selectable: this.selectable, minDate: this.minDate, maxDate: this.maxDate, onCoRangeSelect: this.handleRangeSelect, onCoEventClick: this.handleEventClick, onCoEventDblClick: this.handleEventDblClick, onCoEventDrop: this.handleEventDrop, defaultDurationMinutes: this.defaultDurationMinutes, allDaySlot: this.allDaySlot, minTime: this.minTime, maxTime: this.maxTime, slotMinutes: this.slotMinutes, snapMinutes: this.snapMinutes, scrollTime: this.scrollTime, nowIndicator: this.nowIndicator })) : (h("div", { class: "cal__placeholder" }, h("co-icon", { name: "calendar-dots", size: 32 }), h("p", null, `${this.view} view — coming soon`))))));
229
+ }))) : (h("span", { class: "cal__views-spacer" }))), h("div", { key: '468dd7e859c0f9cbbe7d9e48e0c4cd55fdea2ddf', class: "cal__body", part: "body" }, this.view === 'month' ? (h("co-calendar-month", { loading: this.loading, events: this.normalized, year: a.year, month: a.month, locale: this.locale, firstDayOfWeek: this.firstDayOfWeek, timeZone: this.tz, minDate: this.minDate, maxDate: this.maxDate, editable: this.editable, selectable: this.selectable, maxLanes: this.dayMaxEvents, onCoDaySelect: this.handleDaySelect, onCoEventClick: this.handleEventClick, onCoEventDblClick: this.handleEventDblClick, onCoEventDrop: this.handleEventDrop, onCoMoreClick: this.handleMoreClick })) : this.view === 'week' || this.view === 'day' ? (h("co-calendar-timegrid", { loading: this.loading, events: this.normalized, dates: this.visibleDates, locale: this.locale, timeZone: this.tz, editable: this.editable, selectable: this.selectable, minDate: this.minDate, maxDate: this.maxDate, onCoRangeSelect: this.handleRangeSelect, onCoEventClick: this.handleEventClick, onCoEventDblClick: this.handleEventDblClick, onCoEventDrop: this.handleEventDrop, defaultDurationMinutes: this.defaultDurationMinutes, allDaySlot: this.allDaySlot, minTime: this.minTime, maxTime: this.maxTime, slotMinutes: this.slotMinutes, snapMinutes: this.snapMinutes, scrollTime: this.scrollTime, nowIndicator: this.nowIndicator })) : (h("div", { class: "cal__placeholder" }, h("co-icon", { name: "calendar-dots", size: 32 }), h("p", null, `${this.view} view — coming soon`))))));
230
230
  }
231
231
  static get is() { return "co-event-calendar"; }
232
232
  static get encapsulation() { return "shadow"; }
@@ -115,7 +115,7 @@ export class CoEventPopover {
115
115
  this.coClose.emit();
116
116
  }
117
117
  render() {
118
- return (h(Host, { key: '0d80c0a501c72d7428c85ba44075a4c9cab05f6f' }, h("div", { key: 'a772efeb2c49d71f42b53f63ba56858019fcfdcd', class: "pop", popover: "manual", role: "dialog", "aria-modal": "false", "aria-label": this.popoverLabel, tabIndex: -1, ref: (el) => (this.panelEl = el) }, h("div", { key: '8eff11fdc9ae6ebd0de3967dc3a6522cd159bfa0', class: "pop__actions", part: "actions" }, h("slot", { key: 'b9c5c598356d8acc6b0cf135e3c5347de937a33b', name: "actions" })), h("div", { key: '0e1f10c5727d66170d9c1a5b8137ba48c61a867b', class: "pop__head" }, this.dot && h("span", { key: '78ab616e697fb9e4cdc354e791a4e2184ea20123', class: "pop__dot", style: this.color ? { background: this.color } : {} }), h("div", { key: '1abdeb6c16aa3daf5adfb652f4f2ede5e0abb891', class: "pop__body", part: "body" }, h("slot", { key: 'f28a87f62acaa8c617cf24f264462b525065ecbc' }))))));
118
+ return (h(Host, { key: '2bf728a720fb724085b945b4128a4bad5831b870' }, h("div", { key: '81bf88204d662d59a9b4d0b2148063e8244287c3', class: "pop", popover: "manual", role: "dialog", "aria-modal": "false", "aria-label": this.popoverLabel, tabIndex: -1, ref: (el) => (this.panelEl = el) }, h("div", { key: '1dae9ef8ef905f269946cb0a842636d77af46e66', class: "pop__actions", part: "actions" }, h("slot", { key: 'ce5a5fa4ea60a6649d323953dbfa2cccd8840f7c', name: "actions" })), h("div", { key: '019f8e05e990563069e33dd1936655df664085ae', class: "pop__head" }, this.dot && h("span", { key: 'a1f11545250cbf9fb900840dfca4d6721cb98852', class: "pop__dot", style: this.color ? { background: this.color } : {} }), h("div", { key: 'e81876518297dde46ef6288538c4e471b5eab521', class: "pop__body", part: "body" }, h("slot", { key: '9818f107cee7d29278b58efd1af3109d345651b4' }))))));
119
119
  }
120
120
  static get is() { return "co-event-popover"; }
121
121
  static get encapsulation() { return "shadow"; }
@@ -152,11 +152,14 @@
152
152
  box-shadow: none;
153
153
  }
154
154
 
155
- /* ── Fixed positions ────────────────────────────────────────── */
156
- .co-fab--bottom-right { position: fixed; bottom: 24px; right: 24px; z-index: 1000; }
157
- .co-fab--bottom-left { position: fixed; bottom: 24px; left: 24px; z-index: 1000; }
158
- .co-fab--top-right { position: fixed; top: 24px; right: 24px; z-index: 1000; }
159
- .co-fab--top-left { position: fixed; top: 24px; left: 24px; z-index: 1000; }
155
+ /* ── Fixed positions ──────────────────────────────────────────
156
+ Los offsets son overridables por CSS var (default 24px) para que el
157
+ consumidor pueda separar el FAB de barras inferiores (ej. la paginación del
158
+ datatable): setear --co-fab-offset-bottom en el host levanta el FAB. */
159
+ .co-fab--bottom-right { position: fixed; bottom: var(--co-fab-offset-bottom, 24px); right: var(--co-fab-offset-right, 24px); z-index: 1000; }
160
+ .co-fab--bottom-left { position: fixed; bottom: var(--co-fab-offset-bottom, 24px); left: var(--co-fab-offset-left, 24px); z-index: 1000; }
161
+ .co-fab--top-right { position: fixed; top: var(--co-fab-offset-top, 24px); right: var(--co-fab-offset-right, 24px); z-index: 1000; }
162
+ .co-fab--top-left { position: fixed; top: var(--co-fab-offset-top, 24px); left: var(--co-fab-offset-left, 24px); z-index: 1000; }
160
163
 
161
164
  /* ── Label ──────────────────────────────────────────────────── */
162
165
  .co-fab__label {
@@ -28,7 +28,7 @@ export class CoFab {
28
28
  const iconSize = this.size === 'xl' ? 24 : this.size === 'l' ? 24 : this.size === 's' ? 18 : 20;
29
29
  const hasLabel = !!this.label;
30
30
  const hoverExpand = hasLabel && this.expandOnHover;
31
- return (h("button", { key: '67d54b40024fa3851d0ea79960949861ecaeaf4c', class: {
31
+ return (h("button", { key: '33b456dcff41cacf4783c6aacdd8d99e6b699eff', class: {
32
32
  'co-fab': true,
33
33
  [`co-fab--${this.variant}`]: true,
34
34
  [`co-fab--${this.size}`]: true,
@@ -36,7 +36,7 @@ export class CoFab {
36
36
  'co-fab--hover-expand': hoverExpand,
37
37
  'co-fab--disabled': this.disabled,
38
38
  [`co-fab--${this.position}`]: this.position !== 'none',
39
- }, type: "button", disabled: this.disabled, onClick: this.handleClick, onPointerEnter: this.handleExpandMeasure, onFocusin: this.handleExpandMeasure, "aria-label": this.ariaLabelText || this.label || this.icon }, h("co-icon", { key: 'e5e75805115a8b31530a56d8210dcdae66e28ab5', name: this.icon, size: iconSize }), this.label && (h("span", { key: '2e659c02f0056f848f5c0566069dd39f4cd48d2c', class: "co-fab__label", ref: (el) => (this.labelEl = el) }, this.label))));
39
+ }, type: "button", disabled: this.disabled, onClick: this.handleClick, onPointerEnter: this.handleExpandMeasure, onFocusin: this.handleExpandMeasure, "aria-label": this.ariaLabelText || this.label || this.icon }, h("co-icon", { key: '4d7ab37bc111369fc17277ece2e397b4207ec3f4', name: this.icon, size: iconSize }), this.label && (h("span", { key: '7de41d3f16a27dc3ce66c6b1d2731f5774046630', class: "co-fab__label", ref: (el) => (this.labelEl = el) }, this.label))));
40
40
  }
41
41
  static get is() { return "co-fab"; }
42
42
  static get encapsulation() { return "shadow"; }
@@ -341,12 +341,12 @@ export class CoFileField {
341
341
  const previews = items.filter((it) => isImage(it) && !this.failedPreviews.has(this.keyFor(it)));
342
342
  const canReorder = this.reorderable && this.multiple && !this.disabled && !this.readonly && items.length > 1;
343
343
  const capacity = this.capacityHint(s);
344
- return (h("div", { key: '11e79bc9c1b3b56c10c0558b0d504821db7e8cd6', class: {
344
+ return (h("div", { key: '615291bd9c075d4f26f264602da03427e13bf35b', class: {
345
345
  'co-file-field': true,
346
346
  'co-file-field--disabled': this.disabled,
347
347
  'co-file-field--invalid': this.isInvalid,
348
348
  [statusClass]: !!statusClass,
349
- }, part: "wrapper" }, this.label && (h("div", { key: '9e3f1d834e5a1b70411747568d7a1055b3e0d8f1', class: "co-file-field__labels" }, h("label", { key: '1c138fbe71432df15c970b00f910e0ddcc69a333', class: "co-file-field__label", part: "label" }, this.label, h(RequiredMark, { key: '34b7d0fe683a911fc10352f0d7c79cb01c559999', required: this.required })))), showDropzone && (h("div", { key: '9d046b734982edfd7d9743e9dab5b95593e15383', class: {
349
+ }, part: "wrapper" }, this.label && (h("div", { key: '0c4fbdb6c5824824bbe39a96c568f06f442955ef', class: "co-file-field__labels" }, h("label", { key: '4f8767b17adcd04d553c2cf6668c60c30a780783', class: "co-file-field__label", part: "label" }, this.label, h(RequiredMark, { key: '82fb4a69b136fcdcdd3b3e81ea8d2deb8ca64e10', required: this.required })))), showDropzone && (h("div", { key: 'bce9efbedf17d917ae4bf00ae839409f63e4cccd', class: {
350
350
  'co-file-field__dropzone': true,
351
351
  'co-file-field__dropzone--drag': this.dragOver,
352
352
  }, part: "dropzone", role: "button", tabIndex: this.disabled ? -1 : 0, onClick: this.handleBrowse, onKeyDown: (e) => {
@@ -354,7 +354,7 @@ export class CoFileField {
354
354
  e.preventDefault();
355
355
  this.handleBrowse();
356
356
  }
357
- }, onDragOver: this.handleDragOver, onDragLeave: this.handleDragLeave, onDrop: this.handleDrop }, h("button", { key: '9af47292af70f8da16062a0bbac21ea520a52a39', class: "co-file-field__upload-btn", part: "upload-button", type: "button", tabIndex: -1 }, h("co-icon", { key: '68f3467892671d62648ccf2d1302cd579cd6601c', name: "file-arrow-up", size: 18 }), h("span", { key: 'a167aa0aef4f1e209660f251dd945ac41576b39f' }, this.uploadButtonText || s.uploadButton)), h("span", { key: 'b1bcfb1eabab417cd46920ccc43f624e52d1470c', class: "co-file-field__dropzone-text" }, this.dropText || s.dropHint), capacity && h("span", { key: '44a29cb6fcd9ea9a65de12794d1313c0ef9da7b9', class: "co-file-field__dropzone-hint" }, capacity), h("div", { key: '4d4f68f6684b976ec1610ebd45bc59ece67a13a9', class: "co-file-field__actions", part: "actions" }, h("slot", { key: '000fe510d61916cb016a9a2d9968426c0edabe62', name: "actions" })), h("input", { key: '16169cf42cc8072d63c36bb3a25f9c5d540e48c3', ref: (el) => (this.inputEl = el), class: "co-file-field__input", type: "file", multiple: this.multiple, accept: this.inputAccept, disabled: this.disabled, onChange: this.handleInputChange, "aria-hidden": "true", tabIndex: -1 }))), items.length > 0 && (h("div", { key: '23dae3bd944ad6cbd7e0d10898832aa1367956a5', class: "co-file-field__uploaded" }, this.multiple && (h("div", { key: 'ca0c17ecc64a68594758c626d41bd14ad6a19633', class: "co-file-field__uploaded-title", part: "uploaded-title" }, `${this.uploadedTitle || s.uploadedTitle} (${items.length})`)), previews.length > 0 && (h("div", { key: '343ca190a8ebb4a2589b90d6b9718e91f7d23bf1', class: "co-file-field__previews", part: "previews" }, previews.map((item) => (h("button", { class: "co-file-field__preview", part: "preview", type: "button", key: `prev-${this.keyFor(item)}`, title: item.name, "aria-label": s.openPreview, onClick: () => this.handlePreviewOpen(item) }, h("img", { src: item.thumbnail || item.url, alt: item.name, loading: "lazy", onError: () => this.handlePreviewError(item) })))))), h("ul", { key: '9b911d176a0ac02b6f76c084c8b7f33c2c8637aa', class: "co-file-field__list", part: "list" }, items.map((item) => {
357
+ }, onDragOver: this.handleDragOver, onDragLeave: this.handleDragLeave, onDrop: this.handleDrop }, h("button", { key: '82c82cf57f9692bc560d4c82e0bc22a539e25e08', class: "co-file-field__upload-btn", part: "upload-button", type: "button", tabIndex: -1 }, h("co-icon", { key: 'e2dc567ce78647717c894c877334e2eecab6b80e', name: "file-arrow-up", size: 18 }), h("span", { key: '9c0082e62f13a53d5d598623e35678db84df52b3' }, this.uploadButtonText || s.uploadButton)), h("span", { key: '3f43f21c3fb54f1d21143aa7cdf9a485ee89cf69', class: "co-file-field__dropzone-text" }, this.dropText || s.dropHint), capacity && h("span", { key: 'd4b2a12ffde1a17c5f1cdded7fb50f035ffb6f0c', class: "co-file-field__dropzone-hint" }, capacity), h("div", { key: '38e36894d82bb094d4dbd37fb10b915607bf3f13', class: "co-file-field__actions", part: "actions" }, h("slot", { key: '993f64d18baed0474f29e50418bd5883ac6bc90c', name: "actions" })), h("input", { key: '33dcec562a9c266ca3920537297ddbff2688a0a3', ref: (el) => (this.inputEl = el), class: "co-file-field__input", type: "file", multiple: this.multiple, accept: this.inputAccept, disabled: this.disabled, onChange: this.handleInputChange, "aria-hidden": "true", tabIndex: -1 }))), items.length > 0 && (h("div", { key: 'a78a747ee890c15d082c99770c0a8487405301ee', class: "co-file-field__uploaded" }, this.multiple && (h("div", { key: '08336c691f85e1c39216779a850e1c4eb4ad92eb', class: "co-file-field__uploaded-title", part: "uploaded-title" }, `${this.uploadedTitle || s.uploadedTitle} (${items.length})`)), previews.length > 0 && (h("div", { key: '374c52cbaf91ab19d1781c6f4faaed809146aea5', class: "co-file-field__previews", part: "previews" }, previews.map((item) => (h("button", { class: "co-file-field__preview", part: "preview", type: "button", key: `prev-${this.keyFor(item)}`, title: item.name, "aria-label": s.openPreview, onClick: () => this.handlePreviewOpen(item) }, h("img", { src: item.thumbnail || item.url, alt: item.name, loading: "lazy", onError: () => this.handlePreviewError(item) })))))), h("ul", { key: '93ab31f0a3567287db8de9b5b00f4e3772988c82', class: "co-file-field__list", part: "list" }, items.map((item) => {
358
358
  const key = this.keyFor(item);
359
359
  const draggable = canReorder && item.status === 'done';
360
360
  return (h("li", { class: {
@@ -375,10 +375,10 @@ export class CoFileField {
375
375
  'co-file-field__action': true,
376
376
  'co-file-field__action--copied': this.copiedKey === key,
377
377
  }, type: "button", tabIndex: -1, title: this.copiedKey === key ? s.copied : s.copyUrl, "aria-label": s.copyUrl, onClick: () => this.handleCopy(item) }, h("co-icon", { name: this.copiedKey === key ? 'check' : 'copy', size: 18 }))), !this.disabled && !this.readonly && (h("button", { class: "co-file-field__action", type: "button", tabIndex: -1, title: s.removeFile, "aria-label": s.removeFile, onClick: () => this.coRemove.emit(key) }, h("co-icon", { name: "trash", size: 18 })))));
378
- })))), helper && (h("div", { key: 'c2edda6419a9f6e75f7c16fac61ce3271159d816', class: {
378
+ })))), helper && (h("div", { key: 'fce82b34f47fbf65872fbd5dea20a87b4c99ae12', class: {
379
379
  'co-file-field__helper': true,
380
380
  'co-file-field__helper--error': this.isInvalid,
381
- }, part: "helper" }, this.isInvalid && (h("co-icon", { key: '0772a3d9fdf8fc818b0738ce4c7f0297c6eb4984', name: "warning-circle", size: 14, class: "co-file-field__helper-icon" })), h("span", { key: '6153f585fdd804fb49b09e1d106c6625e473b917', class: "co-file-field__helper-text" }, helper)))));
381
+ }, part: "helper" }, this.isInvalid && (h("co-icon", { key: '920361c5833f0252673779b716f872af151ae4b2', name: "warning-circle", size: 14, class: "co-file-field__helper-icon" })), h("span", { key: '6711fa168985fb206fdb79533834e4d8548da3dd', class: "co-file-field__helper-text" }, helper)))));
382
382
  }
383
383
  static get is() { return "co-file-field"; }
384
384
  static get encapsulation() { return "shadow"; }
@@ -54,7 +54,7 @@ export class CoFileTypeTile {
54
54
  const iconSize = Math.round(this.size * 0.5);
55
55
  const background = this.colorTags ? meta.tint : 'var(--co-color-gray-100)';
56
56
  const color = this.colorTags ? meta.accent : 'var(--co-color-gray-600)';
57
- return (h("span", { key: '174e628c4a7fdd118cd5573c0054677c7c006989', class: {
57
+ return (h("span", { key: 'adb6141d2b0d587d289d0d1c8f3887963a33261a', class: {
58
58
  'co-file-type-tile': true,
59
59
  [`co-file-type-tile--${type}`]: true,
60
60
  'co-file-type-tile--mono': !this.colorTags,
@@ -64,7 +64,7 @@ export class CoFileTypeTile {
64
64
  borderRadius: `${this.radius}px`,
65
65
  background,
66
66
  color,
67
- } }, h("co-icon", { key: '815957f4dd756fec566b4bbc996083e80aed0ab5', name: meta.icon, size: iconSize, weight: "fill" })));
67
+ } }, h("co-icon", { key: 'e409cbb4d9c2d08f9417058ec843a6466d875f04', name: meta.icon, size: iconSize, weight: "fill" })));
68
68
  }
69
69
  static get is() { return "co-file-type-tile"; }
70
70
  static get encapsulation() { return "shadow"; }
@@ -15,10 +15,10 @@ export class CoHelperText {
15
15
  };
16
16
  }
17
17
  render() {
18
- return (h("div", { key: 'c09b28c4e20a80ce87275beb8c8f38c4ec9a6ac3', class: {
18
+ return (h("div", { key: '09ca6f7214d2c25432ffb9e9fa90036d81c48200', class: {
19
19
  'co-helper-text': true,
20
20
  [`co-helper-text--${this.status}`]: true,
21
- }, part: "helper-text" }, h("co-icon", { key: '48bee19674872e9ed7b06a9f0706063111abc3ae', name: this.STATUS_ICON[this.status], size: 14, weight: "fill", class: "co-helper-text__icon" }), h("span", { key: '9b1e0cd4c00ad73c915f826df299cbb05156ca02', class: "co-helper-text__message" }, h("slot", { key: '41c95d86b31bb19be88b619057aba484748f1dfc' }, this.message))));
21
+ }, part: "helper-text" }, h("co-icon", { key: 'd3757438d31d6a14d4c52157197818846ac3fd11', name: this.STATUS_ICON[this.status], size: 14, weight: "fill", class: "co-helper-text__icon" }), h("span", { key: '7ae8d75fa07b8a6046e02d36c05b73676a68425e', class: "co-helper-text__message" }, h("slot", { key: 'd13a404f19f6b04d0b63aa2a4f68caf84d33e619' }, this.message))));
22
22
  }
23
23
  static get is() { return "co-helper-text"; }
24
24
  static get encapsulation() { return "shadow"; }
@@ -31,12 +31,12 @@ export class CoIcon {
31
31
  this.svgContent = await loadSvg(this.name, this.weight);
32
32
  }
33
33
  render() {
34
- return (h(Host, { key: '81319f5bcb43f9f095f7ae6328002bcffe22bc42', "aria-hidden": "true", style: {
34
+ return (h(Host, { key: '9fa97e09f5063eaa9b463f1bb7f06d4b277c8bc6', "aria-hidden": "true", style: {
35
35
  display: 'inline-flex',
36
36
  width: `${this.size}px`,
37
37
  height: `${this.size}px`,
38
38
  flexShrink: '0',
39
- } }, h("span", { key: '4875243b3b1c0d40d82abc65307e398e83363b61', part: "svg", innerHTML: this.svgContent })));
39
+ } }, h("span", { key: '092068cc819b5d0cd63e15a5f3e0b7349cdb63cd', part: "svg", innerHTML: this.svgContent })));
40
40
  }
41
41
  static get is() { return "co-icon"; }
42
42
  static get encapsulation() { return "shadow"; }
@@ -126,6 +126,31 @@
126
126
  }
127
127
  .co-icon-button:hover:not(:disabled) { opacity: 0.88; }
128
128
 
129
+ /* Anillo de foco por teclado — solo :focus-visible, el click no lo enciende.
130
+ El botón traía `outline: none` sin nada que lo reemplazara, así que al tabular
131
+ no se veía absolutamente nada (WCAG 2.4.7).
132
+
133
+ El anillo va a --co-semantic-border-focus (50%), NO al --...-focus-ring (8%),
134
+ por el mismo motivo ya documentado en co-checkbox: en los campos (input/select)
135
+ el foco se percibe porque SUMAN el flip del borde al 50% y el halo solo lo
136
+ acompaña; acá la variante ghost —la más usada— es `border: none`, así que el
137
+ border-color de abajo es un no-op y un halo al 8% (~1,1:1) quedaría invisible
138
+ justo en la variante más frecuente. Con el 50% el anillo es la única señal, y
139
+ es perceptible en las tres variantes.
140
+ El box-shadow sigue el border-radius, así que sale redondo en --rounded y con
141
+ la esquina correcta en --square, sin tocar el layout (no hay reflow). */
142
+ .co-icon-button:focus-visible {
143
+ outline: none;
144
+ border-color: var(--co-semantic-border-focus);
145
+ box-shadow: 0 0 0 2px var(--co-semantic-border-focus);
146
+ }
147
+
148
+ /* surface="dark": el token de foco es negro-50 en tema claro y sobre una navbar
149
+ oscura no contrasta. Misma salida que co-button para su variante on-dark. */
150
+ .co-icon-button--dark:focus-visible {
151
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--co-color-base-blanco, #fff) 45%, transparent);
152
+ }
153
+
129
154
  /* Feedback de presión: squish instantáneo; el release usa la transición base. */
130
155
  .co-icon-button:active:not(:disabled) {
131
156
  transform: scale(0.97);
@@ -41,7 +41,7 @@ export class CoIconButton {
41
41
  : 'var(--co-border-radius-full)',
42
42
  }
43
43
  : undefined;
44
- return (h("button", { key: '430b2aa64f664a6bd7cb40da53f592606c4b5308', class: {
44
+ return (h("button", { key: '870a3f745f22073b730bf78c57712aefcd1f0ae1', class: {
45
45
  'co-icon-button': true,
46
46
  [`co-icon-button--${this.variant}`]: true,
47
47
  [`co-icon-button--${this.shape}`]: true,