@weeehaoooz/talos-ui 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/README.md +2 -0
  2. package/fesm2022/{weeehaoooz-talos-ui-button-button-group.mjs → weeehaoooz-talos-ui-button.mjs} +115 -18
  3. package/fesm2022/weeehaoooz-talos-ui-button.mjs.map +1 -0
  4. package/fesm2022/weeehaoooz-talos-ui-data-display.mjs +3110 -0
  5. package/fesm2022/weeehaoooz-talos-ui-data-display.mjs.map +1 -0
  6. package/fesm2022/weeehaoooz-talos-ui-data-viz.mjs +2414 -0
  7. package/fesm2022/weeehaoooz-talos-ui-data-viz.mjs.map +1 -0
  8. package/fesm2022/weeehaoooz-talos-ui-dropdown.mjs +1039 -0
  9. package/fesm2022/weeehaoooz-talos-ui-dropdown.mjs.map +1 -0
  10. package/fesm2022/weeehaoooz-talos-ui-feedback.mjs +2885 -0
  11. package/fesm2022/weeehaoooz-talos-ui-feedback.mjs.map +1 -0
  12. package/fesm2022/weeehaoooz-talos-ui-form.mjs +10799 -0
  13. package/fesm2022/weeehaoooz-talos-ui-form.mjs.map +1 -0
  14. package/fesm2022/weeehaoooz-talos-ui-layout.mjs +1320 -11
  15. package/fesm2022/weeehaoooz-talos-ui-layout.mjs.map +1 -1
  16. package/fesm2022/weeehaoooz-talos-ui-nav.mjs +119 -72
  17. package/fesm2022/weeehaoooz-talos-ui-nav.mjs.map +1 -1
  18. package/fesm2022/weeehaoooz-talos-ui.mjs +22190 -15213
  19. package/fesm2022/weeehaoooz-talos-ui.mjs.map +1 -1
  20. package/package.json +20 -135
  21. package/styles/_breadcrumb.scss +16 -0
  22. package/styles/_button-group.scss +156 -7
  23. package/styles/_buttons.scss +156 -8
  24. package/styles/_dropdown.scss +438 -0
  25. package/styles/_form-controls.scss +13 -0
  26. package/styles/_progress-bar.scss +43 -0
  27. package/styles/_skeleton.scss +176 -0
  28. package/styles/_spinner.scss +58 -0
  29. package/styles/_variables.scss +37 -0
  30. package/styles/index.scss +6 -1
  31. package/types/weeehaoooz-talos-ui-button.d.ts +92 -0
  32. package/types/weeehaoooz-talos-ui-button.d.ts.map +1 -0
  33. package/types/weeehaoooz-talos-ui-data-display.d.ts +1018 -0
  34. package/types/weeehaoooz-talos-ui-data-display.d.ts.map +1 -0
  35. package/types/weeehaoooz-talos-ui-data-viz.d.ts +839 -0
  36. package/types/weeehaoooz-talos-ui-data-viz.d.ts.map +1 -0
  37. package/types/weeehaoooz-talos-ui-dropdown.d.ts +187 -0
  38. package/types/weeehaoooz-talos-ui-dropdown.d.ts.map +1 -0
  39. package/types/weeehaoooz-talos-ui-feedback.d.ts +1495 -0
  40. package/types/weeehaoooz-talos-ui-feedback.d.ts.map +1 -0
  41. package/types/weeehaoooz-talos-ui-form.d.ts +2639 -0
  42. package/types/weeehaoooz-talos-ui-form.d.ts.map +1 -0
  43. package/types/weeehaoooz-talos-ui-layout.d.ts +851 -3
  44. package/types/weeehaoooz-talos-ui-layout.d.ts.map +1 -1
  45. package/types/weeehaoooz-talos-ui-nav.d.ts +36 -10
  46. package/types/weeehaoooz-talos-ui-nav.d.ts.map +1 -1
  47. package/types/weeehaoooz-talos-ui.d.ts +6949 -4137
  48. package/types/weeehaoooz-talos-ui.d.ts.map +1 -1
  49. package/fesm2022/weeehaoooz-talos-ui-button-button-group.mjs.map +0 -1
  50. package/fesm2022/weeehaoooz-talos-ui-button-button.mjs +0 -93
  51. package/fesm2022/weeehaoooz-talos-ui-button-button.mjs.map +0 -1
  52. package/fesm2022/weeehaoooz-talos-ui-data-display-badge.mjs +0 -233
  53. package/fesm2022/weeehaoooz-talos-ui-data-display-badge.mjs.map +0 -1
  54. package/fesm2022/weeehaoooz-talos-ui-data-display-status-tag.mjs +0 -361
  55. package/fesm2022/weeehaoooz-talos-ui-data-display-status-tag.mjs.map +0 -1
  56. package/fesm2022/weeehaoooz-talos-ui-data-display-timeline.mjs +0 -312
  57. package/fesm2022/weeehaoooz-talos-ui-data-display-timeline.mjs.map +0 -1
  58. package/fesm2022/weeehaoooz-talos-ui-data-display-trend-indicator.mjs +0 -235
  59. package/fesm2022/weeehaoooz-talos-ui-data-display-trend-indicator.mjs.map +0 -1
  60. package/fesm2022/weeehaoooz-talos-ui-data-viz-category-bar.mjs +0 -462
  61. package/fesm2022/weeehaoooz-talos-ui-data-viz-category-bar.mjs.map +0 -1
  62. package/fesm2022/weeehaoooz-talos-ui-data-viz-heatmap.mjs +0 -805
  63. package/fesm2022/weeehaoooz-talos-ui-data-viz-heatmap.mjs.map +0 -1
  64. package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-donut.mjs +0 -267
  65. package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-donut.mjs.map +0 -1
  66. package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-gauge.mjs +0 -351
  67. package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-gauge.mjs.map +0 -1
  68. package/fesm2022/weeehaoooz-talos-ui-data-viz-sparkline.mjs +0 -566
  69. package/fesm2022/weeehaoooz-talos-ui-data-viz-sparkline.mjs.map +0 -1
  70. package/fesm2022/weeehaoooz-talos-ui-feedback-alert.mjs +0 -534
  71. package/fesm2022/weeehaoooz-talos-ui-feedback-alert.mjs.map +0 -1
  72. package/fesm2022/weeehaoooz-talos-ui-feedback-dialog.mjs +0 -446
  73. package/fesm2022/weeehaoooz-talos-ui-feedback-dialog.mjs.map +0 -1
  74. package/fesm2022/weeehaoooz-talos-ui-feedback-snackbar.mjs +0 -376
  75. package/fesm2022/weeehaoooz-talos-ui-feedback-snackbar.mjs.map +0 -1
  76. package/fesm2022/weeehaoooz-talos-ui-feedback-tooltip.mjs +0 -147
  77. package/fesm2022/weeehaoooz-talos-ui-feedback-tooltip.mjs.map +0 -1
  78. package/fesm2022/weeehaoooz-talos-ui-form-affix.mjs +0 -242
  79. package/fesm2022/weeehaoooz-talos-ui-form-affix.mjs.map +0 -1
  80. package/fesm2022/weeehaoooz-talos-ui-form-autocomplete.mjs +0 -514
  81. package/fesm2022/weeehaoooz-talos-ui-form-autocomplete.mjs.map +0 -1
  82. package/fesm2022/weeehaoooz-talos-ui-form-checkbox.mjs +0 -548
  83. package/fesm2022/weeehaoooz-talos-ui-form-checkbox.mjs.map +0 -1
  84. package/fesm2022/weeehaoooz-talos-ui-form-chips.mjs +0 -692
  85. package/fesm2022/weeehaoooz-talos-ui-form-chips.mjs.map +0 -1
  86. package/fesm2022/weeehaoooz-talos-ui-form-color-picker.mjs +0 -761
  87. package/fesm2022/weeehaoooz-talos-ui-form-color-picker.mjs.map +0 -1
  88. package/fesm2022/weeehaoooz-talos-ui-form-date-picker.mjs +0 -896
  89. package/fesm2022/weeehaoooz-talos-ui-form-date-picker.mjs.map +0 -1
  90. package/fesm2022/weeehaoooz-talos-ui-form-date-range-picker.mjs +0 -872
  91. package/fesm2022/weeehaoooz-talos-ui-form-date-range-picker.mjs.map +0 -1
  92. package/fesm2022/weeehaoooz-talos-ui-form-date-time-picker.mjs +0 -119
  93. package/fesm2022/weeehaoooz-talos-ui-form-date-time-picker.mjs.map +0 -1
  94. package/fesm2022/weeehaoooz-talos-ui-form-date-time-range-picker.mjs +0 -135
  95. package/fesm2022/weeehaoooz-talos-ui-form-date-time-range-picker.mjs.map +0 -1
  96. package/fesm2022/weeehaoooz-talos-ui-form-drop-zone.mjs +0 -666
  97. package/fesm2022/weeehaoooz-talos-ui-form-drop-zone.mjs.map +0 -1
  98. package/fesm2022/weeehaoooz-talos-ui-form-form-field.mjs +0 -147
  99. package/fesm2022/weeehaoooz-talos-ui-form-form-field.mjs.map +0 -1
  100. package/fesm2022/weeehaoooz-talos-ui-form-input.mjs +0 -33
  101. package/fesm2022/weeehaoooz-talos-ui-form-input.mjs.map +0 -1
  102. package/fesm2022/weeehaoooz-talos-ui-form-otp.mjs +0 -455
  103. package/fesm2022/weeehaoooz-talos-ui-form-otp.mjs.map +0 -1
  104. package/fesm2022/weeehaoooz-talos-ui-form-password-input.mjs +0 -379
  105. package/fesm2022/weeehaoooz-talos-ui-form-password-input.mjs.map +0 -1
  106. package/fesm2022/weeehaoooz-talos-ui-form-radio.mjs +0 -297
  107. package/fesm2022/weeehaoooz-talos-ui-form-radio.mjs.map +0 -1
  108. package/fesm2022/weeehaoooz-talos-ui-form-range-input.mjs +0 -661
  109. package/fesm2022/weeehaoooz-talos-ui-form-range-input.mjs.map +0 -1
  110. package/fesm2022/weeehaoooz-talos-ui-form-rating.mjs +0 -346
  111. package/fesm2022/weeehaoooz-talos-ui-form-rating.mjs.map +0 -1
  112. package/fesm2022/weeehaoooz-talos-ui-form-select-input.mjs +0 -896
  113. package/fesm2022/weeehaoooz-talos-ui-form-select-input.mjs.map +0 -1
  114. package/fesm2022/weeehaoooz-talos-ui-form-slide-toggle.mjs +0 -252
  115. package/fesm2022/weeehaoooz-talos-ui-form-slide-toggle.mjs.map +0 -1
  116. package/fesm2022/weeehaoooz-talos-ui-form-transfer-list.mjs +0 -916
  117. package/fesm2022/weeehaoooz-talos-ui-form-transfer-list.mjs.map +0 -1
  118. package/types/weeehaoooz-talos-ui-button-button-group.d.ts +0 -59
  119. package/types/weeehaoooz-talos-ui-button-button-group.d.ts.map +0 -1
  120. package/types/weeehaoooz-talos-ui-button-button.d.ts +0 -38
  121. package/types/weeehaoooz-talos-ui-button-button.d.ts.map +0 -1
  122. package/types/weeehaoooz-talos-ui-data-display-badge.d.ts +0 -119
  123. package/types/weeehaoooz-talos-ui-data-display-badge.d.ts.map +0 -1
  124. package/types/weeehaoooz-talos-ui-data-display-status-tag.d.ts +0 -135
  125. package/types/weeehaoooz-talos-ui-data-display-status-tag.d.ts.map +0 -1
  126. package/types/weeehaoooz-talos-ui-data-display-timeline.d.ts +0 -144
  127. package/types/weeehaoooz-talos-ui-data-display-timeline.d.ts.map +0 -1
  128. package/types/weeehaoooz-talos-ui-data-display-trend-indicator.d.ts +0 -83
  129. package/types/weeehaoooz-talos-ui-data-display-trend-indicator.d.ts.map +0 -1
  130. package/types/weeehaoooz-talos-ui-data-viz-category-bar.d.ts +0 -255
  131. package/types/weeehaoooz-talos-ui-data-viz-category-bar.d.ts.map +0 -1
  132. package/types/weeehaoooz-talos-ui-data-viz-heatmap.d.ts +0 -204
  133. package/types/weeehaoooz-talos-ui-data-viz-heatmap.d.ts.map +0 -1
  134. package/types/weeehaoooz-talos-ui-data-viz-mini-donut.d.ts +0 -101
  135. package/types/weeehaoooz-talos-ui-data-viz-mini-donut.d.ts.map +0 -1
  136. package/types/weeehaoooz-talos-ui-data-viz-mini-gauge.d.ts +0 -138
  137. package/types/weeehaoooz-talos-ui-data-viz-mini-gauge.d.ts.map +0 -1
  138. package/types/weeehaoooz-talos-ui-data-viz-sparkline.d.ts +0 -161
  139. package/types/weeehaoooz-talos-ui-data-viz-sparkline.d.ts.map +0 -1
  140. package/types/weeehaoooz-talos-ui-feedback-alert.d.ts +0 -212
  141. package/types/weeehaoooz-talos-ui-feedback-alert.d.ts.map +0 -1
  142. package/types/weeehaoooz-talos-ui-feedback-dialog.d.ts +0 -259
  143. package/types/weeehaoooz-talos-ui-feedback-dialog.d.ts.map +0 -1
  144. package/types/weeehaoooz-talos-ui-feedback-snackbar.d.ts +0 -147
  145. package/types/weeehaoooz-talos-ui-feedback-snackbar.d.ts.map +0 -1
  146. package/types/weeehaoooz-talos-ui-feedback-tooltip.d.ts +0 -32
  147. package/types/weeehaoooz-talos-ui-feedback-tooltip.d.ts.map +0 -1
  148. package/types/weeehaoooz-talos-ui-form-affix.d.ts +0 -88
  149. package/types/weeehaoooz-talos-ui-form-affix.d.ts.map +0 -1
  150. package/types/weeehaoooz-talos-ui-form-autocomplete.d.ts +0 -113
  151. package/types/weeehaoooz-talos-ui-form-autocomplete.d.ts.map +0 -1
  152. package/types/weeehaoooz-talos-ui-form-checkbox.d.ts +0 -165
  153. package/types/weeehaoooz-talos-ui-form-checkbox.d.ts.map +0 -1
  154. package/types/weeehaoooz-talos-ui-form-chips.d.ts +0 -152
  155. package/types/weeehaoooz-talos-ui-form-chips.d.ts.map +0 -1
  156. package/types/weeehaoooz-talos-ui-form-color-picker.d.ts +0 -144
  157. package/types/weeehaoooz-talos-ui-form-color-picker.d.ts.map +0 -1
  158. package/types/weeehaoooz-talos-ui-form-date-picker.d.ts +0 -138
  159. package/types/weeehaoooz-talos-ui-form-date-picker.d.ts.map +0 -1
  160. package/types/weeehaoooz-talos-ui-form-date-range-picker.d.ts +0 -148
  161. package/types/weeehaoooz-talos-ui-form-date-range-picker.d.ts.map +0 -1
  162. package/types/weeehaoooz-talos-ui-form-date-time-picker.d.ts +0 -44
  163. package/types/weeehaoooz-talos-ui-form-date-time-picker.d.ts.map +0 -1
  164. package/types/weeehaoooz-talos-ui-form-date-time-range-picker.d.ts +0 -48
  165. package/types/weeehaoooz-talos-ui-form-date-time-range-picker.d.ts.map +0 -1
  166. package/types/weeehaoooz-talos-ui-form-drop-zone.d.ts +0 -227
  167. package/types/weeehaoooz-talos-ui-form-drop-zone.d.ts.map +0 -1
  168. package/types/weeehaoooz-talos-ui-form-form-field.d.ts +0 -42
  169. package/types/weeehaoooz-talos-ui-form-form-field.d.ts.map +0 -1
  170. package/types/weeehaoooz-talos-ui-form-input.d.ts +0 -15
  171. package/types/weeehaoooz-talos-ui-form-input.d.ts.map +0 -1
  172. package/types/weeehaoooz-talos-ui-form-otp.d.ts +0 -111
  173. package/types/weeehaoooz-talos-ui-form-otp.d.ts.map +0 -1
  174. package/types/weeehaoooz-talos-ui-form-password-input.d.ts +0 -145
  175. package/types/weeehaoooz-talos-ui-form-password-input.d.ts.map +0 -1
  176. package/types/weeehaoooz-talos-ui-form-radio.d.ts +0 -84
  177. package/types/weeehaoooz-talos-ui-form-radio.d.ts.map +0 -1
  178. package/types/weeehaoooz-talos-ui-form-range-input.d.ts +0 -181
  179. package/types/weeehaoooz-talos-ui-form-range-input.d.ts.map +0 -1
  180. package/types/weeehaoooz-talos-ui-form-rating.d.ts +0 -110
  181. package/types/weeehaoooz-talos-ui-form-rating.d.ts.map +0 -1
  182. package/types/weeehaoooz-talos-ui-form-select-input.d.ts +0 -195
  183. package/types/weeehaoooz-talos-ui-form-select-input.d.ts.map +0 -1
  184. package/types/weeehaoooz-talos-ui-form-slide-toggle.d.ts +0 -79
  185. package/types/weeehaoooz-talos-ui-form-slide-toggle.d.ts.map +0 -1
  186. package/types/weeehaoooz-talos-ui-form-transfer-list.d.ts +0 -192
  187. package/types/weeehaoooz-talos-ui-form-transfer-list.d.ts.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"weeehaoooz-talos-ui-data-viz-heatmap.mjs","sources":["../../../projects/talos-ui/data-viz/heatmap/heatmap.component.ts","../../../projects/talos-ui/data-viz/heatmap/heatmap.component.html","../../../projects/talos-ui/data-viz/heatmap/heatmap.module.ts","../../../projects/talos-ui/data-viz/heatmap/weeehaoooz-talos-ui-data-viz-heatmap.ts"],"sourcesContent":["import {\n Component,\n ElementRef,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n LucideRefreshCw,\n LucideUpload,\n LucideMaximize2,\n LucideMinimize2,\n LucideChevronDown,\n LucideCheck,\n LucideFileSpreadsheet,\n LucideFileJson,\n LucideCalendar,\n LucideClock,\n LucideArrowLeftRight\n} from '@lucide/angular';\nimport {\n addDays,\n addWeeks,\n endOfDay,\n endOfISOWeek,\n isBefore,\n isSameDay,\n isValid,\n startOfDay,\n startOfISOWeek,\n subWeeks\n} from 'date-fns';\nimport { formatDate } from '@weeehaoooz/talos-ui/core';\nimport { DateRangePickerComponent } from '@weeehaoooz/talos-ui/form/date-range-picker';\nimport type { DateRangePreset, DateRangeValue } from '@weeehaoooz/talos-ui/form/date-range-picker';\nimport { TalosTooltipDirective } from '@weeehaoooz/talos-ui/feedback/tooltip';\nimport {\n HeatmapCell,\n HeatmapCellClickEvent,\n HeatmapCellShape,\n HeatmapCellSize,\n HeatmapColorScheme,\n HeatmapDataInput,\n HeatmapDataPoint,\n HeatmapExportFormat,\n HeatmapInterval,\n HeatmapMatrixData,\n HeatmapMetric,\n HeatmapTimeFormat,\n HeatmapTimeRange,\n HeatmapTimestampData\n} from './heatmap.types';\n\nconst DEFAULT_DAYS = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];\n\ninterface ColorStop {\n r: number;\n g: number;\n b: number;\n}\n\nconst PALETTE_CONFIG: Record<\n HeatmapColorScheme,\n { zero: { bg: string; text: string }; min: ColorStop; max: ColorStop; gradientCss: string }\n> = {\n indigo: {\n zero: { bg: '#eef2ff', text: '#4338ca' },\n min: { r: 219, g: 228, b: 255 }, // #dbe4ff\n max: { r: 67, g: 56, b: 202 }, // #4338ca\n gradientCss: 'linear-gradient(90deg, #dbe4ff 0%, #818cf8 50%, #4338ca 100%)'\n },\n blue: {\n zero: { bg: '#eff6ff', text: '#1d4ed8' },\n min: { r: 219, g: 234, b: 254 }, // #dbeafe\n max: { r: 29, g: 78, b: 216 }, // #1d4ed8\n gradientCss: 'linear-gradient(90deg, #dbeafe 0%, #60a5fa 50%, #1d4ed8 100%)'\n },\n emerald: {\n zero: { bg: '#ecfdf5', text: '#047857' },\n min: { r: 209, g: 250, b: 229 }, // #d1fae5\n max: { r: 4, g: 120, b: 87 }, // #047857\n gradientCss: 'linear-gradient(90deg, #d1fae5 0%, #34d399 50%, #047857 100%)'\n },\n rose: {\n zero: { bg: '#fff1f2', text: '#be123c' },\n min: { r: 255, g: 228, b: 230 }, // #ffe4e6\n max: { r: 190, g: 18, b: 60 }, // #be123c\n gradientCss: 'linear-gradient(90deg, #ffe4e6 0%, #fb7185 50%, #be123c 100%)'\n },\n amber: {\n zero: { bg: '#fffbeb', text: '#b45309' },\n min: { r: 254, g: 243, b: 199 }, // #fef3c7\n max: { r: 180, g: 83, b: 9 }, // #b45309\n gradientCss: 'linear-gradient(90deg, #fef3c7 0%, #fbbf24 50%, #b45309 100%)'\n },\n violet: {\n zero: { bg: '#f5f3ff', text: '#6d28d9' },\n min: { r: 237, g: 233, b: 254 }, // #ede9fe\n max: { r: 109, g: 40, b: 217 }, // #6d28d9\n gradientCss: 'linear-gradient(90deg, #ede9fe 0%, #a78bfa 50%, #6d28d9 100%)'\n },\n slate: {\n zero: { bg: '#f8fafc', text: '#334155' },\n min: { r: 226, g: 232, b: 240 }, // #e2e8f0\n max: { r: 51, g: 65, b: 85 }, // #334155\n gradientCss: 'linear-gradient(90deg, #e2e8f0 0%, #94a3b8 50%, #334155 100%)'\n },\n custom: {\n zero: { bg: '#eef2ff', text: '#4338ca' },\n min: { r: 219, g: 228, b: 255 },\n max: { r: 67, g: 56, b: 202 },\n gradientCss: 'linear-gradient(90deg, #dbe4ff 0%, #4338ca 100%)'\n }\n};\n\n@Component({\n selector: 'talos-heatmap',\n imports: [\n FormsModule,\n DateRangePickerComponent,\n TalosTooltipDirective,\n LucideRefreshCw,\n LucideUpload,\n LucideMaximize2,\n LucideMinimize2,\n LucideChevronDown,\n LucideCheck,\n LucideFileSpreadsheet,\n LucideFileJson,\n LucideCalendar,\n LucideClock,\n LucideArrowLeftRight\n ],\n templateUrl: './heatmap.component.html',\n styleUrl: './heatmap.component.scss',\n host: {\n 'class': 'talos-heatmap',\n '[class.talos-heatmap-expanded]': 'isExpanded()',\n '[class.talos-heatmap-loading]': 'loading()',\n '[class.talos-heatmap-sm]': 'cellSize() === \"sm\"',\n '[class.talos-heatmap-md]': 'cellSize() === \"md\"',\n '[class.talos-heatmap-lg]': 'cellSize() === \"lg\"',\n '[class.talos-heatmap-pill]': 'cellShape() === \"pill\"',\n '[class.talos-heatmap-rounded]': 'cellShape() === \"rounded\"',\n '[class.talos-heatmap-square]': 'cellShape() === \"square\"',\n '[class.talos-heatmap-fit-width]': 'isFitWidth()',\n '[class.talos-heatmap-compact-square]': '!isFitWidth()',\n '[class.talos-heatmap-swapped-axes]': 'swapAxes()',\n '[attr.role]': '\"region\"',\n '[attr.aria-label]': 'title()'\n }\n})\nexport class TalosHeatmapComponent {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n // Inputs & Models\n readonly data = input<HeatmapDataInput>([]);\n readonly metrics = input<HeatmapMetric[]>([]);\n readonly selectedMetricId = model<string | undefined>(undefined);\n readonly interval = model<HeatmapInterval>('hour');\n readonly dateRange = model<DateRangeValue | null>(null);\n readonly swapAxes = model<boolean>(false);\n readonly title = input<string>('Busiest times');\n readonly hoursRange = input<[number, number]>([9, 17]);\n readonly timeFormat = input<HeatmapTimeFormat>('12h');\n readonly days = input<string[]>(DEFAULT_DAYS);\n readonly colorScheme = input<HeatmapColorScheme>('indigo');\n readonly customColorStops = input<[string, string] | undefined>(undefined);\n readonly showLegend = input<boolean>(true);\n readonly showValues = input<boolean>(true);\n readonly cellShape = input<HeatmapCellShape>('pill');\n readonly cellSize = input<HeatmapCellSize>('md');\n readonly fitWidth = input<boolean | undefined>(undefined);\n readonly loading = input<boolean>(false);\n readonly showToolbar = input<boolean>(true);\n readonly showRefresh = input<boolean>(true);\n readonly showExport = input<boolean>(true);\n readonly showExpand = input<boolean>(true);\n readonly showSwapAxes = input<boolean>(false);\n readonly showIntervalToggle = input<boolean>(false);\n readonly showDateRangePicker = input<boolean>(false);\n readonly dateRangePresets = input<DateRangePreset[] | null>(null);\n readonly unit = input<string>('');\n readonly maxValue = input<number | undefined>(undefined);\n readonly minValue = input<number | undefined>(undefined);\n\n // Outputs\n readonly cellClick = output<HeatmapCellClickEvent>();\n readonly cellHover = output<HeatmapCell | null>();\n readonly timeRangeChange = output<HeatmapTimeRange>();\n readonly refresh = output<void>();\n readonly metricChange = output<HeatmapMetric>();\n readonly export = output<{ format: HeatmapExportFormat; data: unknown }>();\n\n // State signals\n readonly isExpanded = signal<boolean>(false);\n readonly isMetricDropdownOpen = signal<boolean>(false);\n readonly isExportDropdownOpen = signal<boolean>(false);\n readonly hoveredCell = signal<HeatmapCell | null>(null);\n readonly focusedCoord = signal<{ colIndex: number; rowIndex: number } | null>(null);\n\n // Layout Fit computation\n readonly isFitWidth = computed<boolean>(() => {\n const fw = this.fitWidth();\n if (fw !== undefined) return fw;\n return this.cellShape() !== 'square';\n });\n\n // Active Metric computation\n readonly currentMetric = computed<HeatmapMetric | undefined>(() => {\n const list = this.metrics();\n if (!list || list.length === 0) return undefined;\n const selectedId = this.selectedMetricId();\n if (selectedId) {\n const found = list.find((m) => m.id === selectedId);\n if (found) return found;\n }\n return list[0];\n });\n\n // Effective Active Color Scheme\n readonly activeColorScheme = computed<HeatmapColorScheme>(() => {\n const metric = this.currentMetric();\n if (metric && metric.colorScheme) return metric.colorScheme;\n return this.colorScheme();\n });\n\n // Effective Unit\n readonly activeUnit = computed<string>(() => {\n const metric = this.currentMetric();\n if (metric && metric.unit !== undefined) return metric.unit;\n return this.unit();\n });\n\n // Effective Raw Data Input\n readonly activeDataInput = computed<HeatmapDataInput>(() => {\n const metric = this.currentMetric();\n if (metric) return metric.data;\n return this.data();\n });\n\n // Hours array from range (for hour-by-hour mode)\n readonly hours = computed<number[]>(() => {\n const [start, end] = this.hoursRange();\n const clampedStart = Math.max(0, Math.min(23, start));\n const clampedEnd = Math.max(clampedStart, Math.min(23, end));\n const result: number[] = [];\n for (let h = clampedStart; h <= clampedEnd; h++) {\n result.push(h);\n }\n return result;\n });\n\n // Resolved Date Range bounds\n readonly parsedDateRange = computed<{ start: Date | null; end: Date | null }>(() => {\n const dr = this.dateRange();\n if (!dr || (!dr.startDate && !dr.endDate)) {\n return { start: null, end: null };\n }\n const s = dr.startDate ? startOfDay(new Date(dr.startDate as any)) : null;\n const e = dr.endDate ? endOfDay(new Date(dr.endDate as any)) : (s ? endOfDay(s) : null);\n return { start: s, end: e };\n });\n\n // Day list for Day-by-Day mode (weeks grouping)\n readonly dayModeWeeks = computed<{ label: string; start: Date; end: Date; days: Date[] }[]>(() => {\n const { start, end } = this.parsedDateRange();\n const effectiveStart = start || startOfISOWeek(subWeeks(new Date(), 3));\n const effectiveEnd = end || endOfISOWeek(new Date());\n\n const weeks: { label: string; start: Date; end: Date; days: Date[] }[] = [];\n let currentWeekStart = startOfISOWeek(effectiveStart);\n const lastWeekEnd = endOfISOWeek(effectiveEnd);\n\n while (isSameDay(currentWeekStart, lastWeekEnd) || isBefore(currentWeekStart, lastWeekEnd)) {\n const currentWeekEnd = addDays(currentWeekStart, 6);\n const daysInWeek: Date[] = [];\n\n for (let i = 0; i < 7; i++) {\n daysInWeek.push(addDays(currentWeekStart, i));\n }\n\n const label = `${formatDate(currentWeekStart, 'MMM d')} - ${formatDate(currentWeekEnd, 'MMM d')}`;\n weeks.push({\n label,\n start: currentWeekStart,\n end: currentWeekEnd,\n days: daysInWeek\n });\n\n currentWeekStart = addWeeks(currentWeekStart, 1);\n }\n\n return weeks;\n });\n\n // Normalized Value Map:\n // For 'hour': Map<`${colKey}_${hour}`, { value, meta }>\n // For 'day': Map<`${yyyy-MM-dd}`, { value, meta }> AND Map<`${colKey}`, { value, meta }>\n readonly normalizedValueMap = computed<Map<string, { value: number; meta?: Record<string, unknown> }>>(() => {\n const map = new Map<string, { value: number; meta?: Record<string, unknown> }>();\n const rawInput = this.activeDataInput();\n const currentDays = this.days();\n const currentInterval = this.interval();\n\n if (!rawInput) return map;\n\n if (Array.isArray(rawInput)) {\n if (rawInput.length === 0) return map;\n\n const firstItem = rawInput[0];\n\n if (\n typeof firstItem === 'string' ||\n firstItem instanceof Date ||\n (typeof firstItem === 'number' && firstItem > 1000000000)\n ) {\n // Raw Timestamp list\n (rawInput as HeatmapTimestampData).forEach((ts) => {\n const date = new Date(ts);\n if (isValid(date)) {\n if (currentInterval === 'day') {\n const dayKey = formatDate(date, 'yyyy-MM-dd');\n const existing = map.get(dayKey);\n if (existing) existing.value += 1;\n else map.set(dayKey, { value: 1 });\n } else {\n const dayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n const dayName = dayNames[date.getDay()];\n const matchedDay = currentDays.find((d) => d.toLowerCase().startsWith(dayName.toLowerCase())) || dayName;\n const hour = date.getHours();\n const key = `${matchedDay}_${hour}`;\n const existing = map.get(key);\n if (existing) existing.value += 1;\n else map.set(key, { value: 1 });\n }\n }\n });\n } else {\n // HeatmapDataPoint array\n (rawInput as HeatmapDataPoint[]).forEach((point) => {\n if (currentInterval === 'day') {\n let dayKey = '';\n if (point.date) {\n dayKey = typeof point.date === 'string' && /^\\d{4}-\\d{2}-\\d{2}/.test(point.date)\n ? point.date.substring(0, 10)\n : formatDate(new Date(point.date), 'yyyy-MM-dd');\n } else if (point.day instanceof Date) {\n dayKey = formatDate(point.day, 'yyyy-MM-dd');\n } else if (typeof point.day === 'string' && /^\\d{4}-\\d{2}-\\d{2}/.test(point.day)) {\n dayKey = point.day.substring(0, 10);\n } else {\n dayKey = String(point.day ?? '');\n }\n\n if (dayKey) {\n const existing = map.get(dayKey);\n if (existing) {\n existing.value += point.value;\n if (point.meta) existing.meta = { ...existing.meta, ...point.meta };\n } else {\n map.set(dayKey, { value: point.value, meta: point.meta });\n }\n }\n } else {\n // Hour by hour\n let dayKey = '';\n if (point.day instanceof Date) {\n const dayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n const dayName = dayNames[point.day.getDay()];\n dayKey = currentDays.find((d) => d.toLowerCase().startsWith(dayName.toLowerCase())) || dayName;\n } else if (typeof point.day === 'number') {\n dayKey = currentDays[point.day] || String(point.day);\n } else {\n dayKey = String(point.day ?? '');\n }\n\n const hour = point.hour ?? 0;\n const key = `${dayKey}_${hour}`;\n const existing = map.get(key);\n if (existing) {\n existing.value += point.value;\n if (point.meta) existing.meta = { ...existing.meta, ...point.meta };\n } else {\n map.set(key, { value: point.value, meta: point.meta });\n }\n }\n });\n }\n } else if (typeof rawInput === 'object') {\n // HeatmapMatrixData\n const matrix = rawInput as HeatmapMatrixData;\n Object.entries(matrix).forEach(([outerKey, innerObj]) => {\n if (typeof innerObj === 'object' && innerObj !== null) {\n Object.entries(innerObj).forEach(([innerKey, val]) => {\n const numVal = Number(val) || 0;\n if (currentInterval === 'day') {\n const key = `${outerKey}_${innerKey}`;\n map.set(key, { value: numVal });\n } else {\n const isInnerHour = !isNaN(Number(innerKey));\n if (isInnerHour) {\n const hour = Number(innerKey);\n const key = `${outerKey}_${hour}`;\n map.set(key, { value: numVal });\n } else {\n const hour = Number(outerKey);\n const key = `${innerKey}_${hour}`;\n map.set(key, { value: numVal });\n }\n }\n });\n }\n });\n }\n\n return map;\n });\n\n // Effective min & max value for heat scale\n readonly computedScaleBounds = computed<{ min: number; max: number }>(() => {\n const customMin = this.minValue();\n const customMax = this.maxValue();\n const map = this.normalizedValueMap();\n\n let dataMax = 0;\n for (const item of map.values()) {\n if (item.value > dataMax) dataMax = item.value;\n }\n\n const min = customMin !== undefined ? customMin : 0;\n const max = customMax !== undefined ? customMax : Math.max(1, dataMax);\n\n return { min, max };\n });\n\n // Gradient CSS for Legend bar\n readonly legendGradientCss = computed<string>(() => {\n const scheme = this.activeColorScheme();\n return PALETTE_CONFIG[scheme]?.gradientCss || PALETTE_CONFIG.indigo.gradientCss;\n });\n\n // Column Headers computation (supports axis swapping)\n readonly columnHeaders = computed<{ key: string | number; label: string }[]>(() => {\n const isSwapped = this.swapAxes();\n const currentInterval = this.interval();\n\n if (!isSwapped) {\n return this.days().map((day) => ({ key: day, label: day }));\n }\n\n // When axes are swapped:\n if (currentInterval === 'day') {\n const weeks = this.dayModeWeeks();\n return weeks.map((w) => ({ key: w.label, label: w.label }));\n }\n\n const hoursList = this.hours();\n const format = this.timeFormat();\n return hoursList.map((hour) => ({\n key: hour,\n label: this.formatHourLabel(hour, format)\n }));\n });\n\n // Grid Matrix computation\n readonly gridRows = computed<{ key: string | number; label: string; cells: HeatmapCell[] }[]>(() => {\n const currentInterval = this.interval();\n const isSwapped = this.swapAxes();\n const map = this.normalizedValueMap();\n const { min, max } = this.computedScaleBounds();\n const scheme = this.activeColorScheme();\n const palette = PALETTE_CONFIG[scheme] || PALETTE_CONFIG.indigo;\n const unitStr = this.activeUnit();\n const unitSuffix = unitStr ? ` ${unitStr}` : '';\n const format = this.timeFormat();\n\n const getVisuals = (val: number) => {\n const intensity = max > min ? Math.max(0, Math.min(1, (val - min) / (max - min))) : 0;\n let bgColor = '';\n let textColor = '';\n if (val === 0) {\n bgColor = palette.zero.bg;\n textColor = palette.zero.text;\n } else {\n const r = Math.round(palette.min.r + (palette.max.r - palette.min.r) * intensity);\n const g = Math.round(palette.min.g + (palette.max.g - palette.min.g) * intensity);\n const b = Math.round(palette.min.b + (palette.max.b - palette.min.b) * intensity);\n bgColor = `rgb(${r}, ${g}, ${b})`;\n textColor = intensity >= 0.55 ? '#ffffff' : palette.zero.text;\n }\n return { intensity, bgColor, textColor };\n };\n\n // --- DAY-BY-DAY MODE ---\n if (currentInterval === 'day') {\n const weeks = this.dayModeWeeks();\n const dayLabels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];\n\n if (!isSwapped) {\n // Standard: Rows = Weeks, Columns = Days\n return weeks.map((week, weekIdx) => {\n const cells: HeatmapCell[] = week.days.map((d, dayIdx) => {\n const dateStr = formatDate(d, 'yyyy-MM-dd');\n const dayName = dayLabels[dayIdx];\n const entry = map.get(dateStr) || map.get(`${dayName}_${weekIdx}`);\n const val = entry?.value ?? 0;\n const { intensity, bgColor, textColor } = getVisuals(val);\n const tooltip = `${formatDate(d, 'EEEE, MMMM d, yyyy')}: ${val}${unitSuffix}`;\n\n return {\n id: dateStr,\n colKey: dayName,\n colLabel: `${dayName} (${formatDate(d, 'd')})`,\n rowKey: week.label,\n rowLabel: week.label,\n value: val,\n intensity,\n backgroundColor: bgColor,\n textColor,\n formattedValue: String(val),\n tooltipText: tooltip,\n date: d,\n meta: entry?.meta\n };\n });\n\n return {\n key: week.label,\n label: week.label,\n cells\n };\n });\n } else {\n // Swapped: Rows = Days (Mon..Sun), Columns = Weeks\n return dayLabels.map((dayName, dayIdx) => {\n const cells: HeatmapCell[] = weeks.map((week, weekIdx) => {\n const d = week.days[dayIdx];\n const dateStr = formatDate(d, 'yyyy-MM-dd');\n const entry = map.get(dateStr) || map.get(`${dayName}_${weekIdx}`);\n const val = entry?.value ?? 0;\n const { intensity, bgColor, textColor } = getVisuals(val);\n const tooltip = `${formatDate(d, 'EEEE, MMMM d, yyyy')}: ${val}${unitSuffix}`;\n\n return {\n id: `${dateStr}_swapped`,\n colKey: week.label,\n colLabel: week.label,\n rowKey: dayName,\n rowLabel: dayName,\n value: val,\n intensity,\n backgroundColor: bgColor,\n textColor,\n formattedValue: String(val),\n tooltipText: tooltip,\n date: d,\n meta: entry?.meta\n };\n });\n\n return {\n key: dayName,\n label: dayName,\n cells\n };\n });\n }\n }\n\n // --- HOUR-BY-HOUR MODE ---\n const hoursList = this.hours();\n const colsList = this.days();\n\n if (!isSwapped) {\n // Standard: Rows = Hours, Columns = Days\n return hoursList.map((hour) => {\n const hourLabel = this.formatHourLabel(hour, format);\n const cells: HeatmapCell[] = colsList.map((col) => {\n const key = `${col}_${hour}`;\n const entry = map.get(key);\n const val = entry?.value ?? 0;\n const { intensity, bgColor, textColor } = getVisuals(val);\n const tooltip = `${col}, ${hourLabel}: ${val}${unitSuffix}`;\n\n return {\n id: key,\n colKey: col,\n colLabel: col,\n rowKey: hour,\n rowLabel: hourLabel,\n value: val,\n intensity,\n backgroundColor: bgColor,\n textColor,\n formattedValue: String(val),\n tooltipText: tooltip,\n meta: entry?.meta\n };\n });\n\n return {\n key: hour,\n label: hourLabel,\n cells\n };\n });\n } else {\n // Swapped: Rows = Days, Columns = Hours\n return colsList.map((day) => {\n const cells: HeatmapCell[] = hoursList.map((hour) => {\n const hourLabel = this.formatHourLabel(hour, format);\n const key = `${day}_${hour}`;\n const entry = map.get(key);\n const val = entry?.value ?? 0;\n const { intensity, bgColor, textColor } = getVisuals(val);\n const tooltip = `${day}, ${hourLabel}: ${val}${unitSuffix}`;\n\n return {\n id: `${key}_swapped`,\n colKey: hour,\n colLabel: hourLabel,\n rowKey: day,\n rowLabel: day,\n value: val,\n intensity,\n backgroundColor: bgColor,\n textColor,\n formattedValue: String(val),\n tooltipText: tooltip,\n meta: entry?.meta\n };\n });\n\n return {\n key: day,\n label: day,\n cells\n };\n });\n }\n });\n\n constructor() {\n // Notify parent on time range boundaries changes\n effect(() => {\n const days = this.days();\n const hours = this.hours();\n const inter = this.interval();\n const dr = this.dateRange();\n const swapped = this.swapAxes();\n\n this.timeRangeChange.emit({\n interval: inter,\n startHour: hours.length > 0 ? hours[0] : undefined,\n endHour: hours.length > 0 ? hours[hours.length - 1] : undefined,\n days,\n startDate: dr?.startDate ? new Date(dr.startDate as any) : undefined,\n endDate: dr?.endDate ? new Date(dr.endDate as any) : undefined,\n dateRange: dr,\n swapAxes: swapped\n });\n });\n\n // Close dropdowns on outside click\n if (typeof document !== 'undefined') {\n document.addEventListener('click', (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.contains(target)) {\n this.isMetricDropdownOpen.set(false);\n this.isExportDropdownOpen.set(false);\n }\n });\n }\n }\n\n formatHourLabel(hour: number, format: HeatmapTimeFormat): string {\n if (format === '24h') {\n return `${hour.toString().padStart(2, '0')}:00`;\n }\n if (hour === 0) return '12 AM';\n if (hour < 12) return `${hour} AM`;\n if (hour === 12) return '12 PM';\n return `${hour - 12} PM`;\n }\n\n setInterval(newInterval: HeatmapInterval): void {\n this.interval.set(newInterval);\n }\n\n toggleSwapAxes(): void {\n this.swapAxes.update((v) => !v);\n }\n\n onDateRangePickerChange(val: DateRangeValue | null): void {\n this.dateRange.set(val);\n }\n\n toggleExpand(): void {\n this.isExpanded.update((v) => !v);\n }\n\n toggleMetricDropdown(event: MouseEvent): void {\n event.stopPropagation();\n this.isMetricDropdownOpen.update((v) => !v);\n this.isExportDropdownOpen.set(false);\n }\n\n toggleExportDropdown(event: MouseEvent): void {\n event.stopPropagation();\n this.isExportDropdownOpen.update((v) => !v);\n this.isMetricDropdownOpen.set(false);\n }\n\n selectMetric(metric: HeatmapMetric): void {\n this.selectedMetricId.set(metric.id);\n this.isMetricDropdownOpen.set(false);\n this.metricChange.emit(metric);\n }\n\n onRefreshClick(): void {\n this.refresh.emit();\n }\n\n onCellMouseEnter(cell: HeatmapCell): void {\n this.hoveredCell.set(cell);\n this.cellHover.emit(cell);\n }\n\n onCellMouseLeave(): void {\n this.hoveredCell.set(null);\n this.cellHover.emit(null);\n }\n\n onCellClick(cell: HeatmapCell, event: MouseEvent): void {\n this.cellClick.emit({\n cell,\n colKey: cell.colKey,\n rowKey: cell.rowKey,\n value: cell.value,\n interval: this.interval(),\n event\n });\n }\n\n onKeydown(event: KeyboardEvent, colIdx: number, rowIdx: number): void {\n const rows = this.gridRows();\n const cols = this.columnHeaders();\n let targetRow = rowIdx;\n let targetCol = colIdx;\n\n if (event.key === 'ArrowUp') {\n targetRow = Math.max(0, rowIdx - 1);\n event.preventDefault();\n } else if (event.key === 'ArrowDown') {\n targetRow = Math.min(rows.length - 1, rowIdx + 1);\n event.preventDefault();\n } else if (event.key === 'ArrowLeft') {\n targetCol = Math.max(0, colIdx - 1);\n event.preventDefault();\n } else if (event.key === 'ArrowRight') {\n targetCol = Math.min(cols.length - 1, colIdx + 1);\n event.preventDefault();\n } else if (event.key === 'Enter' || event.key === ' ') {\n const cell = rows[rowIdx]?.cells[colIdx];\n if (cell) {\n this.cellClick.emit({\n cell,\n colKey: cell.colKey,\n rowKey: cell.rowKey,\n value: cell.value,\n interval: this.interval(),\n event\n });\n }\n event.preventDefault();\n return;\n }\n\n if (targetRow !== rowIdx || targetCol !== colIdx) {\n this.focusedCoord.set({ colIndex: targetCol, rowIndex: targetRow });\n const cellEl = this.elementRef.nativeElement.querySelector(\n `[data-cell-coord=\"${targetRow}_${targetCol}\"]`\n ) as HTMLElement;\n cellEl?.focus();\n }\n }\n\n triggerExport(format: HeatmapExportFormat): void {\n this.isExportDropdownOpen.set(false);\n const rows = this.gridRows();\n const cols = this.days();\n\n if (format === 'csv') {\n const header = ['Period', ...cols].join(',');\n const body = rows.map((r) => [r.label, ...r.cells.map((c) => c.value)].join(',')).join('\\n');\n const csvContent = `${header}\\n${body}`;\n\n this.downloadFile(csvContent, 'text/csv;charset=utf-8;', `heatmap_${this.title().toLowerCase().replace(/\\s+/g, '_')}.csv`);\n this.export.emit({ format: 'csv', data: csvContent });\n } else if (format === 'json') {\n const jsonRecords: Record<string, Record<string, number>> = {};\n rows.forEach((r) => {\n jsonRecords[r.label] = {};\n r.cells.forEach((c) => {\n jsonRecords[r.label][c.colKey] = c.value;\n });\n });\n const jsonStr = JSON.stringify(jsonRecords, null, 2);\n this.downloadFile(jsonStr, 'application/json;charset=utf-8;', `heatmap_${this.title().toLowerCase().replace(/\\s+/g, '_')}.json`);\n this.export.emit({ format: 'json', data: jsonRecords });\n }\n }\n\n private downloadFile(content: string, mimeType: string, filename: string): void {\n if (typeof window === 'undefined') return;\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n }\n}\n","<div class=\"talos-heatmap-container\">\n <!-- Header Toolbar -->\n @if (showToolbar()) {\n <div class=\"talos-heatmap-header\">\n <div class=\"talos-heatmap-title-area\">\n <h3 class=\"talos-heatmap-title\">{{ title() }}</h3>\n </div>\n\n <div class=\"talos-heatmap-actions\">\n <!-- Interval Selector Toggle (Hour vs Day) -->\n @if (showIntervalToggle()) {\n <div class=\"talos-heatmap-interval-group\" role=\"radiogroup\" aria-label=\"Time Interval\">\n <button type=\"button\" class=\"talos-heatmap-interval-btn\" [class.is-active]=\"interval() === 'hour'\"\n (click)=\"setInterval('hour')\" role=\"radio\" [attr.aria-checked]=\"interval() === 'hour'\">\n <svg lucideClock [size]=\"13\"></svg>\n <span>Hour</span>\n </button>\n <button type=\"button\" class=\"talos-heatmap-interval-btn\" [class.is-active]=\"interval() === 'day'\"\n (click)=\"setInterval('day')\" role=\"radio\" [attr.aria-checked]=\"interval() === 'day'\">\n <svg lucideCalendar [size]=\"13\"></svg>\n <span>Day</span>\n </button>\n </div>\n }\n\n <!-- Date Range Picker Integration -->\n @if (showDateRangePicker()) {\n <div class=\"talos-heatmap-daterange-box\">\n <talos-date-range-picker size=\"sm\" [ngModel]=\"dateRange()\" (rangeChange)=\"onDateRangePickerChange($event)\"\n [presets]=\"dateRangePresets()\" placeholder=\"Select date range\" />\n </div>\n }\n\n <!-- Metric Dropdown Selector -->\n @if (metrics().length > 0) {\n <div class=\"talos-heatmap-dropdown-wrapper\">\n <button type=\"button\" class=\"talos-heatmap-dropdown-btn\" [class.is-open]=\"isMetricDropdownOpen()\"\n (click)=\"toggleMetricDropdown($event)\" aria-haspopup=\"listbox\" [attr.aria-expanded]=\"isMetricDropdownOpen()\">\n <span class=\"talos-heatmap-dropdown-label\">{{ currentMetric()?.label || 'Select metric' }}</span>\n <svg lucideChevronDown [size]=\"14\" class=\"talos-heatmap-dropdown-icon\"></svg>\n </button>\n\n @if (isMetricDropdownOpen()) {\n <div class=\"talos-heatmap-menu\" role=\"listbox\">\n @for (m of metrics(); track m.id) {\n <button type=\"button\" class=\"talos-heatmap-menu-item\" [class.is-selected]=\"m.id === currentMetric()?.id\"\n (click)=\"selectMetric(m)\" role=\"option\" [attr.aria-selected]=\"m.id === currentMetric()?.id\">\n <span>{{ m.label }}</span>\n @if (m.id === currentMetric()?.id) {\n <svg lucideCheck [size]=\"14\" class=\"talos-heatmap-check-icon\"></svg>\n }\n </button>\n }\n </div>\n }\n </div>\n }\n\n <!-- Refresh Button -->\n @if (showRefresh()) {\n <button type=\"button\" class=\"talos-heatmap-icon-btn\" [class.is-spinning]=\"loading()\" (click)=\"onRefreshClick()\"\n title=\"Refresh data\" aria-label=\"Refresh data\">\n <svg lucideRefreshCw [size]=\"16\" class=\"talos-heatmap-action-icon\"></svg>\n </button>\n }\n\n <!-- Export Dropdown Button -->\n @if (showExport()) {\n <div class=\"talos-heatmap-dropdown-wrapper\">\n <button type=\"button\" class=\"talos-heatmap-icon-btn\" (click)=\"toggleExportDropdown($event)\" title=\"Export data\"\n aria-label=\"Export data\">\n <svg lucideUpload [size]=\"16\" class=\"talos-heatmap-action-icon\"></svg>\n </button>\n\n @if (isExportDropdownOpen()) {\n <div class=\"talos-heatmap-menu talos-heatmap-export-menu\" role=\"menu\">\n <button type=\"button\" class=\"talos-heatmap-menu-item\" (click)=\"triggerExport('csv')\" role=\"menuitem\">\n <svg lucideFileSpreadsheet [size]=\"14\" class=\"talos-heatmap-menu-icon\"></svg>\n <span>Export to CSV</span>\n </button>\n <button type=\"button\" class=\"talos-heatmap-menu-item\" (click)=\"triggerExport('json')\" role=\"menuitem\">\n <svg lucideFileJson [size]=\"14\" class=\"talos-heatmap-menu-icon\"></svg>\n <span>Export to JSON</span>\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Swap Axes Button -->\n @if (showSwapAxes()) {\n <button type=\"button\" class=\"talos-heatmap-icon-btn\" [class.is-active]=\"swapAxes()\" (click)=\"toggleSwapAxes()\"\n [title]=\"swapAxes() ? 'Reset axis orientation' : 'Swap axes (Days / Hours)'\"\n [attr.aria-label]=\"swapAxes() ? 'Reset axis orientation' : 'Swap axes (Days / Hours)'\">\n <svg lucideArrowLeftRight [size]=\"16\" class=\"talos-heatmap-action-icon\"></svg>\n </button>\n }\n\n <!-- Fullscreen / Expand Button -->\n @if (showExpand()) {\n <button type=\"button\" class=\"talos-heatmap-icon-btn\" (click)=\"toggleExpand()\"\n [title]=\"isExpanded() ? 'Minimize' : 'Expand'\" [aria-label]=\"isExpanded() ? 'Minimize' : 'Expand'\">\n @if (isExpanded()) {\n <svg lucideMinimize2 [size]=\"16\" class=\"talos-heatmap-action-icon\"></svg>\n } @else {\n <svg lucideMaximize2 [size]=\"16\" class=\"talos-heatmap-action-icon\"></svg>\n }\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Heatmap Matrix Grid Wrapper -->\n <div class=\"talos-heatmap-body\" [class.is-loading]=\"loading()\">\n <!-- Grid Table -->\n <div class=\"talos-heatmap-grid\" role=\"grid\" [attr.aria-rowcount]=\"gridRows().length + 1\"\n [attr.aria-colcount]=\"columnHeaders().length + 1\">\n <!-- Column Headers -->\n <div class=\"talos-heatmap-row talos-heatmap-header-row\" role=\"row\" aria-rowindex=\"1\">\n <div class=\"talos-heatmap-corner-cell\" role=\"columnheader\"></div>\n @for (col of columnHeaders(); track col.key; let colIdx = $index) {\n <div class=\"talos-heatmap-col-header\" role=\"columnheader\" [attr.aria-colindex]=\"colIdx + 2\">\n {{ col.label }}\n </div>\n }\n </div>\n\n <!-- Data Rows -->\n @for (row of gridRows(); track row.key; let rowIdx = $index) {\n <div class=\"talos-heatmap-row\" role=\"row\" [attr.aria-rowindex]=\"rowIdx + 2\">\n <!-- Row Header (Hour or Week Range) -->\n <div class=\"talos-heatmap-row-header\" role=\"rowheader\" aria-colindex=\"1\" [title]=\"row.label\">\n {{ row.label }}\n </div>\n\n <!-- Heatmap Cells -->\n @for (cell of row.cells; track cell.id; let colIdx = $index) {\n <div class=\"talos-heatmap-cell-wrapper\" role=\"gridcell\" [attr.aria-colindex]=\"colIdx + 2\"\n [attr.aria-label]=\"cell.tooltipText\" tabindex=\"0\" [attr.data-cell-coord]=\"rowIdx + '_' + colIdx\"\n [talosTooltip]=\"cell.tooltipText\" (mouseenter)=\"onCellMouseEnter(cell)\" (mouseleave)=\"onCellMouseLeave()\"\n (click)=\"onCellClick(cell, $event)\" (keydown)=\"onKeydown($event, colIdx, rowIdx)\">\n <div class=\"talos-heatmap-pill\" [style.background-color]=\"cell.backgroundColor\" [style.color]=\"cell.textColor\"\n [class.has-value]=\"cell.value > 0\">\n @if (showValues()) {\n <span class=\"talos-heatmap-cell-value\">{{ cell.formattedValue }}</span>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Loading Skeleton Shimmer Overlay -->\n @if (loading()) {\n <div class=\"talos-heatmap-loading-overlay\" aria-hidden=\"true\">\n <div class=\"talos-heatmap-loading-spinner-box\">\n <svg lucideRefreshCw [size]=\"16\" class=\"talos-heatmap-loading-spinner\"></svg>\n <span>Loading data...</span>\n </div>\n </div>\n }\n </div>\n\n <!-- Bottom Legend Bar -->\n @if (showLegend()) {\n <div class=\"talos-heatmap-legend\">\n <span class=\"talos-heatmap-legend-bound\">{{ computedScaleBounds().min }}</span>\n <div class=\"talos-heatmap-legend-bar\" [style.background]=\"legendGradientCss()\" aria-hidden=\"true\"></div>\n <span class=\"talos-heatmap-legend-bound\">{{ computedScaleBounds().max }}</span>\n </div>\n }\n</div>","import { NgModule } from '@angular/core';\nimport { TalosHeatmapComponent } from './heatmap.component';\n\n@NgModule({\n imports: [TalosHeatmapComponent],\n exports: [TalosHeatmapComponent]\n})\nexport class TalosHeatmapModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;AA0DA,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;AAQtE,MAAM,cAAc,GAGhB;AACF,IAAA,MAAM,EAAE;QACN,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;AACxC,QAAA,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;AAC/B,QAAA,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE;AAC7B,QAAA,WAAW,EAAE;AACd,KAAA;AACD,IAAA,IAAI,EAAE;QACJ,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;AACxC,QAAA,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;AAC/B,QAAA,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE;AAC7B,QAAA,WAAW,EAAE;AACd,KAAA;AACD,IAAA,OAAO,EAAE;QACP,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;AACxC,QAAA,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;AAC/B,QAAA,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE;AAC5B,QAAA,WAAW,EAAE;AACd,KAAA;AACD,IAAA,IAAI,EAAE;QACJ,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;AACxC,QAAA,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;AAC/B,QAAA,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE;AAC7B,QAAA,WAAW,EAAE;AACd,KAAA;AACD,IAAA,KAAK,EAAE;QACL,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;AACxC,QAAA,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;AAC/B,QAAA,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;AAC5B,QAAA,WAAW,EAAE;AACd,KAAA;AACD,IAAA,MAAM,EAAE;QACN,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;AACxC,QAAA,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;AAC/B,QAAA,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE;AAC9B,QAAA,WAAW,EAAE;AACd,KAAA;AACD,IAAA,KAAK,EAAE;QACL,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;AACxC,QAAA,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;AAC/B,QAAA,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE;AAC5B,QAAA,WAAW,EAAE;AACd,KAAA;AACD,IAAA,MAAM,EAAE;QACN,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;AACxC,QAAA,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;AAC/B,QAAA,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE;AAC7B,QAAA,WAAW,EAAE;AACd;CACF;MAuCY,qBAAqB,CAAA;AACf,IAAA,UAAU,GAAG,MAAM,CAA0B,UAAU,CAAC;;IAGhE,IAAI,GAAG,KAAK,CAAmB,EAAE;6EAAC;IAClC,OAAO,GAAG,KAAK,CAAkB,EAAE;gFAAC;IACpC,gBAAgB,GAAG,KAAK,CAAqB,SAAS;yFAAC;IACvD,QAAQ,GAAG,KAAK,CAAkB,MAAM;iFAAC;IACzC,SAAS,GAAG,KAAK,CAAwB,IAAI;kFAAC;IAC9C,QAAQ,GAAG,KAAK,CAAU,KAAK;iFAAC;IAChC,KAAK,GAAG,KAAK,CAAS,eAAe;8EAAC;AACtC,IAAA,UAAU,GAAG,KAAK,CAAmB,CAAC,CAAC,EAAE,EAAE,CAAC;mFAAC;IAC7C,UAAU,GAAG,KAAK,CAAoB,KAAK;mFAAC;IAC5C,IAAI,GAAG,KAAK,CAAW,YAAY;6EAAC;IACpC,WAAW,GAAG,KAAK,CAAqB,QAAQ;oFAAC;IACjD,gBAAgB,GAAG,KAAK,CAA+B,SAAS;yFAAC;IACjE,UAAU,GAAG,KAAK,CAAU,IAAI;mFAAC;IACjC,UAAU,GAAG,KAAK,CAAU,IAAI;mFAAC;IACjC,SAAS,GAAG,KAAK,CAAmB,MAAM;kFAAC;IAC3C,QAAQ,GAAG,KAAK,CAAkB,IAAI;iFAAC;IACvC,QAAQ,GAAG,KAAK,CAAsB,SAAS;iFAAC;IAChD,OAAO,GAAG,KAAK,CAAU,KAAK;gFAAC;IAC/B,WAAW,GAAG,KAAK,CAAU,IAAI;oFAAC;IAClC,WAAW,GAAG,KAAK,CAAU,IAAI;oFAAC;IAClC,UAAU,GAAG,KAAK,CAAU,IAAI;mFAAC;IACjC,UAAU,GAAG,KAAK,CAAU,IAAI;mFAAC;IACjC,YAAY,GAAG,KAAK,CAAU,KAAK;qFAAC;IACpC,kBAAkB,GAAG,KAAK,CAAU,KAAK;2FAAC;IAC1C,mBAAmB,GAAG,KAAK,CAAU,KAAK;4FAAC;IAC3C,gBAAgB,GAAG,KAAK,CAA2B,IAAI;yFAAC;IACxD,IAAI,GAAG,KAAK,CAAS,EAAE;6EAAC;IACxB,QAAQ,GAAG,KAAK,CAAqB,SAAS;iFAAC;IAC/C,QAAQ,GAAG,KAAK,CAAqB,SAAS;iFAAC;;IAG/C,SAAS,GAAG,MAAM,EAAyB;IAC3C,SAAS,GAAG,MAAM,EAAsB;IACxC,eAAe,GAAG,MAAM,EAAoB;IAC5C,OAAO,GAAG,MAAM,EAAQ;IACxB,YAAY,GAAG,MAAM,EAAiB;IACtC,MAAM,GAAG,MAAM,EAAkD;;IAGjE,UAAU,GAAG,MAAM,CAAU,KAAK;mFAAC;IACnC,oBAAoB,GAAG,MAAM,CAAU,KAAK;6FAAC;IAC7C,oBAAoB,GAAG,MAAM,CAAU,KAAK;6FAAC;IAC7C,WAAW,GAAG,MAAM,CAAqB,IAAI;oFAAC;IAC9C,YAAY,GAAG,MAAM,CAAgD,IAAI;qFAAC;;AAG1E,IAAA,UAAU,GAAG,QAAQ,CAAU,MAAK;AAC3C,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE;QAC1B,IAAI,EAAE,KAAK,SAAS;AAAE,YAAA,OAAO,EAAE;AAC/B,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,KAAK,QAAQ;IACtC,CAAC;mFAAC;;AAGO,IAAA,aAAa,GAAG,QAAQ,CAA4B,MAAK;AAChE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE;AAC3B,QAAA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,SAAS;AAChD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,EAAE;QAC1C,IAAI,UAAU,EAAE;AACd,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC;AACnD,YAAA,IAAI,KAAK;AAAE,gBAAA,OAAO,KAAK;QACzB;AACA,QAAA,OAAO,IAAI,CAAC,CAAC,CAAC;IAChB,CAAC;sFAAC;;AAGO,IAAA,iBAAiB,GAAG,QAAQ,CAAqB,MAAK;AAC7D,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;AACnC,QAAA,IAAI,MAAM,IAAI,MAAM,CAAC,WAAW;YAAE,OAAO,MAAM,CAAC,WAAW;AAC3D,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE;IAC3B,CAAC;0FAAC;;AAGO,IAAA,UAAU,GAAG,QAAQ,CAAS,MAAK;AAC1C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;AACnC,QAAA,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC,IAAI;AAC3D,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE;IACpB,CAAC;mFAAC;;AAGO,IAAA,eAAe,GAAG,QAAQ,CAAmB,MAAK;AACzD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;AACnC,QAAA,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC,IAAI;AAC9B,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE;IACpB,CAAC;wFAAC;;AAGO,IAAA,KAAK,GAAG,QAAQ,CAAW,MAAK;QACvC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE;AACtC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AACrD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAa,EAAE;AAC3B,QAAA,KAAK,IAAI,CAAC,GAAG,YAAY,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,EAAE,EAAE;AAC/C,YAAA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAChB;AACA,QAAA,OAAO,MAAM;IACf,CAAC;8EAAC;;AAGO,IAAA,eAAe,GAAG,QAAQ,CAA2C,MAAK;AACjF,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE;AAC3B,QAAA,IAAI,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE;YACzC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE;QACnC;QACA,MAAM,CAAC,GAAG,EAAE,CAAC,SAAS,GAAG,UAAU,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,SAAgB,CAAC,CAAC,GAAG,IAAI;AACzE,QAAA,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,GAAG,QAAQ,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,OAAc,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACvF,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;IAC7B,CAAC;wFAAC;;AAGO,IAAA,YAAY,GAAG,QAAQ,CAA4D,MAAK;QAC/F,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE;AAC7C,QAAA,MAAM,cAAc,GAAG,KAAK,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QACvE,MAAM,YAAY,GAAG,GAAG,IAAI,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC;QAEpD,MAAM,KAAK,GAA8D,EAAE;AAC3E,QAAA,IAAI,gBAAgB,GAAG,cAAc,CAAC,cAAc,CAAC;AACrD,QAAA,MAAM,WAAW,GAAG,YAAY,CAAC,YAAY,CAAC;AAE9C,QAAA,OAAO,SAAS,CAAC,gBAAgB,EAAE,WAAW,CAAC,IAAI,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAC,EAAE;YAC1F,MAAM,cAAc,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;YACnD,MAAM,UAAU,GAAW,EAAE;AAE7B,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC1B,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;YAC/C;AAEA,YAAA,MAAM,KAAK,GAAG,CAAA,EAAG,UAAU,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAA,GAAA,EAAM,UAAU,CAAC,cAAc,EAAE,OAAO,CAAC,EAAE;YACjG,KAAK,CAAC,IAAI,CAAC;gBACT,KAAK;AACL,gBAAA,KAAK,EAAE,gBAAgB;AACvB,gBAAA,GAAG,EAAE,cAAc;AACnB,gBAAA,IAAI,EAAE;AACP,aAAA,CAAC;AAEF,YAAA,gBAAgB,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAClD;AAEA,QAAA,OAAO,KAAK;IACd,CAAC;qFAAC;;;;AAKO,IAAA,kBAAkB,GAAG,QAAQ,CAAiE,MAAK;AAC1G,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAA6D;AAChF,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE;AACvC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE;AAC/B,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,EAAE;AAEvC,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,GAAG;AAEzB,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AAC3B,YAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;AAAE,gBAAA,OAAO,GAAG;AAErC,YAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC;YAE7B,IACE,OAAO,SAAS,KAAK,QAAQ;AAC7B,gBAAA,SAAS,YAAY,IAAI;iBACxB,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,GAAG,UAAU,CAAC,EACzD;;AAEC,gBAAA,QAAiC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAI;AAChD,oBAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;AACzB,oBAAA,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE;AACjB,wBAAA,IAAI,eAAe,KAAK,KAAK,EAAE;4BAC7B,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC;4BAC7C,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;AAChC,4BAAA,IAAI,QAAQ;AAAE,gCAAA,QAAQ,CAAC,KAAK,IAAI,CAAC;;gCAC5B,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;wBACpC;6BAAO;AACL,4BAAA,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;4BAClE,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;4BACvC,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,OAAO;AACxG,4BAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC5B,4BAAA,MAAM,GAAG,GAAG,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,IAAI,EAAE;4BACnC,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AAC7B,4BAAA,IAAI,QAAQ;AAAE,gCAAA,QAAQ,CAAC,KAAK,IAAI,CAAC;;gCAC5B,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;wBACjC;oBACF;AACF,gBAAA,CAAC,CAAC;YACJ;iBAAO;;AAEJ,gBAAA,QAA+B,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AACjD,oBAAA,IAAI,eAAe,KAAK,KAAK,EAAE;wBAC7B,IAAI,MAAM,GAAG,EAAE;AACf,wBAAA,IAAI,KAAK,CAAC,IAAI,EAAE;AACd,4BAAA,MAAM,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI;kCAC3E,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE;AAC5B,kCAAE,UAAU,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC;wBACpD;AAAO,6BAAA,IAAI,KAAK,CAAC,GAAG,YAAY,IAAI,EAAE;4BACpC,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC;wBAC9C;AAAO,6BAAA,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;4BAChF,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;wBACrC;6BAAO;4BACL,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC;wBAClC;wBAEA,IAAI,MAAM,EAAE;4BACV,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;4BAChC,IAAI,QAAQ,EAAE;AACZ,gCAAA,QAAQ,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK;gCAC7B,IAAI,KAAK,CAAC,IAAI;AAAE,oCAAA,QAAQ,CAAC,IAAI,GAAG,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE;4BACrE;iCAAO;AACL,gCAAA,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;4BAC3D;wBACF;oBACF;yBAAO;;wBAEL,IAAI,MAAM,GAAG,EAAE;AACf,wBAAA,IAAI,KAAK,CAAC,GAAG,YAAY,IAAI,EAAE;AAC7B,4BAAA,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;4BAClE,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;4BAC5C,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,OAAO;wBAChG;AAAO,6BAAA,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;AACxC,4BAAA,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;wBACtD;6BAAO;4BACL,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC;wBAClC;AAEA,wBAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC;AAC5B,wBAAA,MAAM,GAAG,GAAG,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,EAAE;wBAC/B,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;wBAC7B,IAAI,QAAQ,EAAE;AACZ,4BAAA,QAAQ,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK;4BAC7B,IAAI,KAAK,CAAC,IAAI;AAAE,gCAAA,QAAQ,CAAC,IAAI,GAAG,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE;wBACrE;6BAAO;AACL,4BAAA,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;wBACxD;oBACF;AACF,gBAAA,CAAC,CAAC;YACJ;QACF;AAAO,aAAA,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;;YAEvC,MAAM,MAAM,GAAG,QAA6B;AAC5C,YAAA,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAI;gBACtD,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE;AACrD,oBAAA,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAI;wBACnD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AAC/B,wBAAA,IAAI,eAAe,KAAK,KAAK,EAAE;AAC7B,4BAAA,MAAM,GAAG,GAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,EAAE;4BACrC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;wBACjC;6BAAO;4BACL,MAAM,WAAW,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;4BAC5C,IAAI,WAAW,EAAE;AACf,gCAAA,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC7B,gCAAA,MAAM,GAAG,GAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,IAAI,EAAE;gCACjC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;4BACjC;iCAAO;AACL,gCAAA,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC7B,gCAAA,MAAM,GAAG,GAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,IAAI,EAAE;gCACjC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;4BACjC;wBACF;AACF,oBAAA,CAAC,CAAC;gBACJ;AACF,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,OAAO,GAAG;IACZ,CAAC;2FAAC;;AAGO,IAAA,mBAAmB,GAAG,QAAQ,CAA+B,MAAK;AACzE,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE;AACjC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE;AACjC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,EAAE;QAErC,IAAI,OAAO,GAAG,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE;AAC/B,YAAA,IAAI,IAAI,CAAC,KAAK,GAAG,OAAO;AAAE,gBAAA,OAAO,GAAG,IAAI,CAAC,KAAK;QAChD;AAEA,QAAA,MAAM,GAAG,GAAG,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,CAAC;QACnD,MAAM,GAAG,GAAG,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;AAEtE,QAAA,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE;IACrB,CAAC;4FAAC;;AAGO,IAAA,iBAAiB,GAAG,QAAQ,CAAS,MAAK;AACjD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE;AACvC,QAAA,OAAO,cAAc,CAAC,MAAM,CAAC,EAAE,WAAW,IAAI,cAAc,CAAC,MAAM,CAAC,WAAW;IACjF,CAAC;0FAAC;;AAGO,IAAA,aAAa,GAAG,QAAQ,CAA4C,MAAK;AAChF,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE;AACjC,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,EAAE;QAEvC,IAAI,CAAC,SAAS,EAAE;YACd,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7D;;AAGA,QAAA,IAAI,eAAe,KAAK,KAAK,EAAE;AAC7B,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;YACjC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7D;AAEA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE;AAC9B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;QAChC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;AAC9B,YAAA,GAAG,EAAE,IAAI;YACT,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM;AACzC,SAAA,CAAC,CAAC;IACL,CAAC;sFAAC;;AAGO,IAAA,QAAQ,GAAG,QAAQ,CAAkE,MAAK;AACjG,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,EAAE;AACvC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE;AACjC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,EAAE;QACrC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,mBAAmB,EAAE;AAC/C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE;QACvC,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,MAAM;AAC/D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;AACjC,QAAA,MAAM,UAAU,GAAG,OAAO,GAAG,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,GAAG,EAAE;AAC/C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;AAEhC,QAAA,MAAM,UAAU,GAAG,CAAC,GAAW,KAAI;AACjC,YAAA,MAAM,SAAS,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACrF,IAAI,OAAO,GAAG,EAAE;YAChB,IAAI,SAAS,GAAG,EAAE;AAClB,YAAA,IAAI,GAAG,KAAK,CAAC,EAAE;AACb,gBAAA,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE;AACzB,gBAAA,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI;YAC/B;iBAAO;AACL,gBAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC;AACjF,gBAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC;AACjF,gBAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC;gBACjF,OAAO,GAAG,OAAO,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,EAAK,CAAC,GAAG;AACjC,gBAAA,SAAS,GAAG,SAAS,IAAI,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI;YAC/D;AACA,YAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE;AAC1C,QAAA,CAAC;;AAGD,QAAA,IAAI,eAAe,KAAK,KAAK,EAAE;AAC7B,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;AACjC,YAAA,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;YAEnE,IAAI,CAAC,SAAS,EAAE;;gBAEd,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,OAAO,KAAI;AACjC,oBAAA,MAAM,KAAK,GAAkB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,KAAI;wBACvD,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,EAAE,YAAY,CAAC;AAC3C,wBAAA,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC;AACjC,wBAAA,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA,EAAG,OAAO,IAAI,OAAO,CAAA,CAAE,CAAC;AAClE,wBAAA,MAAM,GAAG,GAAG,KAAK,EAAE,KAAK,IAAI,CAAC;AAC7B,wBAAA,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC;AACzD,wBAAA,MAAM,OAAO,GAAG,CAAA,EAAG,UAAU,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAA,EAAA,EAAK,GAAG,CAAA,EAAG,UAAU,EAAE;wBAE7E,OAAO;AACL,4BAAA,EAAE,EAAE,OAAO;AACX,4BAAA,MAAM,EAAE,OAAO;4BACf,QAAQ,EAAE,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,CAAA,CAAG;4BAC9C,MAAM,EAAE,IAAI,CAAC,KAAK;4BAClB,QAAQ,EAAE,IAAI,CAAC,KAAK;AACpB,4BAAA,KAAK,EAAE,GAAG;4BACV,SAAS;AACT,4BAAA,eAAe,EAAE,OAAO;4BACxB,SAAS;AACT,4BAAA,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC;AAC3B,4BAAA,WAAW,EAAE,OAAO;AACpB,4BAAA,IAAI,EAAE,CAAC;4BACP,IAAI,EAAE,KAAK,EAAE;yBACd;AACH,oBAAA,CAAC,CAAC;oBAEF,OAAO;wBACL,GAAG,EAAE,IAAI,CAAC,KAAK;wBACf,KAAK,EAAE,IAAI,CAAC,KAAK;wBACjB;qBACD;AACH,gBAAA,CAAC,CAAC;YACJ;iBAAO;;gBAEL,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;oBACvC,MAAM,KAAK,GAAkB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,OAAO,KAAI;wBACvD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;wBAC3B,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,EAAE,YAAY,CAAC;AAC3C,wBAAA,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA,EAAG,OAAO,IAAI,OAAO,CAAA,CAAE,CAAC;AAClE,wBAAA,MAAM,GAAG,GAAG,KAAK,EAAE,KAAK,IAAI,CAAC;AAC7B,wBAAA,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC;AACzD,wBAAA,MAAM,OAAO,GAAG,CAAA,EAAG,UAAU,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAA,EAAA,EAAK,GAAG,CAAA,EAAG,UAAU,EAAE;wBAE7E,OAAO;4BACL,EAAE,EAAE,CAAA,EAAG,OAAO,CAAA,QAAA,CAAU;4BACxB,MAAM,EAAE,IAAI,CAAC,KAAK;4BAClB,QAAQ,EAAE,IAAI,CAAC,KAAK;AACpB,4BAAA,MAAM,EAAE,OAAO;AACf,4BAAA,QAAQ,EAAE,OAAO;AACjB,4BAAA,KAAK,EAAE,GAAG;4BACV,SAAS;AACT,4BAAA,eAAe,EAAE,OAAO;4BACxB,SAAS;AACT,4BAAA,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC;AAC3B,4BAAA,WAAW,EAAE,OAAO;AACpB,4BAAA,IAAI,EAAE,CAAC;4BACP,IAAI,EAAE,KAAK,EAAE;yBACd;AACH,oBAAA,CAAC,CAAC;oBAEF,OAAO;AACL,wBAAA,GAAG,EAAE,OAAO;AACZ,wBAAA,KAAK,EAAE,OAAO;wBACd;qBACD;AACH,gBAAA,CAAC,CAAC;YACJ;QACF;;AAGA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE;AAC9B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE;QAE5B,IAAI,CAAC,SAAS,EAAE;;AAEd,YAAA,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;gBAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC;gBACpD,MAAM,KAAK,GAAkB,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;AAChD,oBAAA,MAAM,GAAG,GAAG,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,IAAI,EAAE;oBAC5B,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AAC1B,oBAAA,MAAM,GAAG,GAAG,KAAK,EAAE,KAAK,IAAI,CAAC;AAC7B,oBAAA,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC;oBACzD,MAAM,OAAO,GAAG,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,SAAS,CAAA,EAAA,EAAK,GAAG,CAAA,EAAG,UAAU,CAAA,CAAE;oBAE3D,OAAO;AACL,wBAAA,EAAE,EAAE,GAAG;AACP,wBAAA,MAAM,EAAE,GAAG;AACX,wBAAA,QAAQ,EAAE,GAAG;AACb,wBAAA,MAAM,EAAE,IAAI;AACZ,wBAAA,QAAQ,EAAE,SAAS;AACnB,wBAAA,KAAK,EAAE,GAAG;wBACV,SAAS;AACT,wBAAA,eAAe,EAAE,OAAO;wBACxB,SAAS;AACT,wBAAA,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC;AAC3B,wBAAA,WAAW,EAAE,OAAO;wBACpB,IAAI,EAAE,KAAK,EAAE;qBACd;AACH,gBAAA,CAAC,CAAC;gBAEF,OAAO;AACL,oBAAA,GAAG,EAAE,IAAI;AACT,oBAAA,KAAK,EAAE,SAAS;oBAChB;iBACD;AACH,YAAA,CAAC,CAAC;QACJ;aAAO;;AAEL,YAAA,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;gBAC1B,MAAM,KAAK,GAAkB,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;oBAClD,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC;AACpD,oBAAA,MAAM,GAAG,GAAG,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,IAAI,EAAE;oBAC5B,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AAC1B,oBAAA,MAAM,GAAG,GAAG,KAAK,EAAE,KAAK,IAAI,CAAC;AAC7B,oBAAA,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC;oBACzD,MAAM,OAAO,GAAG,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,SAAS,CAAA,EAAA,EAAK,GAAG,CAAA,EAAG,UAAU,CAAA,CAAE;oBAE3D,OAAO;wBACL,EAAE,EAAE,CAAA,EAAG,GAAG,CAAA,QAAA,CAAU;AACpB,wBAAA,MAAM,EAAE,IAAI;AACZ,wBAAA,QAAQ,EAAE,SAAS;AACnB,wBAAA,MAAM,EAAE,GAAG;AACX,wBAAA,QAAQ,EAAE,GAAG;AACb,wBAAA,KAAK,EAAE,GAAG;wBACV,SAAS;AACT,wBAAA,eAAe,EAAE,OAAO;wBACxB,SAAS;AACT,wBAAA,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC;AAC3B,wBAAA,WAAW,EAAE,OAAO;wBACpB,IAAI,EAAE,KAAK,EAAE;qBACd;AACH,gBAAA,CAAC,CAAC;gBAEF,OAAO;AACL,oBAAA,GAAG,EAAE,GAAG;AACR,oBAAA,KAAK,EAAE,GAAG;oBACV;iBACD;AACH,YAAA,CAAC,CAAC;QACJ;IACF,CAAC;iFAAC;AAEF,IAAA,WAAA,GAAA;;QAEE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC7B,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE;AAC3B,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE;AAE/B,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACxB,gBAAA,QAAQ,EAAE,KAAK;AACf,gBAAA,SAAS,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS;gBAClD,OAAO,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,SAAS;gBAC/D,IAAI;AACJ,gBAAA,SAAS,EAAE,EAAE,EAAE,SAAS,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,SAAgB,CAAC,GAAG,SAAS;AACpE,gBAAA,OAAO,EAAE,EAAE,EAAE,OAAO,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,OAAc,CAAC,GAAG,SAAS;AAC9D,gBAAA,SAAS,EAAE,EAAE;AACb,gBAAA,QAAQ,EAAE;AACX,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;;AAGF,QAAA,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;YACnC,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,KAAiB,KAAI;AACvD,gBAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,gBAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACnD,oBAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC;AACpC,oBAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC;gBACtC;AACF,YAAA,CAAC,CAAC;QACJ;IACF;IAEA,eAAe,CAAC,IAAY,EAAE,MAAyB,EAAA;AACrD,QAAA,IAAI,MAAM,KAAK,KAAK,EAAE;AACpB,YAAA,OAAO,CAAA,EAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK;QACjD;QACA,IAAI,IAAI,KAAK,CAAC;AAAE,YAAA,OAAO,OAAO;QAC9B,IAAI,IAAI,GAAG,EAAE;YAAE,OAAO,CAAA,EAAG,IAAI,CAAA,GAAA,CAAK;QAClC,IAAI,IAAI,KAAK,EAAE;AAAE,YAAA,OAAO,OAAO;AAC/B,QAAA,OAAO,CAAA,EAAG,IAAI,GAAG,EAAE,KAAK;IAC1B;AAEA,IAAA,WAAW,CAAC,WAA4B,EAAA;AACtC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC;IAChC;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACjC;AAEA,IAAA,uBAAuB,CAAC,GAA0B,EAAA;AAChD,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;IACzB;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACnC;AAEA,IAAA,oBAAoB,CAAC,KAAiB,EAAA;QACpC,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3C,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC;IACtC;AAEA,IAAA,oBAAoB,CAAC,KAAiB,EAAA;QACpC,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3C,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC;IACtC;AAEA,IAAA,YAAY,CAAC,MAAqB,EAAA;QAChC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;AACpC,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC;AACpC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;IAChC;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,IAAiB,EAAA;AAChC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;IAC3B;IAEA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;IAC3B;IAEA,WAAW,CAAC,IAAiB,EAAE,KAAiB,EAAA;AAC9C,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAClB,IAAI;YACJ,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;AACjB,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;YACzB;AACD,SAAA,CAAC;IACJ;AAEA,IAAA,SAAS,CAAC,KAAoB,EAAE,MAAc,EAAE,MAAc,EAAA;AAC5D,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC5B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE;QACjC,IAAI,SAAS,GAAG,MAAM;QACtB,IAAI,SAAS,GAAG,MAAM;AAEtB,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE;YAC3B,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;YACnC,KAAK,CAAC,cAAc,EAAE;QACxB;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE;AACpC,YAAA,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;YACjD,KAAK,CAAC,cAAc,EAAE;QACxB;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE;YACpC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;YACnC,KAAK,CAAC,cAAc,EAAE;QACxB;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,EAAE;AACrC,YAAA,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;YACjD,KAAK,CAAC,cAAc,EAAE;QACxB;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;YACrD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC;YACxC,IAAI,IAAI,EAAE;AACR,gBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;oBAClB,IAAI;oBACJ,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;AACjB,oBAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;oBACzB;AACD,iBAAA,CAAC;YACJ;YACA,KAAK,CAAC,cAAc,EAAE;YACtB;QACF;QAEA,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,MAAM,EAAE;AAChD,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACnE,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CACxD,qBAAqB,SAAS,CAAA,CAAA,EAAI,SAAS,CAAA,EAAA,CAAI,CACjC;YAChB,MAAM,EAAE,KAAK,EAAE;QACjB;IACF;AAEA,IAAA,aAAa,CAAC,MAA2B,EAAA;AACvC,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC;AACpC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC5B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AAExB,QAAA,IAAI,MAAM,KAAK,KAAK,EAAE;AACpB,YAAA,MAAM,MAAM,GAAG,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAC5F,YAAA,MAAM,UAAU,GAAG,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,IAAI,EAAE;YAEvC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,yBAAyB,EAAE,CAAA,QAAA,EAAW,IAAI,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA,IAAA,CAAM,CAAC;AAC1H,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QACvD;AAAO,aAAA,IAAI,MAAM,KAAK,MAAM,EAAE;YAC5B,MAAM,WAAW,GAA2C,EAAE;AAC9D,YAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;AACjB,gBAAA,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;gBACzB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;AACpB,oBAAA,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK;AAC1C,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC,CAAC;AACF,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,iCAAiC,EAAE,CAAA,QAAA,EAAW,IAAI,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA,KAAA,CAAO,CAAC;AAChI,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;QACzD;IACF;AAEQ,IAAA,YAAY,CAAC,OAAe,EAAE,QAAgB,EAAE,QAAgB,EAAA;QACtE,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE;AACnC,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;QACrC,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;AACrC,QAAA,CAAC,CAAC,IAAI,GAAG,GAAG;AACZ,QAAA,CAAC,CAAC,QAAQ,GAAG,QAAQ;AACrB,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QAC5B,CAAC,CAAC,KAAK,EAAE;AACT,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;AAC5B,QAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC;IAC1B;uGAjqBW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,gBAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,cAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,8BAAA,EAAA,cAAA,EAAA,6BAAA,EAAA,WAAA,EAAA,wBAAA,EAAA,uBAAA,EAAA,wBAAA,EAAA,uBAAA,EAAA,wBAAA,EAAA,uBAAA,EAAA,0BAAA,EAAA,0BAAA,EAAA,6BAAA,EAAA,6BAAA,EAAA,4BAAA,EAAA,4BAAA,EAAA,+BAAA,EAAA,cAAA,EAAA,oCAAA,EAAA,eAAA,EAAA,kCAAA,EAAA,YAAA,EAAA,WAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,EAAA,cAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7JlC,k/PA6KM,EAAA,MAAA,EAAA,CAAA,k1TAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDlDF,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,wBAAwB,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,OAAA,EAAA,eAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,WAAA,EAAA,MAAA,EAAA,eAAA,EAAA,aAAA,EAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,YAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,qBAAqB,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,eAAe,EAAA,QAAA,EAAA,sBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,YAAY,EAAA,QAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,eAAe,EAAA,QAAA,EAAA,sBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,eAAe,EAAA,QAAA,EAAA,sBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,iBAAiB,EAAA,QAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,WAAW,EAAA,QAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,qBAAqB,EAAA,QAAA,EAAA,4BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,cAAc,EAAA,QAAA,EAAA,4CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,cAAc,EAAA,QAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,WAAW,6DACX,oBAAoB,EAAA,QAAA,EAAA,2BAAA,EAAA,CAAA,EAAA,CAAA;;2FAqBX,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBArCjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EAAA,OAAA,EAChB;wBACP,WAAW;wBACX,wBAAwB;wBACxB,qBAAqB;wBACrB,eAAe;wBACf,YAAY;wBACZ,eAAe;wBACf,eAAe;wBACf,iBAAiB;wBACjB,WAAW;wBACX,qBAAqB;wBACrB,cAAc;wBACd,cAAc;wBACd,WAAW;wBACX;qBACD,EAAA,IAAA,EAGK;AACJ,wBAAA,OAAO,EAAE,eAAe;AACxB,wBAAA,gCAAgC,EAAE,cAAc;AAChD,wBAAA,+BAA+B,EAAE,WAAW;AAC5C,wBAAA,0BAA0B,EAAE,qBAAqB;AACjD,wBAAA,0BAA0B,EAAE,qBAAqB;AACjD,wBAAA,0BAA0B,EAAE,qBAAqB;AACjD,wBAAA,4BAA4B,EAAE,wBAAwB;AACtD,wBAAA,+BAA+B,EAAE,2BAA2B;AAC5D,wBAAA,8BAA8B,EAAE,0BAA0B;AAC1D,wBAAA,iCAAiC,EAAE,cAAc;AACjD,wBAAA,sCAAsC,EAAE,eAAe;AACvD,wBAAA,oCAAoC,EAAE,YAAY;AAClD,wBAAA,aAAa,EAAE,UAAU;AACzB,wBAAA,mBAAmB,EAAE;AACtB,qBAAA,EAAA,QAAA,EAAA,k/PAAA,EAAA,MAAA,EAAA,CAAA,k1TAAA,CAAA,EAAA;;;MEpJU,kBAAkB,CAAA;uGAAlB,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;wGAAlB,kBAAkB,EAAA,OAAA,EAAA,CAHnB,qBAAqB,CAAA,EAAA,OAAA,EAAA,CACrB,qBAAqB,CAAA,EAAA,CAAA;AAEpB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,YAHnB,qBAAqB,CAAA,EAAA,CAAA;;2FAGpB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAJ9B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,OAAO,EAAE,CAAC,qBAAqB,CAAC;oBAChC,OAAO,EAAE,CAAC,qBAAqB;AAChC,iBAAA;;;ACND;;AAEG;;;;"}
@@ -1,267 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { input, output, computed, Component, NgModule } from '@angular/core';
3
-
4
- /**
5
- * Types and interfaces for TalosMiniDonutComponent
6
- */
7
-
8
- const PRESET_COLORS = {
9
- primary: '#2563eb',
10
- blue: '#3b82f6',
11
- success: '#16a34a',
12
- emerald: '#10b981',
13
- danger: '#ef4444',
14
- rose: '#f43f5e',
15
- warning: '#f59e0b',
16
- amber: '#d97706',
17
- info: '#0284c7',
18
- cyan: '#06b6d4',
19
- violet: '#8b5cf6',
20
- purple: '#9333ea',
21
- pink: '#ec4899',
22
- slate: '#64748b'
23
- };
24
- const DEFAULT_PALETTE = ['#3b82f6', '#10b981', '#8b5cf6', '#f59e0b', '#ec4899', '#06b6d4'];
25
- const SIZE_PRESETS = {
26
- xs: { px: 24, stroke: 3 },
27
- sm: { px: 32, stroke: 4 },
28
- md: { px: 48, stroke: 5 },
29
- lg: { px: 64, stroke: 6 },
30
- xl: { px: 88, stroke: 8 }
31
- };
32
- class TalosMiniDonutComponent {
33
- /** Single progress value (e.g. 75 or 450) */
34
- value = input(null, /* @ts-ignore */
35
- ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
36
- /** Minimum value for single progress mode */
37
- min = input(0, /* @ts-ignore */
38
- ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
39
- /** Maximum value for single progress mode */
40
- max = input(100, /* @ts-ignore */
41
- ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
42
- /** Multi-segment dataset */
43
- segments = input(null, /* @ts-ignore */
44
- ...(ngDevMode ? [{ debugName: "segments" }] : /* istanbul ignore next */ []));
45
- /** Size preset */
46
- size = input('md', /* @ts-ignore */
47
- ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
48
- /** Custom dimension override in px */
49
- dimension = input(null, /* @ts-ignore */
50
- ...(ngDevMode ? [{ debugName: "dimension" }] : /* istanbul ignore next */ []));
51
- /** Custom stroke width override */
52
- strokeWidth = input(null, /* @ts-ignore */
53
- ...(ngDevMode ? [{ debugName: "strokeWidth" }] : /* istanbul ignore next */ []));
54
- /** Color scheme or hex string for single progress mode */
55
- color = input('primary', /* @ts-ignore */
56
- ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
57
- /** Background track ring color */
58
- trackColor = input(null, /* @ts-ignore */
59
- ...(ngDevMode ? [{ debugName: "trackColor" }] : /* istanbul ignore next */ []));
60
- /** Show background track */
61
- showTrack = input(true, /* @ts-ignore */
62
- ...(ngDevMode ? [{ debugName: "showTrack" }] : /* istanbul ignore next */ []));
63
- /** SVG stroke linecap */
64
- lineCap = input('round', /* @ts-ignore */
65
- ...(ngDevMode ? [{ debugName: "lineCap" }] : /* istanbul ignore next */ []));
66
- /** Gap spacing between segments in multi-segment mode (in px) */
67
- gap = input(2, /* @ts-ignore */
68
- ...(ngDevMode ? [{ debugName: "gap" }] : /* istanbul ignore next */ []));
69
- /** Show built-in center percentage or text */
70
- showCenterText = input(false, /* @ts-ignore */
71
- ...(ngDevMode ? [{ debugName: "showCenterText" }] : /* istanbul ignore next */ []));
72
- /** Explicit center primary text override */
73
- centerText = input(null, /* @ts-ignore */
74
- ...(ngDevMode ? [{ debugName: "centerText" }] : /* istanbul ignore next */ []));
75
- /** Secondary center subtext */
76
- centerSubtext = input(null, /* @ts-ignore */
77
- ...(ngDevMode ? [{ debugName: "centerSubtext" }] : /* istanbul ignore next */ []));
78
- /** Enable smooth CSS animation */
79
- animated = input(true, /* @ts-ignore */
80
- ...(ngDevMode ? [{ debugName: "animated" }] : /* istanbul ignore next */ []));
81
- /** Custom ARIA label */
82
- ariaLabel = input(null, /* @ts-ignore */
83
- ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
84
- /** Segment click event */
85
- segmentClick = output();
86
- // Internal SVG coordinate constants (viewBox is 0 0 100 100)
87
- svgSize = 100;
88
- center = 50;
89
- /** Computed pixel dimension */
90
- pixelDimension = computed(() => {
91
- const custom = this.dimension();
92
- if (custom !== null)
93
- return custom;
94
- const s = this.size();
95
- return s !== 'custom' ? SIZE_PRESETS[s].px : 48;
96
- }, /* @ts-ignore */
97
- ...(ngDevMode ? [{ debugName: "pixelDimension" }] : /* istanbul ignore next */ []));
98
- /** Computed stroke width in SVG coordinates */
99
- computedStrokeWidth = computed(() => {
100
- const custom = this.strokeWidth();
101
- if (custom !== null) {
102
- // Scale according to ratio with pixel dimension
103
- const px = this.pixelDimension();
104
- return (custom / px) * this.svgSize;
105
- }
106
- const s = this.size();
107
- const preset = s !== 'custom' ? SIZE_PRESETS[s] : SIZE_PRESETS['md'];
108
- return (preset.stroke / preset.px) * this.svgSize;
109
- }, /* @ts-ignore */
110
- ...(ngDevMode ? [{ debugName: "computedStrokeWidth" }] : /* istanbul ignore next */ []));
111
- /** Radius in SVG coordinates */
112
- radius = computed(() => {
113
- const sw = this.computedStrokeWidth();
114
- return (this.svgSize - sw) / 2;
115
- }, /* @ts-ignore */
116
- ...(ngDevMode ? [{ debugName: "radius" }] : /* istanbul ignore next */ []));
117
- /** Circumference */
118
- circumference = computed(() => {
119
- return 2 * Math.PI * this.radius();
120
- }, /* @ts-ignore */
121
- ...(ngDevMode ? [{ debugName: "circumference" }] : /* istanbul ignore next */ []));
122
- /** Effective single progress color */
123
- effectiveColor = computed(() => {
124
- const c = this.color();
125
- return PRESET_COLORS[c] || c;
126
- }, /* @ts-ignore */
127
- ...(ngDevMode ? [{ debugName: "effectiveColor" }] : /* istanbul ignore next */ []));
128
- /** Computed percentage for single progress mode */
129
- singlePercentage = computed(() => {
130
- const val = this.value();
131
- if (val === null)
132
- return 0;
133
- const minVal = this.min();
134
- const maxVal = this.max();
135
- if (maxVal <= minVal)
136
- return 0;
137
- const pct = ((val - minVal) / (maxVal - minVal)) * 100;
138
- return Math.min(100, Math.max(0, pct));
139
- }, /* @ts-ignore */
140
- ...(ngDevMode ? [{ debugName: "singlePercentage" }] : /* istanbul ignore next */ []));
141
- /** Single progress dash offset/array */
142
- singleDashArray = computed(() => {
143
- const circ = this.circumference();
144
- const pct = this.singlePercentage();
145
- const filled = (pct / 100) * circ;
146
- return `${filled} ${circ}`;
147
- }, /* @ts-ignore */
148
- ...(ngDevMode ? [{ debugName: "singleDashArray" }] : /* istanbul ignore next */ []));
149
- /** Computed multi-segment values with offsets */
150
- computedSegments = computed(() => {
151
- const segs = this.segments();
152
- if (!segs || segs.length === 0)
153
- return [];
154
- const circ = this.circumference();
155
- const totalVal = segs.reduce((acc, s) => acc + Math.max(0, s.value), 0);
156
- if (totalVal <= 0)
157
- return [];
158
- const gapPx = this.gap();
159
- const count = segs.length;
160
- const totalGap = count > 1 ? count * gapPx : 0;
161
- const availableCirc = Math.max(0, circ - totalGap);
162
- let accumulatedOffset = 0;
163
- return segs.map((seg, idx) => {
164
- const pct = (Math.max(0, seg.value) / totalVal) * 100;
165
- const length = (Math.max(0, seg.value) / totalVal) * availableCirc;
166
- const color = seg.color ? (PRESET_COLORS[seg.color] || seg.color) : DEFAULT_PALETTE[idx % DEFAULT_PALETTE.length];
167
- const dashArray = `${length} ${circ}`;
168
- // Dashoffset starts at accumulatedOffset (negative because SVG stroke-dashoffset clockwise)
169
- const dashOffset = -accumulatedOffset;
170
- accumulatedOffset += length + (count > 1 ? gapPx : 0);
171
- return {
172
- index: idx,
173
- value: seg.value,
174
- percentage: pct,
175
- color,
176
- label: seg.label,
177
- tooltip: seg.tooltip,
178
- dashArray,
179
- dashOffset,
180
- pathLength: circ
181
- };
182
- });
183
- }, /* @ts-ignore */
184
- ...(ngDevMode ? [{ debugName: "computedSegments" }] : /* istanbul ignore next */ []));
185
- /** Display text inside center */
186
- computedCenterText = computed(() => {
187
- const explicit = this.centerText();
188
- if (explicit !== null)
189
- return explicit;
190
- if (this.value() !== null) {
191
- return `${Math.round(this.singlePercentage())}%`;
192
- }
193
- return '';
194
- }, /* @ts-ignore */
195
- ...(ngDevMode ? [{ debugName: "computedCenterText" }] : /* istanbul ignore next */ []));
196
- /** ARIA attributes */
197
- currentAriaValue = computed(() => {
198
- if (this.value() !== null)
199
- return this.value();
200
- const segs = this.segments();
201
- if (segs && segs.length > 0)
202
- return segs.reduce((a, b) => a + b.value, 0);
203
- return 0;
204
- }, /* @ts-ignore */
205
- ...(ngDevMode ? [{ debugName: "currentAriaValue" }] : /* istanbul ignore next */ []));
206
- computedAriaLabel = computed(() => {
207
- const custom = this.ariaLabel();
208
- if (custom)
209
- return custom;
210
- if (this.value() !== null) {
211
- return `Progress: ${Math.round(this.singlePercentage())}%`;
212
- }
213
- const segs = this.segments();
214
- if (segs && segs.length > 0) {
215
- return `Donut chart with ${segs.length} categories`;
216
- }
217
- return 'Mini donut chart';
218
- }, /* @ts-ignore */
219
- ...(ngDevMode ? [{ debugName: "computedAriaLabel" }] : /* istanbul ignore next */ []));
220
- onSegmentClick(segIndex) {
221
- const rawSegs = this.segments();
222
- if (rawSegs && rawSegs[segIndex]) {
223
- this.segmentClick.emit(rawSegs[segIndex]);
224
- }
225
- }
226
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosMiniDonutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
227
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.1", type: TalosMiniDonutComponent, isStandalone: true, selector: "talos-mini-donut", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, segments: { classPropertyName: "segments", publicName: "segments", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, dimension: { classPropertyName: "dimension", publicName: "dimension", isSignal: true, isRequired: false, transformFunction: null }, strokeWidth: { classPropertyName: "strokeWidth", publicName: "strokeWidth", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, trackColor: { classPropertyName: "trackColor", publicName: "trackColor", isSignal: true, isRequired: false, transformFunction: null }, showTrack: { classPropertyName: "showTrack", publicName: "showTrack", isSignal: true, isRequired: false, transformFunction: null }, lineCap: { classPropertyName: "lineCap", publicName: "lineCap", isSignal: true, isRequired: false, transformFunction: null }, gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null }, showCenterText: { classPropertyName: "showCenterText", publicName: "showCenterText", isSignal: true, isRequired: false, transformFunction: null }, centerText: { classPropertyName: "centerText", publicName: "centerText", isSignal: true, isRequired: false, transformFunction: null }, centerSubtext: { classPropertyName: "centerSubtext", publicName: "centerSubtext", isSignal: true, isRequired: false, transformFunction: null }, animated: { classPropertyName: "animated", publicName: "animated", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { segmentClick: "segmentClick" }, host: { properties: { "class.talos-mini-donut-xs": "size() === \"xs\"", "class.talos-mini-donut-sm": "size() === \"sm\"", "class.talos-mini-donut-md": "size() === \"md\"", "class.talos-mini-donut-lg": "size() === \"lg\"", "class.talos-mini-donut-xl": "size() === \"xl\"", "class.talos-mini-donut-animated": "animated()", "style.width.px": "pixelDimension()", "style.height.px": "pixelDimension()", "attr.role": "\"meter\"", "attr.aria-valuenow": "currentAriaValue()", "attr.aria-valuemin": "min()", "attr.aria-valuemax": "max()", "attr.aria-label": "computedAriaLabel()" }, classAttribute: "talos-mini-donut" }, ngImport: i0, template: "<svg\n class=\"talos-mini-donut-svg\"\n [attr.viewBox]=\"'0 0 ' + svgSize + ' ' + svgSize\"\n aria-hidden=\"true\"\n>\n <!-- Background Track -->\n @if (showTrack()) {\n <circle\n class=\"talos-mini-donut-track\"\n [attr.cx]=\"center\"\n [attr.cy]=\"center\"\n [attr.r]=\"radius()\"\n [attr.stroke-width]=\"computedStrokeWidth()\"\n [attr.stroke]=\"trackColor() || 'var(--talos-border-color, #e2e8f0)'\"\n fill=\"none\"\n />\n }\n\n <!-- Single Value Progress Mode -->\n @if (segments() === null && value() !== null) {\n <circle\n class=\"talos-mini-donut-progress\"\n [attr.cx]=\"center\"\n [attr.cy]=\"center\"\n [attr.r]=\"radius()\"\n [attr.stroke-width]=\"computedStrokeWidth()\"\n [attr.stroke]=\"effectiveColor()\"\n [attr.stroke-dasharray]=\"singleDashArray()\"\n [attr.stroke-linecap]=\"lineCap()\"\n fill=\"none\"\n />\n }\n\n <!-- Multi-Segment Mode -->\n @if (segments() !== null) {\n @for (seg of computedSegments(); track seg.index) {\n <circle\n class=\"talos-mini-donut-segment\"\n [attr.cx]=\"center\"\n [attr.cy]=\"center\"\n [attr.r]=\"radius()\"\n [attr.stroke-width]=\"computedStrokeWidth()\"\n [attr.stroke]=\"seg.color\"\n [attr.stroke-dasharray]=\"seg.dashArray\"\n [attr.stroke-dashoffset]=\"seg.dashOffset\"\n [attr.stroke-linecap]=\"lineCap()\"\n fill=\"none\"\n (click)=\"onSegmentClick(seg.index)\"\n />\n }\n }\n</svg>\n\n<!-- Center Content Slot or Built-in Text -->\n<div class=\"talos-mini-donut-center\">\n <ng-content>\n @if (showCenterText() && computedCenterText()) {\n <span class=\"talos-mini-donut-center-text\">{{ computedCenterText() }}</span>\n @if (centerSubtext()) {\n <span class=\"talos-mini-donut-center-subtext\">{{ centerSubtext() }}</span>\n }\n }\n </ng-content>\n</div>\n", styles: [":host{position:relative;display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;box-sizing:border-box;flex-shrink:0}:host .talos-mini-donut-svg{width:100%;height:100%;overflow:visible;transform:rotate(-90deg)}:host .talos-mini-donut-track{opacity:.7;transition:stroke .2s ease}:host .talos-mini-donut-progress,:host .talos-mini-donut-segment{cursor:pointer}:host.talos-mini-donut-animated .talos-mini-donut-progress,:host.talos-mini-donut-animated .talos-mini-donut-segment{transition:stroke-dasharray .4s cubic-bezier(.4,0,.2,1),stroke-dashoffset .4s cubic-bezier(.4,0,.2,1),stroke .2s ease}:host .talos-mini-donut-center{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;pointer-events:none;text-align:center;line-height:1}:host .talos-mini-donut-center .talos-mini-donut-center-text{font-weight:700;color:var(--talos-text-color, #0f172a);letter-spacing:-.02em}:host .talos-mini-donut-center .talos-mini-donut-center-subtext{font-size:.625rem;font-weight:500;color:var(--talos-text-muted, #64748b);margin-top:2px}:host.talos-mini-donut-xs .talos-mini-donut-center-text{font-size:.5625rem}:host.talos-mini-donut-sm .talos-mini-donut-center-text{font-size:.6875rem}:host.talos-mini-donut-md .talos-mini-donut-center-text{font-size:.8125rem}:host.talos-mini-donut-lg .talos-mini-donut-center-text{font-size:1rem}:host.talos-mini-donut-xl .talos-mini-donut-center-text{font-size:1.25rem}:root[data-theme=dark] :host .talos-mini-donut-track,:root.dark :host .talos-mini-donut-track,[data-theme=dark] :host .talos-mini-donut-track,[data-mode=dark] :host .talos-mini-donut-track,.dark :host .talos-mini-donut-track,.dark-theme :host .talos-mini-donut-track{stroke:var(--talos-border-color, #334155);opacity:.5}:root[data-theme=dark] :host .talos-mini-donut-center-text,:root.dark :host .talos-mini-donut-center-text,[data-theme=dark] :host .talos-mini-donut-center-text,[data-mode=dark] :host .talos-mini-donut-center-text,.dark :host .talos-mini-donut-center-text,.dark-theme :host .talos-mini-donut-center-text{color:var(--talos-text-color, #f8fafc)}:root[data-theme=dark] :host .talos-mini-donut-center-subtext,:root.dark :host .talos-mini-donut-center-subtext,[data-theme=dark] :host .talos-mini-donut-center-subtext,[data-mode=dark] :host .talos-mini-donut-center-subtext,.dark :host .talos-mini-donut-center-subtext,.dark-theme :host .talos-mini-donut-center-subtext{color:var(--talos-text-muted, #94a3b8)}\n"] });
228
- }
229
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosMiniDonutComponent, decorators: [{
230
- type: Component,
231
- args: [{ selector: 'talos-mini-donut', host: {
232
- 'class': 'talos-mini-donut',
233
- '[class.talos-mini-donut-xs]': 'size() === "xs"',
234
- '[class.talos-mini-donut-sm]': 'size() === "sm"',
235
- '[class.talos-mini-donut-md]': 'size() === "md"',
236
- '[class.talos-mini-donut-lg]': 'size() === "lg"',
237
- '[class.talos-mini-donut-xl]': 'size() === "xl"',
238
- '[class.talos-mini-donut-animated]': 'animated()',
239
- '[style.width.px]': 'pixelDimension()',
240
- '[style.height.px]': 'pixelDimension()',
241
- '[attr.role]': '"meter"',
242
- '[attr.aria-valuenow]': 'currentAriaValue()',
243
- '[attr.aria-valuemin]': 'min()',
244
- '[attr.aria-valuemax]': 'max()',
245
- '[attr.aria-label]': 'computedAriaLabel()'
246
- }, template: "<svg\n class=\"talos-mini-donut-svg\"\n [attr.viewBox]=\"'0 0 ' + svgSize + ' ' + svgSize\"\n aria-hidden=\"true\"\n>\n <!-- Background Track -->\n @if (showTrack()) {\n <circle\n class=\"talos-mini-donut-track\"\n [attr.cx]=\"center\"\n [attr.cy]=\"center\"\n [attr.r]=\"radius()\"\n [attr.stroke-width]=\"computedStrokeWidth()\"\n [attr.stroke]=\"trackColor() || 'var(--talos-border-color, #e2e8f0)'\"\n fill=\"none\"\n />\n }\n\n <!-- Single Value Progress Mode -->\n @if (segments() === null && value() !== null) {\n <circle\n class=\"talos-mini-donut-progress\"\n [attr.cx]=\"center\"\n [attr.cy]=\"center\"\n [attr.r]=\"radius()\"\n [attr.stroke-width]=\"computedStrokeWidth()\"\n [attr.stroke]=\"effectiveColor()\"\n [attr.stroke-dasharray]=\"singleDashArray()\"\n [attr.stroke-linecap]=\"lineCap()\"\n fill=\"none\"\n />\n }\n\n <!-- Multi-Segment Mode -->\n @if (segments() !== null) {\n @for (seg of computedSegments(); track seg.index) {\n <circle\n class=\"talos-mini-donut-segment\"\n [attr.cx]=\"center\"\n [attr.cy]=\"center\"\n [attr.r]=\"radius()\"\n [attr.stroke-width]=\"computedStrokeWidth()\"\n [attr.stroke]=\"seg.color\"\n [attr.stroke-dasharray]=\"seg.dashArray\"\n [attr.stroke-dashoffset]=\"seg.dashOffset\"\n [attr.stroke-linecap]=\"lineCap()\"\n fill=\"none\"\n (click)=\"onSegmentClick(seg.index)\"\n />\n }\n }\n</svg>\n\n<!-- Center Content Slot or Built-in Text -->\n<div class=\"talos-mini-donut-center\">\n <ng-content>\n @if (showCenterText() && computedCenterText()) {\n <span class=\"talos-mini-donut-center-text\">{{ computedCenterText() }}</span>\n @if (centerSubtext()) {\n <span class=\"talos-mini-donut-center-subtext\">{{ centerSubtext() }}</span>\n }\n }\n </ng-content>\n</div>\n", styles: [":host{position:relative;display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;box-sizing:border-box;flex-shrink:0}:host .talos-mini-donut-svg{width:100%;height:100%;overflow:visible;transform:rotate(-90deg)}:host .talos-mini-donut-track{opacity:.7;transition:stroke .2s ease}:host .talos-mini-donut-progress,:host .talos-mini-donut-segment{cursor:pointer}:host.talos-mini-donut-animated .talos-mini-donut-progress,:host.talos-mini-donut-animated .talos-mini-donut-segment{transition:stroke-dasharray .4s cubic-bezier(.4,0,.2,1),stroke-dashoffset .4s cubic-bezier(.4,0,.2,1),stroke .2s ease}:host .talos-mini-donut-center{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;pointer-events:none;text-align:center;line-height:1}:host .talos-mini-donut-center .talos-mini-donut-center-text{font-weight:700;color:var(--talos-text-color, #0f172a);letter-spacing:-.02em}:host .talos-mini-donut-center .talos-mini-donut-center-subtext{font-size:.625rem;font-weight:500;color:var(--talos-text-muted, #64748b);margin-top:2px}:host.talos-mini-donut-xs .talos-mini-donut-center-text{font-size:.5625rem}:host.talos-mini-donut-sm .talos-mini-donut-center-text{font-size:.6875rem}:host.talos-mini-donut-md .talos-mini-donut-center-text{font-size:.8125rem}:host.talos-mini-donut-lg .talos-mini-donut-center-text{font-size:1rem}:host.talos-mini-donut-xl .talos-mini-donut-center-text{font-size:1.25rem}:root[data-theme=dark] :host .talos-mini-donut-track,:root.dark :host .talos-mini-donut-track,[data-theme=dark] :host .talos-mini-donut-track,[data-mode=dark] :host .talos-mini-donut-track,.dark :host .talos-mini-donut-track,.dark-theme :host .talos-mini-donut-track{stroke:var(--talos-border-color, #334155);opacity:.5}:root[data-theme=dark] :host .talos-mini-donut-center-text,:root.dark :host .talos-mini-donut-center-text,[data-theme=dark] :host .talos-mini-donut-center-text,[data-mode=dark] :host .talos-mini-donut-center-text,.dark :host .talos-mini-donut-center-text,.dark-theme :host .talos-mini-donut-center-text{color:var(--talos-text-color, #f8fafc)}:root[data-theme=dark] :host .talos-mini-donut-center-subtext,:root.dark :host .talos-mini-donut-center-subtext,[data-theme=dark] :host .talos-mini-donut-center-subtext,[data-mode=dark] :host .talos-mini-donut-center-subtext,.dark :host .talos-mini-donut-center-subtext,.dark-theme :host .talos-mini-donut-center-subtext{color:var(--talos-text-muted, #94a3b8)}\n"] }]
247
- }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], segments: [{ type: i0.Input, args: [{ isSignal: true, alias: "segments", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], dimension: [{ type: i0.Input, args: [{ isSignal: true, alias: "dimension", required: false }] }], strokeWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "strokeWidth", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], trackColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "trackColor", required: false }] }], showTrack: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTrack", required: false }] }], lineCap: [{ type: i0.Input, args: [{ isSignal: true, alias: "lineCap", required: false }] }], gap: [{ type: i0.Input, args: [{ isSignal: true, alias: "gap", required: false }] }], showCenterText: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCenterText", required: false }] }], centerText: [{ type: i0.Input, args: [{ isSignal: true, alias: "centerText", required: false }] }], centerSubtext: [{ type: i0.Input, args: [{ isSignal: true, alias: "centerSubtext", required: false }] }], animated: [{ type: i0.Input, args: [{ isSignal: true, alias: "animated", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], segmentClick: [{ type: i0.Output, args: ["segmentClick"] }] } });
248
-
249
- class TalosMiniDonutModule {
250
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosMiniDonutModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
251
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.1.1", ngImport: i0, type: TalosMiniDonutModule, imports: [TalosMiniDonutComponent], exports: [TalosMiniDonutComponent] });
252
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosMiniDonutModule });
253
- }
254
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosMiniDonutModule, decorators: [{
255
- type: NgModule,
256
- args: [{
257
- imports: [TalosMiniDonutComponent],
258
- exports: [TalosMiniDonutComponent]
259
- }]
260
- }] });
261
-
262
- /**
263
- * Generated bundle index. Do not edit.
264
- */
265
-
266
- export { TalosMiniDonutComponent, TalosMiniDonutModule };
267
- //# sourceMappingURL=weeehaoooz-talos-ui-data-viz-mini-donut.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"weeehaoooz-talos-ui-data-viz-mini-donut.mjs","sources":["../../../projects/talos-ui/data-viz/mini-donut/mini-donut.types.ts","../../../projects/talos-ui/data-viz/mini-donut/mini-donut.component.ts","../../../projects/talos-ui/data-viz/mini-donut/mini-donut.component.html","../../../projects/talos-ui/data-viz/mini-donut/mini-donut.module.ts","../../../projects/talos-ui/data-viz/mini-donut/weeehaoooz-talos-ui-data-viz-mini-donut.ts"],"sourcesContent":["/**\n * Types and interfaces for TalosMiniDonutComponent\n */\n\nexport type MiniDonutSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'custom';\n\nexport type MiniDonutLineCap = 'round' | 'butt';\n\nexport type MiniDonutColorScheme =\n | 'primary'\n | 'success'\n | 'danger'\n | 'warning'\n | 'info'\n | 'violet'\n | 'emerald'\n | 'rose'\n | 'amber'\n | 'cyan'\n | 'slate'\n | string;\n\nexport interface MiniDonutSegment {\n value: number;\n color?: string;\n label?: string;\n tooltip?: string;\n id?: string;\n}\n\nexport interface ComputedDonutSegment {\n index: number;\n value: number;\n percentage: number;\n color: string;\n label?: string;\n tooltip?: string;\n dashArray: string;\n dashOffset: number;\n pathLength: number;\n}\n","import { Component, computed, input, output } from '@angular/core';\nimport {\n ComputedDonutSegment,\n MiniDonutColorScheme,\n MiniDonutLineCap,\n MiniDonutSegment,\n MiniDonutSize\n} from './mini-donut.types';\n\nconst PRESET_COLORS: Record<string, string> = {\n primary: '#2563eb',\n blue: '#3b82f6',\n success: '#16a34a',\n emerald: '#10b981',\n danger: '#ef4444',\n rose: '#f43f5e',\n warning: '#f59e0b',\n amber: '#d97706',\n info: '#0284c7',\n cyan: '#06b6d4',\n violet: '#8b5cf6',\n purple: '#9333ea',\n pink: '#ec4899',\n slate: '#64748b'\n};\n\nconst DEFAULT_PALETTE = ['#3b82f6', '#10b981', '#8b5cf6', '#f59e0b', '#ec4899', '#06b6d4'];\n\nconst SIZE_PRESETS: Record<Exclude<MiniDonutSize, 'custom'>, { px: number; stroke: number }> = {\n xs: { px: 24, stroke: 3 },\n sm: { px: 32, stroke: 4 },\n md: { px: 48, stroke: 5 },\n lg: { px: 64, stroke: 6 },\n xl: { px: 88, stroke: 8 }\n};\n\n@Component({\n selector: 'talos-mini-donut',\n templateUrl: './mini-donut.component.html',\n styleUrl: './mini-donut.component.scss',\n host: {\n 'class': 'talos-mini-donut',\n '[class.talos-mini-donut-xs]': 'size() === \"xs\"',\n '[class.talos-mini-donut-sm]': 'size() === \"sm\"',\n '[class.talos-mini-donut-md]': 'size() === \"md\"',\n '[class.talos-mini-donut-lg]': 'size() === \"lg\"',\n '[class.talos-mini-donut-xl]': 'size() === \"xl\"',\n '[class.talos-mini-donut-animated]': 'animated()',\n '[style.width.px]': 'pixelDimension()',\n '[style.height.px]': 'pixelDimension()',\n '[attr.role]': '\"meter\"',\n '[attr.aria-valuenow]': 'currentAriaValue()',\n '[attr.aria-valuemin]': 'min()',\n '[attr.aria-valuemax]': 'max()',\n '[attr.aria-label]': 'computedAriaLabel()'\n }\n})\nexport class TalosMiniDonutComponent {\n /** Single progress value (e.g. 75 or 450) */\n readonly value = input<number | null>(null);\n\n /** Minimum value for single progress mode */\n readonly min = input<number>(0);\n\n /** Maximum value for single progress mode */\n readonly max = input<number>(100);\n\n /** Multi-segment dataset */\n readonly segments = input<MiniDonutSegment[] | null>(null);\n\n /** Size preset */\n readonly size = input<MiniDonutSize>('md');\n\n /** Custom dimension override in px */\n readonly dimension = input<number | null>(null);\n\n /** Custom stroke width override */\n readonly strokeWidth = input<number | null>(null);\n\n /** Color scheme or hex string for single progress mode */\n readonly color = input<MiniDonutColorScheme>('primary');\n\n /** Background track ring color */\n readonly trackColor = input<string | null>(null);\n\n /** Show background track */\n readonly showTrack = input<boolean>(true);\n\n /** SVG stroke linecap */\n readonly lineCap = input<MiniDonutLineCap>('round');\n\n /** Gap spacing between segments in multi-segment mode (in px) */\n readonly gap = input<number>(2);\n\n /** Show built-in center percentage or text */\n readonly showCenterText = input<boolean>(false);\n\n /** Explicit center primary text override */\n readonly centerText = input<string | null>(null);\n\n /** Secondary center subtext */\n readonly centerSubtext = input<string | null>(null);\n\n /** Enable smooth CSS animation */\n readonly animated = input<boolean>(true);\n\n /** Custom ARIA label */\n readonly ariaLabel = input<string | null>(null);\n\n /** Segment click event */\n readonly segmentClick = output<MiniDonutSegment>();\n\n // Internal SVG coordinate constants (viewBox is 0 0 100 100)\n protected readonly svgSize = 100;\n protected readonly center = 50;\n\n /** Computed pixel dimension */\n readonly pixelDimension = computed(() => {\n const custom = this.dimension();\n if (custom !== null) return custom;\n const s = this.size();\n return s !== 'custom' ? SIZE_PRESETS[s].px : 48;\n });\n\n /** Computed stroke width in SVG coordinates */\n readonly computedStrokeWidth = computed(() => {\n const custom = this.strokeWidth();\n if (custom !== null) {\n // Scale according to ratio with pixel dimension\n const px = this.pixelDimension();\n return (custom / px) * this.svgSize;\n }\n const s = this.size();\n const preset = s !== 'custom' ? SIZE_PRESETS[s] : SIZE_PRESETS['md'];\n return (preset.stroke / preset.px) * this.svgSize;\n });\n\n /** Radius in SVG coordinates */\n readonly radius = computed(() => {\n const sw = this.computedStrokeWidth();\n return (this.svgSize - sw) / 2;\n });\n\n /** Circumference */\n readonly circumference = computed(() => {\n return 2 * Math.PI * this.radius();\n });\n\n /** Effective single progress color */\n readonly effectiveColor = computed(() => {\n const c = this.color();\n return PRESET_COLORS[c] || c;\n });\n\n /** Computed percentage for single progress mode */\n readonly singlePercentage = computed(() => {\n const val = this.value();\n if (val === null) return 0;\n const minVal = this.min();\n const maxVal = this.max();\n if (maxVal <= minVal) return 0;\n const pct = ((val - minVal) / (maxVal - minVal)) * 100;\n return Math.min(100, Math.max(0, pct));\n });\n\n /** Single progress dash offset/array */\n readonly singleDashArray = computed(() => {\n const circ = this.circumference();\n const pct = this.singlePercentage();\n const filled = (pct / 100) * circ;\n return `${filled} ${circ}`;\n });\n\n /** Computed multi-segment values with offsets */\n readonly computedSegments = computed<ComputedDonutSegment[]>(() => {\n const segs = this.segments();\n if (!segs || segs.length === 0) return [];\n\n const circ = this.circumference();\n const totalVal = segs.reduce((acc, s) => acc + Math.max(0, s.value), 0);\n if (totalVal <= 0) return [];\n\n const gapPx = this.gap();\n const count = segs.length;\n const totalGap = count > 1 ? count * gapPx : 0;\n const availableCirc = Math.max(0, circ - totalGap);\n\n let accumulatedOffset = 0;\n\n return segs.map((seg, idx) => {\n const pct = (Math.max(0, seg.value) / totalVal) * 100;\n const length = (Math.max(0, seg.value) / totalVal) * availableCirc;\n const color = seg.color ? (PRESET_COLORS[seg.color] || seg.color) : DEFAULT_PALETTE[idx % DEFAULT_PALETTE.length];\n\n const dashArray = `${length} ${circ}`;\n // Dashoffset starts at accumulatedOffset (negative because SVG stroke-dashoffset clockwise)\n const dashOffset = -accumulatedOffset;\n\n accumulatedOffset += length + (count > 1 ? gapPx : 0);\n\n return {\n index: idx,\n value: seg.value,\n percentage: pct,\n color,\n label: seg.label,\n tooltip: seg.tooltip,\n dashArray,\n dashOffset,\n pathLength: circ\n };\n });\n });\n\n /** Display text inside center */\n readonly computedCenterText = computed(() => {\n const explicit = this.centerText();\n if (explicit !== null) return explicit;\n if (this.value() !== null) {\n return `${Math.round(this.singlePercentage())}%`;\n }\n return '';\n });\n\n /** ARIA attributes */\n readonly currentAriaValue = computed(() => {\n if (this.value() !== null) return this.value();\n const segs = this.segments();\n if (segs && segs.length > 0) return segs.reduce((a, b) => a + b.value, 0);\n return 0;\n });\n\n readonly computedAriaLabel = computed(() => {\n const custom = this.ariaLabel();\n if (custom) return custom;\n if (this.value() !== null) {\n return `Progress: ${Math.round(this.singlePercentage())}%`;\n }\n const segs = this.segments();\n if (segs && segs.length > 0) {\n return `Donut chart with ${segs.length} categories`;\n }\n return 'Mini donut chart';\n });\n\n protected onSegmentClick(segIndex: number): void {\n const rawSegs = this.segments();\n if (rawSegs && rawSegs[segIndex]) {\n this.segmentClick.emit(rawSegs[segIndex]);\n }\n }\n}\n","<svg\n class=\"talos-mini-donut-svg\"\n [attr.viewBox]=\"'0 0 ' + svgSize + ' ' + svgSize\"\n aria-hidden=\"true\"\n>\n <!-- Background Track -->\n @if (showTrack()) {\n <circle\n class=\"talos-mini-donut-track\"\n [attr.cx]=\"center\"\n [attr.cy]=\"center\"\n [attr.r]=\"radius()\"\n [attr.stroke-width]=\"computedStrokeWidth()\"\n [attr.stroke]=\"trackColor() || 'var(--talos-border-color, #e2e8f0)'\"\n fill=\"none\"\n />\n }\n\n <!-- Single Value Progress Mode -->\n @if (segments() === null && value() !== null) {\n <circle\n class=\"talos-mini-donut-progress\"\n [attr.cx]=\"center\"\n [attr.cy]=\"center\"\n [attr.r]=\"radius()\"\n [attr.stroke-width]=\"computedStrokeWidth()\"\n [attr.stroke]=\"effectiveColor()\"\n [attr.stroke-dasharray]=\"singleDashArray()\"\n [attr.stroke-linecap]=\"lineCap()\"\n fill=\"none\"\n />\n }\n\n <!-- Multi-Segment Mode -->\n @if (segments() !== null) {\n @for (seg of computedSegments(); track seg.index) {\n <circle\n class=\"talos-mini-donut-segment\"\n [attr.cx]=\"center\"\n [attr.cy]=\"center\"\n [attr.r]=\"radius()\"\n [attr.stroke-width]=\"computedStrokeWidth()\"\n [attr.stroke]=\"seg.color\"\n [attr.stroke-dasharray]=\"seg.dashArray\"\n [attr.stroke-dashoffset]=\"seg.dashOffset\"\n [attr.stroke-linecap]=\"lineCap()\"\n fill=\"none\"\n (click)=\"onSegmentClick(seg.index)\"\n />\n }\n }\n</svg>\n\n<!-- Center Content Slot or Built-in Text -->\n<div class=\"talos-mini-donut-center\">\n <ng-content>\n @if (showCenterText() && computedCenterText()) {\n <span class=\"talos-mini-donut-center-text\">{{ computedCenterText() }}</span>\n @if (centerSubtext()) {\n <span class=\"talos-mini-donut-center-subtext\">{{ centerSubtext() }}</span>\n }\n }\n </ng-content>\n</div>\n","import { NgModule } from '@angular/core';\nimport { TalosMiniDonutComponent } from './mini-donut.component';\n\n@NgModule({\n imports: [TalosMiniDonutComponent],\n exports: [TalosMiniDonutComponent]\n})\nexport class TalosMiniDonutModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}