panelui-native 0.66.1 → 0.68.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 (129) hide show
  1. package/README.md +21 -1
  2. package/lib/module/components/area-chart/index.js +18 -1
  3. package/lib/module/components/area-chart/index.js.map +1 -1
  4. package/lib/module/components/bar-chart/index.js +18 -1
  5. package/lib/module/components/bar-chart/index.js.map +1 -1
  6. package/lib/module/components/candlestick-chart/index.js +18 -1
  7. package/lib/module/components/candlestick-chart/index.js.map +1 -1
  8. package/lib/module/components/form/index.js +7 -5
  9. package/lib/module/components/form/index.js.map +1 -1
  10. package/lib/module/components/form/typed-form.js +11 -0
  11. package/lib/module/components/form/typed-form.js.map +1 -0
  12. package/lib/module/components/form/use-form.js +4 -0
  13. package/lib/module/components/form/use-form.js.map +1 -1
  14. package/lib/module/components/heatmap-chart/index.js +27 -1
  15. package/lib/module/components/heatmap-chart/index.js.map +1 -1
  16. package/lib/module/components/line-chart/index.js +18 -1
  17. package/lib/module/components/line-chart/index.js.map +1 -1
  18. package/lib/module/components/message-scroller/index.js +172 -10
  19. package/lib/module/components/message-scroller/index.js.map +1 -1
  20. package/lib/module/components/message-scroller/message-scroller-math.js +23 -0
  21. package/lib/module/components/message-scroller/message-scroller-math.js.map +1 -1
  22. package/lib/module/components/meter/index.js +250 -0
  23. package/lib/module/components/meter/index.js.map +1 -0
  24. package/lib/module/components/meter/meter-scale.js +88 -0
  25. package/lib/module/components/meter/meter-scale.js.map +1 -0
  26. package/lib/module/components/planner/index.js +714 -0
  27. package/lib/module/components/planner/index.js.map +1 -0
  28. package/lib/module/components/planner/planner-entries.js +124 -0
  29. package/lib/module/components/planner/planner-entries.js.map +1 -0
  30. package/lib/module/components/radar-chart/index.js +18 -1
  31. package/lib/module/components/radar-chart/index.js.map +1 -1
  32. package/lib/module/components/scatter-chart/index.js +18 -1
  33. package/lib/module/components/scatter-chart/index.js.map +1 -1
  34. package/lib/module/components/skeleton/index.js +45 -7
  35. package/lib/module/components/skeleton/index.js.map +1 -1
  36. package/lib/module/components/spinner/index.js +63 -14
  37. package/lib/module/components/spinner/index.js.map +1 -1
  38. package/lib/module/components/time-picker/index.js +46 -21
  39. package/lib/module/components/time-picker/index.js.map +1 -1
  40. package/lib/module/components/time-picker/ruler-window.js +25 -0
  41. package/lib/module/components/time-picker/ruler-window.js.map +1 -0
  42. package/lib/module/hooks/breakpoint-contract.js +29 -0
  43. package/lib/module/hooks/breakpoint-contract.js.map +1 -0
  44. package/lib/module/hooks/index.js +1 -1
  45. package/lib/module/hooks/index.js.map +1 -1
  46. package/lib/module/hooks/use-breakpoint.js +46 -1
  47. package/lib/module/hooks/use-breakpoint.js.map +1 -1
  48. package/lib/module/index.js +3 -1
  49. package/lib/module/index.js.map +1 -1
  50. package/lib/module/primitives/chart-accessibility.js +68 -0
  51. package/lib/module/primitives/chart-accessibility.js.map +1 -0
  52. package/lib/typescript/src/components/area-chart/index.d.ts +2 -1
  53. package/lib/typescript/src/components/area-chart/index.d.ts.map +1 -1
  54. package/lib/typescript/src/components/bar-chart/index.d.ts +2 -1
  55. package/lib/typescript/src/components/bar-chart/index.d.ts.map +1 -1
  56. package/lib/typescript/src/components/candlestick-chart/index.d.ts +2 -1
  57. package/lib/typescript/src/components/candlestick-chart/index.d.ts.map +1 -1
  58. package/lib/typescript/src/components/form/index.d.ts +18 -5
  59. package/lib/typescript/src/components/form/index.d.ts.map +1 -1
  60. package/lib/typescript/src/components/form/typed-form.d.ts +7 -0
  61. package/lib/typescript/src/components/form/typed-form.d.ts.map +1 -0
  62. package/lib/typescript/src/components/form/use-form.d.ts +4 -0
  63. package/lib/typescript/src/components/form/use-form.d.ts.map +1 -1
  64. package/lib/typescript/src/components/heatmap-chart/index.d.ts +2 -1
  65. package/lib/typescript/src/components/heatmap-chart/index.d.ts.map +1 -1
  66. package/lib/typescript/src/components/line-chart/index.d.ts +2 -1
  67. package/lib/typescript/src/components/line-chart/index.d.ts.map +1 -1
  68. package/lib/typescript/src/components/message-scroller/index.d.ts +30 -2
  69. package/lib/typescript/src/components/message-scroller/index.d.ts.map +1 -1
  70. package/lib/typescript/src/components/message-scroller/message-scroller-math.d.ts +10 -0
  71. package/lib/typescript/src/components/message-scroller/message-scroller-math.d.ts.map +1 -1
  72. package/lib/typescript/src/components/meter/index.d.ts +270 -0
  73. package/lib/typescript/src/components/meter/index.d.ts.map +1 -0
  74. package/lib/typescript/src/components/meter/meter-scale.d.ts +57 -0
  75. package/lib/typescript/src/components/meter/meter-scale.d.ts.map +1 -0
  76. package/lib/typescript/src/components/planner/index.d.ts +274 -0
  77. package/lib/typescript/src/components/planner/index.d.ts.map +1 -0
  78. package/lib/typescript/src/components/planner/planner-entries.d.ts +75 -0
  79. package/lib/typescript/src/components/planner/planner-entries.d.ts.map +1 -0
  80. package/lib/typescript/src/components/radar-chart/index.d.ts +4 -0
  81. package/lib/typescript/src/components/radar-chart/index.d.ts.map +1 -1
  82. package/lib/typescript/src/components/scatter-chart/index.d.ts +2 -1
  83. package/lib/typescript/src/components/scatter-chart/index.d.ts.map +1 -1
  84. package/lib/typescript/src/components/skeleton/index.d.ts +25 -2
  85. package/lib/typescript/src/components/skeleton/index.d.ts.map +1 -1
  86. package/lib/typescript/src/components/spinner/index.d.ts +25 -2
  87. package/lib/typescript/src/components/spinner/index.d.ts.map +1 -1
  88. package/lib/typescript/src/components/time-picker/index.d.ts +5 -6
  89. package/lib/typescript/src/components/time-picker/index.d.ts.map +1 -1
  90. package/lib/typescript/src/components/time-picker/ruler-window.d.ts +12 -0
  91. package/lib/typescript/src/components/time-picker/ruler-window.d.ts.map +1 -0
  92. package/lib/typescript/src/hooks/breakpoint-contract.d.ts +6 -0
  93. package/lib/typescript/src/hooks/breakpoint-contract.d.ts.map +1 -0
  94. package/lib/typescript/src/hooks/index.d.ts +1 -1
  95. package/lib/typescript/src/hooks/index.d.ts.map +1 -1
  96. package/lib/typescript/src/hooks/use-breakpoint.d.ts +22 -0
  97. package/lib/typescript/src/hooks/use-breakpoint.d.ts.map +1 -1
  98. package/lib/typescript/src/index.d.ts +3 -1
  99. package/lib/typescript/src/index.d.ts.map +1 -1
  100. package/lib/typescript/src/primitives/chart-accessibility.d.ts +33 -0
  101. package/lib/typescript/src/primitives/chart-accessibility.d.ts.map +1 -0
  102. package/lib/typescript/types/form-api.type-test.d.ts +2 -0
  103. package/lib/typescript/types/form-api.type-test.d.ts.map +1 -0
  104. package/package.json +28 -2
  105. package/src/components/area-chart/index.tsx +27 -2
  106. package/src/components/bar-chart/index.tsx +27 -2
  107. package/src/components/candlestick-chart/index.tsx +30 -2
  108. package/src/components/form/index.tsx +32 -5
  109. package/src/components/form/typed-form.ts +13 -0
  110. package/src/components/form/use-form.ts +9 -0
  111. package/src/components/heatmap-chart/index.tsx +49 -3
  112. package/src/components/line-chart/index.tsx +27 -2
  113. package/src/components/message-scroller/index.tsx +234 -6
  114. package/src/components/message-scroller/message-scroller-math.ts +38 -0
  115. package/src/components/meter/index.tsx +318 -0
  116. package/src/components/meter/meter-scale.ts +109 -0
  117. package/src/components/planner/index.tsx +886 -0
  118. package/src/components/planner/planner-entries.ts +146 -0
  119. package/src/components/radar-chart/index.tsx +24 -0
  120. package/src/components/scatter-chart/index.tsx +27 -2
  121. package/src/components/skeleton/index.tsx +59 -5
  122. package/src/components/spinner/index.tsx +80 -13
  123. package/src/components/time-picker/index.tsx +57 -29
  124. package/src/components/time-picker/ruler-window.ts +24 -0
  125. package/src/hooks/breakpoint-contract.ts +31 -0
  126. package/src/hooks/index.ts +4 -0
  127. package/src/hooks/use-breakpoint.ts +61 -10
  128. package/src/index.ts +30 -0
  129. package/src/primitives/chart-accessibility.ts +102 -0
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Where a reading sits on a meter's scale, and what colour it has earned.
3
+ *
4
+ * Kept apart from the component because it is the part that can be wrong
5
+ * without looking wrong: a threshold picked in the wrong order, or a segment
6
+ * count that rounds a real reading down to nothing, is a meter that lies
7
+ * quietly. None of it touches React, so it can be tested on its own.
8
+ */
9
+
10
+ /** The token a meter can be painted with. */
11
+ export type MeterColor =
12
+ | 'primary'
13
+ | 'success'
14
+ | 'warning'
15
+ | 'destructive'
16
+ | 'info'
17
+ | 'muted';
18
+
19
+ /**
20
+ * A point on the scale, and the colour the meter takes from there upwards.
21
+ *
22
+ * `from` is in the same units as `value` — not a percentage of the range — so
23
+ * a threshold on a 0–8 GB meter is written in gigabytes.
24
+ */
25
+ export interface MeterThreshold {
26
+ /** The value at which this colour takes over. */
27
+ from: number;
28
+ /** What the bar is painted with at or above `from`. */
29
+ color: MeterColor;
30
+ }
31
+
32
+ /** `value` held inside the scale, so a stray number cannot escape the track. */
33
+ export function clamp(value: number, min: number, max: number) {
34
+ if (!(value > min)) return min;
35
+ if (value > max) return max;
36
+ return value;
37
+ }
38
+
39
+ /**
40
+ * How far up the scale the value sits, 0–1. An empty or inverted range has no
41
+ * meaningful position in it, so it reads as empty rather than dividing by zero.
42
+ */
43
+ export function fractionOf(value: number, min: number, max: number) {
44
+ const span = max - min;
45
+ if (!(span > 0)) return 0;
46
+ return clamp((value - min) / span, 0, 1);
47
+ }
48
+
49
+ /**
50
+ * The colour the reading has earned: the highest threshold at or below the
51
+ * value, or the base colour when it has reached none of them.
52
+ *
53
+ * Highest-wins rather than first-wins, so the caller can list thresholds in
54
+ * any order and get the same answer. A rule that depended on the order would
55
+ * make a reordered array a silent behaviour change.
56
+ */
57
+ export function colorFor(
58
+ value: number,
59
+ base: MeterColor | undefined,
60
+ thresholds: MeterThreshold[] | undefined
61
+ ) {
62
+ if (!thresholds?.length) return base;
63
+ let winner: MeterThreshold | undefined;
64
+ for (const threshold of thresholds) {
65
+ if (value < threshold.from) continue;
66
+ if (!winner || threshold.from > winner.from) winner = threshold;
67
+ }
68
+ return winner?.color ?? base;
69
+ }
70
+
71
+ /**
72
+ * How many blocks of a segmented meter are lit.
73
+ *
74
+ * Rounded up, so any reading above the floor lights at least one. Rounding
75
+ * down would leave the whole first block of a four-block meter dark, and "a
76
+ * little" looking like "none" is the reading a meter can least afford to get
77
+ * wrong.
78
+ */
79
+ export function litSegments(fraction: number, segments: number) {
80
+ if (!(segments > 0)) return 0;
81
+ return Math.min(Math.ceil(fraction * segments), segments);
82
+ }
83
+
84
+ /**
85
+ * The value caption: an explicit override, an `Intl` rendering, or a rounded
86
+ * percent.
87
+ *
88
+ * A `percent` style is given the fraction, because that is what a percentage
89
+ * of the scale means; every other style is given the value, because a byte
90
+ * count or a score is a quantity and not a proportion.
91
+ */
92
+ export function formatValue(
93
+ value: number,
94
+ fraction: number,
95
+ valueLabel?: string,
96
+ formatOptions?: Intl.NumberFormatOptions
97
+ ) {
98
+ if (valueLabel != null) return valueLabel;
99
+ if (formatOptions) {
100
+ try {
101
+ return new Intl.NumberFormat(undefined, formatOptions).format(
102
+ formatOptions.style === 'percent' ? fraction : value
103
+ );
104
+ } catch {
105
+ // Some engines ship a partial Intl; fall through to the plain percent.
106
+ }
107
+ }
108
+ return `${Math.round(fraction * 100)}%`;
109
+ }