@star-ng/ui 0.0.0-placeholder.0 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +147 -3
  3. package/fesm2022/star-ng-ui-accordion.mjs +376 -0
  4. package/fesm2022/star-ng-ui-accordion.mjs.map +1 -0
  5. package/fesm2022/star-ng-ui-autocomplete.mjs +782 -0
  6. package/fesm2022/star-ng-ui-autocomplete.mjs.map +1 -0
  7. package/fesm2022/star-ng-ui-avatar.mjs +154 -0
  8. package/fesm2022/star-ng-ui-avatar.mjs.map +1 -0
  9. package/fesm2022/star-ng-ui-badge.mjs +153 -0
  10. package/fesm2022/star-ng-ui-badge.mjs.map +1 -0
  11. package/fesm2022/star-ng-ui-breadcrumb.mjs +199 -0
  12. package/fesm2022/star-ng-ui-breadcrumb.mjs.map +1 -0
  13. package/fesm2022/star-ng-ui-button.mjs +282 -0
  14. package/fesm2022/star-ng-ui-button.mjs.map +1 -0
  15. package/fesm2022/star-ng-ui-card.mjs +112 -0
  16. package/fesm2022/star-ng-ui-card.mjs.map +1 -0
  17. package/fesm2022/star-ng-ui-chart.mjs +1904 -0
  18. package/fesm2022/star-ng-ui-chart.mjs.map +1 -0
  19. package/fesm2022/star-ng-ui-checkbox.mjs +345 -0
  20. package/fesm2022/star-ng-ui-checkbox.mjs.map +1 -0
  21. package/fesm2022/star-ng-ui-core.mjs +392 -0
  22. package/fesm2022/star-ng-ui-core.mjs.map +1 -0
  23. package/fesm2022/star-ng-ui-data-display.mjs +1556 -0
  24. package/fesm2022/star-ng-ui-data-display.mjs.map +1 -0
  25. package/fesm2022/star-ng-ui-date-picker.mjs +2786 -0
  26. package/fesm2022/star-ng-ui-date-picker.mjs.map +1 -0
  27. package/fesm2022/star-ng-ui-dialog.mjs +948 -0
  28. package/fesm2022/star-ng-ui-dialog.mjs.map +1 -0
  29. package/fesm2022/star-ng-ui-drawer.mjs +158 -0
  30. package/fesm2022/star-ng-ui-drawer.mjs.map +1 -0
  31. package/fesm2022/star-ng-ui-editor.mjs +416 -0
  32. package/fesm2022/star-ng-ui-editor.mjs.map +1 -0
  33. package/fesm2022/star-ng-ui-field.mjs +378 -0
  34. package/fesm2022/star-ng-ui-field.mjs.map +1 -0
  35. package/fesm2022/star-ng-ui-file-upload.mjs +762 -0
  36. package/fesm2022/star-ng-ui-file-upload.mjs.map +1 -0
  37. package/fesm2022/star-ng-ui-i18n-de.mjs +179 -0
  38. package/fesm2022/star-ng-ui-i18n-de.mjs.map +1 -0
  39. package/fesm2022/star-ng-ui-i18n-es.mjs +179 -0
  40. package/fesm2022/star-ng-ui-i18n-es.mjs.map +1 -0
  41. package/fesm2022/star-ng-ui-input-group.mjs +188 -0
  42. package/fesm2022/star-ng-ui-input-group.mjs.map +1 -0
  43. package/fesm2022/star-ng-ui-input-mask.mjs +434 -0
  44. package/fesm2022/star-ng-ui-input-mask.mjs.map +1 -0
  45. package/fesm2022/star-ng-ui-input-number.mjs +691 -0
  46. package/fesm2022/star-ng-ui-input-number.mjs.map +1 -0
  47. package/fesm2022/star-ng-ui-input-otp.mjs +343 -0
  48. package/fesm2022/star-ng-ui-input-otp.mjs.map +1 -0
  49. package/fesm2022/star-ng-ui-input-tags.mjs +616 -0
  50. package/fesm2022/star-ng-ui-input-tags.mjs.map +1 -0
  51. package/fesm2022/star-ng-ui-knob.mjs +514 -0
  52. package/fesm2022/star-ng-ui-knob.mjs.map +1 -0
  53. package/fesm2022/star-ng-ui-layout.mjs +608 -0
  54. package/fesm2022/star-ng-ui-layout.mjs.map +1 -0
  55. package/fesm2022/star-ng-ui-listbox.mjs +978 -0
  56. package/fesm2022/star-ng-ui-listbox.mjs.map +1 -0
  57. package/fesm2022/star-ng-ui-media.mjs +833 -0
  58. package/fesm2022/star-ng-ui-media.mjs.map +1 -0
  59. package/fesm2022/star-ng-ui-menu.mjs +1840 -0
  60. package/fesm2022/star-ng-ui-menu.mjs.map +1 -0
  61. package/fesm2022/star-ng-ui-message.mjs +191 -0
  62. package/fesm2022/star-ng-ui-message.mjs.map +1 -0
  63. package/fesm2022/star-ng-ui-paginator.mjs +387 -0
  64. package/fesm2022/star-ng-ui-paginator.mjs.map +1 -0
  65. package/fesm2022/star-ng-ui-panel.mjs +324 -0
  66. package/fesm2022/star-ng-ui-panel.mjs.map +1 -0
  67. package/fesm2022/star-ng-ui-password.mjs +517 -0
  68. package/fesm2022/star-ng-ui-password.mjs.map +1 -0
  69. package/fesm2022/star-ng-ui-popover.mjs +241 -0
  70. package/fesm2022/star-ng-ui-popover.mjs.map +1 -0
  71. package/fesm2022/star-ng-ui-progress-bar.mjs +183 -0
  72. package/fesm2022/star-ng-ui-progress-bar.mjs.map +1 -0
  73. package/fesm2022/star-ng-ui-radio.mjs +411 -0
  74. package/fesm2022/star-ng-ui-radio.mjs.map +1 -0
  75. package/fesm2022/star-ng-ui-rating.mjs +211 -0
  76. package/fesm2022/star-ng-ui-rating.mjs.map +1 -0
  77. package/fesm2022/star-ng-ui-select-button.mjs +613 -0
  78. package/fesm2022/star-ng-ui-select-button.mjs.map +1 -0
  79. package/fesm2022/star-ng-ui-select.mjs +2523 -0
  80. package/fesm2022/star-ng-ui-select.mjs.map +1 -0
  81. package/fesm2022/star-ng-ui-skeleton.mjs +160 -0
  82. package/fesm2022/star-ng-ui-skeleton.mjs.map +1 -0
  83. package/fesm2022/star-ng-ui-slider.mjs +552 -0
  84. package/fesm2022/star-ng-ui-slider.mjs.map +1 -0
  85. package/fesm2022/star-ng-ui-spinner.mjs +148 -0
  86. package/fesm2022/star-ng-ui-spinner.mjs.map +1 -0
  87. package/fesm2022/star-ng-ui-stepper.mjs +360 -0
  88. package/fesm2022/star-ng-ui-stepper.mjs.map +1 -0
  89. package/fesm2022/star-ng-ui-table.mjs +3477 -0
  90. package/fesm2022/star-ng-ui-table.mjs.map +1 -0
  91. package/fesm2022/star-ng-ui-tabs.mjs +464 -0
  92. package/fesm2022/star-ng-ui-tabs.mjs.map +1 -0
  93. package/fesm2022/star-ng-ui-tag.mjs +129 -0
  94. package/fesm2022/star-ng-ui-tag.mjs.map +1 -0
  95. package/fesm2022/star-ng-ui-theme-switch.mjs +105 -0
  96. package/fesm2022/star-ng-ui-theme-switch.mjs.map +1 -0
  97. package/fesm2022/star-ng-ui-theme.mjs +98 -0
  98. package/fesm2022/star-ng-ui-theme.mjs.map +1 -0
  99. package/fesm2022/star-ng-ui-toast.mjs +298 -0
  100. package/fesm2022/star-ng-ui-toast.mjs.map +1 -0
  101. package/fesm2022/star-ng-ui-toggle-switch.mjs +316 -0
  102. package/fesm2022/star-ng-ui-toggle-switch.mjs.map +1 -0
  103. package/fesm2022/star-ng-ui-tooltip.mjs +297 -0
  104. package/fesm2022/star-ng-ui-tooltip.mjs.map +1 -0
  105. package/fesm2022/star-ng-ui-transloco.mjs +40 -0
  106. package/fesm2022/star-ng-ui-transloco.mjs.map +1 -0
  107. package/fesm2022/star-ng-ui-tree.mjs +1446 -0
  108. package/fesm2022/star-ng-ui-tree.mjs.map +1 -0
  109. package/fesm2022/star-ng-ui-utility.mjs +2134 -0
  110. package/fesm2022/star-ng-ui-utility.mjs.map +1 -0
  111. package/fesm2022/star-ng-ui.mjs +51 -0
  112. package/package.json +281 -5
  113. package/styles/_base.scss +70 -0
  114. package/styles/_shared.scss +2 -0
  115. package/styles/_tokens.scss +190 -0
  116. package/styles/controls/_accordion.scss +75 -0
  117. package/styles/controls/_autocomplete.scss +44 -0
  118. package/styles/controls/_avatar.scss +39 -0
  119. package/styles/controls/_breadcrumb.scss +45 -0
  120. package/styles/controls/_button.scss +137 -0
  121. package/styles/controls/_card.scss +38 -0
  122. package/styles/controls/_chart.scss +214 -0
  123. package/styles/controls/_chip.scss +51 -0
  124. package/styles/controls/_choice.scss +153 -0
  125. package/styles/controls/_data-display.scss +118 -0
  126. package/styles/controls/_date-picker.scss +300 -0
  127. package/styles/controls/_dialog.scss +123 -0
  128. package/styles/controls/_drawer.scss +118 -0
  129. package/styles/controls/_editor.scss +74 -0
  130. package/styles/controls/_field.scss +92 -0
  131. package/styles/controls/_file-upload.scss +136 -0
  132. package/styles/controls/_input-group.scss +104 -0
  133. package/styles/controls/_input-mask.scss +46 -0
  134. package/styles/controls/_input-number.scss +125 -0
  135. package/styles/controls/_knob.scss +76 -0
  136. package/styles/controls/_layout.scss +182 -0
  137. package/styles/controls/_listbox.scss +38 -0
  138. package/styles/controls/_media.scss +222 -0
  139. package/styles/controls/_menu.scss +254 -0
  140. package/styles/controls/_message.scss +48 -0
  141. package/styles/controls/_org-chart.scss +128 -0
  142. package/styles/controls/_paginator.scss +59 -0
  143. package/styles/controls/_panel.scss +83 -0
  144. package/styles/controls/_popover.scss +40 -0
  145. package/styles/controls/_progress-bar.scss +74 -0
  146. package/styles/controls/_select-button.scss +61 -0
  147. package/styles/controls/_select.scss +216 -0
  148. package/styles/controls/_skeleton.scss +43 -0
  149. package/styles/controls/_slider.scss +163 -0
  150. package/styles/controls/_spinner.scss +34 -0
  151. package/styles/controls/_stepper.scss +109 -0
  152. package/styles/controls/_table.scss +523 -0
  153. package/styles/controls/_tabs.scss +93 -0
  154. package/styles/controls/_tag.scss +84 -0
  155. package/styles/controls/_toast.scss +141 -0
  156. package/styles/controls/_tooltip.scss +14 -0
  157. package/styles/controls/_tree.scss +113 -0
  158. package/styles/controls/_utility.scss +654 -0
  159. package/styles/star-ng.css +5803 -0
  160. package/styles/star-ng.min.css +1 -0
  161. package/styles/star-ng.scss +50 -0
  162. package/theme/star-theme-first-paint.js +1 -0
  163. package/types/star-ng-ui-accordion.d.ts +82 -0
  164. package/types/star-ng-ui-autocomplete.d.ts +171 -0
  165. package/types/star-ng-ui-avatar.d.ts +43 -0
  166. package/types/star-ng-ui-badge.d.ts +46 -0
  167. package/types/star-ng-ui-breadcrumb.d.ts +39 -0
  168. package/types/star-ng-ui-button.d.ts +79 -0
  169. package/types/star-ng-ui-card.d.ts +29 -0
  170. package/types/star-ng-ui-chart.d.ts +337 -0
  171. package/types/star-ng-ui-checkbox.d.ts +92 -0
  172. package/types/star-ng-ui-core.d.ts +310 -0
  173. package/types/star-ng-ui-data-display.d.ts +339 -0
  174. package/types/star-ng-ui-date-picker.d.ts +701 -0
  175. package/types/star-ng-ui-dialog.d.ts +254 -0
  176. package/types/star-ng-ui-drawer.d.ts +29 -0
  177. package/types/star-ng-ui-editor.d.ts +96 -0
  178. package/types/star-ng-ui-field.d.ts +146 -0
  179. package/types/star-ng-ui-file-upload.d.ts +192 -0
  180. package/types/star-ng-ui-i18n-de.d.ts +7 -0
  181. package/types/star-ng-ui-i18n-es.d.ts +7 -0
  182. package/types/star-ng-ui-input-group.d.ts +58 -0
  183. package/types/star-ng-ui-input-mask.d.ts +126 -0
  184. package/types/star-ng-ui-input-number.d.ts +193 -0
  185. package/types/star-ng-ui-input-otp.d.ts +86 -0
  186. package/types/star-ng-ui-input-tags.d.ts +159 -0
  187. package/types/star-ng-ui-knob.d.ts +121 -0
  188. package/types/star-ng-ui-layout.d.ts +154 -0
  189. package/types/star-ng-ui-listbox.d.ts +197 -0
  190. package/types/star-ng-ui-media.d.ts +161 -0
  191. package/types/star-ng-ui-menu.d.ts +332 -0
  192. package/types/star-ng-ui-message.d.ts +52 -0
  193. package/types/star-ng-ui-paginator.d.ts +85 -0
  194. package/types/star-ng-ui-panel.d.ts +65 -0
  195. package/types/star-ng-ui-password.d.ts +129 -0
  196. package/types/star-ng-ui-popover.d.ts +57 -0
  197. package/types/star-ng-ui-progress-bar.d.ts +49 -0
  198. package/types/star-ng-ui-radio.d.ts +116 -0
  199. package/types/star-ng-ui-rating.d.ts +52 -0
  200. package/types/star-ng-ui-select-button.d.ts +169 -0
  201. package/types/star-ng-ui-select.d.ts +540 -0
  202. package/types/star-ng-ui-skeleton.d.ts +47 -0
  203. package/types/star-ng-ui-slider.d.ts +145 -0
  204. package/types/star-ng-ui-spinner.d.ts +29 -0
  205. package/types/star-ng-ui-stepper.d.ts +89 -0
  206. package/types/star-ng-ui-table.d.ts +829 -0
  207. package/types/star-ng-ui-tabs.d.ts +109 -0
  208. package/types/star-ng-ui-tag.d.ts +35 -0
  209. package/types/star-ng-ui-theme-switch.d.ts +36 -0
  210. package/types/star-ng-ui-theme.d.ts +95 -0
  211. package/types/star-ng-ui-toast.d.ts +84 -0
  212. package/types/star-ng-ui-toggle-switch.d.ts +81 -0
  213. package/types/star-ng-ui-tooltip.d.ts +66 -0
  214. package/types/star-ng-ui-transloco.d.ts +14 -0
  215. package/types/star-ng-ui-tree.d.ts +310 -0
  216. package/types/star-ng-ui-utility.d.ts +533 -0
  217. package/types/star-ng-ui.d.ts +51 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"star-ng-ui-chart.mjs","names":[],"sources":["../../../projects/star-ng/chart/chart-geometry.ts","../../../projects/star-ng/chart/chart.ts"],"sourcesContent":["/**\n * Pure geometry of the chart types: tick scales, stacking, angles and radii, SVG path strings,\n * marker shapes and label truncation. These functions have no DOM access, so unit tests can check\n * them without layout. Coordinates in SVG are y-down, and angles run clockwise from the top.\n *\n * Rule for bad numbers: `NaN`, `null`, `undefined`, `Infinity` and anything that is not a number\n * count as missing. Missing values are 0 in stacks, radar and polar area charts. A scatter point\n * with a missing `x` or `y` is dropped. Values larger than 1e300 in size are clamped.\n */\n\nconst LIMIT = 1e300;\nconst TWO_PI = Math.PI * 2;\n\n/** `value` when it is a finite number (clamped to +-1e300), else `fallback`. */\nexport function toFinite(value: unknown, fallback = 0): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) return fallback;\n return Math.max(-LIMIT, Math.min(LIMIT, value));\n}\n\n/** Rounds to a number of decimals that hides binary floating-point noise. */\nfunction clean(value: number, step: number): number {\n const decimals = Math.min(100, Math.max(0, 2 - Math.floor(Math.log10(Math.abs(step) || 1))));\n const rounded = +value.toFixed(decimals);\n return rounded === 0 ? 0 : rounded; // no -0\n}\n\n// ---------- Scales and ticks ----------\n\nexport interface StarChartScale {\n /** First tick, the lower end of the axis. */\n readonly min: number;\n /** Last tick, the upper end of the axis. */\n readonly max: number;\n /** Distance between two ticks. */\n readonly step: number;\n readonly ticks: readonly number[];\n}\n\nexport interface StarChartScaleOptions {\n /** Make the axis contain 0 (bars, stacks, radar, polar area). Scatter axes leave it off. */\n readonly includeZero?: boolean;\n /** Wanted number of intervals between ticks. The default of 4 gives 5 ticks. */\n readonly intervals?: number;\n}\n\n/**\n * Round axis ends and 3 to 6 \"nice\" ticks (1, 2, 2.5, 5 times a power of ten) that contain the\n * range `min` to `max`. A range of one value gets padding, and all zeros give 0 to 1.\n */\nexport function niceScale(\n min: number,\n max: number,\n options: StarChartScaleOptions = {},\n): StarChartScale {\n let lo = toFinite(min);\n let hi = toFinite(max);\n if (lo > hi) [lo, hi] = [hi, lo];\n if (options.includeZero) {\n lo = Math.min(lo, 0);\n hi = Math.max(hi, 0);\n }\n if (lo === hi) {\n if (lo === 0) {\n hi = 1;\n } else {\n const pad = Math.abs(lo) * 0.1;\n lo -= pad;\n hi += pad;\n }\n }\n const intervals = Math.max(1, Math.round(options.intervals ?? 4));\n const rough = (hi - lo) / intervals;\n if (!(rough > 0) || !Number.isFinite(rough)) return fallbackScale(lo, hi);\n const power = 10 ** Math.floor(Math.log10(rough));\n const step = [1, 2, 2.5, 5, 10].map((m) => m * power).find((s) => s >= rough * (1 - 1e-12))!;\n const first = Math.floor(lo / step + 1e-9) * step;\n const last = Math.ceil(hi / step - 1e-9) * step;\n const count = Math.round((last - first) / step);\n if (!Number.isFinite(count) || count < 1 || count > 24) return fallbackScale(lo, hi);\n const ticks = Array.from({ length: count + 1 }, (_, i) => clean(first + i * step, step));\n return { min: ticks[0], max: ticks[count], step, ticks };\n}\n\nfunction fallbackScale(lo: number, hi: number): StarChartScale {\n return { min: lo, max: hi, step: hi - lo, ticks: lo === hi ? [lo] : [lo, hi] };\n}\n\n/** Ticks from 0 to a round maximum, for a chart of non-negative values. */\nexport function niceTicks(max: number): number[] {\n return [...niceScale(0, Math.max(0, toFinite(max)), { includeZero: true }).ticks];\n}\n\n/** Position of `value` on a scale, mapped to `from` (at `min`) and `to` (at `max`). */\nexport function scalePosition(value: number, scale: StarChartScale, from: number, to: number) {\n const span = scale.max - scale.min;\n if (!(span > 0)) return from;\n return from + ((toFinite(value) - scale.min) / span) * (to - from);\n}\n\n/** Smallest number of decimals (0 to 10) that shows every tick exactly. */\nexport function tickDecimals(ticks: readonly number[]): number {\n for (let digits = 0; digits <= 10; digits++) {\n const factor = 10 ** digits;\n if (ticks.every((t) => Math.abs(t * factor - Math.round(t * factor)) < 1e-6)) return digits;\n }\n return 10;\n}\n\n// ---------- Stacking ----------\n\nexport interface StarChartStackSegment {\n readonly series: number;\n /** The real value of the cell. */\n readonly value: number;\n /** Where the segment starts and ends on the axis (percent of the column in percent mode). */\n readonly start: number;\n readonly end: number;\n}\n\nexport interface StarChartStackColumn {\n readonly segments: readonly StarChartStackSegment[];\n /** Sum of the positive values. */\n readonly positive: number;\n /** Sum of the negative values (0 or less). */\n readonly negative: number;\n /** Sum of all values: `positive + negative`. */\n readonly total: number;\n}\n\n/**\n * Stacks the series of every category. Positive values grow up from 0 and negative values grow\n * down from 0, each in series order, so a negative value never hides a positive one. In percent\n * mode every column is scaled so that the sum of the absolute values is 100: a column of only\n * positive values spans 0 to 100, and a column of mixed signs spans -100 to 100 in total.\n * A column of all zeros has no height.\n */\nexport function stackColumns(\n series: readonly ArrayLike<unknown>[],\n categories: number,\n percent = false,\n): StarChartStackColumn[] {\n return Array.from({ length: Math.max(0, categories) }, (_, i) => {\n const values = series.map((s) => toFinite(s[i]));\n const absolute = values.reduce((sum, v) => sum + Math.abs(v), 0);\n const factor = percent ? (absolute > 0 ? 100 / absolute : 0) : 1;\n let up = 0;\n let down = 0;\n const segments = values.map((value, s): StarChartStackSegment => {\n const size = value * factor;\n if (value >= 0) {\n const start = up;\n up += size;\n return { series: s, value, start, end: up };\n }\n const start = down;\n down += size;\n return { series: s, value, start, end: down };\n });\n const positive = values.filter((v) => v > 0).reduce((a, b) => a + b, 0);\n const negative = values.filter((v) => v < 0).reduce((a, b) => a + b, 0);\n return { segments, positive, negative, total: positive + negative };\n });\n}\n\n/** Lowest and highest axis value of the columns, always including 0. */\nexport function stackExtent(columns: readonly StarChartStackColumn[]): {\n min: number;\n max: number;\n} {\n let min = 0;\n let max = 0;\n for (const column of columns) {\n for (const segment of column.segments) {\n min = Math.min(min, segment.start, segment.end);\n max = Math.max(max, segment.start, segment.end);\n }\n }\n return { min, max };\n}\n\n// ---------- Angles, radii and paths ----------\n\n/** Number with at most 2 decimals, for path strings. */\nfunction n(value: number): number {\n return +value.toFixed(2);\n}\n\n/** A point at `radius` and `angle` (radians, 0 = right, clockwise) around a center. */\nexport function polarPoint(\n radius: number,\n angle: number,\n cx = 0,\n cy = 0,\n): { x: number; y: number } {\n return { x: cx + radius * Math.cos(angle), y: cy + radius * Math.sin(angle) };\n}\n\n/** Angles of `count` evenly spaced axes, clockwise from the top. */\nexport function axisAngles(count: number, start = -Math.PI / 2): number[] {\n const total = Math.max(0, Math.floor(count));\n return Array.from({ length: total }, (_, i) => start + (i * TWO_PI) / total);\n}\n\n/** Closed polygon path through the points. */\nexport function polygonPath(points: readonly { x: number; y: number }[]): string {\n if (!points.length) return '';\n return points.map((p, i) => `${i ? 'L' : 'M'}${n(p.x)},${n(p.y)}`).join('') + 'Z';\n}\n\n/** Circle of `radius` around the origin, as a path (two arcs). */\nexport function circlePath(radius: number): string {\n const r = n(Math.max(0, radius));\n return r ? `M${-r},0A${r},${r} 0 1 1 ${r},0A${r},${r} 0 1 1 ${-r},0Z` : '';\n}\n\n/** Ring of a radar chart: a polygon through all axes, or a circle when there are fewer than 3. */\nexport function ringPath(angles: readonly number[], radius: number): string {\n if (!(radius > 0)) return '';\n return angles.length >= 3\n ? polygonPath(angles.map((a) => polarPoint(radius, a)))\n : circlePath(radius);\n}\n\n/**\n * Sector (a wedge, or a ring segment when `inner` is more than 0) around the origin, from angle\n * `a0` clockwise to `a1`. Returns '' when it has no area. A sweep of a full turn gives a disc or\n * an annulus.\n */\nexport function sectorPath(inner: number, outer: number, a0: number, a1: number): string {\n const sweep = a1 - a0;\n const ro = Math.max(0, outer);\n const ri = Math.max(0, Math.min(inner, ro));\n if (!(ro > 0) || !(sweep > 0) || ro === ri) return '';\n if (sweep >= TWO_PI - 1e-6) {\n const disc = `M0,${-n(ro)}A${n(ro)},${n(ro)} 0 1 1 -0.01,${-n(ro)}Z`;\n return ri > 0 ? `${disc}M0,${-n(ri)}A${n(ri)},${n(ri)} 0 1 0 0.01,${-n(ri)}Z` : disc;\n }\n const large = sweep > Math.PI ? 1 : 0;\n const p = (r: number, a: number) => {\n const { x, y } = polarPoint(r, a);\n return `${n(x)},${n(y)}`;\n };\n return ri > 0\n ? `M${p(ro, a0)}A${n(ro)},${n(ro)} 0 ${large} 1 ${p(ro, a1)}L${p(ri, a1)}` +\n `A${n(ri)},${n(ri)} 0 ${large} 0 ${p(ri, a0)}Z`\n : `M0,0L${p(ro, a0)}A${n(ro)},${n(ro)} 0 ${large} 1 ${p(ro, a1)}Z`;\n}\n\n/** Radar radius of `value`: 0 at the low end of the scale and `radius` at the high end. */\nexport function linearRadius(value: number, scale: StarChartScale, radius: number): number {\n const span = scale.max - scale.min;\n if (!(span > 0)) return 0;\n return Math.max(0, Math.min(radius, ((toFinite(value) - scale.min) / span) * radius));\n}\n\n/**\n * Polar area radius of `value`. The area of a sector is proportional to the radius squared, so\n * the radius grows with the square root of the value: a value twice as big has twice the area.\n * Negative and missing values give radius 0.\n */\nexport function areaRadius(value: number, max: number, radius: number): number {\n const v = Math.max(0, toFinite(value));\n if (!(max > 0) || v === 0) return 0;\n return radius * Math.sqrt(Math.min(1, v / max));\n}\n\nexport interface StarChartPolarSector {\n readonly index: number;\n /** The value of the category, negative and missing values read as 0. */\n readonly value: number;\n readonly radius: number;\n readonly start: number;\n readonly end: number;\n /** Angle of the axis through the middle of the sector. */\n readonly mid: number;\n}\n\n/**\n * One sector per category, all with the same angle. Sector `i` is centered on the axis `i`, with\n * the first axis at the top, so a category label can sit on the axis outside the sector.\n */\nexport function polarSectors(\n values: readonly unknown[],\n max: number,\n radius: number,\n): StarChartPolarSector[] {\n const angles = axisAngles(values.length);\n const half = values.length ? Math.PI / values.length : 0;\n return values.map((raw, index) => {\n const value = Math.max(0, toFinite(raw));\n const mid = angles[index];\n return {\n index,\n value,\n radius: areaRadius(value, max, radius),\n start: mid - half,\n end: mid + half,\n mid,\n };\n });\n}\n\n// ---------- Labels ----------\n\n/** Cuts a label to `max` characters with an ellipsis. The caller shows the full text as a title. */\nexport function truncateLabel(label: unknown, max: number): string {\n const chars = Array.from(String(label ?? ''));\n const limit = Math.floor(max);\n if (chars.length <= limit) return chars.join('');\n if (limit < 1) return '';\n return (\n chars\n .slice(0, limit - 1)\n .join('')\n .trimEnd() + '…'\n );\n}\n\n/** Text anchor of a label at `angle` around a center: left side ends at the point, right starts. */\nexport function labelAnchor(angle: number): 'start' | 'middle' | 'end' {\n const cos = Math.cos(angle);\n return cos > 0.3 ? 'start' : cos < -0.3 ? 'end' : 'middle';\n}\n\n/** Vertical offset (`dy`) of a label at `angle`: labels above the center rise, below hang. */\nexport function labelOffset(angle: number): string {\n const sin = Math.sin(angle);\n return sin < -0.3 ? '0' : sin > 0.3 ? '0.9em' : '0.35em';\n}\n\n// ---------- Scatter ----------\n\nexport interface StarChartCleanPoint {\n readonly x: number;\n readonly y: number;\n /** Position of the point in the series data. */\n readonly index: number;\n}\n\n/** Points with a finite `x` and `y`. Others are dropped. The `index` keeps the source position. */\nexport function cleanPoints(\n points: readonly ({ x: unknown; y: unknown } | null | undefined)[],\n): StarChartCleanPoint[] {\n const result: StarChartCleanPoint[] = [];\n points.forEach((point, index) => {\n if (!point) return;\n const { x, y } = point;\n if (\n typeof x === 'number' &&\n Number.isFinite(x) &&\n typeof y === 'number' &&\n Number.isFinite(y)\n ) {\n result.push({ x: toFinite(x), y: toFinite(y), index });\n }\n });\n return result;\n}\n\n/** Nice scales for both axes of a scatter chart. Without points both go from 0 to 1. */\nexport function scatterScales(points: readonly { x: number; y: number }[]): {\n x: StarChartScale;\n y: StarChartScale;\n} {\n if (!points.length) return { x: niceScale(0, 1), y: niceScale(0, 1) };\n const xs = points.map((p) => p.x);\n const ys = points.map((p) => p.y);\n return {\n x: niceScale(Math.min(...xs), Math.max(...xs)),\n y: niceScale(Math.min(...ys), Math.max(...ys)),\n };\n}\n\n// ---------- Marker shapes ----------\n\nexport const STAR_CHART_MARKERS = 8;\n\n/**\n * Outline of the marker shape of series `index` (circle, square, diamond, triangle, inverted\n * triangle, plus, cross, pentagon), about the area of a circle of `radius`, around (cx, cy).\n * The shape repeats the series color, so series stay apart where two colors are close.\n */\nexport function markerPath(index: number, cx: number, cy: number, radius: number): string {\n const r = Math.max(0, radius);\n const at = (dx: number, dy: number) => ({ x: cx + dx * r, y: cy + dy * r });\n switch (((Math.floor(index) % STAR_CHART_MARKERS) + STAR_CHART_MARKERS) % STAR_CHART_MARKERS) {\n case 0:\n return `M${n(cx - r)},${n(cy)}A${n(r)},${n(r)} 0 1 0 ${n(cx + r)},${n(cy)}A${n(r)},${n(r)} 0 1 0 ${n(cx - r)},${n(cy)}Z`;\n case 1:\n return polygonPath([at(-0.88, -0.88), at(0.88, -0.88), at(0.88, 0.88), at(-0.88, 0.88)]);\n case 2:\n return polygonPath([at(0, -1.25), at(1.25, 0), at(0, 1.25), at(-1.25, 0)]);\n case 3:\n return polygonPath([at(0, -1.2), at(1.1, 0.85), at(-1.1, 0.85)]);\n case 4:\n return polygonPath([at(0, 1.2), at(1.1, -0.85), at(-1.1, -0.85)]);\n case 5:\n return polygonPath(plus(at, 0));\n case 6:\n return polygonPath(plus(at, Math.PI / 4));\n default:\n return polygonPath(axisAngles(5).map((a) => polarPoint(1.15 * r, a, cx, cy)));\n }\n}\n\n/** A filled plus sign with arms of half length 1.2 and half width 0.4, turned by `turn`. */\nfunction plus(at: (dx: number, dy: number) => { x: number; y: number }, turn: number) {\n const a = 1.2;\n const b = 0.4;\n const outline: [number, number][] = [\n [-b, -a],\n [b, -a],\n [b, -b],\n [a, -b],\n [a, b],\n [b, b],\n [b, a],\n [-b, a],\n [-b, b],\n [-a, b],\n [-a, -b],\n [-b, -b],\n ];\n const cos = Math.cos(turn);\n const sin = Math.sin(turn);\n return outline.map(([x, y]) => at(x * cos - y * sin, x * sin + y * cos));\n}\n","import { _IdGenerator } from '@angular/cdk/a11y';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n linkedSignal,\n signal,\n} from '@angular/core';\nimport { STAR_UI_TEXT } from '@star-ng/ui/core';\nimport {\n areaRadius,\n axisAngles,\n cleanPoints,\n labelAnchor,\n labelOffset,\n linearRadius,\n markerPath,\n niceScale,\n polarPoint,\n polarSectors,\n polygonPath,\n ringPath,\n scalePosition,\n scatterScales,\n sectorPath,\n stackColumns,\n stackExtent,\n StarChartScale,\n StarChartStackSegment,\n tickDecimals,\n toFinite,\n truncateLabel,\n} from './chart-geometry';\n\nexport interface StarChartSeries {\n readonly label: string;\n readonly data: readonly number[];\n}\n\n/** One point of a scatter series. */\nexport interface StarChartPoint {\n readonly x: number;\n readonly y: number;\n}\n\n/**\n * A scatter series: points with an x and a y value. Points with a missing or not finite `x` or\n * `y` are left out of the plot and the table.\n */\nexport interface StarChartPointSeries {\n readonly label: string;\n readonly data: readonly StarChartPoint[];\n}\n\nexport type StarChartType =\n 'bar' | 'stacked-bar' | 'line' | 'area' | 'doughnut' | 'pie' | 'radar' | 'polar-area' | 'scatter';\n\n/**\n * Categorical slots, in fixed order (never cycled). Validated with the dataviz palette checks:\n * light on #ffffff and dark on #0f1216 pass lightness, chroma, CVD (adjacent ΔE ≥ 8.4) and\n * normal-vision floors. Slots 3–5 are below 3:1 on white, so every chart ships a table view.\n * Defined as design tokens `--star-chart-1…8` in `styles/_tokens.scss`.\n */\nexport const STAR_CHART_SLOTS = 8;\n/** Doughnut slices compare every pair: the first 4 slots pass all-pairs; the rest fold into \"Other\". */\nconst DOUGHNUT_SLOTS = 4;\n\nconst W = 640;\nconst H = 280;\nconst PAD = { top: 16, right: 16, bottom: 36, left: 48 };\n/** Scatter has axis titles, so it keeps more room at the left, top and bottom. */\nconst SCATTER_PAD = { top: 24, right: 20, bottom: 44, left: 56 };\n/** Radar and polar area use a squarer view box than the axis charts: the plot is a circle. */\nconst RADIAL_W = 520;\nconst RADIAL_H = 300;\n/** Radius of the radar and polar area plots, and the room for the labels around them. */\nconst RADIAL = 105;\nconst RADIAL_LABEL_GAP = 12;\n/** Longest category label at a radar or polar axis, in characters, before it is cut. */\nconst RADIAL_LABEL_CHARS = 18;\nconst MARKER_RADIUS = 5;\n\n/** The number of an element of a series: a plain value, or the y of a point. */\nfunction valueOf(element: number | StarChartPoint): number {\n return element !== null && typeof element === 'object' ? element.y : element;\n}\n\nfunction extentOf(values: readonly number[]): { min: number; max: number } {\n let min = Infinity;\n let max = -Infinity;\n for (const raw of values) {\n const v = toFinite(raw, NaN);\n if (v < min) min = v;\n if (v > max) max = v;\n }\n return min <= max ? { min, max } : { min: 0, max: 0 };\n}\n\n/**\n * Chart (PrimeNG `p-chart` without Chart.js): dependency-free SVG bar, stacked bar, line, area,\n * doughnut, pie, radar, polar area and scatter charts.\n * One y-axis, recessive grid, 2px lines, 4px rounded bar ends on the baseline, 2px surface gaps,\n * legend for 2+ series, hover tooltip per mark (crosshair on line), and a data table (visible on\n * demand, always present for screen readers). Colors are fixed series slots in both themes.\n *\n * ```html\n * <star-chart type=\"bar\" title=\"Orders per month\" [labels]=\"months\" [series]=\"volume\" />\n * ```\n */\n@Component({\n selector: 'star-chart',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'star-chart' },\n template: `\n <figure\n class=\"star-chart__figure\"\n [attr.aria-labelledby]=\"titleId\"\n [attr.aria-describedby]=\"descriptionId\"\n >\n <figcaption class=\"star-chart__head\">\n <span class=\"star-chart__title\" [id]=\"titleId\">{{ title() }}</span>\n <button\n type=\"button\"\n class=\"star-btn star-btn--ghost star-btn--sm\"\n [attr.aria-pressed]=\"showTable()\"\n (click)=\"showTable.set(!showTable())\"\n >\n <i\n class=\"ph-bold\"\n [class.ph-table]=\"!showTable()\"\n [class.ph-chart-bar]=\"showTable()\"\n aria-hidden=\"true\"\n ></i>\n {{ showTable() ? text.chartView : text.tableView }}\n </button>\n </figcaption>\n <p class=\"star-sr-only\" [id]=\"descriptionId\">{{ description() }}</p>\n\n @if (legend().length > 1 && !showTable()) {\n <ul class=\"star-chart__legend\" aria-hidden=\"true\">\n @for (item of legend(); track item.label) {\n <li>\n @if (item.shape) {\n <svg class=\"star-chart__swatch-shape\" viewBox=\"-6 -6 12 12\">\n <path\n class=\"star-chart__mark star-chart__marker\"\n [attr.d]=\"item.shape\"\n [style.--mark]=\"item.color\"\n />\n </svg>\n } @else {\n <span class=\"star-chart__swatch\" [style.background]=\"item.color\"></span>\n }\n {{ item.label }}\n </li>\n }\n </ul>\n }\n\n <div\n class=\"star-chart__plot\"\n [hidden]=\"showTable()\"\n aria-hidden=\"true\"\n (mouseleave)=\"hover.set(null)\"\n >\n @switch (kind()) {\n @case ('round') {\n <svg [attr.viewBox]=\"'0 0 ' + W + ' ' + H\" class=\"star-chart__svg\">\n <g [attr.transform]=\"'translate(' + W / 2 + ',' + H / 2 + ')'\">\n @for (slice of slices(); track slice.label; let i = $index) {\n <path\n class=\"star-chart__slice\"\n [attr.d]=\"slice.path\"\n [style.fill]=\"slice.color\"\n [class.star-chart__mark--dim]=\"hover() !== null && hover() !== i\"\n (mouseenter)=\"hover.set(i)\"\n />\n }\n @if (type() === 'doughnut') {\n <text class=\"star-chart__total\" y=\"-2\" text-anchor=\"middle\">\n {{ format(total()) }}\n </text>\n <text class=\"star-chart__total-label\" y=\"18\" text-anchor=\"middle\">\n {{ text.chartTotal }}\n </text>\n }\n </g>\n </svg>\n @if (hover() !== null) {\n @let slice = slices()[hover()!];\n @if (slice) {\n <div class=\"star-chart__tip\" [style.left.%]=\"50\" [style.top.%]=\"8\">\n <span class=\"star-chart__swatch\" [style.background]=\"slice.color\"></span>\n {{ slice.label }}: <strong>{{ format(slice.value) }}</strong> ({{\n slice.percent\n }}%)\n </div>\n }\n }\n }\n @case ('radar') {\n @let plot = radar();\n <svg [attr.viewBox]=\"'0 0 ' + RW + ' ' + RH\" class=\"star-chart__svg\">\n <g [attr.transform]=\"'translate(' + RW / 2 + ',' + RH / 2 + ')'\">\n @for (ring of plot.rings; track ring.value) {\n <path class=\"star-chart__ring\" [attr.d]=\"ring.path\" />\n }\n @for (spoke of plot.spokes; track $index) {\n <line\n class=\"star-chart__grid\"\n x1=\"0\"\n y1=\"0\"\n [attr.x2]=\"spoke.x\"\n [attr.y2]=\"spoke.y\"\n />\n }\n @if (hover() !== null && plot.spokes[hover()!]) {\n <line\n class=\"star-chart__crosshair\"\n x1=\"0\"\n y1=\"0\"\n [attr.x2]=\"plot.spokes[hover()!].x\"\n [attr.y2]=\"plot.spokes[hover()!].y\"\n />\n }\n @for (polygon of plot.polygons; track polygon.label) {\n <path\n class=\"star-chart__mark star-chart__polygon\"\n [attr.d]=\"polygon.path\"\n [style.--mark]=\"polygon.color\"\n />\n }\n @for (polygon of plot.polygons; track polygon.label) {\n @for (vertex of polygon.vertices; track vertex.index) {\n <path\n class=\"star-chart__mark star-chart__vertex\"\n [attr.d]=\"vertex.shape\"\n [style.--mark]=\"polygon.color\"\n />\n }\n }\n @for (ring of plot.rings; track ring.value) {\n <text\n class=\"star-chart__ring-label\"\n [attr.x]=\"4\"\n [attr.y]=\"-ring.radius + 11\"\n text-anchor=\"start\"\n >\n {{ ring.text }}\n </text>\n }\n @for (label of plot.labels; track $index) {\n <text\n class=\"star-chart__axis\"\n [attr.x]=\"label.x\"\n [attr.y]=\"label.y\"\n [attr.dy]=\"label.dy\"\n [attr.text-anchor]=\"label.anchor\"\n >\n {{ label.text }}\n @if (label.text !== label.full) {\n <title>{{ label.full }}</title>\n }\n </text>\n }\n @for (hit of plot.hits; track $index; let i = $index) {\n <path class=\"star-chart__hit\" [attr.d]=\"hit\" (mouseenter)=\"hover.set(i)\" />\n }\n </g>\n </svg>\n @if (hover() !== null && labels()[hover()!] !== undefined) {\n <div class=\"star-chart__tip star-chart__tip--corner\">\n <span class=\"star-chart__tip-title\">{{ labels()[hover()!] }}</span>\n @for (s of drawn(); track s.label; let si = $index) {\n <span class=\"star-chart__tip-row\">\n <span class=\"star-chart__swatch\" [style.background]=\"color(si)\"></span>\n {{ s.label }}: <strong>{{ cell(s, hover()!) }}</strong>\n </span>\n }\n </div>\n }\n }\n @case ('polar') {\n @let plot = polar();\n <svg [attr.viewBox]=\"'0 0 ' + RW + ' ' + RH\" class=\"star-chart__svg\">\n <g [attr.transform]=\"'translate(' + RW / 2 + ',' + RH / 2 + ')'\">\n @for (ring of plot.rings; track ring.value) {\n <circle class=\"star-chart__ring\" [attr.r]=\"ring.radius\" />\n }\n @for (sector of plot.sectors; track sector.index) {\n @if (sector.path) {\n <path\n class=\"star-chart__mark star-chart__sector\"\n [attr.d]=\"sector.path\"\n [style.--mark]=\"color(0)\"\n [class.star-chart__mark--dim]=\"hover() !== null && hover() !== sector.index\"\n />\n }\n }\n @for (ring of plot.rings; track ring.value) {\n <text\n class=\"star-chart__ring-label\"\n [attr.x]=\"ring.x\"\n [attr.y]=\"ring.y\"\n text-anchor=\"start\"\n >\n {{ ring.text }}\n </text>\n }\n @for (sector of plot.sectors; track sector.index) {\n <text\n class=\"star-chart__axis\"\n [attr.x]=\"sector.label.x\"\n [attr.y]=\"sector.label.y\"\n [attr.dy]=\"sector.label.dy\"\n [attr.text-anchor]=\"sector.label.anchor\"\n >\n {{ sector.label.text }}\n @if (sector.label.text !== sector.label.full) {\n <title>{{ sector.label.full }}</title>\n }\n </text>\n }\n @for (sector of plot.sectors; track sector.index) {\n <path\n class=\"star-chart__hit\"\n [attr.d]=\"sector.hit\"\n (mouseenter)=\"hover.set(sector.index)\"\n />\n }\n </g>\n </svg>\n @if (hover() !== null) {\n @let sector = plot.sectors[hover()!];\n @if (sector) {\n <div class=\"star-chart__tip star-chart__tip--corner\">\n <span class=\"star-chart__tip-title\">{{ sector.label.full }}</span>\n <span class=\"star-chart__tip-row\">\n <span class=\"star-chart__swatch\" [style.background]=\"color(0)\"></span>\n {{ valueName() }}: <strong>{{ format(sector.value) }}</strong>\n </span>\n </div>\n }\n }\n }\n @case ('scatter') {\n @let plot = scatter();\n <svg [attr.viewBox]=\"'0 0 ' + W + ' ' + H\" class=\"star-chart__svg\">\n @for (tick of plot.yTicks; track tick.value) {\n <line\n class=\"star-chart__grid\"\n [attr.x1]=\"SP.left\"\n [attr.x2]=\"W - SP.right\"\n [attr.y1]=\"tick.position\"\n [attr.y2]=\"tick.position\"\n />\n <text\n class=\"star-chart__axis\"\n [attr.x]=\"SP.left - 8\"\n [attr.y]=\"tick.position + 4\"\n text-anchor=\"end\"\n >\n {{ tick.text }}\n </text>\n }\n @for (tick of plot.xTicks; track tick.value) {\n <line\n class=\"star-chart__grid\"\n [attr.x1]=\"tick.position\"\n [attr.x2]=\"tick.position\"\n [attr.y1]=\"SP.top\"\n [attr.y2]=\"H - SP.bottom\"\n />\n <text\n class=\"star-chart__axis\"\n [attr.x]=\"tick.position\"\n [attr.y]=\"H - SP.bottom + 16\"\n text-anchor=\"middle\"\n >\n {{ tick.text }}\n </text>\n }\n @if (categoryLabel()) {\n <text\n class=\"star-chart__axis-title\"\n [attr.x]=\"W - SP.right\"\n [attr.y]=\"H - 4\"\n text-anchor=\"end\"\n >\n {{ categoryLabel() }}\n </text>\n }\n @if (valueLabel()) {\n <text class=\"star-chart__axis-title\" x=\"4\" y=\"12\" text-anchor=\"start\">\n {{ valueLabel() }}\n </text>\n }\n @for (point of plot.points; track point.index) {\n <path\n class=\"star-chart__mark star-chart__point\"\n [attr.d]=\"point.shape\"\n [style.--mark]=\"point.color\"\n [class.star-chart__mark--dim]=\"hover() !== null && hover() !== point.index\"\n />\n }\n @for (point of plot.points; track point.index) {\n <circle\n class=\"star-chart__hit\"\n r=\"10\"\n [attr.cx]=\"point.px\"\n [attr.cy]=\"point.py\"\n (mouseenter)=\"hover.set(point.index)\"\n />\n }\n </svg>\n @if (hover() !== null) {\n @let point = plot.points[hover()!];\n @if (point) {\n <div\n class=\"star-chart__tip star-chart__tip--point\"\n [style.left.%]=\"(point.px / W) * 100\"\n [style.top.%]=\"(point.py / H) * 100\"\n [style.translate]=\"\n point.px / W > 0.7 ? '-100% 0' : point.px / W < 0.3 ? '0 0' : null\n \"\n >\n <span class=\"star-chart__tip-title\">{{ point.seriesLabel }}</span>\n <span class=\"star-chart__tip-row\">\n <svg class=\"star-chart__swatch-shape\" viewBox=\"-6 -6 12 12\">\n <path\n class=\"star-chart__mark star-chart__marker\"\n [attr.d]=\"point.legendShape\"\n [style.--mark]=\"point.color\"\n />\n </svg>\n {{ xName() }}: <strong>{{ precise(point.x) }}</strong>\n </span>\n <span class=\"star-chart__tip-row star-chart__tip-indent\">\n {{ yName() }}: <strong>{{ precise(point.y) }}</strong>\n </span>\n </div>\n }\n }\n }\n @default {\n <svg [attr.viewBox]=\"'0 0 ' + W + ' ' + H\" class=\"star-chart__svg\">\n @for (tick of ticks(); track tick) {\n <line\n class=\"star-chart__grid\"\n [attr.x1]=\"PAD.left\"\n [attr.x2]=\"W - PAD.right\"\n [attr.y1]=\"y(tick)\"\n [attr.y2]=\"y(tick)\"\n />\n <text\n class=\"star-chart__axis\"\n [attr.x]=\"PAD.left - 8\"\n [attr.y]=\"y(tick) + 4\"\n text-anchor=\"end\"\n >\n {{ yTick()(tick) }}\n </text>\n }\n @if (yScale().min < 0) {\n <line\n class=\"star-chart__baseline\"\n [attr.x1]=\"PAD.left\"\n [attr.x2]=\"W - PAD.right\"\n [attr.y1]=\"y(0)\"\n [attr.y2]=\"y(0)\"\n />\n }\n @for (label of axisLabels(); track $index; let i = $index) {\n <text\n class=\"star-chart__axis\"\n [attr.x]=\"x(i)\"\n [attr.y]=\"H - 12\"\n text-anchor=\"middle\"\n >\n {{ label.text }}\n @if (label.text !== label.full) {\n <title>{{ label.full }}</title>\n }\n </text>\n }\n @if (type() === 'bar') {\n @for (bar of bars(); track bar.key) {\n <path\n class=\"star-chart__bar\"\n [attr.d]=\"bar.path\"\n [style.fill]=\"bar.color\"\n [class.star-chart__mark--dim]=\"hover() !== null && hover() !== bar.index\"\n />\n }\n } @else if (type() === 'stacked-bar') {\n @for (segment of segments(); track segment.key) {\n <rect\n class=\"star-chart__mark star-chart__segment\"\n [attr.x]=\"segment.x\"\n [attr.y]=\"segment.y\"\n [attr.width]=\"segment.width\"\n [attr.height]=\"segment.height\"\n [style.--mark]=\"segment.color\"\n [class.star-chart__mark--dim]=\"hover() !== null && hover() !== segment.index\"\n />\n }\n } @else {\n @if (hover() !== null) {\n <line\n class=\"star-chart__crosshair\"\n [attr.x1]=\"x(hover()!)\"\n [attr.x2]=\"x(hover()!)\"\n [attr.y1]=\"PAD.top\"\n [attr.y2]=\"H - PAD.bottom\"\n />\n }\n @for (line of lines(); track line.label) {\n @if (type() === 'area') {\n <path class=\"star-chart__area\" [attr.d]=\"line.area\" [style.fill]=\"line.color\" />\n }\n <path class=\"star-chart__line\" [attr.d]=\"line.path\" [style.stroke]=\"line.color\" />\n @if (hover() !== null) {\n <circle\n class=\"star-chart__dot\"\n r=\"4.5\"\n [attr.cx]=\"x(hover()!)\"\n [attr.cy]=\"y(line.data[hover()!] ?? 0)\"\n [style.fill]=\"line.color\"\n />\n }\n }\n }\n <!-- Hit targets: one full-height column per category, wider than the marks. -->\n @for (label of labels(); track $index; let i = $index) {\n <rect\n class=\"star-chart__hit\"\n [attr.x]=\"x(i) - band() / 2\"\n [attr.y]=\"PAD.top\"\n [attr.width]=\"band()\"\n [attr.height]=\"H - PAD.top - PAD.bottom\"\n (mouseenter)=\"hover.set(i)\"\n />\n }\n </svg>\n @if (hover() !== null) {\n <div\n class=\"star-chart__tip\"\n [style.left.%]=\"(x(hover()!) / W) * 100\"\n [style.top.%]=\"6\"\n >\n <span class=\"star-chart__tip-title\">{{ labels()[hover()!] }}</span>\n @for (s of drawn(); track s.label; let si = $index) {\n <span class=\"star-chart__tip-row\">\n <span class=\"star-chart__swatch\" [style.background]=\"color(si)\"></span>\n {{ s.label }}: <strong>{{ cell(s, hover()!) }}</strong>\n @if (type() === 'stacked-bar' && percent()) {\n ({{ share(stack()[hover()!]?.segments?.[si]) }}%)\n }\n </span>\n }\n @if (type() === 'stacked-bar') {\n <span class=\"star-chart__tip-row star-chart__tip-total\">\n {{ text.chartTotal }}:\n <strong>{{ format(stack()[hover()!]?.total ?? 0) }}</strong>\n </span>\n }\n </div>\n }\n }\n }\n </div>\n\n <table class=\"star-chart__table\" [class.star-sr-only]=\"!showTable()\">\n <caption class=\"star-sr-only\">\n {{\n title()\n }}\n </caption>\n <thead>\n <tr>\n <th scope=\"col\">\n {{ firstHeader() }}\n </th>\n @if (round()) {\n <th scope=\"col\">{{ series()[0]?.label ?? text.chartValue }}</th>\n <th scope=\"col\">{{ text.chartShare }}</th>\n } @else if (kind() === 'polar') {\n <th scope=\"col\">{{ valueName() }}</th>\n } @else if (kind() === 'scatter') {\n <th scope=\"col\">{{ xName() }}</th>\n <th scope=\"col\">{{ yName() }}</th>\n } @else {\n @for (s of series(); track s.label) {\n <th scope=\"col\">{{ s.label }}</th>\n }\n @if (type() === 'stacked-bar') {\n <th scope=\"col\">{{ text.chartTotal }}</th>\n }\n }\n </tr>\n </thead>\n <tbody>\n @if (round()) {\n @for (slice of slices(); track slice.label) {\n <tr>\n <th scope=\"row\">{{ slice.label }}</th>\n <td>{{ format(slice.value) }}</td>\n <td>{{ slice.percent }}%</td>\n </tr>\n }\n } @else if (kind() === 'polar') {\n @for (label of labels(); track $index; let i = $index) {\n <tr>\n <th scope=\"row\">{{ label }}</th>\n <td>{{ cell(numeric()[0], i) }}</td>\n </tr>\n }\n } @else if (kind() === 'scatter') {\n @for (row of scatterRows(); track $index) {\n <tr>\n <th scope=\"row\">{{ row.series }}</th>\n <td>{{ precise(row.x) }}</td>\n <td>{{ precise(row.y) }}</td>\n </tr>\n }\n } @else {\n @for (label of labels(); track $index; let i = $index) {\n <tr>\n <th scope=\"row\">{{ label }}</th>\n @for (s of numeric(); track s.label) {\n <td>{{ cell(s, i) }}</td>\n }\n @if (type() === 'stacked-bar') {\n <td>{{ format(stack()[i]?.total ?? 0) }}</td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n </figure>\n `,\n})\nexport class StarChart {\n protected readonly text = inject(STAR_UI_TEXT);\n protected readonly W = W;\n protected readonly H = H;\n protected readonly RW = RADIAL_W;\n protected readonly RH = RADIAL_H;\n protected readonly PAD = PAD;\n protected readonly SP = SCATTER_PAD;\n private readonly ids = inject(_IdGenerator);\n protected readonly titleId = this.ids.getId('star-chart-');\n protected readonly descriptionId = this.ids.getId('star-chart-description-');\n\n /**\n * `'area'` is a line chart with a soft fill under each line. `'pie'` is a doughnut without\n * the hole and the total; like the doughnut it shows the top 3 categories and \"Other\".\n * `'stacked-bar'` stacks the series of a category in one column. `'radar'` draws one polygon per\n * series over one axis per category. `'polar-area'` draws one sector per category of the first\n * series, with the area of the sector in proportion to the value. `'scatter'` plots points from\n * `{ x, y }` data on two numeric axes.\n */\n readonly type = input<StarChartType>('bar');\n /**\n * Stacked bar only: scale every column to 100 percent, to compare the shares of the series\n * instead of the totals. The tooltip still shows the real values.\n */\n readonly percent = input(false, { transform: booleanAttribute });\n /** Doughnut or pie: one series as parts of a whole. */\n protected readonly round = computed(() => this.type() === 'doughnut' || this.type() === 'pie');\n protected readonly kind = computed<'round' | 'radar' | 'polar' | 'scatter' | 'axis'>(() => {\n switch (this.type()) {\n case 'doughnut':\n case 'pie':\n return 'round';\n case 'radar':\n return 'radar';\n case 'polar-area':\n return 'polar';\n case 'scatter':\n return 'scatter';\n default:\n return 'axis';\n }\n });\n readonly title = input.required<string>();\n /** Category labels (x axis, or doughnut slices). */\n readonly labels = input<readonly string[]>([]);\n /**\n * One or more series. Doughnut, pie and polar area use the first series only. More than 8\n * series are cut. Scatter takes `{ x, y }` points in `data`: plain numbers there are y values\n * with the position in the series as x.\n */\n readonly series = input<readonly (StarChartSeries | StarChartPointSeries)[]>([]);\n /** Name of the category column of the table. Scatter: name of the x axis and column. */\n readonly categoryLabel = input<string | null>(null);\n /** Scatter and polar area: name of the y axis and column, or of the value column. */\n readonly valueLabel = input<string | null>(null);\n readonly locale = input<string | undefined>(undefined);\n /** Start the table view open. */\n readonly table = input(false, { transform: booleanAttribute });\n\n protected readonly showTable = linkedSignal(() => this.table());\n protected readonly hover = signal<number | null>(null);\n\n private readonly numberFormat = computed(\n () => new Intl.NumberFormat(this.locale(), { maximumFractionDigits: 1 }),\n );\n private readonly preciseFormat = computed(\n () => new Intl.NumberFormat(this.locale(), { maximumFractionDigits: 3 }),\n );\n protected format(value: number): string {\n return this.numberFormat().format(value);\n }\n /** Up to 3 decimals: scatter values are measurements, not counts. */\n protected precise(value: number): string {\n return this.preciseFormat().format(value);\n }\n\n /** Axis tick text: just enough decimals to show every tick exactly. */\n private tickFormatter(ticks: readonly number[], suffix = ''): (value: number) => string {\n const digits = tickDecimals(ticks);\n const formatter = new Intl.NumberFormat(this.locale(), { maximumFractionDigits: digits });\n return (value) => formatter.format(value) + suffix;\n }\n\n protected color(index: number): string {\n return `var(--star-chart-${(index % STAR_CHART_SLOTS) + 1})`;\n }\n\n /** The series as numbers: a point of a scatter series counts as its y value. */\n protected readonly numeric = computed<readonly StarChartSeries[]>(() =>\n this.series().map((s) => ({\n label: s.label,\n data: (s.data as readonly (number | StarChartPoint)[]).map(valueOf),\n })),\n );\n /** The series that are drawn: the first 8. */\n protected readonly drawn = computed(() => this.numeric().slice(0, STAR_CHART_SLOTS));\n\n /** Table cell of a series at a category: a missing value reads as 0. */\n protected cell(series: StarChartSeries | undefined, index: number): string {\n return this.format(toFinite(series?.data[index]));\n }\n\n protected readonly firstHeader = computed(() =>\n this.round()\n ? this.text.chartCategory\n : this.kind() === 'scatter'\n ? this.text.chartSeries\n : (this.categoryLabel() ?? this.text.chartCategory),\n );\n protected readonly xName = computed(() => this.categoryLabel() ?? this.text.chartX);\n protected readonly yName = computed(() => this.valueLabel() ?? this.text.chartY);\n protected readonly valueName = computed(\n () => this.valueLabel() ?? this.series()[0]?.label ?? this.text.chartValue,\n );\n\n protected readonly legend = computed(() => {\n if (this.round())\n return this.slices().map((s) => ({ label: s.label, color: s.color, shape: '' }));\n // Polar area has one color: the categories are named at the axis, not in a legend.\n if (this.kind() === 'polar') return [];\n const marked = this.kind() === 'radar' || this.kind() === 'scatter';\n return this.drawn().map((s, i) => ({\n label: s.label,\n color: this.color(i),\n shape: marked ? markerPath(i, 0, 0, MARKER_RADIUS) : '',\n }));\n });\n\n /** Text of the accessible description: the kind of chart, its size and the range of values. */\n protected readonly description = computed(() => {\n const kind = this.kind();\n const kinds: Record<StarChartType, string> = {\n bar: this.text.chartTypeBar,\n 'stacked-bar': this.text.chartTypeStackedBar,\n line: this.text.chartTypeLine,\n area: this.text.chartTypeArea,\n doughnut: this.text.chartTypeDoughnut,\n pie: this.text.chartTypePie,\n radar: this.text.chartTypeRadar,\n 'polar-area': this.text.chartTypePolarArea,\n scatter: this.text.chartTypeScatter,\n };\n let seriesCount = this.drawn().length;\n let items = this.labels().length;\n let values: readonly number[];\n if (kind === 'scatter') {\n const points = this.scatterRows();\n items = points.length;\n values = points.map((p) => p.y);\n } else if (kind === 'round' || kind === 'polar') {\n seriesCount = Math.min(1, seriesCount);\n values = this.numeric()[0]?.data ?? [];\n } else {\n values = this.drawn().flatMap((s) => s.data);\n }\n const { min, max } = extentOf(values);\n return this.text.chartDescription(\n kinds[this.type()],\n seriesCount,\n items,\n this.format(min),\n this.format(max),\n );\n });\n\n // ---------- Axis charts: bar, stacked bar, line, area ----------\n\n protected readonly stack = computed(() =>\n stackColumns(\n this.drawn().map((s) => s.data),\n this.labels().length,\n this.percent(),\n ),\n );\n protected readonly yScale = computed<StarChartScale>(() => {\n if (this.type() === 'stacked-bar') {\n const { min, max } = stackExtent(this.stack());\n return niceScale(min, max, { includeZero: true });\n }\n return niceScale(0, extentOf(this.numeric().flatMap((s) => s.data)).max, {\n includeZero: true,\n });\n });\n protected readonly ticks = computed(() => this.yScale().ticks);\n protected readonly yTick = computed(() =>\n this.tickFormatter(this.ticks(), this.type() === 'stacked-bar' && this.percent() ? '%' : ''),\n );\n protected readonly band = computed(\n () => (W - PAD.left - PAD.right) / Math.max(1, this.labels().length),\n );\n /** Category labels cut to the width of their column, with the full text as a title. */\n protected readonly axisLabels = computed(() => {\n const max = Math.max(3, Math.floor(this.band() / 6.5));\n return this.labels().map((label) => ({ text: truncateLabel(label, max), full: label }));\n });\n\n protected x(index: number): number {\n return PAD.left + this.band() * (index + 0.5);\n }\n protected y(value: number): number {\n const { min, max } = this.yScale();\n return PAD.top + (1 - (value - min) / (max - min || 1)) * (H - PAD.top - PAD.bottom);\n }\n\n /** Grouped bars: 2px gap between neighbours, 4px rounded top, square base. */\n protected readonly bars = computed(() => {\n const series = this.drawn();\n const groupWidth = Math.min(this.band() * 0.7, 28 * series.length + 2 * (series.length - 1));\n const barWidth = (groupWidth - 2 * (series.length - 1)) / Math.max(1, series.length);\n const base = this.y(0);\n return this.labels().flatMap((_, i) =>\n series.map((s, si) => {\n const left = this.x(i) - groupWidth / 2 + si * (barWidth + 2);\n const top = this.y(toFinite(s.data[i]));\n const r = Math.min(4, barWidth / 2, Math.max(0, base - top));\n const path =\n `M${left},${base}V${top + r}Q${left},${top} ${left + r},${top}` +\n `H${left + barWidth - r}Q${left + barWidth},${top} ${left + barWidth},${top + r}V${base}Z`;\n return { key: `${i}-${si}`, index: i, path, color: this.color(si) };\n }),\n );\n });\n\n /** Stacked bars: one rectangle per value that is not 0, outlined in a darker tone. */\n protected readonly segments = computed(() => {\n const width = Math.min(this.band() * 0.6, 64);\n return this.stack().flatMap((column, i) =>\n column.segments\n .filter((segment) => segment.start !== segment.end)\n .map((segment) => {\n const a = this.y(segment.start);\n const b = this.y(segment.end);\n return {\n key: `${i}-${segment.series}`,\n index: i,\n x: this.x(i) - width / 2,\n y: Math.min(a, b),\n width,\n height: Math.abs(a - b),\n color: this.color(segment.series),\n };\n }),\n );\n });\n\n /** Share of a stack segment in its column, in percent (percent mode). */\n protected share(segment: StarChartStackSegment | undefined): number {\n return segment ? Math.round(Math.abs(segment.end - segment.start) * 10) / 10 : 0;\n }\n\n protected readonly lines = computed(() =>\n this.drawn().map((s, si) => ({\n label: s.label,\n data: s.data,\n color: this.color(si),\n path: s.data.map((v, i) => `${i ? 'L' : 'M'}${this.x(i)},${this.y(v)}`).join(''),\n // Area: the line, then down to the baseline and back to the first point.\n area: s.data.length\n ? s.data.map((v, i) => `${i ? 'L' : 'M'}${this.x(i)},${this.y(v)}`).join('') +\n `L${this.x(s.data.length - 1)},${this.y(0)}L${this.x(0)},${this.y(0)}Z`\n : '',\n })),\n );\n\n // ---------- Doughnut and pie ----------\n\n protected readonly total = computed(() =>\n (this.numeric()[0]?.data ?? []).reduce((a, b) => a + b, 0),\n );\n\n /** Doughnut: top 3 categories + \"Other\" (4 slots validated for all-pairs comparison). */\n protected readonly slices = computed(() => {\n const data = this.numeric()[0]?.data ?? [];\n let items = this.labels().map((label, i) => ({ label, value: data[i] ?? 0 }));\n if (items.length > DOUGHNUT_SLOTS) {\n const sorted = [...items].sort((a, b) => b.value - a.value);\n const rest = sorted.slice(DOUGHNUT_SLOTS - 1).reduce((sum, item) => sum + item.value, 0);\n items = [\n ...sorted.slice(0, DOUGHNUT_SLOTS - 1),\n { label: this.text.chartOther, value: rest },\n ];\n }\n const total = items.reduce((sum, item) => sum + item.value, 0) || 1;\n const outer = 110;\n const inner = this.type() === 'pie' ? 0 : 70;\n let angle = -Math.PI / 2;\n return items.map((item, i) => {\n const sweep = (item.value / total) * Math.PI * 2;\n const gap = items.length > 1 ? 0.02 : 0; // 2px-ish surface gap between slices\n const a0 = angle + gap / 2;\n const a1 = angle + sweep - gap / 2;\n angle += sweep;\n const large = a1 - a0 > Math.PI ? 1 : 0;\n const p = (r: number, a: number) =>\n `${(r * Math.cos(a)).toFixed(2)},${(r * Math.sin(a)).toFixed(2)}`;\n const full = sweep >= Math.PI * 2 - 0.001;\n const ring = full\n ? `M0,-${outer}A${outer},${outer} 0 1 1 -0.01,-${outer}ZM0,-${inner}A${inner},${inner} 0 1 0 0.01,-${inner}Z`\n : `M${p(outer, a0)}A${outer},${outer} 0 ${large} 1 ${p(outer, a1)}L${p(inner, a1)}A${inner},${inner} 0 ${large} 0 ${p(inner, a0)}Z`;\n const wedge = full\n ? `M0,-${outer}A${outer},${outer} 0 1 1 -0.01,-${outer}Z`\n : `M0,0L${p(outer, a0)}A${outer},${outer} 0 ${large} 1 ${p(outer, a1)}Z`;\n const path = inner ? ring : wedge;\n return {\n label: item.label,\n value: item.value,\n percent: Math.round((item.value / total) * 1000) / 10,\n color: this.color(i),\n path,\n };\n });\n });\n\n // ---------- Radar and polar area ----------\n\n /** Label at the end of an axis, cut to a fixed length with the full text as a title. */\n private axisLabel(label: string, angle: number) {\n const point = polarPoint(RADIAL + RADIAL_LABEL_GAP, angle);\n return {\n x: point.x,\n y: point.y,\n anchor: labelAnchor(angle),\n dy: labelOffset(angle),\n text: truncateLabel(label, RADIAL_LABEL_CHARS),\n full: label,\n };\n }\n\n /** Radar: one scale for all series, rings and spokes, one polygon and its markers per series. */\n protected readonly radar = computed(() => {\n const count = this.labels().length;\n const angles = axisAngles(count);\n const half = count ? Math.PI / count : 0;\n const values = this.drawn().flatMap((s) => s.data.slice(0, count));\n const { min, max } = extentOf(values);\n const scale = niceScale(min, max, { includeZero: true });\n const tick = this.tickFormatter(scale.ticks);\n return {\n scale,\n rings: scale.ticks\n .filter((t) => t > scale.min)\n .map((t) => {\n const radius = linearRadius(t, scale, RADIAL);\n return { value: t, radius, path: ringPath(angles, radius), text: tick(t) };\n }),\n spokes: angles.map((a) => polarPoint(RADIAL, a)),\n labels: this.labels().map((label, i) => this.axisLabel(label, angles[i])),\n hits: angles.map((a) => sectorPath(0, RADIAL + RADIAL_LABEL_GAP, a - half, a + half)),\n polygons: this.drawn().map((s, si) => {\n const points = angles.map((a, i) =>\n polarPoint(linearRadius(toFinite(s.data[i]), scale, RADIAL), a),\n );\n return {\n label: s.label,\n color: this.color(si),\n path: polygonPath(points),\n vertices: points.map((p, index) => ({\n index,\n shape: markerPath(si, p.x, p.y, MARKER_RADIUS - 1),\n })),\n };\n }),\n };\n });\n\n /**\n * Polar area: equal angles, and the area of a sector in proportion to its value, so the radius\n * grows with the square root of the value. The rings are at round values on that scale.\n */\n protected readonly polar = computed(() => {\n const count = this.labels().length;\n const data = this.labels().map((_, i) => Math.max(0, toFinite(this.numeric()[0]?.data[i])));\n const scale = niceScale(0, extentOf(data).max, { includeZero: true });\n const tick = this.tickFormatter(scale.ticks);\n const ringAngle = -Math.PI / 2 + (count ? Math.PI / count : 0);\n return {\n scale,\n rings: scale.ticks\n .filter((t) => t > 0)\n .map((t) => {\n const radius = areaRadius(t, scale.max, RADIAL);\n const at = polarPoint(radius, ringAngle);\n return { value: t, radius, text: tick(t), x: at.x + 3, y: at.y - 2 };\n }),\n sectors: polarSectors(data, scale.max, RADIAL).map((s) => ({\n ...s,\n path: sectorPath(0, s.radius, s.start, s.end),\n hit: sectorPath(0, RADIAL, s.start, s.end),\n label: this.axisLabel(this.labels()[s.index], s.mid),\n })),\n };\n });\n\n // ---------- Scatter ----------\n\n /** Points with a finite x and y, per series (all series, for the table). */\n private readonly scatterData = computed(() =>\n this.series().map((s) => {\n const data = s.data as readonly (number | StarChartPoint | null | undefined)[];\n const points = data.map((element, i) =>\n typeof element === 'number' ? { x: i, y: element } : element,\n );\n return { label: s.label, points: cleanPoints(points) };\n }),\n );\n protected readonly scatterRows = computed(() =>\n this.scatterData().flatMap((s) => s.points.map((p) => ({ series: s.label, x: p.x, y: p.y }))),\n );\n\n protected readonly scatter = computed(() => {\n const drawn = this.scatterData().slice(0, STAR_CHART_SLOTS);\n const scales = scatterScales(drawn.flatMap((s) => s.points));\n const left = SCATTER_PAD.left;\n const right = W - SCATTER_PAD.right;\n const top = SCATTER_PAD.top;\n const bottom = H - SCATTER_PAD.bottom;\n const xText = this.tickFormatter(scales.x.ticks);\n const yText = this.tickFormatter(scales.y.ticks);\n let index = 0;\n return {\n xTicks: scales.x.ticks.map((value) => ({\n value,\n position: scalePosition(value, scales.x, left, right),\n text: xText(value),\n })),\n yTicks: scales.y.ticks.map((value) => ({\n value,\n position: scalePosition(value, scales.y, bottom, top),\n text: yText(value),\n })),\n points: drawn.flatMap((s, si) =>\n s.points.map((p) => {\n const px = scalePosition(p.x, scales.x, left, right);\n const py = scalePosition(p.y, scales.y, bottom, top);\n return {\n index: index++,\n seriesLabel: s.label,\n color: this.color(si),\n x: p.x,\n y: p.y,\n px,\n py,\n // The shape repeats the series color: series stay apart where two colors are close.\n shape: markerPath(si, px, py, MARKER_RADIUS),\n legendShape: markerPath(si, 0, 0, MARKER_RADIUS),\n };\n }),\n ),\n };\n });\n}\n"],"mappings":"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"}
@@ -0,0 +1,345 @@
1
+ import { _IdGenerator } from "@angular/cdk/a11y";
2
+ import * as i0 from "@angular/core";
3
+ import { ChangeDetectionStrategy, Component, booleanAttribute, computed, inject, input, model, output, viewChild } from "@angular/core";
4
+ var StarCheckbox = class StarCheckbox {
5
+ checked = model(false, ...ngDevMode ? [{ debugName: "checked" }] : /* istanbul ignore next */ []);
6
+ indeterminate = model(false, ...ngDevMode ? [{ debugName: "indeterminate" }] : /* istanbul ignore next */ []);
7
+ disabled = input(false, {
8
+ ...ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {},
9
+ transform: booleanAttribute
10
+ });
11
+ readonly = input(false, {
12
+ ...ngDevMode ? { debugName: "readonly" } : /* istanbul ignore next */ {},
13
+ transform: booleanAttribute
14
+ });
15
+ required = input(false, {
16
+ ...ngDevMode ? { debugName: "required" } : /* istanbul ignore next */ {},
17
+ transform: booleanAttribute
18
+ });
19
+ invalid = input(false, {
20
+ ...ngDevMode ? { debugName: "invalid" } : /* istanbul ignore next */ {},
21
+ transform: booleanAttribute
22
+ });
23
+ touched = input(false, {
24
+ ...ngDevMode ? { debugName: "touched" } : /* istanbul ignore next */ {},
25
+ transform: booleanAttribute
26
+ });
27
+ name = input("", ...ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []);
28
+ inputId = input(inject(_IdGenerator).getId("star-checkbox-"), ...ngDevMode ? [{ debugName: "inputId" }] : /* istanbul ignore next */ []);
29
+ ariaLabel = input(null, ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
30
+ ariaDescribedBy = input(null, ...ngDevMode ? [{ debugName: "ariaDescribedBy" }] : /* istanbul ignore next */ []);
31
+ touch = output();
32
+ box = viewChild.required("box", ...ngDevMode ? [{ debugName: "box" }] : /* istanbul ignore next */ []);
33
+ showInvalid = computed(() => this.invalid() && this.touched(), ...ngDevMode ? [{ debugName: "showInvalid" }] : /* istanbul ignore next */ []);
34
+ onChange(box) {
35
+ if (this.readonly()) {
36
+ box.checked = this.checked();
37
+ box.indeterminate = this.indeterminate();
38
+ return;
39
+ }
40
+ this.indeterminate.set(false);
41
+ this.checked.set(box.checked);
42
+ }
43
+ focus(options) {
44
+ this.box().nativeElement.focus(options);
45
+ }
46
+ static ɵfac = i0.ɵɵngDeclareFactory({
47
+ minVersion: "12.0.0",
48
+ version: "22.2.6",
49
+ ngImport: i0,
50
+ type: StarCheckbox,
51
+ deps: [],
52
+ target: i0.ɵɵFactoryTarget.Component
53
+ });
54
+ static ɵcmp = i0.ɵɵngDeclareComponent({
55
+ minVersion: "17.0.0",
56
+ version: "22.2.6",
57
+ type: StarCheckbox,
58
+ isStandalone: true,
59
+ selector: "star-checkbox",
60
+ inputs: {
61
+ checked: {
62
+ classPropertyName: "checked",
63
+ publicName: "checked",
64
+ isSignal: true,
65
+ isRequired: false,
66
+ transformFunction: null
67
+ },
68
+ indeterminate: {
69
+ classPropertyName: "indeterminate",
70
+ publicName: "indeterminate",
71
+ isSignal: true,
72
+ isRequired: false,
73
+ transformFunction: null
74
+ },
75
+ disabled: {
76
+ classPropertyName: "disabled",
77
+ publicName: "disabled",
78
+ isSignal: true,
79
+ isRequired: false,
80
+ transformFunction: null
81
+ },
82
+ readonly: {
83
+ classPropertyName: "readonly",
84
+ publicName: "readonly",
85
+ isSignal: true,
86
+ isRequired: false,
87
+ transformFunction: null
88
+ },
89
+ required: {
90
+ classPropertyName: "required",
91
+ publicName: "required",
92
+ isSignal: true,
93
+ isRequired: false,
94
+ transformFunction: null
95
+ },
96
+ invalid: {
97
+ classPropertyName: "invalid",
98
+ publicName: "invalid",
99
+ isSignal: true,
100
+ isRequired: false,
101
+ transformFunction: null
102
+ },
103
+ touched: {
104
+ classPropertyName: "touched",
105
+ publicName: "touched",
106
+ isSignal: true,
107
+ isRequired: false,
108
+ transformFunction: null
109
+ },
110
+ name: {
111
+ classPropertyName: "name",
112
+ publicName: "name",
113
+ isSignal: true,
114
+ isRequired: false,
115
+ transformFunction: null
116
+ },
117
+ inputId: {
118
+ classPropertyName: "inputId",
119
+ publicName: "inputId",
120
+ isSignal: true,
121
+ isRequired: false,
122
+ transformFunction: null
123
+ },
124
+ ariaLabel: {
125
+ classPropertyName: "ariaLabel",
126
+ publicName: "ariaLabel",
127
+ isSignal: true,
128
+ isRequired: false,
129
+ transformFunction: null
130
+ },
131
+ ariaDescribedBy: {
132
+ classPropertyName: "ariaDescribedBy",
133
+ publicName: "ariaDescribedBy",
134
+ isSignal: true,
135
+ isRequired: false,
136
+ transformFunction: null
137
+ }
138
+ },
139
+ outputs: {
140
+ checked: "checkedChange",
141
+ indeterminate: "indeterminateChange",
142
+ touch: "touch"
143
+ },
144
+ host: {
145
+ properties: {
146
+ "class.star-check--disabled": "disabled()",
147
+ "class.star-check--invalid": "showInvalid()"
148
+ },
149
+ classAttribute: "star-check"
150
+ },
151
+ viewQueries: [{
152
+ propertyName: "box",
153
+ first: true,
154
+ predicate: ["box"],
155
+ descendants: true,
156
+ isSignal: true
157
+ }],
158
+ ngImport: i0,
159
+ template: `
160
+ <label class="star-check__label">
161
+ <input
162
+ #box
163
+ type="checkbox"
164
+ class="star-check__input"
165
+ [id]="inputId()"
166
+ [attr.name]="name() || null"
167
+ [checked]="checked()"
168
+ [indeterminate]="indeterminate()"
169
+ [disabled]="disabled()"
170
+ [required]="required()"
171
+ [attr.aria-invalid]="showInvalid() || null"
172
+ [attr.aria-readonly]="readonly() || null"
173
+ [attr.aria-label]="ariaLabel()"
174
+ [attr.aria-describedby]="ariaDescribedBy()"
175
+ (change)="onChange(box)"
176
+ (blur)="touch.emit()"
177
+ />
178
+ <span class="star-check__box" aria-hidden="true">
179
+ @if (indeterminate()) {
180
+ <i class="ph-bold ph-minus"></i>
181
+ } @else if (checked()) {
182
+ <i class="ph-bold ph-check"></i>
183
+ }
184
+ </span>
185
+ <span class="star-check__text"><ng-content /></span>
186
+ </label>
187
+ `,
188
+ isInline: true,
189
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
190
+ });
191
+ };
192
+ i0.ɵɵngDeclareClassMetadata({
193
+ minVersion: "12.0.0",
194
+ version: "22.2.6",
195
+ ngImport: i0,
196
+ type: StarCheckbox,
197
+ decorators: [{
198
+ type: Component,
199
+ args: [{
200
+ selector: "star-checkbox",
201
+ changeDetection: ChangeDetectionStrategy.OnPush,
202
+ host: {
203
+ class: "star-check",
204
+ "[class.star-check--disabled]": "disabled()",
205
+ "[class.star-check--invalid]": "showInvalid()"
206
+ },
207
+ template: `
208
+ <label class="star-check__label">
209
+ <input
210
+ #box
211
+ type="checkbox"
212
+ class="star-check__input"
213
+ [id]="inputId()"
214
+ [attr.name]="name() || null"
215
+ [checked]="checked()"
216
+ [indeterminate]="indeterminate()"
217
+ [disabled]="disabled()"
218
+ [required]="required()"
219
+ [attr.aria-invalid]="showInvalid() || null"
220
+ [attr.aria-readonly]="readonly() || null"
221
+ [attr.aria-label]="ariaLabel()"
222
+ [attr.aria-describedby]="ariaDescribedBy()"
223
+ (change)="onChange(box)"
224
+ (blur)="touch.emit()"
225
+ />
226
+ <span class="star-check__box" aria-hidden="true">
227
+ @if (indeterminate()) {
228
+ <i class="ph-bold ph-minus"></i>
229
+ } @else if (checked()) {
230
+ <i class="ph-bold ph-check"></i>
231
+ }
232
+ </span>
233
+ <span class="star-check__text"><ng-content /></span>
234
+ </label>
235
+ `
236
+ }]
237
+ }],
238
+ propDecorators: {
239
+ checked: [{
240
+ type: i0.Input,
241
+ args: [{
242
+ isSignal: true,
243
+ alias: "checked",
244
+ required: false
245
+ }]
246
+ }, {
247
+ type: i0.Output,
248
+ args: ["checkedChange"]
249
+ }],
250
+ indeterminate: [{
251
+ type: i0.Input,
252
+ args: [{
253
+ isSignal: true,
254
+ alias: "indeterminate",
255
+ required: false
256
+ }]
257
+ }, {
258
+ type: i0.Output,
259
+ args: ["indeterminateChange"]
260
+ }],
261
+ disabled: [{
262
+ type: i0.Input,
263
+ args: [{
264
+ isSignal: true,
265
+ alias: "disabled",
266
+ required: false
267
+ }]
268
+ }],
269
+ readonly: [{
270
+ type: i0.Input,
271
+ args: [{
272
+ isSignal: true,
273
+ alias: "readonly",
274
+ required: false
275
+ }]
276
+ }],
277
+ required: [{
278
+ type: i0.Input,
279
+ args: [{
280
+ isSignal: true,
281
+ alias: "required",
282
+ required: false
283
+ }]
284
+ }],
285
+ invalid: [{
286
+ type: i0.Input,
287
+ args: [{
288
+ isSignal: true,
289
+ alias: "invalid",
290
+ required: false
291
+ }]
292
+ }],
293
+ touched: [{
294
+ type: i0.Input,
295
+ args: [{
296
+ isSignal: true,
297
+ alias: "touched",
298
+ required: false
299
+ }]
300
+ }],
301
+ name: [{
302
+ type: i0.Input,
303
+ args: [{
304
+ isSignal: true,
305
+ alias: "name",
306
+ required: false
307
+ }]
308
+ }],
309
+ inputId: [{
310
+ type: i0.Input,
311
+ args: [{
312
+ isSignal: true,
313
+ alias: "inputId",
314
+ required: false
315
+ }]
316
+ }],
317
+ ariaLabel: [{
318
+ type: i0.Input,
319
+ args: [{
320
+ isSignal: true,
321
+ alias: "ariaLabel",
322
+ required: false
323
+ }]
324
+ }],
325
+ ariaDescribedBy: [{
326
+ type: i0.Input,
327
+ args: [{
328
+ isSignal: true,
329
+ alias: "ariaDescribedBy",
330
+ required: false
331
+ }]
332
+ }],
333
+ touch: [{
334
+ type: i0.Output,
335
+ args: ["touch"]
336
+ }],
337
+ box: [{
338
+ type: i0.ViewChild,
339
+ args: ["box", { isSignal: true }]
340
+ }]
341
+ }
342
+ });
343
+ export { StarCheckbox };
344
+
345
+ //# sourceMappingURL=star-ng-ui-checkbox.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"star-ng-ui-checkbox.mjs","names":[],"sources":["../../../projects/star-ng/checkbox/checkbox.ts"],"sourcesContent":["import { _IdGenerator } from '@angular/cdk/a11y';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n model,\n output,\n viewChild,\n} from '@angular/core';\nimport type { FormCheckboxControl } from '@angular/forms/signals';\n\n/**\n * Checkbox (PrimeNG `p-checkbox` binary mode). Native `<input type=\"checkbox\">` for full\n * keyboard and screen-reader support, with the StarNG box drawn over it.\n *\n * Signal Forms: `<star-checkbox [formField]=\"form.terms\">I agree</star-checkbox>`\n * Standalone: `<star-checkbox [(checked)]=\"agree\" [indeterminate]=\"some\">Label</star-checkbox>`\n */\n@Component({\n selector: 'star-checkbox',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'star-check',\n '[class.star-check--disabled]': 'disabled()',\n '[class.star-check--invalid]': 'showInvalid()',\n },\n template: `\n <label class=\"star-check__label\">\n <input\n #box\n type=\"checkbox\"\n class=\"star-check__input\"\n [id]=\"inputId()\"\n [attr.name]=\"name() || null\"\n [checked]=\"checked()\"\n [indeterminate]=\"indeterminate()\"\n [disabled]=\"disabled()\"\n [required]=\"required()\"\n [attr.aria-invalid]=\"showInvalid() || null\"\n [attr.aria-readonly]=\"readonly() || null\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-describedby]=\"ariaDescribedBy()\"\n (change)=\"onChange(box)\"\n (blur)=\"touch.emit()\"\n />\n <span class=\"star-check__box\" aria-hidden=\"true\">\n @if (indeterminate()) {\n <i class=\"ph-bold ph-minus\"></i>\n } @else if (checked()) {\n <i class=\"ph-bold ph-check\"></i>\n }\n </span>\n <span class=\"star-check__text\"><ng-content /></span>\n </label>\n `,\n})\nexport class StarCheckbox implements FormCheckboxControl {\n readonly checked = model(false);\n /** Mixed state (\"some selected\"). Cleared when the user toggles the box. */\n readonly indeterminate = model(false);\n\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly required = input(false, { transform: booleanAttribute });\n readonly invalid = input(false, { transform: booleanAttribute });\n readonly touched = input(false, { transform: booleanAttribute });\n readonly name = input('');\n readonly inputId = input(inject(_IdGenerator).getId('star-checkbox-'));\n readonly ariaLabel = input<string | null>(null);\n readonly ariaDescribedBy = input<string | null>(null);\n\n /** Signal Forms touch notification. */\n readonly touch = output<void>();\n\n private readonly box = viewChild.required<ElementRef<HTMLInputElement>>('box');\n\n /** Errors show only after the user has visited the control. */\n protected readonly showInvalid = computed(() => this.invalid() && this.touched());\n\n protected onChange(box: HTMLInputElement): void {\n if (this.readonly()) {\n box.checked = this.checked();\n box.indeterminate = this.indeterminate();\n return;\n }\n this.indeterminate.set(false);\n this.checked.set(box.checked);\n }\n\n focus(options?: FocusOptions): void {\n this.box().nativeElement.focus(options);\n }\n}\n"],"mappings":"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"}