@sentropic/design-system-angular 0.37.0 → 0.38.1

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 (318) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSE.THIRD-PARTY.md +110 -0
  3. package/dist/Accordion.js +3 -3
  4. package/dist/Alert.js +3 -3
  5. package/dist/AnomalySwimLaneChart.js +3 -3
  6. package/dist/AppChrome.js +3 -3
  7. package/dist/AppHeader.js +3 -3
  8. package/dist/AppShell.js +3 -3
  9. package/dist/ArcDiagramChart.d.ts +3 -1
  10. package/dist/ArcDiagramChart.d.ts.map +1 -1
  11. package/dist/ArcDiagramChart.js +9 -23
  12. package/dist/ArcDiagramChart.js.map +1 -1
  13. package/dist/AreaChart.js +3 -3
  14. package/dist/AreaRangeChart.js +3 -3
  15. package/dist/AreaSplineRangeChart.js +3 -3
  16. package/dist/AspectRatio.js +3 -3
  17. package/dist/Autosave.js +3 -3
  18. package/dist/Avatar.js +3 -3
  19. package/dist/AvatarGroup.js +3 -3
  20. package/dist/BackToTop.js +3 -3
  21. package/dist/Badge.js +3 -3
  22. package/dist/BarChart.js +3 -3
  23. package/dist/BellCurveChart.js +5 -5
  24. package/dist/BoxPlotChart.js +3 -3
  25. package/dist/Breadcrumb.js +3 -3
  26. package/dist/BulletChart.js +5 -5
  27. package/dist/BumpChart.js +5 -5
  28. package/dist/Button.d.ts +5 -1
  29. package/dist/Button.d.ts.map +1 -1
  30. package/dist/Button.js +15 -3
  31. package/dist/Button.js.map +1 -1
  32. package/dist/ButtonGroup.js +3 -3
  33. package/dist/Calendar.d.ts +12 -1
  34. package/dist/Calendar.d.ts.map +1 -1
  35. package/dist/Calendar.js +27 -3
  36. package/dist/Calendar.js.map +1 -1
  37. package/dist/CalendarHeatmapChart.d.ts.map +1 -1
  38. package/dist/CalendarHeatmapChart.js +27 -25
  39. package/dist/CalendarHeatmapChart.js.map +1 -1
  40. package/dist/CandlestickChart.js +3 -3
  41. package/dist/Card.js +3 -3
  42. package/dist/ChatComposer.js +3 -3
  43. package/dist/ChatMessage.js +3 -3
  44. package/dist/ChatThread.js +3 -3
  45. package/dist/Checkbox.d.ts +3 -1
  46. package/dist/Checkbox.d.ts.map +1 -1
  47. package/dist/Checkbox.js +9 -3
  48. package/dist/Checkbox.js.map +1 -1
  49. package/dist/CheckboxGroup.js +3 -3
  50. package/dist/ChordDiagram.js +3 -3
  51. package/dist/CodeSnippet.js +3 -3
  52. package/dist/Col.js +3 -3
  53. package/dist/Collapsible.js +3 -3
  54. package/dist/ColorScaleBar.js +3 -3
  55. package/dist/ColorSwatch.js +3 -3
  56. package/dist/ColumnPyramidChart.js +3 -3
  57. package/dist/ColumnRangeChart.js +3 -3
  58. package/dist/ComboChart.js +3 -3
  59. package/dist/Combobox.js +3 -3
  60. package/dist/ConfigItemCard.js +3 -3
  61. package/dist/Container.js +3 -3
  62. package/dist/ContentSwitcher.js +3 -3
  63. package/dist/ContextPanel.js +3 -3
  64. package/dist/ContourChart.d.ts.map +1 -1
  65. package/dist/ContourChart.js +51 -45
  66. package/dist/ContourChart.js.map +1 -1
  67. package/dist/CopyButton.js +3 -3
  68. package/dist/Dashboard.js +3 -3
  69. package/dist/DashboardGrid.js +3 -3
  70. package/dist/DataImage.js +3 -3
  71. package/dist/DataTable.js +3 -3
  72. package/dist/DatePicker.js +3 -3
  73. package/dist/DecompositionTreeChart.js +3 -3
  74. package/dist/Density2DChart.js +3 -3
  75. package/dist/DependencyWheelChart.d.ts +3 -1
  76. package/dist/DependencyWheelChart.d.ts.map +1 -1
  77. package/dist/DependencyWheelChart.js +9 -23
  78. package/dist/DependencyWheelChart.js.map +1 -1
  79. package/dist/DisplaySettings.js +3 -3
  80. package/dist/DivergentBarChart.js +3 -3
  81. package/dist/Divider.js +3 -3
  82. package/dist/DonutChart.js +3 -3
  83. package/dist/Drawer.js +3 -3
  84. package/dist/Dropdown.js +3 -3
  85. package/dist/DumbbellChart.js +5 -5
  86. package/dist/Embed.js +3 -3
  87. package/dist/EmptyState.js +3 -3
  88. package/dist/ErrorBarChart.js +3 -3
  89. package/dist/ErrorSummary.js +3 -3
  90. package/dist/EventFeedPanel.js +5 -5
  91. package/dist/FieldCard.js +3 -3
  92. package/dist/FileUploader.js +3 -3
  93. package/dist/FilterBar.js +3 -3
  94. package/dist/FilterPill.js +3 -3
  95. package/dist/FlamegraphChart.js +3 -3
  96. package/dist/Flex.js +3 -3
  97. package/dist/Footer.js +3 -3
  98. package/dist/ForceGraph.js +3 -3
  99. package/dist/Form.js +3 -3
  100. package/dist/FormGroup.js +3 -3
  101. package/dist/FunnelChart.js +3 -3
  102. package/dist/GanttChart.js +3 -3
  103. package/dist/GaugeChart.js +3 -3
  104. package/dist/GeoChart.js +5 -5
  105. package/dist/GraphLegend.js +3 -3
  106. package/dist/Grid.js +3 -3
  107. package/dist/HLCChart.js +3 -3
  108. package/dist/Header.js +3 -3
  109. package/dist/HeatmapChart.d.ts.map +1 -1
  110. package/dist/HeatmapChart.js +51 -45
  111. package/dist/HeatmapChart.js.map +1 -1
  112. package/dist/HeikinAshiChart.js +3 -3
  113. package/dist/Hidden.js +3 -3
  114. package/dist/Highlight.js +3 -3
  115. package/dist/HistogramChart.js +3 -3
  116. package/dist/HollowCandlestickChart.js +3 -3
  117. package/dist/Icon.d.ts +7 -2
  118. package/dist/Icon.d.ts.map +1 -1
  119. package/dist/Icon.js +57 -4
  120. package/dist/Icon.js.map +1 -1
  121. package/dist/IconButton.js +3 -3
  122. package/dist/IdentityMenu.js +3 -3
  123. package/dist/Inline.d.ts +16 -1
  124. package/dist/Inline.d.ts.map +1 -1
  125. package/dist/Inline.js +36 -5
  126. package/dist/Inline.js.map +1 -1
  127. package/dist/InlineLoading.js +3 -3
  128. package/dist/Input.d.ts +3 -1
  129. package/dist/Input.d.ts.map +1 -1
  130. package/dist/Input.js +9 -3
  131. package/dist/Input.js.map +1 -1
  132. package/dist/ItemChart.js +3 -3
  133. package/dist/KanbanBoard.js +3 -3
  134. package/dist/KpiCard.d.ts.map +1 -1
  135. package/dist/KpiCard.js +9 -4
  136. package/dist/KpiCard.js.map +1 -1
  137. package/dist/LanguageSelector.js +3 -3
  138. package/dist/LanguageToggle.js +3 -3
  139. package/dist/LineChart.d.ts +12 -0
  140. package/dist/LineChart.d.ts.map +1 -1
  141. package/dist/LineChart.js +15 -6
  142. package/dist/LineChart.js.map +1 -1
  143. package/dist/Link.js +3 -3
  144. package/dist/ListReportPage.js +3 -3
  145. package/dist/LoadingState.js +3 -3
  146. package/dist/LollipopChart.js +3 -3
  147. package/dist/MarimekkoChart.js +5 -5
  148. package/dist/MasterDetail.js +3 -3
  149. package/dist/MediaContent.js +3 -3
  150. package/dist/Menu.js +3 -3
  151. package/dist/MenuPopover.d.ts +25 -3
  152. package/dist/MenuPopover.d.ts.map +1 -1
  153. package/dist/MenuPopover.js +105 -15
  154. package/dist/MenuPopover.js.map +1 -1
  155. package/dist/MenuTriggerButton.js +3 -3
  156. package/dist/MessageActions.js +3 -3
  157. package/dist/MessageStatusBadge.js +3 -3
  158. package/dist/Modal.js +3 -3
  159. package/dist/MultiSelect.js +3 -3
  160. package/dist/NavActionStack.js +3 -3
  161. package/dist/NavDrawer.js +3 -3
  162. package/dist/NavItem.js +3 -3
  163. package/dist/NavRail.js +3 -3
  164. package/dist/NavSection.d.ts +1 -1
  165. package/dist/NavSection.d.ts.map +1 -1
  166. package/dist/NavSection.js +20 -9
  167. package/dist/NavSection.js.map +1 -1
  168. package/dist/NavShell.js +3 -3
  169. package/dist/Notification.js +3 -3
  170. package/dist/NumberInput.d.ts +3 -1
  171. package/dist/NumberInput.d.ts.map +1 -1
  172. package/dist/NumberInput.js +9 -3
  173. package/dist/NumberInput.js.map +1 -1
  174. package/dist/OHLCChart.js +5 -5
  175. package/dist/ObjectPage.js +3 -3
  176. package/dist/OrderedList.js +3 -3
  177. package/dist/OrganizationChart.js +5 -5
  178. package/dist/OverflowMenu.js +3 -3
  179. package/dist/Overline.js +3 -3
  180. package/dist/PackedBubblesChart.js +5 -5
  181. package/dist/Pagination.js +3 -3
  182. package/dist/PaginationNav.js +3 -3
  183. package/dist/PanelSection.d.ts +12 -0
  184. package/dist/PanelSection.d.ts.map +1 -1
  185. package/dist/PanelSection.js +16 -4
  186. package/dist/PanelSection.js.map +1 -1
  187. package/dist/PanelStack.d.ts +17 -0
  188. package/dist/PanelStack.d.ts.map +1 -1
  189. package/dist/PanelStack.js +20 -3
  190. package/dist/PanelStack.js.map +1 -1
  191. package/dist/ParallelCoordinatesChart.js +5 -5
  192. package/dist/ParetoChart.js +5 -5
  193. package/dist/PasswordInput.js +3 -3
  194. package/dist/PointAndFigureChart.d.ts.map +1 -1
  195. package/dist/PointAndFigureChart.js +19 -15
  196. package/dist/PointAndFigureChart.js.map +1 -1
  197. package/dist/PolygonChart.js +5 -5
  198. package/dist/Popover.js +3 -3
  199. package/dist/Popper.js +3 -3
  200. package/dist/Portal.js +3 -3
  201. package/dist/PriorityMatrix.d.ts +103 -0
  202. package/dist/PriorityMatrix.d.ts.map +1 -0
  203. package/dist/PriorityMatrix.js +495 -0
  204. package/dist/PriorityMatrix.js.map +1 -0
  205. package/dist/ProgressBar.js +3 -3
  206. package/dist/ProgressIndicator.js +3 -3
  207. package/dist/Quote.js +3 -3
  208. package/dist/RadarChart.js +3 -3
  209. package/dist/Radio.js +3 -3
  210. package/dist/RadioGroup.js +3 -3
  211. package/dist/RangeSlider.js +3 -3
  212. package/dist/Rating.js +3 -3
  213. package/dist/RenkoChart.d.ts.map +1 -1
  214. package/dist/RenkoChart.js +22 -16
  215. package/dist/RenkoChart.js.map +1 -1
  216. package/dist/RibbonChart.js +3 -3
  217. package/dist/RoseChart.js +3 -3
  218. package/dist/Row.js +3 -3
  219. package/dist/SankeyChart.js +3 -3
  220. package/dist/ScatterPlot.js +3 -3
  221. package/dist/ScoreCard.js +3 -3
  222. package/dist/Search.d.ts.map +1 -1
  223. package/dist/Search.js +7 -5
  224. package/dist/Search.js.map +1 -1
  225. package/dist/Select.d.ts +3 -1
  226. package/dist/Select.d.ts.map +1 -1
  227. package/dist/Select.js +9 -3
  228. package/dist/Select.js.map +1 -1
  229. package/dist/SelectableList.js +3 -3
  230. package/dist/SelectableRow.js +3 -3
  231. package/dist/SelectionChip.d.ts.map +1 -1
  232. package/dist/SelectionChip.js +7 -5
  233. package/dist/SelectionChip.js.map +1 -1
  234. package/dist/SideNav.js +3 -3
  235. package/dist/SkeletonText.js +3 -3
  236. package/dist/SkipLink.js +3 -3
  237. package/dist/SlideIndicator.js +3 -3
  238. package/dist/Slider.js +3 -3
  239. package/dist/SolidGaugeChart.js +3 -3
  240. package/dist/Sparkline.js +3 -3
  241. package/dist/Stack.js +3 -3
  242. package/dist/StackedBarChart.d.ts.map +1 -1
  243. package/dist/StackedBarChart.js +32 -18
  244. package/dist/StackedBarChart.js.map +1 -1
  245. package/dist/StateTimelineChart.js +3 -3
  246. package/dist/StatusDot.js +3 -3
  247. package/dist/StatusHistoryChart.js +3 -3
  248. package/dist/StepLineChart.js +3 -3
  249. package/dist/Stepper.js +3 -3
  250. package/dist/StreamgraphChart.js +3 -3
  251. package/dist/StreamingMessage.js +3 -3
  252. package/dist/StructuredList.js +3 -3
  253. package/dist/SunburstChart.js +5 -5
  254. package/dist/Switch.js +3 -3
  255. package/dist/Table.js +3 -3
  256. package/dist/TableOfContents.js +3 -3
  257. package/dist/Tabs.js +3 -3
  258. package/dist/Tag.js +3 -3
  259. package/dist/Textarea.d.ts +3 -1
  260. package/dist/Textarea.d.ts.map +1 -1
  261. package/dist/Textarea.js +9 -3
  262. package/dist/Textarea.js.map +1 -1
  263. package/dist/ThemeProvider.js +3 -3
  264. package/dist/Tile.js +3 -3
  265. package/dist/TileGroup.js +3 -3
  266. package/dist/TileMapChart.js +3 -3
  267. package/dist/TimePicker.js +3 -3
  268. package/dist/TimeRangePicker.d.ts +23 -2
  269. package/dist/TimeRangePicker.d.ts.map +1 -1
  270. package/dist/TimeRangePicker.js +156 -24
  271. package/dist/TimeRangePicker.js.map +1 -1
  272. package/dist/Timeline.js +3 -3
  273. package/dist/TimelineChart.d.ts.map +1 -1
  274. package/dist/TimelineChart.js +4 -4
  275. package/dist/TimelineChart.js.map +1 -1
  276. package/dist/Toast.js +3 -3
  277. package/dist/Toggle.js +3 -3
  278. package/dist/Toggletip.js +3 -3
  279. package/dist/Tooltip.js +3 -3
  280. package/dist/TraceWaterfallChart.js +3 -3
  281. package/dist/Transcription.js +3 -3
  282. package/dist/TreeView.js +3 -3
  283. package/dist/TreegraphChart.js +5 -5
  284. package/dist/TreemapChart.js +5 -5
  285. package/dist/Typography.js +3 -3
  286. package/dist/UnorderedList.js +3 -3
  287. package/dist/UtilityPanel.js +3 -3
  288. package/dist/VariablePieChart.js +3 -3
  289. package/dist/VectorFieldChart.d.ts.map +1 -1
  290. package/dist/VectorFieldChart.js +20 -16
  291. package/dist/VectorFieldChart.js.map +1 -1
  292. package/dist/VennChart.js +3 -3
  293. package/dist/ViolinChart.js +3 -3
  294. package/dist/WaffleChart.js +3 -3
  295. package/dist/WaterfallChart.js +3 -3
  296. package/dist/WindBarbChart.d.ts.map +1 -1
  297. package/dist/WindBarbChart.js +19 -15
  298. package/dist/WindBarbChart.js.map +1 -1
  299. package/dist/Wizard.js +4 -4
  300. package/dist/WordCloudChart.js +3 -3
  301. package/dist/chartScale.d.ts +8 -0
  302. package/dist/chartScale.d.ts.map +1 -1
  303. package/dist/chartScale.js +48 -5
  304. package/dist/chartScale.js.map +1 -1
  305. package/dist/index.d.ts +2 -0
  306. package/dist/index.d.ts.map +1 -1
  307. package/dist/index.js +1 -0
  308. package/dist/index.js.map +1 -1
  309. package/dist/priorityLabels.d.ts +143 -0
  310. package/dist/priorityLabels.d.ts.map +1 -0
  311. package/dist/priorityLabels.js +240 -0
  312. package/dist/priorityLabels.js.map +1 -0
  313. package/dist/styles.css +128 -4
  314. package/package.json +9 -7
  315. package/dist/GeoMap.d.ts +0 -204
  316. package/dist/GeoMap.d.ts.map +0 -1
  317. package/dist/GeoMap.js +0 -715
  318. package/dist/GeoMap.js.map +0 -1
@@ -0,0 +1,240 @@
1
+ /**
2
+ * Internal priority-label placement for the DS PriorityMatrix component.
3
+ *
4
+ * STRUCTURAL TWIN of packages/dataviz-core/src/priorityMatrix.ts: same
5
+ * algorithm, same types, same behaviour. Duplicated (not imported) on purpose:
6
+ * the DS layer must not depend on @sentropic/dataviz-core, so this copy is
7
+ * kept in sync by hand. A shared golden-vector test pins all five copies to
8
+ * identical placements. Not exported from the package barrel (internal
9
+ * component use only).
10
+ */
11
+ /**
12
+ * Quadrant of a datum given thresholds (defaults 50/50).
13
+ * x = complexity (low left), y = value (high top).
14
+ */
15
+ export function priorityQuadrant(x, y, xThreshold = 50, yThreshold = 50) {
16
+ if (x < xThreshold && y >= yThreshold)
17
+ return 'quick-wins';
18
+ if (x >= xThreshold && y >= yThreshold)
19
+ return 'major-projects';
20
+ if (x < xThreshold && y < yThreshold)
21
+ return 'wait';
22
+ return 'drop';
23
+ }
24
+ /**
25
+ * Rough box estimate from a label string when the caller has no measurement.
26
+ * Single line up to 12 chars, two lines beyond; capped at 120px wide.
27
+ *
28
+ * This is a glyph-count MODEL, not a measurement: it assumes narrow latin
29
+ * glyphs at 11px. Wide latin runs overflow the box (Inter 11px measured in
30
+ * Chromium, review figures: "MMMMMMMMMM" by 17.7px, "WWWWWWWWWWWW" by 26.7px;
31
+ * same-direction check with DejaVu Sans 11px advances: 12.9px and 34.5px) and
32
+ * CJK text overflows further ("データ可視化の基盤" by 24.0px in Inter 11px).
33
+ * The non-overlap behaviour only holds for narrow latin; there is currently
34
+ * no prop to pass caller-measured boxes through the DS components.
35
+ */
36
+ export function estimatePriorityLabelBox(label) {
37
+ const chars = [...label].length;
38
+ if (chars === 0)
39
+ return { w: 12, h: 20 };
40
+ const lines = chars > 12 ? 2 : 1;
41
+ const longest = lines === 2 ? Math.ceil(chars / 2) : chars;
42
+ return { w: Math.min(120, 12 + 7 * longest), h: lines === 2 ? 34 : 20 };
43
+ }
44
+ const CANDIDATE_GAP = 8;
45
+ function mulberry32(seed) {
46
+ let a = seed >>> 0;
47
+ return () => {
48
+ a |= 0;
49
+ a = (a + 0x6d2b79f5) | 0;
50
+ let t = Math.imul(a ^ (a >>> 15), 1 | a);
51
+ t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
52
+ return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
53
+ };
54
+ }
55
+ function overlapArea(ax, ay, aw, ah, bx, by, bw, bh) {
56
+ const dx = Math.min(ax + aw, bx + bw) - Math.max(ax, bx);
57
+ const dy = Math.min(ay + ah, by + bh) - Math.max(ay, by);
58
+ return dx > 0 && dy > 0 ? dx * dy : 0;
59
+ }
60
+ function pointInBox(px, py, x, y, w, h, pad = 4) {
61
+ return px > x - pad && px < x + w + pad && py > y - pad && py < y + h + pad;
62
+ }
63
+ function clampInto(x, y, w, h, f) {
64
+ const minX = f.marginLeft;
65
+ const minY = f.marginTop;
66
+ const maxX = f.marginLeft + f.plotWidth - w;
67
+ const maxY = f.marginTop + f.plotHeight - h;
68
+ // Box wider/taller than the plot: pin to the origin instead of inverting.
69
+ if (maxX < minX)
70
+ return { x: minX, y: Math.min(Math.max(y, minY), Math.max(minY, f.marginTop + f.plotHeight - h)) };
71
+ if (maxY < minY)
72
+ return { x: Math.min(Math.max(x, minX), maxX), y: minY };
73
+ return { x: Math.min(Math.max(x, minX), maxX), y: Math.min(Math.max(y, minY), maxY) };
74
+ }
75
+ /**
76
+ * Place one label per point. Never throws on degenerate input: non-finite
77
+ * coordinates fall back to the plot origin, empty arrays yield [].
78
+ *
79
+ * Cost model: label/label overlap area, point-cover (a label box covering ANY
80
+ * anchor — including its own — costs 300 in seeding, 800 in annealing, so
81
+ * opaque label boxes avoid hiding points), obstacle overlap, anchor distance,
82
+ * and out-of-frame penalties, refined by fixed-schedule simulated annealing.
83
+ *
84
+ * Complexity is O(n^2) per energy evaluation with max(1500, n*120) iterations,
85
+ * i.e. O(n^3) overall (the 1500 floor only dominates below 13 points, since n*120 passes 1500 at n=13). Measured
86
+ * (Node 22, desktop class, seeded random sets with long 2-line labels):
87
+ * n=13 in 3.2ms, n=30 in 13.7ms, n=50 in 36.8ms, n=80 in 137.8ms, n=100 in
88
+ * 258.9ms. Overlap counts are set-dependent (0/1/15/83/176 on that
89
+ * adversarial set). Recommended cap: around 50 points; beyond that both
90
+ * latency and overlaps degrade.
91
+ *
92
+ * Frame floor: with the shipped DS configuration (splitLabel boxes, threshold
93
+ * and name obstacles) the 13-point reference set is clean at 640x400, shows
94
+ * 1 overlap at 480x300 and 400x250, 9 overlaps at 320x200, 35 at 200x140, and
95
+ * 78 overlaps plus 12 out-of-plot boxes at 120x90. Do not render below
96
+ * roughly 480x300.
97
+ */
98
+ export function placePriorityLabels(points, boxes, frame, opts = {}) {
99
+ const xT = opts.xThreshold ?? 50;
100
+ const yT = opts.yThreshold ?? 50;
101
+ const seed = opts.seed ?? 42;
102
+ const obstacles = (opts.obstacles ?? []).filter((o) => Number.isFinite(o.x) && Number.isFinite(o.y) && o.w > 0 && o.h > 0);
103
+ const n = points.length;
104
+ if (n === 0)
105
+ return [];
106
+ const anchors = points.map((p) => ({
107
+ ax: Number.isFinite(p.x)
108
+ ? frame.marginLeft + (Math.min(Math.max(p.x, 0), 100) / 100) * frame.plotWidth
109
+ : frame.marginLeft,
110
+ ay: Number.isFinite(p.y)
111
+ ? frame.marginTop + (1 - Math.min(Math.max(p.y, 0), 100) / 100) * frame.plotHeight
112
+ : frame.marginTop,
113
+ }));
114
+ const sizes = points.map((_, i) => {
115
+ const b = boxes[i];
116
+ const w = b && Number.isFinite(b.w) && b.w > 0 ? b.w : 12;
117
+ const h = b && Number.isFinite(b.h) && b.h > 0 ? b.h : 20;
118
+ return { w, h };
119
+ });
120
+ const offsets = [
121
+ [0, -1], [1, -1], [1, 0], [1, 1], [0, 1], [-1, 1], [-1, 0], [-1, -1],
122
+ ];
123
+ const costAt = (idx, x, y, pos) => {
124
+ let c = 0;
125
+ const { w, h } = sizes[idx];
126
+ const left = frame.marginLeft;
127
+ const top = frame.marginTop;
128
+ const right = left + frame.plotWidth;
129
+ const bottom = top + frame.plotHeight;
130
+ c += (Math.max(left - x, 0) + Math.max(x + w - right, 0) + Math.max(top - y, 0) + Math.max(y + h - bottom, 0)) * 400;
131
+ for (let j = 0; j < n; j++) {
132
+ if (j === idx || pos[j] === undefined)
133
+ continue;
134
+ c += overlapArea(x, y, w, h, pos[j].x, pos[j].y, sizes[j].w, sizes[j].h) * 2;
135
+ }
136
+ for (let j = 0; j < n; j++) {
137
+ if (pointInBox(anchors[j].ax, anchors[j].ay, x, y, w, h))
138
+ c += 300;
139
+ }
140
+ // Obstacles (threshold bands, quadrant names) cost 4x a label/label overlap
141
+ // per px2. That is a nudge, not a veto: crossing a 6px band with a 68x20
142
+ // box costs 960 here against 2720 for fully overlapping another label,
143
+ // about a third, so a band is still crossed when nothing else fits.
144
+ for (const o of obstacles) {
145
+ c += overlapArea(x, y, w, h, o.x, o.y, o.w, o.h) * 8;
146
+ }
147
+ c += Math.hypot(x + w / 2 - anchors[idx].ax, y + h / 2 - anchors[idx].ay) * 0.5;
148
+ return c;
149
+ };
150
+ // Greedy seeding in stable y-then-x order.
151
+ const order = points.map((_, i) => i).sort((a, b) => anchors[a].ay - anchors[b].ay || anchors[a].ax - anchors[b].ax);
152
+ const pos = new Array(n);
153
+ for (const idx of order) {
154
+ let bestX = anchors[idx].ax;
155
+ let bestY = anchors[idx].ay;
156
+ let bestC = Infinity;
157
+ for (const [dx, dy] of offsets) {
158
+ const cx = anchors[idx].ax + dx * (sizes[idx].w / 2 + CANDIDATE_GAP) - sizes[idx].w / 2;
159
+ const cy = anchors[idx].ay + dy * (sizes[idx].h / 2 + CANDIDATE_GAP) - sizes[idx].h / 2;
160
+ const cc = costAt(idx, cx, cy, pos);
161
+ if (cc < bestC) {
162
+ bestC = cc;
163
+ bestX = cx;
164
+ bestY = cy;
165
+ }
166
+ }
167
+ const cl = clampInto(bestX, bestY, sizes[idx].w, sizes[idx].h, frame);
168
+ pos[idx] = cl;
169
+ }
170
+ // Simulated-annealing refinement (fixed seed ⇒ deterministic).
171
+ const rnd = mulberry32(seed);
172
+ const energy = () => {
173
+ let e = 0;
174
+ for (let i = 0; i < n; i++) {
175
+ const { w, h } = sizes[i];
176
+ e += Math.hypot(pos[i].x + w / 2 - anchors[i].ax, pos[i].y + h / 2 - anchors[i].ay) * 0.6;
177
+ if (pos[i].x < frame.marginLeft ||
178
+ pos[i].y < frame.marginTop ||
179
+ pos[i].x + w > frame.marginLeft + frame.plotWidth ||
180
+ pos[i].y + h > frame.marginTop + frame.plotHeight) {
181
+ e += 5000;
182
+ }
183
+ for (let j = 0; j < n; j++) {
184
+ if (pointInBox(anchors[j].ax, anchors[j].ay, pos[i].x, pos[i].y, w, h))
185
+ e += 800;
186
+ }
187
+ for (const o of obstacles) {
188
+ e += overlapArea(pos[i].x, pos[i].y, w, h, o.x, o.y, o.w, o.h) * 12;
189
+ }
190
+ for (let j = i + 1; j < n; j++) {
191
+ e += overlapArea(pos[i].x, pos[i].y, w, h, pos[j].x, pos[j].y, sizes[j].w, sizes[j].h) * 3;
192
+ }
193
+ }
194
+ return e;
195
+ };
196
+ let e = energy();
197
+ let temp = 800;
198
+ const iters = Math.max(1500, n * 120);
199
+ const cool = Math.pow(1 / 800, 1 / iters);
200
+ for (let k = 0; k < iters; k++) {
201
+ const i = Math.floor(rnd() * n);
202
+ const ox = pos[i].x;
203
+ const oy = pos[i].y;
204
+ const step = 6 + temp / 40;
205
+ const cl = clampInto(pos[i].x + (rnd() * 2 - 1) * step, pos[i].y + (rnd() * 2 - 1) * step, sizes[i].w, sizes[i].h, frame);
206
+ pos[i] = cl;
207
+ const ne = energy();
208
+ if (ne < e || rnd() < Math.exp((e - ne) / Math.max(temp, 1e-9))) {
209
+ e = ne;
210
+ }
211
+ else {
212
+ pos[i] = { x: ox, y: oy };
213
+ }
214
+ temp *= cool;
215
+ }
216
+ return points.map((p, i) => {
217
+ const { w, h } = sizes[i];
218
+ const bx = pos[i].x;
219
+ const by = pos[i].y;
220
+ // Leader from the closest point of the box to the anchor (edge-clamped;
221
+ // zero-length when the anchor lies inside the box) to the anchor.
222
+ const cx = Math.min(Math.max(anchors[i].ax, bx), bx + w);
223
+ const cy = Math.min(Math.max(anchors[i].ay, by), by + h);
224
+ return {
225
+ index: i,
226
+ x: bx,
227
+ y: by,
228
+ w,
229
+ h,
230
+ anchorX: anchors[i].ax,
231
+ anchorY: anchors[i].ay,
232
+ leaderX1: cx,
233
+ leaderY1: cy,
234
+ leaderX2: anchors[i].ax,
235
+ leaderY2: anchors[i].ay,
236
+ quadrant: priorityQuadrant(p.x, p.y, xT, yT),
237
+ };
238
+ });
239
+ }
240
+ //# sourceMappingURL=priorityLabels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"priorityLabels.js","sourceRoot":"","sources":["../src/priorityLabels.ts"],"names":[],"mappings":"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"}
package/dist/styles.css CHANGED
@@ -1573,7 +1573,9 @@
1573
1573
 
1574
1574
  .st-contentSwitcher__option--selected {
1575
1575
  background: var(--st-semantic-surface-default);
1576
- box-shadow: var(--st-shadow-subtle);
1576
+ box-shadow:
1577
+ inset 0 0 0 1px var(--st-semantic-border-interactive),
1578
+ var(--st-shadow-subtle);
1577
1579
  color: var(--st-semantic-text-primary);
1578
1580
  }
1579
1581
 
@@ -3318,6 +3320,34 @@
3318
3320
 
3319
3321
  .st-highlight__body p { margin: 0; }
3320
3322
 
3323
+ /* Icon (.st-icon) — stroke width and colour come from the theme tokens
3324
+ (--st-component-icon-strokeWidth / --st-component-icon-color).
3325
+ - The selectors only match the DS defaults: stroke-width 2.25 set by no prop
3326
+ (an explicit strokeWidth prop is marked data-st-icon-stroke) and stroke
3327
+ currentColor. An explicit prop or colour keeps its presentation attribute.
3328
+ - The rules live in the cascade layer `st-icon`. A layered rule still beats
3329
+ the SVG presentation attributes, and ANY unlayered consumer rule beats it,
3330
+ whatever its specificity or position.
3331
+ - A consumer rule inside a layer (Tailwind v4 utilities, any @layer CSS) only
3332
+ wins if `st-icon` comes BEFORE that layer in the layer order, which is set
3333
+ by first appearance. Declare it first, before Tailwind:
3334
+ @layer st-icon;
3335
+ @import "tailwindcss";
3336
+ or load this stylesheet before any layered CSS. If `st-icon` is declared
3337
+ after the consumer's layers, the token rules beat the consumer's layered
3338
+ rules on the icon.
3339
+ - The var() fallbacks reproduce the former render when no theme is loaded.
3340
+ Same rules as the Svelte Icon component. */
3341
+ @layer st-icon {
3342
+ :where(.st-icon[stroke-width="2.25"]:not([data-st-icon-stroke])) {
3343
+ stroke-width: var(--st-component-icon-strokeWidth, 2.25);
3344
+ }
3345
+
3346
+ :where(.st-icon[stroke="currentColor"]) {
3347
+ stroke: var(--st-component-icon-color, currentColor);
3348
+ }
3349
+ }
3350
+
3321
3351
  .st-iconButton {
3322
3352
  align-items: center;
3323
3353
  background: transparent;
@@ -4055,7 +4085,14 @@
4055
4085
  max-height: calc(100vh - 2rem);
4056
4086
  overflow: auto;
4057
4087
  padding: 0;
4058
- position: absolute;
4088
+ /* The Popover API UA sheet gives [popover] `inset: 0; margin: auto`: without
4089
+ this reset the top-layer panel is re-centred between its top/left and the
4090
+ viewport edges instead of sitting on the trigger. Inline top/left win. */
4091
+ inset: auto;
4092
+ margin: 0;
4093
+ /* Viewport coordinates from getBoundingClientRect: fixed, never absolute
4094
+ (absolute + document coords broke inside any positioned ancestor). */
4095
+ position: fixed;
4059
4096
  z-index: var(--st-component-popover-zIndex, 80);
4060
4097
  }
4061
4098
 
@@ -4862,6 +4899,18 @@
4862
4899
  font-weight: var(--st-component-pagination-activeWeight, inherit);
4863
4900
  }
4864
4901
 
4902
+ .st-pagination button:hover:not(:disabled) {
4903
+ background: var(
4904
+ --st-component-control-hoverBackground,
4905
+ var(--st-component-pagination-hoverBackground, var(--st-semantic-surface-subtle))
4906
+ );
4907
+ }
4908
+
4909
+ .st-pagination button.st-pagination__page--active:hover:not(:disabled) {
4910
+ background: var(--st-component-pagination-activeBackground, var(--st-semantic-action-primary));
4911
+ color: var(--st-component-pagination-activeText, var(--st-semantic-action-primaryText));
4912
+ }
4913
+
4865
4914
  .st-pagination button:disabled {
4866
4915
  color: var(--st-component-pagination-disabledText, var(--st-semantic-text-muted));
4867
4916
  cursor: not-allowed;
@@ -8088,7 +8137,7 @@
8088
8137
 
8089
8138
  .st-radioGroup__legend {
8090
8139
  color: var(--st-component-field-labelText, var(--st-semantic-text-primary));
8091
- font-size: 0.9375rem;
8140
+ font-size: var(--st-component-selection-legendFontSize, 0.9375rem);
8092
8141
  font-weight: 650;
8093
8142
  line-height: 1.3;
8094
8143
  padding: 0;
@@ -8777,7 +8826,15 @@
8777
8826
  }
8778
8827
 
8779
8828
  .st-calendar__day--inRange {
8780
- background: var(--st-component-control-hoverBackground, var(--st-semantic-surface-subtle));
8829
+ background: var(
8830
+ --st-component-calendar-rangeBackground,
8831
+ color-mix(
8832
+ in srgb,
8833
+ var(--st-semantic-action-primary) 32%,
8834
+ var(--st-component-popover-background, var(--st-semantic-surface-raised))
8835
+ )
8836
+ );
8837
+ color: var(--st-component-popover-text, var(--st-semantic-text-primary));
8781
8838
  }
8782
8839
 
8783
8840
  .st-calendar__day--selected {
@@ -18160,6 +18217,17 @@
18160
18217
  min-width: 16rem;
18161
18218
  }
18162
18219
 
18220
+ .st-timeRangePicker__customExtra {
18221
+ display: flex;
18222
+ flex-direction: column;
18223
+ gap: var(--st-spacing-2, 0.5rem);
18224
+ }
18225
+
18226
+ /* Angular always renders the projection host; hide it when nothing is projected. */
18227
+ .st-timeRangePicker__customExtra:empty {
18228
+ display: none;
18229
+ }
18230
+
18163
18231
  .st-timeRangePicker__bounds {
18164
18232
  display: grid;
18165
18233
  gap: var(--st-spacing-3, 0.75rem);
@@ -18341,3 +18409,59 @@
18341
18409
  padding-block: 0;
18342
18410
  visibility: hidden;
18343
18411
  }
18412
+
18413
+ /* PriorityMatrix — 2x2 value/complexity matrix with placed labels. Token-only. */
18414
+ .st-priorityMatrix { color: var(--st-semantic-text-secondary); display: block; font-family: inherit; position: relative; width: 100%; }
18415
+ .st-priorityMatrix__visual { display: block; }
18416
+ .st-priorityMatrix svg { display: block; overflow: visible; }
18417
+ .st-priorityMatrix__title { fill: var(--st-semantic-text-primary); font-size: 0.875rem; font-weight: 700; }
18418
+ .st-priorityMatrix__quad--quick-wins { fill: color-mix(in srgb, var(--st-semantic-feedback-success) 12%, transparent); }
18419
+ .st-priorityMatrix__quad--major-projects { fill: color-mix(in srgb, var(--st-semantic-feedback-info) 12%, transparent); }
18420
+ .st-priorityMatrix__quad--wait { fill: color-mix(in srgb, var(--st-semantic-feedback-warning) 12%, transparent); }
18421
+ .st-priorityMatrix__quad--drop { fill: color-mix(in srgb, var(--st-semantic-border-subtle) 22%, transparent); }
18422
+ .st-priorityMatrix__threshold { stroke: var(--st-semantic-text-secondary); stroke-width: 1.5; stroke-dasharray: 5 4; }
18423
+ .st-priorityMatrix__quadName { fill: var(--st-semantic-text-secondary); font-size: 0.6875rem; font-weight: 600; }
18424
+ .st-priorityMatrix__grid { stroke: var(--st-semantic-border-subtle); stroke-dasharray: 2 3; stroke-width: 1; opacity: 0.7; }
18425
+ .st-priorityMatrix__axis { stroke: var(--st-semantic-border-subtle); stroke-width: 1; }
18426
+ .st-priorityMatrix__tick { fill: var(--st-semantic-text-secondary); font-size: 0.6875rem; }
18427
+ .st-priorityMatrix__axisLabel { fill: var(--st-semantic-text-secondary); font-size: 0.75rem; font-weight: 600; }
18428
+ .st-priorityMatrix__point--category1 { fill: var(--st-semantic-data-category1); }
18429
+ .st-priorityMatrix__point--category2 { fill: var(--st-semantic-data-category2); }
18430
+ .st-priorityMatrix__point--category3 { fill: var(--st-semantic-data-category3); }
18431
+ .st-priorityMatrix__point--category4 { fill: var(--st-semantic-data-category4); }
18432
+ .st-priorityMatrix__point--category5 { fill: var(--st-semantic-data-category5); }
18433
+ .st-priorityMatrix__point--category6 { fill: var(--st-semantic-data-category6); }
18434
+ .st-priorityMatrix__point--category7 { fill: var(--st-semantic-data-category7); }
18435
+ .st-priorityMatrix__point--category8 { fill: var(--st-semantic-data-category8); }
18436
+ .st-priorityMatrix__leader { stroke: var(--st-semantic-text-secondary); stroke-width: 1; opacity: 0.8; }
18437
+ .st-priorityMatrix__labelBox { fill: var(--st-semantic-surface-default); stroke: var(--st-semantic-border-subtle); stroke-width: 1; }
18438
+ .st-priorityMatrix__labelText { fill: var(--st-semantic-text-primary); font-size: 0.6875rem; }
18439
+
18440
+ /* --- Checkbox vertical centring (2026-11-09) ------------------------------ */
18441
+ /* The box and the trailing slot centre on the FIRST label line, whatever the
18442
+ theme's label font size and line height. The row carries the label
18443
+ typography so `1lh` is one label line; the 1rem box is offset by half the
18444
+ difference between that line and its own height. Top alignment is kept so a
18445
+ wrapped description stays under the label. The first margin declaration is
18446
+ the fallback for engines without the lh unit. Same rules as
18447
+ components-svelte/src/lib/Checkbox.svelte. */
18448
+ .st-choice--checkbox {
18449
+ font-size: var(--st-component-selection-choiceLabelFontSize, 0.9375rem);
18450
+ line-height: var(--st-component-selection-choiceLabelLineHeight, normal);
18451
+ }
18452
+
18453
+ .st-choice--checkbox .st-choice__input {
18454
+ font: inherit;
18455
+ margin: 0.125rem 0 0;
18456
+ margin: calc((1lh - 1rem) / 2) 0 0;
18457
+ }
18458
+
18459
+ /* One label line high, content centred: a count Badge sits on the same axis
18460
+ as the box and the label, even when it is taller than the line. */
18461
+ .st-choice--checkbox .st-choice__trailing {
18462
+ height: 1lh;
18463
+ }
18464
+
18465
+ .st-choice--checkbox .st-choice__help {
18466
+ line-height: normal;
18467
+ }
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@sentropic/design-system-angular",
3
- "version": "0.37.0",
3
+ "version": "0.38.1",
4
+ "license": "MIT",
4
5
  "description": "Angular components for the Sentropic design system.",
5
6
  "type": "module",
6
7
  "publishConfig": {
@@ -32,19 +33,20 @@
32
33
  "test": "npm run build && vitest run --config vitest.config.ts src"
33
34
  },
34
35
  "dependencies": {
35
- "@sentropic/design-system-themes": "0.11.0"
36
+ "@sentropic/design-system-themes": "0.12.0"
36
37
  },
37
38
  "peerDependencies": {
38
39
  "@angular/common": "^20.0.0 || ^21.0.0 || ^22.0.0",
39
40
  "@angular/core": "^20.0.0 || ^21.0.0 || ^22.0.0"
40
41
  },
41
42
  "devDependencies": {
42
- "@angular/common": "^21.2.17",
43
- "@angular/compiler": "^21.2.17",
44
- "@angular/compiler-cli": "^21.2.17",
45
- "@angular/core": "^21.2.17",
43
+ "@angular/common": "21.2.24",
44
+ "@angular/compiler": "21.2.24",
45
+ "@angular/compiler-cli": "21.2.24",
46
+ "@angular/core": "21.2.24",
47
+ "@angular/platform-browser": "21.2.24",
46
48
  "typescript": "^5.9.3",
47
49
  "vite": "^8.0.16",
48
- "vitest": "^4.1.6"
50
+ "vitest": "^4.1.11"
49
51
  }
50
52
  }