@aceshooting/lyra-ui 25.3.1 → 25.5.0

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 (220) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +15 -3
  3. package/custom-elements.json +1 -1
  4. package/dist/all.d.ts +1 -1
  5. package/dist/all.js +1 -1
  6. package/dist/cli/migration-contract.json +1 -1
  7. package/dist/components/agent-tools/browser-frame/browser-frame.styles.js +1 -1
  8. package/dist/components/charts/chart/chart-sync.d.ts +4 -0
  9. package/dist/components/charts/chart/chart-sync.js +1 -0
  10. package/dist/components/charts/chart/chart-sync.styles.d.ts +1 -0
  11. package/dist/components/charts/chart/chart-sync.styles.js +1 -0
  12. package/dist/components/charts/chart/chart.class.d.ts +12 -2
  13. package/dist/components/charts/chart/chart.class.js +5 -4
  14. package/dist/components/charts/chart/histogram.class.js +1 -1
  15. package/dist/components/charts/chart/lite-chart.class.d.ts +18 -5
  16. package/dist/components/charts/chart/lite-chart.class.js +11 -11
  17. package/dist/components/data/heatmap/heatmap-grid-navigation.d.ts +2 -2
  18. package/dist/components/data/heatmap/heatmap-grid-navigation.js +1 -1
  19. package/dist/components/data/heatmap/heatmap.class.d.ts +24 -9
  20. package/dist/components/data/heatmap/heatmap.class.js +3 -3
  21. package/dist/components/forms/button/button.styles.js +1 -1
  22. package/dist/components/forms/catalog-picker-base.d.ts +48 -0
  23. package/dist/components/forms/catalog-picker-base.js +29 -0
  24. package/dist/components/forms/catalog-picker-base.styles.d.ts +1 -0
  25. package/dist/components/forms/catalog-picker-base.styles.js +1 -0
  26. package/dist/components/forms/combobox/combobox.class.d.ts +4 -1
  27. package/dist/components/forms/combobox/combobox.class.js +2 -2
  28. package/dist/components/forms/country-picker/country-picker.class.d.ts +40 -0
  29. package/dist/components/forms/country-picker/country-picker.class.js +1 -0
  30. package/dist/components/forms/country-picker/country-picker.d.ts +1 -0
  31. package/dist/components/forms/country-picker/country-picker.js +1 -0
  32. package/dist/components/forms/country-picker/country-picker.styles.d.ts +1 -0
  33. package/dist/components/forms/country-picker/country-picker.styles.js +1 -0
  34. package/dist/components/forms/currency-picker/currency-catalog.d.ts +19 -0
  35. package/dist/components/forms/currency-picker/currency-catalog.js +1 -0
  36. package/dist/components/forms/currency-picker/currency-picker.class.d.ts +95 -0
  37. package/dist/components/forms/currency-picker/currency-picker.class.js +30 -0
  38. package/dist/components/forms/currency-picker/currency-picker.d.ts +1 -0
  39. package/dist/components/forms/currency-picker/currency-picker.js +1 -0
  40. package/dist/components/forms/currency-picker/currency-picker.styles.d.ts +1 -0
  41. package/dist/components/forms/currency-picker/currency-picker.styles.js +1 -0
  42. package/dist/components/forms/currency-picker/currency-presentation.d.ts +3 -0
  43. package/dist/components/forms/currency-picker/currency-presentation.js +1 -0
  44. package/dist/components/forms/currency-picker/currency-types.d.ts +3 -0
  45. package/dist/components/forms/index.d.ts +1 -1
  46. package/dist/components/forms/index.js +1 -1
  47. package/dist/components/forms/locale-picker/locale-picker.class.d.ts +37 -11
  48. package/dist/components/forms/locale-picker/locale-picker.class.js +43 -8
  49. package/dist/components/forms/locale-picker/locale-picker.styles.js +1 -1
  50. package/dist/components/forms/select/select.class.d.ts +9 -2
  51. package/dist/components/forms/select/select.class.js +2 -2
  52. package/dist/components/forms/select/select.styles.js +1 -1
  53. package/dist/components/forms/time-zone-picker/time-zone-picker.class.d.ts +40 -0
  54. package/dist/components/forms/time-zone-picker/time-zone-picker.class.js +1 -0
  55. package/dist/components/forms/time-zone-picker/time-zone-picker.d.ts +1 -0
  56. package/dist/components/forms/time-zone-picker/time-zone-picker.js +1 -0
  57. package/dist/components/forms/time-zone-picker/time-zone-picker.styles.d.ts +1 -0
  58. package/dist/components/forms/time-zone-picker/time-zone-picker.styles.js +1 -0
  59. package/dist/components/forms/unit-picker/unit-picker.class.d.ts +38 -0
  60. package/dist/components/forms/unit-picker/unit-picker.class.js +1 -0
  61. package/dist/components/forms/unit-picker/unit-picker.d.ts +1 -0
  62. package/dist/components/forms/unit-picker/unit-picker.js +1 -0
  63. package/dist/components/forms/unit-picker/unit-picker.styles.d.ts +1 -0
  64. package/dist/components/forms/unit-picker/unit-picker.styles.js +1 -0
  65. package/dist/components/layout/app-rail/app-rail.class.d.ts +1 -1
  66. package/dist/components/layout/app-rail/app-rail.class.js +1 -1
  67. package/dist/components/layout/card/card.styles.js +1 -1
  68. package/dist/components/layout/details/accordion-item.styles.js +1 -1
  69. package/dist/components/layout/details/details.styles.js +1 -1
  70. package/dist/components/layout/reorder-list/reorder-item.class.js +2 -0
  71. package/dist/components/lr-country-picker.js +1 -0
  72. package/dist/components/lr-currency-picker.js +1 -0
  73. package/dist/components/lr-time-zone-picker.js +1 -0
  74. package/dist/components/lr-unit-picker.js +1 -0
  75. package/dist/components/media/avatar/avatar.class.d.ts +3 -0
  76. package/dist/components/media/avatar/avatar.styles.js +1 -1
  77. package/dist/components/media/pan-zoom/pan-zoom.styles.js +1 -1
  78. package/dist/countries.d.ts +7 -0
  79. package/dist/countries.js +1 -0
  80. package/dist/currency.d.ts +39 -0
  81. package/dist/currency.js +1 -0
  82. package/dist/custom-elements-jsx.d.ts +1 -1
  83. package/dist/events.d.ts +28 -24
  84. package/dist/framework-types.d.ts +2 -2
  85. package/dist/internal/autoloader-manifest.js +1 -1
  86. package/dist/internal/autoloader-tags.d.ts +1 -1
  87. package/dist/internal/autoloader-tags.js +1 -1
  88. package/dist/internal/default-strings.generated.d.ts +1 -1
  89. package/dist/internal/default-strings.generated.js +1 -1
  90. package/dist/internal/form-associated.d.ts +3 -1
  91. package/dist/internal/form-associated.js +1 -1
  92. package/dist/internal/glass-surface.styles.js +1 -1
  93. package/dist/internal/localization-types.d.ts +1 -1
  94. package/dist/internal/localization.js +1 -1
  95. package/dist/internal/opaque-content-border.styles.d.ts +3 -0
  96. package/dist/internal/opaque-content-border.styles.js +1 -0
  97. package/dist/internal/package-metadata.d.ts +1 -1
  98. package/dist/internal/package-metadata.js +1 -1
  99. package/dist/internal/root-registration-allowlist.d.ts +1 -1
  100. package/dist/internal/root-registration-allowlist.js +1 -1
  101. package/dist/internal/scoped-definitions.generated.js +1 -1
  102. package/dist/internal/selection-catalog.d.ts +4 -0
  103. package/dist/internal/selection-catalog.js +1 -0
  104. package/dist/internal/tokens.styles.js +1 -1
  105. package/dist/lyra.d.ts +1 -1
  106. package/dist/lyra.js +1 -1
  107. package/dist/ssr/all.d.ts +1 -1
  108. package/dist/ssr/all.js +1 -1
  109. package/dist/ssr.d.ts +4 -4
  110. package/dist/ssr.js +1 -1
  111. package/dist/surfaces/glass.css +1 -1
  112. package/dist/svelte.d.ts +1 -1
  113. package/dist/testing/lyra-tag-event-map.d.ts +2 -2
  114. package/dist/testing/lyra-tag-event-map.js +1 -1
  115. package/dist/theme.css +1 -1
  116. package/dist/time-zones.d.ts +8 -0
  117. package/dist/time-zones.js +1 -0
  118. package/dist/translations/am/forms.js +1 -1
  119. package/dist/translations/ar/forms.js +1 -1
  120. package/dist/translations/bho/forms.js +1 -1
  121. package/dist/translations/bn/forms.js +1 -1
  122. package/dist/translations/cs/forms.js +1 -1
  123. package/dist/translations/da/forms.js +1 -1
  124. package/dist/translations/de/forms.js +1 -1
  125. package/dist/translations/el/forms.js +1 -1
  126. package/dist/translations/es/forms.js +1 -1
  127. package/dist/translations/fa/forms.js +1 -1
  128. package/dist/translations/fa-AF/forms.js +1 -1
  129. package/dist/translations/fi/forms.js +1 -1
  130. package/dist/translations/fr/forms.js +1 -1
  131. package/dist/translations/gu/forms.js +1 -1
  132. package/dist/translations/ha/forms.js +1 -1
  133. package/dist/translations/he/forms.js +1 -1
  134. package/dist/translations/hi/forms.js +1 -1
  135. package/dist/translations/hr/forms.js +1 -1
  136. package/dist/translations/hu/forms.js +1 -1
  137. package/dist/translations/id/forms.js +1 -1
  138. package/dist/translations/ig/forms.js +1 -1
  139. package/dist/translations/it/forms.js +1 -1
  140. package/dist/translations/ja/forms.js +1 -1
  141. package/dist/translations/jv/forms.js +1 -1
  142. package/dist/translations/kk/forms.js +1 -1
  143. package/dist/translations/kn/forms.js +1 -1
  144. package/dist/translations/ko/forms.js +1 -1
  145. package/dist/translations/ln/forms.js +1 -1
  146. package/dist/translations/ml/forms.js +1 -1
  147. package/dist/translations/mr/forms.js +1 -1
  148. package/dist/translations/ms/forms.js +1 -1
  149. package/dist/translations/my/forms.js +1 -1
  150. package/dist/translations/nb/forms.js +1 -1
  151. package/dist/translations/ne/forms.js +1 -1
  152. package/dist/translations/nl/forms.js +1 -1
  153. package/dist/translations/nn/forms.js +1 -1
  154. package/dist/translations/om/forms.js +1 -1
  155. package/dist/translations/or/forms.js +1 -1
  156. package/dist/translations/pa/forms.js +1 -1
  157. package/dist/translations/pcm/forms.js +1 -1
  158. package/dist/translations/pl/forms.js +1 -1
  159. package/dist/translations/pnb/forms.js +1 -1
  160. package/dist/translations/ps/forms.js +1 -1
  161. package/dist/translations/pt-BR/forms.js +1 -1
  162. package/dist/translations/pt-PT/forms.js +1 -1
  163. package/dist/translations/ro/forms.js +1 -1
  164. package/dist/translations/ru/forms.js +1 -1
  165. package/dist/translations/sd/forms.js +1 -1
  166. package/dist/translations/sl/forms.js +1 -1
  167. package/dist/translations/su/forms.js +1 -1
  168. package/dist/translations/sv/forms.js +1 -1
  169. package/dist/translations/sw/forms.js +1 -1
  170. package/dist/translations/ta/forms.js +1 -1
  171. package/dist/translations/te/forms.js +1 -1
  172. package/dist/translations/th/forms.js +1 -1
  173. package/dist/translations/tl/forms.js +1 -1
  174. package/dist/translations/tr/forms.js +1 -1
  175. package/dist/translations/uk/forms.js +1 -1
  176. package/dist/translations/ur/forms.js +1 -1
  177. package/dist/translations/uz/forms.js +1 -1
  178. package/dist/translations/vi/forms.js +1 -1
  179. package/dist/translations/yo/forms.js +1 -1
  180. package/dist/translations/zh-CN/forms.js +1 -1
  181. package/dist/translations/zh-TW/forms.js +1 -1
  182. package/dist/translations/zu/forms.js +1 -1
  183. package/dist/units.d.ts +5 -0
  184. package/dist/units.js +1 -0
  185. package/dist/vue.d.ts +1 -1
  186. package/llms/components/lr-avatar.md +9 -3
  187. package/llms/components/lr-bar-chart.md +1 -1
  188. package/llms/components/lr-bubble-chart.md +1 -1
  189. package/llms/components/lr-chart.md +11 -2
  190. package/llms/components/lr-combobox.md +5 -0
  191. package/llms/components/lr-country-picker.md +92 -0
  192. package/llms/components/lr-currency-picker.md +101 -0
  193. package/llms/components/lr-doughnut-chart.md +1 -1
  194. package/llms/components/lr-heatmap.md +16 -3
  195. package/llms/components/lr-histogram.md +9 -1
  196. package/llms/components/lr-line-chart.md +11 -1
  197. package/llms/components/lr-lite-chart.md +14 -4
  198. package/llms/components/lr-locale-picker.md +18 -4
  199. package/llms/components/lr-pie-chart.md +1 -1
  200. package/llms/components/lr-polar-area-chart.md +1 -1
  201. package/llms/components/lr-radar-chart.md +1 -1
  202. package/llms/components/lr-reorder-list.md +5 -0
  203. package/llms/components/lr-scatter-chart.md +1 -1
  204. package/llms/components/lr-select.md +29 -0
  205. package/llms/components/lr-time-zone-picker.md +56 -0
  206. package/llms/components/lr-unit-picker.md +54 -0
  207. package/llms/index.md +6 -2
  208. package/llms/peers.md +2 -2
  209. package/llms/shared/events-and-types.md +16 -0
  210. package/llms/shared/imports-and-registration.md +1 -1
  211. package/llms/shared/styles-and-tokens.md +8 -2
  212. package/llms/shared/testing-and-utilities.md +4 -1
  213. package/llms/shared.md +29 -4
  214. package/llms.txt +1 -1
  215. package/locales.json +138 -138
  216. package/package.json +56 -4
  217. package/registrations.json +1 -1
  218. package/vscode-css-data.json +1 -1
  219. package/vscode-html-data.json +1 -1
  220. package/web-types.json +1 -1
@@ -1,6 +1,6 @@
1
- import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/collection-snapshot.js";import{html,nothing}from"lit";import{property,query,state}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{LyraElement}from"../../../internal/lyra-element.js";import{srOnly}from"../../../internal/a11y.js";import{syncAriaDescribedByElements}from"../../../internal/aria-reflection.js";import{finiteInteger,finiteNumber,finiteRange}from"../../../internal/numbers.js";import{getScratchCtx}from"../../../internal/canvas.js";import{resolveCssTokenLength}from"../../../internal/css-token-length.js";import{ThemeWatcher}from"../../../internal/theme-watcher.js";import{activeElementIn}from"../../../internal/active-element.js";import{linearAlpha,linearBucket,midpointAlpha,midpointBucket,minMax,sqrtStep}from"./heatmap-scale.js";import{styles}from"./heatmap.styles.js";import{buildCalendarGrid,parseIsoDate,quartileBucket}from"./calendar-grid.js";import{accessibleMatrixCellRect,calendarCellAt as readCalendarCell,calendarCellRect,calendarDateAt as readCalendarDate,calendarValueAt as readCalendarValue,firstInteractiveCalendarCell as findFirstInteractiveCalendarCell,firstInteractiveMatrixCell as findFirstInteractiveMatrixCell,hitTestCalendar as hitTestCalendarGrid,hitTestMatrix as hitTestMatrixGrid,matrixCellRect,nextInteractiveCalendarCell as findNextInteractiveCalendarCell,nextInteractiveMatrixCell as findNextInteractiveMatrixCell}from"./heatmap-grid-navigation.js";import{getDateTimeFormat,getNumberFormat}from"../../../internal/intl-cache.js";import{sanitizeCssColor}from"../../../internal/safe-css.js";import{literalSetConverter}from"../../../internal/converters.js";import{devWarnOnce}from"../../../internal/dev-mode-attribute-warning.js";import{escapeCsvField}from"../../utility/export-button/csv.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import{LYRA_DEFAULT_heatmapCalendarCellLabel,LYRA_DEFAULT_heatmapCalendarLabel,LYRA_DEFAULT_heatmapDecorationLimit,LYRA_DEFAULT_heatmapDefaultColLabel,LYRA_DEFAULT_heatmapDefaultRowLabel,LYRA_DEFAULT_heatmapMatrixCellLabel,LYRA_DEFAULT_heatmapMatrixLabel,LYRA_DEFAULT_heatmapNoDataValue,LYRA_DEFAULT_heatmapProjectionLimit,LYRA_DEFAULT_heatmapSelectedCellLabel,LYRA_DEFAULT_heatmapSelectedCount,LYRA_DEFAULT_heatmapValueLabel}from"../../../internal/default-strings.generated.js";const PAD_LEFT=60,PAD_TOP=20,ROW_LABEL_INSET=4,MAX_ROW_LABEL_FRACTION=.4,MAX_COL_LABEL_HEIGHT=240,COL_LABEL_INSET=6,labelExtentConverter={fromAttribute:value=>{if(value===null)return;const trimmed=value.trim();if(trimmed.toLowerCase()==="auto")return"auto";const parsed=Number.parseFloat(trimmed);return Number.isFinite(parsed)&&parsed>=0?parsed:void 0},toAttribute:value=>value===void 0?null:String(value)},STICKY_LABELS=literalSetConverter(["none","rows","cols","both"],"none"),FALLBACK_NO_DATA_FILL="rgba(128,128,128,0.25)",FALLBACK_STICKY_LABEL_BG="#ffffff",RAMP_STEPS=7,FALLBACK_SCALE_LO="#cde2fb",FALLBACK_SCALE_HI="#0969da",FALLBACK_LABEL_FONT="10px system-ui, sans-serif",CAL_PAD_LEFT=28,CAL_WEEKDAY_LABEL_INSET=2,CAL_LABEL_H=16,CAL_CELL=11,CAL_GAP=2,DEFAULT_MATRIX_CELL_SIZE=22,DEFAULT_ACCESSIBLE_TARGET_SIZE_PX=40,DEFAULT_BUCKET_COUNT=5,FIT_MIN_CELL=4,MAX_BUCKET_COUNT=256,MAX_HEATMAP_CELLS=1e4,MAX_HEATMAP_DECORATIONS=256,MAX_ACCESSIBLE_HEATMAP_CELLS=400,RING_LINE_WIDTH=2,FALLBACK_FOCUS_RING_COLOR="#0969da",FALLBACK_ANNOTATION_COLOR="#cf222e",FALLBACK_SELECTED_COLOR="#1a7f37",ARROW_KEYS=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"]),MS_PER_DAY=864e5,CAL_MONTH_LABEL_GAP=2;function isoDateAtOffset(firstWeekStart,dayOffset){return new Date(firstWeekStart.getTime()+dayOffset*MS_PER_DAY).toISOString().slice(0,10)}function legendStopsChanged(value,previous){if(Object.is(value,previous))return!1;if(!Array.isArray(value)||!Array.isArray(previous)||value.length!==previous.length)return!0;for(let index=0;index<value.length;index+=1){if(Object.hasOwn(value,index)!==Object.hasOwn(previous,index))return!0;const next=value[index],before=previous[index];if(!next||!before){if(!Object.is(next,before))return!0;continue}if(!Object.is(next.value,before.value)||!Object.is(next.color,before.color)||!Object.is(next.label,before.label)||!Object.is(next.partOfRamp,before.partOfRamp))return!0}return!1}const HEX_RE=/^([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i,RGB_RE=/^rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)(?:\s*,\s*([\d.]+))?\s*\)/i;function hexToRgb(hex){const clean=hex.trim().replace("#","");if(!HEX_RE.test(clean))return null;const hasAlpha=clean.length===4||clean.length===8,full=clean.length<=4?clean.split("").map(c=>c+c).join(""):clean,num=Number.parseInt(full,16);return hasAlpha?[num>>>24&255,num>>>16&255,num>>>8&255,(num&255)/255]:[num>>16&255,num>>8&255,num&255,1]}function parseRgbString(value){const match=RGB_RE.exec(value);if(!match)return null;const a=match[4]===void 0?1:Number(match[4]);return[Number(match[1]),Number(match[2]),Number(match[3]),a]}function resolveViaPixelReadback(ctx){try{ctx.clearRect(0,0,1,1),ctx.fillRect(0,0,1,1);const[r=0,g=0,b=0,a=0]=ctx.getImageData(0,0,1,1).data;return[r,g,b,a/255]}catch{return null}}function formatRgb([r,g,b,a]){const alpha=Math.min(1,Math.max(0,a));return alpha>=1?`rgb(${r}, ${g}, ${b})`:`rgba(${r}, ${g}, ${b}, ${Math.round(alpha*1e3)/1e3})`}function warnInvalidColor(color){devWarnOnce(`heatmap-invalid-color:${color}`,`<lr-heatmap> could not parse "${color}" (set via --lr-heatmap-scale-lo/-hi) as a CSS color; falling back to the default ramp endpoint.`)}let warnedNoCanvasContext=!1;function warnNoCanvasContext(){warnedNoCanvasContext||(warnedNoCanvasContext=!0,devWarnOnce("heatmap-no-canvas-context","<lr-heatmap>: no 2D canvas context is available in this environment; color resolution for non-hex/non-rgb values (e.g. oklch(), color(srgb ...), named colors) will fall back to the given default instead of resolving the requested color."))}function normalizeBucketCount(bucketCount){return finiteInteger(bucketCount,DEFAULT_BUCKET_COUNT,2,MAX_BUCKET_COUNT)}const optionalCellSizeConverter={fromAttribute(value){if(value===null||value.trim()==="")return;const parsed=Number(value);return Number.isFinite(parsed)?parsed:void 0}},DEFAULT_MATRIX_DATA=Object.freeze({kind:"matrix",rowLabels:Object.freeze([]),colLabels:Object.freeze([]),values:Object.freeze([])});function normalizeCellSizeClamp(value){if(!(value==null||!Number.isFinite(value)))return finiteRange(value,FIT_MIN_CELL,FIT_MIN_CELL)}const bucketCountConverter={fromAttribute(value){return value===null?DEFAULT_BUCKET_COUNT:normalizeBucketCount(Number(value))}};function resolveRgb(color,fallbackHex,ownerDocument){const fallback=hexToRgb(fallbackHex)??[0,0,0,1],direct=hexToRgb(color);if(direct)return direct;const ctx=getScratchCtx(ownerDocument);if(!ctx)return warnNoCanvasContext(),fallback;const sentinel="rgb(1, 2, 3)";ctx.fillStyle=sentinel;const sentinelNormalized=ctx.fillStyle;if(ctx.fillStyle=color,ctx.fillStyle===sentinelNormalized&&color.trim()!==sentinel)return warnInvalidColor(color),fallback;const normalized=ctx.fillStyle;return hexToRgb(normalized)??parseRgbString(normalized)??resolveViaPixelReadback(ctx)??fallback}function mixRgb(from,to,t){const clamped=Math.min(1,Math.max(0,t)),r=Math.round(from[0]+(to[0]-from[0])*clamped),g=Math.round(from[1]+(to[1]-from[1])*clamped),b=Math.round(from[2]+(to[2]-from[2])*clamped),a=from[3]+(to[3]-from[3])*clamped;return formatRgb([r,g,b,a])}const CALENDAR_SPACING_PROPERTIES=new Set(["cellGapX","cellGapY","cellRadius"]);class LyraHeatmap extends LyraElement{static{this.defaultStrings={...super.defaultStrings,heatmapCalendarCellLabel:LYRA_DEFAULT_heatmapCalendarCellLabel,heatmapCalendarLabel:LYRA_DEFAULT_heatmapCalendarLabel,heatmapDecorationLimit:LYRA_DEFAULT_heatmapDecorationLimit,heatmapDefaultColLabel:LYRA_DEFAULT_heatmapDefaultColLabel,heatmapDefaultRowLabel:LYRA_DEFAULT_heatmapDefaultRowLabel,heatmapMatrixCellLabel:LYRA_DEFAULT_heatmapMatrixCellLabel,heatmapMatrixLabel:LYRA_DEFAULT_heatmapMatrixLabel,heatmapNoDataValue:LYRA_DEFAULT_heatmapNoDataValue,heatmapProjectionLimit:LYRA_DEFAULT_heatmapProjectionLimit,heatmapSelectedCellLabel:LYRA_DEFAULT_heatmapSelectedCellLabel,heatmapSelectedCount:LYRA_DEFAULT_heatmapSelectedCount,heatmapValueLabel:LYRA_DEFAULT_heatmapValueLabel}}static{this.collectionSupport=collectionSupport}static{this.immutableEventDetails=Object.freeze(["lr-selection-change"])}static{this.ownedCollectionProperties=Object.freeze(["data","annotations","legendStops","colorSteps","selectedCells"])}static{this.identityCollectionObjectProperties=Object.freeze(["data"])}static{this.styles=[LyraElement.styles,styles,srOnly]}static get observedAttributes(){return[...new Set([...super.observedAttributes,"role"])]}get effectiveMode(){return this.data.kind}get stickyLabels(){return this._stickyLabels}set stickyLabels(next){const normalized=STICKY_LABELS.normalizeReflected(this,"sticky-labels",next),old=this._stickyLabels;old!==normalized&&(this._stickyLabels=normalized,this.requestUpdate("stickyLabels",old))}get effectiveStickyLabels(){return this.effectiveMode==="matrix"?this._stickyLabels:"none"}get freezesRowLabels(){const sticky=this.effectiveStickyLabels;return sticky==="rows"||sticky==="both"}get freezesColLabels(){const sticky=this.effectiveStickyLabels;return sticky==="cols"||sticky==="both"}get effectiveColLabelRotation(){if(typeof this.colLabelRotation!="number")return 0;const degrees=finiteNumber(this.colLabelRotation,0);return Math.min(90,Math.max(0,degrees))}get matrixPadLeft(){if(this.rowLabelWidth==="auto")return this.resolvedRowLabelWidth;if(typeof this.rowLabelWidth!="number")return PAD_LEFT;const resolved=finiteNumber(this.rowLabelWidth,PAD_LEFT);return resolved>=0?resolved:PAD_LEFT}get matrixGeometry(){if(this.effectiveMode==="matrix")return this.lastPaintedMatrixGeometry}set matrixGeometry(_value){}get calendarGeometry(){if(this.effectiveMode==="calendar")return this.lastPaintedCalendarGeometry}set calendarGeometry(_value){}exportData(format){if(format==="csv")return this.exportCsv();if(format!=="png"||!this.canvasHasContent||!this.canvas||this.canvas.width<=0||this.canvas.height<=0)return"";try{const rowBand=this.frozenBandCanvas("row-labels"),colBand=this.frozenBandCanvas("col-labels");if(!rowBand&&!colBand)return this.canvas.toDataURL("image/png");const composite=this.ownerDocument.createElement("canvas");composite.width=this.canvas.width,composite.height=this.canvas.height;const context=composite.getContext("2d");return context?(context.drawImage(this.canvas,0,0),rowBand&&rowBand.width>0&&rowBand.height>0&&context.drawImage(rowBand,0,0),colBand&&colBand.width>0&&colBand.height>0&&context.drawImage(colBand,0,0),composite.toDataURL("image/png")):""}catch{return""}}exportCsv(){const data=this.data;if(data.kind==="calendar"){const header2=["date","value"].map(escapeCsvField).join(","),rows2=data.days.filter(day=>!this.isNoData(day.value)).map(day=>[day.date,this.formatNumericValue(day.value)].map(escapeCsvField).join(","));return[header2,...rows2].join(`\r
1
+ import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/collection-snapshot.js";import{html,nothing}from"lit";import{property,query,state}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{LyraElement}from"../../../internal/lyra-element.js";import{srOnly}from"../../../internal/a11y.js";import{syncAriaDescribedByElements}from"../../../internal/aria-reflection.js";import{finiteInteger,finiteNumber,finiteRange}from"../../../internal/numbers.js";import{getScratchCtx}from"../../../internal/canvas.js";import{resolveCssTokenLength}from"../../../internal/css-token-length.js";import{ThemeWatcher}from"../../../internal/theme-watcher.js";import{activeElementIn}from"../../../internal/active-element.js";import{linearAlpha,linearBucket,midpointAlpha,midpointBucket,minMax,sqrtStep}from"./heatmap-scale.js";import{styles}from"./heatmap.styles.js";import{buildCalendarGrid,parseIsoDate,quartileBucket}from"./calendar-grid.js";import{accessibleMatrixCellRect,calendarCellAt as readCalendarCell,calendarCellRect,calendarDateAt as readCalendarDate,calendarValueAt as readCalendarValue,firstInteractiveCalendarCell as findFirstInteractiveCalendarCell,firstInteractiveMatrixCell as findFirstInteractiveMatrixCell,hitTestCalendar as hitTestCalendarGrid,hitTestMatrix as hitTestMatrixGrid,matrixCellRect,nextInteractiveCalendarCell as findNextInteractiveCalendarCell,nextInteractiveMatrixCell as findNextInteractiveMatrixCell}from"./heatmap-grid-navigation.js";import{getDateTimeFormat,getNumberFormat}from"../../../internal/intl-cache.js";import{sanitizeCssColor}from"../../../internal/safe-css.js";import{literalSetConverter}from"../../../internal/converters.js";import{devWarnOnce}from"../../../internal/dev-mode-attribute-warning.js";import{escapeCsvField}from"../../utility/export-button/csv.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import{LYRA_DEFAULT_heatmapCalendarCellLabel,LYRA_DEFAULT_heatmapCalendarLabel,LYRA_DEFAULT_heatmapDecorationLimit,LYRA_DEFAULT_heatmapDefaultColLabel,LYRA_DEFAULT_heatmapDefaultRowLabel,LYRA_DEFAULT_heatmapMatrixCellLabel,LYRA_DEFAULT_heatmapMatrixLabel,LYRA_DEFAULT_heatmapNoDataValue,LYRA_DEFAULT_heatmapProjectionLimit,LYRA_DEFAULT_heatmapSelectedCellLabel,LYRA_DEFAULT_heatmapSelectedCount,LYRA_DEFAULT_heatmapValueLabel}from"../../../internal/default-strings.generated.js";const PAD_LEFT=60,PAD_TOP=20,ROW_LABEL_INSET=4,MAX_ROW_LABEL_FRACTION=.4,MAX_COL_LABEL_HEIGHT=240,COL_LABEL_INSET=6,labelExtentConverter={fromAttribute:value=>{if(value===null)return;const trimmed=value.trim();if(trimmed.toLowerCase()==="auto")return"auto";const parsed=Number.parseFloat(trimmed);return Number.isFinite(parsed)&&parsed>=0?parsed:void 0},toAttribute:value=>value===void 0?null:String(value)},STICKY_LABELS=literalSetConverter(["none","rows","cols","both"],"none"),FALLBACK_NO_DATA_FILL="rgba(128,128,128,0.25)",FALLBACK_STICKY_LABEL_BG="#ffffff",RAMP_STEPS=7,FALLBACK_SCALE_LO="#cde2fb",FALLBACK_SCALE_HI="#0969da",FALLBACK_LABEL_FONT="10px system-ui, sans-serif",CAL_PAD_LEFT=28,CAL_WEEKDAY_LABEL_INSET=2,CAL_LABEL_H=16,CAL_CELL=11,CAL_GAP=2,DEFAULT_MATRIX_CELL_SIZE=22,MAX_MATRIX_ROW_HEIGHT=4096,DEFAULT_ACCESSIBLE_TARGET_SIZE_PX=40,DEFAULT_BUCKET_COUNT=5,FIT_MIN_CELL=4,MAX_BUCKET_COUNT=256,MAX_HEATMAP_CELLS=1e4,MAX_HEATMAP_DECORATIONS=256,MAX_ACCESSIBLE_HEATMAP_CELLS=400,RING_LINE_WIDTH=2,FALLBACK_FOCUS_RING_COLOR="#0969da",FALLBACK_ANNOTATION_COLOR="#cf222e",FALLBACK_SELECTED_COLOR="#1a7f37",ARROW_KEYS=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"]),MS_PER_DAY=864e5,CAL_MONTH_LABEL_GAP=2;function isoDateAtOffset(firstWeekStart,dayOffset){return new Date(firstWeekStart.getTime()+dayOffset*MS_PER_DAY).toISOString().slice(0,10)}function legendStopsChanged(value,previous){if(Object.is(value,previous))return!1;if(!Array.isArray(value)||!Array.isArray(previous)||value.length!==previous.length)return!0;for(let index=0;index<value.length;index+=1){if(Object.hasOwn(value,index)!==Object.hasOwn(previous,index))return!0;const next=value[index],before=previous[index];if(!next||!before){if(!Object.is(next,before))return!0;continue}if(!Object.is(next.value,before.value)||!Object.is(next.color,before.color)||!Object.is(next.label,before.label)||!Object.is(next.partOfRamp,before.partOfRamp))return!0}return!1}const HEX_RE=/^([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i,RGB_RE=/^rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)(?:\s*,\s*([\d.]+))?\s*\)/i;function hexToRgb(hex){const clean=hex.trim().replace("#","");if(!HEX_RE.test(clean))return null;const hasAlpha=clean.length===4||clean.length===8,full=clean.length<=4?clean.split("").map(c=>c+c).join(""):clean,num=Number.parseInt(full,16);return hasAlpha?[num>>>24&255,num>>>16&255,num>>>8&255,(num&255)/255]:[num>>16&255,num>>8&255,num&255,1]}function parseRgbString(value){const match=RGB_RE.exec(value);if(!match)return null;const a=match[4]===void 0?1:Number(match[4]);return[Number(match[1]),Number(match[2]),Number(match[3]),a]}function resolveViaPixelReadback(ctx){try{ctx.clearRect(0,0,1,1),ctx.fillRect(0,0,1,1);const[r=0,g=0,b=0,a=0]=ctx.getImageData(0,0,1,1).data;return[r,g,b,a/255]}catch{return null}}function formatRgb([r,g,b,a]){const alpha=Math.min(1,Math.max(0,a));return alpha>=1?`rgb(${r}, ${g}, ${b})`:`rgba(${r}, ${g}, ${b}, ${Math.round(alpha*1e3)/1e3})`}function warnInvalidColor(color){devWarnOnce(`heatmap-invalid-color:${color}`,`<lr-heatmap> could not parse "${color}" (set via --lr-heatmap-scale-lo/-hi) as a CSS color; falling back to the default ramp endpoint.`)}let warnedNoCanvasContext=!1;function warnNoCanvasContext(){warnedNoCanvasContext||(warnedNoCanvasContext=!0,devWarnOnce("heatmap-no-canvas-context","<lr-heatmap>: no 2D canvas context is available in this environment; color resolution for non-hex/non-rgb values (e.g. oklch(), color(srgb ...), named colors) will fall back to the given default instead of resolving the requested color."))}function normalizeBucketCount(bucketCount){return finiteInteger(bucketCount,DEFAULT_BUCKET_COUNT,2,MAX_BUCKET_COUNT)}const optionalCellSizeConverter={fromAttribute(value){if(value===null||value.trim()==="")return;const parsed=Number(value);return Number.isFinite(parsed)?parsed:void 0}},DEFAULT_MATRIX_DATA=Object.freeze({kind:"matrix",rowLabels:Object.freeze([]),colLabels:Object.freeze([]),values:Object.freeze([])});function normalizeCellSizeClamp(value){if(!(value==null||!Number.isFinite(value)))return finiteRange(value,FIT_MIN_CELL,FIT_MIN_CELL)}const bucketCountConverter={fromAttribute(value){return value===null?DEFAULT_BUCKET_COUNT:normalizeBucketCount(Number(value))}};function resolveRgb(color,fallbackHex,ownerDocument){const fallback=hexToRgb(fallbackHex)??[0,0,0,1],direct=hexToRgb(color);if(direct)return direct;const ctx=getScratchCtx(ownerDocument);if(!ctx)return warnNoCanvasContext(),fallback;const sentinel="rgb(1, 2, 3)";ctx.fillStyle=sentinel;const sentinelNormalized=ctx.fillStyle;if(ctx.fillStyle=color,ctx.fillStyle===sentinelNormalized&&color.trim()!==sentinel)return warnInvalidColor(color),fallback;const normalized=ctx.fillStyle;return hexToRgb(normalized)??parseRgbString(normalized)??resolveViaPixelReadback(ctx)??fallback}function mixRgb(from,to,t){const clamped=Math.min(1,Math.max(0,t)),r=Math.round(from[0]+(to[0]-from[0])*clamped),g=Math.round(from[1]+(to[1]-from[1])*clamped),b=Math.round(from[2]+(to[2]-from[2])*clamped),a=from[3]+(to[3]-from[3])*clamped;return formatRgb([r,g,b,a])}const CALENDAR_SPACING_PROPERTIES=new Set(["cellGapX","cellGapY","cellRadius"]);class LyraHeatmap extends LyraElement{static{this.defaultStrings={...super.defaultStrings,heatmapCalendarCellLabel:LYRA_DEFAULT_heatmapCalendarCellLabel,heatmapCalendarLabel:LYRA_DEFAULT_heatmapCalendarLabel,heatmapDecorationLimit:LYRA_DEFAULT_heatmapDecorationLimit,heatmapDefaultColLabel:LYRA_DEFAULT_heatmapDefaultColLabel,heatmapDefaultRowLabel:LYRA_DEFAULT_heatmapDefaultRowLabel,heatmapMatrixCellLabel:LYRA_DEFAULT_heatmapMatrixCellLabel,heatmapMatrixLabel:LYRA_DEFAULT_heatmapMatrixLabel,heatmapNoDataValue:LYRA_DEFAULT_heatmapNoDataValue,heatmapProjectionLimit:LYRA_DEFAULT_heatmapProjectionLimit,heatmapSelectedCellLabel:LYRA_DEFAULT_heatmapSelectedCellLabel,heatmapSelectedCount:LYRA_DEFAULT_heatmapSelectedCount,heatmapValueLabel:LYRA_DEFAULT_heatmapValueLabel}}static{this.collectionSupport=collectionSupport}static{this.immutableEventDetails=Object.freeze(["lr-selection-change"])}static{this.ownedCollectionProperties=Object.freeze(["data","annotations","legendStops","colorSteps","selectedCells"])}static{this.identityCollectionObjectProperties=Object.freeze(["data"])}static{this.styles=[LyraElement.styles,styles,srOnly]}static get observedAttributes(){return[...new Set([...super.observedAttributes,"role"])]}get effectiveMode(){return this.data.kind}get stickyLabels(){return this._stickyLabels}set stickyLabels(next){const normalized=STICKY_LABELS.normalizeReflected(this,"sticky-labels",next),old=this._stickyLabels;old!==normalized&&(this._stickyLabels=normalized,this.requestUpdate("stickyLabels",old))}get effectiveStickyLabels(){return this.effectiveMode==="matrix"?this._stickyLabels:"none"}get freezesRowLabels(){const sticky=this.effectiveStickyLabels;return sticky==="rows"||sticky==="both"}get freezesColLabels(){const sticky=this.effectiveStickyLabels;return sticky==="cols"||sticky==="both"}get effectiveColLabelRotation(){if(typeof this.colLabelRotation!="number")return 0;const degrees=finiteNumber(this.colLabelRotation,0);return Math.min(90,Math.max(0,degrees))}get matrixPadLeft(){if(this.rowLabelWidth==="auto")return this.resolvedRowLabelWidth;if(typeof this.rowLabelWidth!="number")return PAD_LEFT;const resolved=finiteNumber(this.rowLabelWidth,PAD_LEFT);return resolved>=0?resolved:PAD_LEFT}get matrixGeometry(){if(this.effectiveMode==="matrix")return this.lastPaintedMatrixGeometry}set matrixGeometry(_value){}get calendarGeometry(){if(this.effectiveMode==="calendar")return this.lastPaintedCalendarGeometry}set calendarGeometry(_value){}exportData(format){if(format==="csv")return this.exportCsv();if(format!=="png"||!this.canvasHasContent||!this.canvas||this.canvas.width<=0||this.canvas.height<=0)return"";try{const rowBand=this.frozenBandCanvas("row-labels"),colBand=this.frozenBandCanvas("col-labels");if(!rowBand&&!colBand)return this.canvas.toDataURL("image/png");const composite=this.ownerDocument.createElement("canvas");composite.width=this.canvas.width,composite.height=this.canvas.height;const context=composite.getContext("2d");return context?(context.drawImage(this.canvas,0,0),rowBand&&rowBand.width>0&&rowBand.height>0&&context.drawImage(rowBand,0,0),colBand&&colBand.width>0&&colBand.height>0&&context.drawImage(colBand,0,0),composite.toDataURL("image/png")):""}catch{return""}}exportCsv(){const data=this.data;if(data.kind==="calendar"){const header2=["date","value"].map(escapeCsvField).join(","),rows2=data.days.filter(day=>!this.isNoData(day.value)).map(day=>[day.date,this.formatNumericValue(day.value)].map(escapeCsvField).join(","));return[header2,...rows2].join(`\r
2
2
  `)}const header=["row","column","value"].map(escapeCsvField).join(","),rows=[];return data.values.forEach((rowValues,rowIndex)=>{const rowLabel=data.rowLabels[rowIndex]??"";rowValues.forEach((value,colIndex)=>{if(this.isNoData(value))return;const colLabel=data.colLabels[colIndex]??"";rows.push([rowLabel,colLabel,this.formatNumericValue(value)].map(escapeCsvField).join(","))})}),[header,...rows].join(`\r
3
- `)}get matrixPadTop(){if(this.colLabelHeight==="auto")return this.resolvedColLabelHeight;if(typeof this.colLabelHeight!="number")return PAD_TOP;const resolved=finiteNumber(this.colLabelHeight,PAD_TOP);return resolved>=0?resolved:PAD_TOP}measureColLabelHeight(cs){const labels=this.matrixColLabels;if(labels.length===0)return PAD_TOP;const ctx=getScratchCtx(this.ownerDocument);if(!ctx)return PAD_TOP;ctx.font=this.labelFont(cs);let widest=0;const interval=finiteInteger(this.colLabelInterval,1,1);for(let index=0;index<labels.length;index+=interval)widest=Math.max(widest,ctx.measureText(labels[index]).width);const radians=this.effectiveColLabelRotation*Math.PI/180,projected=widest*Math.sin(radians);return Math.max(PAD_TOP,Math.min(Math.ceil(projected)+COL_LABEL_INSET,MAX_COL_LABEL_HEIGHT))}measureRowLabelWidth(cs){const labels=this.matrixRowLabels;if(labels.length===0)return PAD_LEFT;const ctx=getScratchCtx(this.ownerDocument);if(!ctx)return PAD_LEFT;ctx.font=this.labelFont(cs);let widest=0;for(const label of labels)widest=Math.max(widest,ctx.measureText(label).width);const hostWidth=this.clientWidth||0,cap=hostWidth>0?hostWidth*MAX_ROW_LABEL_FRACTION:Number.POSITIVE_INFINITY;return Math.min(Math.max(PAD_LEFT,Math.ceil(widest)+ROW_LABEL_INSET*2),cap)}ellipsize(ctx,label,maxWidth){if(maxWidth<=0)return"";if(ctx.measureText(label).width<=maxWidth)return label;const characters=[...label];let kept=characters.length-1;for(;kept>0;){const candidate=`${characters.slice(0,kept).join("")}…`;if(ctx.measureText(candidate).width<=maxWidth)return candidate;kept-=1}return ctx.measureText("…").width<=maxWidth?"…":""}get calendarPadLeft(){const requested=this.calendarWeekdayLabelWidth;return requested==="auto"?this.resolvedCalendarWeekdayLabelWidth:requested??CAL_PAD_LEFT}measureCalendarWeekdayLabelWidth(cs,firstWeekStart){const ctx=getScratchCtx(this.ownerDocument);if(!ctx)return CAL_PAD_LEFT;ctx.font=this.labelFont(cs);let widest=0;for(const label of this.weekdayLabels(firstWeekStart))label&&(widest=Math.max(widest,ctx.measureText(label).width));const hostWidth=this.clientWidth||0,cap=hostWidth>0?Math.max(CAL_PAD_LEFT,hostWidth*MAX_ROW_LABEL_FRACTION):Number.POSITIVE_INFINITY;return Math.min(Math.max(CAL_PAD_LEFT,Math.ceil(widest)+CAL_WEEKDAY_LABEL_INSET*2),cap)}get matrixRowLabels(){return this.cachedMatrixData.rowLabels}get matrixColLabels(){return this.cachedMatrixData.colLabels}get matrixValues(){return this.cachedMatrixData.values}get calendarDays(){return this.data.kind==="calendar"?this.data.days:[]}get calendarData(){return this.data.kind==="calendar"?this.data:void 0}get cellSize(){return this._cellSize??(this.effectiveMode==="calendar"?CAL_CELL:DEFAULT_MATRIX_CELL_SIZE)}set cellSize(value){const oldValue=this._cellSize;this._cellSize=value==null?void 0:finiteRange(value,this.effectiveMode==="calendar"?CAL_CELL:DEFAULT_MATRIX_CELL_SIZE,1),this.requestUpdate("cellSize",oldValue)}get signedDomain(){return this.domain!==void 0||this.midpoint!==void 0}rampAlpha(value,lo,hi){const anchor=this.midpoint;return anchor===void 0?linearAlpha(value,lo,hi):midpointAlpha(value,lo,hi,anchor)}rampBucket(value,lo,hi,steps){const anchor=this.midpoint;return anchor===void 0?linearBucket(value,lo,hi,steps):midpointBucket(value,lo,hi,anchor,steps)}isNoData(value){return Number.isFinite(value)?value<0&&!this.signedDomain:!0}get maxCellSize(){return this._maxCellSize}set maxCellSize(value){const oldValue=this._maxCellSize;this._maxCellSize=normalizeCellSizeClamp(value),this.requestUpdate("maxCellSize",oldValue)}get minCellSize(){return this._minCellSize}set minCellSize(value){const oldValue=this._minCellSize;this._minCellSize=normalizeCellSizeClamp(value),this.requestUpdate("minCellSize",oldValue)}get normalizedFirstDayOfWeek(){return(finiteInteger(this.calendarData?.firstDayOfWeek??0,0)%7+7)%7}get bucketCount(){return this._bucketCount}set bucketCount(value){const oldValue=this._bucketCount;this._bucketCount=normalizeBucketCount(value),this.requestUpdate("bucketCount",oldValue)}toggleRowSelection(row){this.toggleSelectionAxis(row,!0)}toggleColumnSelection(col){this.toggleSelectionAxis(col,!1)}get calendarWeekdayLabelText(){return this.calendarData?.weekdayLabelText}get calendarWeekdayLabelWidth(){const value=this.calendarData?.weekdayLabelWidth;if(value==="auto")return value;if(typeof value!="number")return;const resolved=finiteNumber(value,CAL_PAD_LEFT);return resolved>=0?resolved:void 0}get calendarMonthLabelText(){return this.calendarData?.monthLabelText}get calendarColumnX(){return this.calendarData?.columnX}get calendarRowY(){return this.calendarData?.rowY}constructor(){super(),this.data=DEFAULT_MATRIX_DATA,this._stickyLabels="none",this.resolvedColLabelHeight=PAD_TOP,this.resolvedRowLabelWidth=PAD_LEFT,this.resolvedCalendarWeekdayLabelWidth=CAL_PAD_LEFT,this.withoutLegend=!1,this.scale="linear",this.cellGapX=1,this.cellGapY=1,this.cellRadius=0,this.colLabelInterval=1,this.fitToWidth=!1,this._bucketCount=DEFAULT_BUCKET_COUNT,this.annotations=[],this.selectedCell=null,this.multiple=!1,this.selectedCells=[],this.accessibleCells=!1,this.cachedValueRange=null,this.cachedMatrixData={rowLabels:[],colLabels:[],values:[],truncated:!1},this.cachedCalendarGrid=buildCalendarGrid(this.calendarDays),this.cachedCalendarSortedValues=[],this.cachedCalendarCellsByPos=new Map,this.cachedCalendarCellsByDate=new Map,this.cachedAnnotations=[],this.cachedLegendStops=[],this.cachedColorSteps=[],this.cachedCalendarAnnotationDates=new Set,this.cachedMatrixAnnotationPositions=new Set,this.decorationProjectionTruncated=!1,this.cachedCalendarDateByPos=[],this.cachedAccessiblePositions=[],this.cachedAccessiblePositionsByKey=new Map,this.cachedAccessiblePositionIndexByKey=new Map,this.cachedRamp=null,this.canvasHasContent=!1,this.canvasVisible=!0,this.drawDirty=!1,this.hoverCell=null,this.focusedCell=null,this.liveText="",this.accessibleTargetSizePx=DEFAULT_ACCESSIBLE_TARGET_SIZE_PX,this.restoringAccessibleFocus=!1,this.accessibleFocusGeneration=0,this.authorRole=null,this.authorAriaLabel=null,this.generatedAriaLabel="",this.syncingGeneratedSemantics=!1,this.hasSyncedDescribedByElements=!1,this.onDprChange=()=>{this.watchDpr(),this.requestDraw()},this.scheduleDraw=()=>{if(this.drawFrameRequest)return;const owner=this.ownerDocument.defaultView;if(!owner||!this.isConnected)return;const request={owner,handle:0};request.handle=owner.requestAnimationFrame(()=>{this.drawFrameRequest===request&&(this.drawFrameRequest=void 0,this.isConnected&&this.ownerDocument.defaultView===owner&&this.requestDraw())}),this.drawFrameRequest=request},this.selectedPositions=new Map,this.selectionAnchor=null,this.suppressSelectionClick=!1,this.onSelectionPointerDown=event=>{if(!this.multiple||event.button!==0||!event.isPrimary||this.selectionGesture)return;const pos=this.selectionPointerPosition(event);if(!pos)return;event.preventDefault(),this.suppressSelectionClick=!1,this.selectionRangeBase=void 0,this.selectionAnchor=pos,this.focusedCell=pos,this.accessibleCells?this.focusAccessibleCell(pos):this.canvas?.focus();const target=event.currentTarget;this.selectionGesture={pointerId:event.pointerId,target,start:pos,previous:pos,moved:!1,selecting:!this.selectedPositions.has(this.accessibleCellKey(pos)),cells:new Map(this.selectedPositions)};try{target.setPointerCapture(event.pointerId)}catch{}this.paintSelectionTo(pos)},this.onSelectionPointerMove=event=>{if(this.selectionGesture?.pointerId!==event.pointerId)return;const pos=this.selectionPointerPosition(event);pos&&!this.samePos(pos,this.selectionGesture.previous)&&this.paintSelectionTo(pos)},this.onSelectionPointerUp=event=>{const gesture=this.selectionGesture;if(!gesture||gesture.pointerId!==event.pointerId)return;const pos=this.selectionPointerPosition(event);pos&&this.paintSelectionTo(pos),this.cancelSelectionGesture(),this.proposeSelection(gesture.cells,"pointer"),gesture.moved||this.emitCellClick(gesture.start,"pointer",!1)},this.onSelectionPointerCancel=event=>{this.selectionGesture?.pointerId===event.pointerId&&this.cancelSelectionGesture()},this.tooltipSize={inline:0,block:0},this.onPointerMove=e=>{const next=this.hitTest(e.offsetX,e.offsetY);this.samePos(this.hoverCell,next)||(this.hoverCell=next)},this.onPointerLeave=()=>{this.hoverCell=null},this.onCanvasClick=e=>{if(this.consumeSelectionClick(e))return;const pos=this.hitTest(e.offsetX,e.offsetY);pos&&(this.focusedCell=pos,this.announce(pos),this.emitCellClick(pos))},this.onKeyDown=e=>{if(this.selectionKeyDown(e,this.focusedCell))return;const previous=this.focusedCell;if(this.effectiveMode==="calendar"?this.onCalendarKeyDown(e):this.onMatrixKeyDown(e),ARROW_KEYS.has(e.key)&&this.focusedCell){const proposedKeys=this.extendSelection(previous,this.focusedCell,e.shiftKey);this.announce(this.focusedCell,proposedKeys?.has(this.accessibleCellKey(this.focusedCell)))}},this.canvasColorCache=new Map,this.onAccessibleCellFocus=e=>{if(this.restoringAccessibleFocus)return;const key=e.currentTarget.dataset.cellKey,pos=key?this.accessibleCellAtKey(key):null;pos&&(this.samePos(pos,this.focusedCell)||(this.selectionAnchor=pos,this.selectionRangeBase=void 0),this.focusedCell=pos,this.announce(pos))},this.onAccessibleCellClick=e=>{if(this.consumeSelectionClick(e))return;const key=e.currentTarget.dataset.cellKey,pos=key?this.accessibleCellAtKey(key):null;pos&&(this.focusedCell=pos,this.announce(pos),this.emitCellClick(pos,e.detail===0?"keyboard":"pointer"))},this.onAccessibleCellKeyDown=e=>{const key=e.currentTarget.dataset.cellKey,pos=key?this.accessibleCellAtKey(key):null;pos&&(this.selectionKeyDown(e,pos)||ARROW_KEYS.has(e.key)&&(e.preventDefault(),this.focusedCell=pos,this.onKeyDown(e),this.focusAccessibleCell(this.focusedCell)))},new ThemeWatcher(this,()=>this.refreshTheme()),this.calendarSpacingTrackingArmed=!0}requestUpdate(name,oldValue,options){this.calendarSpacingTrackingArmed&&name!==void 0&&CALENDAR_SPACING_PROPERTIES.has(name)&&(this.explicitCalendarSpacingProperties??=new Set).add(name),super.requestUpdate(name,oldValue,options)}explicitCalendarSpacing(name){if(!this.explicitCalendarSpacingProperties?.has(name))return;const value=this[name];return value??void 0}warnOnLegendRampMismatch(){const rampColors=this.cachedColorSteps.map(color=>sanitizeCssColor(color)??color);if(rampColors.length===0)return;const legendColors=this.cachedLegendStops.filter(stop=>!!stop.color&&stop.partOfRamp!==!1).map(stop=>sanitizeCssColor(stop.color??"")??stop.color??"");legendColors.length===0||legendColors.length===rampColors.length&&legendColors.every((color,index)=>color===rampColors[index])||devWarnOnce("lyra-heatmap-legend-ramp-mismatch",`<${this.localName}>: legendStops describes ${legendColors.length} colour(s) that do not match the ${rampColors.length} colorSteps the cells are painted from, so the legend may misdescribe the ramp. Supply legendStops built from the same array as colorSteps, or omit it to keep the built-in gradient key.`)}attributeChangedCallback(name,oldValue,value){super.attributeChangedCallback(name,oldValue,value),!(oldValue===value||this.syncingGeneratedSemantics)&&(name==="role"&&(this.authorRole=value),name==="aria-label"&&(this.authorAriaLabel=value))}connectedCallback(){super.connectedCallback(),this.syncAnnouncementSink(),this.refreshAccessibleTargetSize();const owner=this.ownerDocument.defaultView,ResizeObserverCtor=owner?.ResizeObserver;if(owner&&ResizeObserverCtor){let observer;observer=new ResizeObserverCtor(()=>{!this.isConnected||this.ownerDocument.defaultView!==owner||this.resizeObserver!==observer||this.scheduleDraw()}),this.resizeObserver=observer,observer.observe(this)}const IntersectionObserverCtor=owner?.IntersectionObserver;if(this.canvasVisible=!0,owner&&IntersectionObserverCtor){let observer;observer=new IntersectionObserverCtor(entries=>{if(!this.isConnected||this.ownerDocument.defaultView!==owner||this.intersectionObserver!==observer)return;const entry=entries.find(candidate=>candidate.target===this);!entry||entry.isIntersecting===this.canvasVisible||(this.canvasVisible=entry.isIntersecting,this.canvasVisible&&this.drawDirty&&this.scheduleDraw())}),this.intersectionObserver=observer,observer.observe(this)}this.cachedRamp=null,this.canvasColorCache.clear(),this.watchDpr()}disconnectedCallback(){super.disconnectedCallback(),this.cancelSelectionGesture(),this.selectionAnchor=null,this.selectionRangeBase=void 0,this.accessibleFocusGeneration++,this.pendingAccessibleFocus=void 0,this.pendingAccessibleFocusOrigin=void 0,this.restoringAccessibleFocus=!1,this.releaseAnnouncementSink(),this.hoverCell=null,this.focusedCell=null,this.liveText="",this.canvasHasContent=!1,this.drawDirty=!0,this.resizeObserver?.disconnect(),this.resizeObserver=void 0,this.intersectionObserver?.disconnect(),this.intersectionObserver=void 0,this.canvasVisible=!0,this.clearDprWatcher(),this.cancelDrawFrame()}releaseAnnouncementSink(){this.announcementSink?.release(),this.announcementSink=void 0}syncAnnouncementSink(){if(!this.isConnected){this.releaseAnnouncementSink();return}this.announcementSink?.element.ownerDocument!==this.ownerDocument&&(this.releaseAnnouncementSink(),this.announcementSink=acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this}))}watchDpr(){this.clearDprWatcher();const owner=this.ownerDocument.defaultView;if(!owner||typeof owner.matchMedia!="function")return;const query2=owner.matchMedia(`(resolution: ${owner.devicePixelRatio}dppx)`),listener=()=>{!this.isConnected||this.ownerDocument.defaultView!==owner||this.dprQuery!==query2||this.onDprChange()};this.dprQuery=query2,this.dprChangeListener=listener,query2.addEventListener("change",listener)}clearDprWatcher(){this.dprQuery&&this.dprChangeListener&&this.dprQuery.removeEventListener("change",this.dprChangeListener),this.dprQuery=void 0,this.dprChangeListener=void 0}willUpdate(changed){super.willUpdate(changed),(changed.has("data")||changed.has("domain")||changed.has("midpoint")||!this.hasUpdated)&&this.rebuildCanonicalMatrixData(),(changed.has("annotations")||changed.has("legendStops")||changed.has("colorSteps")||!this.hasUpdated)&&this.rebuildBoundedDecorations();const accessibleModeChanged=changed.has("accessibleCells")&&this.hasUpdated,collectionChanged=changed.has("data")||changed.has("cellInteractive"),activeRenderedControl=collectionChanged||accessibleModeChanged?activeElementIn(this.shadowRoot):null,activeAccessibleCell=activeRenderedControl?.matches('[part="cell"]')?activeRenderedControl:null,renderedAccessibleCells=activeAccessibleCell?.matches('[part="cell"]')?[...this.shadowRoot?.querySelectorAll('[part="cell"]')??[]]:[],accessibleFocusSnapshot=activeAccessibleCell?.matches('[part="cell"]')?{identity:activeAccessibleCell.dataset.cellIdentity,index:renderedAccessibleCells.indexOf(activeAccessibleCell)}:void 0;if(collectionChanged&&(this.focusedCell=null,this.hoverCell=null,this.liveText=""),changed.has("data")||changed.has("locale")||!this.hasUpdated){this.cachedCalendarGrid=buildCalendarGrid(this.calendarDays,this.normalizedFirstDayOfWeek,this.calendarMonthLabelText,this.effectiveLocale),this.cachedCalendarSortedValues=this.cachedCalendarGrid.cells.map(cell=>cell.value).filter(value=>!this.isNoData(value)).sort((a,b)=>a-b),this.cachedCalendarCellsByPos=new Map(this.cachedCalendarGrid.cells.map(cell=>[`${cell.week}:${cell.weekday}`,cell])),this.cachedCalendarCellsByDate=new Map(this.cachedCalendarGrid.cells.map(cell=>[cell.date,cell]));const{firstWeekStart,weekCount}=this.cachedCalendarGrid;this.cachedCalendarDateByPos=Array.from({length:weekCount*7},(_,index)=>isoDateAtOffset(firstWeekStart,index))}if(changed.has("colorSteps")||changed.has("withoutLegend")||!this.hasUpdated){const colorSteps=this.withoutLegend?[]:this.cachedColorSteps.map(sanitizeCssColor);colorSteps.length>=2&&colorSteps.every(color=>color!==void 0)?this.style.setProperty("--lr-heatmap-color-steps-gradient",`linear-gradient(to right, ${colorSteps.join(", ")})`):this.style.removeProperty("--lr-heatmap-color-steps-gradient")}if((changed.has("data")||changed.has("domain")||changed.has("midpoint")||!this.hasUpdated)&&(this.cachedValueRange=this.computeValueRange()),(collectionChanged||!this.hasUpdated)&&this.rebuildAccessiblePositions(),(collectionChanged||accessibleModeChanged||changed.has("multiple"))&&(this.cancelSelectionGesture(),this.selectionAnchor=null,this.selectionRangeBase=void 0,this.proposedSelectionKeys=void 0),(collectionChanged||changed.has("selectedCells")||changed.has("multiple")||!this.hasUpdated)&&(this.rebuildSelectedPositions(),changed.has("selectedCells")&&this.selectionGesture&&this.cancelSelectionGesture(),changed.has("selectedCells")&&this.selectionRangeBase&&(this.proposedSelectionKeys?.size!==this.selectedPositions.size||[...this.selectedPositions.keys()].some(key=>!this.proposedSelectionKeys?.has(key)))&&(this.selectionAnchor=this.focusedCell,this.selectionRangeBase=void 0)),accessibleFocusSnapshot){const positions=this.accessibleCellPositions(),target=(accessibleFocusSnapshot.identity==null?void 0:positions.find(pos=>this.accessibleCellIdentity(pos)===accessibleFocusSnapshot.identity))??positions[Math.min(Math.max(accessibleFocusSnapshot.index,0),positions.length-1)]??null;this.focusedCell=target,this.liveText=target?this.resolveCellText(target):"",this.pendingAccessibleFocus=target??"base",this.pendingAccessibleFocusOrigin=activeAccessibleCell??void 0,this.restoringAccessibleFocus=!0,this.accessibleFocusGeneration++}if(accessibleModeChanged){const previouslyAccessible=changed.get("accessibleCells")===!0;if(previouslyAccessible&&!this.accessibleCells&&activeAccessibleCell){const key=activeAccessibleCell.dataset.cellKey,target=key?this.accessibleCellAtKey(key):null;target&&(this.focusedCell=target,this.liveText=this.resolveCellText(target)),this.pendingAccessibleFocus="canvas",this.pendingAccessibleFocusOrigin=activeAccessibleCell,this.restoringAccessibleFocus=!0,this.accessibleFocusGeneration++}else if(!previouslyAccessible&&this.accessibleCells&&activeRenderedControl?.matches('[part="canvas"]')){const positions=this.accessibleCellPositions(),target=this.focusedCell?positions.find(pos=>this.samePos(pos,this.focusedCell))??positions[0]??null:positions[0]??null;this.focusedCell=target,this.liveText=target?this.resolveCellText(target):"",this.pendingAccessibleFocus=target??"base",this.pendingAccessibleFocusOrigin=activeRenderedControl,this.restoringAccessibleFocus=!0,this.accessibleFocusGeneration++}}const bounds=this.cachedValueRange,range=bounds?`${this.formatNumericValue(bounds[0])}–${this.formatNumericValue(bounds[1])}`:this.localize("heatmapNoDataValue"),valueLabel=this.localizedValueLabel();let label;if(this.effectiveMode==="calendar")label=this.localize("heatmapCalendarLabel",void 0,{days:this.formatCount(this.cachedCalendarGrid.cells.length),label:valueLabel,range});else{const rows=this.matrixRowLabels.length,cols=this.matrixColLabels.length;label=this.localize("heatmapMatrixLabel",void 0,{rows:this.formatCount(rows),cols:this.formatCount(cols),label:valueLabel,range})}const selectedText=this.selectedCellDescription(),generatedAriaLabel=[label,selectedText,this.projectionDescription()].filter(Boolean).join(" ");this.generatedAriaLabel=generatedAriaLabel,this.syncingGeneratedSemantics=!0;try{this.authorRole===null&&this.setAttribute("role","group"),this.authorAriaLabel===null&&this.setAttribute("aria-label",generatedAriaLabel)}finally{this.syncingGeneratedSemantics=!1}}rebuildBoundedDecorations(){this.cachedAnnotations=this.annotations.slice(0,MAX_HEATMAP_DECORATIONS).map(entry=>({...entry})),this.cachedLegendStops=(this.legendStops??[]).slice(0,MAX_HEATMAP_DECORATIONS).map(entry=>({...entry})),this.cachedColorSteps=(this.colorSteps??[]).slice(0,MAX_HEATMAP_DECORATIONS),this.warnOnLegendRampMismatch(),this.cachedCalendarAnnotationDates=new Set(this.cachedAnnotations.flatMap(annotation=>annotation.date==null?[]:[annotation.date])),this.cachedMatrixAnnotationPositions=new Set(this.cachedAnnotations.flatMap(annotation=>annotation.row==null||annotation.col==null?[]:[`${annotation.row}:${annotation.col}`])),this.decorationProjectionTruncated=this.annotations.length>MAX_HEATMAP_DECORATIONS||(this.legendStops?.length??0)>MAX_HEATMAP_DECORATIONS||(this.colorSteps?.length??0)>MAX_HEATMAP_DECORATIONS}get projectionTruncated(){return this.decorationProjectionTruncated||(this.effectiveMode==="calendar"?this.cachedCalendarGrid.truncated:this.cachedMatrixData.truncated)}get cellProjectionTruncated(){return this.effectiveMode==="calendar"?this.cachedCalendarGrid.truncated:this.cachedMatrixData.truncated}projectedCellCount(){return this.effectiveMode==="calendar"?this.cachedCalendarGrid.weekCount*7:this.matrixRowLabels.length*this.matrixColLabels.length}projectionDescription(){const messages=[];return this.cellProjectionTruncated&&messages.push(this.localize("heatmapProjectionLimit",void 0,{count:this.formatCount(this.projectedCellCount())})),this.decorationProjectionTruncated&&messages.push(this.localize("heatmapDecorationLimit",void 0,{count:this.formatCount(MAX_HEATMAP_DECORATIONS)})),messages.join(" ")}rebuildCanonicalMatrixData(){if(this.data.kind!=="matrix"){this.cachedMatrixData={rowLabels:[],colLabels:[],values:[],truncated:!1};return}const colCount=Math.min(this.data.colLabels.length,MAX_HEATMAP_CELLS),rowLimit=colCount===0?Math.min(this.data.rowLabels.length,MAX_HEATMAP_CELLS):Math.floor(MAX_HEATMAP_CELLS/colCount),rowCount=Math.min(this.data.rowLabels.length,rowLimit),rowLabels=this.data.rowLabels.slice(0,rowCount).map(String),colLabels=this.data.colLabels.slice(0,colCount).map(String),source=this.data,values=Array.from({length:rowCount},(_,row)=>Array.from({length:colCount},(_2,col)=>source.values[row]?.[col]??(this.signedDomain?Number.NaN:-1)));this.cachedMatrixData={rowLabels,colLabels,values,truncated:rowCount!==this.data.rowLabels.length||colCount!==this.data.colLabels.length||this.data.values.some((row,index)=>index>=rowCount||row.length>colCount)}}selectedCellDescription(){if(this.multiple){const count=this.currentSelectedPositions.size;return count?this.localize("heatmapSelectedCount",void 0,{count:this.formatCount(count)}):""}if(!this.selectedCell)return"";if(this.effectiveMode==="calendar"){if(this.selectedCell.date==null)return"";const match=this.cachedCalendarCellsByDate.get(this.selectedCell.date);return match?this.localize("heatmapSelectedCellLabel",void 0,{cell:this.calendarCellText({week:match.week,weekday:match.weekday,date:match.date})}):""}const{row,col}=this.selectedCell;return row==null||col==null||row<0||row>=this.matrixRowLabels.length||col<0||col>=this.matrixColLabels.length?"":this.localize("heatmapSelectedCellLabel",void 0,{cell:this.matrixCellText({row,col})})}computeValueRange(){const pinned=this.domain;if(pinned){const[lo,hi]=pinned;if(Number.isFinite(lo)&&Number.isFinite(hi)&&lo!==hi)return lo<hi?[lo,hi]:[hi,lo]}const source=this.effectiveMode==="calendar"?this.cachedCalendarGrid.cells.map(cell=>cell.value):this.matrixValues.flat();return minMax(source.filter(v=>!this.isNoData(v)))}localizedValueLabel(){return this.valueLabel===void 0?this.localize("heatmapValueLabel"):this.valueLabel}formatNumericValue(value){return getNumberFormat(this.effectiveLocale||void 0).format(value)}syncExternalDescription(){const describedBy=this.getAttribute("aria-describedby");if(!describedBy&&!this.hasSyncedDescribedByElements)return;const control=this.accessibleCells?this.renderRoot.querySelector('[part="cells"]'):this.canvas;this.hasSyncedDescribedByElements=syncAriaDescribedByElements(this,control??void 0,describedBy)}updated(changed){if(super.updated(changed),this.syncExternalDescription(),this.hoverCell&&this.effectiveStickyLabels!=="none"&&this.scheduleAfterUpdate(()=>this.measureTooltip(),"heatmap-tooltip-metrics"),["data","cellSize","cellGapX","cellGapY","cellRadius","colLabelInterval","maxCellSize","minCellSize","valueLabel","scale","domain","midpoint","fitToWidth","rowLabelWidth","colLabelHeight","colLabelRotation","bucketCount","annotations","focusedCell","colorSteps","cellColor","selectedCell","selectedCells","multiple","selectionPreview","legendStops","accessibleCells","accessibleTargetSizePx","locale","stickyLabels"].some(name=>changed.has(name))){if(changed.has("focusedCell")&&[...changed.keys()].every(key=>key==="focusedCell"||key==="liveText")&&this.repaintFocusRing(changed.get("focusedCell")))return;this.requestDraw()}const pending=this.pendingAccessibleFocus;if(pending===void 0)return;this.pendingAccessibleFocus=void 0;const origin=this.pendingAccessibleFocusOrigin;this.pendingAccessibleFocusOrigin=void 0;const generation=this.accessibleFocusGeneration;this.scheduleAfterUpdate(()=>{try{if(generation!==this.accessibleFocusGeneration||!this.isConnected)return;if(origin){const internalActive=activeElementIn(this.shadowRoot),documentActive=activeElementIn(this.ownerDocument),focusStayedAtOrigin=internalActive===origin,originWasRemovedWithoutReplacement=internalActive===null&&(documentActive===null||documentActive===this||documentActive===this.ownerDocument.body);if(!focusStayedAtOrigin&&!originWasRemovedWithoutReplacement)return}if(pending==="base"){this.shadowRoot?.querySelector('[part="base"]')?.focus();return}if(pending==="canvas"){this.shadowRoot?.querySelector('[part="canvas"]')?.focus();return}const identity=this.accessibleCellIdentity(pending);[...this.shadowRoot?.querySelectorAll('[part="cell"]')??[]].find(candidate=>candidate.dataset.cellIdentity===identity)?.focus()}finally{this.restoringAccessibleFocus=!1}},"heatmap-accessible-focus")}refreshTheme(){this.cachedRamp=null,this.refreshAccessibleTargetSize()||this.requestDraw()}refreshAccessibleTargetSize(){const raw=this.ownerDocument.defaultView?.getComputedStyle(this).getPropertyValue("--lr-icon-button-size").trim()??"",resolved=resolveCssTokenLength(raw,{host:this}),next=resolved!==void 0&&Number.isFinite(resolved)&&resolved>0?resolved:DEFAULT_ACCESSIBLE_TARGET_SIZE_PX;return next===this.accessibleTargetSizePx?!1:(this.accessibleTargetSizePx=next,!0)}scaleEndpoints(cs){const lo=cs.getPropertyValue("--lr-heatmap-scale-lo").trim()||cs.getPropertyValue("--_lr-heatmap-scale-lo").trim()||FALLBACK_SCALE_LO,hi=cs.getPropertyValue("--lr-heatmap-scale-hi").trim()||cs.getPropertyValue("--_lr-heatmap-scale-hi").trim()||FALLBACK_SCALE_HI;return[lo,hi]}labelColor(cs){return cs.getPropertyValue("--lr-color-text-quiet").trim()||"#6b7280"}labelFont(cs){return cs.getPropertyValue("--lr-heatmap-label-font").trim()||cs.getPropertyValue("--_lr-heatmap-label-font").trim()||FALLBACK_LABEL_FONT}stickyLabelBg(cs){const raw=cs.getPropertyValue("--lr-heatmap-sticky-label-bg").trim()||cs.getPropertyValue("--_lr-heatmap-sticky-label-bg").trim()||FALLBACK_STICKY_LABEL_BG;return formatRgb(resolveRgb(raw,FALLBACK_STICKY_LABEL_BG,this.ownerDocument))}noDataFill(cs){return cs.getPropertyValue("--lr-heatmap-no-data-fill").trim()||cs.getPropertyValue("--_lr-heatmap-no-data-fill").trim()||FALLBACK_NO_DATA_FILL}focusRingColor(cs){return cs.getPropertyValue("--lr-heatmap-focus-ring-color").trim()||cs.getPropertyValue("--_lr-heatmap-focus-ring-color").trim()||FALLBACK_FOCUS_RING_COLOR}annotationColor(cs){return cs.getPropertyValue("--lr-heatmap-annotation-color").trim()||cs.getPropertyValue("--_lr-heatmap-annotation-color").trim()||FALLBACK_ANNOTATION_COLOR}selectedColor(cs){return cs.getPropertyValue("--lr-heatmap-selected-color").trim()||cs.getPropertyValue("--_lr-heatmap-selected-color").trim()||FALLBACK_SELECTED_COLOR}strokeCellState(ctx,x,y,size,state2,color){const shape=this.effectiveMode==="matrix"?this.matrixCellShape(size):this.calendarCellShape(size),width=shape?.custom?shape.w:size,height=shape?.custom?shape.h:size;shape?.custom&&(ctx.save(),ctx.beginPath(),ctx.roundRect(x,y,shape.w,shape.h,shape.radius),ctx.clip());const inset=Math.min(state2==="annotation"?.5:state2==="selected"?3.5:6.5,Math.max(.5,(Math.min(width,height)-RING_LINE_WIDTH-1)/2)),w=Math.max(1,width-inset*2),h=Math.max(1,height-inset*2);ctx.lineWidth=RING_LINE_WIDTH,ctx.strokeStyle=color,ctx.setLineDash?.(state2==="annotation"?[]:state2==="selected"?[4,2]:[1,2]),shape?.custom&&shape.radius>0?(ctx.beginPath(),ctx.roundRect(x+inset,y+inset,w,h,Math.max(0,shape.radius-inset)),ctx.stroke()):ctx.strokeRect(x+inset,y+inset,w,h),ctx.setLineDash?.([]),shape?.custom&&ctx.restore()}isSelectedPos(pos){return this.multiple?this.currentSelectedPositions.has(this.accessibleCellKey(pos)):this.selectedCell?"week"in pos?this.selectedCell.date==null?!1:this.calendarCellAt(pos).date===this.selectedCell.date:this.selectedCell.row===pos.row&&this.selectedCell.col===pos.col:!1}draw(){if(!this.canvasVisible){this.drawDirty=!0;return}this.drawDirty=!1,this.canvasHasContent=!1,this.effectiveMode==="calendar"?this.drawCalendar():this.drawMatrix()}requestDraw(){this.drawDirty=!0,this.canvasVisible&&this.draw()}repaintFocusRing(previous){if(!this.canvasHasContent||!this.canvas)return!1;const current=this.focusedCell;if(this.effectiveMode==="calendar"){if(previous&&!("week"in previous)||current&&!("week"in current))return!1;this.repaintCalendarFocusCell(previous&&"week"in previous?previous:null),current&&(!previous||!this.samePos(previous,current))&&this.repaintCalendarFocusCell(current)}else{if(previous&&!("row"in previous)||current&&!("row"in current))return!1;this.repaintMatrixFocusCell(previous&&"row"in previous?previous:null),current&&(!previous||!this.samePos(previous,current))&&this.repaintMatrixFocusCell(current)}return!0}cancelDrawFrame(){const request=this.drawFrameRequest;request&&request.owner.cancelAnimationFrame(request.handle),this.drawFrameRequest=void 0}resolveColorStep(color,fallback){const safe=sanitizeCssColor(color);if(!safe)return fallback;const scope=this.ownerDocument.createElement("span"),probe=this.ownerDocument.createElement("span");scope.hidden=!0,scope.style.color=fallback,probe.style.color=safe,scope.append(probe),this.renderRoot.append(scope);try{return this.ownerDocument.defaultView?.getComputedStyle(probe).color.trim()||fallback}finally{scope.remove()}}colorRamp(bucketCount,cs){const steps=this.cachedColorSteps;if(steps&&steps.length>=2){const key2=`steps ${steps.join(" ")}`;if(this.cachedRamp?.key===key2)return this.cachedRamp;const resolved=steps.map((color,index)=>this.resolveColorStep(color,index===steps.length-1?FALLBACK_SCALE_HI:FALLBACK_SCALE_LO)),colors2=resolved.map(color=>formatRgb(resolveRgb(color,FALLBACK_SCALE_LO,this.ownerDocument))),loRgb2=resolveRgb(resolved[0],FALLBACK_SCALE_LO,this.ownerDocument),hiRgb2=resolveRgb(resolved[resolved.length-1],FALLBACK_SCALE_HI,this.ownerDocument);return this.cachedRamp={key:key2,colors:colors2,loRgb:loRgb2,hiRgb:hiRgb2},this.cachedRamp}const[scaleLo,scaleHi]=this.scaleEndpoints(cs),normalizedBucketCount=normalizeBucketCount(bucketCount),key=`${scaleLo}\0${scaleHi}\0${normalizedBucketCount}`;if(this.cachedRamp?.key===key)return this.cachedRamp;const loRgb=resolveRgb(scaleLo,FALLBACK_SCALE_LO,this.ownerDocument),hiRgb=resolveRgb(scaleHi,FALLBACK_SCALE_HI,this.ownerDocument),colors=Array.from({length:normalizedBucketCount},(_,i)=>mixRgb(loRgb,hiRgb,i/(normalizedBucketCount-1)));return this.cachedRamp={key,colors,loRgb,hiRgb},this.cachedRamp}calendarCellSize(){return this.calendarSpacing().cellSize}calendarSpacing(){const{weekCount}=this.cachedCalendarGrid,rawGapX=this.explicitCalendarSpacing("cellGapX"),rawGapY=this.explicitCalendarSpacing("cellGapY"),rawRadius=this.explicitCalendarSpacing("cellRadius"),boundGap=(raw,size2)=>raw===void 0?CAL_GAP:finiteRange(raw,CAL_GAP,0,Math.max(0,size2-1));let size;if(this.fitToWidth&&weekCount>0){const fitGap=boundGap(rawGapX,this.cellSize),hostWidth=this.clientWidth||this.calendarPadLeft+weekCount*(this.cellSize+fitGap);size=this.clampFitCellSize((hostWidth-this.calendarPadLeft)/weekCount-fitGap)}else size=this.cellSize;return this.accessibleCells&&(size=Math.max(size,this.accessibleTargetSizePx)),{cellSize:size,gapX:boundGap(rawGapX,size),gapY:boundGap(rawGapY,size),radius:rawRadius===void 0?0:finiteRange(rawRadius,0,0,size/2)}}clampFitCellSize(size){const floored=finiteRange(size,FIT_MIN_CELL,Math.max(FIT_MIN_CELL,this.minCellSize??FIT_MIN_CELL));return this.maxCellSize==null?floored:Math.min(floored,this.maxCellSize)}columnXFor(week){return this.calendarColumnPositions()[week]??this.calendarPadLeft}rowYFor(weekday){return this.calendarRowPositions()[weekday]??CAL_LABEL_H}calendarColumnPositions(){const{cellSize,gapX:gap}=this.calendarSpacing(),weekCount=this.cachedCalendarGrid.weekCount,callback=this.calendarColumnX,padLeft=this.calendarPadLeft,cached=this.cachedColumnGeometry;if(cached!==void 0&&cached.callback===callback&&cached.padLeft===padLeft&&cached.cellSize===cellSize&&cached.gap===gap&&cached.weekCount===weekCount)return cached.positions;const positions=[];for(let index=0;index<=weekCount;index++){const fallback=index===0?padLeft:positions[index-1]+cellSize+gap;let candidate=fallback;if(callback)try{const supplied=callback(index);Number.isFinite(supplied)&&supplied>=0&&(index===0||supplied>=positions[index-1]+cellSize)&&(candidate=supplied)}catch{candidate=fallback}positions.push(candidate)}return this.cachedColumnGeometry={callback,padLeft,cellSize,gap,weekCount,positions},positions}calendarRowPositions(){const{cellSize,gapY:gap}=this.calendarSpacing(),callback=this.calendarRowY,cached=this.cachedRowGeometry;if(cached!==void 0&&cached.callback===callback&&cached.cellSize===cellSize&&cached.gap===gap)return cached.positions;const positions=[];for(let index=0;index<=7;index++){const fallback=index===0?CAL_LABEL_H:positions[index-1]+cellSize+gap;let candidate=fallback;if(callback)try{const supplied=callback(index);Number.isFinite(supplied)&&supplied>=0&&(index===0||supplied>=positions[index-1]+cellSize)&&(candidate=supplied)}catch{candidate=fallback}positions.push(candidate)}return this.cachedRowGeometry={callback,cellSize,gap,positions},positions}weekdayLabels(firstWeekStart){const formatter=getDateTimeFormat(this.effectiveLocale||void 0,{weekday:"short",timeZone:"UTC"}),labels=["","","","","","",""];for(const weekday of[1,3,5]){const row=(weekday-this.normalizedFirstDayOfWeek+7)%7;labels[row]=this.calendarWeekdayLabelText?.(weekday)??formatter.format(new Date(firstWeekStart.getTime()+row*MS_PER_DAY))}return labels}paintCalendarAxisLabels(ctx,cellSize,cs,firstWeekStart,monthLabels){ctx.fillStyle=this.labelColor(cs),ctx.font=this.labelFont(cs);const canvasRight=this.columnXFor(Math.max(1,this.cachedCalendarGrid.weekCount)),placed=[];monthLabels.forEach((month,index)=>{const label=this.ellipsize(ctx,month.label,canvasRight);if(!label)return;const width=ctx.measureText(label).width,x=Math.max(0,Math.min(this.columnXFor(month.week),canvasRight-width)),nextWeek=monthLabels[index+1]?.week??Math.max(month.week+1,this.cachedCalendarGrid.weekCount),entry={label,x,end:x+width+CAL_MONTH_LABEL_GAP,span:nextWeek-month.week};let previous=placed[placed.length-1];for(;previous&&entry.x<previous.end&&entry.span>previous.span;)placed.pop(),previous=placed[placed.length-1];previous&&entry.x<previous.end||placed.push(entry)});for(const{label,x}of placed)ctx.fillText(label,x,CAL_LABEL_H-4);const available=this.calendarPadLeft-CAL_WEEKDAY_LABEL_INSET*2;this.weekdayLabels(firstWeekStart).forEach((label,weekday)=>{const shown=label?this.ellipsize(ctx,label,available):"";shown&&ctx.fillText(shown,CAL_WEEKDAY_LABEL_INSET,this.rowYFor(weekday)+cellSize-1)})}drawCalendar(){if(!this.canvas)return;const{weekCount,firstWeekStart,monthLabels}=this.cachedCalendarGrid,cs=this.ownerDocument.defaultView?.getComputedStyle(this);if(!cs)return;const previousResolvedWeekdayWidth=this.resolvedCalendarWeekdayLabelWidth;this.calendarWeekdayLabelWidth==="auto"&&(this.resolvedCalendarWeekdayLabelWidth=this.measureCalendarWeekdayLabelWidth(cs,firstWeekStart));const autoGutterChanged=previousResolvedWeekdayWidth!==this.resolvedCalendarWeekdayLabelWidth,spacing=this.calendarSpacing(),cellSize=spacing.cellSize,w=this.columnXFor(Math.max(1,weekCount)),h=this.rowYFor(7),dpr=this.ownerDocument.defaultView?.devicePixelRatio||1;this.canvas.width=w*dpr,this.canvas.height=h*dpr,this.canvas.style.width=`${w}px`,this.canvas.style.height=`${h}px`;const ctx=this.canvas.getContext("2d");if(!ctx)return;ctx.scale(dpr,dpr),ctx.clearRect(0,0,w,h);const buckets=normalizeBucketCount(this.bucketCount),ramp=this.colorRamp(buckets,cs).colors,noDataFill=this.noDataFill(cs);this.canvasColorCache.clear();const bounds=this.cachedValueRange,lo=bounds?bounds[0]:0,hi=bounds?bounds[1]:1;for(let week=0;week<weekCount;week++)for(let weekday=0;weekday<7;weekday++){const value=this.calendarValueAt(week,weekday),x=this.columnXFor(week),y=this.rowYFor(weekday),override=this.cellColor?.(this.calendarPos(week,weekday),value);if(override!=null)ctx.fillStyle=this.resolveCanvasColor(override,cs);else if(this.isNoData(value))ctx.fillStyle=noDataFill;else if(this.scale==="sqrt"){const step=sqrtStep(value,hi,ramp.length);ctx.fillStyle=step<0?noDataFill:ramp[step]}else if(this.cachedColorSteps.length>=2){const step=this.rampBucket(value,lo,hi,ramp.length);ctx.fillStyle=ramp[step]}else ctx.fillStyle=ramp[quartileBucket(value,this.cachedCalendarSortedValues,buckets)];this.fillCalendarCell(ctx,x,y,cellSize,spacing.radius)}if(this.cachedAnnotations.length)for(const ann of this.cachedAnnotations){if(ann.date==null)continue;const match=this.cachedCalendarCellsByDate.get(ann.date);if(!match)continue;const x=this.columnXFor(match.week),y=this.rowYFor(match.weekday);this.strokeCellState(ctx,x,y,cellSize,"annotation",this.annotationColor(cs))}for(const match of this.selectedPaintPositions())if("week"in match){const x=this.columnXFor(match.week),y=this.rowYFor(match.weekday);this.strokeCellState(ctx,x,y,cellSize,"selected",this.selectedColor(cs))}if(this.focusedCell&&"week"in this.focusedCell){const{week,weekday}=this.focusedCell;if(week<weekCount&&weekday<7){const x=this.columnXFor(week),y=this.rowYFor(weekday);this.strokeCellState(ctx,x,y,cellSize,"focus",this.focusRingColor(cs))}}this.paintCalendarAxisLabels(ctx,cellSize,cs,firstWeekStart,monthLabels),this.canvasHasContent=!0,this.recordCalendarGeometry(spacing,weekCount),autoGutterChanged&&this.accessibleCells&&this.scheduleAfterUpdate(()=>this.requestUpdate(),"heatmap-calendar-accessible-geometry")}matrixCellSize(cols){let size;if(this.fitToWidth&&cols>0){const padLeft=this.matrixPadLeft,hostWidth=this.clientWidth||padLeft+cols*this.cellSize;size=this.clampFitCellSize((hostWidth-padLeft)/cols)}else size=this.cellSize;if(!this.accessibleCells)return size;const target=this.accessibleTargetSizePx,gap=finiteNumber(this.cellGapX,1)!==1||finiteNumber(this.cellGapY,1)!==1||finiteRange(this.cellRadius,0,0)>0?Math.max(finiteRange(this.cellGapX,1,0,target),finiteRange(this.cellGapY,1,0,target)):0;return Math.max(size,target+gap)}matrixCellShape(size){if(finiteNumber(this.cellGapX,1)===1&&finiteNumber(this.cellGapY,1)===1&&finiteRange(this.cellRadius,0,0)===0)return{w:size-1,h:size-1,radius:0,custom:!1};const minimum=this.accessibleCells?Math.min(size,this.accessibleTargetSizePx):1,maxGap=Math.max(0,size-minimum),w=size-finiteRange(this.cellGapX,1,0,maxGap),h=size-finiteRange(this.cellGapY,1,0,maxGap),radius=finiteRange(this.cellRadius,0,0,Math.min(w,h)/2);return{w,h,radius,custom:w!==size-1||h!==size-1||radius!==0}}calendarCellShape(size){const radius=this.calendarSpacing().radius;return radius>0?{w:size,h:size,radius:Math.min(radius,size/2),custom:!0}:void 0}fillMatrixCell(ctx,x,y,shape){shape.radius===0?ctx.fillRect(x,y,shape.w,shape.h):(ctx.beginPath(),ctx.roundRect(x,y,shape.w,shape.h,shape.radius),ctx.fill())}paintMatrixCell(ctx,row,col,cellSize,cs,rampData,noDataFill){const value=this.matrixValues[row]?.[col]??Number.NaN,bounds=this.cachedValueRange,lo=bounds?bounds[0]:0,hi=bounds?bounds[1]:1,override=this.cellColor?.({row,col},value);if(override!=null)ctx.fillStyle=this.resolveCanvasColor(override,cs);else if(this.isNoData(value))ctx.fillStyle=noDataFill;else if(this.scale==="sqrt"){const step=sqrtStep(value,hi,rampData.colors.length);ctx.fillStyle=step<0?noDataFill:rampData.colors[step]}else this.cachedColorSteps.length>=2?ctx.fillStyle=rampData.colors[this.rampBucket(value,lo,hi,rampData.colors.length)]:ctx.fillStyle=mixRgb(rampData.loRgb,rampData.hiRgb,this.rampAlpha(value,lo,hi));this.fillMatrixCell(ctx,this.matrixPadLeft+col*cellSize,this.matrixPadTop+row*cellSize,this.matrixCellShape(cellSize))}paintMatrixFocusOverlays(ctx,row,col,cellSize,cs,state2){const x=this.matrixPadLeft+col*cellSize,y=this.matrixPadTop+row*cellSize;state2==="annotation"&&this.cachedMatrixAnnotationPositions.has(`${row}:${col}`)&&this.strokeCellState(ctx,x,y,cellSize,"annotation",this.annotationColor(cs)),state2==="selected"&&this.isSelectedPos({row,col})&&this.strokeCellState(ctx,x,y,cellSize,"selected",this.selectedColor(cs)),state2==="focus"&&this.focusedCell&&"row"in this.focusedCell&&this.focusedCell.row===row&&this.focusedCell.col===col&&this.strokeCellState(ctx,x,y,cellSize,"focus",this.focusRingColor(cs))}focusRepaintBounds(ctx,x,y,cellSize){const padding=RING_LINE_WIDTH+1,dpr=ctx.getTransform().a,left=Math.floor((x-padding)*dpr)/dpr,top=Math.floor((y-padding)*dpr)/dpr,right=Math.ceil((x+cellSize+padding)*dpr)/dpr,bottom=Math.ceil((y+cellSize+padding)*dpr)/dpr;return{left,top,width:right-left,height:bottom-top,radius:Math.ceil((2*padding+1/dpr)/cellSize)}}repaintMatrixFocusCell(pos){if(!pos||!this.canvas)return;const rows=this.matrixRowLabels.length,cols=this.matrixColLabels.length;if(pos.row<0||pos.row>=rows||pos.col<0||pos.col>=cols)return;const cellSize=this.matrixCellSize(cols),x=this.matrixPadLeft+pos.col*cellSize,y=this.matrixPadTop+pos.row*cellSize,ctx=this.canvas.getContext("2d");if(!ctx)return;const cs=this.ownerDocument.defaultView?.getComputedStyle(this);if(!cs)return;const{left,top,width,height,radius}=this.focusRepaintBounds(ctx,x,y,cellSize),firstRow=Math.max(0,pos.row-radius),lastRow=Math.min(rows-1,pos.row+radius),firstCol=Math.max(0,pos.col-radius),lastCol=Math.min(cols-1,pos.col+radius),ramp=this.colorRamp(RAMP_STEPS,cs),noData=this.noDataFill(cs);ctx.save();try{ctx.beginPath(),ctx.rect(left,top,width,height),ctx.clip(),ctx.clearRect(left,top,width,height);for(let row=firstRow;row<=lastRow;row++)for(let col=firstCol;col<=lastCol;col++)this.paintMatrixCell(ctx,row,col,cellSize,cs,ramp,noData);for(const state2 of["annotation","selected","focus"])for(let row=firstRow;row<=lastRow;row++)for(let col=firstCol;col<=lastCol;col++)this.paintMatrixFocusOverlays(ctx,row,col,cellSize,cs,state2)}finally{ctx.restore()}}paintCalendarCell(ctx,week,weekday,cellSize,cs,ramp,noDataFill){const value=this.calendarValueAt(week,weekday),bounds=this.cachedValueRange,lo=bounds?bounds[0]:0,hi=bounds?bounds[1]:1,override=this.cellColor?.(this.calendarPos(week,weekday),value);if(override!=null)ctx.fillStyle=this.resolveCanvasColor(override,cs);else if(this.isNoData(value))ctx.fillStyle=noDataFill;else if(this.scale==="sqrt"){const step=sqrtStep(value,hi,ramp.length);ctx.fillStyle=step<0?noDataFill:ramp[step]}else this.cachedColorSteps.length>=2?ctx.fillStyle=ramp[this.rampBucket(value,lo,hi,ramp.length)]:ctx.fillStyle=ramp[quartileBucket(value,this.cachedCalendarSortedValues,ramp.length)];this.fillCalendarCell(ctx,this.columnXFor(week),this.rowYFor(weekday),cellSize,this.calendarSpacing().radius)}fillCalendarCell(ctx,x,y,size,radius){radius===0?ctx.fillRect(x,y,size,size):(ctx.beginPath(),ctx.roundRect(x,y,size,size,radius),ctx.fill())}recordCalendarGeometry(spacing,weekCount){const next={padLeft:this.calendarPadLeft,padTop:CAL_LABEL_H,cellSize:spacing.cellSize,cellWidth:spacing.cellSize,cellHeight:spacing.cellSize,cellGapX:spacing.gapX,cellGapY:spacing.gapY,cellRadius:spacing.radius,weekCount,firstDayOfWeek:this.normalizedFirstDayOfWeek},previous=this.lastPaintedCalendarGeometry;if(previous&&Object.keys(next).every(key=>previous[key]===next[key]))return;const frozen=Object.freeze(next);this.lastPaintedCalendarGeometry=frozen,this.emit("lr-calendar-geometry-change",frozen)}paintCalendarFocusOverlays(ctx,week,weekday,cellSize,cs,state2){const date=this.calendarDateAt(week,weekday),x=this.columnXFor(week),y=this.rowYFor(weekday);state2==="annotation"&&this.cachedCalendarCellsByDate.has(date)&&this.cachedCalendarAnnotationDates.has(date)&&this.strokeCellState(ctx,x,y,cellSize,"annotation",this.annotationColor(cs)),state2==="selected"&&(this.multiple||this.cachedCalendarCellsByDate.has(date))&&this.isSelectedPos({week,weekday,date})&&this.strokeCellState(ctx,x,y,cellSize,"selected",this.selectedColor(cs)),state2==="focus"&&this.focusedCell&&"week"in this.focusedCell&&this.focusedCell.week===week&&this.focusedCell.weekday===weekday&&this.strokeCellState(ctx,x,y,cellSize,"focus",this.focusRingColor(cs))}repaintCalendarFocusCell(pos){if(!pos||!this.canvas)return;const{weekCount,firstWeekStart}=this.cachedCalendarGrid;if(pos.week<0||pos.week>=weekCount||pos.weekday<0||pos.weekday>=7)return;const cellSize=this.calendarCellSize(),x=this.columnXFor(pos.week),y=this.rowYFor(pos.weekday),ctx=this.canvas.getContext("2d");if(!ctx)return;const cs=this.ownerDocument.defaultView?.getComputedStyle(this);if(!cs)return;const{left,top,width,height,radius}=this.focusRepaintBounds(ctx,x,y,cellSize),firstWeek=Math.max(0,pos.week-radius),lastWeek=Math.min(weekCount-1,pos.week+radius),firstDay=Math.max(0,pos.weekday-radius),lastDay=Math.min(6,pos.weekday+radius),ramp=this.colorRamp(normalizeBucketCount(this.bucketCount),cs).colors,noData=this.noDataFill(cs);ctx.save();try{ctx.beginPath(),ctx.rect(left,top,width,height),ctx.clip(),ctx.clearRect(left,top,width,height);for(let week=firstWeek;week<=lastWeek;week++)for(let day=firstDay;day<=lastDay;day++)this.paintCalendarCell(ctx,week,day,cellSize,cs,ramp,noData);for(const state2 of["annotation","selected","focus"])for(let week=firstWeek;week<=lastWeek;week++)for(let day=firstDay;day<=lastDay;day++)this.paintCalendarFocusOverlays(ctx,week,day,cellSize,cs,state2);this.paintCalendarAxisLabels(ctx,cellSize,cs,firstWeekStart,this.cachedCalendarGrid.monthLabels)}finally{ctx.restore()}}drawMatrix(){if(!this.canvas)return;const rows=this.matrixRowLabels.length,cols=this.matrixColLabels.length;if(this.rowLabelWidth==="auto"||this.colLabelHeight==="auto"){const measureStyle=getComputedStyle(this);this.rowLabelWidth==="auto"&&(this.resolvedRowLabelWidth=this.measureRowLabelWidth(measureStyle)),this.colLabelHeight==="auto"&&(this.resolvedColLabelHeight=this.measureColLabelHeight(measureStyle))}const padLeft=this.matrixPadLeft,padTop=this.matrixPadTop,cellSize=this.matrixCellSize(cols),shape=this.matrixCellShape(cellSize),dimensions=shape.custom?{cellWidth:shape.w,cellHeight:shape.h,cellRadius:shape.radius}:{},previous=this.lastPaintedMatrixGeometry,geometry=previous&&previous.padLeft===padLeft&&previous.padTop===padTop&&previous.cellSize===cellSize&&previous.cellWidth===dimensions.cellWidth&&previous.cellHeight===dimensions.cellHeight&&previous.cellRadius===dimensions.cellRadius?previous:Object.freeze({padLeft,padTop,cellSize,...dimensions});this.lastPaintedMatrixGeometry=geometry;const geometryChanged=geometry!==previous;geometryChanged&&this.emit("lr-matrix-geometry-change",geometry);const w=padLeft+cols*cellSize,h=padTop+rows*cellSize,dpr=this.ownerDocument.defaultView?.devicePixelRatio||1;this.canvas.width=w*dpr,this.canvas.height=h*dpr,this.canvas.style.width=`${w}px`,this.canvas.style.height=`${h}px`;const ctx=this.canvas.getContext("2d");if(!ctx)return;ctx.scale(dpr,dpr),ctx.clearRect(0,0,w,h);const cs=this.ownerDocument.defaultView?.getComputedStyle(this);if(!cs)return;const bounds=this.cachedValueRange,lo=bounds?bounds[0]:0,hi=bounds?bounds[1]:1,rampData=this.colorRamp(RAMP_STEPS,cs),ramp=rampData.colors,{loRgb,hiRgb}=rampData,noDataFill=this.noDataFill(cs);this.canvasColorCache.clear();for(let r=0;r<rows;r++)for(let c=0;c<cols;c++){const v=this.matrixValues[r]?.[c]??Number.NaN,x=padLeft+c*cellSize,y=padTop+r*cellSize,override=this.cellColor?.({row:r,col:c},v);if(override!=null)ctx.fillStyle=this.resolveCanvasColor(override,cs);else if(this.isNoData(v))ctx.fillStyle=noDataFill;else if(this.scale==="sqrt"){const step=sqrtStep(v,hi,ramp.length);ctx.fillStyle=step<0?noDataFill:ramp[step]}else if(this.cachedColorSteps.length>=2){const step=this.rampBucket(v,lo,hi,ramp.length);ctx.fillStyle=ramp[step]}else{const t=this.rampAlpha(v,lo,hi);ctx.fillStyle=mixRgb(loRgb,hiRgb,t)}this.fillMatrixCell(ctx,x,y,shape)}if(this.cachedAnnotations.length)for(const ann of this.cachedAnnotations){if(ann.row==null||ann.col==null||ann.row<0||ann.row>=rows||ann.col<0||ann.col>=cols)continue;const x=padLeft+ann.col*cellSize,y=padTop+ann.row*cellSize;this.strokeCellState(ctx,x,y,cellSize,"annotation",this.annotationColor(cs))}for(const selected of this.selectedPaintPositions()){if(!("row"in selected))continue;const{row,col}=selected;if(row>=0&&row<rows&&col>=0&&col<cols){const x=padLeft+col*cellSize,y=padTop+row*cellSize;this.strokeCellState(ctx,x,y,cellSize,"selected",this.selectedColor(cs))}}if(this.focusedCell&&"row"in this.focusedCell){const{row,col}=this.focusedCell;if(row<rows&&col<cols){const x=padLeft+col*cellSize,y=padTop+row*cellSize;this.strokeCellState(ctx,x,y,cellSize,"focus",this.focusRingColor(cs))}}this.paintMatrixRowLabels(ctx,padLeft,padTop,cellSize,cs),this.paintMatrixColLabels(ctx,padLeft,padTop,cellSize,cs),this.paintFrozenLabelBands(padLeft,padTop,cellSize,w,h,dpr,cs),this.canvasHasContent=!0,geometryChanged&&this.accessibleCells&&this.scheduleAfterUpdate(()=>this.requestUpdate(),"heatmap-matrix-accessible-geometry")}paintMatrixRowLabels(ctx,padLeft,padTop,cellSize,cs){ctx.fillStyle=this.labelColor(cs),ctx.font=this.labelFont(cs);const rowLabelSpace=padLeft-ROW_LABEL_INSET*2;this.matrixRowLabels.forEach((label,r)=>{const shown=this.ellipsize(ctx,label,rowLabelSpace);shown&&ctx.fillText(shown,ROW_LABEL_INSET,padTop+r*cellSize+cellSize/2+3)})}paintMatrixColLabels(ctx,padLeft,padTop,cellSize,cs){ctx.fillStyle=this.labelColor(cs),ctx.font=this.labelFont(cs);const colRotation=this.effectiveColLabelRotation,interval=finiteInteger(this.colLabelInterval,1,1);if(colRotation===0){this.matrixColLabels.forEach((label,c)=>{c%interval===0&&ctx.fillText(label,padLeft+c*cellSize+2,padTop-COL_LABEL_INSET)});return}const radians=colRotation*Math.PI/180,previousAlign=ctx.textAlign;ctx.textAlign="right",this.matrixColLabels.forEach((label,c)=>{c%interval===0&&(ctx.save(),ctx.translate(padLeft+c*cellSize+cellSize/2,padTop-COL_LABEL_INSET),ctx.rotate(radians),ctx.fillText(label,0,0),ctx.restore())}),ctx.textAlign=previousAlign}paintFrozenLabelBands(padLeft,padTop,cellSize,width,height,dpr,cs){if(this.effectiveStickyLabels==="none")return;const backdrop=this.stickyLabelBg(cs),rowBand=this.frozenBandCanvas("row-labels");rowBand&&this.paintFrozenBand(rowBand,padLeft,height,dpr,backdrop,bandCtx=>this.paintMatrixRowLabels(bandCtx,padLeft,padTop,cellSize,cs));const colBand=this.frozenBandCanvas("col-labels");colBand&&this.paintFrozenBand(colBand,width,padTop,dpr,backdrop,bandCtx=>this.paintMatrixColLabels(bandCtx,padLeft,padTop,cellSize,cs))}frozenBandCanvas(part){return this.shadowRoot?.querySelector(`[part="${part}"]`)??null}paintFrozenBand(canvas,width,height,dpr,backdrop,paint){canvas.width=width*dpr,canvas.height=height*dpr,canvas.style.width=`${width}px`,canvas.style.height=`${height}px`;const ctx=canvas.getContext("2d");ctx&&(ctx.scale(dpr,dpr),ctx.clearRect(0,0,width,height),ctx.fillStyle=backdrop,ctx.fillRect(0,0,width,height),paint(ctx))}hitTest(x,y){return this.effectiveMode==="calendar"?this.hitTestCalendar(x,y):this.hitTestMatrix(x,y)}matrixNavigationGeometry(rows,cols){const cellSize=this.matrixCellSize(cols),shape=this.matrixCellShape(cellSize);return{rows,cols,padLeft:this.matrixPadLeft,padTop:this.matrixPadTop,cellSize,cellWidth:shape.w,cellHeight:shape.h,customShape:shape.custom}}calendarNavigationGeometry(){const cellSize=this.calendarCellSize(),columnPositions=this.calendarColumnPositions(),rowPositions=this.calendarRowPositions();return{weekCount:this.cachedCalendarGrid.weekCount,cellSize,columnPositions,rowPositions,padLeft:this.calendarPadLeft,padTop:CAL_LABEL_H}}hitTestMatrix(x,y){const rows=this.matrixRowLabels.length,cols=this.matrixColLabels.length;return rows===0||cols===0?null:hitTestMatrixGrid(x,y,this.matrixNavigationGeometry(rows,cols),pos=>this.isCellInteractive(pos))}firstInteractiveMatrixCell(rows,cols){return findFirstInteractiveMatrixCell(rows,cols,pos=>this.isCellInteractive(pos))}nextInteractiveMatrixCell(row,col,dRow,dCol,rows,cols){return findNextInteractiveMatrixCell(row,col,dRow,dCol,rows,cols,pos=>this.isCellInteractive(pos))}firstInteractiveCalendarCell(weekCount){return findFirstInteractiveCalendarCell(weekCount,(week,weekday)=>this.calendarPos(week,weekday),pos=>this.isCellInteractive(pos))}nextInteractiveCalendarCell(week,weekday,dWeek,dWeekday,weekCount){return findNextInteractiveCalendarCell(week,weekday,dWeek,dWeekday,weekCount,(nextWeek,nextWeekday)=>this.calendarPos(nextWeek,nextWeekday),pos=>this.isCellInteractive(pos))}hitTestCalendar(x,y){const weekCount=this.cachedCalendarGrid.weekCount;if(weekCount===0)return null;const columnPositions=this.calendarColumnPositions();return hitTestCalendarGrid(x,y,weekCount,columnPositions,()=>this.calendarCellSize(),()=>this.calendarRowPositions(),(week,weekday)=>this.calendarPos(week,weekday),pos=>this.isCellInteractive(pos))}calendarCellAt(pos){return readCalendarCell(pos.week,pos.weekday,this.cachedCalendarCellsByPos,this.cachedCalendarDateByPos,this.cachedCalendarGrid.firstWeekStart,this.signedDomain)}calendarValueAt(week,weekday){return readCalendarValue(week,weekday,this.cachedCalendarCellsByPos,this.signedDomain)}calendarDateAt(week,weekday){return readCalendarDate(week,weekday,this.cachedCalendarDateByPos,this.cachedCalendarGrid.firstWeekStart)}calendarPos(week,weekday){return{week,weekday,date:this.calendarDateAt(week,weekday)}}cellRect(pos){return"week"in pos?calendarCellRect(pos.week,pos.weekday,this.calendarNavigationGeometry()):matrixCellRect(pos,this.matrixNavigationGeometry(this.matrixRowLabels.length,this.matrixColLabels.length))}accessibleCellRect(pos){return"week"in pos||!this.lastPaintedMatrixGeometry?this.cellRect(pos):accessibleMatrixCellRect(pos,this.lastPaintedMatrixGeometry)}defaultCellText(pos){return"week"in pos?this.calendarCellText(pos):this.matrixCellText(pos)}matrixCellText(pos){const rowLabel=this.matrixRowLabels[pos.row]??this.localize("heatmapDefaultRowLabel",void 0,{n:this.formatCount(pos.row+1)}),colLabel=this.matrixColLabels[pos.col]??this.localize("heatmapDefaultColLabel",void 0,{n:this.formatCount(pos.col+1)}),v=this.matrixValues[pos.row]?.[pos.col],valueText=v==null||this.isNoData(v)?this.localize("heatmapNoDataValue"):this.formatNumericValue(v);return this.localize("heatmapMatrixCellLabel",void 0,{row:rowLabel,col:colLabel,value:valueText})}calendarCellText(pos){const{date,value}=this.calendarCellAt(pos),label=parseIsoDate(date).toLocaleString(this.effectiveLocale||void 0,{month:"short",day:"numeric",timeZone:"UTC"}),valueText=this.isNoData(value)?this.localize("heatmapNoDataValue"):this.formatNumericValue(value);return this.localize("heatmapCalendarCellLabel",void 0,{date:label,value:valueText})}valueAt(pos){return"week"in pos?this.calendarCellAt(pos).value:this.matrixValues[pos.row]?.[pos.col]??-1}resolveCellText(pos){return this.cellText?this.cellText(pos,this.valueAt(pos)):this.defaultCellText(pos)}isCellInteractive(pos){return this.cellInteractive?.(pos,this.valueAt(pos))??!0}announce(pos,isSelectedOverride){const text=this.resolveCellText(pos),announcement=isSelectedOverride??this.isSelectedPos(pos)?this.localize("heatmapSelectedCellLabel",void 0,{cell:text}):text;this.liveText=announcement,this.announcementSink?.announce(announcement)}emitCellClick(pos,source="pointer",select=!0){if(!this.isCellInteractive(pos))return;this.multiple&&select&&(this.selectionAnchor=pos,this.selectionRangeBase=void 0,this.toggleSelectionPositions([pos],source));let detail;if("week"in pos){const{date,value}=this.calendarCellAt(pos);detail={date,value}}else{const value=this.matrixValues[pos.row]?.[pos.col]??-1;detail={row:pos.row,col:pos.col,value}}this.emit("lr-cell-activate",{...detail})}get currentSelectedPositions(){return this.selectionPreview??this.selectedPositions}selectedPaintPositions(){if(this.multiple)return[...this.currentSelectedPositions.values()];const selected=this.selectedCell;if(!selected)return[];if(this.effectiveMode==="calendar"){const match=selected.date?this.cachedCalendarCellsByDate.get(selected.date):void 0;return match?[match]:[]}return selected.row!=null&&selected.col!=null?[{row:selected.row,col:selected.col}]:[]}rebuildSelectedPositions(){const positions=new Map,dates=this.effectiveMode==="calendar"?new Map(this.cachedAccessiblePositions.map(pos=>[this.accessibleCellIdentity(pos),pos])):void 0,input=Array.isArray(this.selectedCells)?this.selectedCells:[];for(const cell of input.slice(0,MAX_HEATMAP_CELLS)){if(!cell||typeof cell!="object")continue;const pos=dates?typeof cell.date=="string"?dates.get(cell.date):void 0:Number.isInteger(cell.row)&&Number.isInteger(cell.col)?this.cachedAccessiblePositionsByKey.get(`matrix-${cell.row}-${cell.col}`):void 0;pos&&positions.set(this.accessibleCellKey(pos),pos)}this.selectedPositions=positions}selectionCoordinates(pos){return"week"in pos?{row:pos.weekday,col:pos.week}:pos}proposeSelection(positions,source){if(positions.size===this.selectedPositions.size&&[...positions.keys()].every(key=>this.selectedPositions.has(key)))return;this.proposedSelectionKeys=new Set(positions.keys());const selectedCells=[...positions.values()].sort((a,b)=>{const first=this.selectionCoordinates(a),second=this.selectionCoordinates(b);return first.row-second.row||first.col-second.col}).map(pos=>"week"in pos?{date:pos.date}:{row:pos.row,col:pos.col});this.emit("lr-selection-change",{selectedCells,source})}toggleSelectionPositions(positions,source){if(!this.multiple||positions.length===0)return;const next=new Map(this.selectedPositions),remove=positions.every(pos=>next.has(this.accessibleCellKey(pos)));for(const pos of positions){const key=this.accessibleCellKey(pos);remove?next.delete(key):next.set(key,pos)}this.proposeSelection(next,source)}toggleSelectionAxis(index,row){!this.multiple||!Number.isInteger(index)||index<0||(this.cancelSelectionGesture(),this.selectionRangeBase=void 0,this.toggleSelectionPositions(this.cachedAccessiblePositions.filter(pos=>{const coordinates=this.selectionCoordinates(pos);return(row?coordinates.row:coordinates.col)===index}),row?"row":"column"))}selectionKeyDown(event,pos){if(!this.multiple)return!1;if(event.key==="Escape"&&this.selectionGesture)return event.preventDefault(),this.cancelSelectionGesture(),!0;if(event.key!==" "||!pos||!(event.shiftKey||event.ctrlKey||event.metaKey))return!1;event.preventDefault();const coordinates=this.selectionCoordinates(pos);return event.ctrlKey||event.metaKey?this.toggleColumnSelection(coordinates.col):this.toggleRowSelection(coordinates.row),!0}extendSelection(previous,next,range){if(!this.multiple)return;if(!range){this.selectionAnchor=next,this.selectionRangeBase=void 0;return}this.selectionAnchor??=previous??next,this.selectionRangeBase??=new Map(this.selectedPositions);const from=this.selectionCoordinates(this.selectionAnchor),to=this.selectionCoordinates(next),selected=new Map(this.selectionRangeBase);for(const pos of this.cachedAccessiblePositions){const{row,col}=this.selectionCoordinates(pos);row>=Math.min(from.row,to.row)&&row<=Math.max(from.row,to.row)&&col>=Math.min(from.col,to.col)&&col<=Math.max(from.col,to.col)&&selected.set(this.accessibleCellKey(pos),pos)}return this.proposeSelection(selected,"keyboard"),new Set(selected.keys())}selectionPointerPosition(event){if(!this.canvas)return null;const rect=this.canvas.getBoundingClientRect();return this.hitTest(event.clientX-rect.left,event.clientY-rect.top)}paintSelectionTo(pos){const gesture=this.selectionGesture;if(!gesture)return;this.samePos(pos,gesture.previous)||(gesture.moved=!0);const from=this.selectionCoordinates(gesture.previous),to=this.selectionCoordinates(pos),steps=Math.max(Math.abs(to.row-from.row),Math.abs(to.col-from.col),1);for(let step=0;step<=steps;step++){const row=Math.round(from.row+(to.row-from.row)*step/steps),col=Math.round(from.col+(to.col-from.col)*step/steps),key=this.effectiveMode==="calendar"?`calendar-${col}-${row}`:`matrix-${row}-${col}`,candidate=this.cachedAccessiblePositionsByKey.get(key);candidate&&(gesture.selecting?gesture.cells.set(key,candidate):gesture.cells.delete(key))}gesture.previous=pos,this.selectionPreview=new Map(gesture.cells)}cancelSelectionGesture(){const gesture=this.selectionGesture;if(this.selectionGesture=void 0,this.selectionPreview=void 0,!!gesture){this.suppressSelectionClick=!0;try{gesture.target.hasPointerCapture(gesture.pointerId)&&gesture.target.releasePointerCapture(gesture.pointerId)}catch{}}}consumeSelectionClick(event){return!this.suppressSelectionClick||event.detail===0?!1:(this.suppressSelectionClick=!1,!0)}get gridScrollport(){return this.shadowRoot?.querySelector('[part="grid"]')??null}measureTooltip(){if(!this.gridScrollport)return;const tooltip=this.shadowRoot?.querySelector('[part="tooltip"]');if(!tooltip||tooltip.hidden)return;const view=this.ownerDocument.defaultView,gap=view?Math.abs(finiteNumber(Number.parseFloat(view.getComputedStyle(tooltip).marginBlockStart),0)):0,inline=tooltip.offsetWidth,block=tooltip.offsetHeight+gap;inline===this.tooltipSize.inline&&block===this.tooltipSize.block||(this.tooltipSize={inline,block},this.requestUpdate())}tooltipAnchor(pos){const rect=this.cellRect(pos),center=rect.x+rect.w/2,port=this.gridScrollport;if(!port)return{style:{left:`${center}px`,top:`${rect.y}px`},below:!1};const{inline,block}=this.tooltipSize,windowStart=port.scrollLeft+(this.freezesRowLabels?this.matrixPadLeft:0),windowEnd=port.scrollLeft+port.clientWidth,windowTop=port.scrollTop+(this.freezesColLabels?this.matrixPadTop:0),windowBottom=port.scrollTop+port.clientHeight,below=rect.y-block<windowTop&&rect.y+rect.h+block<=windowBottom;return{style:{left:`${Math.max(windowStart+inline/2,Math.min(center,windowEnd-inline/2))}px`,top:`${below?rect.y+rect.h:rect.y}px`},below}}scrollCellIntoView(pos){const port=this.gridScrollport;if(!port)return;const rect=this.cellRect(pos),bandInline=this.freezesRowLabels?this.matrixPadLeft:0,bandBlock=this.freezesColLabels?this.matrixPadTop:0,left=Math.min(Math.max(port.scrollLeft,rect.x+rect.w-port.clientWidth),rect.x-bandInline),top=Math.min(Math.max(port.scrollTop,rect.y+rect.h-port.clientHeight),rect.y-bandBlock);left!==port.scrollLeft&&(port.scrollLeft=left),top!==port.scrollTop&&(port.scrollTop=top)}samePos(a,b){return a===b?!0:!a||!b?!1:"week"in a&&"week"in b?a.week===b.week&&a.weekday===b.weekday:"row"in a&&"row"in b?a.row===b.row&&a.col===b.col:!1}onMatrixKeyDown(e){const rows=this.matrixRowLabels.length,cols=this.matrixColLabels.length;if(rows===0||cols===0)return;if(e.key==="Enter"||e.key===" "){e.preventDefault(),this.focusedCell&&this.emitCellClick(this.focusedCell,"keyboard");return}if(!ARROW_KEYS.has(e.key))return;if(e.preventDefault(),!this.focusedCell||!("row"in this.focusedCell)){const next2=this.firstInteractiveMatrixCell(rows,cols);if(!next2)return;this.focusedCell=next2,this.scrollCellIntoView(next2);return}const{row,col}=this.focusedCell;let dRow=0,dCol=0;e.key==="ArrowUp"?dRow=-1:e.key==="ArrowDown"?dRow=1:e.key==="ArrowLeft"?dCol=-1:e.key==="ArrowRight"&&(dCol=1);const next=this.nextInteractiveMatrixCell(row,col,dRow,dCol,rows,cols);this.focusedCell=next,this.scrollCellIntoView(next)}onCalendarKeyDown(e){const{weekCount}=this.cachedCalendarGrid;if(weekCount===0)return;if(e.key==="Enter"||e.key===" "){e.preventDefault(),this.focusedCell&&this.emitCellClick(this.focusedCell,"keyboard");return}if(!ARROW_KEYS.has(e.key))return;if(e.preventDefault(),!this.focusedCell||!("week"in this.focusedCell)){const next2=this.firstInteractiveCalendarCell(weekCount);if(!next2)return;this.focusedCell=next2;return}const{week,weekday}=this.focusedCell;let dWeek=0,dWeekday=0;e.key==="ArrowUp"?dWeekday=-1:e.key==="ArrowDown"?dWeekday=1:e.key==="ArrowLeft"?dWeek=-1:e.key==="ArrowRight"&&(dWeek=1);const next=this.nextInteractiveCalendarCell(week,weekday,dWeek,dWeekday,weekCount);this.focusedCell=next}resolveCanvasColor(value,cs){const cached=this.canvasColorCache.get(value);if(cached!==void 0)return cached;const fallback=this.noDataFill(cs);let candidate=value;if(value.includes("var(")){if(this.colorProbe||(this.colorProbe=this.ownerDocument.createElement("span"),this.colorProbe.style.cssText="position:absolute;width:0;height:0;overflow:hidden;visibility:hidden;pointer-events:none;",this.shadowRoot.appendChild(this.colorProbe)),this.colorProbe.style.color="",this.colorProbe.style.color=value,!this.colorProbe.style.color)return this.canvasColorCache.set(value,fallback),fallback;candidate=this.ownerDocument.defaultView?.getComputedStyle(this.colorProbe).color||fallback}const ctx=getScratchCtx(this.ownerDocument);if(!ctx)return fallback;ctx.fillStyle="rgb(1, 2, 3)";const firstSentinel=ctx.fillStyle;ctx.fillStyle=candidate;let resolved=ctx.fillStyle;if(resolved===firstSentinel){ctx.fillStyle="rgb(4, 5, 6)";const secondSentinel=ctx.fillStyle;ctx.fillStyle=candidate,resolved=ctx.fillStyle,resolved===secondSentinel&&(resolved=fallback)}return this.canvasColorCache.set(value,resolved),resolved}rebuildAccessiblePositions(){const positions=[];if(this.effectiveMode==="calendar"){const{weekCount}=this.cachedCalendarGrid;for(let week=0;week<weekCount;week++)for(let weekday=0;weekday<7;weekday++){const pos=this.calendarPos(week,weekday);this.isCellInteractive(pos)&&positions.push(pos)}}else for(let row=0;row<this.matrixRowLabels.length;row++)for(let col=0;col<this.matrixColLabels.length;col++){const pos={row,col};this.isCellInteractive(pos)&&positions.push(pos)}this.cachedAccessiblePositions=positions,this.cachedAccessiblePositionsByKey=new Map(positions.map(position=>[this.accessibleCellKey(position),position])),this.cachedAccessiblePositionIndexByKey=new Map(positions.map((position,index)=>[this.accessibleCellKey(position),index]))}accessibleCellPositions(){return this.cachedAccessiblePositions}accessibleCellKey(pos){return"week"in pos?`calendar-${pos.week}-${pos.weekday}`:`matrix-${pos.row}-${pos.col}`}accessibleCellIdentity(pos){return"week"in pos?pos.date:this.accessibleCellKey(pos)}accessibleCellAtKey(key){return this.cachedAccessiblePositionsByKey.get(key)??null}focusAccessibleCell(pos){pos&&this.updateComplete.then(()=>{[...this.shadowRoot?.querySelectorAll('[part="cell"]')??[]].find(candidate=>candidate.dataset.cellKey===this.accessibleCellKey(pos))?.focus()})}renderAccessibleCells(){if(!this.accessibleCells)return html``;const positions=this.accessibleCellPositions(),tabStop=this.focusedCell??positions[0]??null,focusIndex=tabStop?this.cachedAccessiblePositionIndexByKey.get(this.accessibleCellKey(tabStop))??0:0,start=Math.max(0,Math.min(Math.max(0,positions.length-MAX_ACCESSIBLE_HEATMAP_CELLS),focusIndex-Math.floor(MAX_ACCESSIBLE_HEATMAP_CELLS/2))),renderedPositions=positions.slice(start,start+MAX_ACCESSIBLE_HEATMAP_CELLS),renderedRows=new Map;for(const pos of renderedPositions){const rowIndex="week"in pos?pos.weekday+1:pos.row+1,row=renderedRows.get(rowIndex);row?row.push(pos):renderedRows.set(rowIndex,[pos])}const rowCount=this.effectiveMode==="calendar"?7:this.matrixRowLabels.length,colCount=this.effectiveMode==="calendar"?this.cachedCalendarGrid.weekCount:this.matrixColLabels.length;return html`
3
+ `)}get matrixPadTop(){if(this.colLabelHeight==="auto")return this.resolvedColLabelHeight;if(typeof this.colLabelHeight!="number")return PAD_TOP;const resolved=finiteNumber(this.colLabelHeight,PAD_TOP);return resolved>=0?resolved:PAD_TOP}measureColLabelHeight(cs){const labels=this.matrixColLabels;if(labels.length===0)return PAD_TOP;const ctx=getScratchCtx(this.ownerDocument);if(!ctx)return PAD_TOP;ctx.font=this.labelFont(cs);let widest=0;const interval=finiteInteger(this.colLabelInterval,1,1);for(let index=0;index<labels.length;index+=interval)widest=Math.max(widest,ctx.measureText(labels[index]).width);const radians=this.effectiveColLabelRotation*Math.PI/180,projected=widest*Math.sin(radians);return Math.max(PAD_TOP,Math.min(Math.ceil(projected)+COL_LABEL_INSET,MAX_COL_LABEL_HEIGHT))}measureRowLabelWidth(cs){const labels=this.matrixRowLabels;if(labels.length===0)return PAD_LEFT;const ctx=getScratchCtx(this.ownerDocument);if(!ctx)return PAD_LEFT;ctx.font=this.labelFont(cs);let widest=0;for(const label of labels)widest=Math.max(widest,ctx.measureText(label).width);const hostWidth=this.clientWidth||0,cap=hostWidth>0?hostWidth*MAX_ROW_LABEL_FRACTION:Number.POSITIVE_INFINITY;return Math.min(Math.max(PAD_LEFT,Math.ceil(widest)+ROW_LABEL_INSET*2),cap)}ellipsize(ctx,label,maxWidth){if(maxWidth<=0)return"";if(ctx.measureText(label).width<=maxWidth)return label;const characters=[...label];let kept=characters.length-1;for(;kept>0;){const candidate=`${characters.slice(0,kept).join("")}…`;if(ctx.measureText(candidate).width<=maxWidth)return candidate;kept-=1}return ctx.measureText("…").width<=maxWidth?"…":""}get calendarPadLeft(){const requested=this.calendarWeekdayLabelWidth;return requested==="auto"?this.resolvedCalendarWeekdayLabelWidth:requested??CAL_PAD_LEFT}measureCalendarWeekdayLabelWidth(cs,firstWeekStart){const ctx=getScratchCtx(this.ownerDocument);if(!ctx)return CAL_PAD_LEFT;ctx.font=this.labelFont(cs);let widest=0;for(const label of this.weekdayLabels(firstWeekStart))label&&(widest=Math.max(widest,ctx.measureText(label).width));const hostWidth=this.clientWidth||0,cap=hostWidth>0?Math.max(CAL_PAD_LEFT,hostWidth*MAX_ROW_LABEL_FRACTION):Number.POSITIVE_INFINITY;return Math.min(Math.max(CAL_PAD_LEFT,Math.ceil(widest)+CAL_WEEKDAY_LABEL_INSET*2),cap)}get matrixRowLabels(){return this.cachedMatrixData.rowLabels}get matrixColLabels(){return this.cachedMatrixData.colLabels}get matrixValues(){return this.cachedMatrixData.values}get calendarDays(){return this.data.kind==="calendar"?this.data.days:[]}get calendarData(){return this.data.kind==="calendar"?this.data:void 0}get cellSize(){return this._cellSize??(this.effectiveMode==="calendar"?CAL_CELL:DEFAULT_MATRIX_CELL_SIZE)}set cellSize(value){const oldValue=this._cellSize;this._cellSize=value==null?void 0:finiteRange(value,this.effectiveMode==="calendar"?CAL_CELL:DEFAULT_MATRIX_CELL_SIZE,1),this.requestUpdate("cellSize",oldValue)}get rowHeight(){return this._rowHeight}set rowHeight(value){const oldValue=this._rowHeight;this._rowHeight=value==null||!Number.isFinite(value)?void 0:finiteRange(value,1,1,MAX_MATRIX_ROW_HEIGHT),this.requestUpdate("rowHeight",oldValue)}get signedDomain(){return this.domain!==void 0||this.midpoint!==void 0}rampAlpha(value,lo,hi){const anchor=this.midpoint;return anchor===void 0?linearAlpha(value,lo,hi):midpointAlpha(value,lo,hi,anchor)}rampBucket(value,lo,hi,steps){const anchor=this.midpoint;return anchor===void 0?linearBucket(value,lo,hi,steps):midpointBucket(value,lo,hi,anchor,steps)}isNoData(value){return Number.isFinite(value)?value<0&&!this.signedDomain:!0}get maxCellSize(){return this._maxCellSize}set maxCellSize(value){const oldValue=this._maxCellSize;this._maxCellSize=normalizeCellSizeClamp(value),this.requestUpdate("maxCellSize",oldValue)}get minCellSize(){return this._minCellSize}set minCellSize(value){const oldValue=this._minCellSize;this._minCellSize=normalizeCellSizeClamp(value),this.requestUpdate("minCellSize",oldValue)}get normalizedFirstDayOfWeek(){return(finiteInteger(this.calendarData?.firstDayOfWeek??0,0)%7+7)%7}get bucketCount(){return this._bucketCount}set bucketCount(value){const oldValue=this._bucketCount;this._bucketCount=normalizeBucketCount(value),this.requestUpdate("bucketCount",oldValue)}toggleRowSelection(row){this.toggleSelectionAxis(row,!0)}toggleColumnSelection(col){this.toggleSelectionAxis(col,!1)}get calendarWeekdayLabelText(){return this.calendarData?.weekdayLabelText}get calendarWeekdayLabelWidth(){const value=this.calendarData?.weekdayLabelWidth;if(value==="auto")return value;if(typeof value!="number")return;const resolved=finiteNumber(value,CAL_PAD_LEFT);return resolved>=0?resolved:void 0}get calendarMonthLabelText(){return this.calendarData?.monthLabelText}get calendarColumnX(){return this.calendarData?.columnX}get calendarRowY(){return this.calendarData?.rowY}constructor(){super(),this.data=DEFAULT_MATRIX_DATA,this._stickyLabels="none",this.resolvedColLabelHeight=PAD_TOP,this.resolvedRowLabelWidth=PAD_LEFT,this.resolvedCalendarWeekdayLabelWidth=CAL_PAD_LEFT,this.withoutLegend=!1,this.scale="linear",this.cellGapX=1,this.cellGapY=1,this.cellRadius=0,this.colLabelInterval=1,this.fitToWidth=!1,this._bucketCount=DEFAULT_BUCKET_COUNT,this.annotations=[],this.selectedCell=null,this.multiple=!1,this.selectedCells=[],this.accessibleCells=!1,this.cachedValueRange=null,this.cachedMatrixData={rowLabels:[],colLabels:[],values:[],truncated:!1},this.cachedCalendarGrid=buildCalendarGrid(this.calendarDays),this.cachedCalendarSortedValues=[],this.cachedCalendarCellsByPos=new Map,this.cachedCalendarCellsByDate=new Map,this.cachedAnnotations=[],this.cachedLegendStops=[],this.cachedColorSteps=[],this.cachedCalendarAnnotationDates=new Set,this.cachedMatrixAnnotationPositions=new Set,this.decorationProjectionTruncated=!1,this.cachedCalendarDateByPos=[],this.cachedAccessiblePositions=[],this.cachedAccessiblePositionsByKey=new Map,this.cachedAccessiblePositionIndexByKey=new Map,this.cachedRamp=null,this.canvasHasContent=!1,this.canvasVisible=!0,this.drawDirty=!1,this.hoverCell=null,this.focusedCell=null,this.liveText="",this.accessibleTargetSizePx=DEFAULT_ACCESSIBLE_TARGET_SIZE_PX,this.restoringAccessibleFocus=!1,this.accessibleFocusGeneration=0,this.authorRole=null,this.authorAriaLabel=null,this.generatedAriaLabel="",this.syncingGeneratedSemantics=!1,this.hasSyncedDescribedByElements=!1,this.onDprChange=()=>{this.watchDpr(),this.requestDraw()},this.scheduleDraw=()=>{if(this.drawFrameRequest)return;const owner=this.ownerDocument.defaultView;if(!owner||!this.isConnected)return;const request={owner,handle:0};request.handle=owner.requestAnimationFrame(()=>{this.drawFrameRequest===request&&(this.drawFrameRequest=void 0,this.isConnected&&this.ownerDocument.defaultView===owner&&this.requestDraw())}),this.drawFrameRequest=request},this.selectedPositions=new Map,this.selectionAnchor=null,this.suppressSelectionClick=!1,this.onSelectionPointerDown=event=>{if(!this.multiple||event.button!==0||!event.isPrimary||this.selectionGesture)return;const pos=this.selectionPointerPosition(event);if(!pos)return;event.preventDefault(),this.suppressSelectionClick=!1,this.selectionRangeBase=void 0,this.selectionAnchor=pos,this.focusedCell=pos,this.accessibleCells?this.focusAccessibleCell(pos):this.canvas?.focus();const target=event.currentTarget;this.selectionGesture={pointerId:event.pointerId,target,start:pos,previous:pos,moved:!1,selecting:!this.selectedPositions.has(this.accessibleCellKey(pos)),cells:new Map(this.selectedPositions)};try{target.setPointerCapture(event.pointerId)}catch{}this.paintSelectionTo(pos)},this.onSelectionPointerMove=event=>{if(this.selectionGesture?.pointerId!==event.pointerId)return;const pos=this.selectionPointerPosition(event);pos&&!this.samePos(pos,this.selectionGesture.previous)&&this.paintSelectionTo(pos)},this.onSelectionPointerUp=event=>{const gesture=this.selectionGesture;if(!gesture||gesture.pointerId!==event.pointerId)return;const pos=this.selectionPointerPosition(event);pos&&this.paintSelectionTo(pos),this.cancelSelectionGesture(),this.proposeSelection(gesture.cells,"pointer"),gesture.moved||this.emitCellClick(gesture.start,"pointer",!1)},this.onSelectionPointerCancel=event=>{this.selectionGesture?.pointerId===event.pointerId&&this.cancelSelectionGesture()},this.tooltipSize={inline:0,block:0},this.onPointerMove=e=>{const next=this.hitTest(e.offsetX,e.offsetY);this.samePos(this.hoverCell,next)||(this.hoverCell=next)},this.onPointerLeave=()=>{this.hoverCell=null},this.onCanvasClick=e=>{if(this.consumeSelectionClick(e))return;const pos=this.hitTest(e.offsetX,e.offsetY);pos&&(this.focusedCell=pos,this.announce(pos),this.emitCellClick(pos))},this.onKeyDown=e=>{if(this.selectionKeyDown(e,this.focusedCell))return;const previous=this.focusedCell;if(this.effectiveMode==="calendar"?this.onCalendarKeyDown(e):this.onMatrixKeyDown(e),ARROW_KEYS.has(e.key)&&this.focusedCell){const proposedKeys=this.extendSelection(previous,this.focusedCell,e.shiftKey);this.announce(this.focusedCell,proposedKeys?.has(this.accessibleCellKey(this.focusedCell)))}},this.canvasColorCache=new Map,this.onAccessibleCellFocus=e=>{if(this.restoringAccessibleFocus)return;const key=e.currentTarget.dataset.cellKey,pos=key?this.accessibleCellAtKey(key):null;pos&&(this.samePos(pos,this.focusedCell)||(this.selectionAnchor=pos,this.selectionRangeBase=void 0),this.focusedCell=pos,this.announce(pos))},this.onAccessibleCellClick=e=>{if(this.consumeSelectionClick(e))return;const key=e.currentTarget.dataset.cellKey,pos=key?this.accessibleCellAtKey(key):null;pos&&(this.focusedCell=pos,this.announce(pos),this.emitCellClick(pos,e.detail===0?"keyboard":"pointer"))},this.onAccessibleCellKeyDown=e=>{const key=e.currentTarget.dataset.cellKey,pos=key?this.accessibleCellAtKey(key):null;pos&&(this.selectionKeyDown(e,pos)||ARROW_KEYS.has(e.key)&&(e.preventDefault(),this.focusedCell=pos,this.onKeyDown(e),this.focusAccessibleCell(this.focusedCell)))},new ThemeWatcher(this,()=>this.refreshTheme()),this.calendarSpacingTrackingArmed=!0}requestUpdate(name,oldValue,options){this.calendarSpacingTrackingArmed&&name!==void 0&&CALENDAR_SPACING_PROPERTIES.has(name)&&(this.explicitCalendarSpacingProperties??=new Set).add(name),super.requestUpdate(name,oldValue,options)}explicitCalendarSpacing(name){if(!this.explicitCalendarSpacingProperties?.has(name))return;const value=this[name];return value??void 0}warnOnLegendRampMismatch(){const rampColors=this.cachedColorSteps.map(color=>sanitizeCssColor(color)??color);if(rampColors.length===0)return;const legendColors=this.cachedLegendStops.filter(stop=>!!stop.color&&stop.partOfRamp!==!1).map(stop=>sanitizeCssColor(stop.color??"")??stop.color??"");legendColors.length===0||legendColors.length===rampColors.length&&legendColors.every((color,index)=>color===rampColors[index])||devWarnOnce("lyra-heatmap-legend-ramp-mismatch",`<${this.localName}>: legendStops describes ${legendColors.length} colour(s) that do not match the ${rampColors.length} colorSteps the cells are painted from, so the legend may misdescribe the ramp. Supply legendStops built from the same array as colorSteps, or omit it to keep the built-in gradient key.`)}attributeChangedCallback(name,oldValue,value){super.attributeChangedCallback(name,oldValue,value),!(oldValue===value||this.syncingGeneratedSemantics)&&(name==="role"&&(this.authorRole=value),name==="aria-label"&&(this.authorAriaLabel=value))}connectedCallback(){super.connectedCallback(),this.syncAnnouncementSink(),this.refreshAccessibleTargetSize();const owner=this.ownerDocument.defaultView,ResizeObserverCtor=owner?.ResizeObserver;if(owner&&ResizeObserverCtor){let observer;observer=new ResizeObserverCtor(()=>{!this.isConnected||this.ownerDocument.defaultView!==owner||this.resizeObserver!==observer||this.scheduleDraw()}),this.resizeObserver=observer,observer.observe(this)}const IntersectionObserverCtor=owner?.IntersectionObserver;if(this.canvasVisible=!0,owner&&IntersectionObserverCtor){let observer;observer=new IntersectionObserverCtor(entries=>{if(!this.isConnected||this.ownerDocument.defaultView!==owner||this.intersectionObserver!==observer)return;const entry=entries.find(candidate=>candidate.target===this);!entry||entry.isIntersecting===this.canvasVisible||(this.canvasVisible=entry.isIntersecting,this.canvasVisible&&this.drawDirty&&this.scheduleDraw())}),this.intersectionObserver=observer,observer.observe(this)}this.cachedRamp=null,this.canvasColorCache.clear(),this.watchDpr()}disconnectedCallback(){super.disconnectedCallback(),this.cancelSelectionGesture(),this.selectionAnchor=null,this.selectionRangeBase=void 0,this.accessibleFocusGeneration++,this.pendingAccessibleFocus=void 0,this.pendingAccessibleFocusOrigin=void 0,this.restoringAccessibleFocus=!1,this.releaseAnnouncementSink(),this.hoverCell=null,this.focusedCell=null,this.liveText="",this.canvasHasContent=!1,this.drawDirty=!0,this.resizeObserver?.disconnect(),this.resizeObserver=void 0,this.intersectionObserver?.disconnect(),this.intersectionObserver=void 0,this.canvasVisible=!0,this.clearDprWatcher(),this.cancelDrawFrame()}releaseAnnouncementSink(){this.announcementSink?.release(),this.announcementSink=void 0}syncAnnouncementSink(){if(!this.isConnected){this.releaseAnnouncementSink();return}this.announcementSink?.element.ownerDocument!==this.ownerDocument&&(this.releaseAnnouncementSink(),this.announcementSink=acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this}))}watchDpr(){this.clearDprWatcher();const owner=this.ownerDocument.defaultView;if(!owner||typeof owner.matchMedia!="function")return;const query2=owner.matchMedia(`(resolution: ${owner.devicePixelRatio}dppx)`),listener=()=>{!this.isConnected||this.ownerDocument.defaultView!==owner||this.dprQuery!==query2||this.onDprChange()};this.dprQuery=query2,this.dprChangeListener=listener,query2.addEventListener("change",listener)}clearDprWatcher(){this.dprQuery&&this.dprChangeListener&&this.dprQuery.removeEventListener("change",this.dprChangeListener),this.dprQuery=void 0,this.dprChangeListener=void 0}willUpdate(changed){super.willUpdate(changed),(changed.has("data")||changed.has("domain")||changed.has("midpoint")||!this.hasUpdated)&&this.rebuildCanonicalMatrixData(),(changed.has("annotations")||changed.has("legendStops")||changed.has("colorSteps")||!this.hasUpdated)&&this.rebuildBoundedDecorations();const accessibleModeChanged=changed.has("accessibleCells")&&this.hasUpdated,collectionChanged=changed.has("data")||changed.has("cellInteractive"),activeRenderedControl=collectionChanged||accessibleModeChanged?activeElementIn(this.shadowRoot):null,activeAccessibleCell=activeRenderedControl?.matches('[part="cell"]')?activeRenderedControl:null,renderedAccessibleCells=activeAccessibleCell?.matches('[part="cell"]')?[...this.shadowRoot?.querySelectorAll('[part="cell"]')??[]]:[],accessibleFocusSnapshot=activeAccessibleCell?.matches('[part="cell"]')?{identity:activeAccessibleCell.dataset.cellIdentity,index:renderedAccessibleCells.indexOf(activeAccessibleCell)}:void 0;if(collectionChanged&&(this.focusedCell=null,this.hoverCell=null,this.liveText=""),changed.has("data")||changed.has("locale")||!this.hasUpdated){this.cachedCalendarGrid=buildCalendarGrid(this.calendarDays,this.normalizedFirstDayOfWeek,this.calendarMonthLabelText,this.effectiveLocale),this.cachedCalendarSortedValues=this.cachedCalendarGrid.cells.map(cell=>cell.value).filter(value=>!this.isNoData(value)).sort((a,b)=>a-b),this.cachedCalendarCellsByPos=new Map(this.cachedCalendarGrid.cells.map(cell=>[`${cell.week}:${cell.weekday}`,cell])),this.cachedCalendarCellsByDate=new Map(this.cachedCalendarGrid.cells.map(cell=>[cell.date,cell]));const{firstWeekStart,weekCount}=this.cachedCalendarGrid;this.cachedCalendarDateByPos=Array.from({length:weekCount*7},(_,index)=>isoDateAtOffset(firstWeekStart,index))}if(changed.has("colorSteps")||changed.has("withoutLegend")||!this.hasUpdated){const colorSteps=this.withoutLegend?[]:this.cachedColorSteps.map(sanitizeCssColor);colorSteps.length>=2&&colorSteps.every(color=>color!==void 0)?this.style.setProperty("--lr-heatmap-color-steps-gradient",`linear-gradient(to right, ${colorSteps.join(", ")})`):this.style.removeProperty("--lr-heatmap-color-steps-gradient")}if((changed.has("data")||changed.has("domain")||changed.has("midpoint")||!this.hasUpdated)&&(this.cachedValueRange=this.computeValueRange()),(collectionChanged||!this.hasUpdated)&&this.rebuildAccessiblePositions(),(collectionChanged||accessibleModeChanged||changed.has("multiple"))&&(this.cancelSelectionGesture(),this.selectionAnchor=null,this.selectionRangeBase=void 0,this.proposedSelectionKeys=void 0),(collectionChanged||changed.has("selectedCells")||changed.has("multiple")||!this.hasUpdated)&&(this.rebuildSelectedPositions(),changed.has("selectedCells")&&this.selectionGesture&&this.cancelSelectionGesture(),changed.has("selectedCells")&&this.selectionRangeBase&&(this.proposedSelectionKeys?.size!==this.selectedPositions.size||[...this.selectedPositions.keys()].some(key=>!this.proposedSelectionKeys?.has(key)))&&(this.selectionAnchor=this.focusedCell,this.selectionRangeBase=void 0)),accessibleFocusSnapshot){const positions=this.accessibleCellPositions(),target=(accessibleFocusSnapshot.identity==null?void 0:positions.find(pos=>this.accessibleCellIdentity(pos)===accessibleFocusSnapshot.identity))??positions[Math.min(Math.max(accessibleFocusSnapshot.index,0),positions.length-1)]??null;this.focusedCell=target,this.liveText=target?this.resolveCellText(target):"",this.pendingAccessibleFocus=target??"base",this.pendingAccessibleFocusOrigin=activeAccessibleCell??void 0,this.restoringAccessibleFocus=!0,this.accessibleFocusGeneration++}if(accessibleModeChanged){const previouslyAccessible=changed.get("accessibleCells")===!0;if(previouslyAccessible&&!this.accessibleCells&&activeAccessibleCell){const key=activeAccessibleCell.dataset.cellKey,target=key?this.accessibleCellAtKey(key):null;target&&(this.focusedCell=target,this.liveText=this.resolveCellText(target)),this.pendingAccessibleFocus="canvas",this.pendingAccessibleFocusOrigin=activeAccessibleCell,this.restoringAccessibleFocus=!0,this.accessibleFocusGeneration++}else if(!previouslyAccessible&&this.accessibleCells&&activeRenderedControl?.matches('[part="canvas"]')){const positions=this.accessibleCellPositions(),target=this.focusedCell?positions.find(pos=>this.samePos(pos,this.focusedCell))??positions[0]??null:positions[0]??null;this.focusedCell=target,this.liveText=target?this.resolveCellText(target):"",this.pendingAccessibleFocus=target??"base",this.pendingAccessibleFocusOrigin=activeRenderedControl,this.restoringAccessibleFocus=!0,this.accessibleFocusGeneration++}}const bounds=this.cachedValueRange,range=bounds?`${this.formatNumericValue(bounds[0])}–${this.formatNumericValue(bounds[1])}`:this.localize("heatmapNoDataValue"),valueLabel=this.localizedValueLabel();let label;if(this.effectiveMode==="calendar")label=this.localize("heatmapCalendarLabel",void 0,{days:this.formatCount(this.cachedCalendarGrid.cells.length),label:valueLabel,range});else{const rows=this.matrixRowLabels.length,cols=this.matrixColLabels.length;label=this.localize("heatmapMatrixLabel",void 0,{rows:this.formatCount(rows),cols:this.formatCount(cols),label:valueLabel,range})}const selectedText=this.selectedCellDescription(),generatedAriaLabel=[label,selectedText,this.projectionDescription()].filter(Boolean).join(" ");this.generatedAriaLabel=generatedAriaLabel,this.syncingGeneratedSemantics=!0;try{this.authorRole===null&&this.setAttribute("role","group"),this.authorAriaLabel===null&&this.setAttribute("aria-label",generatedAriaLabel)}finally{this.syncingGeneratedSemantics=!1}}rebuildBoundedDecorations(){this.cachedAnnotations=this.annotations.slice(0,MAX_HEATMAP_DECORATIONS).map(entry=>({...entry})),this.cachedLegendStops=(this.legendStops??[]).slice(0,MAX_HEATMAP_DECORATIONS).map(entry=>({...entry})),this.cachedColorSteps=(this.colorSteps??[]).slice(0,MAX_HEATMAP_DECORATIONS),this.warnOnLegendRampMismatch(),this.cachedCalendarAnnotationDates=new Set(this.cachedAnnotations.flatMap(annotation=>annotation.date==null?[]:[annotation.date])),this.cachedMatrixAnnotationPositions=new Set(this.cachedAnnotations.flatMap(annotation=>annotation.row==null||annotation.col==null?[]:[`${annotation.row}:${annotation.col}`])),this.decorationProjectionTruncated=this.annotations.length>MAX_HEATMAP_DECORATIONS||(this.legendStops?.length??0)>MAX_HEATMAP_DECORATIONS||(this.colorSteps?.length??0)>MAX_HEATMAP_DECORATIONS}get projectionTruncated(){return this.decorationProjectionTruncated||(this.effectiveMode==="calendar"?this.cachedCalendarGrid.truncated:this.cachedMatrixData.truncated)}get cellProjectionTruncated(){return this.effectiveMode==="calendar"?this.cachedCalendarGrid.truncated:this.cachedMatrixData.truncated}projectedCellCount(){return this.effectiveMode==="calendar"?this.cachedCalendarGrid.weekCount*7:this.matrixRowLabels.length*this.matrixColLabels.length}projectionDescription(){const messages=[];return this.cellProjectionTruncated&&messages.push(this.localize("heatmapProjectionLimit",void 0,{count:this.formatCount(this.projectedCellCount())})),this.decorationProjectionTruncated&&messages.push(this.localize("heatmapDecorationLimit",void 0,{count:this.formatCount(MAX_HEATMAP_DECORATIONS)})),messages.join(" ")}rebuildCanonicalMatrixData(){if(this.data.kind!=="matrix"){this.cachedMatrixData={rowLabels:[],colLabels:[],values:[],truncated:!1};return}const colCount=Math.min(this.data.colLabels.length,MAX_HEATMAP_CELLS),rowLimit=colCount===0?Math.min(this.data.rowLabels.length,MAX_HEATMAP_CELLS):Math.floor(MAX_HEATMAP_CELLS/colCount),rowCount=Math.min(this.data.rowLabels.length,rowLimit),rowLabels=this.data.rowLabels.slice(0,rowCount).map(String),colLabels=this.data.colLabels.slice(0,colCount).map(String),source=this.data,values=Array.from({length:rowCount},(_,row)=>Array.from({length:colCount},(_2,col)=>source.values[row]?.[col]??(this.signedDomain?Number.NaN:-1)));this.cachedMatrixData={rowLabels,colLabels,values,truncated:rowCount!==this.data.rowLabels.length||colCount!==this.data.colLabels.length||this.data.values.some((row,index)=>index>=rowCount||row.length>colCount)}}selectedCellDescription(){if(this.multiple){const count=this.currentSelectedPositions.size;return count?this.localize("heatmapSelectedCount",void 0,{count:this.formatCount(count)}):""}if(!this.selectedCell)return"";if(this.effectiveMode==="calendar"){if(this.selectedCell.date==null)return"";const match=this.cachedCalendarCellsByDate.get(this.selectedCell.date);return match?this.localize("heatmapSelectedCellLabel",void 0,{cell:this.calendarCellText({week:match.week,weekday:match.weekday,date:match.date})}):""}const{row,col}=this.selectedCell;return row==null||col==null||row<0||row>=this.matrixRowLabels.length||col<0||col>=this.matrixColLabels.length?"":this.localize("heatmapSelectedCellLabel",void 0,{cell:this.matrixCellText({row,col})})}computeValueRange(){const pinned=this.domain;if(pinned){const[lo,hi]=pinned;if(Number.isFinite(lo)&&Number.isFinite(hi)&&lo!==hi)return lo<hi?[lo,hi]:[hi,lo]}const source=this.effectiveMode==="calendar"?this.cachedCalendarGrid.cells.map(cell=>cell.value):this.matrixValues.flat();return minMax(source.filter(v=>!this.isNoData(v)))}localizedValueLabel(){return this.valueLabel===void 0?this.localize("heatmapValueLabel"):this.valueLabel}formatNumericValue(value){return getNumberFormat(this.effectiveLocale||void 0).format(value)}syncExternalDescription(){const describedBy=this.getAttribute("aria-describedby");if(!describedBy&&!this.hasSyncedDescribedByElements)return;const control=this.accessibleCells?this.renderRoot.querySelector('[part="cells"]'):this.canvas;this.hasSyncedDescribedByElements=syncAriaDescribedByElements(this,control??void 0,describedBy)}updated(changed){if(super.updated(changed),this.syncExternalDescription(),this.hoverCell&&this.effectiveStickyLabels!=="none"&&this.scheduleAfterUpdate(()=>this.measureTooltip(),"heatmap-tooltip-metrics"),["data","cellSize","rowHeight","cellGapX","cellGapY","cellRadius","colLabelInterval","maxCellSize","minCellSize","valueLabel","scale","domain","midpoint","fitToWidth","rowLabelWidth","colLabelHeight","colLabelRotation","bucketCount","annotations","focusedCell","colorSteps","cellColor","selectedCell","selectedCells","multiple","selectionPreview","legendStops","accessibleCells","accessibleTargetSizePx","locale","stickyLabels"].some(name=>changed.has(name))){if(changed.has("focusedCell")&&[...changed.keys()].every(key=>key==="focusedCell"||key==="liveText")&&this.repaintFocusRing(changed.get("focusedCell")))return;this.requestDraw()}const pending=this.pendingAccessibleFocus;if(pending===void 0)return;this.pendingAccessibleFocus=void 0;const origin=this.pendingAccessibleFocusOrigin;this.pendingAccessibleFocusOrigin=void 0;const generation=this.accessibleFocusGeneration;this.scheduleAfterUpdate(()=>{try{if(generation!==this.accessibleFocusGeneration||!this.isConnected)return;if(origin){const internalActive=activeElementIn(this.shadowRoot),documentActive=activeElementIn(this.ownerDocument),focusStayedAtOrigin=internalActive===origin,originWasRemovedWithoutReplacement=internalActive===null&&(documentActive===null||documentActive===this||documentActive===this.ownerDocument.body);if(!focusStayedAtOrigin&&!originWasRemovedWithoutReplacement)return}if(pending==="base"){this.shadowRoot?.querySelector('[part="base"]')?.focus();return}if(pending==="canvas"){this.shadowRoot?.querySelector('[part="canvas"]')?.focus();return}const identity=this.accessibleCellIdentity(pending);[...this.shadowRoot?.querySelectorAll('[part="cell"]')??[]].find(candidate=>candidate.dataset.cellIdentity===identity)?.focus()}finally{this.restoringAccessibleFocus=!1}},"heatmap-accessible-focus")}refreshTheme(){this.cachedRamp=null,this.refreshAccessibleTargetSize()||this.requestDraw()}refreshAccessibleTargetSize(){const raw=this.ownerDocument.defaultView?.getComputedStyle(this).getPropertyValue("--lr-icon-button-size").trim()??"",resolved=resolveCssTokenLength(raw,{host:this}),next=resolved!==void 0&&Number.isFinite(resolved)&&resolved>0?resolved:DEFAULT_ACCESSIBLE_TARGET_SIZE_PX;return next===this.accessibleTargetSizePx?!1:(this.accessibleTargetSizePx=next,!0)}scaleEndpoints(cs){const lo=cs.getPropertyValue("--lr-heatmap-scale-lo").trim()||cs.getPropertyValue("--_lr-heatmap-scale-lo").trim()||FALLBACK_SCALE_LO,hi=cs.getPropertyValue("--lr-heatmap-scale-hi").trim()||cs.getPropertyValue("--_lr-heatmap-scale-hi").trim()||FALLBACK_SCALE_HI;return[lo,hi]}labelColor(cs){return cs.getPropertyValue("--lr-color-text-quiet").trim()||"#6b7280"}labelFont(cs){return cs.getPropertyValue("--lr-heatmap-label-font").trim()||cs.getPropertyValue("--_lr-heatmap-label-font").trim()||FALLBACK_LABEL_FONT}stickyLabelBg(cs){const raw=cs.getPropertyValue("--lr-heatmap-sticky-label-bg").trim()||cs.getPropertyValue("--_lr-heatmap-sticky-label-bg").trim()||FALLBACK_STICKY_LABEL_BG;return formatRgb(resolveRgb(raw,FALLBACK_STICKY_LABEL_BG,this.ownerDocument))}noDataFill(cs){return cs.getPropertyValue("--lr-heatmap-no-data-fill").trim()||cs.getPropertyValue("--_lr-heatmap-no-data-fill").trim()||FALLBACK_NO_DATA_FILL}focusRingColor(cs){return cs.getPropertyValue("--lr-heatmap-focus-ring-color").trim()||cs.getPropertyValue("--_lr-heatmap-focus-ring-color").trim()||FALLBACK_FOCUS_RING_COLOR}annotationColor(cs){return cs.getPropertyValue("--lr-heatmap-annotation-color").trim()||cs.getPropertyValue("--_lr-heatmap-annotation-color").trim()||FALLBACK_ANNOTATION_COLOR}selectedColor(cs){return cs.getPropertyValue("--lr-heatmap-selected-color").trim()||cs.getPropertyValue("--_lr-heatmap-selected-color").trim()||FALLBACK_SELECTED_COLOR}strokeCellState(ctx,x,y,size,state2,color,paintedShape){const shape=paintedShape??(this.effectiveMode==="matrix"?this.matrixCellShape(size):this.calendarCellShape(size)),width=shape?.custom?shape.w:size,height=shape?.custom?shape.h:size;shape?.custom&&(ctx.save(),ctx.beginPath(),ctx.roundRect(x,y,shape.w,shape.h,shape.radius),ctx.clip());const inset=Math.min(state2==="annotation"?.5:state2==="selected"?3.5:6.5,Math.max(.5,(Math.min(width,height)-RING_LINE_WIDTH-1)/2)),w=Math.max(1,width-inset*2),h=Math.max(1,height-inset*2);ctx.lineWidth=RING_LINE_WIDTH,ctx.strokeStyle=color,ctx.setLineDash?.(state2==="annotation"?[]:state2==="selected"?[4,2]:[1,2]),shape?.custom&&shape.radius>0?(ctx.beginPath(),ctx.roundRect(x+inset,y+inset,w,h,Math.max(0,shape.radius-inset)),ctx.stroke()):ctx.strokeRect(x+inset,y+inset,w,h),ctx.setLineDash?.([]),shape?.custom&&ctx.restore()}isSelectedPos(pos){return this.multiple?this.currentSelectedPositions.has(this.accessibleCellKey(pos)):this.selectedCell?"week"in pos?this.selectedCell.date==null?!1:this.calendarCellAt(pos).date===this.selectedCell.date:this.selectedCell.row===pos.row&&this.selectedCell.col===pos.col:!1}draw(){if(!this.canvasVisible){this.drawDirty=!0;return}this.drawDirty=!1,this.canvasHasContent=!1,this.effectiveMode==="calendar"?this.drawCalendar():this.drawMatrix()}requestDraw(){this.drawDirty=!0,this.canvasVisible&&this.draw()}repaintFocusRing(previous){if(!this.canvasHasContent||!this.canvas||this.drawDirty)return!1;const current=this.focusedCell;if(this.effectiveMode==="calendar"){if(previous&&!("week"in previous)||current&&!("week"in current))return!1;this.repaintCalendarFocusCell(previous&&"week"in previous?previous:null),current&&(!previous||!this.samePos(previous,current))&&this.repaintCalendarFocusCell(current)}else{if(previous&&!("row"in previous)||current&&!("row"in current))return!1;this.repaintMatrixFocusCell(previous&&"row"in previous?previous:null),current&&(!previous||!this.samePos(previous,current))&&this.repaintMatrixFocusCell(current)}return!0}cancelDrawFrame(){const request=this.drawFrameRequest;request&&request.owner.cancelAnimationFrame(request.handle),this.drawFrameRequest=void 0}resolveColorStep(color,fallback){const safe=sanitizeCssColor(color);if(!safe)return fallback;const scope=this.ownerDocument.createElement("span"),probe=this.ownerDocument.createElement("span");scope.hidden=!0,scope.style.color=fallback,probe.style.color=safe,scope.append(probe),this.renderRoot.append(scope);try{return this.ownerDocument.defaultView?.getComputedStyle(probe).color.trim()||fallback}finally{scope.remove()}}colorRamp(bucketCount,cs){const steps=this.cachedColorSteps;if(steps&&steps.length>=2){const key2=`steps ${steps.join(" ")}`;if(this.cachedRamp?.key===key2)return this.cachedRamp;const resolved=steps.map((color,index)=>this.resolveColorStep(color,index===steps.length-1?FALLBACK_SCALE_HI:FALLBACK_SCALE_LO)),colors2=resolved.map(color=>formatRgb(resolveRgb(color,FALLBACK_SCALE_LO,this.ownerDocument))),loRgb2=resolveRgb(resolved[0],FALLBACK_SCALE_LO,this.ownerDocument),hiRgb2=resolveRgb(resolved[resolved.length-1],FALLBACK_SCALE_HI,this.ownerDocument);return this.cachedRamp={key:key2,colors:colors2,loRgb:loRgb2,hiRgb:hiRgb2},this.cachedRamp}const[scaleLo,scaleHi]=this.scaleEndpoints(cs),normalizedBucketCount=normalizeBucketCount(bucketCount),key=`${scaleLo}\0${scaleHi}\0${normalizedBucketCount}`;if(this.cachedRamp?.key===key)return this.cachedRamp;const loRgb=resolveRgb(scaleLo,FALLBACK_SCALE_LO,this.ownerDocument),hiRgb=resolveRgb(scaleHi,FALLBACK_SCALE_HI,this.ownerDocument),colors=Array.from({length:normalizedBucketCount},(_,i)=>mixRgb(loRgb,hiRgb,i/(normalizedBucketCount-1)));return this.cachedRamp={key,colors,loRgb,hiRgb},this.cachedRamp}calendarCellSize(){return this.calendarSpacing().cellSize}calendarSpacing(){const{weekCount}=this.cachedCalendarGrid,rawGapX=this.explicitCalendarSpacing("cellGapX"),rawGapY=this.explicitCalendarSpacing("cellGapY"),rawRadius=this.explicitCalendarSpacing("cellRadius"),boundGap=(raw,size2)=>raw===void 0?CAL_GAP:finiteRange(raw,CAL_GAP,0,Math.max(0,size2-1));let size;if(this.fitToWidth&&weekCount>0){const fitGap=boundGap(rawGapX,this.cellSize),hostWidth=this.clientWidth||this.calendarPadLeft+weekCount*(this.cellSize+fitGap);size=this.clampFitCellSize((hostWidth-this.calendarPadLeft)/weekCount-fitGap)}else size=this.cellSize;return this.accessibleCells&&(size=Math.max(size,this.accessibleTargetSizePx)),{cellSize:size,gapX:boundGap(rawGapX,size),gapY:boundGap(rawGapY,size),radius:rawRadius===void 0?0:finiteRange(rawRadius,0,0,size/2)}}clampFitCellSize(size){const floored=finiteRange(size,FIT_MIN_CELL,Math.max(FIT_MIN_CELL,this.minCellSize??FIT_MIN_CELL));return this.maxCellSize==null?floored:Math.min(floored,this.maxCellSize)}columnXFor(week){return this.calendarColumnPositions()[week]??this.calendarPadLeft}rowYFor(weekday){return this.calendarRowPositions()[weekday]??CAL_LABEL_H}calendarColumnPositions(){const{cellSize,gapX:gap}=this.calendarSpacing(),weekCount=this.cachedCalendarGrid.weekCount,callback=this.calendarColumnX,padLeft=this.calendarPadLeft,cached=this.cachedColumnGeometry;if(cached!==void 0&&cached.callback===callback&&cached.padLeft===padLeft&&cached.cellSize===cellSize&&cached.gap===gap&&cached.weekCount===weekCount)return cached.positions;const positions=[];for(let index=0;index<=weekCount;index++){const fallback=index===0?padLeft:positions[index-1]+cellSize+gap;let candidate=fallback;if(callback)try{const supplied=callback(index);Number.isFinite(supplied)&&supplied>=0&&(index===0||supplied>=positions[index-1]+cellSize)&&(candidate=supplied)}catch{candidate=fallback}positions.push(candidate)}return this.cachedColumnGeometry={callback,padLeft,cellSize,gap,weekCount,positions},positions}calendarRowPositions(){const{cellSize,gapY:gap}=this.calendarSpacing(),callback=this.calendarRowY,cached=this.cachedRowGeometry;if(cached!==void 0&&cached.callback===callback&&cached.cellSize===cellSize&&cached.gap===gap)return cached.positions;const positions=[];for(let index=0;index<=7;index++){const fallback=index===0?CAL_LABEL_H:positions[index-1]+cellSize+gap;let candidate=fallback;if(callback)try{const supplied=callback(index);Number.isFinite(supplied)&&supplied>=0&&(index===0||supplied>=positions[index-1]+cellSize)&&(candidate=supplied)}catch{candidate=fallback}positions.push(candidate)}return this.cachedRowGeometry={callback,cellSize,gap,positions},positions}weekdayLabels(firstWeekStart){const formatter=getDateTimeFormat(this.effectiveLocale||void 0,{weekday:"short",timeZone:"UTC"}),labels=["","","","","","",""];for(const weekday of[1,3,5]){const row=(weekday-this.normalizedFirstDayOfWeek+7)%7;labels[row]=this.calendarWeekdayLabelText?.(weekday)??formatter.format(new Date(firstWeekStart.getTime()+row*MS_PER_DAY))}return labels}paintCalendarAxisLabels(ctx,cellSize,cs,firstWeekStart,monthLabels){ctx.fillStyle=this.labelColor(cs),ctx.font=this.labelFont(cs);const canvasRight=this.columnXFor(Math.max(1,this.cachedCalendarGrid.weekCount)),placed=[];monthLabels.forEach((month,index)=>{const label=this.ellipsize(ctx,month.label,canvasRight);if(!label)return;const width=ctx.measureText(label).width,x=Math.max(0,Math.min(this.columnXFor(month.week),canvasRight-width)),nextWeek=monthLabels[index+1]?.week??Math.max(month.week+1,this.cachedCalendarGrid.weekCount),entry={label,x,end:x+width+CAL_MONTH_LABEL_GAP,span:nextWeek-month.week};let previous=placed[placed.length-1];for(;previous&&entry.x<previous.end&&entry.span>previous.span;)placed.pop(),previous=placed[placed.length-1];previous&&entry.x<previous.end||placed.push(entry)});for(const{label,x}of placed)ctx.fillText(label,x,CAL_LABEL_H-4);const available=this.calendarPadLeft-CAL_WEEKDAY_LABEL_INSET*2;this.weekdayLabels(firstWeekStart).forEach((label,weekday)=>{const shown=label?this.ellipsize(ctx,label,available):"";shown&&ctx.fillText(shown,CAL_WEEKDAY_LABEL_INSET,this.rowYFor(weekday)+cellSize-1)})}drawCalendar(){if(!this.canvas)return;const{weekCount,firstWeekStart,monthLabels}=this.cachedCalendarGrid,cs=this.ownerDocument.defaultView?.getComputedStyle(this);if(!cs)return;const previousResolvedWeekdayWidth=this.resolvedCalendarWeekdayLabelWidth;this.calendarWeekdayLabelWidth==="auto"&&(this.resolvedCalendarWeekdayLabelWidth=this.measureCalendarWeekdayLabelWidth(cs,firstWeekStart));const autoGutterChanged=previousResolvedWeekdayWidth!==this.resolvedCalendarWeekdayLabelWidth,spacing=this.calendarSpacing(),cellSize=spacing.cellSize,w=this.columnXFor(Math.max(1,weekCount)),h=this.rowYFor(7),dpr=this.ownerDocument.defaultView?.devicePixelRatio||1;this.canvas.width=w*dpr,this.canvas.height=h*dpr,this.canvas.style.width=`${w}px`,this.canvas.style.height=`${h}px`;const ctx=this.canvas.getContext("2d");if(!ctx)return;ctx.scale(dpr,dpr),ctx.clearRect(0,0,w,h);const buckets=normalizeBucketCount(this.bucketCount),ramp=this.colorRamp(buckets,cs).colors,noDataFill=this.noDataFill(cs);this.canvasColorCache.clear();const bounds=this.cachedValueRange,lo=bounds?bounds[0]:0,hi=bounds?bounds[1]:1;for(let week=0;week<weekCount;week++)for(let weekday=0;weekday<7;weekday++){const value=this.calendarValueAt(week,weekday),x=this.columnXFor(week),y=this.rowYFor(weekday),override=this.cellColor?.(this.calendarPos(week,weekday),value);if(override!=null)ctx.fillStyle=this.resolveCanvasColor(override,cs);else if(this.isNoData(value))ctx.fillStyle=noDataFill;else if(this.scale==="sqrt"){const step=sqrtStep(value,hi,ramp.length);ctx.fillStyle=step<0?noDataFill:ramp[step]}else if(this.cachedColorSteps.length>=2){const step=this.rampBucket(value,lo,hi,ramp.length);ctx.fillStyle=ramp[step]}else ctx.fillStyle=ramp[quartileBucket(value,this.cachedCalendarSortedValues,buckets)];this.fillCalendarCell(ctx,x,y,cellSize,spacing.radius)}if(this.cachedAnnotations.length)for(const ann of this.cachedAnnotations){if(ann.date==null)continue;const match=this.cachedCalendarCellsByDate.get(ann.date);if(!match)continue;const x=this.columnXFor(match.week),y=this.rowYFor(match.weekday);this.strokeCellState(ctx,x,y,cellSize,"annotation",this.annotationColor(cs))}for(const match of this.selectedPaintPositions())if("week"in match){const x=this.columnXFor(match.week),y=this.rowYFor(match.weekday);this.strokeCellState(ctx,x,y,cellSize,"selected",this.selectedColor(cs))}if(this.focusedCell&&"week"in this.focusedCell){const{week,weekday}=this.focusedCell;if(week<weekCount&&weekday<7){const x=this.columnXFor(week),y=this.rowYFor(weekday);this.strokeCellState(ctx,x,y,cellSize,"focus",this.focusRingColor(cs))}}this.paintCalendarAxisLabels(ctx,cellSize,cs,firstWeekStart,monthLabels),this.canvasHasContent=!0,this.recordCalendarGeometry(spacing,weekCount),autoGutterChanged&&this.accessibleCells&&this.scheduleAfterUpdate(()=>this.requestUpdate(),"heatmap-calendar-accessible-geometry")}matrixCellSize(cols){let size;if(this.fitToWidth&&cols>0){const padLeft=this.matrixPadLeft,hostWidth=this.clientWidth||padLeft+cols*this.cellSize;size=this.clampFitCellSize((hostWidth-padLeft)/cols)}else size=this.cellSize;if(!this.accessibleCells)return size;const target=this.accessibleTargetSizePx,custom=finiteNumber(this.cellGapX,1)!==1||finiteNumber(this.cellGapY,1)!==1||finiteRange(this.cellRadius,0,0)>0,gap=this.rowHeight!==void 0?finiteRange(this.cellGapX,1,0,target):custom?Math.max(finiteRange(this.cellGapX,1,0,target),finiteRange(this.cellGapY,1,0,target)):0;return Math.max(size,target+gap)}matrixRowHeight(cellSize){if(this.rowHeight===void 0)return cellSize;const height=finiteRange(this.rowHeight,cellSize,1);if(!this.accessibleCells)return height;const target=this.accessibleTargetSizePx;return Math.max(height,target+finiteRange(this.cellGapY,1,0,target))}matrixCellShape(size,height=this.matrixRowHeight(size)){if(height===size&&finiteNumber(this.cellGapX,1)===1&&finiteNumber(this.cellGapY,1)===1&&finiteRange(this.cellRadius,0,0)===0)return{w:size-1,h:size-1,radius:0,custom:!1};const target=this.accessibleCells?this.accessibleTargetSizePx:1,w=size-finiteRange(this.cellGapX,1,0,Math.max(0,size-Math.min(size,target))),h=height-finiteRange(this.cellGapY,1,0,Math.max(0,height-Math.min(height,target))),radius=finiteRange(this.cellRadius,0,0,Math.min(w,h)/2);return{w,h,radius,custom:height!==size||w!==size-1||h!==size-1||radius!==0}}calendarCellShape(size){const radius=this.calendarSpacing().radius;return radius>0?{w:size,h:size,radius:Math.min(radius,size/2),custom:!0}:void 0}fillMatrixCell(ctx,x,y,shape){shape.radius===0?ctx.fillRect(x,y,shape.w,shape.h):(ctx.beginPath(),ctx.roundRect(x,y,shape.w,shape.h,shape.radius),ctx.fill())}paintMatrixCell(ctx,row,col,cellSize,rowHeight,shape,cs,rampData,noDataFill){const value=this.matrixValues[row]?.[col]??Number.NaN,bounds=this.cachedValueRange,lo=bounds?bounds[0]:0,hi=bounds?bounds[1]:1,override=this.cellColor?.({row,col},value);if(override!=null)ctx.fillStyle=this.resolveCanvasColor(override,cs);else if(this.isNoData(value))ctx.fillStyle=noDataFill;else if(this.scale==="sqrt"){const step=sqrtStep(value,hi,rampData.colors.length);ctx.fillStyle=step<0?noDataFill:rampData.colors[step]}else this.cachedColorSteps.length>=2?ctx.fillStyle=rampData.colors[this.rampBucket(value,lo,hi,rampData.colors.length)]:ctx.fillStyle=mixRgb(rampData.loRgb,rampData.hiRgb,this.rampAlpha(value,lo,hi));this.fillMatrixCell(ctx,this.matrixPadLeft+col*cellSize,this.matrixPadTop+row*rowHeight,shape)}paintMatrixFocusOverlays(ctx,row,col,cellSize,rowHeight,shape,cs,state2){const x=this.matrixPadLeft+col*cellSize,y=this.matrixPadTop+row*rowHeight;state2==="annotation"&&this.cachedMatrixAnnotationPositions.has(`${row}:${col}`)&&this.strokeCellState(ctx,x,y,cellSize,"annotation",this.annotationColor(cs),shape),state2==="selected"&&this.isSelectedPos({row,col})&&this.strokeCellState(ctx,x,y,cellSize,"selected",this.selectedColor(cs),shape),state2==="focus"&&this.focusedCell&&"row"in this.focusedCell&&this.focusedCell.row===row&&this.focusedCell.col===col&&this.strokeCellState(ctx,x,y,cellSize,"focus",this.focusRingColor(cs),shape)}focusRepaintBounds(ctx,x,y,cellSize,cellHeight=cellSize){const padding=RING_LINE_WIDTH+1,dpr=ctx.getTransform().a,left=Math.floor((x-padding)*dpr)/dpr,top=Math.floor((y-padding)*dpr)/dpr,right=Math.ceil((x+cellSize+padding)*dpr)/dpr,bottom=Math.ceil((y+cellHeight+padding)*dpr)/dpr;return{left,top,width:right-left,height:bottom-top,radius:Math.ceil((2*padding+1/dpr)/cellSize),rowRadius:Math.ceil((2*padding+1/dpr)/cellHeight)}}repaintMatrixFocusCell(pos){if(!pos||!this.canvas)return;const rows=this.matrixRowLabels.length,cols=this.matrixColLabels.length;if(pos.row<0||pos.row>=rows||pos.col<0||pos.col>=cols)return;const cellSize=this.matrixCellSize(cols),rowHeight=this.matrixRowHeight(cellSize),shape=this.matrixCellShape(cellSize,rowHeight),x=this.matrixPadLeft+pos.col*cellSize,y=this.matrixPadTop+pos.row*rowHeight,ctx=this.canvas.getContext("2d");if(!ctx)return;const cs=this.ownerDocument.defaultView?.getComputedStyle(this);if(!cs)return;const{left,top,width,height,radius,rowRadius}=this.focusRepaintBounds(ctx,x,y,cellSize,rowHeight),firstRow=Math.max(0,pos.row-rowRadius),lastRow=Math.min(rows-1,pos.row+rowRadius),firstCol=Math.max(0,pos.col-radius),lastCol=Math.min(cols-1,pos.col+radius),ramp=this.colorRamp(RAMP_STEPS,cs),noData=this.noDataFill(cs),scratch=rowHeight===cellSize?void 0:this.ownerDocument.createElement("canvas"),dpr=ctx.getTransform().a,scratchLeft=Math.floor((this.matrixPadLeft+firstCol*cellSize-RING_LINE_WIDTH-1)*dpr)/dpr,scratchTop=Math.floor((this.matrixPadTop+firstRow*rowHeight-RING_LINE_WIDTH-1)*dpr)/dpr;if(scratch){const right=Math.ceil((this.matrixPadLeft+(lastCol+1)*cellSize+RING_LINE_WIDTH+1)*dpr),bottom=Math.ceil((this.matrixPadTop+(lastRow+1)*rowHeight+RING_LINE_WIDTH+1)*dpr);scratch.width=right-Math.round(scratchLeft*dpr),scratch.height=bottom-Math.round(scratchTop*dpr)}const paintCtx=scratch?.getContext("2d")??ctx;if(scratch&&paintCtx===ctx){this.drawMatrix();return}paintCtx.save();try{scratch?paintCtx.setTransform(dpr,0,0,dpr,-scratchLeft*dpr,-scratchTop*dpr):(paintCtx.beginPath(),paintCtx.rect(left,top,width,height),paintCtx.clip(),paintCtx.clearRect(left,top,width,height));for(let row=firstRow;row<=lastRow;row++)for(let col=firstCol;col<=lastCol;col++)this.paintMatrixCell(paintCtx,row,col,cellSize,rowHeight,shape,cs,ramp,noData);for(const state2 of["annotation","selected","focus"])for(let row=firstRow;row<=lastRow;row++)for(let col=firstCol;col<=lastCol;col++)this.paintMatrixFocusOverlays(paintCtx,row,col,cellSize,rowHeight,shape,cs,state2);left<this.matrixPadLeft&&this.paintMatrixRowLabels(paintCtx,this.matrixPadLeft,this.matrixPadTop,rowHeight,cs),top<this.matrixPadTop&&this.paintMatrixColLabels(paintCtx,this.matrixPadLeft,this.matrixPadTop,cellSize,cs)}finally{paintCtx.restore()}if(scratch){ctx.save();try{ctx.setTransform(1,0,0,1,0,0),ctx.clearRect(left*dpr,top*dpr,width*dpr,height*dpr),ctx.drawImage(scratch,Math.round((left-scratchLeft)*dpr),Math.round((top-scratchTop)*dpr),Math.round(width*dpr),Math.round(height*dpr),Math.round(left*dpr),Math.round(top*dpr),Math.round(width*dpr),Math.round(height*dpr))}finally{ctx.restore()}}}paintCalendarCell(ctx,week,weekday,cellSize,cs,ramp,noDataFill){const value=this.calendarValueAt(week,weekday),bounds=this.cachedValueRange,lo=bounds?bounds[0]:0,hi=bounds?bounds[1]:1,override=this.cellColor?.(this.calendarPos(week,weekday),value);if(override!=null)ctx.fillStyle=this.resolveCanvasColor(override,cs);else if(this.isNoData(value))ctx.fillStyle=noDataFill;else if(this.scale==="sqrt"){const step=sqrtStep(value,hi,ramp.length);ctx.fillStyle=step<0?noDataFill:ramp[step]}else this.cachedColorSteps.length>=2?ctx.fillStyle=ramp[this.rampBucket(value,lo,hi,ramp.length)]:ctx.fillStyle=ramp[quartileBucket(value,this.cachedCalendarSortedValues,ramp.length)];this.fillCalendarCell(ctx,this.columnXFor(week),this.rowYFor(weekday),cellSize,this.calendarSpacing().radius)}fillCalendarCell(ctx,x,y,size,radius){radius===0?ctx.fillRect(x,y,size,size):(ctx.beginPath(),ctx.roundRect(x,y,size,size,radius),ctx.fill())}recordCalendarGeometry(spacing,weekCount){const next={padLeft:this.calendarPadLeft,padTop:CAL_LABEL_H,cellSize:spacing.cellSize,cellWidth:spacing.cellSize,cellHeight:spacing.cellSize,cellGapX:spacing.gapX,cellGapY:spacing.gapY,cellRadius:spacing.radius,weekCount,firstDayOfWeek:this.normalizedFirstDayOfWeek},previous=this.lastPaintedCalendarGeometry;if(previous&&Object.keys(next).every(key=>previous[key]===next[key]))return;const frozen=Object.freeze(next);this.lastPaintedCalendarGeometry=frozen,this.emit("lr-calendar-geometry-change",frozen)}paintCalendarFocusOverlays(ctx,week,weekday,cellSize,cs,state2){const date=this.calendarDateAt(week,weekday),x=this.columnXFor(week),y=this.rowYFor(weekday);state2==="annotation"&&this.cachedCalendarCellsByDate.has(date)&&this.cachedCalendarAnnotationDates.has(date)&&this.strokeCellState(ctx,x,y,cellSize,"annotation",this.annotationColor(cs)),state2==="selected"&&(this.multiple||this.cachedCalendarCellsByDate.has(date))&&this.isSelectedPos({week,weekday,date})&&this.strokeCellState(ctx,x,y,cellSize,"selected",this.selectedColor(cs)),state2==="focus"&&this.focusedCell&&"week"in this.focusedCell&&this.focusedCell.week===week&&this.focusedCell.weekday===weekday&&this.strokeCellState(ctx,x,y,cellSize,"focus",this.focusRingColor(cs))}repaintCalendarFocusCell(pos){if(!pos||!this.canvas)return;const{weekCount,firstWeekStart}=this.cachedCalendarGrid;if(pos.week<0||pos.week>=weekCount||pos.weekday<0||pos.weekday>=7)return;const cellSize=this.calendarCellSize(),x=this.columnXFor(pos.week),y=this.rowYFor(pos.weekday),ctx=this.canvas.getContext("2d");if(!ctx)return;const cs=this.ownerDocument.defaultView?.getComputedStyle(this);if(!cs)return;const{left,top,width,height,radius}=this.focusRepaintBounds(ctx,x,y,cellSize),firstWeek=Math.max(0,pos.week-radius),lastWeek=Math.min(weekCount-1,pos.week+radius),firstDay=Math.max(0,pos.weekday-radius),lastDay=Math.min(6,pos.weekday+radius),ramp=this.colorRamp(normalizeBucketCount(this.bucketCount),cs).colors,noData=this.noDataFill(cs);ctx.save();try{ctx.beginPath(),ctx.rect(left,top,width,height),ctx.clip(),ctx.clearRect(left,top,width,height);for(let week=firstWeek;week<=lastWeek;week++)for(let day=firstDay;day<=lastDay;day++)this.paintCalendarCell(ctx,week,day,cellSize,cs,ramp,noData);for(const state2 of["annotation","selected","focus"])for(let week=firstWeek;week<=lastWeek;week++)for(let day=firstDay;day<=lastDay;day++)this.paintCalendarFocusOverlays(ctx,week,day,cellSize,cs,state2);this.paintCalendarAxisLabels(ctx,cellSize,cs,firstWeekStart,this.cachedCalendarGrid.monthLabels)}finally{ctx.restore()}}drawMatrix(){if(!this.canvas)return;const rows=this.matrixRowLabels.length,cols=this.matrixColLabels.length;if(this.rowLabelWidth==="auto"||this.colLabelHeight==="auto"){const measureStyle=getComputedStyle(this);this.rowLabelWidth==="auto"&&(this.resolvedRowLabelWidth=this.measureRowLabelWidth(measureStyle)),this.colLabelHeight==="auto"&&(this.resolvedColLabelHeight=this.measureColLabelHeight(measureStyle))}const padLeft=this.matrixPadLeft,padTop=this.matrixPadTop,cellSize=this.matrixCellSize(cols),rowHeight=this.matrixRowHeight(cellSize),shape=this.matrixCellShape(cellSize,rowHeight),dimensions=shape.custom?{cellWidth:shape.w,cellHeight:shape.h,cellRadius:shape.radius}:{},previous=this.lastPaintedMatrixGeometry,geometry=previous&&previous.padLeft===padLeft&&previous.padTop===padTop&&previous.cellSize===cellSize&&previous.rowHeight===(rowHeight===cellSize?void 0:rowHeight)&&previous.cellWidth===dimensions.cellWidth&&previous.cellHeight===dimensions.cellHeight&&previous.cellRadius===dimensions.cellRadius?previous:Object.freeze({padLeft,padTop,cellSize,...rowHeight===cellSize?{}:{rowHeight},...dimensions});this.lastPaintedMatrixGeometry=geometry;const geometryChanged=geometry!==previous;geometryChanged&&this.emit("lr-matrix-geometry-change",geometry);const w=padLeft+cols*cellSize,h=padTop+rows*rowHeight,dpr=this.ownerDocument.defaultView?.devicePixelRatio||1;this.canvas.width=w*dpr,this.canvas.height=h*dpr,this.canvas.style.width=`${w}px`,this.canvas.style.height=`${h}px`;const ctx=this.canvas.getContext("2d");if(!ctx)return;ctx.scale(dpr,dpr),ctx.clearRect(0,0,w,h);const cs=this.ownerDocument.defaultView?.getComputedStyle(this);if(!cs)return;const bounds=this.cachedValueRange,lo=bounds?bounds[0]:0,hi=bounds?bounds[1]:1,rampData=this.colorRamp(RAMP_STEPS,cs),ramp=rampData.colors,{loRgb,hiRgb}=rampData,noDataFill=this.noDataFill(cs);this.canvasColorCache.clear();for(let r=0;r<rows;r++)for(let c=0;c<cols;c++){const v=this.matrixValues[r]?.[c]??Number.NaN,x=padLeft+c*cellSize,y=padTop+r*rowHeight,override=this.cellColor?.({row:r,col:c},v);if(override!=null)ctx.fillStyle=this.resolveCanvasColor(override,cs);else if(this.isNoData(v))ctx.fillStyle=noDataFill;else if(this.scale==="sqrt"){const step=sqrtStep(v,hi,ramp.length);ctx.fillStyle=step<0?noDataFill:ramp[step]}else if(this.cachedColorSteps.length>=2){const step=this.rampBucket(v,lo,hi,ramp.length);ctx.fillStyle=ramp[step]}else{const t=this.rampAlpha(v,lo,hi);ctx.fillStyle=mixRgb(loRgb,hiRgb,t)}this.fillMatrixCell(ctx,x,y,shape)}if(this.cachedAnnotations.length)for(const ann of this.cachedAnnotations){if(ann.row==null||ann.col==null||ann.row<0||ann.row>=rows||ann.col<0||ann.col>=cols)continue;const x=padLeft+ann.col*cellSize,y=padTop+ann.row*rowHeight;this.strokeCellState(ctx,x,y,cellSize,"annotation",this.annotationColor(cs),shape)}for(const selected of this.selectedPaintPositions()){if(!("row"in selected))continue;const{row,col}=selected;if(row>=0&&row<rows&&col>=0&&col<cols){const x=padLeft+col*cellSize,y=padTop+row*rowHeight;this.strokeCellState(ctx,x,y,cellSize,"selected",this.selectedColor(cs),shape)}}if(this.focusedCell&&"row"in this.focusedCell){const{row,col}=this.focusedCell;if(row<rows&&col<cols){const x=padLeft+col*cellSize,y=padTop+row*rowHeight;this.strokeCellState(ctx,x,y,cellSize,"focus",this.focusRingColor(cs),shape)}}this.paintMatrixRowLabels(ctx,padLeft,padTop,rowHeight,cs),this.paintMatrixColLabels(ctx,padLeft,padTop,cellSize,cs),this.paintFrozenLabelBands(padLeft,padTop,cellSize,rowHeight,w,h,dpr,cs),this.canvasHasContent=!0,geometryChanged&&this.accessibleCells&&this.scheduleAfterUpdate(()=>this.requestUpdate(),"heatmap-matrix-accessible-geometry")}paintMatrixRowLabels(ctx,padLeft,padTop,cellSize,cs){ctx.fillStyle=this.labelColor(cs),ctx.font=this.labelFont(cs);const rowLabelSpace=padLeft-ROW_LABEL_INSET*2;this.matrixRowLabels.forEach((label,r)=>{const shown=this.ellipsize(ctx,label,rowLabelSpace);shown&&ctx.fillText(shown,ROW_LABEL_INSET,padTop+r*cellSize+cellSize/2+3)})}paintMatrixColLabels(ctx,padLeft,padTop,cellSize,cs){ctx.fillStyle=this.labelColor(cs),ctx.font=this.labelFont(cs);const colRotation=this.effectiveColLabelRotation,interval=finiteInteger(this.colLabelInterval,1,1);if(colRotation===0){this.matrixColLabels.forEach((label,c)=>{c%interval===0&&ctx.fillText(label,padLeft+c*cellSize+2,padTop-COL_LABEL_INSET)});return}const radians=colRotation*Math.PI/180,previousAlign=ctx.textAlign;ctx.textAlign="right",this.matrixColLabels.forEach((label,c)=>{c%interval===0&&(ctx.save(),ctx.translate(padLeft+c*cellSize+cellSize/2,padTop-COL_LABEL_INSET),ctx.rotate(radians),ctx.fillText(label,0,0),ctx.restore())}),ctx.textAlign=previousAlign}paintFrozenLabelBands(padLeft,padTop,cellSize,rowHeight,width,height,dpr,cs){if(this.effectiveStickyLabels==="none")return;const backdrop=this.stickyLabelBg(cs),rowBand=this.frozenBandCanvas("row-labels");rowBand&&this.paintFrozenBand(rowBand,padLeft,height,dpr,backdrop,bandCtx=>this.paintMatrixRowLabels(bandCtx,padLeft,padTop,rowHeight,cs));const colBand=this.frozenBandCanvas("col-labels");colBand&&this.paintFrozenBand(colBand,width,padTop,dpr,backdrop,bandCtx=>this.paintMatrixColLabels(bandCtx,padLeft,padTop,cellSize,cs))}frozenBandCanvas(part){return this.shadowRoot?.querySelector(`[part="${part}"]`)??null}paintFrozenBand(canvas,width,height,dpr,backdrop,paint){canvas.width=width*dpr,canvas.height=height*dpr,canvas.style.width=`${width}px`,canvas.style.height=`${height}px`;const ctx=canvas.getContext("2d");ctx&&(ctx.scale(dpr,dpr),ctx.clearRect(0,0,width,height),ctx.fillStyle=backdrop,ctx.fillRect(0,0,width,height),paint(ctx))}hitTest(x,y){return this.effectiveMode==="calendar"?this.hitTestCalendar(x,y):this.hitTestMatrix(x,y)}matrixNavigationGeometry(rows,cols){const painted=this.lastPaintedMatrixGeometry;if(painted)return{rows,cols,padLeft:painted.padLeft,padTop:painted.padTop,cellSize:painted.cellSize,rowHeight:painted.rowHeight??painted.cellSize,cellWidth:painted.cellWidth??painted.cellSize-1,cellHeight:painted.cellHeight??painted.cellSize-1,customShape:painted.cellWidth!==void 0};const cellSize=this.matrixCellSize(cols),rowHeight=this.matrixRowHeight(cellSize),shape=this.matrixCellShape(cellSize,rowHeight);return{rows,cols,padLeft:this.matrixPadLeft,padTop:this.matrixPadTop,cellSize,rowHeight,cellWidth:shape.w,cellHeight:shape.h,customShape:shape.custom}}calendarNavigationGeometry(){const cellSize=this.calendarCellSize(),columnPositions=this.calendarColumnPositions(),rowPositions=this.calendarRowPositions();return{weekCount:this.cachedCalendarGrid.weekCount,cellSize,columnPositions,rowPositions,padLeft:this.calendarPadLeft,padTop:CAL_LABEL_H}}hitTestMatrix(x,y){const rows=this.matrixRowLabels.length,cols=this.matrixColLabels.length;return rows===0||cols===0?null:hitTestMatrixGrid(x,y,this.matrixNavigationGeometry(rows,cols),pos=>this.isCellInteractive(pos))}firstInteractiveMatrixCell(rows,cols){return findFirstInteractiveMatrixCell(rows,cols,pos=>this.isCellInteractive(pos))}nextInteractiveMatrixCell(row,col,dRow,dCol,rows,cols){return findNextInteractiveMatrixCell(row,col,dRow,dCol,rows,cols,pos=>this.isCellInteractive(pos))}firstInteractiveCalendarCell(weekCount){return findFirstInteractiveCalendarCell(weekCount,(week,weekday)=>this.calendarPos(week,weekday),pos=>this.isCellInteractive(pos))}nextInteractiveCalendarCell(week,weekday,dWeek,dWeekday,weekCount){return findNextInteractiveCalendarCell(week,weekday,dWeek,dWeekday,weekCount,(nextWeek,nextWeekday)=>this.calendarPos(nextWeek,nextWeekday),pos=>this.isCellInteractive(pos))}hitTestCalendar(x,y){const weekCount=this.cachedCalendarGrid.weekCount;if(weekCount===0)return null;const columnPositions=this.calendarColumnPositions();return hitTestCalendarGrid(x,y,weekCount,columnPositions,()=>this.calendarCellSize(),()=>this.calendarRowPositions(),(week,weekday)=>this.calendarPos(week,weekday),pos=>this.isCellInteractive(pos))}calendarCellAt(pos){return readCalendarCell(pos.week,pos.weekday,this.cachedCalendarCellsByPos,this.cachedCalendarDateByPos,this.cachedCalendarGrid.firstWeekStart,this.signedDomain)}calendarValueAt(week,weekday){return readCalendarValue(week,weekday,this.cachedCalendarCellsByPos,this.signedDomain)}calendarDateAt(week,weekday){return readCalendarDate(week,weekday,this.cachedCalendarDateByPos,this.cachedCalendarGrid.firstWeekStart)}calendarPos(week,weekday){return{week,weekday,date:this.calendarDateAt(week,weekday)}}cellRect(pos){return"week"in pos?calendarCellRect(pos.week,pos.weekday,this.calendarNavigationGeometry()):matrixCellRect(pos,this.matrixNavigationGeometry(this.matrixRowLabels.length,this.matrixColLabels.length))}accessibleCellRect(pos){return"week"in pos||!this.lastPaintedMatrixGeometry?this.cellRect(pos):accessibleMatrixCellRect(pos,this.lastPaintedMatrixGeometry)}defaultCellText(pos){return"week"in pos?this.calendarCellText(pos):this.matrixCellText(pos)}matrixCellText(pos){const rowLabel=this.matrixRowLabels[pos.row]??this.localize("heatmapDefaultRowLabel",void 0,{n:this.formatCount(pos.row+1)}),colLabel=this.matrixColLabels[pos.col]??this.localize("heatmapDefaultColLabel",void 0,{n:this.formatCount(pos.col+1)}),v=this.matrixValues[pos.row]?.[pos.col],valueText=v==null||this.isNoData(v)?this.localize("heatmapNoDataValue"):this.formatNumericValue(v);return this.localize("heatmapMatrixCellLabel",void 0,{row:rowLabel,col:colLabel,value:valueText})}calendarCellText(pos){const{date,value}=this.calendarCellAt(pos),label=parseIsoDate(date).toLocaleString(this.effectiveLocale||void 0,{month:"short",day:"numeric",timeZone:"UTC"}),valueText=this.isNoData(value)?this.localize("heatmapNoDataValue"):this.formatNumericValue(value);return this.localize("heatmapCalendarCellLabel",void 0,{date:label,value:valueText})}valueAt(pos){return"week"in pos?this.calendarCellAt(pos).value:this.matrixValues[pos.row]?.[pos.col]??-1}resolveCellText(pos){return this.cellText?this.cellText(pos,this.valueAt(pos)):this.defaultCellText(pos)}isCellInteractive(pos){return this.cellInteractive?.(pos,this.valueAt(pos))??!0}announce(pos,isSelectedOverride){const text=this.resolveCellText(pos),announcement=isSelectedOverride??this.isSelectedPos(pos)?this.localize("heatmapSelectedCellLabel",void 0,{cell:text}):text;this.liveText=announcement,this.announcementSink?.announce(announcement)}emitCellClick(pos,source="pointer",select=!0){if(!this.isCellInteractive(pos))return;this.multiple&&select&&(this.selectionAnchor=pos,this.selectionRangeBase=void 0,this.toggleSelectionPositions([pos],source));let detail;if("week"in pos){const{date,value}=this.calendarCellAt(pos);detail={date,value}}else{const value=this.matrixValues[pos.row]?.[pos.col]??-1;detail={row:pos.row,col:pos.col,value}}this.emit("lr-cell-activate",{...detail})}get currentSelectedPositions(){return this.selectionPreview??this.selectedPositions}selectedPaintPositions(){if(this.multiple)return[...this.currentSelectedPositions.values()];const selected=this.selectedCell;if(!selected)return[];if(this.effectiveMode==="calendar"){const match=selected.date?this.cachedCalendarCellsByDate.get(selected.date):void 0;return match?[match]:[]}return selected.row!=null&&selected.col!=null?[{row:selected.row,col:selected.col}]:[]}rebuildSelectedPositions(){const positions=new Map,dates=this.effectiveMode==="calendar"?new Map(this.cachedAccessiblePositions.map(pos=>[this.accessibleCellIdentity(pos),pos])):void 0,input=Array.isArray(this.selectedCells)?this.selectedCells:[];for(const cell of input.slice(0,MAX_HEATMAP_CELLS)){if(!cell||typeof cell!="object")continue;const pos=dates?typeof cell.date=="string"?dates.get(cell.date):void 0:Number.isInteger(cell.row)&&Number.isInteger(cell.col)?this.cachedAccessiblePositionsByKey.get(`matrix-${cell.row}-${cell.col}`):void 0;pos&&positions.set(this.accessibleCellKey(pos),pos)}this.selectedPositions=positions}selectionCoordinates(pos){return"week"in pos?{row:pos.weekday,col:pos.week}:pos}proposeSelection(positions,source){if(positions.size===this.selectedPositions.size&&[...positions.keys()].every(key=>this.selectedPositions.has(key)))return;this.proposedSelectionKeys=new Set(positions.keys());const selectedCells=[...positions.values()].sort((a,b)=>{const first=this.selectionCoordinates(a),second=this.selectionCoordinates(b);return first.row-second.row||first.col-second.col}).map(pos=>"week"in pos?{date:pos.date}:{row:pos.row,col:pos.col});this.emit("lr-selection-change",{selectedCells,source})}toggleSelectionPositions(positions,source){if(!this.multiple||positions.length===0)return;const next=new Map(this.selectedPositions),remove=positions.every(pos=>next.has(this.accessibleCellKey(pos)));for(const pos of positions){const key=this.accessibleCellKey(pos);remove?next.delete(key):next.set(key,pos)}this.proposeSelection(next,source)}toggleSelectionAxis(index,row){!this.multiple||!Number.isInteger(index)||index<0||(this.cancelSelectionGesture(),this.selectionRangeBase=void 0,this.toggleSelectionPositions(this.cachedAccessiblePositions.filter(pos=>{const coordinates=this.selectionCoordinates(pos);return(row?coordinates.row:coordinates.col)===index}),row?"row":"column"))}selectionKeyDown(event,pos){if(!this.multiple)return!1;if(event.key==="Escape"&&this.selectionGesture)return event.preventDefault(),this.cancelSelectionGesture(),!0;if(event.key!==" "||!pos||!(event.shiftKey||event.ctrlKey||event.metaKey))return!1;event.preventDefault();const coordinates=this.selectionCoordinates(pos);return event.ctrlKey||event.metaKey?this.toggleColumnSelection(coordinates.col):this.toggleRowSelection(coordinates.row),!0}extendSelection(previous,next,range){if(!this.multiple)return;if(!range){this.selectionAnchor=next,this.selectionRangeBase=void 0;return}this.selectionAnchor??=previous??next,this.selectionRangeBase??=new Map(this.selectedPositions);const from=this.selectionCoordinates(this.selectionAnchor),to=this.selectionCoordinates(next),selected=new Map(this.selectionRangeBase);for(const pos of this.cachedAccessiblePositions){const{row,col}=this.selectionCoordinates(pos);row>=Math.min(from.row,to.row)&&row<=Math.max(from.row,to.row)&&col>=Math.min(from.col,to.col)&&col<=Math.max(from.col,to.col)&&selected.set(this.accessibleCellKey(pos),pos)}return this.proposeSelection(selected,"keyboard"),new Set(selected.keys())}selectionPointerPosition(event){if(!this.canvas)return null;const rect=this.canvas.getBoundingClientRect();return this.hitTest(event.clientX-rect.left,event.clientY-rect.top)}paintSelectionTo(pos){const gesture=this.selectionGesture;if(!gesture)return;this.samePos(pos,gesture.previous)||(gesture.moved=!0);const from=this.selectionCoordinates(gesture.previous),to=this.selectionCoordinates(pos),steps=Math.max(Math.abs(to.row-from.row),Math.abs(to.col-from.col),1);for(let step=0;step<=steps;step++){const row=Math.round(from.row+(to.row-from.row)*step/steps),col=Math.round(from.col+(to.col-from.col)*step/steps),key=this.effectiveMode==="calendar"?`calendar-${col}-${row}`:`matrix-${row}-${col}`,candidate=this.cachedAccessiblePositionsByKey.get(key);candidate&&(gesture.selecting?gesture.cells.set(key,candidate):gesture.cells.delete(key))}gesture.previous=pos,this.selectionPreview=new Map(gesture.cells)}cancelSelectionGesture(){const gesture=this.selectionGesture;if(this.selectionGesture=void 0,this.selectionPreview=void 0,!!gesture){this.suppressSelectionClick=!0;try{gesture.target.hasPointerCapture(gesture.pointerId)&&gesture.target.releasePointerCapture(gesture.pointerId)}catch{}}}consumeSelectionClick(event){return!this.suppressSelectionClick||event.detail===0?!1:(this.suppressSelectionClick=!1,!0)}get gridScrollport(){return this.shadowRoot?.querySelector('[part="grid"]')??null}measureTooltip(){if(!this.gridScrollport)return;const tooltip=this.shadowRoot?.querySelector('[part="tooltip"]');if(!tooltip||tooltip.hidden)return;const view=this.ownerDocument.defaultView,gap=view?Math.abs(finiteNumber(Number.parseFloat(view.getComputedStyle(tooltip).marginBlockStart),0)):0,inline=tooltip.offsetWidth,block=tooltip.offsetHeight+gap;inline===this.tooltipSize.inline&&block===this.tooltipSize.block||(this.tooltipSize={inline,block},this.requestUpdate())}tooltipAnchor(pos){const rect=this.cellRect(pos),center=rect.x+rect.w/2,port=this.gridScrollport;if(!port)return{style:{left:`${center}px`,top:`${rect.y}px`},below:!1};const{inline,block}=this.tooltipSize,windowStart=port.scrollLeft+(this.freezesRowLabels?this.matrixPadLeft:0),windowEnd=port.scrollLeft+port.clientWidth,windowTop=port.scrollTop+(this.freezesColLabels?this.matrixPadTop:0),windowBottom=port.scrollTop+port.clientHeight,below=rect.y-block<windowTop&&rect.y+rect.h+block<=windowBottom;return{style:{left:`${Math.max(windowStart+inline/2,Math.min(center,windowEnd-inline/2))}px`,top:`${below?rect.y+rect.h:rect.y}px`},below}}scrollCellIntoView(pos){const port=this.gridScrollport;if(!port)return;const rect=this.cellRect(pos),bandInline=this.freezesRowLabels?this.matrixPadLeft:0,bandBlock=this.freezesColLabels?this.matrixPadTop:0,left=Math.min(Math.max(port.scrollLeft,rect.x+rect.w-port.clientWidth),rect.x-bandInline),top=Math.min(Math.max(port.scrollTop,rect.y+rect.h-port.clientHeight),rect.y-bandBlock);left!==port.scrollLeft&&(port.scrollLeft=left),top!==port.scrollTop&&(port.scrollTop=top)}samePos(a,b){return a===b?!0:!a||!b?!1:"week"in a&&"week"in b?a.week===b.week&&a.weekday===b.weekday:"row"in a&&"row"in b?a.row===b.row&&a.col===b.col:!1}onMatrixKeyDown(e){const rows=this.matrixRowLabels.length,cols=this.matrixColLabels.length;if(rows===0||cols===0)return;if(e.key==="Enter"||e.key===" "){e.preventDefault(),this.focusedCell&&this.emitCellClick(this.focusedCell,"keyboard");return}if(!ARROW_KEYS.has(e.key))return;if(e.preventDefault(),!this.focusedCell||!("row"in this.focusedCell)){const next2=this.firstInteractiveMatrixCell(rows,cols);if(!next2)return;this.focusedCell=next2,this.scrollCellIntoView(next2);return}const{row,col}=this.focusedCell;let dRow=0,dCol=0;e.key==="ArrowUp"?dRow=-1:e.key==="ArrowDown"?dRow=1:e.key==="ArrowLeft"?dCol=-1:e.key==="ArrowRight"&&(dCol=1);const next=this.nextInteractiveMatrixCell(row,col,dRow,dCol,rows,cols);this.focusedCell=next,this.scrollCellIntoView(next)}onCalendarKeyDown(e){const{weekCount}=this.cachedCalendarGrid;if(weekCount===0)return;if(e.key==="Enter"||e.key===" "){e.preventDefault(),this.focusedCell&&this.emitCellClick(this.focusedCell,"keyboard");return}if(!ARROW_KEYS.has(e.key))return;if(e.preventDefault(),!this.focusedCell||!("week"in this.focusedCell)){const next2=this.firstInteractiveCalendarCell(weekCount);if(!next2)return;this.focusedCell=next2;return}const{week,weekday}=this.focusedCell;let dWeek=0,dWeekday=0;e.key==="ArrowUp"?dWeekday=-1:e.key==="ArrowDown"?dWeekday=1:e.key==="ArrowLeft"?dWeek=-1:e.key==="ArrowRight"&&(dWeek=1);const next=this.nextInteractiveCalendarCell(week,weekday,dWeek,dWeekday,weekCount);this.focusedCell=next}resolveCanvasColor(value,cs){const cached=this.canvasColorCache.get(value);if(cached!==void 0)return cached;const fallback=this.noDataFill(cs);let candidate=value;if(value.includes("var(")){if(this.colorProbe||(this.colorProbe=this.ownerDocument.createElement("span"),this.colorProbe.style.cssText="position:absolute;width:0;height:0;overflow:hidden;visibility:hidden;pointer-events:none;",this.shadowRoot.appendChild(this.colorProbe)),this.colorProbe.style.color="",this.colorProbe.style.color=value,!this.colorProbe.style.color)return this.canvasColorCache.set(value,fallback),fallback;candidate=this.ownerDocument.defaultView?.getComputedStyle(this.colorProbe).color||fallback}const ctx=getScratchCtx(this.ownerDocument);if(!ctx)return fallback;ctx.fillStyle="rgb(1, 2, 3)";const firstSentinel=ctx.fillStyle;ctx.fillStyle=candidate;let resolved=ctx.fillStyle;if(resolved===firstSentinel){ctx.fillStyle="rgb(4, 5, 6)";const secondSentinel=ctx.fillStyle;ctx.fillStyle=candidate,resolved=ctx.fillStyle,resolved===secondSentinel&&(resolved=fallback)}return this.canvasColorCache.set(value,resolved),resolved}rebuildAccessiblePositions(){const positions=[];if(this.effectiveMode==="calendar"){const{weekCount}=this.cachedCalendarGrid;for(let week=0;week<weekCount;week++)for(let weekday=0;weekday<7;weekday++){const pos=this.calendarPos(week,weekday);this.isCellInteractive(pos)&&positions.push(pos)}}else for(let row=0;row<this.matrixRowLabels.length;row++)for(let col=0;col<this.matrixColLabels.length;col++){const pos={row,col};this.isCellInteractive(pos)&&positions.push(pos)}this.cachedAccessiblePositions=positions,this.cachedAccessiblePositionsByKey=new Map(positions.map(position=>[this.accessibleCellKey(position),position])),this.cachedAccessiblePositionIndexByKey=new Map(positions.map((position,index)=>[this.accessibleCellKey(position),index]))}accessibleCellPositions(){return this.cachedAccessiblePositions}accessibleCellKey(pos){return"week"in pos?`calendar-${pos.week}-${pos.weekday}`:`matrix-${pos.row}-${pos.col}`}accessibleCellIdentity(pos){return"week"in pos?pos.date:this.accessibleCellKey(pos)}accessibleCellAtKey(key){return this.cachedAccessiblePositionsByKey.get(key)??null}focusAccessibleCell(pos){pos&&this.updateComplete.then(()=>{[...this.shadowRoot?.querySelectorAll('[part="cell"]')??[]].find(candidate=>candidate.dataset.cellKey===this.accessibleCellKey(pos))?.focus()})}renderAccessibleCells(){if(!this.accessibleCells)return html``;const positions=this.accessibleCellPositions(),tabStop=this.focusedCell??positions[0]??null,focusIndex=tabStop?this.cachedAccessiblePositionIndexByKey.get(this.accessibleCellKey(tabStop))??0:0,start=Math.max(0,Math.min(Math.max(0,positions.length-MAX_ACCESSIBLE_HEATMAP_CELLS),focusIndex-Math.floor(MAX_ACCESSIBLE_HEATMAP_CELLS/2))),renderedPositions=positions.slice(start,start+MAX_ACCESSIBLE_HEATMAP_CELLS),renderedRows=new Map;for(const pos of renderedPositions){const rowIndex="week"in pos?pos.weekday+1:pos.row+1,row=renderedRows.get(rowIndex);row?row.push(pos):renderedRows.set(rowIndex,[pos])}const rowCount=this.effectiveMode==="calendar"?7:this.matrixRowLabels.length,colCount=this.effectiveMode==="calendar"?this.cachedCalendarGrid.weekCount:this.matrixColLabels.length;return html`
4
4
  <div
5
5
  part="cells"
6
6
  role="grid"
@@ -109,4 +109,4 @@ import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/co
109
109
  >
110
110
  ${this.withoutLegend?nothing:this.renderLegend(range)}
111
111
  </div>
112
- `}formatCount(value){return getNumberFormat(this.effectiveLocale).format(value)}}__decorate([property({attribute:!1})],LyraHeatmap.prototype,"data",void 0),__decorate([property({converter:labelExtentConverter,attribute:"row-label-width",reflect:!0})],LyraHeatmap.prototype,"rowLabelWidth",void 0),__decorate([property({converter:labelExtentConverter,attribute:"col-label-height"})],LyraHeatmap.prototype,"colLabelHeight",void 0),__decorate([property({type:Number,attribute:"col-label-rotation"})],LyraHeatmap.prototype,"colLabelRotation",void 0),__decorate([property({converter:STICKY_LABELS,attribute:"sticky-labels",reflect:!0})],LyraHeatmap.prototype,"stickyLabels",null),__decorate([property({type:Number,attribute:"cell-size",converter:optionalCellSizeConverter})],LyraHeatmap.prototype,"cellSize",null),__decorate([property({attribute:"value-label"})],LyraHeatmap.prototype,"valueLabel",void 0),__decorate([property({type:Boolean,attribute:"without-legend",reflect:!0})],LyraHeatmap.prototype,"withoutLegend",void 0),__decorate([property()],LyraHeatmap.prototype,"scale",void 0),__decorate([property({type:Number,attribute:"cell-gap-x"})],LyraHeatmap.prototype,"cellGapX",void 0),__decorate([property({type:Number,attribute:"cell-gap-y"})],LyraHeatmap.prototype,"cellGapY",void 0),__decorate([property({type:Number,attribute:"cell-radius"})],LyraHeatmap.prototype,"cellRadius",void 0),__decorate([property({type:Number,attribute:"col-label-interval"})],LyraHeatmap.prototype,"colLabelInterval",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"domain",void 0),__decorate([property({type:Number})],LyraHeatmap.prototype,"midpoint",void 0),__decorate([property({type:Boolean,attribute:"fit-to-width"})],LyraHeatmap.prototype,"fitToWidth",void 0),__decorate([property({type:Number,attribute:"max-cell-size",converter:optionalCellSizeConverter})],LyraHeatmap.prototype,"maxCellSize",null),__decorate([property({type:Number,attribute:"min-cell-size",converter:optionalCellSizeConverter})],LyraHeatmap.prototype,"minCellSize",null),__decorate([property({attribute:"bucket-count",converter:bucketCountConverter})],LyraHeatmap.prototype,"bucketCount",null),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"annotations",void 0),__decorate([property({attribute:!1,hasChanged:legendStopsChanged})],LyraHeatmap.prototype,"legendStops",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"selectedCell",void 0),__decorate([property({type:Boolean,reflect:!0})],LyraHeatmap.prototype,"multiple",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"selectedCells",void 0),__decorate([property({type:Boolean,attribute:"accessible-cells"})],LyraHeatmap.prototype,"accessibleCells",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"cellText",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"cellInteractive",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"cellColor",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"colorSteps",void 0),__decorate([query('[part="canvas"]')],LyraHeatmap.prototype,"canvas",void 0),__decorate([state()],LyraHeatmap.prototype,"hoverCell",void 0),__decorate([state()],LyraHeatmap.prototype,"focusedCell",void 0),__decorate([state()],LyraHeatmap.prototype,"liveText",void 0),__decorate([state()],LyraHeatmap.prototype,"accessibleTargetSizePx",void 0),__decorate([state()],LyraHeatmap.prototype,"selectionPreview",void 0);export{LyraHeatmap,MAX_ACCESSIBLE_HEATMAP_CELLS,MAX_BUCKET_COUNT,MAX_HEATMAP_CELLS,MAX_HEATMAP_DECORATIONS,hexToRgb,normalizeBucketCount,resolveRgb};
112
+ `}formatCount(value){return getNumberFormat(this.effectiveLocale).format(value)}}__decorate([property({attribute:!1})],LyraHeatmap.prototype,"data",void 0),__decorate([property({converter:labelExtentConverter,attribute:"row-label-width",reflect:!0})],LyraHeatmap.prototype,"rowLabelWidth",void 0),__decorate([property({converter:labelExtentConverter,attribute:"col-label-height"})],LyraHeatmap.prototype,"colLabelHeight",void 0),__decorate([property({type:Number,attribute:"col-label-rotation"})],LyraHeatmap.prototype,"colLabelRotation",void 0),__decorate([property({converter:STICKY_LABELS,attribute:"sticky-labels",reflect:!0})],LyraHeatmap.prototype,"stickyLabels",null),__decorate([property({type:Number,attribute:"cell-size",converter:optionalCellSizeConverter})],LyraHeatmap.prototype,"cellSize",null),__decorate([property({type:Number,attribute:"row-height",converter:optionalCellSizeConverter})],LyraHeatmap.prototype,"rowHeight",null),__decorate([property({attribute:"value-label"})],LyraHeatmap.prototype,"valueLabel",void 0),__decorate([property({type:Boolean,attribute:"without-legend",reflect:!0})],LyraHeatmap.prototype,"withoutLegend",void 0),__decorate([property()],LyraHeatmap.prototype,"scale",void 0),__decorate([property({type:Number,attribute:"cell-gap-x"})],LyraHeatmap.prototype,"cellGapX",void 0),__decorate([property({type:Number,attribute:"cell-gap-y"})],LyraHeatmap.prototype,"cellGapY",void 0),__decorate([property({type:Number,attribute:"cell-radius"})],LyraHeatmap.prototype,"cellRadius",void 0),__decorate([property({type:Number,attribute:"col-label-interval"})],LyraHeatmap.prototype,"colLabelInterval",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"domain",void 0),__decorate([property({type:Number})],LyraHeatmap.prototype,"midpoint",void 0),__decorate([property({type:Boolean,attribute:"fit-to-width"})],LyraHeatmap.prototype,"fitToWidth",void 0),__decorate([property({type:Number,attribute:"max-cell-size",converter:optionalCellSizeConverter})],LyraHeatmap.prototype,"maxCellSize",null),__decorate([property({type:Number,attribute:"min-cell-size",converter:optionalCellSizeConverter})],LyraHeatmap.prototype,"minCellSize",null),__decorate([property({attribute:"bucket-count",converter:bucketCountConverter})],LyraHeatmap.prototype,"bucketCount",null),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"annotations",void 0),__decorate([property({attribute:!1,hasChanged:legendStopsChanged})],LyraHeatmap.prototype,"legendStops",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"selectedCell",void 0),__decorate([property({type:Boolean,reflect:!0})],LyraHeatmap.prototype,"multiple",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"selectedCells",void 0),__decorate([property({type:Boolean,attribute:"accessible-cells"})],LyraHeatmap.prototype,"accessibleCells",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"cellText",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"cellInteractive",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"cellColor",void 0),__decorate([property({attribute:!1})],LyraHeatmap.prototype,"colorSteps",void 0),__decorate([query('[part="canvas"]')],LyraHeatmap.prototype,"canvas",void 0),__decorate([state()],LyraHeatmap.prototype,"hoverCell",void 0),__decorate([state()],LyraHeatmap.prototype,"focusedCell",void 0),__decorate([state()],LyraHeatmap.prototype,"liveText",void 0),__decorate([state()],LyraHeatmap.prototype,"accessibleTargetSizePx",void 0),__decorate([state()],LyraHeatmap.prototype,"selectionPreview",void 0);export{LyraHeatmap,MAX_ACCESSIBLE_HEATMAP_CELLS,MAX_BUCKET_COUNT,MAX_HEATMAP_CELLS,MAX_HEATMAP_DECORATIONS,hexToRgb,normalizeBucketCount,resolveRgb};
@@ -1 +1 @@
1
- import{css}from"lit";const styles=css`:host{--_lr-button-width:100%;--_lr-button-size-2xs:var(--lr-form-control-height-2xs);--_lr-button-size-xs:var(--lr-form-control-height-xs);--_lr-button-size-s:var(--lr-form-control-height-s);--_lr-button-size-m:var(--lr-form-control-height-m);--_lr-button-size-l:var(--lr-form-control-height-l);--_lr-button-size-xl:var(--lr-form-control-height-xl);--_lr-button-padding-block:var(--lr-form-control-padding-block);--_lr-button-padding-inline:var(--lr-form-control-padding-inline);--_lr-button-font-size:var(--lr-form-control-font-size);--_lr-button-min-height:var(--lr-button-size-m,var(--_lr-button-size-m));--_lr-button-gap:var(--lr-form-control-gap);--_lr-button-radius:var(--lr-radius-button);--_lr-button-caret-size:var(--lr-size-0-75em);--_lr-button-glass-accent:color-mix(in srgb, var(--lr-color-fill-loud), var(--lr-color-text) var(--_lr-glass-foreground-weight));--_lr-button-accent:var(--_lr-button-glass-accent,var(--lr-color-fill-loud));--_lr-button-fill:var(--lr-color-fill-quiet);--_lr-button-on-fill:var(--lr-color-on-quiet);--_lr-button-border:var(--lr-color-border-normal);--_lr-button-outlined-border:var(--lr-color-border-strong);--_lr-button-outlined-fill:transparent;--_lr-button-quiet-border:var(--lr-color-border);--_lr-button-quiet-text:var(--lr-color-text-quiet);--_lr-button-accent-fill:var(--lr-color-fill-loud);--_lr-button-accent-on-fill:var(--lr-color-on-loud);--_lr-button-resolved-color:var(--lr-button-on-fill,var(--_lr-button-on-fill));--_lr-button-resolved-border:var(--lr-button-border,var(--_lr-button-border));--_lr-button-hover-base:var(--lr-color-surface);--_lr-button-hover-background:color-mix(in oklab, var(--lr-button-hover-base,var(--_lr-button-hover-base)), var(--lr-color-mix-partner) var(--lr-color-mix-hover));--_lr-button-active-background:color-mix(in oklab, var(--lr-button-hover-base,var(--_lr-button-hover-base)), var(--lr-color-mix-partner) var(--lr-color-mix-active));min-inline-size:0;max-inline-size:100%;display:inline-block}:host([appearance=filled]),:host([appearance=filled-outlined]){--_lr-button-hover-base:var(--lr-button-fill,var(--_lr-button-fill))}:host([appearance=accent]){--_lr-button-hover-base:var(--lr-button-accent-fill,var(--_lr-button-accent-fill));--_lr-button-resolved-color:var(--lr-button-accent-on-fill,var(--_lr-button-accent-on-fill));--_lr-button-resolved-border:var(--lr-button-accent-fill,var(--_lr-button-accent-fill))}:host([outline]){--_lr-button-hover-base:var(--lr-color-surface)}:host([appearance=outlined]),:host([outline]){--_lr-button-resolved-color:var(--lr-button-accent,var(--_lr-button-accent));--_lr-button-resolved-border:var(--lr-button-outlined-border,var(--_lr-button-outlined-border))}:host([appearance=filled-outlined]){--_lr-button-resolved-border:var(--lr-button-outlined-border,var(--_lr-button-outlined-border))}:host([appearance=plain]){--_lr-button-resolved-color:var(--lr-button-accent,var(--_lr-button-accent));--_lr-button-resolved-border:transparent}:host([appearance=plain][variant]:not([variant=neutral])){--_lr-button-hover-color:color-mix(in oklab, var(--_lr-button-resolved-color), var(--lr-color-text) min(100%, calc(2 * var(--lr-color-mix-hover))));--_lr-button-active-color:color-mix(in oklab, var(--_lr-button-resolved-color), var(--lr-color-text) min(100%, calc(2 * var(--lr-color-mix-active))))}:host([appearance=quiet]){--_lr-button-resolved-color:var(--lr-button-quiet-color,var(--_lr-button-quiet-text));--_lr-button-resolved-border:var(--lr-button-quiet-border,var(--_lr-button-quiet-border))}:host(:not([variant])),:host([variant=neutral]){--_lr-button-accent:var(--lr-color-text)}:host([pill]),:host([circle]){--_lr-button-radius:var(--lr-radius-pill)}[part~=base]{box-sizing:border-box;inline-size:var(--lr-button-width,var(--_lr-button-width));min-inline-size:0;max-inline-size:100%;min-block-size:var(--lr-button-height,var(--lr-button-min-height,var(--_lr-button-min-height)));block-size:var(--lr-button-height,auto);align-items:center;justify-content:var(--lr-button-justify,center);gap:var(--lr-button-gap,var(--_lr-button-gap));padding-inline:var(--lr-button-padding-inline,var(--_lr-button-padding-inline));padding-block:var(--lr-button-padding-block,var(--_lr-button-padding-block));border-radius:var(--lr-button-radius,var(--_lr-button-radius));border:var(--lr-border-width-thin) solid var(--lr-button-border,var(--_lr-button-border));font:inherit;font-weight:var(--lr-font-weight-semibold);font-size:var(--lr-button-font-size,var(--_lr-button-font-size));cursor:pointer;box-shadow:var(--lr-button-shadow,none);text-decoration:none;display:inline-flex;position:relative}:host([appearance=filled]) [part~=base]{background:var(--lr-button-fill,var(--_lr-button-fill));color:var(--lr-button-on-fill,var(--_lr-button-on-fill))}:host([appearance=accent]) [part~=base]{background:var(--lr-button-accent-fill,var(--_lr-button-accent-fill));color:var(--lr-button-accent-on-fill,var(--_lr-button-accent-on-fill));border-color:var(--lr-button-accent-fill,var(--_lr-button-accent-fill))}:host([appearance=outlined]) [part~=base],:host([outline]) [part~=base]{background:var(--lr-button-outlined-fill,var(--_lr-button-outlined-fill));color:var(--lr-button-accent,var(--_lr-button-accent));border-color:var(--lr-button-outlined-border,var(--_lr-button-outlined-border))}:host([appearance=filled-outlined]) [part~=base]{background:var(--lr-button-fill,var(--_lr-button-fill));color:var(--lr-button-on-fill,var(--_lr-button-on-fill));border-color:var(--lr-button-outlined-border,var(--_lr-button-outlined-border))}:host([appearance=plain]) [part~=base]{color:var(--lr-button-accent,var(--_lr-button-accent));background:0 0;border-color:#0000}:host([appearance=quiet]) [part~=base]{color:var(--lr-button-quiet-color,var(--_lr-button-quiet-text));border-color:var(--lr-button-quiet-border,var(--_lr-button-quiet-border));background:0 0}[part~=base]:disabled,[part~=base][aria-disabled=true]{opacity:var(--lr-opacity-disabled);cursor:not-allowed}[part~=base]:not(:disabled,[aria-disabled=true]){transition:background-color var(--lr-transition-fast), color var(--lr-transition-fast), transform var(--lr-transition-fast)}[part~=base]:not(:disabled,[aria-disabled=true]):hover{background:var(--lr-button-hover-bg,var(--_lr-button-hover-background));color:var(--lr-button-hover-color,var(--_lr-button-hover-color,var(--_lr-button-resolved-color)));border-color:var(--lr-button-hover-border,var(--_lr-button-resolved-border))}[part~=base]:not(:disabled,[aria-disabled=true]):active{background:var(--lr-button-active-bg,var(--_lr-button-active-background));color:var(--lr-button-hover-color,var(--_lr-button-active-color,var(--_lr-button-resolved-color)));transform:scale(var(--lr-button-active-scale,.9875))}@media (prefers-reduced-motion:reduce){[part~=base]:not(:disabled,[aria-disabled=true]):active{transform:none}}[part~=base]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[part~=start],[part~=end]{text-overflow:ellipsis;white-space:nowrap;flex:none;align-items:center;min-inline-size:0;max-inline-size:40%;display:inline-flex;overflow:hidden}[part~=start] ::slotted(*),[part~=end] ::slotted(*){text-overflow:ellipsis;white-space:nowrap;min-inline-size:0;max-inline-size:100%;overflow:hidden}[part=label]{flex:var(--lr-button-label-grow,0) 1 auto;text-align:start;text-overflow:ellipsis;white-space:nowrap;min-inline-size:0;overflow:hidden}[part~=base][data-grow-label] [part=label]{flex-grow:var(--lr-button-label-grow,1)}:host([wrap]) [part=label]{text-overflow:clip;white-space:normal;overflow-wrap:anywhere;overflow:visible}[part~=start][hidden],[part~=end][hidden]{display:none}:host([circle]) [part~=base],[part~=base][data-icon-button]{inline-size:var(--lr-button-height,var(--lr-button-min-height,var(--_lr-button-min-height)));min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size);aspect-ratio:1;padding-inline:var(--lr-button-padding-block,var(--_lr-button-padding-block))}[part~=base][data-icon-button] [part=label]{overflow:visible}[part=caret]{font-size:var(--lr-button-caret-size,var(--_lr-button-caret-size));flex:none;align-items:center;display:inline-flex}[part=caret] svg{transform:rotate(90deg)}:host([size="2xs"]){--_lr-button-min-height:var(--lr-button-size-2xs,var(--_lr-button-size-2xs))}:host([size=xs]){--_lr-button-min-height:var(--lr-button-size-xs,var(--_lr-button-size-xs))}:host([size=s]),:host([size=small]){--_lr-button-min-height:var(--lr-button-size-s,var(--_lr-button-size-s))}:host([size=l]),:host([size=large]){--_lr-button-min-height:var(--lr-button-size-l,var(--_lr-button-size-l))}:host([size=xl]){--_lr-button-min-height:var(--lr-button-size-xl,var(--_lr-button-size-xl))}:host([appearance=link]) [part~=base]{block-size:auto;min-block-size:0;inline-size:auto;color:var(--lr-button-accent,var(--_lr-button-accent));font:inherit;text-underline-offset:var(--lr-size-0-15rem);box-shadow:none;background:0 0;border:0;border-radius:0;padding:0;text-decoration:underline}:host([appearance=link]) [part~=base]:not(:disabled,[aria-disabled=true]):hover{color:color-mix(in oklab, var(--lr-button-accent,var(--_lr-button-accent)), var(--lr-color-mix-partner) var(--lr-color-mix-hover));background:0 0}:host([appearance=link]) [part~=base]:not(:disabled,[aria-disabled=true]):active{color:color-mix(in oklab, var(--lr-button-accent,var(--_lr-button-accent)), var(--lr-color-mix-partner) var(--lr-color-mix-active));background:0 0}[part=spinner]{animation:var(--_lr-motion-animation,lr-button-spin var(--lr-button-spinner-duration,var(--lr-transition-ambient)) infinite);justify-content:center;align-items:center;display:inline-flex;position:absolute;inset:0}:host([loading]) [part~=start],:host([loading]) [part=label],:host([loading]) [part~=end],:host([loading]) [part=caret]{opacity:0}@keyframes lr-button-spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){[part=spinner]{animation-duration:var(--_lr-motion-duration,.001ms);animation-iteration-count:1}}`;export{styles};
1
+ import{css}from"lit";const styles=css`:host{--_lr-button-width:100%;--_lr-button-size-2xs:var(--lr-form-control-height-2xs);--_lr-button-size-xs:var(--lr-form-control-height-xs);--_lr-button-size-s:var(--lr-form-control-height-s);--_lr-button-size-m:var(--lr-form-control-height-m);--_lr-button-size-l:var(--lr-form-control-height-l);--_lr-button-size-xl:var(--lr-form-control-height-xl);--_lr-button-padding-block:var(--lr-form-control-padding-block);--_lr-button-padding-inline:var(--lr-form-control-padding-inline);--_lr-button-font-size:var(--lr-form-control-font-size);--_lr-button-min-height:var(--lr-button-size-m,var(--_lr-button-size-m));--_lr-button-gap:var(--lr-form-control-gap);--_lr-button-radius:var(--lr-radius-button);--_lr-button-caret-size:var(--lr-size-0-75em);--_lr-button-glass-accent:color-mix(in srgb, var(--lr-color-fill-loud), var(--lr-color-text) var(--_lr-glass-foreground-weight));--_lr-button-accent:var(--_lr-button-glass-accent,var(--lr-color-fill-loud));--_lr-button-fill:var(--lr-color-fill-quiet);--_lr-button-on-fill:var(--lr-color-on-quiet);--_lr-button-border:var(--lr-color-border-normal);--_lr-button-outlined-border:var(--lr-color-border-strong);--_lr-button-outlined-fill:transparent;--_lr-button-quiet-border:var(--lr-color-border);--_lr-button-quiet-text:var(--lr-color-text-quiet);--_lr-button-accent-fill:var(--lr-color-fill-loud);--_lr-button-accent-on-fill:var(--lr-color-on-loud);--_lr-button-resolved-color:var(--lr-button-on-fill,var(--_lr-button-on-fill));--_lr-button-resolved-border:var(--lr-button-border,var(--_lr-button-border));--_lr-button-hover-base:var(--lr-color-surface);--_lr-button-hover-background:color-mix(in oklab, var(--lr-button-hover-base,var(--_lr-button-hover-base)), var(--lr-color-mix-partner) var(--lr-color-mix-hover));--_lr-button-active-background:color-mix(in oklab, var(--lr-button-hover-base,var(--_lr-button-hover-base)), var(--lr-color-mix-partner) var(--lr-color-mix-active));min-inline-size:0;max-inline-size:100%;display:inline-block}:host([appearance=filled]),:host([appearance=filled-outlined]){--_lr-button-hover-base:var(--lr-button-fill,var(--_lr-button-fill))}:host([appearance=accent]){--_lr-button-hover-base:var(--lr-button-accent-fill,var(--_lr-button-accent-fill));--_lr-button-resolved-color:var(--lr-button-accent-on-fill,var(--_lr-button-accent-on-fill));--_lr-button-resolved-border:var(--lr-button-accent-fill,var(--_lr-button-accent-fill))}:host([outline]){--_lr-button-hover-base:var(--lr-color-surface)}:host([appearance=outlined]),:host([outline]){--_lr-button-resolved-color:var(--lr-button-accent,var(--_lr-button-accent));--_lr-button-resolved-border:var(--lr-button-outlined-border,var(--_lr-button-outlined-border))}:host([appearance=filled-outlined]){--_lr-button-resolved-border:var(--lr-button-outlined-border,var(--_lr-button-outlined-border))}:host([appearance=plain]){--_lr-button-resolved-color:var(--lr-button-accent,var(--_lr-button-accent));--_lr-button-resolved-border:transparent}:host([appearance=plain][variant]:not([variant=neutral])){--_lr-button-hover-color:color-mix(in oklab, var(--_lr-button-resolved-color), var(--lr-color-text) min(100%, calc(2 * var(--lr-color-mix-hover))));--_lr-button-active-color:color-mix(in oklab, var(--_lr-button-resolved-color), var(--lr-color-text) min(100%, calc(2 * var(--lr-color-mix-active))))}:host([appearance=quiet]){--_lr-button-resolved-color:var(--lr-button-quiet-color,var(--_lr-button-quiet-text));--_lr-button-resolved-border:var(--lr-button-quiet-border,var(--_lr-button-quiet-border))}:host(:not([variant])),:host([variant=neutral]){--_lr-button-accent:var(--lr-color-text)}:host([pill]),:host([circle]){--_lr-button-radius:var(--lr-radius-pill)}[part~=base]{box-sizing:border-box;inline-size:var(--lr-button-width,var(--_lr-button-width));min-inline-size:0;max-inline-size:100%;min-block-size:var(--lr-button-height,var(--lr-button-min-height,var(--_lr-button-min-height)));block-size:var(--lr-button-height,auto);align-items:center;justify-content:var(--lr-button-justify,center);gap:var(--lr-button-gap,var(--_lr-button-gap));padding-inline:var(--lr-button-padding-inline,var(--_lr-button-padding-inline));padding-block:var(--lr-button-padding-block,var(--_lr-button-padding-block));border-radius:var(--lr-button-radius,var(--_lr-button-radius));border:var(--lr-border-width-thin) solid var(--lr-button-border,var(--_lr-button-border));font:inherit;font-weight:var(--lr-font-weight-semibold);font-size:var(--lr-button-font-size,var(--_lr-button-font-size));cursor:pointer;box-shadow:var(--lr-button-shadow,none);text-decoration:none;display:inline-flex;position:relative}:host([appearance=filled]) [part~=base]{background:var(--lr-button-fill,var(--_lr-button-fill));color:var(--lr-button-on-fill,var(--_lr-button-on-fill))}:host([appearance=accent]) [part~=base]{background:var(--lr-button-accent-fill,var(--_lr-button-accent-fill));color:var(--lr-button-accent-on-fill,var(--_lr-button-accent-on-fill));border-color:var(--lr-button-accent-fill,var(--_lr-button-accent-fill))}:host([appearance=outlined]) [part~=base],:host([outline]) [part~=base]{background:var(--lr-button-outlined-fill,var(--_lr-button-outlined-fill));color:var(--lr-button-accent,var(--_lr-button-accent));border-color:var(--lr-button-outlined-border,var(--_lr-button-outlined-border))}:host([appearance=filled-outlined]) [part~=base]{background:var(--lr-button-fill,var(--_lr-button-fill));color:var(--lr-button-on-fill,var(--_lr-button-on-fill));border-color:var(--lr-button-outlined-border,var(--_lr-button-outlined-border))}:host([appearance=plain]) [part~=base]{color:var(--lr-button-accent,var(--_lr-button-accent));background:0 0;border-color:#0000}:host([appearance=quiet]) [part~=base]{color:var(--lr-button-quiet-color,var(--_lr-button-quiet-text));border-color:var(--lr-button-quiet-border,var(--_lr-button-quiet-border));background:0 0}[part~=base]:disabled,[part~=base][aria-disabled=true]{opacity:var(--lr-opacity-disabled);cursor:not-allowed}[part~=base]:not(:disabled,[aria-disabled=true]){transition:background-color var(--lr-transition-fast), color var(--lr-transition-fast), transform var(--lr-transition-fast)}[part~=base]:not(:disabled,[aria-disabled=true]):hover{background:var(--lr-button-hover-bg,var(--_lr-button-hover-background));color:var(--lr-button-hover-color,var(--_lr-button-hover-color,var(--_lr-button-resolved-color)));border-color:var(--lr-button-hover-border,var(--_lr-button-resolved-border))}[part~=base]:not(:disabled,[aria-disabled=true]):active{background:var(--lr-button-active-bg,var(--_lr-button-active-background));color:var(--lr-button-hover-color,var(--_lr-button-active-color,var(--_lr-button-resolved-color)));transform:scale(var(--lr-button-active-scale,.9875))}@media (prefers-reduced-motion:reduce){[part~=base]:not(:disabled,[aria-disabled=true]):active{transform:none}}[part~=base]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[part~=start],[part~=end]{text-overflow:ellipsis;white-space:nowrap;flex:none;align-items:center;min-inline-size:0;max-inline-size:40%;display:inline-flex;overflow:hidden}[part~=start] ::slotted(*),[part~=end] ::slotted(*){text-overflow:ellipsis;white-space:nowrap;min-inline-size:0;max-inline-size:100%;overflow:hidden}[part=label]{flex:var(--lr-button-label-grow,0) 1 auto;text-align:start;text-overflow:ellipsis;white-space:nowrap;min-inline-size:0;overflow:hidden}[part~=base][data-grow-label] [part=label]{flex-grow:var(--lr-button-label-grow,1)}:host([wrap]) [part=label]{text-overflow:clip;white-space:normal;overflow-wrap:anywhere;overflow:visible}[part~=start][hidden],[part~=end][hidden]{display:none}:host([circle]) [part~=base],[part~=base][data-icon-button]{inline-size:var(--lr-button-height,var(--lr-button-min-height,var(--_lr-button-min-height)));min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size);aspect-ratio:1;padding-inline:var(--lr-button-padding-block,var(--_lr-button-padding-block))}[part~=base][data-icon-button] [part=label]{overflow:visible}[part=caret]{font-size:var(--lr-button-caret-size,var(--_lr-button-caret-size));flex:none;align-items:center;display:inline-flex}[part=caret] svg{transform:rotate(90deg)}:host([size="2xs"]){--_lr-button-min-height:var(--lr-button-size-2xs,var(--_lr-button-size-2xs))}:host([size=xs]){--_lr-button-min-height:var(--lr-button-size-xs,var(--_lr-button-size-xs))}:host([size=s]),:host([size=small]){--_lr-button-min-height:var(--lr-button-size-s,var(--_lr-button-size-s))}:host([size=l]),:host([size=large]){--_lr-button-min-height:var(--lr-button-size-l,var(--_lr-button-size-l))}:host([size=xl]){--_lr-button-min-height:var(--lr-button-size-xl,var(--_lr-button-size-xl))}:host([appearance=link]) [part~=base]{block-size:auto;min-block-size:0;inline-size:auto;color:var(--lr-button-accent,var(--_lr-button-accent));font:inherit;text-underline-offset:var(--lr-size-0-15rem);box-shadow:none;background:0 0;border:0;border-radius:0;padding:0;text-decoration:underline}:host([appearance=link]) [part~=base]:not(:disabled,[aria-disabled=true]):hover{color:color-mix(in oklab, var(--lr-button-accent,var(--_lr-button-accent)), var(--lr-color-mix-partner) var(--lr-color-mix-hover));background:0 0}:host([appearance=link]) [part~=base]:not(:disabled,[aria-disabled=true]):active{color:color-mix(in oklab, var(--lr-button-accent,var(--_lr-button-accent)), var(--lr-color-mix-partner) var(--lr-color-mix-active));background:0 0}[part=spinner]{inline-size:var(--lr-size-1em);block-size:var(--lr-size-1em);animation:var(--_lr-motion-animation,lr-button-spin var(--lr-button-spinner-duration,var(--lr-transition-ambient)) infinite);justify-content:center;align-items:center;margin:auto;display:inline-flex;position:absolute;inset:0}:host([loading]) [part~=start],:host([loading]) [part=label],:host([loading]) [part~=end],:host([loading]) [part=caret]{opacity:0}@keyframes lr-button-spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){[part=spinner]{animation-duration:var(--_lr-motion-duration,.001ms);animation-iteration-count:1}}`;export{styles};
@@ -0,0 +1,48 @@
1
+ import{nothing,type PropertyValues,type TemplateResult}from'lit';import{LyraElement}from'../../internal/lyra-element.js';import{type FormSubmissionValue}from'../../internal/form-associated.js';import{type SelectionCatalogEntry,type SelectionCatalogRow}from'../../internal/selection-catalog.js';import type{PlaceStrategy}from'../../internal/positioner.js';import type{LyraSize}from'../../internal/variants.js';import type{LyraSelect}from'./select/select.class.js';import type{LyraCombobox}from'./combobox/combobox.class.js';import'./select/select.class.js';import'./combobox/combobox.class.js';import'./combobox/option.class.js';export interface LyraCatalogPickerChangeDetail{readonly value:string;readonly previousValue:string;}export interface LyraCatalogPickerEventMap{'lr-input':CustomEvent<LyraCatalogPickerChangeDetail>;'lr-change':CustomEvent<LyraCatalogPickerChangeDetail>;'lr-invalid':CustomEvent<null>;input:Event;change:Event;focus:FocusEvent;blur:FocusEvent;}type PickerControl=LyraSelect<false> |LyraCombobox<false>;declare class CatalogPickerElement extends LyraElement<LyraCatalogPickerEventMap>{}declare const LyraCatalogPickerBase_base:typeof CatalogPickerElement&(new(...args:any[])=>import("../../lyra.js").FormAssociatedInterface<string> &import("../../internal/form-associated.js").FormAssociatedSubclassInterface<string>);
2
+ /** Shared implementation for catalog selectors; not a registered custom element. */
3
+ export declare abstract class LyraCatalogPickerBase extends LyraCatalogPickerBase_base{static styles:import("lit").CSSResultGroup[];protected static collectionSupport:import("../../internal/lyra-element.js").LyraCollectionSupport;protected static readonly immutableEventDetails:readonly string[];
4
+ /** Visible field label; the label slot takes precedence. */
5
+ label:string;
6
+ /** Field guidance; the hint slot takes precedence. */
7
+ hint:string;
8
+ /** Validation guidance; the error slot takes precedence. */
9
+ errorText:string;
10
+ /** Empty display text; omission localizes Select, while an explicit empty string stays empty. */
11
+ placeholder?:string;
12
+ /** Host naming override, taking precedence over labels and external aria-labelledby. */
13
+ accessibleLabel:string|null;
14
+ /** Shared form-control size. */
15
+ size:LyraSize;
16
+ /** Show the supported clear action for a committed value. */
17
+ clearable:boolean;
18
+ /** Enable an editable filter; typing never commits a selection or a form value. */
19
+ searchable:boolean;
20
+ /** Place the popup in the browser top layer, including inside native dialogs. */
21
+ topLayer:boolean;
22
+ /** Explicit popup strategy; omission inherits --lr-positioning-strategy. */
23
+ positioningStrategy?:PlaceStrategy;
24
+ /** Native autocomplete guidance for the optional filter input. */
25
+ autocomplete:string;
26
+ /** Native input keyboard hint for the optional filter. */
27
+ inputMode:string;
28
+ /** Native enter-key hint for the optional filter. */
29
+ enterKeyHint:string;
30
+ /** Native spellchecking for the optional filter. */
31
+ spellcheck:boolean;
32
+ /** Native capitalization guidance for the optional filter. */
33
+ autocapitalize:string;private autocorrectValue;
34
+ /** Native autocorrection guidance for the optional filter; HTML accepts on/off.
35
+ * @default true */
36
+ get autocorrect():boolean;set autocorrect(next:boolean);protected abstract get entries():readonly SelectionCatalogEntry[];protected abstract get pickerLabel():string;protected abstract resolveRows():readonly SelectionCatalogRow[];protected normalizeValue(value:unknown):string;protected renderAdornment(_row:SelectionCatalogRow):TemplateResult|typeof nothing;private renderStart;
37
+ /** Committed catalog identifier. Programmatic writes are silent. */
38
+ get value():string;set value(next:string);
39
+ /** Normalized reset default; null removes the value attribute without restoring stale content. */
40
+ get defaultValue():string;set defaultValue(next:string|null);
41
+ /** Native filter input, or null in compact mode. Dispatch native input after direct value edits to refilter. */
42
+ get input():HTMLInputElement|null;private readonly slots;private labelLease?;private descriptionLease?;private validationChild?;private validationDocument?;private projectedAnchor?;private projectionToken;private restoreFocus;private replacingControl?;private focusReplacement?;private readonly validationController;private cachedEntries?;private cachedLocale?;private cachedRows?;protected get control():PickerControl|undefined;private get combobox();private get liveDisabled();private get rows();constructor();protected updateValidity():void;
43
+ /** Focus the visible trigger or optional filter when enabled. */
44
+ focus(options?:FocusOptions):void;
45
+ /** Blur the visible control. */
46
+ blur():void;
47
+ /** Activate the visible trigger or optional filter when enabled. */
48
+ click():void;private readonly onControlEvent;private readonly onControlFocus;private readonly onControlFocusOut;private readonly onControlKeyDown;private syncChildValue;private clearTransientState;private projectValidation;private syncRelationships;protected willUpdate(changed:PropertyValues):void;protected updated(changed:PropertyValues):void;connectedCallback():void;adoptedCallback():void;formResetCallback():void;formStateRestoreCallback(state:FormSubmissionValue,reason:'autocomplete'|'restore'):void;disconnectedCallback():void;render():TemplateResult;}export{};
@@ -0,0 +1,29 @@
1
+ import{__decorate}from"tslib";import{noChange,nothing}from"lit";import{html,unsafeStatic}from"lit/static-html.js";import{property}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{LyraElement}from"../../internal/lyra-element.js";import{FormAssociated,isBarredFromValidation}from"../../internal/form-associated.js";import{resolveValidityAnchor,SET_ANCHORED_VALIDITY,VALIDITY_ANCHOR}from"../../internal/anchored-validity.js";import{acquireResolvedAriaRelationship}from"../../internal/aria-controls.js";import{collectionSupport}from"../../internal/collection-snapshot.js";import{autocorrectConverter,spellcheckConverter}from"../../internal/converters.js";import{dispatchNativeEvent,relayNativeEvent}from"../../internal/native-event-relay.js";import{activeElementIn,deepActiveElementIn}from"../../internal/active-element.js";import{submitOnEnter}from"../../internal/submit-on-enter.js";import{SlotPresenceController}from"../../internal/slot-presence-controller.js";import{tag}from"../../internal/prefix.js";import{normalizeSelectionValue}from"../../internal/selection-catalog.js";import"./select/select.class.js";import"./combobox/combobox.class.js";import"./combobox/option.class.js";import{styles}from"./catalog-picker-base.styles.js";class CatalogPickerElement extends LyraElement{}const pickerSpellcheckConverter={...spellcheckConverter,fromAttribute:value=>value===null?!1:spellcheckConverter.fromAttribute(value,Boolean)};class LyraCatalogPickerBase extends FormAssociated(CatalogPickerElement){static{this.styles=[LyraElement.styles,styles]}static{this.collectionSupport=collectionSupport}static{this.immutableEventDetails=Object.freeze(["lr-input","lr-change"])}get autocorrect(){return this.autocorrectValue}set autocorrect(next){this.autocorrectValue=!!next,this.requestUpdate()}normalizeValue(value){return normalizeSelectionValue(value)}renderAdornment(_row){return nothing}renderStart(row){const content=this.renderAdornment(row);return content===nothing?nothing:html`<span slot="start">${content}</span>`}get value(){return super.value}set value(next){super.value=this.normalizeValue(next)}get defaultValue(){return super.defaultValue}set defaultValue(next){super.defaultValue=next===null?null:this.normalizeValue(next)}get input(){return this.searchable?this.combobox?.input??null:null}get control(){return this.renderRoot?.querySelector(`${tag("select")},${tag("combobox")}`)??void 0}get combobox(){return this.renderRoot?.querySelector(tag("combobox"))??void 0}get liveDisabled(){return this.effectiveDisabled||this.matches(":disabled")}get rows(){return(this.cachedEntries!==this.entries||this.cachedLocale!==this.effectiveLocale||!this.cachedRows)&&(this.cachedEntries=this.entries,this.cachedLocale=this.effectiveLocale,this.cachedRows=this.resolveRows()),this.cachedRows}constructor(){super(),this.label="",this.hint="",this.errorText="",this.accessibleLabel=null,this.size="m",this.clearable=!1,this.searchable=!1,this.topLayer=!1,this.autocomplete="off",this.inputMode="",this.enterKeyHint="",this.spellcheck=!1,this.autocapitalize="",this.autocorrectValue=!0,this.slots=new SlotPresenceController(this),this.projectionToken=0,this.restoreFocus=!1,this.validationController={hostUpdated:()=>this.projectValidation()},this.onControlEvent=event=>{const child=this.control;if(!child||event.target!==child||(event.stopPropagation(),event.type!=="lr-change"))return;const raw=event.detail.value,next=raw===null?"":raw;if(this.liveDisabled||typeof next!="string"||next&&!this.entries.some(row=>row.code===next&&!row.disabled)){this.syncChildValue(child);return}if(next===this.value)return;const previousValue=this.value;this.value=next;const detail={value:this.value,previousValue};dispatchNativeEvent(this,"input"),this.emit("lr-input",detail),dispatchNativeEvent(this,"change"),this.emit("lr-change",detail)},this.onControlFocus=event=>{event.target===this.control&&(event.stopPropagation(),this.replacingControl||relayNativeEvent(this,event))},this.onControlFocusOut=event=>{event.target===this.replacingControl&&event.stopPropagation()},this.onControlKeyDown=event=>{!this.liveDisabled&&this.searchable&&event.target===this.control&&event.composedPath()[0]===this.input&&submitOnEnter(this,event)},this.addEventListener("invalid",()=>this.projectValidation())}updateValidity(){this.internals&&(isBarredFromValidation(this,this.internals)?this[SET_ANCHORED_VALIDITY]({}):this.value&&!this.entries.some(row=>row.code===this.value&&!row.disabled)?this[SET_ANCHORED_VALIDITY]({customError:!0},this.localize("notInCatalog")):this.required&&!this.value?this[SET_ANCHORED_VALIDITY]({valueMissing:!0},this.localize("fieldRequired")):this[SET_ANCHORED_VALIDITY]({}))}[VALIDITY_ANCHOR](){return resolveValidityAnchor(this.control)??null}focus(options){this.liveDisabled||this.control?.focus(options)}blur(){this.control?.blur()}click(){this.liveDisabled||this.control?.click()}syncChildValue(child){child.value="inputValue"in child?this.value||null:this.value}clearTransientState(){const child=this.control;child&&(child.open=!1,child.formResetCallback(),this.syncChildValue(child))}projectValidation(){const child=this.validationChild;!child||!this.isConnected||child!==this.control||this.validationDocument!==this.ownerDocument||resolveValidityAnchor(child)?.setAttribute("aria-invalid",this.internals.states?.has("user-invalid")?"true":"false")}syncRelationships(){const anchor=this[VALIDITY_ANCHOR]();this.descriptionLease?this.descriptionLease.update(anchor):this.descriptionLease=acquireResolvedAriaRelationship(this,anchor,"aria-describedby"),this.accessibleLabel!==null?(this.labelLease?.release(),this.labelLease=void 0):this.labelLease?this.labelLease.update(anchor):this.labelLease=acquireResolvedAriaRelationship(this,anchor,"aria-labelledby"),anchor&&this.projectedAnchor!==anchor&&(this.projectedAnchor=anchor,this.requestUpdate())}willUpdate(changed){super.willUpdate(changed);const child=this.control;changed.has("searchable")&&child&&(this.replacingControl=child,this.restoreFocus=activeElementIn(this.shadowRoot)===child||this.focusReplacement===child,this.focusReplacement=void 0,this.clearTransientState())}updated(changed){super.updated(changed);const child=this.control;this.restoreFocus&&(this.focusReplacement=child),this.restoreFocus=!1,this.replacingControl=void 0,changed.has("positioningStrategy")&&child?.requestUpdate("positioningStrategy"),(this.validationChild!==child||this.validationDocument!==this.ownerDocument)&&(this.validationChild?.removeController(this.validationController),this.validationChild=child,this.validationDocument=this.ownerDocument,child?.addController(this.validationController)),this.projectValidation();const token=++this.projectionToken,document=this.ownerDocument;child&&child.updateComplete.then(()=>{if(!(token!==this.projectionToken||!this.isConnected||this.ownerDocument!==document||child!==this.control)&&(this.syncRelationships(),this.focusReplacement===child)){this.focusReplacement=void 0;const active=deepActiveElementIn(document);!this.liveDisabled&&(!active||active===document.body||active===this||active===child)&&(child.focus({preventScroll:!0}),child.hide())}})}connectedCallback(){super.connectedCallback(),this.requestUpdate()}adoptedCallback(){super.adoptedCallback(),this.requestUpdate()}formResetCallback(){super.formResetCallback(),this.clearTransientState(),this.projectValidation()}formStateRestoreCallback(state,reason){super.formStateRestoreCallback(state,reason),this.clearTransientState(),this.projectValidation()}disconnectedCallback(){++this.projectionToken,this.clearTransientState(),this.restoreFocus=!1,this.focusReplacement=void 0,this.replacingControl=void 0,this.validationChild?.removeController(this.validationController),this.validationChild=void 0,this.validationDocument=void 0,this.projectedAnchor=void 0,this.cachedEntries=void 0,this.cachedRows=void 0,this.cachedLocale=void 0,this.labelLease?.release(),this.labelLease=void 0,this.descriptionLease?.release(),this.descriptionLease=void 0,super.disconnectedCallback()}render(){const controlTag=unsafeStatic(tag(this.searchable?"combobox":"select")),optionTag=unsafeStatic(tag("option")),hasLabel=!!this.label||this.slots.has("label"),current=this.rows.find(row=>row.code===this.value),exportParts=["form-control,form-control-label",this.searchable?"combobox:select-trigger,combobox-input:select-display-input":"trigger:select-trigger,display-input:select-display-input","listbox:select-listbox,option:select-option,option-sub:select-option-sub,group-label:select-group-label,clear-button:select-clear-button,flag,hint,error"].join(",");return html`<${controlTag}
2
+ exportparts=${exportParts}
3
+ style=${styleMap({"--lr-positioning-strategy":this.positioningStrategy==="fixed"||this.positioningStrategy==="absolute"?this.positioningStrategy:void 0})}
4
+ .strings=${this.strings} .customError=${this.validity.valid?null:this.validationMessage}
5
+ .value=${this.searchable?this.value||null:this.value}
6
+ .label=${this.label} .hint=${this.hint} .errorText=${this.errorText}
7
+ .placeholder=${this.placeholder??this.localize("select")}
8
+ aria-label=${this.accessibleLabel??(hasLabel?nothing:this.pickerLabel)}
9
+ .required=${this.required} .disabled=${this.effectiveDisabled} .size=${this.size}
10
+ .clearable=${this.clearable} .topLayer=${this.topLayer}
11
+ .maxRender=${this.searchable?this.rows.length||1:noChange}
12
+ .autocomplete=${this.searchable?this.autocomplete:noChange}
13
+ .inputMode=${this.searchable?this.inputMode:noChange} .enterKeyHint=${this.searchable?this.enterKeyHint:noChange}
14
+ .spellcheck=${this.searchable?this.spellcheck:noChange}
15
+ .autocapitalize=${this.searchable?this.autocapitalize:noChange} .autocorrect=${this.searchable?this.autocorrect:noChange}
16
+ autocorrect=${this.searchable&&this.hasAttribute("autocorrect")?this.autocorrect?"on":"off":nothing}
17
+ @input=${this.onControlEvent} @lr-input=${this.onControlEvent} @lr-filter=${this.onControlEvent}
18
+ @change=${this.onControlEvent} @lr-change=${this.onControlEvent}
19
+ @focus=${this.onControlFocus} @blur=${this.onControlFocus} @focusout=${this.onControlFocusOut}
20
+ @keydown=${this.onControlKeyDown}
21
+ >${this.rows.map(row=>html`<${optionTag} .value=${row.code} .label=${row.label}
22
+ .sub=${[row.code,row.symbol].filter(text=>!!text&&text!==row.label).join(" · ")}
23
+ .searchText=${row.searchText} .group=${row.group??""} .disabled=${!!row.disabled}>
24
+ ${this.renderStart(row)}${row.label}</${optionTag}>`)}
25
+ ${current?this.renderStart(current):nothing}
26
+ ${this.slots.has("label")?html`<slot name="label" slot="label"></slot>`:nothing}
27
+ ${this.slots.has("hint")?html`<slot name="hint" slot="hint"></slot>`:nothing}
28
+ ${this.slots.has("error")?html`<slot name="error" slot="error"></slot>`:nothing}
29
+ </${controlTag}>`}}__decorate([property()],LyraCatalogPickerBase.prototype,"label",void 0),__decorate([property()],LyraCatalogPickerBase.prototype,"hint",void 0),__decorate([property({attribute:"error-text"})],LyraCatalogPickerBase.prototype,"errorText",void 0),__decorate([property()],LyraCatalogPickerBase.prototype,"placeholder",void 0),__decorate([property({attribute:"aria-label"})],LyraCatalogPickerBase.prototype,"accessibleLabel",void 0),__decorate([property({reflect:!0})],LyraCatalogPickerBase.prototype,"size",void 0),__decorate([property({type:Boolean})],LyraCatalogPickerBase.prototype,"clearable",void 0),__decorate([property({type:Boolean})],LyraCatalogPickerBase.prototype,"searchable",void 0),__decorate([property({type:Boolean,attribute:"top-layer"})],LyraCatalogPickerBase.prototype,"topLayer",void 0),__decorate([property({attribute:"positioning-strategy"})],LyraCatalogPickerBase.prototype,"positioningStrategy",void 0),__decorate([property()],LyraCatalogPickerBase.prototype,"autocomplete",void 0),__decorate([property({attribute:"inputmode"})],LyraCatalogPickerBase.prototype,"inputMode",void 0),__decorate([property({attribute:"enterkeyhint"})],LyraCatalogPickerBase.prototype,"enterKeyHint",void 0),__decorate([property({converter:pickerSpellcheckConverter,useDefault:!0})],LyraCatalogPickerBase.prototype,"spellcheck",void 0),__decorate([property()],LyraCatalogPickerBase.prototype,"autocapitalize",void 0),__decorate([property({converter:autocorrectConverter})],LyraCatalogPickerBase.prototype,"autocorrect",null);export{LyraCatalogPickerBase};
@@ -0,0 +1 @@
1
+ export declare const styles:import("lit").CSSResult;