@weeehaoooz/talos-ui 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 (180) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +85 -0
  3. package/fesm2022/weeehaoooz-talos-ui-button-button-group.mjs +237 -0
  4. package/fesm2022/weeehaoooz-talos-ui-button-button-group.mjs.map +1 -0
  5. package/fesm2022/weeehaoooz-talos-ui-button-button.mjs +93 -0
  6. package/fesm2022/weeehaoooz-talos-ui-button-button.mjs.map +1 -0
  7. package/fesm2022/weeehaoooz-talos-ui-core.mjs +438 -0
  8. package/fesm2022/weeehaoooz-talos-ui-core.mjs.map +1 -0
  9. package/fesm2022/weeehaoooz-talos-ui-data-display-badge.mjs +233 -0
  10. package/fesm2022/weeehaoooz-talos-ui-data-display-badge.mjs.map +1 -0
  11. package/fesm2022/weeehaoooz-talos-ui-data-display-status-tag.mjs +361 -0
  12. package/fesm2022/weeehaoooz-talos-ui-data-display-status-tag.mjs.map +1 -0
  13. package/fesm2022/weeehaoooz-talos-ui-data-display-timeline.mjs +312 -0
  14. package/fesm2022/weeehaoooz-talos-ui-data-display-timeline.mjs.map +1 -0
  15. package/fesm2022/weeehaoooz-talos-ui-data-display-trend-indicator.mjs +235 -0
  16. package/fesm2022/weeehaoooz-talos-ui-data-display-trend-indicator.mjs.map +1 -0
  17. package/fesm2022/weeehaoooz-talos-ui-data-viz-category-bar.mjs +462 -0
  18. package/fesm2022/weeehaoooz-talos-ui-data-viz-category-bar.mjs.map +1 -0
  19. package/fesm2022/weeehaoooz-talos-ui-data-viz-heatmap.mjs +805 -0
  20. package/fesm2022/weeehaoooz-talos-ui-data-viz-heatmap.mjs.map +1 -0
  21. package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-donut.mjs +267 -0
  22. package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-donut.mjs.map +1 -0
  23. package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-gauge.mjs +351 -0
  24. package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-gauge.mjs.map +1 -0
  25. package/fesm2022/weeehaoooz-talos-ui-data-viz-sparkline.mjs +566 -0
  26. package/fesm2022/weeehaoooz-talos-ui-data-viz-sparkline.mjs.map +1 -0
  27. package/fesm2022/weeehaoooz-talos-ui-feedback-alert.mjs +534 -0
  28. package/fesm2022/weeehaoooz-talos-ui-feedback-alert.mjs.map +1 -0
  29. package/fesm2022/weeehaoooz-talos-ui-feedback-dialog.mjs +446 -0
  30. package/fesm2022/weeehaoooz-talos-ui-feedback-dialog.mjs.map +1 -0
  31. package/fesm2022/weeehaoooz-talos-ui-feedback-snackbar.mjs +376 -0
  32. package/fesm2022/weeehaoooz-talos-ui-feedback-snackbar.mjs.map +1 -0
  33. package/fesm2022/weeehaoooz-talos-ui-feedback-tooltip.mjs +147 -0
  34. package/fesm2022/weeehaoooz-talos-ui-feedback-tooltip.mjs.map +1 -0
  35. package/fesm2022/weeehaoooz-talos-ui-form-affix.mjs +242 -0
  36. package/fesm2022/weeehaoooz-talos-ui-form-affix.mjs.map +1 -0
  37. package/fesm2022/weeehaoooz-talos-ui-form-autocomplete.mjs +514 -0
  38. package/fesm2022/weeehaoooz-talos-ui-form-autocomplete.mjs.map +1 -0
  39. package/fesm2022/weeehaoooz-talos-ui-form-checkbox.mjs +548 -0
  40. package/fesm2022/weeehaoooz-talos-ui-form-checkbox.mjs.map +1 -0
  41. package/fesm2022/weeehaoooz-talos-ui-form-chips.mjs +692 -0
  42. package/fesm2022/weeehaoooz-talos-ui-form-chips.mjs.map +1 -0
  43. package/fesm2022/weeehaoooz-talos-ui-form-color-picker.mjs +761 -0
  44. package/fesm2022/weeehaoooz-talos-ui-form-color-picker.mjs.map +1 -0
  45. package/fesm2022/weeehaoooz-talos-ui-form-date-picker.mjs +896 -0
  46. package/fesm2022/weeehaoooz-talos-ui-form-date-picker.mjs.map +1 -0
  47. package/fesm2022/weeehaoooz-talos-ui-form-date-range-picker.mjs +872 -0
  48. package/fesm2022/weeehaoooz-talos-ui-form-date-range-picker.mjs.map +1 -0
  49. package/fesm2022/weeehaoooz-talos-ui-form-date-time-picker.mjs +119 -0
  50. package/fesm2022/weeehaoooz-talos-ui-form-date-time-picker.mjs.map +1 -0
  51. package/fesm2022/weeehaoooz-talos-ui-form-date-time-range-picker.mjs +135 -0
  52. package/fesm2022/weeehaoooz-talos-ui-form-date-time-range-picker.mjs.map +1 -0
  53. package/fesm2022/weeehaoooz-talos-ui-form-drop-zone.mjs +666 -0
  54. package/fesm2022/weeehaoooz-talos-ui-form-drop-zone.mjs.map +1 -0
  55. package/fesm2022/weeehaoooz-talos-ui-form-form-field.mjs +147 -0
  56. package/fesm2022/weeehaoooz-talos-ui-form-form-field.mjs.map +1 -0
  57. package/fesm2022/weeehaoooz-talos-ui-form-input.mjs +33 -0
  58. package/fesm2022/weeehaoooz-talos-ui-form-input.mjs.map +1 -0
  59. package/fesm2022/weeehaoooz-talos-ui-form-otp.mjs +455 -0
  60. package/fesm2022/weeehaoooz-talos-ui-form-otp.mjs.map +1 -0
  61. package/fesm2022/weeehaoooz-talos-ui-form-password-input.mjs +379 -0
  62. package/fesm2022/weeehaoooz-talos-ui-form-password-input.mjs.map +1 -0
  63. package/fesm2022/weeehaoooz-talos-ui-form-radio.mjs +297 -0
  64. package/fesm2022/weeehaoooz-talos-ui-form-radio.mjs.map +1 -0
  65. package/fesm2022/weeehaoooz-talos-ui-form-range-input.mjs +661 -0
  66. package/fesm2022/weeehaoooz-talos-ui-form-range-input.mjs.map +1 -0
  67. package/fesm2022/weeehaoooz-talos-ui-form-rating.mjs +346 -0
  68. package/fesm2022/weeehaoooz-talos-ui-form-rating.mjs.map +1 -0
  69. package/fesm2022/weeehaoooz-talos-ui-form-select-input.mjs +896 -0
  70. package/fesm2022/weeehaoooz-talos-ui-form-select-input.mjs.map +1 -0
  71. package/fesm2022/weeehaoooz-talos-ui-form-slide-toggle.mjs +252 -0
  72. package/fesm2022/weeehaoooz-talos-ui-form-slide-toggle.mjs.map +1 -0
  73. package/fesm2022/weeehaoooz-talos-ui-form-transfer-list.mjs +916 -0
  74. package/fesm2022/weeehaoooz-talos-ui-form-transfer-list.mjs.map +1 -0
  75. package/fesm2022/weeehaoooz-talos-ui-layout.mjs +851 -0
  76. package/fesm2022/weeehaoooz-talos-ui-layout.mjs.map +1 -0
  77. package/fesm2022/weeehaoooz-talos-ui-nav.mjs +897 -0
  78. package/fesm2022/weeehaoooz-talos-ui-nav.mjs.map +1 -0
  79. package/fesm2022/weeehaoooz-talos-ui.mjs +17058 -0
  80. package/fesm2022/weeehaoooz-talos-ui.mjs.map +1 -0
  81. package/package.json +203 -0
  82. package/schematics/collection.json +10 -0
  83. package/schematics/ng-add/index.d.ts +3 -0
  84. package/schematics/ng-add/index.js +99 -0
  85. package/schematics/ng-add/schema.d.ts +10 -0
  86. package/schematics/ng-add/schema.js +2 -0
  87. package/schematics/ng-add/schema.json +52 -0
  88. package/styles/_alert.scss +56 -0
  89. package/styles/_badge.scss +279 -0
  90. package/styles/_button-group.scss +470 -0
  91. package/styles/_buttons.scss +442 -0
  92. package/styles/_card.scss +18 -0
  93. package/styles/_dialog.scss +116 -0
  94. package/styles/_drop-zone.scss +19 -0
  95. package/styles/_form-controls.scss +660 -0
  96. package/styles/_slide-toggle.scss +171 -0
  97. package/styles/_status-tag.scss +108 -0
  98. package/styles/_timeline.scss +19 -0
  99. package/styles/_tooltip.scss +32 -0
  100. package/styles/_typography.scss +279 -0
  101. package/styles/_variables.scss +590 -0
  102. package/styles/index.scss +15 -0
  103. package/types/weeehaoooz-talos-ui-button-button-group.d.ts +59 -0
  104. package/types/weeehaoooz-talos-ui-button-button-group.d.ts.map +1 -0
  105. package/types/weeehaoooz-talos-ui-button-button.d.ts +38 -0
  106. package/types/weeehaoooz-talos-ui-button-button.d.ts.map +1 -0
  107. package/types/weeehaoooz-talos-ui-core.d.ts +95 -0
  108. package/types/weeehaoooz-talos-ui-core.d.ts.map +1 -0
  109. package/types/weeehaoooz-talos-ui-data-display-badge.d.ts +119 -0
  110. package/types/weeehaoooz-talos-ui-data-display-badge.d.ts.map +1 -0
  111. package/types/weeehaoooz-talos-ui-data-display-status-tag.d.ts +135 -0
  112. package/types/weeehaoooz-talos-ui-data-display-status-tag.d.ts.map +1 -0
  113. package/types/weeehaoooz-talos-ui-data-display-timeline.d.ts +144 -0
  114. package/types/weeehaoooz-talos-ui-data-display-timeline.d.ts.map +1 -0
  115. package/types/weeehaoooz-talos-ui-data-display-trend-indicator.d.ts +83 -0
  116. package/types/weeehaoooz-talos-ui-data-display-trend-indicator.d.ts.map +1 -0
  117. package/types/weeehaoooz-talos-ui-data-viz-category-bar.d.ts +255 -0
  118. package/types/weeehaoooz-talos-ui-data-viz-category-bar.d.ts.map +1 -0
  119. package/types/weeehaoooz-talos-ui-data-viz-heatmap.d.ts +204 -0
  120. package/types/weeehaoooz-talos-ui-data-viz-heatmap.d.ts.map +1 -0
  121. package/types/weeehaoooz-talos-ui-data-viz-mini-donut.d.ts +101 -0
  122. package/types/weeehaoooz-talos-ui-data-viz-mini-donut.d.ts.map +1 -0
  123. package/types/weeehaoooz-talos-ui-data-viz-mini-gauge.d.ts +138 -0
  124. package/types/weeehaoooz-talos-ui-data-viz-mini-gauge.d.ts.map +1 -0
  125. package/types/weeehaoooz-talos-ui-data-viz-sparkline.d.ts +161 -0
  126. package/types/weeehaoooz-talos-ui-data-viz-sparkline.d.ts.map +1 -0
  127. package/types/weeehaoooz-talos-ui-feedback-alert.d.ts +212 -0
  128. package/types/weeehaoooz-talos-ui-feedback-alert.d.ts.map +1 -0
  129. package/types/weeehaoooz-talos-ui-feedback-dialog.d.ts +259 -0
  130. package/types/weeehaoooz-talos-ui-feedback-dialog.d.ts.map +1 -0
  131. package/types/weeehaoooz-talos-ui-feedback-snackbar.d.ts +147 -0
  132. package/types/weeehaoooz-talos-ui-feedback-snackbar.d.ts.map +1 -0
  133. package/types/weeehaoooz-talos-ui-feedback-tooltip.d.ts +32 -0
  134. package/types/weeehaoooz-talos-ui-feedback-tooltip.d.ts.map +1 -0
  135. package/types/weeehaoooz-talos-ui-form-affix.d.ts +88 -0
  136. package/types/weeehaoooz-talos-ui-form-affix.d.ts.map +1 -0
  137. package/types/weeehaoooz-talos-ui-form-autocomplete.d.ts +113 -0
  138. package/types/weeehaoooz-talos-ui-form-autocomplete.d.ts.map +1 -0
  139. package/types/weeehaoooz-talos-ui-form-checkbox.d.ts +165 -0
  140. package/types/weeehaoooz-talos-ui-form-checkbox.d.ts.map +1 -0
  141. package/types/weeehaoooz-talos-ui-form-chips.d.ts +152 -0
  142. package/types/weeehaoooz-talos-ui-form-chips.d.ts.map +1 -0
  143. package/types/weeehaoooz-talos-ui-form-color-picker.d.ts +144 -0
  144. package/types/weeehaoooz-talos-ui-form-color-picker.d.ts.map +1 -0
  145. package/types/weeehaoooz-talos-ui-form-date-picker.d.ts +138 -0
  146. package/types/weeehaoooz-talos-ui-form-date-picker.d.ts.map +1 -0
  147. package/types/weeehaoooz-talos-ui-form-date-range-picker.d.ts +148 -0
  148. package/types/weeehaoooz-talos-ui-form-date-range-picker.d.ts.map +1 -0
  149. package/types/weeehaoooz-talos-ui-form-date-time-picker.d.ts +44 -0
  150. package/types/weeehaoooz-talos-ui-form-date-time-picker.d.ts.map +1 -0
  151. package/types/weeehaoooz-talos-ui-form-date-time-range-picker.d.ts +48 -0
  152. package/types/weeehaoooz-talos-ui-form-date-time-range-picker.d.ts.map +1 -0
  153. package/types/weeehaoooz-talos-ui-form-drop-zone.d.ts +227 -0
  154. package/types/weeehaoooz-talos-ui-form-drop-zone.d.ts.map +1 -0
  155. package/types/weeehaoooz-talos-ui-form-form-field.d.ts +42 -0
  156. package/types/weeehaoooz-talos-ui-form-form-field.d.ts.map +1 -0
  157. package/types/weeehaoooz-talos-ui-form-input.d.ts +15 -0
  158. package/types/weeehaoooz-talos-ui-form-input.d.ts.map +1 -0
  159. package/types/weeehaoooz-talos-ui-form-otp.d.ts +111 -0
  160. package/types/weeehaoooz-talos-ui-form-otp.d.ts.map +1 -0
  161. package/types/weeehaoooz-talos-ui-form-password-input.d.ts +145 -0
  162. package/types/weeehaoooz-talos-ui-form-password-input.d.ts.map +1 -0
  163. package/types/weeehaoooz-talos-ui-form-radio.d.ts +84 -0
  164. package/types/weeehaoooz-talos-ui-form-radio.d.ts.map +1 -0
  165. package/types/weeehaoooz-talos-ui-form-range-input.d.ts +181 -0
  166. package/types/weeehaoooz-talos-ui-form-range-input.d.ts.map +1 -0
  167. package/types/weeehaoooz-talos-ui-form-rating.d.ts +110 -0
  168. package/types/weeehaoooz-talos-ui-form-rating.d.ts.map +1 -0
  169. package/types/weeehaoooz-talos-ui-form-select-input.d.ts +195 -0
  170. package/types/weeehaoooz-talos-ui-form-select-input.d.ts.map +1 -0
  171. package/types/weeehaoooz-talos-ui-form-slide-toggle.d.ts +79 -0
  172. package/types/weeehaoooz-talos-ui-form-slide-toggle.d.ts.map +1 -0
  173. package/types/weeehaoooz-talos-ui-form-transfer-list.d.ts +192 -0
  174. package/types/weeehaoooz-talos-ui-form-transfer-list.d.ts.map +1 -0
  175. package/types/weeehaoooz-talos-ui-layout.d.ts +286 -0
  176. package/types/weeehaoooz-talos-ui-layout.d.ts.map +1 -0
  177. package/types/weeehaoooz-talos-ui-nav.d.ts +384 -0
  178. package/types/weeehaoooz-talos-ui-nav.d.ts.map +1 -0
  179. package/types/weeehaoooz-talos-ui.d.ts +5050 -0
  180. package/types/weeehaoooz-talos-ui.d.ts.map +1 -0
@@ -0,0 +1,462 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, ElementRef, input, output, signal, computed, Component, NgModule } from '@angular/core';
3
+ import { TalosTooltipDirective } from '@weeehaoooz/talos-ui/feedback/tooltip';
4
+
5
+ /**
6
+ * Talos Category Bar Type Definitions
7
+ */
8
+
9
+ const PRESET_PALETTE = {
10
+ blue: '#3b82f6',
11
+ emerald: '#10b981',
12
+ violet: '#8b5cf6',
13
+ purple: '#9333ea',
14
+ amber: '#f59e0b',
15
+ orange: '#f97316',
16
+ rose: '#f43f5e',
17
+ pink: '#ec4899',
18
+ cyan: '#06b6d4',
19
+ lime: '#84cc16',
20
+ indigo: '#6366f1',
21
+ teal: '#14b8a6',
22
+ sky: '#0284c7',
23
+ red: '#ef4444',
24
+ slate: '#64748b'
25
+ };
26
+ const DEFAULT_COLOR_ORDER = [
27
+ '#3b82f6', // blue
28
+ '#10b981', // emerald
29
+ '#8b5cf6', // violet
30
+ '#f59e0b', // amber
31
+ '#ec4899', // pink
32
+ '#06b6d4', // cyan
33
+ '#84cc16', // lime
34
+ '#f97316', // orange
35
+ '#6366f1', // indigo
36
+ '#14b8a6' // teal
37
+ ];
38
+ class TalosCategoryBarComponent {
39
+ elementRef = inject(ElementRef);
40
+ /**
41
+ * Simple numeric values array for each category (e.g. [120, 80, 60, 40]).
42
+ */
43
+ values = input(null, /* @ts-ignore */
44
+ ...(ngDevMode ? [{ debugName: "values" }] : /* istanbul ignore next */ []));
45
+ /**
46
+ * Detailed category segments with labels, colors, and metadata.
47
+ */
48
+ categories = input(null, /* @ts-ignore */
49
+ ...(ngDevMode ? [{ debugName: "categories" }] : /* istanbul ignore next */ []));
50
+ /**
51
+ * Custom palette or color list for segments. Can be CSS color strings or preset names.
52
+ */
53
+ colors = input(DEFAULT_COLOR_ORDER, /* @ts-ignore */
54
+ ...(ngDevMode ? [{ debugName: "colors" }] : /* istanbul ignore next */ []));
55
+ /**
56
+ * Numeric position for the needle marker.
57
+ */
58
+ markerValue = input(null, /* @ts-ignore */
59
+ ...(ngDevMode ? [{ debugName: "markerValue" }] : /* istanbul ignore next */ []));
60
+ /**
61
+ * Detailed marker object definition.
62
+ */
63
+ marker = input(null, /* @ts-ignore */
64
+ ...(ngDevMode ? [{ debugName: "marker" }] : /* istanbul ignore next */ []));
65
+ /**
66
+ * Minimum scale bound (defaults to 0).
67
+ */
68
+ minValue = input(null, /* @ts-ignore */
69
+ ...(ngDevMode ? [{ debugName: "minValue" }] : /* istanbul ignore next */ []));
70
+ /**
71
+ * Maximum scale bound (defaults to sum of all category values).
72
+ */
73
+ maxValue = input(null, /* @ts-ignore */
74
+ ...(ngDevMode ? [{ debugName: "maxValue" }] : /* istanbul ignore next */ []));
75
+ /**
76
+ * Whether to show category scale labels at segment boundaries.
77
+ */
78
+ showLabels = input(true, /* @ts-ignore */
79
+ ...(ngDevMode ? [{ debugName: "showLabels" }] : /* istanbul ignore next */ []));
80
+ /**
81
+ * Custom boundary label strings. If not provided, computed cumulative values are shown.
82
+ */
83
+ labels = input(null, /* @ts-ignore */
84
+ ...(ngDevMode ? [{ debugName: "labels" }] : /* istanbul ignore next */ []));
85
+ /**
86
+ * Placement of scale boundary labels: 'top', 'bottom', or 'none'.
87
+ */
88
+ labelPosition = input('top', /* @ts-ignore */
89
+ ...(ngDevMode ? [{ debugName: "labelPosition" }] : /* istanbul ignore next */ []));
90
+ /**
91
+ * Custom label formatter function for boundary values.
92
+ */
93
+ labelFormatter = input(null, /* @ts-ignore */
94
+ ...(ngDevMode ? [{ debugName: "labelFormatter" }] : /* istanbul ignore next */ []));
95
+ /**
96
+ * Custom value formatter for segment tooltip / legends.
97
+ */
98
+ valueFormatter = input(null, /* @ts-ignore */
99
+ ...(ngDevMode ? [{ debugName: "valueFormatter" }] : /* istanbul ignore next */ []));
100
+ /**
101
+ * Custom marker value formatter for tooltip.
102
+ */
103
+ markerFormatter = input(null, /* @ts-ignore */
104
+ ...(ngDevMode ? [{ debugName: "markerFormatter" }] : /* istanbul ignore next */ []));
105
+ /**
106
+ * Height size variant of the category bar: 'xs' (6px), 'sm' (8px), 'md' (12px), 'lg' (16px).
107
+ */
108
+ size = input('md', /* @ts-ignore */
109
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
110
+ /**
111
+ * Corner shape of the bar: 'pill' (fully rounded capsule), 'rounded' (6px), 'square' (0px).
112
+ */
113
+ shape = input('pill', /* @ts-ignore */
114
+ ...(ngDevMode ? [{ debugName: "shape" }] : /* istanbul ignore next */ []));
115
+ /**
116
+ * Optional title above the bar.
117
+ */
118
+ title = input('', /* @ts-ignore */
119
+ ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
120
+ /**
121
+ * Optional subtitle below the title.
122
+ */
123
+ subtitle = input('', /* @ts-ignore */
124
+ ...(ngDevMode ? [{ debugName: "subtitle" }] : /* istanbul ignore next */ []));
125
+ /**
126
+ * Whether to display a bottom legend row with category names and color indicators.
127
+ */
128
+ showLegend = input(false, /* @ts-ignore */
129
+ ...(ngDevMode ? [{ debugName: "showLegend" }] : /* istanbul ignore next */ []));
130
+ /**
131
+ * Whether hovering segments or marker displays interactive tooltips.
132
+ */
133
+ showTooltip = input(true, /* @ts-ignore */
134
+ ...(ngDevMode ? [{ debugName: "showTooltip" }] : /* istanbul ignore next */ []));
135
+ /**
136
+ * Enable smooth CSS transition animation.
137
+ */
138
+ animated = input(true, /* @ts-ignore */
139
+ ...(ngDevMode ? [{ debugName: "animated" }] : /* istanbul ignore next */ []));
140
+ /**
141
+ * Output event when a segment is clicked.
142
+ */
143
+ segmentClick = output();
144
+ /**
145
+ * Output event when the marker is clicked.
146
+ */
147
+ markerClick = output();
148
+ /**
149
+ * Output event when a segment is hovered.
150
+ */
151
+ segmentHover = output();
152
+ // Internal reactive hover states
153
+ hoveredSegment = signal(null, /* @ts-ignore */
154
+ ...(ngDevMode ? [{ debugName: "hoveredSegment" }] : /* istanbul ignore next */ []));
155
+ hoveredMarker = signal(false, /* @ts-ignore */
156
+ ...(ngDevMode ? [{ debugName: "hoveredMarker" }] : /* istanbul ignore next */ []));
157
+ tooltipPosition = signal(null, /* @ts-ignore */
158
+ ...(ngDevMode ? [{ debugName: "tooltipPosition" }] : /* istanbul ignore next */ []));
159
+ /**
160
+ * Resolves raw category items from either `categories` or `values` input.
161
+ */
162
+ rawCategories = computed(() => {
163
+ const cats = this.categories();
164
+ if (cats && cats.length > 0) {
165
+ return cats;
166
+ }
167
+ const vals = this.values();
168
+ if (vals && vals.length > 0) {
169
+ return vals.map((val, idx) => ({
170
+ value: val,
171
+ label: `Category ${idx + 1}`
172
+ }));
173
+ }
174
+ return [];
175
+ }, /* @ts-ignore */
176
+ ...(ngDevMode ? [{ debugName: "rawCategories" }] : /* istanbul ignore next */ []));
177
+ /**
178
+ * Resolved color array mapping named color presets to hex codes if needed.
179
+ */
180
+ resolvedPalette = computed(() => {
181
+ const customColors = this.colors();
182
+ if (customColors && customColors.length > 0) {
183
+ return customColors.map(c => PRESET_PALETTE[c] || c);
184
+ }
185
+ return DEFAULT_COLOR_ORDER;
186
+ }, /* @ts-ignore */
187
+ ...(ngDevMode ? [{ debugName: "resolvedPalette" }] : /* istanbul ignore next */ []));
188
+ /**
189
+ * Total sum of all positive category values.
190
+ */
191
+ totalSum = computed(() => {
192
+ const raw = this.rawCategories();
193
+ return raw.reduce((sum, item) => sum + Math.max(0, item.value || 0), 0);
194
+ }, /* @ts-ignore */
195
+ ...(ngDevMode ? [{ debugName: "totalSum" }] : /* istanbul ignore next */ []));
196
+ /**
197
+ * Computed minimum boundary.
198
+ */
199
+ computedMin = computed(() => {
200
+ const customMin = this.minValue();
201
+ return customMin !== null ? customMin : 0;
202
+ }, /* @ts-ignore */
203
+ ...(ngDevMode ? [{ debugName: "computedMin" }] : /* istanbul ignore next */ []));
204
+ /**
205
+ * Computed maximum boundary.
206
+ */
207
+ computedMax = computed(() => {
208
+ const customMax = this.maxValue();
209
+ if (customMax !== null) {
210
+ return customMax;
211
+ }
212
+ const sum = this.totalSum();
213
+ return sum > 0 ? sum : 100;
214
+ }, /* @ts-ignore */
215
+ ...(ngDevMode ? [{ debugName: "computedMax" }] : /* istanbul ignore next */ []));
216
+ /**
217
+ * Normalized computed segments for rendering with cumulative positions and percentages.
218
+ */
219
+ normalizedSegments = computed(() => {
220
+ const raw = this.rawCategories();
221
+ const total = this.totalSum();
222
+ const palette = this.resolvedPalette();
223
+ const vFormatter = this.valueFormatter();
224
+ if (raw.length === 0 || total <= 0) {
225
+ return [];
226
+ }
227
+ let cumulative = 0;
228
+ return raw.map((item, index) => {
229
+ const val = Math.max(0, item.value || 0);
230
+ const percentage = (val / total) * 100;
231
+ const start = cumulative;
232
+ const end = cumulative + val;
233
+ const startPercent = (start / total) * 100;
234
+ const endPercent = (end / total) * 100;
235
+ cumulative = end;
236
+ // Color resolution
237
+ let color = item.color;
238
+ if (!color && item.colorScheme) {
239
+ color = PRESET_PALETTE[item.colorScheme] || item.colorScheme;
240
+ }
241
+ if (!color) {
242
+ color = palette[index % palette.length];
243
+ }
244
+ const formattedVal = vFormatter ? vFormatter(val) : val.toLocaleString();
245
+ const label = item.label || `Category ${index + 1}`;
246
+ const tooltipText = item.tooltip || `${label}: ${formattedVal} (${percentage.toFixed(1)}%)`;
247
+ return {
248
+ index,
249
+ value: val,
250
+ label,
251
+ color,
252
+ percentage,
253
+ cumulativeStart: start,
254
+ cumulativeEnd: end,
255
+ cumulativeStartPercent: startPercent,
256
+ cumulativeEndPercent: endPercent,
257
+ formattedValue: formattedVal,
258
+ tooltipText,
259
+ raw: item
260
+ };
261
+ });
262
+ }, /* @ts-ignore */
263
+ ...(ngDevMode ? [{ debugName: "normalizedSegments" }] : /* istanbul ignore next */ []));
264
+ /**
265
+ * Computed scale boundary labels positioned at tick intersections.
266
+ */
267
+ scaleLabels = computed(() => {
268
+ if (!this.showLabels() || this.labelPosition() === 'none') {
269
+ return [];
270
+ }
271
+ const customLabels = this.labels();
272
+ const segments = this.normalizedSegments();
273
+ const lFormatter = this.labelFormatter();
274
+ const min = this.computedMin();
275
+ const max = this.computedMax();
276
+ if (customLabels && customLabels.length > 0) {
277
+ const count = customLabels.length;
278
+ return customLabels.map((text, index) => {
279
+ const leftPercent = count > 1 ? (index / (count - 1)) * 100 : 0;
280
+ return {
281
+ index,
282
+ value: min + ((max - min) * leftPercent) / 100,
283
+ text,
284
+ leftPercent
285
+ };
286
+ });
287
+ }
288
+ if (segments.length === 0) {
289
+ return [];
290
+ }
291
+ // Generate boundary ticks: [0, seg1.end, seg2.end, ...]
292
+ const ticks = [];
293
+ // Start tick (0 / min)
294
+ const startVal = min;
295
+ const startText = lFormatter ? lFormatter(startVal, 0) : startVal.toLocaleString();
296
+ ticks.push({
297
+ index: 0,
298
+ value: startVal,
299
+ text: startText,
300
+ leftPercent: 0
301
+ });
302
+ segments.forEach((seg, idx) => {
303
+ const val = seg.cumulativeEnd;
304
+ const text = lFormatter ? lFormatter(val, idx + 1) : val.toLocaleString();
305
+ ticks.push({
306
+ index: idx + 1,
307
+ value: val,
308
+ text,
309
+ leftPercent: seg.cumulativeEndPercent
310
+ });
311
+ });
312
+ return ticks;
313
+ }, /* @ts-ignore */
314
+ ...(ngDevMode ? [{ debugName: "scaleLabels" }] : /* istanbul ignore next */ []));
315
+ /**
316
+ * Resolved marker value.
317
+ */
318
+ markerVal = computed(() => {
319
+ const m = this.marker();
320
+ if (m && typeof m.value === 'number') {
321
+ return m.value;
322
+ }
323
+ const mv = this.markerValue();
324
+ return typeof mv === 'number' ? mv : null;
325
+ }, /* @ts-ignore */
326
+ ...(ngDevMode ? [{ debugName: "markerVal" }] : /* istanbul ignore next */ []));
327
+ /**
328
+ * Marker needle placement and metadata.
329
+ */
330
+ markerState = computed(() => {
331
+ const val = this.markerVal();
332
+ if (val === null) {
333
+ return null;
334
+ }
335
+ const min = this.computedMin();
336
+ const max = this.computedMax();
337
+ const span = max - min;
338
+ if (span <= 0) {
339
+ return null;
340
+ }
341
+ const rawPercent = ((val - min) / span) * 100;
342
+ const clampedPercent = Math.max(0, Math.min(100, rawPercent));
343
+ const m = this.marker();
344
+ const mFormatter = this.markerFormatter();
345
+ const formattedVal = mFormatter ? mFormatter(val) : val.toLocaleString();
346
+ // Pick marker color: custom marker color -> category color at that position -> primary accent
347
+ let color = m?.color;
348
+ if (!color) {
349
+ const segments = this.normalizedSegments();
350
+ const currentSegment = segments.find(s => clampedPercent >= s.cumulativeStartPercent && clampedPercent <= s.cumulativeEndPercent);
351
+ color = currentSegment ? currentSegment.color : '#6366f1';
352
+ }
353
+ const label = m?.label || `Marker: ${formattedVal}`;
354
+ const tooltip = m?.tooltip || `${label} (${clampedPercent.toFixed(1)}%)`;
355
+ const variant = m?.variant || 'pill';
356
+ return {
357
+ visible: true,
358
+ percent: clampedPercent,
359
+ color,
360
+ label,
361
+ tooltip,
362
+ variant
363
+ };
364
+ }, /* @ts-ignore */
365
+ ...(ngDevMode ? [{ debugName: "markerState" }] : /* istanbul ignore next */ []));
366
+ /**
367
+ * Accessible description for screen readers.
368
+ */
369
+ ariaLabel = computed(() => {
370
+ const t = this.title();
371
+ const mVal = this.markerVal();
372
+ const total = this.totalSum();
373
+ if (t) {
374
+ return `${t}, Total: ${total}${mVal !== null ? `, Current Marker: ${mVal}` : ''}`;
375
+ }
376
+ return `Category bar with ${this.rawCategories().length} categories, Total: ${total}`;
377
+ }, /* @ts-ignore */
378
+ ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
379
+ // Event handlers
380
+ onSegmentClick(seg, event) {
381
+ this.segmentClick.emit({
382
+ segment: seg,
383
+ index: seg.index,
384
+ event
385
+ });
386
+ }
387
+ onSegmentMouseEnter(seg, event) {
388
+ this.hoveredSegment.set(seg);
389
+ this.segmentHover.emit(seg);
390
+ this.updateTooltipPos(event);
391
+ }
392
+ onSegmentMouseLeave() {
393
+ this.hoveredSegment.set(null);
394
+ this.segmentHover.emit(null);
395
+ }
396
+ onMarkerMouseEnter(event) {
397
+ this.hoveredMarker.set(true);
398
+ this.updateTooltipPos(event);
399
+ }
400
+ onMarkerMouseLeave() {
401
+ this.hoveredMarker.set(false);
402
+ }
403
+ onMarkerClick(event) {
404
+ const ms = this.markerState();
405
+ const mVal = this.markerVal();
406
+ if (ms && mVal !== null) {
407
+ const mObj = this.marker() || { value: mVal };
408
+ this.markerClick.emit({
409
+ marker: mObj,
410
+ value: mVal,
411
+ percent: ms.percent,
412
+ event
413
+ });
414
+ }
415
+ }
416
+ updateTooltipPos(event) {
417
+ const hostEl = this.elementRef.nativeElement;
418
+ const rect = hostEl.getBoundingClientRect();
419
+ this.tooltipPosition.set({
420
+ x: event.clientX - rect.left,
421
+ y: event.clientY - rect.top
422
+ });
423
+ }
424
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosCategoryBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
425
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.1", type: TalosCategoryBarComponent, isStandalone: true, selector: "talos-category-bar", inputs: { values: { classPropertyName: "values", publicName: "values", isSignal: true, isRequired: false, transformFunction: null }, categories: { classPropertyName: "categories", publicName: "categories", isSignal: true, isRequired: false, transformFunction: null }, colors: { classPropertyName: "colors", publicName: "colors", isSignal: true, isRequired: false, transformFunction: null }, markerValue: { classPropertyName: "markerValue", publicName: "markerValue", isSignal: true, isRequired: false, transformFunction: null }, marker: { classPropertyName: "marker", publicName: "marker", isSignal: true, isRequired: false, transformFunction: null }, minValue: { classPropertyName: "minValue", publicName: "minValue", isSignal: true, isRequired: false, transformFunction: null }, maxValue: { classPropertyName: "maxValue", publicName: "maxValue", isSignal: true, isRequired: false, transformFunction: null }, showLabels: { classPropertyName: "showLabels", publicName: "showLabels", isSignal: true, isRequired: false, transformFunction: null }, labels: { classPropertyName: "labels", publicName: "labels", isSignal: true, isRequired: false, transformFunction: null }, labelPosition: { classPropertyName: "labelPosition", publicName: "labelPosition", isSignal: true, isRequired: false, transformFunction: null }, labelFormatter: { classPropertyName: "labelFormatter", publicName: "labelFormatter", isSignal: true, isRequired: false, transformFunction: null }, valueFormatter: { classPropertyName: "valueFormatter", publicName: "valueFormatter", isSignal: true, isRequired: false, transformFunction: null }, markerFormatter: { classPropertyName: "markerFormatter", publicName: "markerFormatter", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, shape: { classPropertyName: "shape", publicName: "shape", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, showLegend: { classPropertyName: "showLegend", publicName: "showLegend", isSignal: true, isRequired: false, transformFunction: null }, showTooltip: { classPropertyName: "showTooltip", publicName: "showTooltip", isSignal: true, isRequired: false, transformFunction: null }, animated: { classPropertyName: "animated", publicName: "animated", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { segmentClick: "segmentClick", markerClick: "markerClick", segmentHover: "segmentHover" }, host: { properties: { "class.talos-category-bar-animated": "animated()", "class.talos-category-bar-sm": "size() === \"sm\"", "class.talos-category-bar-md": "size() === \"md\"", "class.talos-category-bar-lg": "size() === \"lg\"", "class.talos-category-bar-xs": "size() === \"xs\"", "attr.role": "\"meter\"", "attr.aria-valuenow": "markerVal()", "attr.aria-valuemin": "computedMin()", "attr.aria-valuemax": "computedMax()", "attr.aria-label": "ariaLabel()" }, classAttribute: "talos-category-bar" }, ngImport: i0, template: "<!-- Header Block (Title / Subtitle / Custom Header) -->\n@if (title() || subtitle()) {\n<div class=\"talos-category-bar-header\">\n @if (title()) {\n <div class=\"talos-category-bar-title\">{{ title() }}</div>\n }\n @if (subtitle()) {\n <div class=\"talos-category-bar-subtitle\">{{ subtitle() }}</div>\n }\n</div>\n}\n\n<ng-content select=\"[talosCategoryBarHeader]\"></ng-content>\n\n<!-- Top Scale Boundary Labels -->\n@if (showLabels() && labelPosition() === 'top' && scaleLabels().length > 0) {\n<div class=\"talos-category-bar-labels talos-category-bar-labels-top\" aria-hidden=\"true\">\n @for (tick of scaleLabels(); track tick.index; let first = $first; let last = $last) {\n <span class=\"talos-category-bar-label-tick\" [class.is-first]=\"first\" [class.is-last]=\"last\"\n [style.left.%]=\"tick.leftPercent\">\n {{ tick.text }}\n </span>\n }\n</div>\n}\n\n<!-- Main Bar Track Wrapper -->\n<div class=\"talos-category-bar-track-wrapper\">\n <div class=\"talos-category-bar-track\" [class.shape-pill]=\"shape() === 'pill'\"\n [class.shape-rounded]=\"shape() === 'rounded'\" [class.shape-square]=\"shape() === 'square'\"\n [class.size-xs]=\"size() === 'xs'\" [class.size-sm]=\"size() === 'sm'\" [class.size-md]=\"size() === 'md'\"\n [class.size-lg]=\"size() === 'lg'\">\n @for (seg of normalizedSegments(); track seg.index; let first = $first; let last = $last) {\n <div class=\"talos-category-bar-segment\" [class.is-first]=\"first\" [class.is-last]=\"last\"\n [class.is-hovered]=\"hoveredSegment()?.index === seg.index\" [style.width.%]=\"seg.percentage\"\n [style.background-color]=\"seg.color\" [talosTooltip]=\"seg.tooltipText\" [tooltipDisabled]=\"!showTooltip()\"\n tooltipPosition=\"top\" role=\"button\" tabindex=\"0\" [attr.aria-label]=\"seg.tooltipText\"\n (mouseenter)=\"onSegmentMouseEnter(seg, $event)\" (mouseleave)=\"onSegmentMouseLeave()\"\n (click)=\"onSegmentClick(seg, $event)\" (keydown.enter)=\"onSegmentClick(seg, $event)\"\n (keydown.space)=\"onSegmentClick(seg, $event)\"></div>\n }\n\n <!-- Marker Needle / Pin Indicator -->\n @if (markerState(); as ms) {\n <div class=\"talos-category-bar-marker\" [class.variant-pill]=\"ms.variant === 'pill'\"\n [class.variant-line]=\"ms.variant === 'line'\" [class.variant-needle]=\"ms.variant === 'needle'\"\n [class.is-hovered]=\"hoveredMarker()\" [style.left.%]=\"ms.percent\" [style.--marker-color]=\"ms.color\"\n [talosTooltip]=\"ms.tooltip\" [tooltipDisabled]=\"!showTooltip()\" tooltipPosition=\"top\" role=\"slider\" tabindex=\"0\"\n [attr.aria-valuenow]=\"markerVal()\" [attr.aria-label]=\"ms.label\" (mouseenter)=\"onMarkerMouseEnter($event)\"\n (mouseleave)=\"onMarkerMouseLeave()\" (click)=\"onMarkerClick($event)\" (keydown.enter)=\"onMarkerClick($event)\"\n (keydown.space)=\"onMarkerClick($event)\">\n <div class=\"talos-category-bar-marker-handle\"></div>\n </div>\n }\n </div>\n</div>\n\n<!-- Bottom Scale Boundary Labels -->\n@if (showLabels() && labelPosition() === 'bottom' && scaleLabels().length > 0) {\n<div class=\"talos-category-bar-labels talos-category-bar-labels-bottom\" aria-hidden=\"true\">\n @for (tick of scaleLabels(); track tick.index; let first = $first; let last = $last) {\n <span class=\"talos-category-bar-label-tick\" [class.is-first]=\"first\" [class.is-last]=\"last\"\n [style.left.%]=\"tick.leftPercent\">\n {{ tick.text }}\n </span>\n }\n</div>\n}\n\n<!-- Optional Legend Row -->\n@if (showLegend() && normalizedSegments().length > 0) {\n<div class=\"talos-category-bar-legend\">\n @for (seg of normalizedSegments(); track seg.index) {\n <div class=\"talos-category-bar-legend-item\" [class.is-hovered]=\"hoveredSegment()?.index === seg.index\"\n [talosTooltip]=\"seg.tooltipText\" [tooltipDisabled]=\"!showTooltip()\" tooltipPosition=\"top\"\n (mouseenter)=\"onSegmentMouseEnter(seg, $event)\" (mouseleave)=\"onSegmentMouseLeave()\"\n (click)=\"onSegmentClick(seg, $event)\">\n <span class=\"legend-dot\" [style.background-color]=\"seg.color\"></span>\n <span class=\"legend-label\">{{ seg.label }}</span>\n <span class=\"legend-value\">{{ seg.formattedValue }}</span>\n </div>\n }\n</div>\n}", styles: [":host{display:block;width:100%;box-sizing:border-box;font-family:inherit;color:var(--talos-text-color, var(--text-color, #0f172a));-webkit-user-select:none;user-select:none}.talos-category-bar-header{margin-bottom:.625rem}.talos-category-bar-header .talos-category-bar-title{font-size:.9375rem;font-weight:700;line-height:1.35;letter-spacing:-.01em;color:var(--talos-text-color, var(--text-color, #0f172a))}.talos-category-bar-header .talos-category-bar-subtitle{font-size:var(--talos-control-font-size, var(--control-font-size, .8125rem));color:var(--talos-text-muted, var(--text-muted, #64748b));margin:.25rem 0 0;line-height:1.4}.talos-category-bar-labels{position:relative;width:100%;height:1.25rem;box-sizing:border-box;pointer-events:none}.talos-category-bar-labels.talos-category-bar-labels-top{margin-bottom:.375rem}.talos-category-bar-labels.talos-category-bar-labels-bottom{margin-top:.375rem}.talos-category-bar-labels .talos-category-bar-label-tick{position:absolute;top:50%;transform:translate(-50%,-50%);font-size:.75rem;font-weight:500;color:var(--talos-text-muted, var(--text-muted, #64748b));white-space:nowrap;line-height:1}.talos-category-bar-labels .talos-category-bar-label-tick.is-first{left:0!important;transform:translateY(-50%)}.talos-category-bar-labels .talos-category-bar-label-tick.is-last{left:100%!important;transform:translate(-100%,-50%)}.talos-category-bar-track-wrapper{position:relative;width:100%;box-sizing:border-box}.talos-category-bar-track{position:relative;display:flex;width:100%;overflow:visible;background-color:var(--talos-category-bar-track-bg, #f1f5f9);box-sizing:border-box;align-items:center}.talos-category-bar-track.size-xs{height:var(--talos-category-bar-height-xs, .25rem)}.talos-category-bar-track.size-sm{height:var(--talos-category-bar-height-sm, .375rem)}.talos-category-bar-track.size-md{height:var(--talos-category-bar-height-md, .5rem)}.talos-category-bar-track.size-lg{height:var(--talos-category-bar-height-lg, .75rem)}.talos-category-bar-track.shape-pill{border-radius:9999px}.talos-category-bar-track.shape-pill .talos-category-bar-segment.is-first{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.talos-category-bar-track.shape-pill .talos-category-bar-segment.is-last{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.talos-category-bar-track.shape-rounded{border-radius:var(--talos-category-bar-border-radius, var(--talos-border-radius, var(--border-radius, .375rem)))}.talos-category-bar-track.shape-rounded .talos-category-bar-segment.is-first{border-top-left-radius:var(--talos-category-bar-border-radius, var(--talos-border-radius, var(--border-radius, .375rem)));border-bottom-left-radius:var(--talos-category-bar-border-radius, var(--talos-border-radius, var(--border-radius, .375rem)))}.talos-category-bar-track.shape-rounded .talos-category-bar-segment.is-last{border-top-right-radius:var(--talos-category-bar-border-radius, var(--talos-border-radius, var(--border-radius, .375rem)));border-bottom-right-radius:var(--talos-category-bar-border-radius, var(--talos-border-radius, var(--border-radius, .375rem)))}.talos-category-bar-track.shape-square{border-radius:0}.talos-category-bar-segment{position:relative;height:100%;flex-shrink:0;cursor:pointer;outline:none;transition:opacity .15s ease,filter .15s ease;box-sizing:border-box;border-right:var(--talos-category-bar-gap, 2px) solid var(--talos-card-bg, var(--card-bg, #ffffff))}.talos-category-bar-segment.is-last{border-right:none}.talos-category-bar-segment:hover,.talos-category-bar-segment.is-hovered{filter:brightness(1.1);z-index:1}.talos-category-bar-segment:focus-visible{box-shadow:var(--talos-focus-ring, var(--focus-ring, 0 0 0 3px rgba(37, 99, 235, .25)));z-index:2}.talos-category-bar-marker{position:absolute;top:50%;transform:translate(-50%,-50%);z-index:5;cursor:pointer;outline:none;display:flex;align-items:center;justify-content:center;transition:left .3s cubic-bezier(.4,0,.2,1),transform .15s ease}.talos-category-bar-marker .talos-category-bar-marker-handle{background-color:var(--marker-color, var(--talos-primary-color, var(--primary-color, #2592eb)));box-shadow:0 0 0 2px var(--talos-category-bar-marker-ring, var(--talos-card-bg, var(--card-bg, #ffffff))),0 2px 6px #0000002e;transition:transform .15s ease,box-shadow .15s ease,filter .15s ease}.talos-category-bar-marker.variant-pill .talos-category-bar-marker-handle{width:5px;height:20px;border-radius:9999px;border:1px solid rgba(255,255,255,.7)}.talos-category-bar-marker.variant-line .talos-category-bar-marker-handle{width:2.5px;height:24px;border-radius:1px;box-shadow:0 0 0 1.5px var(--talos-category-bar-marker-ring, var(--talos-card-bg, #ffffff)),0 2px 4px #00000026}.talos-category-bar-marker.variant-needle .talos-category-bar-marker-handle{width:10px;height:10px;border-radius:50%;border:2px solid #ffffff;box-shadow:0 0 0 2px var(--talos-category-bar-marker-ring, var(--talos-card-bg, #ffffff)),0 2px 6px #0003}.talos-category-bar-marker:hover .talos-category-bar-marker-handle,.talos-category-bar-marker.is-hovered .talos-category-bar-marker-handle{transform:scale(1.2);filter:brightness(1.1);box-shadow:0 0 0 3px var(--talos-category-bar-marker-ring, var(--talos-card-bg, var(--card-bg, #ffffff))),0 2px 8px #00000040}.talos-category-bar-marker:focus-visible .talos-category-bar-marker-handle{box-shadow:var(--talos-focus-ring, var(--focus-ring, 0 0 0 3px rgba(37, 99, 235, .25))),0 0 8px #2563eb66}.talos-category-bar-legend{display:flex;flex-wrap:wrap;align-items:center;gap:.875rem 1.25rem;margin-top:.75rem;font-size:var(--talos-control-font-size, var(--control-font-size, .8125rem))}.talos-category-bar-legend .talos-category-bar-legend-item{display:inline-flex;align-items:center;gap:.375rem;cursor:pointer;color:var(--talos-text-muted, var(--text-muted, #64748b));transition:color .15s ease}.talos-category-bar-legend .talos-category-bar-legend-item .legend-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.talos-category-bar-legend .talos-category-bar-legend-item .legend-label{font-weight:500}.talos-category-bar-legend .talos-category-bar-legend-item .legend-value{font-weight:600;color:var(--talos-text-color, var(--text-color, #0f172a))}.talos-category-bar-legend .talos-category-bar-legend-item:hover,.talos-category-bar-legend .talos-category-bar-legend-item.is-hovered{color:var(--talos-text-color, var(--text-color, #0f172a))}\n"], dependencies: [{ kind: "directive", type: TalosTooltipDirective, selector: "[talosTooltip], [tooltip]", inputs: ["talosTooltip", "tooltip", "tooltipPosition", "tooltipDisabled"] }] });
426
+ }
427
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosCategoryBarComponent, decorators: [{
428
+ type: Component,
429
+ args: [{ selector: 'talos-category-bar', imports: [TalosTooltipDirective], host: {
430
+ 'class': 'talos-category-bar',
431
+ '[class.talos-category-bar-animated]': 'animated()',
432
+ '[class.talos-category-bar-sm]': 'size() === "sm"',
433
+ '[class.talos-category-bar-md]': 'size() === "md"',
434
+ '[class.talos-category-bar-lg]': 'size() === "lg"',
435
+ '[class.talos-category-bar-xs]': 'size() === "xs"',
436
+ '[attr.role]': '"meter"',
437
+ '[attr.aria-valuenow]': 'markerVal()',
438
+ '[attr.aria-valuemin]': 'computedMin()',
439
+ '[attr.aria-valuemax]': 'computedMax()',
440
+ '[attr.aria-label]': 'ariaLabel()'
441
+ }, template: "<!-- Header Block (Title / Subtitle / Custom Header) -->\n@if (title() || subtitle()) {\n<div class=\"talos-category-bar-header\">\n @if (title()) {\n <div class=\"talos-category-bar-title\">{{ title() }}</div>\n }\n @if (subtitle()) {\n <div class=\"talos-category-bar-subtitle\">{{ subtitle() }}</div>\n }\n</div>\n}\n\n<ng-content select=\"[talosCategoryBarHeader]\"></ng-content>\n\n<!-- Top Scale Boundary Labels -->\n@if (showLabels() && labelPosition() === 'top' && scaleLabels().length > 0) {\n<div class=\"talos-category-bar-labels talos-category-bar-labels-top\" aria-hidden=\"true\">\n @for (tick of scaleLabels(); track tick.index; let first = $first; let last = $last) {\n <span class=\"talos-category-bar-label-tick\" [class.is-first]=\"first\" [class.is-last]=\"last\"\n [style.left.%]=\"tick.leftPercent\">\n {{ tick.text }}\n </span>\n }\n</div>\n}\n\n<!-- Main Bar Track Wrapper -->\n<div class=\"talos-category-bar-track-wrapper\">\n <div class=\"talos-category-bar-track\" [class.shape-pill]=\"shape() === 'pill'\"\n [class.shape-rounded]=\"shape() === 'rounded'\" [class.shape-square]=\"shape() === 'square'\"\n [class.size-xs]=\"size() === 'xs'\" [class.size-sm]=\"size() === 'sm'\" [class.size-md]=\"size() === 'md'\"\n [class.size-lg]=\"size() === 'lg'\">\n @for (seg of normalizedSegments(); track seg.index; let first = $first; let last = $last) {\n <div class=\"talos-category-bar-segment\" [class.is-first]=\"first\" [class.is-last]=\"last\"\n [class.is-hovered]=\"hoveredSegment()?.index === seg.index\" [style.width.%]=\"seg.percentage\"\n [style.background-color]=\"seg.color\" [talosTooltip]=\"seg.tooltipText\" [tooltipDisabled]=\"!showTooltip()\"\n tooltipPosition=\"top\" role=\"button\" tabindex=\"0\" [attr.aria-label]=\"seg.tooltipText\"\n (mouseenter)=\"onSegmentMouseEnter(seg, $event)\" (mouseleave)=\"onSegmentMouseLeave()\"\n (click)=\"onSegmentClick(seg, $event)\" (keydown.enter)=\"onSegmentClick(seg, $event)\"\n (keydown.space)=\"onSegmentClick(seg, $event)\"></div>\n }\n\n <!-- Marker Needle / Pin Indicator -->\n @if (markerState(); as ms) {\n <div class=\"talos-category-bar-marker\" [class.variant-pill]=\"ms.variant === 'pill'\"\n [class.variant-line]=\"ms.variant === 'line'\" [class.variant-needle]=\"ms.variant === 'needle'\"\n [class.is-hovered]=\"hoveredMarker()\" [style.left.%]=\"ms.percent\" [style.--marker-color]=\"ms.color\"\n [talosTooltip]=\"ms.tooltip\" [tooltipDisabled]=\"!showTooltip()\" tooltipPosition=\"top\" role=\"slider\" tabindex=\"0\"\n [attr.aria-valuenow]=\"markerVal()\" [attr.aria-label]=\"ms.label\" (mouseenter)=\"onMarkerMouseEnter($event)\"\n (mouseleave)=\"onMarkerMouseLeave()\" (click)=\"onMarkerClick($event)\" (keydown.enter)=\"onMarkerClick($event)\"\n (keydown.space)=\"onMarkerClick($event)\">\n <div class=\"talos-category-bar-marker-handle\"></div>\n </div>\n }\n </div>\n</div>\n\n<!-- Bottom Scale Boundary Labels -->\n@if (showLabels() && labelPosition() === 'bottom' && scaleLabels().length > 0) {\n<div class=\"talos-category-bar-labels talos-category-bar-labels-bottom\" aria-hidden=\"true\">\n @for (tick of scaleLabels(); track tick.index; let first = $first; let last = $last) {\n <span class=\"talos-category-bar-label-tick\" [class.is-first]=\"first\" [class.is-last]=\"last\"\n [style.left.%]=\"tick.leftPercent\">\n {{ tick.text }}\n </span>\n }\n</div>\n}\n\n<!-- Optional Legend Row -->\n@if (showLegend() && normalizedSegments().length > 0) {\n<div class=\"talos-category-bar-legend\">\n @for (seg of normalizedSegments(); track seg.index) {\n <div class=\"talos-category-bar-legend-item\" [class.is-hovered]=\"hoveredSegment()?.index === seg.index\"\n [talosTooltip]=\"seg.tooltipText\" [tooltipDisabled]=\"!showTooltip()\" tooltipPosition=\"top\"\n (mouseenter)=\"onSegmentMouseEnter(seg, $event)\" (mouseleave)=\"onSegmentMouseLeave()\"\n (click)=\"onSegmentClick(seg, $event)\">\n <span class=\"legend-dot\" [style.background-color]=\"seg.color\"></span>\n <span class=\"legend-label\">{{ seg.label }}</span>\n <span class=\"legend-value\">{{ seg.formattedValue }}</span>\n </div>\n }\n</div>\n}", styles: [":host{display:block;width:100%;box-sizing:border-box;font-family:inherit;color:var(--talos-text-color, var(--text-color, #0f172a));-webkit-user-select:none;user-select:none}.talos-category-bar-header{margin-bottom:.625rem}.talos-category-bar-header .talos-category-bar-title{font-size:.9375rem;font-weight:700;line-height:1.35;letter-spacing:-.01em;color:var(--talos-text-color, var(--text-color, #0f172a))}.talos-category-bar-header .talos-category-bar-subtitle{font-size:var(--talos-control-font-size, var(--control-font-size, .8125rem));color:var(--talos-text-muted, var(--text-muted, #64748b));margin:.25rem 0 0;line-height:1.4}.talos-category-bar-labels{position:relative;width:100%;height:1.25rem;box-sizing:border-box;pointer-events:none}.talos-category-bar-labels.talos-category-bar-labels-top{margin-bottom:.375rem}.talos-category-bar-labels.talos-category-bar-labels-bottom{margin-top:.375rem}.talos-category-bar-labels .talos-category-bar-label-tick{position:absolute;top:50%;transform:translate(-50%,-50%);font-size:.75rem;font-weight:500;color:var(--talos-text-muted, var(--text-muted, #64748b));white-space:nowrap;line-height:1}.talos-category-bar-labels .talos-category-bar-label-tick.is-first{left:0!important;transform:translateY(-50%)}.talos-category-bar-labels .talos-category-bar-label-tick.is-last{left:100%!important;transform:translate(-100%,-50%)}.talos-category-bar-track-wrapper{position:relative;width:100%;box-sizing:border-box}.talos-category-bar-track{position:relative;display:flex;width:100%;overflow:visible;background-color:var(--talos-category-bar-track-bg, #f1f5f9);box-sizing:border-box;align-items:center}.talos-category-bar-track.size-xs{height:var(--talos-category-bar-height-xs, .25rem)}.talos-category-bar-track.size-sm{height:var(--talos-category-bar-height-sm, .375rem)}.talos-category-bar-track.size-md{height:var(--talos-category-bar-height-md, .5rem)}.talos-category-bar-track.size-lg{height:var(--talos-category-bar-height-lg, .75rem)}.talos-category-bar-track.shape-pill{border-radius:9999px}.talos-category-bar-track.shape-pill .talos-category-bar-segment.is-first{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.talos-category-bar-track.shape-pill .talos-category-bar-segment.is-last{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.talos-category-bar-track.shape-rounded{border-radius:var(--talos-category-bar-border-radius, var(--talos-border-radius, var(--border-radius, .375rem)))}.talos-category-bar-track.shape-rounded .talos-category-bar-segment.is-first{border-top-left-radius:var(--talos-category-bar-border-radius, var(--talos-border-radius, var(--border-radius, .375rem)));border-bottom-left-radius:var(--talos-category-bar-border-radius, var(--talos-border-radius, var(--border-radius, .375rem)))}.talos-category-bar-track.shape-rounded .talos-category-bar-segment.is-last{border-top-right-radius:var(--talos-category-bar-border-radius, var(--talos-border-radius, var(--border-radius, .375rem)));border-bottom-right-radius:var(--talos-category-bar-border-radius, var(--talos-border-radius, var(--border-radius, .375rem)))}.talos-category-bar-track.shape-square{border-radius:0}.talos-category-bar-segment{position:relative;height:100%;flex-shrink:0;cursor:pointer;outline:none;transition:opacity .15s ease,filter .15s ease;box-sizing:border-box;border-right:var(--talos-category-bar-gap, 2px) solid var(--talos-card-bg, var(--card-bg, #ffffff))}.talos-category-bar-segment.is-last{border-right:none}.talos-category-bar-segment:hover,.talos-category-bar-segment.is-hovered{filter:brightness(1.1);z-index:1}.talos-category-bar-segment:focus-visible{box-shadow:var(--talos-focus-ring, var(--focus-ring, 0 0 0 3px rgba(37, 99, 235, .25)));z-index:2}.talos-category-bar-marker{position:absolute;top:50%;transform:translate(-50%,-50%);z-index:5;cursor:pointer;outline:none;display:flex;align-items:center;justify-content:center;transition:left .3s cubic-bezier(.4,0,.2,1),transform .15s ease}.talos-category-bar-marker .talos-category-bar-marker-handle{background-color:var(--marker-color, var(--talos-primary-color, var(--primary-color, #2592eb)));box-shadow:0 0 0 2px var(--talos-category-bar-marker-ring, var(--talos-card-bg, var(--card-bg, #ffffff))),0 2px 6px #0000002e;transition:transform .15s ease,box-shadow .15s ease,filter .15s ease}.talos-category-bar-marker.variant-pill .talos-category-bar-marker-handle{width:5px;height:20px;border-radius:9999px;border:1px solid rgba(255,255,255,.7)}.talos-category-bar-marker.variant-line .talos-category-bar-marker-handle{width:2.5px;height:24px;border-radius:1px;box-shadow:0 0 0 1.5px var(--talos-category-bar-marker-ring, var(--talos-card-bg, #ffffff)),0 2px 4px #00000026}.talos-category-bar-marker.variant-needle .talos-category-bar-marker-handle{width:10px;height:10px;border-radius:50%;border:2px solid #ffffff;box-shadow:0 0 0 2px var(--talos-category-bar-marker-ring, var(--talos-card-bg, #ffffff)),0 2px 6px #0003}.talos-category-bar-marker:hover .talos-category-bar-marker-handle,.talos-category-bar-marker.is-hovered .talos-category-bar-marker-handle{transform:scale(1.2);filter:brightness(1.1);box-shadow:0 0 0 3px var(--talos-category-bar-marker-ring, var(--talos-card-bg, var(--card-bg, #ffffff))),0 2px 8px #00000040}.talos-category-bar-marker:focus-visible .talos-category-bar-marker-handle{box-shadow:var(--talos-focus-ring, var(--focus-ring, 0 0 0 3px rgba(37, 99, 235, .25))),0 0 8px #2563eb66}.talos-category-bar-legend{display:flex;flex-wrap:wrap;align-items:center;gap:.875rem 1.25rem;margin-top:.75rem;font-size:var(--talos-control-font-size, var(--control-font-size, .8125rem))}.talos-category-bar-legend .talos-category-bar-legend-item{display:inline-flex;align-items:center;gap:.375rem;cursor:pointer;color:var(--talos-text-muted, var(--text-muted, #64748b));transition:color .15s ease}.talos-category-bar-legend .talos-category-bar-legend-item .legend-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.talos-category-bar-legend .talos-category-bar-legend-item .legend-label{font-weight:500}.talos-category-bar-legend .talos-category-bar-legend-item .legend-value{font-weight:600;color:var(--talos-text-color, var(--text-color, #0f172a))}.talos-category-bar-legend .talos-category-bar-legend-item:hover,.talos-category-bar-legend .talos-category-bar-legend-item.is-hovered{color:var(--talos-text-color, var(--text-color, #0f172a))}\n"] }]
442
+ }], propDecorators: { values: [{ type: i0.Input, args: [{ isSignal: true, alias: "values", required: false }] }], categories: [{ type: i0.Input, args: [{ isSignal: true, alias: "categories", required: false }] }], colors: [{ type: i0.Input, args: [{ isSignal: true, alias: "colors", required: false }] }], markerValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "markerValue", required: false }] }], marker: [{ type: i0.Input, args: [{ isSignal: true, alias: "marker", required: false }] }], minValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "minValue", required: false }] }], maxValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxValue", required: false }] }], showLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLabels", required: false }] }], labels: [{ type: i0.Input, args: [{ isSignal: true, alias: "labels", required: false }] }], labelPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelPosition", required: false }] }], labelFormatter: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelFormatter", required: false }] }], valueFormatter: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueFormatter", required: false }] }], markerFormatter: [{ type: i0.Input, args: [{ isSignal: true, alias: "markerFormatter", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], shape: [{ type: i0.Input, args: [{ isSignal: true, alias: "shape", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], showLegend: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLegend", required: false }] }], showTooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTooltip", required: false }] }], animated: [{ type: i0.Input, args: [{ isSignal: true, alias: "animated", required: false }] }], segmentClick: [{ type: i0.Output, args: ["segmentClick"] }], markerClick: [{ type: i0.Output, args: ["markerClick"] }], segmentHover: [{ type: i0.Output, args: ["segmentHover"] }] } });
443
+
444
+ class TalosCategoryBarModule {
445
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosCategoryBarModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
446
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.1.1", ngImport: i0, type: TalosCategoryBarModule, imports: [TalosCategoryBarComponent], exports: [TalosCategoryBarComponent] });
447
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosCategoryBarModule });
448
+ }
449
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosCategoryBarModule, decorators: [{
450
+ type: NgModule,
451
+ args: [{
452
+ imports: [TalosCategoryBarComponent],
453
+ exports: [TalosCategoryBarComponent]
454
+ }]
455
+ }] });
456
+
457
+ /**
458
+ * Generated bundle index. Do not edit.
459
+ */
460
+
461
+ export { TalosCategoryBarComponent, TalosCategoryBarModule };
462
+ //# sourceMappingURL=weeehaoooz-talos-ui-data-viz-category-bar.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weeehaoooz-talos-ui-data-viz-category-bar.mjs","sources":["../../../projects/talos-ui/data-viz/category-bar/category-bar.types.ts","../../../projects/talos-ui/data-viz/category-bar/category-bar.component.ts","../../../projects/talos-ui/data-viz/category-bar/category-bar.component.html","../../../projects/talos-ui/data-viz/category-bar/category-bar.module.ts","../../../projects/talos-ui/data-viz/category-bar/weeehaoooz-talos-ui-data-viz-category-bar.ts"],"sourcesContent":["/**\n * Talos Category Bar Type Definitions\n */\n\nexport type CategoryBarSize = 'xs' | 'sm' | 'md' | 'lg';\n\nexport type CategoryBarShape = 'pill' | 'rounded' | 'square';\n\nexport type CategoryBarLabelPosition = 'top' | 'bottom' | 'none';\n\nexport type CategoryBarColorScheme =\n | 'blue'\n | 'emerald'\n | 'violet'\n | 'amber'\n | 'rose'\n | 'cyan'\n | 'lime'\n | 'indigo'\n | 'pink'\n | 'orange'\n | 'fuchsia'\n | 'teal'\n | 'sky'\n | 'red'\n | 'slate'\n | 'purple';\n\n/**\n * Individual category segment definition for the category bar.\n */\nexport interface CategoryBarSegment {\n /** Segment numeric value (width will be proportional to value / sum(values)) */\n value: number;\n /** Human-readable category label (displayed in tooltip, legend, or accessibility text) */\n label?: string;\n /** Specific CSS color string (e.g. '#3b82f6', 'rgb(59, 130, 246)', 'var(--talos-primary-color)') */\n color?: string;\n /** Named color scheme preset (e.g. 'blue', 'emerald', 'violet', 'amber', 'rose', etc.) */\n colorScheme?: CategoryBarColorScheme | string;\n /** Custom tooltip text or template text */\n tooltip?: string;\n /** Optional metadata passed to click and hover events */\n meta?: Record<string, unknown>;\n}\n\n/**\n * Marker needle definition for the category bar.\n */\nexport interface CategoryBarMarker {\n /** Numeric value indicating where the marker sits along the range */\n value: number;\n /** Custom label displayed for the marker (e.g. 'Target: $220k', 'Current: 220') */\n label?: string;\n /** Custom marker color (defaults to neutral dark/white or category color) */\n color?: string;\n /** Custom tooltip content for the marker */\n tooltip?: string;\n /** Whether to animate marker position changes (defaults to true) */\n showAnimation?: boolean;\n /** Custom marker shape / style ('pill' | 'line' | 'pin' | 'needle') */\n variant?: 'pill' | 'line' | 'pin' | 'needle';\n}\n\n/**\n * Normalized computed segment model used internally by the template.\n */\nexport interface CategoryBarComputedSegment {\n index: number;\n value: number;\n label: string;\n color: string;\n percentage: number;\n cumulativeStart: number;\n cumulativeEnd: number;\n cumulativeStartPercent: number;\n cumulativeEndPercent: number;\n formattedValue: string;\n tooltipText: string;\n raw: CategoryBarSegment;\n}\n\n/**\n * Scale boundary label item.\n */\nexport interface CategoryBarScaleLabel {\n index: number;\n value: number;\n text: string;\n leftPercent: number;\n}\n\n/**\n * Event emitted when a segment is clicked.\n */\nexport interface CategoryBarSegmentClickEvent {\n segment: CategoryBarComputedSegment;\n index: number;\n event: Event;\n}\n\nexport type CategoryBarClickEvent = CategoryBarSegmentClickEvent;\n\n/**\n * Event emitted when the marker is clicked.\n */\nexport interface CategoryBarMarkerClickEvent {\n marker: CategoryBarMarker;\n value: number;\n percent: number;\n event: Event;\n}\n","import {\n Component,\n ElementRef,\n computed,\n inject,\n input,\n output,\n signal\n} from '@angular/core';\nimport { TalosTooltipDirective } from '@weeehaoooz/talos-ui/feedback/tooltip';\n\nimport {\n CategoryBarColorScheme,\n CategoryBarComputedSegment,\n CategoryBarLabelPosition,\n CategoryBarMarker,\n CategoryBarMarkerClickEvent,\n CategoryBarScaleLabel,\n CategoryBarSegment,\n CategoryBarSegmentClickEvent,\n CategoryBarShape,\n CategoryBarSize\n} from './category-bar.types';\n\nconst PRESET_PALETTE: Record<string, string> = {\n blue: '#3b82f6',\n emerald: '#10b981',\n violet: '#8b5cf6',\n purple: '#9333ea',\n amber: '#f59e0b',\n orange: '#f97316',\n rose: '#f43f5e',\n pink: '#ec4899',\n cyan: '#06b6d4',\n lime: '#84cc16',\n indigo: '#6366f1',\n teal: '#14b8a6',\n sky: '#0284c7',\n red: '#ef4444',\n slate: '#64748b'\n};\n\nconst DEFAULT_COLOR_ORDER: string[] = [\n '#3b82f6', // blue\n '#10b981', // emerald\n '#8b5cf6', // violet\n '#f59e0b', // amber\n '#ec4899', // pink\n '#06b6d4', // cyan\n '#84cc16', // lime\n '#f97316', // orange\n '#6366f1', // indigo\n '#14b8a6' // teal\n];\n\n@Component({\n selector: 'talos-category-bar',\n imports: [TalosTooltipDirective],\n templateUrl: './category-bar.component.html',\n styleUrl: './category-bar.component.scss',\n host: {\n 'class': 'talos-category-bar',\n '[class.talos-category-bar-animated]': 'animated()',\n '[class.talos-category-bar-sm]': 'size() === \"sm\"',\n '[class.talos-category-bar-md]': 'size() === \"md\"',\n '[class.talos-category-bar-lg]': 'size() === \"lg\"',\n '[class.talos-category-bar-xs]': 'size() === \"xs\"',\n '[attr.role]': '\"meter\"',\n '[attr.aria-valuenow]': 'markerVal()',\n '[attr.aria-valuemin]': 'computedMin()',\n '[attr.aria-valuemax]': 'computedMax()',\n '[attr.aria-label]': 'ariaLabel()'\n }\n})\nexport class TalosCategoryBarComponent {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * Simple numeric values array for each category (e.g. [120, 80, 60, 40]).\n */\n readonly values = input<number[] | null>(null);\n\n /**\n * Detailed category segments with labels, colors, and metadata.\n */\n readonly categories = input<CategoryBarSegment[] | null>(null);\n\n /**\n * Custom palette or color list for segments. Can be CSS color strings or preset names.\n */\n readonly colors = input<string[]>(DEFAULT_COLOR_ORDER);\n\n /**\n * Numeric position for the needle marker.\n */\n readonly markerValue = input<number | null>(null);\n\n /**\n * Detailed marker object definition.\n */\n readonly marker = input<CategoryBarMarker | null>(null);\n\n /**\n * Minimum scale bound (defaults to 0).\n */\n readonly minValue = input<number | null>(null);\n\n /**\n * Maximum scale bound (defaults to sum of all category values).\n */\n readonly maxValue = input<number | null>(null);\n\n /**\n * Whether to show category scale labels at segment boundaries.\n */\n readonly showLabels = input<boolean>(true);\n\n /**\n * Custom boundary label strings. If not provided, computed cumulative values are shown.\n */\n readonly labels = input<string[] | null>(null);\n\n /**\n * Placement of scale boundary labels: 'top', 'bottom', or 'none'.\n */\n readonly labelPosition = input<CategoryBarLabelPosition>('top');\n\n /**\n * Custom label formatter function for boundary values.\n */\n readonly labelFormatter = input<((value: number, index: number) => string) | null>(null);\n\n /**\n * Custom value formatter for segment tooltip / legends.\n */\n readonly valueFormatter = input<((value: number) => string) | null>(null);\n\n /**\n * Custom marker value formatter for tooltip.\n */\n readonly markerFormatter = input<((value: number) => string) | null>(null);\n\n /**\n * Height size variant of the category bar: 'xs' (6px), 'sm' (8px), 'md' (12px), 'lg' (16px).\n */\n readonly size = input<CategoryBarSize>('md');\n\n /**\n * Corner shape of the bar: 'pill' (fully rounded capsule), 'rounded' (6px), 'square' (0px).\n */\n readonly shape = input<CategoryBarShape>('pill');\n\n /**\n * Optional title above the bar.\n */\n readonly title = input<string>('');\n\n /**\n * Optional subtitle below the title.\n */\n readonly subtitle = input<string>('');\n\n /**\n * Whether to display a bottom legend row with category names and color indicators.\n */\n readonly showLegend = input<boolean>(false);\n\n /**\n * Whether hovering segments or marker displays interactive tooltips.\n */\n readonly showTooltip = input<boolean>(true);\n\n /**\n * Enable smooth CSS transition animation.\n */\n readonly animated = input<boolean>(true);\n\n /**\n * Output event when a segment is clicked.\n */\n readonly segmentClick = output<CategoryBarSegmentClickEvent>();\n\n /**\n * Output event when the marker is clicked.\n */\n readonly markerClick = output<CategoryBarMarkerClickEvent>();\n\n /**\n * Output event when a segment is hovered.\n */\n readonly segmentHover = output<CategoryBarComputedSegment | null>();\n\n // Internal reactive hover states\n protected readonly hoveredSegment = signal<CategoryBarComputedSegment | null>(null);\n protected readonly hoveredMarker = signal<boolean>(false);\n protected readonly tooltipPosition = signal<{ x: number; y: number } | null>(null);\n\n /**\n * Resolves raw category items from either `categories` or `values` input.\n */\n private readonly rawCategories = computed<CategoryBarSegment[]>(() => {\n const cats = this.categories();\n if (cats && cats.length > 0) {\n return cats;\n }\n const vals = this.values();\n if (vals && vals.length > 0) {\n return vals.map((val, idx) => ({\n value: val,\n label: `Category ${idx + 1}`\n }));\n }\n return [];\n });\n\n /**\n * Resolved color array mapping named color presets to hex codes if needed.\n */\n private readonly resolvedPalette = computed<string[]>(() => {\n const customColors = this.colors();\n if (customColors && customColors.length > 0) {\n return customColors.map(c => PRESET_PALETTE[c] || c);\n }\n return DEFAULT_COLOR_ORDER;\n });\n\n /**\n * Total sum of all positive category values.\n */\n protected readonly totalSum = computed<number>(() => {\n const raw = this.rawCategories();\n return raw.reduce((sum, item) => sum + Math.max(0, item.value || 0), 0);\n });\n\n /**\n * Computed minimum boundary.\n */\n protected readonly computedMin = computed<number>(() => {\n const customMin = this.minValue();\n return customMin !== null ? customMin : 0;\n });\n\n /**\n * Computed maximum boundary.\n */\n protected readonly computedMax = computed<number>(() => {\n const customMax = this.maxValue();\n if (customMax !== null) {\n return customMax;\n }\n const sum = this.totalSum();\n return sum > 0 ? sum : 100;\n });\n\n /**\n * Normalized computed segments for rendering with cumulative positions and percentages.\n */\n protected readonly normalizedSegments = computed<CategoryBarComputedSegment[]>(() => {\n const raw = this.rawCategories();\n const total = this.totalSum();\n const palette = this.resolvedPalette();\n const vFormatter = this.valueFormatter();\n\n if (raw.length === 0 || total <= 0) {\n return [];\n }\n\n let cumulative = 0;\n\n return raw.map((item, index) => {\n const val = Math.max(0, item.value || 0);\n const percentage = (val / total) * 100;\n const start = cumulative;\n const end = cumulative + val;\n const startPercent = (start / total) * 100;\n const endPercent = (end / total) * 100;\n cumulative = end;\n\n // Color resolution\n let color = item.color;\n if (!color && item.colorScheme) {\n color = PRESET_PALETTE[item.colorScheme] || item.colorScheme;\n }\n if (!color) {\n color = palette[index % palette.length];\n }\n\n const formattedVal = vFormatter ? vFormatter(val) : val.toLocaleString();\n const label = item.label || `Category ${index + 1}`;\n const tooltipText = item.tooltip || `${label}: ${formattedVal} (${percentage.toFixed(1)}%)`;\n\n return {\n index,\n value: val,\n label,\n color,\n percentage,\n cumulativeStart: start,\n cumulativeEnd: end,\n cumulativeStartPercent: startPercent,\n cumulativeEndPercent: endPercent,\n formattedValue: formattedVal,\n tooltipText,\n raw: item\n };\n });\n });\n\n /**\n * Computed scale boundary labels positioned at tick intersections.\n */\n protected readonly scaleLabels = computed<CategoryBarScaleLabel[]>(() => {\n if (!this.showLabels() || this.labelPosition() === 'none') {\n return [];\n }\n\n const customLabels = this.labels();\n const segments = this.normalizedSegments();\n const lFormatter = this.labelFormatter();\n const min = this.computedMin();\n const max = this.computedMax();\n\n if (customLabels && customLabels.length > 0) {\n const count = customLabels.length;\n return customLabels.map((text, index) => {\n const leftPercent = count > 1 ? (index / (count - 1)) * 100 : 0;\n return {\n index,\n value: min + ((max - min) * leftPercent) / 100,\n text,\n leftPercent\n };\n });\n }\n\n if (segments.length === 0) {\n return [];\n }\n\n // Generate boundary ticks: [0, seg1.end, seg2.end, ...]\n const ticks: CategoryBarScaleLabel[] = [];\n\n // Start tick (0 / min)\n const startVal = min;\n const startText = lFormatter ? lFormatter(startVal, 0) : startVal.toLocaleString();\n ticks.push({\n index: 0,\n value: startVal,\n text: startText,\n leftPercent: 0\n });\n\n segments.forEach((seg, idx) => {\n const val = seg.cumulativeEnd;\n const text = lFormatter ? lFormatter(val, idx + 1) : val.toLocaleString();\n ticks.push({\n index: idx + 1,\n value: val,\n text,\n leftPercent: seg.cumulativeEndPercent\n });\n });\n\n return ticks;\n });\n\n /**\n * Resolved marker value.\n */\n protected readonly markerVal = computed<number | null>(() => {\n const m = this.marker();\n if (m && typeof m.value === 'number') {\n return m.value;\n }\n const mv = this.markerValue();\n return typeof mv === 'number' ? mv : null;\n });\n\n /**\n * Marker needle placement and metadata.\n */\n protected readonly markerState = computed<{\n visible: boolean;\n percent: number;\n color: string;\n label: string;\n tooltip: string;\n variant: 'pill' | 'line' | 'pin' | 'needle';\n } | null>(() => {\n const val = this.markerVal();\n if (val === null) {\n return null;\n }\n\n const min = this.computedMin();\n const max = this.computedMax();\n const span = max - min;\n if (span <= 0) {\n return null;\n }\n\n const rawPercent = ((val - min) / span) * 100;\n const clampedPercent = Math.max(0, Math.min(100, rawPercent));\n\n const m = this.marker();\n const mFormatter = this.markerFormatter();\n const formattedVal = mFormatter ? mFormatter(val) : val.toLocaleString();\n\n // Pick marker color: custom marker color -> category color at that position -> primary accent\n let color = m?.color;\n if (!color) {\n const segments = this.normalizedSegments();\n const currentSegment = segments.find(\n s => clampedPercent >= s.cumulativeStartPercent && clampedPercent <= s.cumulativeEndPercent\n );\n color = currentSegment ? currentSegment.color : '#6366f1';\n }\n\n const label = m?.label || `Marker: ${formattedVal}`;\n const tooltip = m?.tooltip || `${label} (${clampedPercent.toFixed(1)}%)`;\n const variant = m?.variant || 'pill';\n\n return {\n visible: true,\n percent: clampedPercent,\n color,\n label,\n tooltip,\n variant\n };\n });\n\n /**\n * Accessible description for screen readers.\n */\n protected readonly ariaLabel = computed<string>(() => {\n const t = this.title();\n const mVal = this.markerVal();\n const total = this.totalSum();\n if (t) {\n return `${t}, Total: ${total}${mVal !== null ? `, Current Marker: ${mVal}` : ''}`;\n }\n return `Category bar with ${this.rawCategories().length} categories, Total: ${total}`;\n });\n\n // Event handlers\n onSegmentClick(seg: CategoryBarComputedSegment, event: Event): void {\n this.segmentClick.emit({\n segment: seg,\n index: seg.index,\n event\n });\n }\n\n onSegmentMouseEnter(seg: CategoryBarComputedSegment, event: MouseEvent): void {\n this.hoveredSegment.set(seg);\n this.segmentHover.emit(seg);\n this.updateTooltipPos(event);\n }\n\n onSegmentMouseLeave(): void {\n this.hoveredSegment.set(null);\n this.segmentHover.emit(null);\n }\n\n onMarkerMouseEnter(event: MouseEvent): void {\n this.hoveredMarker.set(true);\n this.updateTooltipPos(event);\n }\n\n onMarkerMouseLeave(): void {\n this.hoveredMarker.set(false);\n }\n\n onMarkerClick(event: Event): void {\n const ms = this.markerState();\n const mVal = this.markerVal();\n if (ms && mVal !== null) {\n const mObj: CategoryBarMarker = this.marker() || { value: mVal };\n this.markerClick.emit({\n marker: mObj,\n value: mVal,\n percent: ms.percent,\n event\n });\n }\n }\n\n private updateTooltipPos(event: MouseEvent): void {\n const hostEl = this.elementRef.nativeElement;\n const rect = hostEl.getBoundingClientRect();\n this.tooltipPosition.set({\n x: event.clientX - rect.left,\n y: event.clientY - rect.top\n });\n }\n}\n","<!-- Header Block (Title / Subtitle / Custom Header) -->\n@if (title() || subtitle()) {\n<div class=\"talos-category-bar-header\">\n @if (title()) {\n <div class=\"talos-category-bar-title\">{{ title() }}</div>\n }\n @if (subtitle()) {\n <div class=\"talos-category-bar-subtitle\">{{ subtitle() }}</div>\n }\n</div>\n}\n\n<ng-content select=\"[talosCategoryBarHeader]\"></ng-content>\n\n<!-- Top Scale Boundary Labels -->\n@if (showLabels() && labelPosition() === 'top' && scaleLabels().length > 0) {\n<div class=\"talos-category-bar-labels talos-category-bar-labels-top\" aria-hidden=\"true\">\n @for (tick of scaleLabels(); track tick.index; let first = $first; let last = $last) {\n <span class=\"talos-category-bar-label-tick\" [class.is-first]=\"first\" [class.is-last]=\"last\"\n [style.left.%]=\"tick.leftPercent\">\n {{ tick.text }}\n </span>\n }\n</div>\n}\n\n<!-- Main Bar Track Wrapper -->\n<div class=\"talos-category-bar-track-wrapper\">\n <div class=\"talos-category-bar-track\" [class.shape-pill]=\"shape() === 'pill'\"\n [class.shape-rounded]=\"shape() === 'rounded'\" [class.shape-square]=\"shape() === 'square'\"\n [class.size-xs]=\"size() === 'xs'\" [class.size-sm]=\"size() === 'sm'\" [class.size-md]=\"size() === 'md'\"\n [class.size-lg]=\"size() === 'lg'\">\n @for (seg of normalizedSegments(); track seg.index; let first = $first; let last = $last) {\n <div class=\"talos-category-bar-segment\" [class.is-first]=\"first\" [class.is-last]=\"last\"\n [class.is-hovered]=\"hoveredSegment()?.index === seg.index\" [style.width.%]=\"seg.percentage\"\n [style.background-color]=\"seg.color\" [talosTooltip]=\"seg.tooltipText\" [tooltipDisabled]=\"!showTooltip()\"\n tooltipPosition=\"top\" role=\"button\" tabindex=\"0\" [attr.aria-label]=\"seg.tooltipText\"\n (mouseenter)=\"onSegmentMouseEnter(seg, $event)\" (mouseleave)=\"onSegmentMouseLeave()\"\n (click)=\"onSegmentClick(seg, $event)\" (keydown.enter)=\"onSegmentClick(seg, $event)\"\n (keydown.space)=\"onSegmentClick(seg, $event)\"></div>\n }\n\n <!-- Marker Needle / Pin Indicator -->\n @if (markerState(); as ms) {\n <div class=\"talos-category-bar-marker\" [class.variant-pill]=\"ms.variant === 'pill'\"\n [class.variant-line]=\"ms.variant === 'line'\" [class.variant-needle]=\"ms.variant === 'needle'\"\n [class.is-hovered]=\"hoveredMarker()\" [style.left.%]=\"ms.percent\" [style.--marker-color]=\"ms.color\"\n [talosTooltip]=\"ms.tooltip\" [tooltipDisabled]=\"!showTooltip()\" tooltipPosition=\"top\" role=\"slider\" tabindex=\"0\"\n [attr.aria-valuenow]=\"markerVal()\" [attr.aria-label]=\"ms.label\" (mouseenter)=\"onMarkerMouseEnter($event)\"\n (mouseleave)=\"onMarkerMouseLeave()\" (click)=\"onMarkerClick($event)\" (keydown.enter)=\"onMarkerClick($event)\"\n (keydown.space)=\"onMarkerClick($event)\">\n <div class=\"talos-category-bar-marker-handle\"></div>\n </div>\n }\n </div>\n</div>\n\n<!-- Bottom Scale Boundary Labels -->\n@if (showLabels() && labelPosition() === 'bottom' && scaleLabels().length > 0) {\n<div class=\"talos-category-bar-labels talos-category-bar-labels-bottom\" aria-hidden=\"true\">\n @for (tick of scaleLabels(); track tick.index; let first = $first; let last = $last) {\n <span class=\"talos-category-bar-label-tick\" [class.is-first]=\"first\" [class.is-last]=\"last\"\n [style.left.%]=\"tick.leftPercent\">\n {{ tick.text }}\n </span>\n }\n</div>\n}\n\n<!-- Optional Legend Row -->\n@if (showLegend() && normalizedSegments().length > 0) {\n<div class=\"talos-category-bar-legend\">\n @for (seg of normalizedSegments(); track seg.index) {\n <div class=\"talos-category-bar-legend-item\" [class.is-hovered]=\"hoveredSegment()?.index === seg.index\"\n [talosTooltip]=\"seg.tooltipText\" [tooltipDisabled]=\"!showTooltip()\" tooltipPosition=\"top\"\n (mouseenter)=\"onSegmentMouseEnter(seg, $event)\" (mouseleave)=\"onSegmentMouseLeave()\"\n (click)=\"onSegmentClick(seg, $event)\">\n <span class=\"legend-dot\" [style.background-color]=\"seg.color\"></span>\n <span class=\"legend-label\">{{ seg.label }}</span>\n <span class=\"legend-value\">{{ seg.formattedValue }}</span>\n </div>\n }\n</div>\n}","import { NgModule } from '@angular/core';\nimport { TalosCategoryBarComponent } from './category-bar.component';\n\n@NgModule({\n imports: [TalosCategoryBarComponent],\n exports: [TalosCategoryBarComponent]\n})\nexport class TalosCategoryBarModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}