@area8975/ui 0.2.2-dev.49 → 0.2.2-dev.50

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 (182) hide show
  1. package/README.md +3 -2
  2. package/fesm2022/area8975-ui-alert.mjs +113 -0
  3. package/fesm2022/area8975-ui-alert.mjs.map +1 -0
  4. package/fesm2022/area8975-ui-avatar.mjs +157 -0
  5. package/fesm2022/area8975-ui-avatar.mjs.map +1 -0
  6. package/fesm2022/area8975-ui-badge.mjs +116 -0
  7. package/fesm2022/area8975-ui-badge.mjs.map +1 -0
  8. package/fesm2022/area8975-ui-button.mjs +314 -0
  9. package/fesm2022/area8975-ui-button.mjs.map +1 -0
  10. package/fesm2022/area8975-ui-calendar.mjs +549 -0
  11. package/fesm2022/area8975-ui-calendar.mjs.map +1 -0
  12. package/fesm2022/area8975-ui-card-header.mjs +96 -0
  13. package/fesm2022/area8975-ui-card-header.mjs.map +1 -0
  14. package/fesm2022/area8975-ui-card.mjs +73 -0
  15. package/fesm2022/area8975-ui-card.mjs.map +1 -0
  16. package/fesm2022/area8975-ui-chart-palette.mjs +225 -0
  17. package/fesm2022/area8975-ui-chart-palette.mjs.map +1 -0
  18. package/fesm2022/area8975-ui-charts.mjs +2813 -0
  19. package/fesm2022/area8975-ui-charts.mjs.map +1 -0
  20. package/fesm2022/area8975-ui-checkbox.mjs +202 -0
  21. package/fesm2022/area8975-ui-checkbox.mjs.map +1 -0
  22. package/fesm2022/area8975-ui-colour.mjs +200 -0
  23. package/fesm2022/area8975-ui-colour.mjs.map +1 -0
  24. package/fesm2022/area8975-ui-container.mjs +40 -0
  25. package/fesm2022/area8975-ui-container.mjs.map +1 -0
  26. package/fesm2022/area8975-ui-counter.mjs +246 -0
  27. package/fesm2022/area8975-ui-counter.mjs.map +1 -0
  28. package/fesm2022/area8975-ui-date-range-picker.mjs +554 -0
  29. package/fesm2022/area8975-ui-date-range-picker.mjs.map +1 -0
  30. package/fesm2022/area8975-ui-datepicker.mjs +547 -0
  31. package/fesm2022/area8975-ui-datepicker.mjs.map +1 -0
  32. package/fesm2022/area8975-ui-disclosure.mjs +279 -0
  33. package/fesm2022/area8975-ui-disclosure.mjs.map +1 -0
  34. package/fesm2022/area8975-ui-drawer.mjs +106 -0
  35. package/fesm2022/area8975-ui-drawer.mjs.map +1 -0
  36. package/fesm2022/area8975-ui-dropdown-button.mjs +141 -0
  37. package/fesm2022/area8975-ui-dropdown-button.mjs.map +1 -0
  38. package/fesm2022/area8975-ui-dropdown-menu.mjs +96 -0
  39. package/fesm2022/area8975-ui-dropdown-menu.mjs.map +1 -0
  40. package/fesm2022/area8975-ui-dropdown.mjs +208 -0
  41. package/fesm2022/area8975-ui-dropdown.mjs.map +1 -0
  42. package/fesm2022/area8975-ui-dropzone.mjs +332 -0
  43. package/fesm2022/area8975-ui-dropzone.mjs.map +1 -0
  44. package/fesm2022/area8975-ui-field.mjs +191 -0
  45. package/fesm2022/area8975-ui-field.mjs.map +1 -0
  46. package/fesm2022/area8975-ui-file-input.mjs +340 -0
  47. package/fesm2022/area8975-ui-file-input.mjs.map +1 -0
  48. package/fesm2022/area8975-ui-file.mjs +47 -0
  49. package/fesm2022/area8975-ui-file.mjs.map +1 -0
  50. package/fesm2022/area8975-ui-format.mjs +70 -0
  51. package/fesm2022/area8975-ui-format.mjs.map +1 -0
  52. package/fesm2022/area8975-ui-input-addon.mjs +42 -0
  53. package/fesm2022/area8975-ui-input-addon.mjs.map +1 -0
  54. package/fesm2022/area8975-ui-input-group.mjs +86 -0
  55. package/fesm2022/area8975-ui-input-group.mjs.map +1 -0
  56. package/fesm2022/area8975-ui-input.mjs +682 -0
  57. package/fesm2022/area8975-ui-input.mjs.map +1 -0
  58. package/fesm2022/area8975-ui-kpi.mjs +167 -0
  59. package/fesm2022/area8975-ui-kpi.mjs.map +1 -0
  60. package/fesm2022/area8975-ui-layout.mjs +63 -0
  61. package/fesm2022/area8975-ui-layout.mjs.map +1 -0
  62. package/fesm2022/area8975-ui-loading.mjs +76 -0
  63. package/fesm2022/area8975-ui-loading.mjs.map +1 -0
  64. package/fesm2022/area8975-ui-modal-close-btn.mjs +89 -0
  65. package/fesm2022/area8975-ui-modal-close-btn.mjs.map +1 -0
  66. package/fesm2022/area8975-ui-modal.mjs +235 -0
  67. package/fesm2022/area8975-ui-modal.mjs.map +1 -0
  68. package/fesm2022/area8975-ui-money.mjs +230 -0
  69. package/fesm2022/area8975-ui-money.mjs.map +1 -0
  70. package/fesm2022/area8975-ui-overlay.mjs +317 -0
  71. package/fesm2022/area8975-ui-overlay.mjs.map +1 -0
  72. package/fesm2022/area8975-ui-pagination.mjs +152 -0
  73. package/fesm2022/area8975-ui-pagination.mjs.map +1 -0
  74. package/fesm2022/area8975-ui-private.mjs +63 -0
  75. package/fesm2022/area8975-ui-private.mjs.map +1 -0
  76. package/fesm2022/area8975-ui-progress.mjs +307 -0
  77. package/fesm2022/area8975-ui-progress.mjs.map +1 -0
  78. package/fesm2022/area8975-ui-radio.mjs +199 -0
  79. package/fesm2022/area8975-ui-radio.mjs.map +1 -0
  80. package/fesm2022/area8975-ui-rich-text-editor.mjs +778 -0
  81. package/fesm2022/area8975-ui-rich-text-editor.mjs.map +1 -0
  82. package/fesm2022/area8975-ui-search.mjs +266 -0
  83. package/fesm2022/area8975-ui-search.mjs.map +1 -0
  84. package/fesm2022/area8975-ui-segmented.mjs +118 -0
  85. package/fesm2022/area8975-ui-segmented.mjs.map +1 -0
  86. package/fesm2022/area8975-ui-select.mjs +926 -0
  87. package/fesm2022/area8975-ui-select.mjs.map +1 -0
  88. package/fesm2022/area8975-ui-sidebar-group.mjs +60 -0
  89. package/fesm2022/area8975-ui-sidebar-group.mjs.map +1 -0
  90. package/fesm2022/area8975-ui-sidebar-item.mjs +107 -0
  91. package/fesm2022/area8975-ui-sidebar-item.mjs.map +1 -0
  92. package/fesm2022/area8975-ui-sidebar.mjs +109 -0
  93. package/fesm2022/area8975-ui-sidebar.mjs.map +1 -0
  94. package/fesm2022/area8975-ui-skeleton.mjs +116 -0
  95. package/fesm2022/area8975-ui-skeleton.mjs.map +1 -0
  96. package/fesm2022/area8975-ui-stat.mjs +55 -0
  97. package/fesm2022/area8975-ui-stat.mjs.map +1 -0
  98. package/fesm2022/area8975-ui-switch.mjs +132 -0
  99. package/fesm2022/area8975-ui-switch.mjs.map +1 -0
  100. package/fesm2022/area8975-ui-tab.mjs +217 -0
  101. package/fesm2022/area8975-ui-tab.mjs.map +1 -0
  102. package/fesm2022/area8975-ui-table-filters.mjs +499 -0
  103. package/fesm2022/area8975-ui-table-filters.mjs.map +1 -0
  104. package/fesm2022/area8975-ui-table.mjs +1237 -0
  105. package/fesm2022/area8975-ui-table.mjs.map +1 -0
  106. package/fesm2022/area8975-ui-textarea.mjs +375 -0
  107. package/fesm2022/area8975-ui-textarea.mjs.map +1 -0
  108. package/fesm2022/area8975-ui-theme.mjs +246 -0
  109. package/fesm2022/area8975-ui-theme.mjs.map +1 -0
  110. package/fesm2022/area8975-ui-time-select.mjs +170 -0
  111. package/fesm2022/area8975-ui-time-select.mjs.map +1 -0
  112. package/fesm2022/area8975-ui-toast.mjs +269 -0
  113. package/fesm2022/area8975-ui-toast.mjs.map +1 -0
  114. package/fesm2022/area8975-ui-toaster.mjs +117 -0
  115. package/fesm2022/area8975-ui-toaster.mjs.map +1 -0
  116. package/fesm2022/area8975-ui-tooltip.mjs +196 -0
  117. package/fesm2022/area8975-ui-tooltip.mjs.map +1 -0
  118. package/fesm2022/area8975-ui-user-menu.mjs +186 -0
  119. package/fesm2022/area8975-ui-user-menu.mjs.map +1 -0
  120. package/fesm2022/area8975-ui.mjs +0 -16520
  121. package/package.json +237 -1
  122. package/types/area8975-ui-alert.d.ts +25 -0
  123. package/types/area8975-ui-avatar.d.ts +40 -0
  124. package/types/area8975-ui-badge.d.ts +31 -0
  125. package/types/area8975-ui-button.d.ts +129 -0
  126. package/types/area8975-ui-calendar.d.ts +177 -0
  127. package/types/area8975-ui-card-header.d.ts +28 -0
  128. package/types/area8975-ui-card.d.ts +18 -0
  129. package/types/area8975-ui-chart-palette.d.ts +176 -0
  130. package/types/area8975-ui-charts.d.ts +747 -0
  131. package/types/area8975-ui-checkbox.d.ts +61 -0
  132. package/types/area8975-ui-colour.d.ts +31 -0
  133. package/types/area8975-ui-container.d.ts +5 -0
  134. package/types/area8975-ui-counter.d.ts +43 -0
  135. package/types/area8975-ui-date-range-picker.d.ts +132 -0
  136. package/types/area8975-ui-datepicker.d.ts +124 -0
  137. package/types/area8975-ui-disclosure.d.ts +79 -0
  138. package/types/area8975-ui-drawer.d.ts +25 -0
  139. package/types/area8975-ui-dropdown-button.d.ts +32 -0
  140. package/types/area8975-ui-dropdown-menu.d.ts +25 -0
  141. package/types/area8975-ui-dropdown.d.ts +56 -0
  142. package/types/area8975-ui-dropzone.d.ts +96 -0
  143. package/types/area8975-ui-field.d.ts +72 -0
  144. package/types/area8975-ui-file-input.d.ts +72 -0
  145. package/types/area8975-ui-file.d.ts +21 -0
  146. package/types/area8975-ui-format.d.ts +37 -0
  147. package/types/area8975-ui-input-addon.d.ts +10 -0
  148. package/types/area8975-ui-input-group.d.ts +18 -0
  149. package/types/area8975-ui-input.d.ts +224 -0
  150. package/types/area8975-ui-kpi.d.ts +36 -0
  151. package/types/area8975-ui-layout.d.ts +7 -0
  152. package/types/area8975-ui-loading.d.ts +16 -0
  153. package/types/area8975-ui-modal-close-btn.d.ts +14 -0
  154. package/types/area8975-ui-modal.d.ts +45 -0
  155. package/types/area8975-ui-money.d.ts +77 -0
  156. package/types/area8975-ui-overlay.d.ts +75 -0
  157. package/types/area8975-ui-pagination.d.ts +27 -0
  158. package/types/area8975-ui-private.d.ts +20 -0
  159. package/types/area8975-ui-progress.d.ts +127 -0
  160. package/types/area8975-ui-radio.d.ts +61 -0
  161. package/types/area8975-ui-rich-text-editor.d.ts +165 -0
  162. package/types/area8975-ui-search.d.ts +56 -0
  163. package/types/area8975-ui-segmented.d.ts +41 -0
  164. package/types/area8975-ui-select.d.ts +293 -0
  165. package/types/area8975-ui-sidebar-group.d.ts +15 -0
  166. package/types/area8975-ui-sidebar-item.d.ts +20 -0
  167. package/types/area8975-ui-sidebar.d.ts +16 -0
  168. package/types/area8975-ui-skeleton.d.ts +35 -0
  169. package/types/area8975-ui-stat.d.ts +13 -0
  170. package/types/area8975-ui-switch.d.ts +32 -0
  171. package/types/area8975-ui-tab.d.ts +45 -0
  172. package/types/area8975-ui-table-filters.d.ts +138 -0
  173. package/types/area8975-ui-table.d.ts +371 -0
  174. package/types/area8975-ui-textarea.d.ts +126 -0
  175. package/types/area8975-ui-theme.d.ts +61 -0
  176. package/types/area8975-ui-time-select.d.ts +35 -0
  177. package/types/area8975-ui-toast.d.ts +78 -0
  178. package/types/area8975-ui-toaster.d.ts +23 -0
  179. package/types/area8975-ui-tooltip.d.ts +47 -0
  180. package/types/area8975-ui-user-menu.d.ts +39 -0
  181. package/types/area8975-ui.d.ts +1 -4546
  182. package/fesm2022/area8975-ui.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"area8975-ui-charts.mjs","names":[],"sources":["../../../projects/ui/charts/chart/chart.base.ts","../../../projects/ui/charts/chart/axis-chart.base.ts","../../../projects/ui/charts/chart/chart.options.ts","../../../projects/ui/charts/chart-legend/chart-legend.component.ts","../../../projects/ui/charts/chart-legend/chart-legend.component.html","../../../projects/ui/charts/chart/chart.component.ts","../../../projects/ui/charts/chart/chart-table.component.ts","../../../projects/ui/charts/chart/chart-frame.component.ts","../../../projects/ui/charts/bar-chart/bar-chart.component.ts","../../../projects/ui/charts/chart/chart-frame.template.html","../../../projects/ui/charts/bar-chart/bar-chart.types.ts","../../../projects/ui/charts/line-chart/line-chart.component.ts","../../../projects/ui/charts/chart/chart-frame.template.html","../../../projects/ui/charts/line-chart/line-chart.types.ts","../../../projects/ui/charts/pie-chart/pie-chart.component.ts","../../../projects/ui/charts/chart/chart-frame.template.html","../../../projects/ui/charts/pie-chart/pie-chart.types.ts","../../../projects/ui/charts/treemap-chart/treemap-chart.layout.ts","../../../projects/ui/charts/treemap-chart/treemap-chart.component.ts","../../../projects/ui/charts/treemap-chart/treemap-chart.component.html"],"sourcesContent":["import {\n booleanAttribute,\n computed,\n Directive,\n inject,\n input,\n type Signal,\n signal\n} from '@angular/core';\n\nimport { chartInk } from '@area8975/ui/chart-palette';\nimport { moneyFormatterParts, UI_FORMAT } from '@area8975/ui/format';\nimport { maskMoney, UI_PRIVACY, type UiPrivacy } from '@area8975/ui/format';\nimport { UiDarkClass } from '@area8975/ui/theme';\n\nimport type {\n ChartLegendItem,\n ChartLegendPosition,\n ChartLegendSource\n} from '../chart-legend/chart-legend.types';\nimport type {\n ChartHeight,\n ChartOptions,\n ChartValueFormatter\n} from './chart.types';\n\n\n/** Inputs, privacy handling and legend wiring every chart shares, whatever it draws. */\n@Directive()\nexport abstract class UiChartBase implements ChartLegendSource {\n protected readonly uiFormat = inject(UI_FORMAT);\n private readonly privacy = inject(UI_PRIVACY);\n\n protected readonly dark = inject(UiDarkClass).isDark;\n protected readonly ink = computed(() => chartInk(this.dark()));\n\n /** Says what the chart shows, e.g. \"Spending by month\". */\n readonly ariaLabel = input.required<string>();\n\n readonly height = input<ChartHeight>(300);\n\n /** Used on the value axis, the tooltip and the table, e.g. to show money. */\n readonly valueFormatter = input<ChartValueFormatter>(numberFormatter(this.uiFormat.locale));\n\n /** Masks the values in privacy mode. Defaults to whether `valueFormatter` came from `injectMoneyFormatter`. */\n readonly sensitive = input<boolean | undefined, unknown>(undefined, {\n transform: value => value === undefined ? undefined : booleanAttribute(value)\n });\n\n /** Heading for the category column in the data table. */\n readonly categoryLabel = input<string>('Category');\n\n readonly loading = input(false, { transform: booleanAttribute });\n readonly emptyText = input<string>('No data to show');\n\n /** Shows the data table under the chart instead of only to screen readers. */\n readonly showTable = input(false, { transform: booleanAttribute });\n\n /** Raw ApexCharts options merged over the defaults, for anything not covered here. */\n readonly options = input<ChartOptions | null>(null);\n\n /** `none` leaves the legend out, for when a `ui-chart-legend` is linked with `for`. */\n readonly legend = input<ChartLegendPosition>('auto');\n\n /** Series switched off in the legend. */\n readonly hiddenSeries = signal<string[]>([]);\n\n /** The series the legend is pointing at, the others fade while it's set. */\n readonly emphasis = signal<string | null>(null);\n\n abstract readonly legendItems: Signal<ChartLegendItem[]>;\n abstract readonly legendNote: Signal<string>;\n\n protected abstract readonly isEmpty: Signal<boolean>;\n\n private readonly money = computed(() => moneyFormatterParts(this.valueFormatter()));\n\n protected readonly privacyMode = computed<UiPrivacy>(() =>\n this.sensitive() ?? !!this.money() ? this.privacy() : 'visible'\n );\n\n protected readonly masked = computed(() => this.privacyMode() !== 'visible');\n protected readonly concealed = computed(() => this.privacyMode() === 'hidden');\n\n protected readonly displayFormatter = computed<ChartValueFormatter>(() => {\n const money = this.money();\n\n if (!this.masked()) {\n return money?.format ?? this.valueFormatter();\n }\n\n const mask = money?.mask ?? maskMoney(this.uiFormat.currency, this.uiFormat.locale);\n\n return () => mask;\n });\n\n protected readonly apexHeight = computed(() => {\n const height = this.height();\n\n return height === 'fill' ? '100%' : height;\n });\n\n protected formatValue(value: number | null | undefined): string {\n return value === null || value === undefined\n ? '-'\n : this.displayFormatter()(value);\n }\n}\n\nfunction numberFormatter(locale: string): ChartValueFormatter {\n const formatter = new Intl.NumberFormat(locale);\n\n return value => formatter.format(value);\n}\n","import {\n booleanAttribute,\n computed,\n Directive,\n input\n} from '@angular/core';\n\nimport {\n type ChartSeriesStyle,\n chartSeriesStyle\n} from '@area8975/ui/chart-palette';\n\nimport type { ChartLegendItem } from '../chart-legend/chart-legend.types';\nimport { UiChartBase } from './chart.base';\nimport type { ChartSeries } from './chart.types';\n\n\n/** Inputs every chart with categories along one axis and values up the other shares. */\n@Directive()\nexport abstract class UiAxisChartBase extends UiChartBase {\n readonly series = input.required<ChartSeries[]>();\n readonly categories = input.required<string[]>();\n\n /**\n * Only these series get palette colours, the rest go grey so the few that\n * matter stand out. The way to show more series than there are colours.\n */\n readonly highlight = input<string[] | null>(null);\n\n readonly highlightKeepsColours = input(false, { transform: booleanAttribute });\n\n /** Charts that draw lines can tell series apart by dashes too, bars can't. */\n protected readonly supportsDashes: boolean = false;\n\n protected readonly isEmpty = computed(() =>\n !this.series().some(item => item.data.some(value => value !== null))\n );\n\n protected readonly isMuted = computed(() => {\n const highlight = this.highlight();\n\n return this.series().map(item =>\n !!highlight && !highlight.includes(item.name)\n );\n });\n\n // highlighted series take slots in the order they're highlighted, so colours don't depend on data order\n private readonly colourOrder = computed(() =>\n this.highlightKeepsColours() ? null : this.highlight()\n );\n\n protected readonly styles = computed<ChartSeriesStyle[]>(() => {\n const order = this.colourOrder();\n const muted = this.isMuted();\n\n return this.series().map((item, index) => {\n const dashed = this.supportsDashes && !!item.dashed;\n\n if (muted[index]) {\n return { colour: this.ink().context, dashed };\n }\n\n const style = chartSeriesStyle(\n order ? order.indexOf(item.name) : index,\n this.supportsDashes,\n this.dark()\n );\n\n return {\n colour: item.colour ?? style.colour,\n dashed: style.dashed || dashed\n };\n });\n });\n\n protected readonly colours = computed(() =>\n this.styles().map(style => style.colour)\n );\n protected readonly dashed = computed(() =>\n this.styles().map(style => style.dashed)\n );\n\n /** Grey context series stay out of the legend, the note says how many there are. */\n readonly legendItems = computed<ChartLegendItem[]>(() => {\n const order = this.colourOrder();\n const items = this.series()\n .map((item, index) => ({\n name: item.name,\n ...this.styles()[index]\n }))\n .filter((_, index) => !this.isMuted()[index]);\n\n return order\n ? items.sort((a, b) =>\n order.indexOf(a.name) - order.indexOf(b.name)\n )\n : items;\n });\n\n readonly legendNote = computed(() => {\n const count = this.isMuted().filter(Boolean).length;\n\n return count ? `${count} more in grey` : '';\n });\n}\n","import type { ChartInk } from '@area8975/ui/chart-palette';\n\nimport type { ChartOptions } from './chart.types';\n\n\n/** Axis text, muted so it sits behind the data. */\nexport function chartAxisLabels(ink: ChartInk) {\n return { style: { colors: ink.muted, fontSize: '12px' } };\n}\n\n// the least space between two category labels\nconst LABEL_GAP = 16;\n\nconst AXIS_FONT_SIZE = 12;\n\n/**\n * How many categories apart labels go so they fit `width` without touching,\n * 1 labels every category. Slots are `width / count` wide, the tightest a\n * line or bar chart spaces its categories.\n */\nexport function categoryLabelStep(count: number, width: number, labelWidth: number): number {\n if (count <= 1 || width <= 0) {\n return 1;\n }\n\n return Math.max(1, Math.ceil((labelWidth + LABEL_GAP) / (width / count)));\n}\n\n// what apex passes a category axis formatter, `i` and the grid are missing outside the axis itself\ninterface CategoryLabelContext {\n i?: number;\n w?: { globals?: { gridWidth?: number } };\n}\n\n/**\n * An x-axis label formatter that leaves out the category labels that don't fit\n * the chart's drawn width, so they never crowd into each other. It counts back\n * from the last category, which always keeps its label.\n *\n * Bar charts pass apex the categories, which hands each label over with its\n * index. Line charts leave them out, as apex swaps in its own formatter that\n * drops the index when it has them, and get each category's position from 1.\n */\nexport function thinnedCategoryLabels(categories: string[]) {\n const widest = Math.max(0, ...categories.map(measureLabel));\n\n return (value: string | number, _?: unknown, context?: CategoryLabelContext): string => {\n const position = typeof value === 'number' ? Math.floor(value) - 1 : null;\n const index = position ?? context?.i;\n const label = position === null ? String(value) : categories[position] ?? '';\n const width = context?.w?.globals?.gridWidth ?? 0;\n\n if (index === undefined) {\n return label;\n }\n\n const step = categoryLabelStep(categories.length, width, widest);\n\n return (categories.length - 1 - index) % step === 0 ? label : '';\n };\n}\n\nlet measuringContext: CanvasRenderingContext2D | null | undefined;\n\n// apex draws axis text at 12px in the page's font, the chart inherits it\nfunction measureLabel(label: string): number {\n if (measuringContext === undefined) {\n measuringContext = typeof document === 'undefined'\n ? null\n : document.createElement('canvas').getContext('2d');\n }\n\n if (!measuringContext) {\n return label.length * AXIS_FONT_SIZE * 0.6;\n }\n\n measuringContext.font = `${AXIS_FONT_SIZE}px ${getComputedStyle(document.body).fontFamily}`;\n\n return measuringContext.measureText(label).width;\n}\n\nexport interface ChartTooltipRow {\n colour: string;\n name: string;\n\n /** Left out in privacy mode, the row keeps its swatch and name. */\n value?: string;\n dashed?: boolean;\n}\n\n/** Defaults every chart starts from, quiet chrome so the data does the talking. */\nexport function baseChartOptions(ink: ChartInk): ChartOptions {\n const labels = chartAxisLabels(ink);\n\n return {\n chart: {\n fontFamily: 'inherit',\n foreColor: ink.muted,\n parentHeightOffset: 0,\n toolbar: { show: false },\n zoom: { enabled: false },\n animations: { enabled: true, speed: 300 }\n },\n dataLabels: { enabled: false },\n // apex fades fills and lines to 85% by default, which washes the palette out\n fill: { type: 'solid', opacity: 1 },\n grid: {\n borderColor: ink.grid,\n strokeDashArray: 0,\n padding: { top: 0, right: 8, bottom: 0, left: 8 }\n },\n // ui-chart-legend draws the legend, apex's own stays off\n legend: { show: false },\n xaxis: {\n axisBorder: { show: true, color: ink.grid },\n axisTicks: { show: false },\n labels\n },\n yaxis: {\n axisBorder: { show: false },\n axisTicks: { show: false },\n labels\n },\n states: {\n hover: { filter: { type: 'lighten' } },\n active: { filter: { type: 'none' } }\n }\n };\n}\n\n/** Plain objects merge key by key, arrays and everything else replace. */\nexport function mergeChartOptions(base: ChartOptions, overrides: ChartOptions | null): ChartOptions {\n return overrides ? deepMerge(base, overrides) as ChartOptions : base;\n}\n\nexport function chartTooltipHtml(\n title: string,\n rows: ChartTooltipRow[],\n footer = '',\n total?: { name: string; value: string }\n): string {\n const items = rows.map(row => `\n <div class=\"ui-chart-tooltip-row ui-text-body-alt\">\n <span\n class=\"ui-chart-tooltip-dot${row.dashed ? ' ui-chart-tooltip-dot--dashed' : ''}\"\n style=\"--ui-chart-tooltip-colour: ${escapeHtml(row.colour)}\"\n ></span>\n <span class=\"ui-chart-tooltip-name\">${escapeHtml(row.name)}</span>\n ${row.value === undefined ? '' : `<span class=\"ui-chart-tooltip-value\">${escapeHtml(row.value)}</span>`}\n </div>\n `).join('');\n\n return `\n <div class=\"ui-chart-tooltip\">\n ${title ? `<div class=\"ui-chart-tooltip-title ui-text-caption\">${escapeHtml(title)}</div>` : ''}\n ${items}\n ${total ? `\n <div class=\"ui-chart-tooltip-row ui-chart-tooltip-total ui-text-body-alt\">\n <span class=\"ui-chart-tooltip-name\">${escapeHtml(total.name)}</span>\n <span class=\"ui-chart-tooltip-value\">${escapeHtml(total.value)}</span>\n </div>\n ` : ''}\n ${footer ? `<div class=\"ui-chart-tooltip-footer ui-text-caption\">${escapeHtml(footer)}</div>` : ''}\n </div>\n `;\n}\n\n// tooltip HTML is built from data, so anything that came from outside gets escaped\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\nfunction deepMerge(base: unknown, overrides: unknown): unknown {\n if (!isPlainObject(base) || !isPlainObject(overrides)) {\n return overrides === undefined ? base : overrides;\n }\n\n const merged: Record<string, unknown> = { ...base };\n\n for (const [key, value] of Object.entries(overrides)) {\n merged[key] = deepMerge(base[key], value);\n }\n\n return merged;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n effect,\n input,\n model,\n output,\n signal,\n untracked\n} from '@angular/core';\n\nimport type { ChartLegendItem, ChartLegendSource } from './chart-legend.types';\n\n\n/**\n * A row of colour keys naming what each colour means. Link it to a chart\n * with `for`, or pass `items` to use it next to anything coloured by series.\n */\n@Component({\n selector: 'ui-chart-legend',\n templateUrl: './chart-legend.component.html',\n styleUrl: './chart-legend.component.css'\n})\nexport class UiChartLegendComponent {\n readonly items = input<ChartLegendItem[]>([]);\n\n /** Small text after the items, e.g. how many series aren't listed. */\n readonly note = input<string>('');\n\n /** A chart to take items from and hide or fade series on, set its `legend` to `none`. */\n readonly for = input<ChartLegendSource | null>(null);\n\n /** Adjusts the linked chart's items, e.g. to relabel them. Keep each `name`. */\n readonly itemsWith = input<((items: ChartLegendItem[]) => ChartLegendItem[]) | null>(null);\n\n /** Names of items switched off, bound two-way when `toggleable`. */\n readonly hidden = model<string[]>([]);\n\n /** Lets each item be clicked to hide or show its series. */\n readonly toggleable = input(false, { transform: booleanAttribute });\n\n /** The item being hovered or focused, null when it leaves. Charts fade the other series. */\n readonly focusChange = output<string | null>();\n\n private readonly hovered = signal<string | null>(null);\n private readonly focused = signal<string | null>(null);\n\n // the pointer wins while it's over an item, keyboard focus is the fallback\n private readonly pointedAt = computed(() => this.hovered() ?? this.focused());\n\n // a linked chart wins over the plain inputs\n protected readonly shownItems = computed(() => {\n const source = this.for();\n\n if (!source) {\n return this.items();\n }\n\n const adjust = this.itemsWith();\n\n return adjust ? adjust(source.legendItems()) : source.legendItems();\n });\n protected readonly shownNote = computed(() => this.for()?.legendNote() ?? this.note());\n private readonly hiddenNames = computed(() => this.for()?.hiddenSeries() ?? this.hidden());\n\n protected readonly visibleCount = computed(() =>\n this.shownItems().filter(item => !this.hiddenNames().includes(item.name)).length\n );\n\n constructor() {\n effect(() => {\n const name = this.pointedAt();\n\n untracked(() => {\n this.for()?.emphasis.set(name);\n this.focusChange.emit(name);\n });\n });\n }\n\n protected hover(name: string | null): void {\n this.hovered.set(name);\n }\n\n protected focus(name: string | null, event?: FocusEvent): void {\n // a click focuses the button too, only keyboard focus should preview\n if (name && !(event?.target as Element | null)?.matches(':focus-visible')) {\n return;\n }\n\n this.focused.set(name);\n }\n\n protected isHidden(item: ChartLegendItem): boolean {\n return this.hiddenNames().includes(item.name);\n }\n\n // the last one showing stays on, an empty chart helps nobody\n protected isLocked(item: ChartLegendItem): boolean {\n return !this.isHidden(item) && this.visibleCount() === 1;\n }\n\n protected toggle(item: ChartLegendItem): void {\n if (this.isLocked(item)) {\n return;\n }\n\n const hidden = this.hiddenNames();\n const next = hidden.includes(item.name)\n ? hidden.filter(name => name !== item.name)\n : [...hidden, item.name];\n\n const source = this.for();\n\n if (source) {\n source.hiddenSeries.set(next);\n } else {\n this.hidden.set(next);\n }\n }\n}\n","<ul class=\"ui-chart-legend\" role=\"list\">\n @for (item of shownItems(); track item.name) {\n <li\n (mouseenter)=\"hover(item.name)\"\n (mouseleave)=\"hover(null)\"\n (focusin)=\"focus(item.name, $event)\"\n (focusout)=\"focus(null)\"\n >\n @if (toggleable()) {\n <button\n type=\"button\"\n class=\"ui-chart-legend-item ui-chart-legend-item--button ui-text-body-alt\"\n [attr.aria-pressed]=\"!isHidden(item)\"\n [attr.aria-disabled]=\"isLocked(item) || null\"\n [attr.data-hidden]=\"isHidden(item) ? '' : null\"\n (click)=\"toggle(item)\"\n >\n <span\n class=\"ui-chart-legend-key\"\n [class.ui-chart-legend-key--dashed]=\"item.dashed\"\n [style.--ui-chart-legend-colour]=\"item.colour\"\n ></span>\n {{ item.label ?? item.name }}\n </button>\n } @else {\n <span class=\"ui-chart-legend-item ui-text-body-alt\">\n <span\n class=\"ui-chart-legend-key\"\n [class.ui-chart-legend-key--dashed]=\"item.dashed\"\n [style.--ui-chart-legend-colour]=\"item.colour\"\n ></span>\n {{ item.label ?? item.name }}\n </span>\n }\n </li>\n }\n</ul>\n\n@if (shownNote()) {\n <span class=\"text-muted-foreground-1 ui-text-caption\">{{ shownNote() }}</span>\n}\n","import {\n afterNextRender,\n Component,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n untracked,\n viewChild,\n ViewEncapsulation\n} from '@angular/core';\n\nimport type ApexCharts from 'apexcharts';\n\nimport type { ChartOptions } from './chart.types';\n\n\n// missing from apex's types\ntype ApexChartsEvents = ApexCharts & {\n addEventListener(name: 'updated', handler: () => void): void;\n};\n\n\n/**\n * Draws raw ApexCharts options. The typed charts (bar, line and so on) are\n * built on this, reach for it directly only when they can't do what you need.\n */\n@Component({\n selector: 'ui-chart',\n template: `\n <div\n #canvas\n class=\"ui-chart-canvas\"\n role=\"img\"\n [attr.aria-label]=\"ariaLabel()\"\n ></div>\n `,\n styleUrls: ['./chart.component.css', './chart-tooltip.css'],\n // ApexCharts builds its own DOM, scoped styles would never reach the tooltip\n encapsulation: ViewEncapsulation.None,\n host: { class: 'ui-chart' }\n})\nexport class UiChartComponent {\n readonly options = input.required<ChartOptions>();\n\n /** What the chart shows, e.g. \"Spending by month\". Screen readers get this instead of the SVG. */\n readonly ariaLabel = input.required<string>();\n\n /** Series names to keep off the plot, e.g. switched off in the legend. */\n readonly hiddenSeries = input<string[]>([]);\n\n /** Fades every other series so this one stands out, e.g. while its legend item is hovered. */\n readonly emphasis = input<string | null>(null);\n\n private readonly canvas = viewChild.required<ElementRef<HTMLElement>>(\n 'canvas'\n );\n private readonly chart = signal<ApexCharts | null>(null);\n\n private destroyed = false;\n\n private drawnNames: (string | null)[] = [];\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n private resizeObserver: ResizeObserver | null = null;\n\n constructor() {\n // loaded on first use so pages without charts don't pay for the library\n afterNextRender(async () => {\n const { default: Apex } = await import('apexcharts');\n\n if (this.destroyed) {\n return;\n }\n\n const chart = new Apex(\n this.canvas().nativeElement,\n this.withOwnParentResizing(untracked(this.options))\n );\n\n (chart as ApexChartsEvents).addEventListener('updated', () => {\n this.applyHidden(chart);\n this.applyEmphasis();\n });\n\n this.drawnNames = this.seriesNames();\n await chart.render();\n this.chart.set(chart);\n this.redrawWhenResized(chart);\n this.applyHidden(chart);\n this.applyEmphasis();\n });\n\n // later option changes update in place, so bars animate to their new size\n effect(() => {\n const options = this.options();\n const chart = this.chart();\n\n if (!chart) {\n return;\n }\n\n // apex animates a reorder by morphing lines into each other\n const names = this.seriesNames();\n const reordered = names.length === this.drawnNames.length &&\n names.some((name, index) => name !== this.drawnNames[index]) &&\n names.every(name => this.drawnNames.includes(name));\n\n this.drawnNames = names;\n chart.updateOptions(\n this.withOwnParentResizing(options),\n false,\n !reordered\n );\n });\n\n effect(() => {\n this.emphasis();\n\n if (this.chart()) {\n this.applyEmphasis();\n }\n });\n\n effect(() => {\n const chart = this.chart();\n\n if (chart) {\n this.applyHidden(chart);\n this.applyEmphasis();\n }\n });\n\n inject(DestroyRef).onDestroy(() => {\n this.destroyed = true;\n this.resizeObserver?.disconnect();\n this.chart()?.destroy();\n });\n }\n\n // apex drops a resize that lands while it's animating, e.g. as content beside a fill-height chart loads\n private withOwnParentResizing(options: ChartOptions): ChartOptions {\n return {\n ...options,\n chart: { ...options.chart, redrawOnParentResize: false }\n };\n }\n\n private redrawWhenResized(chart: ApexCharts): void {\n this.resizeObserver = new ResizeObserver(() => {\n if (!this.isDrawnAtHostSize()) {\n // updateOptions keeps the old size, only a series update measures again\n chart.updateSeries(untracked(this.options).series ?? [], false);\n }\n });\n\n this.resizeObserver.observe(this.host.nativeElement);\n }\n\n // measured from what apex drew, the host can resize between apex measuring and the draw finishing\n private isDrawnAtHostSize(): boolean {\n const host = this.host.nativeElement;\n const drawn = this.canvas().nativeElement.querySelector<HTMLElement>(\n '.apexcharts-canvas'\n );\n\n return !!drawn &&\n drawn.offsetWidth === host.offsetWidth &&\n drawn.offsetHeight === host.offsetHeight;\n }\n\n private applyHidden(chart: ApexCharts): void {\n const hidden = this.hiddenSeries();\n\n // apex throws toggling a series it hasn't drawn, e.g. at zero width\n if (!this.canvas().nativeElement.querySelector('.apexcharts-inner .apexcharts-series')) {\n return;\n }\n\n for (const name of this.seriesNames()) {\n if (!name) {\n continue;\n }\n\n if (hidden.includes(name)) {\n chart.hideSeries(name);\n } else {\n chart.showSeries(name);\n }\n }\n }\n\n // done with a class rather than apex's own highlight, which has no clean way to undo\n private applyEmphasis(): void {\n const names = this.seriesNames();\n\n // a hidden series isn't drawn, fading everything towards it would leave nothing to see\n const emphasis = untracked(this.emphasis);\n const active =\n emphasis &&\n names.includes(emphasis) &&\n !untracked(this.hiddenSeries).includes(emphasis)\n ? emphasis\n : null;\n const groups = this.canvas().nativeElement.querySelectorAll<\n SVGGElement\n >('.apexcharts-series[data\\\\:realIndex]');\n\n for (const group of groups) {\n const name = names[Number(group.getAttribute('data:realIndex'))];\n\n group.classList.toggle(\n 'ui-chart-series--faded',\n !!active && name !== active\n );\n }\n }\n\n // pies pass plain numbers as series, their names live in labels\n private seriesNames(): (string | null)[] {\n const { series = [], labels = [] } = untracked(this.options);\n\n return series.map((item, index) =>\n typeof item === 'object' && item !== null && 'name' in item\n ? item.name ?? null\n : labels[index] ?? null\n );\n }\n}\n","import { booleanAttribute, Component, input } from '@angular/core';\n\nimport type { ChartSeries, ChartValueFormatter } from './chart.types';\n\n\n/**\n * The numbers behind a chart as a table. Hidden visually by default so screen\n * readers still get the data, `visible` shows it for everyone.\n */\n@Component({\n selector: 'ui-chart-table',\n template: `\n <!-- sr-only on a wrapper, the table's own width would otherwise override it -->\n <div [class.sr-only]=\"!visible()\">\n <table class=\"ui-chart-table\">\n <caption class=\"sr-only\">{{ caption() }}</caption>\n <thead>\n <tr>\n <th scope=\"col\" class=\"ui-text-caption\">{{ categoryLabel() }}</th>\n @for (item of series(); track item.name) {\n <th scope=\"col\" class=\"ui-text-caption\">{{ item.name }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (category of categories(); track $index; let row = $index) {\n <tr>\n <th scope=\"row\" class=\"ui-text-body-alt\">{{ category }}</th>\n @for (item of series(); track item.name) {\n <td class=\"ui-text-body-alt\">\n @if (masked() && isValue(item.data[row])) {\n <span aria-hidden=\"true\">{{ format(item.data[row]) }}</span>\n <span class=\"sr-only\">amount hidden</span>\n } @else {{{ format(item.data[row]) }}}\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n `,\n styleUrl: './chart-table.component.css'\n})\nexport class UiChartTableComponent {\n readonly caption = input.required<string>();\n readonly categories = input.required<string[]>();\n readonly series = input.required<ChartSeries[]>();\n readonly valueFormatter = input.required<ChartValueFormatter>();\n readonly categoryLabel = input<string>('Category');\n readonly visible = input(false, { transform: booleanAttribute });\n\n /** Values are masks, screen readers hear \"amount hidden\" instead. */\n readonly masked = input(false, { transform: booleanAttribute });\n\n protected isValue(value: number | null | undefined): value is number {\n return value !== null && value !== undefined;\n }\n\n protected format(value: number | null | undefined): string {\n return this.isValue(value) ? this.valueFormatter()(value) : '-';\n }\n}\n","import { booleanAttribute, Component, computed, input, model } from '@angular/core';\n\nimport { UiSkeletonComponent } from '@area8975/ui/skeleton';\n\nimport { UiChartLegendComponent } from '../chart-legend/chart-legend.component';\nimport type { ChartLegendItem } from '../chart-legend/chart-legend.types';\nimport { UiChartComponent } from './chart.component';\nimport type { ChartHeight, ChartOptions, ChartSeries, ChartValueFormatter } from './chart.types';\nimport { UiChartTableComponent } from './chart-table.component';\n\n\n/** The loading, empty and data table states around a chart, shared by every chart type. */\n@Component({\n selector: 'ui-chart-frame',\n template: `\n @if (loading()) {\n <div [style.height.px]=\"fixedHeight()\" [class.grow]=\"fill()\" aria-busy=\"true\">\n <span class=\"sr-only\">Loading chart</span>\n <ui-skeleton shape=\"rect\" class=\"size-full\" />\n </div>\n } @else if (empty()) {\n <div\n class=\"flex justify-center items-center border border-line-2 border-dashed rounded-lg text-muted-foreground-1 ui-text-body-alt\"\n [class.grow]=\"fill()\"\n [style.height.px]=\"fixedHeight()\"\n >\n {{ emptyText() }}\n </div>\n } @else {\n <!-- one series needs no legend, the chart's title already names it -->\n @if (showLegend() && (legendItems().length > 1 || legendNote())) {\n <ui-chart-legend\n class=\"mb-3 shrink-0\"\n [items]=\"legendItems()\"\n [note]=\"legendNote()\"\n [(hidden)]=\"hiddenSeries\"\n (focusChange)=\"emphasis.set($event)\"\n toggleable\n />\n }\n\n @if (options(); as options) {\n <ui-chart\n [class.grow]=\"fill()\"\n [class.min-h-0]=\"fill()\"\n [options]=\"options\"\n [ariaLabel]=\"ariaLabel()\"\n [hiddenSeries]=\"hiddenSeries()\"\n [emphasis]=\"emphasis()\"\n />\n } @else {\n <ng-content />\n }\n\n <ui-chart-table\n [caption]=\"ariaLabel()\"\n [categories]=\"categories()\"\n [series]=\"series()\"\n [valueFormatter]=\"valueFormatter()\"\n [masked]=\"masked()\"\n [categoryLabel]=\"categoryLabel()\"\n [visible]=\"showTable()\"\n />\n }\n `,\n imports: [\n UiChartComponent,\n UiChartTableComponent,\n UiChartLegendComponent,\n UiSkeletonComponent\n ],\n host: {\n class: 'relative w-full min-w-0',\n '[class.block]': '!fill()',\n '[class.flex]': 'fill()',\n '[class.flex-col]': 'fill()',\n '[class.h-full]': 'fill()'\n }\n})\nexport class UiChartFrameComponent {\n /** ApexCharts options to draw, or null for a chart that draws itself as projected content. */\n readonly options = input.required<ChartOptions | null>();\n readonly ariaLabel = input.required<string>();\n readonly categories = input.required<string[]>();\n readonly series = input.required<ChartSeries[]>();\n readonly legendItems = input.required<ChartLegendItem[]>();\n readonly legendNote = input<string>('');\n readonly hiddenSeries = model<string[]>([]);\n readonly valueFormatter = input.required<ChartValueFormatter>();\n readonly categoryLabel = input.required<string>();\n readonly height = input.required<ChartHeight>();\n readonly emptyText = input.required<string>();\n\n readonly loading = input(false, { transform: booleanAttribute });\n readonly empty = input(false, { transform: booleanAttribute });\n readonly showTable = input(false, { transform: booleanAttribute });\n readonly masked = input(false, { transform: booleanAttribute });\n readonly showLegend = input(true, { transform: booleanAttribute });\n\n /** The series the legend is pointing at, the others fade while it's set. */\n readonly emphasis = model<string | null>(null);\n\n protected readonly fill = computed(() => this.height() === 'fill');\n protected readonly fixedHeight = computed(() => {\n const height = this.height();\n\n return height === 'fill' ? null : height;\n });\n}\n","import { booleanAttribute, Component, computed, input } from '@angular/core';\n\nimport { type ChartInk, mixChartColours } from '@area8975/ui/chart-palette';\n\nimport { UiAxisChartBase } from '../chart/axis-chart.base';\nimport {\n baseChartOptions,\n chartAxisLabels,\n chartTooltipHtml,\n mergeChartOptions,\n thinnedCategoryLabels\n} from '../chart/chart.options';\nimport type { ChartOptions } from '../chart/chart.types';\nimport { UiChartFrameComponent } from '../chart/chart-frame.component';\nimport type { BarChartOrientation } from './bar-chart.types';\n\n\n// thin bars read better than slabs, whatever width is left over becomes air\nconst MAX_BAR_THICKNESS = 24;\n\nconst FADED_STRENGTH = 0.3;\n\nfunction fade(colour: string, ink: ChartInk): string {\n return mixChartColours(colour, ink.surface, FADED_STRENGTH) ?? ink.context;\n}\n\n/**\n * Bars or columns for comparing amounts across categories. Several series\n * sit side by side, or on top of each other with `stacked`.\n */\n@Component({\n selector: 'ui-bar-chart',\n templateUrl: '../chart/chart-frame.template.html',\n imports: [UiChartFrameComponent],\n host: { class: 'block w-full min-w-0' }\n})\nexport class UiBarChartComponent extends UiAxisChartBase {\n readonly orientation = input<BarChartOrientation>('vertical');\n readonly stacked = input(false, { transform: booleanAttribute });\n\n /** Picks out one category, e.g. the month a page is showing, and fades the rest. */\n readonly highlightCategory = input<string | null>(null);\n\n protected readonly chartOptions = computed<ChartOptions>(() => {\n const ink = this.ink();\n const base = baseChartOptions(ink);\n const labels = chartAxisLabels(ink);\n const horizontal = this.orientation() === 'horizontal';\n const format = this.displayFormatter();\n const masked = this.masked();\n const series = this.series();\n const categories = this.categories();\n const colours = this.colours();\n const picked = categories.indexOf(this.highlightCategory() ?? '');\n\n // apex applies a px width to each bar, grouped or not\n const thickness = `${MAX_BAR_THICKNESS}px`;\n const valueLabels = masked\n ? { show: false }\n : { ...labels, formatter: (value: string | number) => format(Number(value)) };\n\n const options: ChartOptions = {\n ...base,\n chart: {\n ...base.chart,\n type: 'bar',\n height: this.apexHeight(),\n stacked: this.stacked()\n },\n colors: picked < 0\n ? colours\n : colours.map(colour => ({ dataPointIndex }: { dataPointIndex: number }) =>\n dataPointIndex === picked\n ? colour\n : fade(colour, ink)\n ),\n series: series.map(item => ({\n name: item.name,\n data: this.concealed() ? item.data.map(() => null) : item.data\n })),\n plotOptions: {\n bar: {\n horizontal,\n // apex 4 ignores borderRadiusWhenStacked and rounds every segment, square reads cleaner\n borderRadius: this.stacked() ? 0 : 4,\n borderRadiusApplication: 'end',\n columnWidth: thickness,\n barHeight: thickness\n }\n },\n // a surface coloured gap between touching bars and stack segments\n stroke: { show: true, width: 2, colors: [ink.surface] },\n // horizontal bars swap the axes, values run along the bottom\n xaxis: {\n ...base.xaxis,\n categories,\n labels: horizontal\n ? valueLabels\n : { ...labels, formatter: thinnedCategoryLabels(categories), rotate: 0 }\n },\n yaxis: { ...base.yaxis, labels: horizontal ? labels : valueLabels },\n grid: {\n ...base.grid,\n // gridlines run across the value axis only\n xaxis: { lines: { show: horizontal } },\n yaxis: { lines: { show: !horizontal } }\n },\n tooltip: this.concealed()\n ? { enabled: false }\n : this.stacked()\n ? {\n shared: true,\n intersect: false,\n custom: ({ dataPointIndex }: { dataPointIndex: number }) => {\n const rows = series\n .map((item, index) => ({\n colour: colours[index],\n name: item.name,\n raw: item.data[dataPointIndex] ?? null\n }))\n .filter(row => !this.hiddenSeries().includes(row.name));\n const values = rows.map(row => row.raw).filter(value => value !== null);\n\n return chartTooltipHtml(\n categories[dataPointIndex] ?? '',\n rows.map(row => ({ ...row, value: masked ? undefined : this.formatValue(row.raw) })),\n '',\n masked ? undefined : {\n name: 'Total',\n value: this.formatValue(values.length ? values.reduce((sum, value) => sum + value, 0) : null)\n }\n );\n }\n }\n : {\n shared: false,\n intersect: true,\n custom: ({ seriesIndex, dataPointIndex }: { seriesIndex: number; dataPointIndex: number }) =>\n chartTooltipHtml(categories[dataPointIndex] ?? '', [{\n colour: colours[seriesIndex],\n name: series[seriesIndex]?.name ?? '',\n value: masked ? undefined : this.formatValue(series[seriesIndex]?.data[dataPointIndex])\n }])\n }\n };\n\n return mergeChartOptions(options, this.options());\n });\n}\n","<ui-chart-frame\n [options]=\"chartOptions()\"\n [ariaLabel]=\"ariaLabel()\"\n [categories]=\"categories()\"\n [series]=\"series()\"\n [legendItems]=\"legendItems()\"\n [legendNote]=\"legendNote()\"\n [(hiddenSeries)]=\"hiddenSeries\"\n [(emphasis)]=\"emphasis\"\n [showLegend]=\"legend() === 'auto'\"\n [valueFormatter]=\"displayFormatter()\"\n [masked]=\"masked()\"\n [categoryLabel]=\"categoryLabel()\"\n [height]=\"height()\"\n [emptyText]=\"emptyText()\"\n [loading]=\"loading()\"\n [empty]=\"isEmpty()\"\n [showTable]=\"showTable()\"\n/>\n","/** vertical draws columns rising from the bottom, horizontal draws bars from the left. */\nexport const BarChartOrientations = ['vertical', 'horizontal'] as const;\n\n/** @see {@link BarChartOrientations} */\nexport type BarChartOrientation = typeof BarChartOrientations[number];\n","import { booleanAttribute, Component, computed, input } from '@angular/core';\n\nimport { UiAxisChartBase } from '../chart/axis-chart.base';\nimport {\n baseChartOptions,\n chartAxisLabels,\n chartTooltipHtml,\n mergeChartOptions,\n thinnedCategoryLabels\n} from '../chart/chart.options';\nimport type { ChartOptions } from '../chart/chart.types';\nimport { UiChartFrameComponent } from '../chart/chart-frame.component';\nimport type { LineChartCurve } from './line-chart.types';\n\n\n// grey context rows past this are summed up, the table has the rest\nconst MAX_CONTEXT_ROWS = 5;\n\n// with more lines than this the tooltip lists them biggest first, the same order they sit in\nconst SORT_ROWS_AFTER = 8;\n\n/**\n * Lines for showing how values change over something ordered, usually time.\n * Hovering anywhere shows every series at that point.\n */\n@Component({\n selector: 'ui-line-chart',\n templateUrl: '../chart/chart-frame.template.html',\n imports: [UiChartFrameComponent],\n host: { class: 'block w-full min-w-0' }\n})\nexport class UiLineChartComponent extends UiAxisChartBase {\n protected override readonly supportsDashes = true;\n\n readonly curve = input<LineChartCurve>('straight');\n\n /** Draws a dot on every point, not just the hovered one. Handy with few points. */\n readonly showPoints = input(false, { transform: booleanAttribute });\n\n /** Shades this category and everything after it as a forecast. */\n readonly projectedFrom = input<string | null>(null);\n\n readonly projectedLabel = input<string>('Projected');\n\n private readonly projectedAnnotations = computed<ChartOptions['annotations']>(() => {\n const from = this.projectedFrom();\n const categories = this.categories();\n const ink = this.ink();\n\n // apex crashes redrawing without annotations\n if (!from || !categories.includes(from)) {\n return { xaxis: [] };\n }\n\n return {\n // apex finds these by running the label formatter over its numbered points\n xaxis: [{\n x: from,\n x2: categories[categories.length - 1],\n fillColor: ink.muted,\n opacity: 0.08,\n borderColor: 'transparent',\n label: {\n text: this.projectedLabel(),\n position: 'top',\n orientation: 'horizontal',\n textAnchor: 'start',\n borderWidth: 0,\n offsetX: 8,\n offsetY: 16,\n style: {\n background: 'transparent',\n color: ink.muted,\n fontSize: '12px'\n }\n }\n }]\n };\n });\n\n protected readonly chartOptions = computed<ChartOptions>(() => {\n const ink = this.ink();\n const base = baseChartOptions(ink);\n const labels = chartAxisLabels(ink);\n const series = this.series();\n const categories = this.categories();\n const colours = this.colours();\n const dashed = this.dashed();\n const muted = this.isMuted();\n const masked = this.masked();\n\n // grey context lines go first so the highlighted ones are drawn on top\n const order = series.map((_, index) => index).sort((a, b) => Number(muted[b]) - Number(muted[a]));\n\n const options: ChartOptions = {\n ...base,\n chart: {\n ...base.chart,\n type: 'line',\n height: this.apexHeight()\n },\n annotations: this.projectedAnnotations(),\n colors: order.map(index => colours[index]),\n series: order.map(index => ({\n name: series[index].name,\n data: this.concealed() ? series[index].data.map(() => null) : series[index].data\n })),\n stroke: {\n curve: this.curve(),\n width: order.map(index => muted[index] ? 1.5 : 2),\n dashArray: order.map(index => dashed[index] ? 6 : 0),\n lineCap: 'round'\n },\n // the surface ring keeps a dot readable where it sits on another line\n markers: {\n size: this.showPoints() ? 4 : 0,\n strokeColors: ink.surface,\n strokeWidth: 2,\n hover: { size: 5 }\n },\n xaxis: {\n ...base.xaxis,\n // no categories, apex numbers the points from 1 and the formatter labels them, see thinnedCategoryLabels\n labels: { ...labels, formatter: thinnedCategoryLabels(categories), rotate: 0 },\n crosshairs: {\n show: true,\n width: 1,\n stroke: { color: ink.grid, width: 1, dashArray: 0 }\n },\n // the tooltip already names the category\n tooltip: { enabled: false }\n },\n yaxis: {\n ...base.yaxis,\n labels: masked ? { show: false } : { ...labels, formatter: this.displayFormatter() }\n },\n grid: {\n ...base.grid,\n xaxis: { lines: { show: false } },\n yaxis: { lines: { show: true } }\n },\n tooltip: this.concealed() ? { enabled: false } : {\n shared: true,\n intersect: false,\n // read at hover time, so hiding a series doesn't rebuild the chart\n custom: ({ dataPointIndex }: { dataPointIndex: number }) => {\n const rows = series\n .map((item, index) => ({\n colour: colours[index],\n dashed: dashed[index],\n name: item.name,\n raw: item.data[dataPointIndex] ?? null,\n muted: muted[index]\n }))\n .filter(row => !this.hiddenSeries().includes(row.name))\n .sort((a, b) => this.tooltipOrder(a, b))\n .map(row => ({ ...row, value: masked ? undefined : this.formatValue(row.raw) }));\n\n const shown = rows.filter(row => !row.muted).length + MAX_CONTEXT_ROWS;\n const extra = rows.length - shown;\n\n return chartTooltipHtml(\n categories[dataPointIndex] ?? '',\n rows.slice(0, shown),\n extra > 0 ? `${extra} more` : ''\n );\n }\n }\n };\n\n return mergeChartOptions(options, this.options());\n });\n\n // highlighted rows first in highlight order, then the grey ones biggest first\n private tooltipOrder(\n a: { name: string; raw: number | null; muted: boolean },\n b: { name: string; raw: number | null; muted: boolean }\n ): number {\n if (a.muted !== b.muted) {\n return Number(a.muted) - Number(b.muted);\n }\n\n const highlight = this.highlight();\n\n if (!a.muted && highlight) {\n return highlight.indexOf(a.name) - highlight.indexOf(b.name);\n }\n\n // a handful keep the legend order, lots are easier to scan biggest first\n if (!a.muted && this.series().length <= SORT_ROWS_AFTER) {\n return 0;\n }\n\n return (b.raw ?? -Infinity) - (a.raw ?? -Infinity);\n }\n}\n","<ui-chart-frame\n [options]=\"chartOptions()\"\n [ariaLabel]=\"ariaLabel()\"\n [categories]=\"categories()\"\n [series]=\"series()\"\n [legendItems]=\"legendItems()\"\n [legendNote]=\"legendNote()\"\n [(hiddenSeries)]=\"hiddenSeries\"\n [(emphasis)]=\"emphasis\"\n [showLegend]=\"legend() === 'auto'\"\n [valueFormatter]=\"displayFormatter()\"\n [masked]=\"masked()\"\n [categoryLabel]=\"categoryLabel()\"\n [height]=\"height()\"\n [emptyText]=\"emptyText()\"\n [loading]=\"loading()\"\n [empty]=\"isEmpty()\"\n [showTable]=\"showTable()\"\n/>\n","/** How points are joined, straight segments, a smooth curve, or steps. */\nexport const LineChartCurves = ['straight', 'smooth', 'stepline'] as const;\n\n/** @see {@link LineChartCurves} */\nexport type LineChartCurve = typeof LineChartCurves[number];\n","import { Component, computed, input } from '@angular/core';\n\nimport {\n type ChartSeriesStyle,\n chartSeriesStyle\n} from '@area8975/ui/chart-palette';\n\nimport { UiAxisChartBase } from '../chart/axis-chart.base';\nimport {\n baseChartOptions,\n chartTooltipHtml,\n mergeChartOptions\n} from '../chart/chart.options';\nimport type { ChartOptions } from '../chart/chart.types';\nimport { UiChartFrameComponent } from '../chart/chart-frame.component';\nimport type { PieChartVariant } from './pie-chart.types';\n\n\n/**\n * Slices for showing how a whole splits into parts. Each category is a\n * slice, only the first series is drawn. Best kept to a handful of slices,\n * fold the small ones into \"Other\".\n */\n@Component({\n selector: 'ui-pie-chart',\n templateUrl: '../chart/chart-frame.template.html',\n imports: [UiChartFrameComponent],\n host: { class: 'block w-full min-w-0' }\n})\nexport class UiPieChartComponent extends UiAxisChartBase {\n readonly variant = input<PieChartVariant>('pie');\n\n private readonly percentFormatter = new Intl.NumberFormat(this.uiFormat.locale, {\n style: 'percent',\n maximumFractionDigits: 1\n });\n\n /** Shown above the total in the middle of a donut. */\n readonly totalLabel = input<string>('Total');\n\n /**\n * A colour per slice, lined up with `categories`, e.g. each category's own\n * colour. A slice without one takes its palette slot. Muted slices stay grey.\n */\n readonly sliceColours = input<(string | null | undefined)[]>([]);\n\n protected readonly values = computed(() => this.series()[0]?.data ?? []);\n\n // slices are categories here, so highlight and colours work per category not per series\n protected override readonly isEmpty = computed(() =>\n !this.values().some(value => value !== null && value > 0)\n );\n\n protected override readonly isMuted = computed(() => {\n const highlight = this.highlight();\n\n return this.categories().map(name =>\n !!highlight && !highlight.includes(name)\n );\n });\n\n protected override readonly styles = computed<ChartSeriesStyle[]>(() => {\n const highlight = this.highlight();\n const muted = this.isMuted();\n const given = this.sliceColours();\n\n return this.categories().map((name, index) => {\n if (muted[index]) {\n return { colour: this.ink().context, dashed: false };\n }\n\n const style = chartSeriesStyle(\n highlight ? highlight.indexOf(name) : index,\n false,\n this.dark()\n );\n\n return { ...style, colour: given[index] ?? style.colour };\n });\n });\n\n override readonly legendItems = computed(() => {\n const highlight = this.highlight();\n const items = this.categories()\n .map((name, index) => ({ name, ...this.styles()[index] }))\n .filter((_, index) => !this.isMuted()[index]);\n\n return highlight\n ? items.sort((a, b) =>\n highlight.indexOf(a.name) - highlight.indexOf(b.name)\n )\n : items;\n });\n\n // apex can't hide a pie slice, so hidden ones are left out of the options instead\n private readonly slices = computed(() => {\n const hidden = this.hiddenSeries();\n const values = this.values();\n const colours = this.colours();\n\n return this.categories()\n .map((name, index) => ({\n name,\n value: values[index] ?? 0,\n colour: colours[index]\n }))\n .filter(slice => !hidden.includes(slice.name));\n });\n\n protected readonly chartOptions = computed<ChartOptions>(() => {\n const ink = this.ink();\n const base = baseChartOptions(ink);\n const slices = this.slices();\n const donut = this.variant() === 'donut';\n const total = slices.reduce((sum, slice) => sum + slice.value, 0);\n const concealed = this.concealed();\n const drawn = concealed ? [{ name: '', value: 1, colour: ink.grid }] : slices;\n const centreText = {\n fontSize: '12px',\n color: ink.muted,\n offsetY: -4\n };\n\n const options: ChartOptions = {\n ...base,\n chart: {\n ...base.chart,\n type: donut ? 'donut' : 'pie',\n height: this.apexHeight()\n },\n colors: drawn.map(slice => slice.colour),\n labels: drawn.map(slice => slice.name),\n series: drawn.map(slice => slice.value),\n // a surface coloured gap between slices\n stroke: { show: true, width: 2, colors: [ink.surface] },\n // lightening a grey slice turns it white, it looks like it's gone\n states: {\n ...base.states,\n hover: { filter: { type: concealed ? 'none' : 'darken' } }\n },\n plotOptions: {\n pie: {\n // clicking would pop a slice out, the legend does the toggling\n expandOnClick: false,\n donut: {\n size: '65%',\n labels: {\n show: donut,\n name: centreText,\n value: {\n fontSize: '20px',\n fontWeight: 600,\n color: ink.text,\n offsetY: 4,\n formatter: (value: string) =>\n this.formatValue(Number(value))\n },\n total: {\n show: true,\n showAlways: true,\n label: this.totalLabel(),\n ...centreText,\n formatter: () => this.formatValue(total)\n }\n }\n }\n }\n },\n tooltip: concealed ? { enabled: false } : {\n // apex makes pie tooltips dark and slice coloured, ours match the other charts\n theme: 'light',\n fillSeriesColor: false,\n custom: ({ seriesIndex }: { seriesIndex: number; }) => {\n const slice = slices[seriesIndex];\n\n return slice\n ? chartTooltipHtml(\n '',\n [{\n colour: slice.colour,\n name: slice.name,\n value: this.masked() ? undefined : this.formatValue(slice.value)\n }],\n total\n ? `${\n this.percentFormatter.format(slice.value / total)\n } of total`\n : ''\n )\n : '';\n }\n }\n };\n\n return mergeChartOptions(options, this.options());\n });\n}\n","<ui-chart-frame\n [options]=\"chartOptions()\"\n [ariaLabel]=\"ariaLabel()\"\n [categories]=\"categories()\"\n [series]=\"series()\"\n [legendItems]=\"legendItems()\"\n [legendNote]=\"legendNote()\"\n [(hiddenSeries)]=\"hiddenSeries\"\n [(emphasis)]=\"emphasis\"\n [showLegend]=\"legend() === 'auto'\"\n [valueFormatter]=\"displayFormatter()\"\n [masked]=\"masked()\"\n [categoryLabel]=\"categoryLabel()\"\n [height]=\"height()\"\n [emptyText]=\"emptyText()\"\n [loading]=\"loading()\"\n [empty]=\"isEmpty()\"\n [showTable]=\"showTable()\"\n/>\n","/** pie fills the whole circle, donut leaves a hole with the total in it. */\nexport const PieChartVariants = ['pie', 'donut'] as const;\n\n/** @see {@link PieChartVariants} */\nexport type PieChartVariant = typeof PieChartVariants[number];\n","import {\n chartColour,\n type ChartInk,\n chartLabelInk,\n mixChartColours\n} from '@area8975/ui/chart-palette';\n\nimport type { TreemapGroup } from './treemap-chart.types';\n\n\n// each item a step paler than the one before, but never so pale it loses its group\nconst SHADE_STEP = 0.16;\nconst PALEST_SHADE = 0.4;\n\nexport const TREEMAP_GROUP_GAP = 8;\nexport const TREEMAP_BLOCK_GAP = 3;\nexport const TREEMAP_HEADER_HEIGHT = 24;\n\n// the smallest group that still gets a header, any smaller and the blocks need the room\nconst HEADER_MIN_WIDTH = 56;\nconst HEADER_MIN_HEIGHT = TREEMAP_HEADER_HEIGHT + 32;\n\n// the room a block needs for its name, and for its value under it\nconst NAME_MIN_WIDTH = 48;\nconst NAME_MIN_HEIGHT = 24;\nconst VALUE_MIN_HEIGHT = 42;\n\nexport interface TreemapRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** One block as it's drawn, with the colours worked out. */\nexport interface TreemapBlock {\n group: string;\n item: string;\n value: number;\n fill: string;\n labelInk: string;\n}\n\n/** A group as it's drawn: only its items with something to show. */\nexport interface DrawnTreemapGroup {\n name: string;\n colour: string;\n total: number;\n blocks: TreemapBlock[];\n}\n\n/** How much of its label a block has room for. */\nexport type TreemapLabel = 'none' | 'name' | 'full';\n\nexport interface PlacedTreemapBlock extends TreemapBlock {\n rect: TreemapRect;\n label: TreemapLabel;\n}\n\nexport interface PlacedTreemapGroup extends DrawnTreemapGroup {\n rect: TreemapRect;\n hasHeader: boolean;\n placedBlocks: PlacedTreemapBlock[];\n}\n\n/** A group's own colour, or its palette slot, then grey once the palette runs out. */\nexport function treemapGroupColours(groups: TreemapGroup[], dark: boolean): string[] {\n return groups.map((group, index) => group.colour ?? chartColour(index, dark));\n}\n\n/**\n * The groups worth drawing: hidden ones and items of zero or less are left out,\n * then any group left with nothing.\n */\nexport function drawnTreemapGroups(\n groups: TreemapGroup[],\n colours: string[],\n hidden: string[],\n shades: boolean,\n ink: ChartInk\n): DrawnTreemapGroup[] {\n return groups\n .map((group, index) => drawnGroup(group, colours[index], shades, ink))\n .filter(group => group.blocks.length > 0 && !hidden.includes(group.name));\n}\n\nfunction drawnGroup(\n group: TreemapGroup,\n colour: string,\n shades: boolean,\n ink: ChartInk\n): DrawnTreemapGroup {\n const items = group.items.filter(item => item.value > 0);\n const ranks = rankByValue(items.map(item => item.value));\n\n const blocks = items.map((item, index) => {\n const fill = shades ? shadeOf(colour, ranks[index], ink) : colour;\n\n return {\n group: group.name,\n item: item.name,\n value: item.value,\n fill,\n labelInk: chartLabelInk(fill)\n };\n });\n\n return {\n name: group.name,\n colour,\n total: blocks.reduce((sum, block) => sum + block.value, 0),\n blocks\n };\n}\n\n// 0 for the biggest value, 1 for the next, and so on\nfunction rankByValue(values: number[]): number[] {\n const biggestFirst = values\n .map((value, index) => ({ value, index }))\n .sort((a, b) => b.value - a.value);\n const ranks: number[] = [];\n\n biggestFirst.forEach((entry, rank) => {\n ranks[entry.index] = rank;\n });\n\n return ranks;\n}\n\nfunction shadeOf(colour: string, rank: number, ink: ChartInk): string {\n const strength = Math.max(1 - rank * SHADE_STEP, PALEST_SHADE);\n\n return mixChartColours(colour, ink.surface, strength) ?? colour;\n}\n\n/** Every block as one row of the data table, named \"<group> – <item>\". */\nexport function treemapTableRows(groups: TreemapGroup[]): { categories: string[]; values: number[] } {\n const items = groups.flatMap(group =>\n group.items\n .filter(item => item.value > 0)\n .map(item => ({ name: `${group.name} – ${item.name}`, value: item.value }))\n );\n\n return {\n categories: items.map(item => item.name),\n values: items.map(item => item.value)\n };\n}\n\n/**\n * Places each group in `bounds`, a header strip along its top when there's\n * room, and its blocks under that. Positions are relative to `bounds`, and\n * each block's are relative to its group.\n */\nexport function placeTreemapGroups(groups: DrawnTreemapGroup[], bounds: TreemapRect): PlacedTreemapGroup[] {\n const groupRects = squarify(groups.map(group => group.total), bounds, TREEMAP_GROUP_GAP);\n\n return groups.map((group, index) => placeGroup(group, groupRects[index]));\n}\n\nfunction placeGroup(group: DrawnTreemapGroup, rect: TreemapRect): PlacedTreemapGroup {\n const hasHeader = rect.width >= HEADER_MIN_WIDTH && rect.height >= HEADER_MIN_HEIGHT;\n const headerHeight = hasHeader ? TREEMAP_HEADER_HEIGHT : 0;\n const blockArea = { x: 0, y: headerHeight, width: rect.width, height: rect.height - headerHeight };\n const blockRects = squarify(group.blocks.map(block => block.value), blockArea, TREEMAP_BLOCK_GAP);\n\n return {\n ...group,\n rect,\n hasHeader,\n placedBlocks: group.blocks.map((block, index) => ({\n ...block,\n rect: blockRects[index],\n label: labelFor(blockRects[index])\n }))\n };\n}\n\nfunction labelFor(rect: TreemapRect): TreemapLabel {\n if (rect.width < NAME_MIN_WIDTH || rect.height < NAME_MIN_HEIGHT) {\n return 'none';\n }\n\n return rect.height < VALUE_MIN_HEIGHT ? 'name' : 'full';\n}\n\n/**\n * Splits `bounds` into one rectangle per value, each sized by its share and\n * kept as close to square as the others allow (the squarified treemap of\n * Bruls, Huizing and van Wijk). Rectangles come back in the order of\n * `values`, with `gap` between neighbours but none at the edges.\n */\nexport function squarify(values: number[], bounds: TreemapRect, gap = 0): TreemapRect[] {\n const total = values.reduce((sum, value) => sum + value, 0);\n const rects: TreemapRect[] = values.map(() => ({ x: bounds.x, y: bounds.y, width: 0, height: 0 }));\n\n if (total <= 0 || bounds.width <= 0 || bounds.height <= 0) {\n return rects;\n }\n\n // laid out a half gap past every edge, then each rectangle is pulled in by a half gap\n const outer = grow(bounds, gap / 2);\n const scale = (outer.width * outer.height) / total;\n const biggestFirst = values\n .map((value, index) => ({ index, area: value * scale }))\n .sort((a, b) => b.area - a.area);\n\n let remaining = outer;\n let row: { index: number; area: number }[] = [];\n\n for (const entry of biggestFirst) {\n const side = Math.min(remaining.width, remaining.height);\n const longer = [...row, entry];\n\n if (row.length === 0 || worstAspect(longer, side) <= worstAspect(row, side)) {\n row = longer;\n } else {\n remaining = placeRow(row, remaining, rects);\n row = [entry];\n }\n }\n\n placeRow(row, remaining, rects);\n\n return rects.map(rect => rect.width > 0 ? grow(rect, -gap / 2) : rect);\n}\n\n// how far from square the least square rectangle in a row along `side` would be\nfunction worstAspect(row: { area: number }[], side: number): number {\n const sum = row.reduce((total, entry) => total + entry.area, 0);\n const largest = Math.max(...row.map(entry => entry.area));\n const smallest = Math.min(...row.map(entry => entry.area));\n\n return Math.max((side * side * largest) / (sum * sum), (sum * sum) / (side * side * smallest));\n}\n\n// lays a row along the shorter side of `area`, and hands back what's left over\nfunction placeRow(row: { index: number; area: number }[], area: TreemapRect, rects: TreemapRect[]): TreemapRect {\n const sum = row.reduce((total, entry) => total + entry.area, 0);\n\n if (area.width >= area.height) {\n const width = sum / area.height;\n let y = area.y;\n\n for (const entry of row) {\n const height = entry.area / width;\n rects[entry.index] = { x: area.x, y, width, height };\n y += height;\n }\n\n return { x: area.x + width, y: area.y, width: area.width - width, height: area.height };\n }\n\n const height = sum / area.width;\n let x = area.x;\n\n for (const entry of row) {\n const width = entry.area / height;\n rects[entry.index] = { x, y: area.y, width, height };\n x += width;\n }\n\n return { x: area.x, y: area.y + height, width: area.width, height: area.height - height };\n}\n\nfunction grow(rect: TreemapRect, by: number): TreemapRect {\n return {\n x: rect.x - by,\n y: rect.y - by,\n width: Math.max(rect.width + by * 2, 0),\n height: Math.max(rect.height + by * 2, 0)\n };\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n Component,\n computed,\n effect,\n ElementRef,\n input,\n output,\n signal,\n viewChild,\n ViewEncapsulation\n} from '@angular/core';\n\nimport { UiChartBase } from '../chart/chart.base';\nimport type { ChartHeight, ChartSeries } from '../chart/chart.types';\nimport { UiChartFrameComponent } from '../chart/chart-frame.component';\nimport type { ChartLegendItem } from '../chart-legend/chart-legend.types';\nimport {\n drawnTreemapGroups,\n type PlacedTreemapBlock,\n type PlacedTreemapGroup,\n placeTreemapGroups,\n treemapGroupColours,\n treemapTableRows\n} from './treemap-chart.layout';\nimport type { TreemapGroup, TreemapSelection } from './treemap-chart.types';\n\n\n// how far the tooltip sits from the pointer\nconst TOOLTIP_OFFSET = 12;\n\ninterface PointedBlock {\n group: PlacedTreemapGroup;\n block: PlacedTreemapBlock;\n x: number;\n y: number;\n}\n\n/**\n * Nested blocks sized by value, for showing how a whole splits into groups\n * and each group into items, e.g. spending by category and who it went to.\n * Past eight groups the palette runs out and the rest go grey, so give each\n * group a `colour` when there can be more.\n */\n@Component({\n selector: 'ui-treemap-chart',\n templateUrl: './treemap-chart.component.html',\n styleUrls: ['./treemap-chart.component.css', '../chart/chart-tooltip.css'],\n // the tooltip shares its styles with the other charts, which aren't encapsulated either\n encapsulation: ViewEncapsulation.None,\n imports: [NgTemplateOutlet, UiChartFrameComponent],\n host: { class: 'block w-full min-w-0' }\n})\nexport class UiTreemapChartComponent extends UiChartBase {\n readonly groups = input.required<TreemapGroup[]>();\n\n override readonly height = input<ChartHeight>(360);\n\n /** Shades each group's items from its colour, biggest strongest, so they stay told apart. */\n readonly shades = input(true, { transform: booleanAttribute });\n\n /** Makes each block a button that emits `itemSelect`. */\n readonly selectable = input(false, { transform: booleanAttribute });\n\n /** Heading for the value column in the data table. */\n readonly valueLabel = input<string>('Value');\n\n readonly itemSelect = output<TreemapSelection>();\n\n private readonly canvas = viewChild<ElementRef<HTMLElement>>('canvas');\n private readonly size = signal({ width: 0, height: 0 });\n protected readonly pointed = signal<PointedBlock | null>(null);\n\n /** Set once the first layout is drawn, so blocks glide to new places after that but don't grow in from nothing. */\n protected readonly settled = signal(false);\n\n private readonly percentFormatter = new Intl.NumberFormat(this.uiFormat.locale, {\n style: 'percent',\n maximumFractionDigits: 1\n });\n\n protected readonly fill = computed(() => this.height() === 'fill');\n protected readonly fixedHeight = computed(() => {\n const height = this.height();\n\n return height === 'fill' ? null : height;\n });\n\n private readonly colours = computed(() =>\n treemapGroupColours(this.groups(), this.dark())\n );\n\n private readonly drawnGroups = computed(() =>\n drawnTreemapGroups(\n this.groups(),\n this.colours(),\n this.hiddenSeries(),\n this.shades(),\n this.ink()\n )\n );\n\n protected readonly placedGroups = computed(() => {\n const { width, height } = this.size();\n\n return placeTreemapGroups(this.drawnGroups(), { x: 0, y: 0, width, height });\n });\n\n private readonly total = computed(() =>\n this.drawnGroups().reduce((sum, group) => sum + group.total, 0)\n );\n\n private readonly tableRows = computed(() => treemapTableRows(this.groups()));\n\n protected readonly categories = computed(() => this.tableRows().categories);\n\n protected readonly series = computed<ChartSeries[]>(() => [\n { name: this.valueLabel(), data: this.tableRows().values }\n ]);\n\n protected readonly isEmpty = computed(() => this.categories().length === 0);\n\n readonly legendItems = computed<ChartLegendItem[]>(() =>\n this.groups()\n .map((group, index) => ({ group, colour: this.colours()[index] }))\n .filter(({ group }) => group.items.some(item => item.value > 0))\n .map(({ group, colour }) => ({ name: group.name, colour }))\n );\n\n readonly legendNote = computed(() => '');\n\n // a hidden group isn't drawn, fading everything towards it would leave nothing to see\n private readonly emphasised = computed(() => {\n const emphasis = this.emphasis();\n\n return this.drawnGroups().some(group => group.name === emphasis) ? emphasis : null;\n });\n\n protected readonly tooltipFooter = computed(() => {\n const pointed = this.pointed();\n\n if (!pointed) {\n return '';\n }\n\n const { group, block } = pointed;\n const shareOfTotal = `${this.percent(block.value / this.total())} of total`;\n\n return group.blocks.length > 1\n ? `${this.percent(block.value / group.total)} of ${group.name} · ${shareOfTotal}`\n : shareOfTotal;\n });\n\n // flips to the pointer's other side past halfway, so it never runs off the chart\n protected readonly tooltipPosition = computed(() => {\n const pointed = this.pointed();\n const { width } = this.size();\n\n if (!pointed) {\n return null;\n }\n\n const flipped = pointed.x > width / 2;\n\n return {\n left: flipped ? null : pointed.x + TOOLTIP_OFFSET,\n right: flipped ? width - pointed.x + TOOLTIP_OFFSET : null,\n top: pointed.y + TOOLTIP_OFFSET\n };\n });\n\n constructor() {\n super();\n\n // the canvas only exists while there's something to draw, so it's measured as it comes and goes\n effect(onCleanup => {\n const canvas = this.canvas()?.nativeElement;\n\n if (!canvas) {\n return;\n }\n\n const observer = new ResizeObserver(([entry]) => {\n const { width, height } = entry.contentRect;\n this.size.set({ width, height });\n\n if (!this.settled()) {\n requestAnimationFrame(() => this.settled.set(true));\n }\n });\n\n observer.observe(canvas);\n onCleanup(() => observer.disconnect());\n });\n }\n\n protected isFaded(group: PlacedTreemapGroup): boolean {\n const emphasised = this.emphasised();\n\n return !!emphasised && group.name !== emphasised;\n }\n\n protected point(event: PointerEvent, group: PlacedTreemapGroup, block: PlacedTreemapBlock): void {\n const canvas = this.canvas()?.nativeElement;\n\n if (!canvas || event.pointerType === 'touch') {\n return;\n }\n\n const bounds = canvas.getBoundingClientRect();\n this.pointed.set({ group, block, x: event.clientX - bounds.left, y: event.clientY - bounds.top });\n }\n\n protected focus(group: PlacedTreemapGroup, block: PlacedTreemapBlock): void {\n this.pointed.set({\n group,\n block,\n x: group.rect.x + block.rect.x + block.rect.width / 2,\n y: group.rect.y + block.rect.y + block.rect.height / 2\n });\n }\n\n protected select(block: PlacedTreemapBlock): void {\n this.itemSelect.emit({ group: block.group, item: block.item });\n }\n\n protected accessibleName(block: PlacedTreemapBlock): string {\n const name = `${block.item}, ${block.group}`;\n\n return this.masked() ? name : `${name}, ${this.formatValue(block.value)}`;\n }\n\n private percent(share: number): string {\n return this.percentFormatter.format(share);\n }\n}\n","<ui-chart-frame\n [options]=\"null\"\n [ariaLabel]=\"ariaLabel()\"\n [categories]=\"categories()\"\n [series]=\"series()\"\n [legendItems]=\"legendItems()\"\n [legendNote]=\"legendNote()\"\n [(hiddenSeries)]=\"hiddenSeries\"\n [(emphasis)]=\"emphasis\"\n [showLegend]=\"legend() === 'auto'\"\n [valueFormatter]=\"displayFormatter()\"\n [masked]=\"masked()\"\n [categoryLabel]=\"categoryLabel()\"\n [height]=\"height()\"\n [emptyText]=\"emptyText()\"\n [loading]=\"loading()\"\n [empty]=\"isEmpty()\"\n [showTable]=\"showTable()\"\n>\n <div\n #canvas\n class=\"ui-treemap\"\n [class.ui-treemap--settled]=\"settled()\"\n [class.grow]=\"fill()\"\n [class.min-h-0]=\"fill()\"\n [style.height.px]=\"fixedHeight()\"\n [attr.role]=\"selectable() ? 'group' : 'img'\"\n [attr.aria-label]=\"ariaLabel()\"\n (pointerleave)=\"pointed.set(null)\"\n >\n @if (concealed()) {\n <!-- the proportions alone would give the amounts away, so one grey block stands in for them all -->\n <div class=\"ui-treemap-concealed\" [style.background-color]=\"ink().grid\"></div>\n } @else {\n @for (group of placedGroups(); track group.name) {\n <div\n class=\"ui-treemap-group\"\n [class.ui-treemap-group--faded]=\"isFaded(group)\"\n [style.left.px]=\"group.rect.x\"\n [style.top.px]=\"group.rect.y\"\n [style.width.px]=\"group.rect.width\"\n [style.height.px]=\"group.rect.height\"\n >\n @if (group.hasHeader) {\n <div class=\"ui-treemap-header ui-text-caption\" aria-hidden=\"true\">\n <span class=\"ui-treemap-header-name\">{{ group.name }}</span>\n <span class=\"ui-treemap-header-total\">{{ formatValue(group.total) }}</span>\n </div>\n }\n\n @for (block of group.placedBlocks; track block.item) {\n @if (selectable()) {\n <button\n type=\"button\"\n class=\"ui-treemap-block ui-treemap-block--selectable ui-text-caption\"\n [style.left.px]=\"block.rect.x\"\n [style.top.px]=\"block.rect.y\"\n [style.width.px]=\"block.rect.width\"\n [style.height.px]=\"block.rect.height\"\n [style.background-color]=\"block.fill\"\n [style.color]=\"block.labelInk\"\n [attr.aria-label]=\"accessibleName(block)\"\n (pointermove)=\"point($event, group, block)\"\n (focus)=\"focus(group, block)\"\n (blur)=\"pointed.set(null)\"\n (click)=\"select(block)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"label\"\n [ngTemplateOutletContext]=\"{ $implicit: block }\"\n />\n </button>\n } @else {\n <div\n class=\"ui-treemap-block ui-text-caption\"\n aria-hidden=\"true\"\n [style.left.px]=\"block.rect.x\"\n [style.top.px]=\"block.rect.y\"\n [style.width.px]=\"block.rect.width\"\n [style.height.px]=\"block.rect.height\"\n [style.background-color]=\"block.fill\"\n [style.color]=\"block.labelInk\"\n (pointermove)=\"point($event, group, block)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"label\"\n [ngTemplateOutletContext]=\"{ $implicit: block }\"\n />\n </div>\n }\n }\n </div>\n }\n\n @if (pointed(); as pointed) {\n <div\n class=\"ui-chart-tooltip-panel ui-treemap-tooltip\"\n aria-hidden=\"true\"\n [style.left.px]=\"tooltipPosition()?.left\"\n [style.right.px]=\"tooltipPosition()?.right\"\n [style.top.px]=\"tooltipPosition()?.top\"\n >\n <div class=\"ui-chart-tooltip\">\n <div class=\"ui-chart-tooltip-title ui-text-caption\">{{ pointed.group.name }}</div>\n <div class=\"ui-chart-tooltip-row ui-text-body-alt\">\n <span\n class=\"ui-chart-tooltip-dot\"\n [style.--ui-chart-tooltip-colour]=\"pointed.block.fill\"\n ></span>\n <span class=\"ui-chart-tooltip-name\">{{ pointed.block.item }}</span>\n @if (!masked()) {\n <span class=\"ui-chart-tooltip-value\">{{ formatValue(pointed.block.value) }}</span>\n }\n </div>\n <div class=\"ui-chart-tooltip-footer ui-text-caption\">{{ tooltipFooter() }}</div>\n </div>\n </div>\n }\n }\n </div>\n</ui-chart-frame>\n\n<ng-template #label let-block>\n @if (block.label !== 'none') {\n <span class=\"ui-treemap-block-name\">{{ block.item }}</span>\n }\n @if (block.label === 'full') {\n <span class=\"ui-treemap-block-value\">{{ formatValue(block.value) }}</span>\n }\n</ng-template>\n"],"mappings":";;;;;;;AA6BA,IAAsB,cAAtB,MAAsB,YAAW;CACV,WAAW,OAAO,SAAS;CAC7B,UAAU,OAAO,UAAU;CAEzB,OAAO,OAAO,WAAW,CAAC,CAAC;CAC3B,MAAM,eAAe,SAAS,KAAK,KAAI,CAAE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;CAGrD,YAAY,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAEpC,SAAS,MAAmB,KAAI,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAGhC,iBAAiB,MAA2B,gBAAgB,KAAK,SAAS,MAAM,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CAGlF,YAAY,MAAoC,QAAS;EAAA,GAAA,YAAA,EAAA,WAAA,YAAA,+BAAA,CAAA;EAC9D,YAAW,UAAS,UAAU,SAAY,SAAY,iBAAiB,KAAK;CAAC,CAAA;CAIxE,gBAAgB,MAAc,YAAW,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CAEzC,UAAU,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,UAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACpD,YAAY,MAAc,mBAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAG5C,YAAY,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,YAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGtD,UAAU,MAA2B,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAG1C,SAAS,MAA2B,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAG3C,eAAe,OAAiB,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAGnC,WAAW,OAAsB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAO9B,QAAQ,eAAe,oBAAoB,KAAK,eAAc,CAAE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEhE,cAAc,eAC7B,KAAK,UAAS,KAAM,CAAC,CAAC,KAAK,MAAK,IAAK,KAAK,QAAO,IAAK,WACzD,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,SAAS,eAAe,KAAK,YAAW,MAAO,WAAU,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACzD,YAAY,eAAe,KAAK,YAAW,MAAO,UAAS,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAE3D,mBAAmB,eAAmC;EACrE,MAAM,QAAQ,KAAK,MAAK;EAExB,IAAI,CAAC,KAAK,OAAM,GACZ,OAAO,OAAO,UAAU,KAAK,eAAc;EAG/C,MAAM,OAAO,OAAO,QAAQ,UAAU,KAAK,SAAS,UAAU,KAAK,SAAS,MAAM;EAElF,aAAa;CACjB,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,mBAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,aAAa,eAAc;EAC1C,MAAM,SAAS,KAAK,OAAM;EAE1B,OAAO,WAAW,SAAS,SAAS;CACxC,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAEQ,YAAY,OAAgC;EAClD,OAAO,UAAU,QAAQ,UAAU,SAC7B,MACA,KAAK,iBAAgB,CAAE,CAAC,KAAK;CACvC;CA7EkB,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAW,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAX,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAW,cAAA;EAAA,QAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,gBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,eAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,UAAA;CAAA,CAAA;;AAAX,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAW,YAAA,CAAA,EADhC,MAAA,UAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiFD,SAAS,gBAAgB,QAAc;CACnC,MAAM,YAAY,IAAI,KAAK,aAAa,MAAM;CAE9C,QAAO,UAAS,UAAU,OAAO,KAAK;AAC1C;AC9FA,IAAsB,kBAAtB,MAAsB,wBAAwB,YAAW;CAC5C,SAAS,MAAM,SAAyB,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACxC,aAAa,MAAM,SAAoB,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAMvC,YAAY,MAAuB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAExC,wBAAwB,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,wBAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGxD,iBAA0B;CAE1B,UAAU,eACzB,CAAC,KAAK,OAAM,CAAE,CAAC,MAAK,SAAQ,KAAK,KAAK,MAAK,UAAS,UAAU,IAAI,CAAC,GACtE,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,UAAU,eAAc;EACvC,MAAM,YAAY,KAAK,UAAS;EAEhC,OAAO,KAAK,OAAM,CAAE,CAAC,KAAI,SACrB,CAAC,CAAC,aAAa,CAAC,UAAU,SAAS,KAAK,IAAI,CAAC;CAErD,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAGe,cAAc,eAC3B,KAAK,sBAAqB,IAAK,OAAO,KAAK,UAAS,GACvD,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,SAAS,eAAkC;EAC1D,MAAM,QAAQ,KAAK,YAAW;EAC9B,MAAM,QAAQ,KAAK,QAAO;EAE1B,OAAO,KAAK,OAAM,CAAE,CAAC,KAAK,MAAM,UAAS;GACrC,MAAM,SAAS,KAAK,kBAAkB,CAAC,CAAC,KAAK;GAE7C,IAAI,MAAM,QACN,OAAO;IAAE,QAAQ,KAAK,IAAG,CAAE,CAAC;IAAS;GAAM;GAG/C,MAAM,QAAQ,iBACV,QAAQ,MAAM,QAAQ,KAAK,IAAI,IAAI,OACnC,KAAK,gBACL,KAAK,KAAI,CAAE;GAGf,OAAO;IACH,QAAQ,KAAK,UAAU,MAAM;IAC7B,QAAQ,MAAM,UAAU;GAC3B;EACL,CAAC;CACL,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,UAAU,eACzB,KAAK,OAAM,CAAE,CAAC,KAAI,UAAS,MAAM,MAAM,GAC1C,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CACkB,SAAS,eACxB,KAAK,OAAM,CAAE,CAAC,KAAI,UAAS,MAAM,MAAM,GAC1C,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAGQ,cAAc,eAAiC;EACpD,MAAM,QAAQ,KAAK,YAAW;EAC9B,MAAM,QAAQ,KAAK,OAAM,CAAE,CACtB,KAAK,MAAM,WAAW;GACnB,MAAM,KAAK;GACX,GAAG,KAAK,OAAM,CAAE,CAAC;EACpB,EAAC,CAAC,CACF,QAAQ,GAAG,UAAU,CAAC,KAAK,QAAO,CAAE,CAAC,MAAM;EAEhD,OAAO,QACD,MAAM,MAAM,GAAG,MACb,MAAM,QAAQ,EAAE,IAAI,IAAI,MAAM,QAAQ,EAAE,IAAI,CAAC,IAE/C;CACV,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEO,aAAa,eAAc;EAChC,MAAM,QAAQ,KAAK,QAAO,CAAE,CAAC,OAAO,OAAO,CAAC,CAAC;EAE7C,OAAO,QAAQ,GAAG,MAAK,iBAAkB;CAC7C,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CApFgB,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAe,MAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAf,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAe,cAAA;EAAA,QAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,uBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,iBAAA;EAAA,UAAA;CAAA,CAAA;;AAAf,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAe,YAAA,CAAA,EADpC,MAAA,UAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACZD,SAAgB,gBAAgB,KAAa;CACzC,OAAO,EAAE,OAAO;EAAE,QAAQ,IAAI;EAAO,UAAU;CAAM,EAAE;AAC3D;AAGA,MAAM,YAAY;AAElB,MAAM,iBAAiB;AAOvB,SAAgB,kBAAkB,OAAe,OAAe,YAAkB;CAC9E,IAAI,SAAS,KAAK,SAAS,GACvB,OAAO;CAGX,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,aAAa,cAAc,QAAQ,MAAM,CAAC;AAC5E;AAiBA,SAAgB,sBAAsB,YAAoB;CACtD,MAAM,SAAS,KAAK,IAAI,GAAG,GAAG,WAAW,IAAI,YAAY,CAAC;CAE1D,QAAQ,OAAwB,GAAa,YAA0C;EACnF,MAAM,WAAW,OAAO,UAAU,WAAW,KAAK,MAAM,KAAK,IAAI,IAAI;EACrE,MAAM,QAAQ,YAAY,SAAS;EACnC,MAAM,QAAQ,aAAa,OAAO,OAAO,KAAK,IAAI,WAAW,aAAa;EAC1E,MAAM,QAAQ,SAAS,GAAG,SAAS,aAAa;EAEhD,IAAI,UAAU,QACV,OAAO;EAGX,MAAM,OAAO,kBAAkB,WAAW,QAAQ,OAAO,MAAM;EAE/D,QAAQ,WAAW,SAAS,IAAI,SAAS,SAAS,IAAI,QAAQ;CAClE;AACJ;AAEA,IAAI;AAGJ,SAAS,aAAa,OAAa;CAC/B,IAAI,qBAAqB,QACrB,mBAAmB,OAAO,aAAa,cACjC,OACA,SAAS,cAAc,QAAQ,CAAC,CAAC,WAAW,IAAI;CAG1D,IAAI,CAAC,kBACD,OAAO,MAAM,SAAS,iBAAiB;CAG3C,iBAAiB,OAAO,GAAG,eAAc,KAAM,iBAAiB,SAAS,IAAI,CAAC,CAAC;CAE/E,OAAO,iBAAiB,YAAY,KAAK,CAAC,CAAC;AAC/C;AAYA,SAAgB,iBAAiB,KAAa;CAC1C,MAAM,SAAS,gBAAgB,GAAG;CAElC,OAAO;EACH,OAAO;GACH,YAAY;GACZ,WAAW,IAAI;GACf,oBAAoB;GACpB,SAAS,EAAE,MAAM,MAAK;GACtB,MAAM,EAAE,SAAS,MAAK;GACtB,YAAY;IAAE,SAAS;IAAM,OAAO;GAAG;EAC1C;EACD,YAAY,EAAE,SAAS,MAAK;EAE5B,MAAM;GAAE,MAAM;GAAS,SAAS;EAAC;EACjC,MAAM;GACF,aAAa,IAAI;GACjB,iBAAiB;GACjB,SAAS;IAAE,KAAK;IAAG,OAAO;IAAG,QAAQ;IAAG,MAAM;GAAC;EAClD;EAED,QAAQ,EAAE,MAAM,MAAK;EACrB,OAAO;GACH,YAAY;IAAE,MAAM;IAAM,OAAO,IAAI;GAAI;GACzC,WAAW,EAAE,MAAM,MAAK;GACxB;EACH;EACD,OAAO;GACH,YAAY,EAAE,MAAM,MAAK;GACzB,WAAW,EAAE,MAAM,MAAK;GACxB;EACH;EACD,QAAQ;GACJ,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAS,EAAE;GACpC,QAAQ,EAAE,QAAQ,EAAE,MAAM,OAAM,EAAE;EACrC;CACJ;AACL;AAGA,SAAgB,kBAAkB,MAAoB,WAA8B;CAChF,OAAO,YAAY,UAAU,MAAM,SAAS,IAAoB;AACpE;AAEA,SAAgB,iBACZ,OACA,MACA,SAAS,IACT,OAAuC;CAEvC,MAAM,QAAQ,KAAK,KAAI,QAAO;;;6CAGW,IAAI,SAAS,kCAAkC,GAAE;oDAC1C,WAAW,IAAI,MAAM,EAAC;;kDAExB,WAAW,IAAI,IAAI,EAAC;cACxD,IAAI,UAAU,SAAY,KAAK,wCAAwC,WAAW,IAAI,KAAK,EAAC,SAAS;;KAE9G,CAAC,CAAC,KAAK,EAAE;CAEV,OAAO;;cAEG,QAAQ,uDAAuD,WAAW,KAAK,EAAC,UAAW,GAAE;cAC7F,MAAK;cACL,QAAQ;;0DAEoC,WAAW,MAAM,IAAI,EAAC;2DACrB,WAAW,MAAM,KAAK,EAAC;;gBAElE,GAAE;cACJ,SAAS,wDAAwD,WAAW,MAAM,EAAC,UAAW,GAAE;;;AAG9G;AAGA,SAAS,WAAW,MAAY;CAC5B,OAAO,KACF,QAAQ,MAAM,OAAO,CAAC,CACtB,QAAQ,MAAM,MAAM,CAAC,CACrB,QAAQ,MAAM,MAAM,CAAC,CACrB,QAAQ,MAAM,QAAQ,CAAC,CACvB,QAAQ,MAAM,OAAO;AAC9B;AAEA,SAAS,UAAU,MAAe,WAAkB;CAChD,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC,cAAc,SAAS,GAChD,OAAO,cAAc,SAAY,OAAO;CAG5C,MAAM,SAAkC,EAAE,GAAG,KAAI;CAEjD,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,SAAS,GAC/C,OAAO,OAAO,UAAU,KAAK,MAAM,KAAK;CAG5C,OAAO;AACX;AAEA,SAAS,cAAc,OAAc;CACjC,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC9E;ACzKA,IAAa,yBAAb,MAAa,uBAAsB;CACtB,QAAQ,MAAyB,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAGpC,OAAO,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAGxB,MAAM,MAAgC,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;CAG3C,YAAY,MAAgE,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAGjF,SAAS,MAAgB,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAG5B,aAAa,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,aAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGvD,cAAc,OAAM;CAEZ,UAAU,OAAsB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CACrC,UAAU,OAAsB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAGrC,YAAY,eAAe,KAAK,QAAO,KAAM,KAAK,QAAO,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAG1D,aAAa,eAAc;EAC1C,MAAM,SAAS,KAAK,IAAG;EAEvB,IAAI,CAAC,QACD,OAAO,KAAK,MAAK;EAGrB,MAAM,SAAS,KAAK,UAAS;EAE7B,OAAO,SAAS,OAAO,OAAO,YAAW,CAAE,IAAI,OAAO,YAAW;CACrE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CACiB,YAAY,eAAe,KAAK,IAAG,CAAE,EAAE,WAAU,KAAM,KAAK,KAAI,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CACrE,cAAc,eAAe,KAAK,IAAG,CAAE,EAAE,aAAY,KAAM,KAAK,OAAM,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEvE,eAAe,eAC9B,KAAK,WAAU,CAAE,CAAC,QAAO,SAAQ,CAAC,KAAK,YAAW,CAAE,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,QAC7E,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAED,cAAA;EACI,aAAY;GACR,MAAM,OAAO,KAAK,UAAS;GAE3B,gBAAe;IACX,KAAK,IAAG,CAAE,EAAE,SAAS,IAAI,IAAI;IAC7B,KAAK,YAAY,KAAK,IAAI;GAC9B,CAAC;EACL,CAAC;CACL;CAEU,MAAM,MAAmB;EAC/B,KAAK,QAAQ,IAAI,IAAI;CACzB;CAEU,MAAM,MAAqB,OAAkB;EAEnD,IAAI,QAAQ,CAAE,OAAO,QAA2B,QAAQ,gBAAgB,GACpE;EAGJ,KAAK,QAAQ,IAAI,IAAI;CACzB;CAEU,SAAS,MAAqB;EACpC,OAAO,KAAK,YAAW,CAAE,CAAC,SAAS,KAAK,IAAI;CAChD;CAGU,SAAS,MAAqB;EACpC,OAAO,CAAC,KAAK,SAAS,IAAI,KAAK,KAAK,aAAY,MAAO;CAC3D;CAEU,OAAO,MAAqB;EAClC,IAAI,KAAK,SAAS,IAAI,GAClB;EAGJ,MAAM,SAAS,KAAK,YAAW;EAC/B,MAAM,OAAO,OAAO,SAAS,KAAK,IAAI,IAChC,OAAO,QAAO,SAAQ,SAAS,KAAK,IAAI,IACxC,CAAC,GAAG,QAAQ,KAAK,IAAI;EAE3B,MAAM,SAAS,KAAK,IAAG;EAEvB,IAAI,QACA,OAAO,aAAa,IAAI,IAAI;OAE5B,KAAK,OAAO,IAAI,IAAI;CAE5B;CAhGS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAsB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAtB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAsB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,KAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA;GAAA,QAAA;GAAA,aAAA;EAAA;EAAA,UAAA;EAAA,UCxBnC;EAyCA,QAAA,CAAA,gnJAAA;CAAA,CAAA;;ADjBa,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAsB,YAAA,CAAA;EALlC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAiB,UAAA;GAAA,QAAA,CAAA,gnJAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AEwB/B,IAAa,mBAAb,MAAa,iBAAgB;CAChB,UAAU,MAAM,SAAwB,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAGxC,YAAY,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAGpC,eAAe,MAAgB,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAGlC,WAAW,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAE7B,SAAS,UAAU,SAChC,UACH,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACgB,QAAQ,OAA0B,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEhD,YAAY;CAEZ,aAAgC,CAAA;CAEvB,OAAO,OAAgC,UAAU;CAE1D,iBAAwC;CAEhD,cAAA;EAEI,gBAAgB,YAAW;GACvB,MAAM,EAAE,SAAS,SAAS,MAAM,OAAO;GAEvC,IAAI,KAAK,WACL;GAGJ,MAAM,QAAQ,IAAI,KACd,KAAK,OAAM,CAAE,CAAC,eACd,KAAK,sBAAsB,UAAU,KAAK,OAAO,CAAC,CAAC;GAGtD,MAA2B,iBAAiB,iBAAgB;IACzD,KAAK,YAAY,KAAK;IACtB,KAAK,cAAa;GACtB,CAAC;GAED,KAAK,aAAa,KAAK,YAAW;GAClC,MAAM,MAAM,OAAM;GAClB,KAAK,MAAM,IAAI,KAAK;GACpB,KAAK,kBAAkB,KAAK;GAC5B,KAAK,YAAY,KAAK;GACtB,KAAK,cAAa;EACtB,CAAC;EAGD,aAAY;GACR,MAAM,UAAU,KAAK,QAAO;GAC5B,MAAM,QAAQ,KAAK,MAAK;GAExB,IAAI,CAAC,OACD;GAIJ,MAAM,QAAQ,KAAK,YAAW;GAC9B,MAAM,YAAY,MAAM,WAAW,KAAK,WAAW,UAC/C,MAAM,MAAM,MAAM,UAAU,SAAS,KAAK,WAAW,MAAM,KAC3D,MAAM,OAAM,SAAQ,KAAK,WAAW,SAAS,IAAI,CAAC;GAEtD,KAAK,aAAa;GAClB,MAAM,cACF,KAAK,sBAAsB,OAAO,GAClC,OACA,CAAC,SAAS;EAElB,CAAC;EAED,aAAY;GACR,KAAK,SAAQ;GAEb,IAAI,KAAK,MAAK,GACV,KAAK,cAAa;EAE1B,CAAC;EAED,aAAY;GACR,MAAM,QAAQ,KAAK,MAAK;GAExB,IAAI,OAAO;IACP,KAAK,YAAY,KAAK;IACtB,KAAK,cAAa;GACtB;EACJ,CAAC;EAED,OAAO,UAAU,CAAC,CAAC,gBAAe;GAC9B,KAAK,YAAY;GACjB,KAAK,gBAAgB,WAAU;GAC/B,KAAK,MAAK,CAAE,EAAE,QAAO;EACzB,CAAC;CACL;CAGQ,sBAAsB,SAAqB;EAC/C,OAAO;GACH,GAAG;GACH,OAAO;IAAE,GAAG,QAAQ;IAAO,sBAAsB;GAAK;EACzD;CACL;CAEQ,kBAAkB,OAAiB;EACvC,KAAK,iBAAiB,IAAI,qBAAoB;GAC1C,IAAI,CAAC,KAAK,kBAAiB,GAEvB,MAAM,aAAa,UAAU,KAAK,OAAO,CAAC,CAAC,UAAU,CAAA,GAAI,KAAK;EAEtE,CAAC;EAED,KAAK,eAAe,QAAQ,KAAK,KAAK,aAAa;CACvD;CAGQ,oBAAiB;EACrB,MAAM,OAAO,KAAK,KAAK;EACvB,MAAM,QAAQ,KAAK,OAAM,CAAE,CAAC,cAAc,cACtC,oBAAoB;EAGxB,OAAO,CAAC,CAAC,SACL,MAAM,gBAAgB,KAAK,eAC3B,MAAM,iBAAiB,KAAK;CACpC;CAEQ,YAAY,OAAiB;EACjC,MAAM,SAAS,KAAK,aAAY;EAGhC,IAAI,CAAC,KAAK,OAAM,CAAE,CAAC,cAAc,cAAc,sCAAsC,GACjF;EAGJ,KAAK,MAAM,QAAQ,KAAK,YAAW,GAAI;GACnC,IAAI,CAAC,MACD;GAGJ,IAAI,OAAO,SAAS,IAAI,GACpB,MAAM,WAAW,IAAI;QAErB,MAAM,WAAW,IAAI;EAE7B;CACJ;CAGQ,gBAAa;EACjB,MAAM,QAAQ,KAAK,YAAW;EAG9B,MAAM,WAAW,UAAU,KAAK,QAAQ;EACxC,MAAM,SACF,YACI,MAAM,SAAS,QAAQ,KACvB,CAAC,UAAU,KAAK,YAAY,CAAC,CAAC,SAAS,QAAQ,IAC7C,WACA;EACV,MAAM,SAAS,KAAK,OAAM,CAAE,CAAC,cAAc,iBAEzC,sCAAsC;EAExC,KAAK,MAAM,SAAS,QAAQ;GACxB,MAAM,OAAO,MAAM,OAAO,MAAM,aAAa,gBAAgB,CAAC;GAE9D,MAAM,UAAU,OACZ,0BACA,CAAC,CAAC,UAAU,SAAS,MAAM;EAEnC;CACJ;CAGQ,cAAW;EACf,MAAM,EAAE,SAAS,CAAA,GAAI,SAAS,CAAA,MAAO,UAAU,KAAK,OAAO;EAE3D,OAAO,OAAO,KAAK,MAAM,UACrB,OAAO,SAAS,YAAY,SAAS,QAAQ,UAAU,OACjD,KAAK,QAAQ,OACb,OAAO,UAAU,IAAI;CAEnC;CA1LS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAgB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAhB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAgB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,cAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA,EAAA,gBAAA,WAAA;EAAA,aAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,QAAA;GAAA,aAAA;GAAA,UAAA;EAAA,CAAA;EAAA,UAAA;EAAA,UAbf;;;;;;;;EAOT,UAAA;EAAA,QAAA,CAAA,4XAAA,k5IAAA;EAAA,eAAA,GAAA,kBAAA;CAAA,CAAA;;AAMQ,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAgB,YAAA,CAAA;EAf5B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAU,UACV;;;;;;;;GAOT,eAGc,kBAAkB;GAAI,MAC/B,EAAE,OAAO,WAAU;GAAE,QAAA,CAAA,4XAAA,k5IAAA;EAAA,CAAA;CAevB,CAAA;CAAA,sBAAA,CAAA;CAAA,gBAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,cAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,UAAQ,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA;ACbhB,IAAa,wBAAb,MAAa,sBAAqB;CACrB,UAAU,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAClC,aAAa,MAAM,SAAoB,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CACvC,SAAS,MAAM,SAAyB,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACxC,iBAAiB,MAAM,SAA+B,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CACtD,gBAAgB,MAAc,YAAW,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CACzC,UAAU,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,UAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGpD,SAAS,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,SAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAElD,QAAQ,OAAgC;EAC9C,OAAO,UAAU,QAAQ,UAAU;CACvC;CAEU,OAAO,OAAgC;EAC7C,OAAO,KAAK,QAAQ,KAAK,IAAI,KAAK,eAAc,CAAE,CAAC,KAAK,IAAI;CAChE;CAjBS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAqB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAArB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAqB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,gBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,eAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,UAAA;EAAA,UAjCpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BT,UAAA;EAAA,QAAA,CAAA,wxDAAA;CAAA,CAAA;;AAGQ,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAqB,YAAA,CAAA;EAnCjC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAgB,UAChB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BT,QAAA,CAAA,wxDAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACsCL,IAAa,wBAAb,MAAa,sBAAqB;CAErB,UAAU,MAAM,SAA+B,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAC/C,YAAY,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CACpC,aAAa,MAAM,SAAoB,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CACvC,SAAS,MAAM,SAAyB,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACxC,cAAc,MAAM,SAA6B,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CACjD,aAAa,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAC9B,eAAe,MAAgB,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAClC,iBAAiB,MAAM,SAA+B,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CACtD,gBAAgB,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CACxC,SAAS,MAAM,SAAuB,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACtC,YAAY,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAEpC,UAAU,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,UAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACpD,QAAQ,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,QAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAClD,YAAY,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,YAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACtD,SAAS,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,SAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACnD,aAAa,MAAM,MAAI;EAAA,GAAA,YAAA,EAAA,WAAA,aAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGtD,WAAW,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAE3B,OAAO,eAAe,KAAK,OAAM,MAAO,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAC/C,cAAc,eAAc;EAC3C,MAAM,SAAS,KAAK,OAAM;EAE1B,OAAO,WAAW,SAAS,OAAO;CACtC,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CA5BO,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAqB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAArB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAqB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,cAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,gBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,eAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA;GAAA,cAAA;GAAA,UAAA;EAAA;EAAA,MAAA;GAAA,YAAA;IAAA,eAAA;IAAA,cAAA;IAAA,kBAAA;IAAA,gBAAA;GAAA;GAAA,gBAAA;EAAA;EAAA,UAAA;EAAA,UAjEpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkDT,UAAA;EAAA,cAAA;GAAA;IAAA,MAAA;IAAA,MAEG;IAAgB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAChB;IAAqB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACrB;IAAsB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA,CAAA,gBAAA,aAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MACtB;IAAmB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;GAAA;EAAA;CAAA,CAAA;;AAUd,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAqB,YAAA,CAAA;EAnEjC,MAAA;EAAU,MAAA,CAAA;GACP,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDV,SAAS;IACL;IACA;IACA;IACA;GACH;GACD,MAAM;IACF,OAAO;IACP,iBAAiB;IACjB,gBAAgB;IAChB,oBAAoB;IACpB,kBAAkB;GACrB;EACJ,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5DD,MAAM,oBAAoB;AAE1B,MAAM,iBAAiB;AAEvB,SAAS,KAAK,QAAgB,KAAa;CACvC,OAAO,gBAAgB,QAAQ,IAAI,SAAS,cAAc,KAAK,IAAI;AACvE;AAYA,IAAa,sBAAb,MAAa,4BAA4B,gBAAe;CAC3C,cAAc,MAA2B,YAAW,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CACpD,UAAU,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,UAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGpD,oBAAoB,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,oBAAA,CAAA,+BAAA,CAAA,CAAA;CAEpC,eAAe,eAA4B;EAC1D,MAAM,MAAM,KAAK,IAAG;EACpB,MAAM,OAAO,iBAAiB,GAAG;EACjC,MAAM,SAAS,gBAAgB,GAAG;EAClC,MAAM,aAAa,KAAK,YAAW,MAAO;EAC1C,MAAM,SAAS,KAAK,iBAAgB;EACpC,MAAM,SAAS,KAAK,OAAM;EAC1B,MAAM,SAAS,KAAK,OAAM;EAC1B,MAAM,aAAa,KAAK,WAAU;EAClC,MAAM,UAAU,KAAK,QAAO;EAC5B,MAAM,SAAS,WAAW,QAAQ,KAAK,kBAAiB,KAAM,EAAE;EAGhE,MAAM,YAAY,GAAG,kBAAiB;EACtC,MAAM,cAAc,SACd,EAAE,MAAM,MAAK,IACb;GAAE,GAAG;GAAQ,YAAY,UAA2B,OAAO,OAAO,KAAK,CAAC;EAAC;EAuF/E,OAAO,kBAAkB;GApFrB,GAAG;GACH,OAAO;IACH,GAAG,KAAK;IACR,MAAM;IACN,QAAQ,KAAK,WAAU;IACvB,SAAS,KAAK,QAAO;GACxB;GACD,QAAQ,SAAS,IACX,UACA,QAAQ,KAAI,YAAW,EAAE,qBACvB,mBAAmB,SACb,SACA,KAAK,QAAQ,GAAG,CAAC;GAE/B,QAAQ,OAAO,KAAI,UAAS;IACxB,MAAM,KAAK;IACX,MAAM,KAAK,UAAS,IAAK,KAAK,KAAK,UAAU,IAAI,IAAI,KAAK;GAC7D,EAAC;GACF,aAAa,EACT,KAAK;IACD;IAEA,cAAc,KAAK,QAAO,IAAK,IAAI;IACnC,yBAAyB;IACzB,aAAa;IACb,WAAW;GACd,EACJ;GAED,QAAQ;IAAE,MAAM;IAAM,OAAO;IAAG,QAAQ,CAAC,IAAI,OAAO;GAAC;GAErD,OAAO;IACH,GAAG,KAAK;IACR;IACA,QAAQ,aACF,cACA;KAAE,GAAG;KAAQ,WAAW,sBAAsB,UAAU;KAAG,QAAQ;IAAC;GAC7E;GACD,OAAO;IAAE,GAAG,KAAK;IAAO,QAAQ,aAAa,SAAS;GAAW;GACjE,MAAM;IACF,GAAG,KAAK;IAER,OAAO,EAAE,OAAO,EAAE,MAAM,WAAU,EAAE;IACpC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,WAAU,EAAE;GACxC;GACD,SAAS,KAAK,UAAS,IACjB,EAAE,SAAS,MAAK,IAChB,KAAK,QAAO,IACZ;IACE,QAAQ;IACR,WAAW;IACX,SAAS,EAAE,qBAAgD;KACvD,MAAM,OAAO,OACR,KAAK,MAAM,WAAW;MACnB,QAAQ,QAAQ;MAChB,MAAM,KAAK;MACX,KAAK,KAAK,KAAK,mBAAmB;KACrC,EAAC,CAAC,CACF,QAAO,QAAO,CAAC,KAAK,aAAY,CAAE,CAAC,SAAS,IAAI,IAAI,CAAC;KAC1D,MAAM,SAAS,KAAK,KAAI,QAAO,IAAI,GAAG,CAAC,CAAC,QAAO,UAAS,UAAU,IAAI;KAEtE,OAAO,iBACH,WAAW,mBAAmB,IAC9B,KAAK,KAAI,SAAQ;MAAE,GAAG;MAAK,OAAO,SAAS,SAAY,KAAK,YAAY,IAAI,GAAG;KAAC,EAAG,GACnF,IACA,SAAS,SAAY;MACjB,MAAM;MACN,OAAO,KAAK,YAAY,OAAO,SAAS,OAAO,QAAQ,KAAK,UAAU,MAAM,OAAO,CAAC,IAAI,IAAI;KAC/F,CAAA;IAET;GACH,IACC;IACE,QAAQ;IACR,WAAW;IACX,SAAS,EAAE,aAAa,qBACpB,iBAAiB,WAAW,mBAAmB,IAAI,CAAC;KAChD,QAAQ,QAAQ;KAChB,MAAM,OAAO,YAAY,EAAE,QAAQ;KACnC,OAAO,SAAS,SAAY,KAAK,YAAY,OAAO,YAAY,EAAE,KAAK,eAAe;IACzF,CAAA,CAAC;GACT;EAGgB,GAAS,KAAK,QAAO,CAAE;CACpD,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CA/GO,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAmB,MAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAnB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAmB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,mBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA,EAAA,gBAAA,uBAAA;EAAA,iBAAA;EAAA,UAAA;EAAA,UCpChC;EAmBA,cAAA,CAAA;GAAA,MAAA;GAAA,MDcc;GAAqB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;GAAA,SAAA,CAAA,sBAAA,gBAAA;EAAA,CAAA;CAAA,CAAA;;AAGtB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAmB,YAAA,CAAA;EAN/B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAc,SAEf,CAAC,qBAAqB;GAAC,MAC1B,EAAE,OAAO,uBAAsB;GAAE,UAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AEjC3C,MAAa,uBAAuB,CAAC,YAAY,YAAY;ACe7D,MAAM,mBAAmB;AAGzB,MAAM,kBAAkB;AAYxB,IAAa,uBAAb,MAAa,6BAA6B,gBAAe;CACzB,iBAAiB;CAEpC,QAAQ,MAAsB,YAAW,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAGzC,aAAa,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,aAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGvD,gBAAgB,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CAE1C,iBAAiB,MAAc,aAAY,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CAEnC,uBAAuB,eAA2C;EAC/E,MAAM,OAAO,KAAK,cAAa;EAC/B,MAAM,aAAa,KAAK,WAAU;EAClC,MAAM,MAAM,KAAK,IAAG;EAGpB,IAAI,CAAC,QAAQ,CAAC,WAAW,SAAS,IAAI,GAClC,OAAO,EAAE,OAAO,CAAA,EAAE;EAGtB,OAAO,EAEH,OAAO,CAAC;GACJ,GAAG;GACH,IAAI,WAAW,WAAW,SAAS;GACnC,WAAW,IAAI;GACf,SAAS;GACT,aAAa;GACb,OAAO;IACH,MAAM,KAAK,eAAc;IACzB,UAAU;IACV,aAAa;IACb,YAAY;IACZ,aAAa;IACb,SAAS;IACT,SAAS;IACT,OAAO;KACH,YAAY;KACZ,OAAO,IAAI;KACX,UAAU;IACb;GACJ;EACJ,CAAA,EACJ;CACL,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,uBAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,eAAe,eAA4B;EAC1D,MAAM,MAAM,KAAK,IAAG;EACpB,MAAM,OAAO,iBAAiB,GAAG;EACjC,MAAM,SAAS,gBAAgB,GAAG;EAClC,MAAM,SAAS,KAAK,OAAM;EAC1B,MAAM,aAAa,KAAK,WAAU;EAClC,MAAM,UAAU,KAAK,QAAO;EAC5B,MAAM,SAAS,KAAK,OAAM;EAC1B,MAAM,QAAQ,KAAK,QAAO;EAC1B,MAAM,SAAS,KAAK,OAAM;EAG1B,MAAM,QAAQ,OAAO,KAAK,GAAG,UAAU,KAAK,CAAC,CAAC,MAAM,GAAG,MAAM,OAAO,MAAM,EAAE,IAAI,OAAO,MAAM,EAAE,CAAC;EA8EhG,OAAO,kBAAkB;GA3ErB,GAAG;GACH,OAAO;IACH,GAAG,KAAK;IACR,MAAM;IACN,QAAQ,KAAK,WAAU;GAC1B;GACD,aAAa,KAAK,qBAAoB;GACtC,QAAQ,MAAM,KAAI,UAAS,QAAQ,MAAM;GACzC,QAAQ,MAAM,KAAI,WAAU;IACxB,MAAM,OAAO,MAAM,CAAC;IACpB,MAAM,KAAK,UAAS,IAAK,OAAO,MAAM,CAAC,KAAK,UAAU,IAAI,IAAI,OAAO,MAAM,CAAC;GAC/E,EAAC;GACF,QAAQ;IACJ,OAAO,KAAK,MAAK;IACjB,OAAO,MAAM,KAAI,UAAS,MAAM,SAAS,MAAM,CAAC;IAChD,WAAW,MAAM,KAAI,UAAS,OAAO,SAAS,IAAI,CAAC;IACnD,SAAS;GACZ;GAED,SAAS;IACL,MAAM,KAAK,WAAU,IAAK,IAAI;IAC9B,cAAc,IAAI;IAClB,aAAa;IACb,OAAO,EAAE,MAAM,EAAC;GACnB;GACD,OAAO;IACH,GAAG,KAAK;IAER,QAAQ;KAAE,GAAG;KAAQ,WAAW,sBAAsB,UAAU;KAAG,QAAQ;IAAC;IAC5E,YAAY;KACR,MAAM;KACN,OAAO;KACP,QAAQ;MAAE,OAAO,IAAI;MAAM,OAAO;MAAG,WAAW;KAAC;IACpD;IAED,SAAS,EAAE,SAAS,MAAK;GAC5B;GACD,OAAO;IACH,GAAG,KAAK;IACR,QAAQ,SAAS,EAAE,MAAM,MAAK,IAAK;KAAE,GAAG;KAAQ,WAAW,KAAK,iBAAgB;IAAE;GACrF;GACD,MAAM;IACF,GAAG,KAAK;IACR,OAAO,EAAE,OAAO,EAAE,MAAM,MAAK,EAAE;IAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,KAAI,EAAE;GACjC;GACD,SAAS,KAAK,UAAS,IAAK,EAAE,SAAS,MAAK,IAAK;IAC7C,QAAQ;IACR,WAAW;IAEX,SAAS,EAAE,qBAAgD;KACvD,MAAM,OAAO,OACR,KAAK,MAAM,WAAW;MACnB,QAAQ,QAAQ;MAChB,QAAQ,OAAO;MACf,MAAM,KAAK;MACX,KAAK,KAAK,KAAK,mBAAmB;MAClC,OAAO,MAAM;KAChB,EAAC,CAAC,CACF,QAAO,QAAO,CAAC,KAAK,aAAY,CAAE,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CACtD,MAAM,GAAG,MAAM,KAAK,aAAa,GAAG,CAAC,CAAC,CAAC,CACvC,KAAI,SAAQ;MAAE,GAAG;MAAK,OAAO,SAAS,SAAY,KAAK,YAAY,IAAI,GAAG;KAAC,EAAG;KAEnF,MAAM,QAAQ,KAAK,QAAO,QAAO,CAAC,IAAI,KAAK,CAAC,CAAC,SAAS;KACtD,MAAM,QAAQ,KAAK,SAAS;KAE5B,OAAO,iBACH,WAAW,mBAAmB,IAC9B,KAAK,MAAM,GAAG,KAAK,GACnB,QAAQ,IAAI,GAAG,MAAK,SAAU,EAAE;IAExC;GACH;EAGoB,GAAS,KAAK,QAAO,CAAE;CACpD,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAGM,aACJ,GACA,GAAuD;EAEvD,IAAI,EAAE,UAAU,EAAE,OACd,OAAO,OAAO,EAAE,KAAK,IAAI,OAAO,EAAE,KAAK;EAG3C,MAAM,YAAY,KAAK,UAAS;EAEhC,IAAI,CAAC,EAAE,SAAS,WACZ,OAAO,UAAU,QAAQ,EAAE,IAAI,IAAI,UAAU,QAAQ,EAAE,IAAI;EAI/D,IAAI,CAAC,EAAE,SAAS,KAAK,OAAM,CAAE,CAAC,UAAU,iBACpC,OAAO;EAGX,QAAQ,EAAE,OAAO,cAAc,EAAE,OAAO;CAC5C;CAnKS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAoB,MAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAApB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAoB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,eAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,gBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA,EAAA,gBAAA,uBAAA;EAAA,iBAAA;EAAA,UAAA;EAAA,UC/BjC;EAmBA,cAAA,CAAA;GAAA,MAAA;GAAA,MDSc;GAAqB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;GAAA,SAAA,CAAA,sBAAA,gBAAA;EAAA,CAAA;CAAA,CAAA;;AAGtB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAoB,YAAA,CAAA;EANhC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAe,SAEhB,CAAC,qBAAqB;GAAC,MAC1B,EAAE,OAAO,uBAAsB;GAAE,UAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AE5B3C,MAAa,kBAAkB;CAAC;CAAY;CAAU;AAAU;AC4BhE,IAAa,sBAAb,MAAa,4BAA4B,gBAAe;CAC3C,UAAU,MAAuB,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAE/B,mBAAmB,IAAI,KAAK,aAAa,KAAK,SAAS,QAAQ;EAC5E,OAAO;EACP,uBAAuB;CAC1B,CAAA;CAGQ,aAAa,MAAc,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAMnC,eAAe,MAAqC,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAE7C,SAAS,eAAe,KAAK,OAAM,CAAE,CAAC,EAAE,EAAE,QAAQ,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAG5C,UAAU,eAClC,CAAC,KAAK,OAAM,CAAE,CAAC,MAAK,UAAS,UAAU,QAAQ,QAAQ,CAAC,GAC3D,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAE2B,UAAU,eAAc;EAChD,MAAM,YAAY,KAAK,UAAS;EAEhC,OAAO,KAAK,WAAU,CAAE,CAAC,KAAI,SACzB,CAAC,CAAC,aAAa,CAAC,UAAU,SAAS,IAAI,CAAC;CAEhD,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAE0B,SAAS,eAAkC;EACnE,MAAM,YAAY,KAAK,UAAS;EAChC,MAAM,QAAQ,KAAK,QAAO;EAC1B,MAAM,QAAQ,KAAK,aAAY;EAE/B,OAAO,KAAK,WAAU,CAAE,CAAC,KAAK,MAAM,UAAS;GACzC,IAAI,MAAM,QACN,OAAO;IAAE,QAAQ,KAAK,IAAG,CAAE,CAAC;IAAS,QAAQ;GAAK;GAGtD,MAAM,QAAQ,iBACV,YAAY,UAAU,QAAQ,IAAI,IAAI,OACtC,OACA,KAAK,KAAI,CAAE;GAGf,OAAO;IAAE,GAAG;IAAO,QAAQ,MAAM,UAAU,MAAM;GAAM;EAC3D,CAAC;CACL,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAEgB,cAAc,eAAc;EAC1C,MAAM,YAAY,KAAK,UAAS;EAChC,MAAM,QAAQ,KAAK,WAAU,CAAE,CAC1B,KAAK,MAAM,WAAW;GAAE;GAAM,GAAG,KAAK,OAAM,CAAE,CAAC;EAAM,EAAG,CAAC,CACzD,QAAQ,GAAG,UAAU,CAAC,KAAK,QAAO,CAAE,CAAC,MAAM;EAEhD,OAAO,YACD,MAAM,MAAM,GAAG,MACb,UAAU,QAAQ,EAAE,IAAI,IAAI,UAAU,QAAQ,EAAE,IAAI,CAAC,IAEvD;CACV,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAGe,SAAS,eAAc;EACpC,MAAM,SAAS,KAAK,aAAY;EAChC,MAAM,SAAS,KAAK,OAAM;EAC1B,MAAM,UAAU,KAAK,QAAO;EAE5B,OAAO,KAAK,WAAU,CAAE,CACnB,KAAK,MAAM,WAAW;GACnB;GACA,OAAO,OAAO,UAAU;GACxB,QAAQ,QAAQ;EACnB,EAAC,CAAC,CACF,QAAO,UAAS,CAAC,OAAO,SAAS,MAAM,IAAI,CAAC;CACrD,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,eAAe,eAA4B;EAC1D,MAAM,MAAM,KAAK,IAAG;EACpB,MAAM,OAAO,iBAAiB,GAAG;EACjC,MAAM,SAAS,KAAK,OAAM;EAC1B,MAAM,QAAQ,KAAK,QAAO,MAAO;EACjC,MAAM,QAAQ,OAAO,QAAQ,KAAK,UAAU,MAAM,MAAM,OAAO,CAAC;EAChE,MAAM,YAAY,KAAK,UAAS;EAChC,MAAM,QAAQ,YAAY,CAAC;GAAE,MAAM;GAAI,OAAO;GAAG,QAAQ,IAAI;EAAI,CAAE,IAAI;EACvE,MAAM,aAAa;GACf,UAAU;GACV,OAAO,IAAI;GACX,SAAS;EACZ;EAyED,OAAO,kBAAkB;GAtErB,GAAG;GACH,OAAO;IACH,GAAG,KAAK;IACR,MAAM,QAAQ,UAAU;IACxB,QAAQ,KAAK,WAAU;GAC1B;GACD,QAAQ,MAAM,KAAI,UAAS,MAAM,MAAM;GACvC,QAAQ,MAAM,KAAI,UAAS,MAAM,IAAI;GACrC,QAAQ,MAAM,KAAI,UAAS,MAAM,KAAK;GAEtC,QAAQ;IAAE,MAAM;IAAM,OAAO;IAAG,QAAQ,CAAC,IAAI,OAAO;GAAC;GAErD,QAAQ;IACJ,GAAG,KAAK;IACR,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,SAAS,SAAQ,EAAE;GAC3D;GACD,aAAa,EACT,KAAK;IAED,eAAe;IACf,OAAO;KACH,MAAM;KACN,QAAQ;MACJ,MAAM;MACN,MAAM;MACN,OAAO;OACH,UAAU;OACV,YAAY;OACZ,OAAO,IAAI;OACX,SAAS;OACT,YAAY,UACR,KAAK,YAAY,OAAO,KAAK,CAAC;MACrC;MACD,OAAO;OACH,MAAM;OACN,YAAY;OACZ,OAAO,KAAK,WAAU;OACtB,GAAG;OACH,iBAAiB,KAAK,YAAY,KAAK;MAC1C;KACJ;IACJ;GACJ,EACJ;GACD,SAAS,YAAY,EAAE,SAAS,MAAK,IAAK;IAEtC,OAAO;IACP,iBAAiB;IACjB,SAAS,EAAE,kBAA2C;KAClD,MAAM,QAAQ,OAAO;KAErB,OAAO,QACD,iBACE,IACA,CAAC;MACG,QAAQ,MAAM;MACd,MAAM,MAAM;MACZ,OAAO,KAAK,OAAM,IAAK,SAAY,KAAK,YAAY,MAAM,KAAK;KAClE,CAAA,GACD,QACM,GACE,KAAK,iBAAiB,OAAO,MAAM,QAAQ,KAAK,EACpD,aACE,EAAE,IAEV;IACV;GACH;EAGoB,GAAS,KAAK,QAAO,CAAE;CACpD,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAtKO,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAmB,MAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAnB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAmB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,cAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA,EAAA,gBAAA,uBAAA;EAAA,iBAAA;EAAA,UAAA;EAAA,UC7BhC;EAmBA,cAAA,CAAA;GAAA,MAAA;GAAA,MDOc;GAAqB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;GAAA,SAAA,CAAA,sBAAA,gBAAA;EAAA,CAAA;CAAA,CAAA;;AAGtB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAmB,YAAA,CAAA;EAN/B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAc,SAEf,CAAC,qBAAqB;GAAC,MAC1B,EAAE,OAAO,uBAAsB;GAAE,UAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AE1B3C,MAAa,mBAAmB,CAAC,OAAO,OAAO;ACU/C,MAAM,aAAa;AACnB,MAAM,eAAe;AAOrB,MAAM,mBAAmB;AACzB,MAAM,oBAAA;AAGN,MAAM,iBAAiB;AACvB,MAAM,kBAAkB;AACxB,MAAM,mBAAmB;AAyCzB,SAAgB,oBAAoB,QAAwB,MAAa;CACrE,OAAO,OAAO,KAAK,OAAO,UAAU,MAAM,UAAU,YAAY,OAAO,IAAI,CAAC;AAChF;AAMA,SAAgB,mBACZ,QACA,SACA,QACA,QACA,KAAa;CAEb,OAAO,OACF,KAAK,OAAO,UAAU,WAAW,OAAO,QAAQ,QAAQ,QAAQ,GAAG,CAAC,CAAC,CACrE,QAAO,UAAS,MAAM,OAAO,SAAS,KAAK,CAAC,OAAO,SAAS,MAAM,IAAI,CAAC;AAChF;AAEA,SAAS,WACL,OACA,QACA,QACA,KAAa;CAEb,MAAM,QAAQ,MAAM,MAAM,QAAO,SAAQ,KAAK,QAAQ,CAAC;CACvD,MAAM,QAAQ,YAAY,MAAM,KAAI,SAAQ,KAAK,KAAK,CAAC;CAEvD,MAAM,SAAS,MAAM,KAAK,MAAM,UAAS;EACrC,MAAM,OAAO,SAAS,QAAQ,QAAQ,MAAM,QAAQ,GAAG,IAAI;EAE3D,OAAO;GACH,OAAO,MAAM;GACb,MAAM,KAAK;GACX,OAAO,KAAK;GACZ;GACA,UAAU,cAAc,IAAI;EAC/B;CACL,CAAC;CAED,OAAO;EACH,MAAM,MAAM;EACZ;EACA,OAAO,OAAO,QAAQ,KAAK,UAAU,MAAM,MAAM,OAAO,CAAC;EACzD;CACH;AACL;AAGA,SAAS,YAAY,QAAgB;CACjC,MAAM,eAAe,OAChB,KAAK,OAAO,WAAW;EAAE;EAAO;CAAK,EAAG,CAAC,CACzC,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;CACrC,MAAM,QAAkB,CAAA;CAExB,aAAa,SAAS,OAAO,SAAQ;EACjC,MAAM,MAAM,SAAS;CACzB,CAAC;CAED,OAAO;AACX;AAEA,SAAS,QAAQ,QAAgB,MAAc,KAAa;CACxD,MAAM,WAAW,KAAK,IAAI,IAAI,OAAO,YAAY,YAAY;CAE7D,OAAO,gBAAgB,QAAQ,IAAI,SAAS,QAAQ,KAAK;AAC7D;AAGA,SAAgB,iBAAiB,QAAsB;CACnD,MAAM,QAAQ,OAAO,SAAQ,UACzB,MAAM,MACD,QAAO,SAAQ,KAAK,QAAQ,CAAC,CAAC,CAC9B,KAAI,UAAS;EAAE,MAAM,GAAG,MAAM,KAAI,KAAM,KAAK;EAAQ,OAAO,KAAK;CAAK,EAAG,CAAC;CAGnF,OAAO;EACH,YAAY,MAAM,KAAI,SAAQ,KAAK,IAAI;EACvC,QAAQ,MAAM,KAAI,SAAQ,KAAK,KAAK;CACvC;AACL;AAOA,SAAgB,mBAAmB,QAA6B,QAAmB;CAC/E,MAAM,aAAa,SAAS,OAAO,KAAI,UAAS,MAAM,KAAK,GAAG,QAAA,CAAyB;CAEvF,OAAO,OAAO,KAAK,OAAO,UAAU,WAAW,OAAO,WAAW,MAAM,CAAC;AAC5E;AAEA,SAAS,WAAW,OAA0B,MAAiB;CAC3D,MAAM,YAAY,KAAK,SAAS,oBAAoB,KAAK,UAAU;CACnE,MAAM,eAAe,YAAA,KAAoC;CACzD,MAAM,YAAY;EAAE,GAAG;EAAG,GAAG;EAAc,OAAO,KAAK;EAAO,QAAQ,KAAK,SAAS;CAAY;CAChG,MAAM,aAAa,SAAS,MAAM,OAAO,KAAI,UAAS,MAAM,KAAK,GAAG,WAAA,CAA4B;CAEhG,OAAO;EACH,GAAG;EACH;EACA;EACA,cAAc,MAAM,OAAO,KAAK,OAAO,WAAW;GAC9C,GAAG;GACH,MAAM,WAAW;GACjB,OAAO,SAAS,WAAW,MAAM;EACpC,EAAC;CACL;AACL;AAEA,SAAS,SAAS,MAAiB;CAC/B,IAAI,KAAK,QAAQ,kBAAkB,KAAK,SAAS,iBAC7C,OAAO;CAGX,OAAO,KAAK,SAAS,mBAAmB,SAAS;AACrD;AAQA,SAAgB,SAAS,QAAkB,QAAqB,MAAM,GAAC;CACnE,MAAM,QAAQ,OAAO,QAAQ,KAAK,UAAU,MAAM,OAAO,CAAC;CAC1D,MAAM,QAAuB,OAAO,WAAW;EAAE,GAAG,OAAO;EAAG,GAAG,OAAO;EAAG,OAAO;EAAG,QAAQ;CAAC,EAAG;CAEjG,IAAI,SAAS,KAAK,OAAO,SAAS,KAAK,OAAO,UAAU,GACpD,OAAO;CAIX,MAAM,QAAQ,KAAK,QAAQ,MAAM,CAAC;CAClC,MAAM,QAAS,MAAM,QAAQ,MAAM,SAAU;CAC7C,MAAM,eAAe,OAChB,KAAK,OAAO,WAAW;EAAE;EAAO,MAAM,QAAQ;CAAK,EAAG,CAAC,CACvD,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;CAEnC,IAAI,YAAY;CAChB,IAAI,MAAyC,CAAA;CAE7C,KAAK,MAAM,SAAS,cAAc;EAC9B,MAAM,OAAO,KAAK,IAAI,UAAU,OAAO,UAAU,MAAM;EACvD,MAAM,SAAS,CAAC,GAAG,KAAK,KAAK;EAE7B,IAAI,IAAI,WAAW,KAAK,YAAY,QAAQ,IAAI,KAAK,YAAY,KAAK,IAAI,GACtE,MAAM;OACH;GACH,YAAY,SAAS,KAAK,WAAW,KAAK;GAC1C,MAAM,CAAC,KAAK;EAChB;CACJ;CAEA,SAAS,KAAK,WAAW,KAAK;CAE9B,OAAO,MAAM,KAAI,SAAQ,KAAK,QAAQ,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI;AACzE;AAGA,SAAS,YAAY,KAAyB,MAAY;CACtD,MAAM,MAAM,IAAI,QAAQ,OAAO,UAAU,QAAQ,MAAM,MAAM,CAAC;CAC9D,MAAM,UAAU,KAAK,IAAI,GAAG,IAAI,KAAI,UAAS,MAAM,IAAI,CAAC;CACxD,MAAM,WAAW,KAAK,IAAI,GAAG,IAAI,KAAI,UAAS,MAAM,IAAI,CAAC;CAEzD,OAAO,KAAK,IAAK,OAAO,OAAO,WAAY,MAAM,MAAO,MAAM,OAAQ,OAAO,OAAO,SAAS;AACjG;AAGA,SAAS,SAAS,KAAwC,MAAmB,OAAoB;CAC7F,MAAM,MAAM,IAAI,QAAQ,OAAO,UAAU,QAAQ,MAAM,MAAM,CAAC;CAE9D,IAAI,KAAK,SAAS,KAAK,QAAQ;EAC3B,MAAM,QAAQ,MAAM,KAAK;EACzB,IAAI,IAAI,KAAK;EAEb,KAAK,MAAM,SAAS,KAAK;GACrB,MAAM,SAAS,MAAM,OAAO;GAC5B,MAAM,MAAM,SAAS;IAAE,GAAG,KAAK;IAAG;IAAG;IAAO;GAAM;GAClD,KAAK;EACT;EAEA,OAAO;GAAE,GAAG,KAAK,IAAI;GAAO,GAAG,KAAK;GAAG,OAAO,KAAK,QAAQ;GAAO,QAAQ,KAAK;EAAM;CACzF;CAEA,MAAM,SAAS,MAAM,KAAK;CAC1B,IAAI,IAAI,KAAK;CAEb,KAAK,MAAM,SAAS,KAAK;EACrB,MAAM,QAAQ,MAAM,OAAO;EAC3B,MAAM,MAAM,SAAS;GAAE;GAAG,GAAG,KAAK;GAAG;GAAO;EAAM;EAClD,KAAK;CACT;CAEA,OAAO;EAAE,GAAG,KAAK;EAAG,GAAG,KAAK,IAAI;EAAQ,OAAO,KAAK;EAAO,QAAQ,KAAK,SAAS;CAAM;AAC3F;AAEA,SAAS,KAAK,MAAmB,IAAU;CACvC,OAAO;EACH,GAAG,KAAK,IAAI;EACZ,GAAG,KAAK,IAAI;EACZ,OAAO,KAAK,IAAI,KAAK,QAAQ,KAAK,GAAG,CAAC;EACtC,QAAQ,KAAK,IAAI,KAAK,SAAS,KAAK,GAAG,CAAC;CAC3C;AACL;AClPA,MAAM,iBAAiB;AAwBvB,IAAa,0BAAb,MAAa,gCAAgC,YAAW;CAC3C,SAAS,MAAM,SAA0B,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAEhC,SAAS,MAAmB,KAAI,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAGzC,SAAS,MAAM,MAAI;EAAA,GAAA,YAAA,EAAA,WAAA,SAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGlD,aAAa,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,aAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGvD,aAAa,MAAc,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAEnC,aAAa,OAAM;CAEX,SAAS,UAAmC,UAAS,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACrD,OAAO,OAAO;EAAE,OAAO;EAAG,QAAQ;CAAC,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACpC,UAAU,OAA4B,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAG3C,UAAU,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAEzB,mBAAmB,IAAI,KAAK,aAAa,KAAK,SAAS,QAAQ;EAC5E,OAAO;EACP,uBAAuB;CAC1B,CAAA;CAEkB,OAAO,eAAe,KAAK,OAAM,MAAO,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAC/C,cAAc,eAAc;EAC3C,MAAM,SAAS,KAAK,OAAM;EAE1B,OAAO,WAAW,SAAS,OAAO;CACtC,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEe,UAAU,eACvB,oBAAoB,KAAK,OAAM,GAAI,KAAK,KAAI,CAAE,GACjD,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAEgB,cAAc,eAC3B,mBACI,KAAK,OAAM,GACX,KAAK,QAAO,GACZ,KAAK,aAAY,GACjB,KAAK,OAAM,GACX,KAAK,IAAG,CAAE,GAEjB,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEkB,eAAe,eAAc;EAC5C,MAAM,EAAE,OAAO,WAAW,KAAK,KAAI;EAEnC,OAAO,mBAAmB,KAAK,YAAW,GAAI;GAAE,GAAG;GAAG,GAAG;GAAG;GAAO;EAAM,CAAE;CAC/E,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAEe,QAAQ,eACrB,KAAK,YAAW,CAAE,CAAC,QAAQ,KAAK,UAAU,MAAM,MAAM,OAAO,CAAC,GACjE,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEgB,YAAY,eAAe,iBAAiB,KAAK,OAAM,CAAE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAEzD,aAAa,eAAe,KAAK,UAAS,CAAE,CAAC,YAAW,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAExD,SAAS,eAA8B,CACtD;EAAE,MAAM,KAAK,WAAU;EAAI,MAAM,KAAK,UAAS,CAAE,CAAC;CAAM,CAC3D,GAAC,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,UAAU,eAAe,KAAK,WAAU,CAAE,CAAC,WAAW,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAElE,cAAc,eACnB,KAAK,OAAM,CAAE,CACR,KAAK,OAAO,WAAW;EAAE;EAAO,QAAQ,KAAK,QAAO,CAAE,CAAC;CAAM,EAAG,CAAC,CACjE,QAAQ,EAAE,YAAY,MAAM,MAAM,MAAK,SAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAC/D,KAAK,EAAE,OAAO,cAAc;EAAE,MAAM,MAAM;EAAM;CAAM,EAAG,GACjE,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEQ,aAAa,eAAe,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAGvB,aAAa,eAAc;EACxC,MAAM,WAAW,KAAK,SAAQ;EAE9B,OAAO,KAAK,YAAW,CAAE,CAAC,MAAK,UAAS,MAAM,SAAS,QAAQ,IAAI,WAAW;CAClF,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,gBAAgB,eAAc;EAC7C,MAAM,UAAU,KAAK,QAAO;EAE5B,IAAI,CAAC,SACD,OAAO;EAGX,MAAM,EAAE,OAAO,UAAU;EACzB,MAAM,eAAe,GAAG,KAAK,QAAQ,MAAM,QAAQ,KAAK,MAAK,CAAE,EAAC;EAEhE,OAAO,MAAM,OAAO,SAAS,IACvB,GAAG,KAAK,QAAQ,MAAM,QAAQ,MAAM,KAAK,EAAC,MAAO,MAAM,KAAI,KAAM,iBACjE;CACV,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CAGiB,kBAAkB,eAAc;EAC/C,MAAM,UAAU,KAAK,QAAO;EAC5B,MAAM,EAAE,UAAU,KAAK,KAAI;EAE3B,IAAI,CAAC,SACD,OAAO;EAGX,MAAM,UAAU,QAAQ,IAAI,QAAQ;EAEpC,OAAO;GACH,MAAM,UAAU,OAAO,QAAQ,IAAI;GACnC,OAAO,UAAU,QAAQ,QAAQ,IAAI,iBAAiB;GACtD,KAAK,QAAQ,IAAI;EACpB;CACL,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CAEF,cAAA;EACI,MAAK;EAGL,QAAO,cAAY;GACf,MAAM,SAAS,KAAK,OAAM,CAAE,EAAE;GAE9B,IAAI,CAAC,QACD;GAGJ,MAAM,WAAW,IAAI,gBAAgB,CAAC,WAAU;IAC5C,MAAM,EAAE,OAAO,WAAW,MAAM;IAChC,KAAK,KAAK,IAAI;KAAE;KAAO;IAAM,CAAE;IAE/B,IAAI,CAAC,KAAK,QAAO,GACb,4BAA4B,KAAK,QAAQ,IAAI,IAAI,CAAC;GAE1D,CAAC;GAED,SAAS,QAAQ,MAAM;GACvB,gBAAgB,SAAS,WAAU,CAAE;EACzC,CAAC;CACL;CAEU,QAAQ,OAAyB;EACvC,MAAM,aAAa,KAAK,WAAU;EAElC,OAAO,CAAC,CAAC,cAAc,MAAM,SAAS;CAC1C;CAEU,MAAM,OAAqB,OAA2B,OAAyB;EACrF,MAAM,SAAS,KAAK,OAAM,CAAE,EAAE;EAE9B,IAAI,CAAC,UAAU,MAAM,gBAAgB,SACjC;EAGJ,MAAM,SAAS,OAAO,sBAAqB;EAC3C,KAAK,QAAQ,IAAI;GAAE;GAAO;GAAO,GAAG,MAAM,UAAU,OAAO;GAAM,GAAG,MAAM,UAAU,OAAO;EAAG,CAAE;CACpG;CAEU,MAAM,OAA2B,OAAyB;EAChE,KAAK,QAAQ,IAAI;GACb;GACA;GACA,GAAG,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI,MAAM,KAAK,QAAQ;GACpD,GAAG,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI,MAAM,KAAK,SAAS;EACxD,CAAA;CACL;CAEU,OAAO,OAAyB;EACtC,KAAK,WAAW,KAAK;GAAE,OAAO,MAAM;GAAO,MAAM,MAAM;EAAI,CAAE;CACjE;CAEU,eAAe,OAAyB;EAC9C,MAAM,OAAO,GAAG,MAAM,KAAI,IAAK,MAAM;EAErC,OAAO,KAAK,OAAM,IAAK,OAAO,GAAG,KAAI,IAAK,KAAK,YAAY,MAAM,KAAK;CAC1E;CAEQ,QAAQ,OAAa;EACzB,OAAO,KAAK,iBAAiB,OAAO,KAAK;CAC7C;CArLS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAuB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAvB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAuB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA,EAAA,YAAA,aAAA;EAAA,MAAA,EAAA,gBAAA,uBAAA;EAAA,aAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,QAAA;GAAA,aAAA;GAAA,UAAA;EAAA,CAAA;EAAA,iBAAA;EAAA,UAAA;EAAA,UCtDpC;EAkIA,QAAA,CAAA,svLAAA,k5IAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MD/Ec;GAAgB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;GAAA;EAAA,GAAA;GAAA,MAAA;GAAA,MAAE;GAAqB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;GAAA,SAAA,CAAA,sBAAA,gBAAA;EAAA,CAAA;EAAA,eAAA,GAAA,kBAAA;CAAA,CAAA;;AAGxC,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAuB,YAAA,CAAA;EATnC,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAkB,eAIb,kBAAkB;GAAI,SAC5B,CAAC,kBAAkB,qBAAqB;GAAC,MAC5C,EAAE,OAAO,uBAAsB;GAAE,UAAA;GAAA,QAAA,CAAA,svLAAA,k5IAAA;EAAA,CAAA;CAkBsB,CAAA;CAAA,sBAAA,CAAA;CAAA,gBAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,YAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,YAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,YAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,YAAA;EAAA,CAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,UAAQ,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA"}
@@ -0,0 +1,202 @@
1
+ import * as i0 from "@angular/core";
2
+ import { Component, booleanAttribute, computed, input, model } from "@angular/core";
3
+ var UiCheckboxComponent = class UiCheckboxComponent {
4
+ value = model.required(...ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []);
5
+ id = input("", ...ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []);
6
+ name = input("", ...ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []);
7
+ required = input(false, {
8
+ ...ngDevMode ? { debugName: "required" } : /* istanbul ignore next */ {},
9
+ transform: booleanAttribute
10
+ });
11
+ disabled = input(false, {
12
+ ...ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {},
13
+ transform: booleanAttribute
14
+ });
15
+ indeterminate = input(false, {
16
+ ...ngDevMode ? { debugName: "indeterminate" } : /* istanbul ignore next */ {},
17
+ transform: booleanAttribute
18
+ });
19
+ validationState = model(null, ...ngDevMode ? [{ debugName: "validationState" }] : /* istanbul ignore next */ []);
20
+ classes = input("", ...ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []);
21
+ generatedClasses = computed(() => ["ui-checkbox", this.classes()].filter(Boolean).join(" "), ...ngDevMode ? [{ debugName: "generatedClasses" }] : /* istanbul ignore next */ []);
22
+ toggle() {
23
+ this.value.set(!this.value());
24
+ }
25
+ static ɵfac = i0.ɵɵngDeclareFactory({
26
+ minVersion: "12.0.0",
27
+ version: "22.2.1",
28
+ ngImport: i0,
29
+ type: UiCheckboxComponent,
30
+ deps: [],
31
+ target: i0.ɵɵFactoryTarget.Component
32
+ });
33
+ static ɵcmp = i0.ɵɵngDeclareComponent({
34
+ minVersion: "17.1.0",
35
+ version: "22.2.1",
36
+ type: UiCheckboxComponent,
37
+ isStandalone: true,
38
+ selector: "ui-checkbox",
39
+ inputs: {
40
+ value: {
41
+ classPropertyName: "value",
42
+ publicName: "value",
43
+ isSignal: true,
44
+ isRequired: true,
45
+ transformFunction: null
46
+ },
47
+ id: {
48
+ classPropertyName: "id",
49
+ publicName: "id",
50
+ isSignal: true,
51
+ isRequired: false,
52
+ transformFunction: null
53
+ },
54
+ name: {
55
+ classPropertyName: "name",
56
+ publicName: "name",
57
+ isSignal: true,
58
+ isRequired: false,
59
+ transformFunction: null
60
+ },
61
+ required: {
62
+ classPropertyName: "required",
63
+ publicName: "required",
64
+ isSignal: true,
65
+ isRequired: false,
66
+ transformFunction: null
67
+ },
68
+ disabled: {
69
+ classPropertyName: "disabled",
70
+ publicName: "disabled",
71
+ isSignal: true,
72
+ isRequired: false,
73
+ transformFunction: null
74
+ },
75
+ indeterminate: {
76
+ classPropertyName: "indeterminate",
77
+ publicName: "indeterminate",
78
+ isSignal: true,
79
+ isRequired: false,
80
+ transformFunction: null
81
+ },
82
+ validationState: {
83
+ classPropertyName: "validationState",
84
+ publicName: "validationState",
85
+ isSignal: true,
86
+ isRequired: false,
87
+ transformFunction: null
88
+ },
89
+ classes: {
90
+ classPropertyName: "classes",
91
+ publicName: "classes",
92
+ isSignal: true,
93
+ isRequired: false,
94
+ transformFunction: null
95
+ }
96
+ },
97
+ outputs: {
98
+ value: "valueChange",
99
+ validationState: "validationStateChange"
100
+ },
101
+ host: { properties: {
102
+ "attr.id": "null",
103
+ "attr.name": "null"
104
+ } },
105
+ ngImport: i0,
106
+ template: "<input\n type=\"checkbox\"\n [class]=\"generatedClasses()\"\n [id]=\"id()\"\n [name]=\"name()\"\n [required]=\"required()\"\n [checked]=\"value()\"\n [indeterminate]=\"indeterminate()\"\n [disabled]=\"disabled()\"\n [attr.data-invalid]=\"validationState() === false ? '' : null\"\n [attr.data-valid]=\"validationState() === true ? '' : null\"\n (change)=\"toggle()\"\n/>\n",
107
+ styles: ["@layer properties;:host{display:inline-flex}.ui-checkbox{width:calc(var(--spacing, .25rem) * 4);height:calc(var(--spacing, .25rem) * 4);border-radius:.25rem;border-color:var(--border-line-3);color:var(--color-primary-600, var(--color-blue-600))}.ui-checkbox:not(*:checked):not(*:indeterminate){background-color:var(--layer)}.ui-checkbox:focus{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ui-checkbox:focus{--tw-ring-color: color-mix(in srgb, oklch(88.2% .059 254.128) 50%, transparent)}@supports (color: color-mix(in lab,red,red)){.ui-checkbox:focus{--tw-ring-color: color-mix(in oklab, var(--color-primary-200, var(--color-blue-200)) 50%, transparent)}}.ui-checkbox:disabled{opacity:50%}.ui-checkbox[data-invalid]{border-color:var(--color-danger-500, var(--color-red-500));color:var(--color-danger-600, var(--color-red-600))}.ui-checkbox[data-invalid]:focus{--tw-ring-color: color-mix(in srgb, oklch(88.5% .062 18.334) 50%, transparent)}@supports (color: color-mix(in lab,red,red)){.ui-checkbox[data-invalid]:focus{--tw-ring-color: color-mix(in oklab, var(--color-danger-200, var(--color-red-200)) 50%, transparent)}}.ui-checkbox[data-valid]{border-color:var(--color-success-500, var(--color-teal-500));color:var(--color-success-600, var(--color-teal-600))}.ui-checkbox[data-valid]:focus{--tw-ring-color: color-mix(in srgb, oklch(91% .096 180.426) 50%, transparent)}@supports (color: color-mix(in lab,red,red)){.ui-checkbox[data-valid]:focus{--tw-ring-color: color-mix(in oklab, var(--color-success-200, var(--color-teal-200)) 50%, transparent)}}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"]
108
+ });
109
+ };
110
+ i0.ɵɵngDeclareClassMetadata({
111
+ minVersion: "12.0.0",
112
+ version: "22.2.1",
113
+ ngImport: i0,
114
+ type: UiCheckboxComponent,
115
+ decorators: [{
116
+ type: Component,
117
+ args: [{
118
+ selector: "ui-checkbox",
119
+ host: {
120
+ "[attr.id]": "null",
121
+ "[attr.name]": "null"
122
+ },
123
+ template: "<input\n type=\"checkbox\"\n [class]=\"generatedClasses()\"\n [id]=\"id()\"\n [name]=\"name()\"\n [required]=\"required()\"\n [checked]=\"value()\"\n [indeterminate]=\"indeterminate()\"\n [disabled]=\"disabled()\"\n [attr.data-invalid]=\"validationState() === false ? '' : null\"\n [attr.data-valid]=\"validationState() === true ? '' : null\"\n (change)=\"toggle()\"\n/>\n",
124
+ styles: ["@layer properties;:host{display:inline-flex}.ui-checkbox{width:calc(var(--spacing, .25rem) * 4);height:calc(var(--spacing, .25rem) * 4);border-radius:.25rem;border-color:var(--border-line-3);color:var(--color-primary-600, var(--color-blue-600))}.ui-checkbox:not(*:checked):not(*:indeterminate){background-color:var(--layer)}.ui-checkbox:focus{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ui-checkbox:focus{--tw-ring-color: color-mix(in srgb, oklch(88.2% .059 254.128) 50%, transparent)}@supports (color: color-mix(in lab,red,red)){.ui-checkbox:focus{--tw-ring-color: color-mix(in oklab, var(--color-primary-200, var(--color-blue-200)) 50%, transparent)}}.ui-checkbox:disabled{opacity:50%}.ui-checkbox[data-invalid]{border-color:var(--color-danger-500, var(--color-red-500));color:var(--color-danger-600, var(--color-red-600))}.ui-checkbox[data-invalid]:focus{--tw-ring-color: color-mix(in srgb, oklch(88.5% .062 18.334) 50%, transparent)}@supports (color: color-mix(in lab,red,red)){.ui-checkbox[data-invalid]:focus{--tw-ring-color: color-mix(in oklab, var(--color-danger-200, var(--color-red-200)) 50%, transparent)}}.ui-checkbox[data-valid]{border-color:var(--color-success-500, var(--color-teal-500));color:var(--color-success-600, var(--color-teal-600))}.ui-checkbox[data-valid]:focus{--tw-ring-color: color-mix(in srgb, oklch(91% .096 180.426) 50%, transparent)}@supports (color: color-mix(in lab,red,red)){.ui-checkbox[data-valid]:focus{--tw-ring-color: color-mix(in oklab, var(--color-success-200, var(--color-teal-200)) 50%, transparent)}}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"]
125
+ }]
126
+ }],
127
+ propDecorators: {
128
+ value: [{
129
+ type: i0.Input,
130
+ args: [{
131
+ isSignal: true,
132
+ alias: "value",
133
+ required: true
134
+ }]
135
+ }, {
136
+ type: i0.Output,
137
+ args: ["valueChange"]
138
+ }],
139
+ id: [{
140
+ type: i0.Input,
141
+ args: [{
142
+ isSignal: true,
143
+ alias: "id",
144
+ required: false
145
+ }]
146
+ }],
147
+ name: [{
148
+ type: i0.Input,
149
+ args: [{
150
+ isSignal: true,
151
+ alias: "name",
152
+ required: false
153
+ }]
154
+ }],
155
+ required: [{
156
+ type: i0.Input,
157
+ args: [{
158
+ isSignal: true,
159
+ alias: "required",
160
+ required: false
161
+ }]
162
+ }],
163
+ disabled: [{
164
+ type: i0.Input,
165
+ args: [{
166
+ isSignal: true,
167
+ alias: "disabled",
168
+ required: false
169
+ }]
170
+ }],
171
+ indeterminate: [{
172
+ type: i0.Input,
173
+ args: [{
174
+ isSignal: true,
175
+ alias: "indeterminate",
176
+ required: false
177
+ }]
178
+ }],
179
+ validationState: [{
180
+ type: i0.Input,
181
+ args: [{
182
+ isSignal: true,
183
+ alias: "validationState",
184
+ required: false
185
+ }]
186
+ }, {
187
+ type: i0.Output,
188
+ args: ["validationStateChange"]
189
+ }],
190
+ classes: [{
191
+ type: i0.Input,
192
+ args: [{
193
+ isSignal: true,
194
+ alias: "classes",
195
+ required: false
196
+ }]
197
+ }]
198
+ }
199
+ });
200
+ export { UiCheckboxComponent };
201
+
202
+ //# sourceMappingURL=area8975-ui-checkbox.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"area8975-ui-checkbox.mjs","names":[],"sources":["../../../projects/ui/checkbox/checkbox.component.ts","../../../projects/ui/checkbox/checkbox.component.html"],"sourcesContent":["import {\n booleanAttribute,\n Component,\n computed,\n input,\n model\n} from '@angular/core';\n\nimport { InputValidation } from '@area8975/ui/input';\n\n\n@Component({\n selector: 'ui-checkbox',\n templateUrl: './checkbox.component.html',\n styleUrl: './checkbox.component.css',\n // keep id/name off the host, same fix as ui-radio\n host: { '[attr.id]': 'null', '[attr.name]': 'null' }\n})\nexport class UiCheckboxComponent {\n readonly value = model.required<boolean>();\n\n readonly id = input<string>('');\n readonly name = input<string>('');\n\n readonly required = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n\n // shows a dash instead of a tick, purely visual, doesn't change value\n readonly indeterminate = input(false, { transform: booleanAttribute });\n\n /** true/false shows valid/invalid styling. null means not validated yet. */\n readonly validationState = model<InputValidation>(null);\n\n // lets presets like ui-switch restyle the native input\n readonly classes = input<string>('');\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-checkbox',\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n toggle(): void {\n this.value.set(!this.value());\n }\n}\n","<input\n type=\"checkbox\"\n [class]=\"generatedClasses()\"\n [id]=\"id()\"\n [name]=\"name()\"\n [required]=\"required()\"\n [checked]=\"value()\"\n [indeterminate]=\"indeterminate()\"\n [disabled]=\"disabled()\"\n [attr.data-invalid]=\"validationState() === false ? '' : null\"\n [attr.data-valid]=\"validationState() === true ? '' : null\"\n (change)=\"toggle()\"\n/>\n"],"mappings":";;AAkBA,IAAa,sBAAb,MAAa,oBAAmB;CACnB,QAAQ,MAAM,SAAmB,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEjC,KAAK,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,KAAA,CAAA,+BAAA,CAAA,CAAA;CACtB,OAAO,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAExB,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACrD,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGrD,gBAAgB,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,gBAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAG1D,kBAAkB,MAAuB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CAG9C,UAAU,MAAc,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAE3B,mBAAmB,eACxB,CACI,eACA,KAAK,QAAO,CACf,CAAA,CACI,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,GAChB,GAAA,YAAA,CAAA,EAAA,WAAA,mBAAA,CAAA,+BAAA,CAAA,CAAA;CAED,SAAM;EACF,KAAK,MAAM,IAAI,CAAC,KAAK,MAAK,CAAE;CAChC;CA7BS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAmB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAnB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAmB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,IAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,eAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,iBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA;GAAA,OAAA;GAAA,iBAAA;EAAA;EAAA,MAAA,EAAA,YAAA;GAAA,WAAA;GAAA,aAAA;EAAA,EAAA;EAAA,UAAA;EAAA,UClBhC;EAaA,QAAA,CAAA,27GAAA;CAAA,CAAA;;ADKa,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAmB,YAAA,CAAA;EAP/B,MAAA;EACa,MAAA,CAAA;GAAA,UAAA;GAAa,MAIjB;IAAE,aAAa;IAAQ,eAAe;GAAM;GAAE,UAAA;GAAA,QAAA,CAAA,27GAAA;EAAA,CAAA"}