@oxyhq/bloom 0.29.6 → 0.30.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 (183) hide show
  1. package/lib/commonjs/activity-heatmap/ActivityHeatmap.js +304 -0
  2. package/lib/commonjs/activity-heatmap/ActivityHeatmap.js.map +1 -0
  3. package/lib/commonjs/activity-heatmap/bucketByDay.js +51 -0
  4. package/lib/commonjs/activity-heatmap/bucketByDay.js.map +1 -0
  5. package/lib/commonjs/activity-heatmap/index.js +20 -0
  6. package/lib/commonjs/activity-heatmap/index.js.map +1 -0
  7. package/lib/commonjs/activity-heatmap/types.js +6 -0
  8. package/lib/commonjs/activity-heatmap/types.js.map +1 -0
  9. package/lib/commonjs/avatar-group/AvatarGroupBase.js +44 -18
  10. package/lib/commonjs/avatar-group/AvatarGroupBase.js.map +1 -1
  11. package/lib/commonjs/composition-bar/CompositionBar.js +159 -0
  12. package/lib/commonjs/composition-bar/CompositionBar.js.map +1 -0
  13. package/lib/commonjs/composition-bar/index.js +13 -0
  14. package/lib/commonjs/composition-bar/index.js.map +1 -0
  15. package/lib/commonjs/composition-bar/types.js +6 -0
  16. package/lib/commonjs/composition-bar/types.js.map +1 -0
  17. package/lib/commonjs/dot-grid-meter/DotGridMeter.js +69 -0
  18. package/lib/commonjs/dot-grid-meter/DotGridMeter.js.map +1 -0
  19. package/lib/commonjs/dot-grid-meter/index.js +13 -0
  20. package/lib/commonjs/dot-grid-meter/index.js.map +1 -0
  21. package/lib/commonjs/dot-grid-meter/types.js +6 -0
  22. package/lib/commonjs/dot-grid-meter/types.js.map +1 -0
  23. package/lib/commonjs/index.js +59 -12
  24. package/lib/commonjs/index.js.map +1 -1
  25. package/lib/commonjs/index.web.js +59 -12
  26. package/lib/commonjs/index.web.js.map +1 -1
  27. package/lib/commonjs/profile-card/ProfileCard.js +311 -0
  28. package/lib/commonjs/profile-card/ProfileCard.js.map +1 -0
  29. package/lib/commonjs/profile-card/index.js +13 -0
  30. package/lib/commonjs/profile-card/index.js.map +1 -0
  31. package/lib/commonjs/profile-card/types.js +6 -0
  32. package/lib/commonjs/profile-card/types.js.map +1 -0
  33. package/lib/commonjs/stat-bar/StatBar.js +213 -0
  34. package/lib/commonjs/stat-bar/StatBar.js.map +1 -0
  35. package/lib/commonjs/stat-bar/index.js +13 -0
  36. package/lib/commonjs/stat-bar/index.js.map +1 -0
  37. package/lib/commonjs/stat-bar/types.js +6 -0
  38. package/lib/commonjs/stat-bar/types.js.map +1 -0
  39. package/lib/module/activity-heatmap/ActivityHeatmap.js +299 -0
  40. package/lib/module/activity-heatmap/ActivityHeatmap.js.map +1 -0
  41. package/lib/module/activity-heatmap/bucketByDay.js +47 -0
  42. package/lib/module/activity-heatmap/bucketByDay.js.map +1 -0
  43. package/lib/module/activity-heatmap/index.js +5 -0
  44. package/lib/module/activity-heatmap/index.js.map +1 -0
  45. package/lib/module/activity-heatmap/types.js +4 -0
  46. package/lib/module/activity-heatmap/types.js.map +1 -0
  47. package/lib/module/avatar-group/AvatarGroupBase.js +44 -18
  48. package/lib/module/avatar-group/AvatarGroupBase.js.map +1 -1
  49. package/lib/module/composition-bar/CompositionBar.js +154 -0
  50. package/lib/module/composition-bar/CompositionBar.js.map +1 -0
  51. package/lib/module/composition-bar/index.js +4 -0
  52. package/lib/module/composition-bar/index.js.map +1 -0
  53. package/lib/module/composition-bar/types.js +4 -0
  54. package/lib/module/composition-bar/types.js.map +1 -0
  55. package/lib/module/dot-grid-meter/DotGridMeter.js +64 -0
  56. package/lib/module/dot-grid-meter/DotGridMeter.js.map +1 -0
  57. package/lib/module/dot-grid-meter/index.js +4 -0
  58. package/lib/module/dot-grid-meter/index.js.map +1 -0
  59. package/lib/module/dot-grid-meter/types.js +4 -0
  60. package/lib/module/dot-grid-meter/types.js.map +1 -0
  61. package/lib/module/index.js +6 -0
  62. package/lib/module/index.js.map +1 -1
  63. package/lib/module/index.web.js +6 -0
  64. package/lib/module/index.web.js.map +1 -1
  65. package/lib/module/profile-card/ProfileCard.js +306 -0
  66. package/lib/module/profile-card/ProfileCard.js.map +1 -0
  67. package/lib/module/profile-card/index.js +4 -0
  68. package/lib/module/profile-card/index.js.map +1 -0
  69. package/lib/module/profile-card/types.js +4 -0
  70. package/lib/module/profile-card/types.js.map +1 -0
  71. package/lib/module/stat-bar/StatBar.js +208 -0
  72. package/lib/module/stat-bar/StatBar.js.map +1 -0
  73. package/lib/module/stat-bar/index.js +4 -0
  74. package/lib/module/stat-bar/index.js.map +1 -0
  75. package/lib/module/stat-bar/types.js +4 -0
  76. package/lib/module/stat-bar/types.js.map +1 -0
  77. package/lib/typescript/commonjs/activity-heatmap/ActivityHeatmap.d.ts +4 -0
  78. package/lib/typescript/commonjs/activity-heatmap/ActivityHeatmap.d.ts.map +1 -0
  79. package/lib/typescript/commonjs/activity-heatmap/bucketByDay.d.ts +9 -0
  80. package/lib/typescript/commonjs/activity-heatmap/bucketByDay.d.ts.map +1 -0
  81. package/lib/typescript/commonjs/activity-heatmap/index.d.ts +4 -0
  82. package/lib/typescript/commonjs/activity-heatmap/index.d.ts.map +1 -0
  83. package/lib/typescript/commonjs/activity-heatmap/types.d.ts +73 -0
  84. package/lib/typescript/commonjs/activity-heatmap/types.d.ts.map +1 -0
  85. package/lib/typescript/commonjs/avatar-group/AvatarGroupBase.d.ts.map +1 -1
  86. package/lib/typescript/commonjs/avatar-group/types.d.ts +23 -1
  87. package/lib/typescript/commonjs/avatar-group/types.d.ts.map +1 -1
  88. package/lib/typescript/commonjs/composition-bar/CompositionBar.d.ts +4 -0
  89. package/lib/typescript/commonjs/composition-bar/CompositionBar.d.ts.map +1 -0
  90. package/lib/typescript/commonjs/composition-bar/index.d.ts +3 -0
  91. package/lib/typescript/commonjs/composition-bar/index.d.ts.map +1 -0
  92. package/lib/typescript/commonjs/composition-bar/types.d.ts +29 -0
  93. package/lib/typescript/commonjs/composition-bar/types.d.ts.map +1 -0
  94. package/lib/typescript/commonjs/dot-grid-meter/DotGridMeter.d.ts +4 -0
  95. package/lib/typescript/commonjs/dot-grid-meter/DotGridMeter.d.ts.map +1 -0
  96. package/lib/typescript/commonjs/dot-grid-meter/index.d.ts +3 -0
  97. package/lib/typescript/commonjs/dot-grid-meter/index.d.ts.map +1 -0
  98. package/lib/typescript/commonjs/dot-grid-meter/types.d.ts +36 -0
  99. package/lib/typescript/commonjs/dot-grid-meter/types.d.ts.map +1 -0
  100. package/lib/typescript/commonjs/index.d.ts +10 -0
  101. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  102. package/lib/typescript/commonjs/index.web.d.ts +10 -0
  103. package/lib/typescript/commonjs/index.web.d.ts.map +1 -1
  104. package/lib/typescript/commonjs/profile-card/ProfileCard.d.ts +4 -0
  105. package/lib/typescript/commonjs/profile-card/ProfileCard.d.ts.map +1 -0
  106. package/lib/typescript/commonjs/profile-card/index.d.ts +3 -0
  107. package/lib/typescript/commonjs/profile-card/index.d.ts.map +1 -0
  108. package/lib/typescript/commonjs/profile-card/types.d.ts +86 -0
  109. package/lib/typescript/commonjs/profile-card/types.d.ts.map +1 -0
  110. package/lib/typescript/commonjs/stat-bar/StatBar.d.ts +4 -0
  111. package/lib/typescript/commonjs/stat-bar/StatBar.d.ts.map +1 -0
  112. package/lib/typescript/commonjs/stat-bar/index.d.ts +3 -0
  113. package/lib/typescript/commonjs/stat-bar/index.d.ts.map +1 -0
  114. package/lib/typescript/commonjs/stat-bar/types.d.ts +62 -0
  115. package/lib/typescript/commonjs/stat-bar/types.d.ts.map +1 -0
  116. package/lib/typescript/module/activity-heatmap/ActivityHeatmap.d.ts +4 -0
  117. package/lib/typescript/module/activity-heatmap/ActivityHeatmap.d.ts.map +1 -0
  118. package/lib/typescript/module/activity-heatmap/bucketByDay.d.ts +9 -0
  119. package/lib/typescript/module/activity-heatmap/bucketByDay.d.ts.map +1 -0
  120. package/lib/typescript/module/activity-heatmap/index.d.ts +4 -0
  121. package/lib/typescript/module/activity-heatmap/index.d.ts.map +1 -0
  122. package/lib/typescript/module/activity-heatmap/types.d.ts +73 -0
  123. package/lib/typescript/module/activity-heatmap/types.d.ts.map +1 -0
  124. package/lib/typescript/module/avatar-group/AvatarGroupBase.d.ts.map +1 -1
  125. package/lib/typescript/module/avatar-group/types.d.ts +23 -1
  126. package/lib/typescript/module/avatar-group/types.d.ts.map +1 -1
  127. package/lib/typescript/module/composition-bar/CompositionBar.d.ts +4 -0
  128. package/lib/typescript/module/composition-bar/CompositionBar.d.ts.map +1 -0
  129. package/lib/typescript/module/composition-bar/index.d.ts +3 -0
  130. package/lib/typescript/module/composition-bar/index.d.ts.map +1 -0
  131. package/lib/typescript/module/composition-bar/types.d.ts +29 -0
  132. package/lib/typescript/module/composition-bar/types.d.ts.map +1 -0
  133. package/lib/typescript/module/dot-grid-meter/DotGridMeter.d.ts +4 -0
  134. package/lib/typescript/module/dot-grid-meter/DotGridMeter.d.ts.map +1 -0
  135. package/lib/typescript/module/dot-grid-meter/index.d.ts +3 -0
  136. package/lib/typescript/module/dot-grid-meter/index.d.ts.map +1 -0
  137. package/lib/typescript/module/dot-grid-meter/types.d.ts +36 -0
  138. package/lib/typescript/module/dot-grid-meter/types.d.ts.map +1 -0
  139. package/lib/typescript/module/index.d.ts +10 -0
  140. package/lib/typescript/module/index.d.ts.map +1 -1
  141. package/lib/typescript/module/index.web.d.ts +10 -0
  142. package/lib/typescript/module/index.web.d.ts.map +1 -1
  143. package/lib/typescript/module/profile-card/ProfileCard.d.ts +4 -0
  144. package/lib/typescript/module/profile-card/ProfileCard.d.ts.map +1 -0
  145. package/lib/typescript/module/profile-card/index.d.ts +3 -0
  146. package/lib/typescript/module/profile-card/index.d.ts.map +1 -0
  147. package/lib/typescript/module/profile-card/types.d.ts +86 -0
  148. package/lib/typescript/module/profile-card/types.d.ts.map +1 -0
  149. package/lib/typescript/module/stat-bar/StatBar.d.ts +4 -0
  150. package/lib/typescript/module/stat-bar/StatBar.d.ts.map +1 -0
  151. package/lib/typescript/module/stat-bar/index.d.ts +3 -0
  152. package/lib/typescript/module/stat-bar/index.d.ts.map +1 -0
  153. package/lib/typescript/module/stat-bar/types.d.ts +62 -0
  154. package/lib/typescript/module/stat-bar/types.d.ts.map +1 -0
  155. package/package.json +56 -1
  156. package/src/__tests__/StatWidgets.test.tsx +184 -0
  157. package/src/__tests__/public-api-contract.test.ts +15 -0
  158. package/src/activity-heatmap/ActivityHeatmap.stories.tsx +108 -0
  159. package/src/activity-heatmap/ActivityHeatmap.tsx +289 -0
  160. package/src/activity-heatmap/bucketByDay.ts +49 -0
  161. package/src/activity-heatmap/index.ts +3 -0
  162. package/src/activity-heatmap/types.ts +74 -0
  163. package/src/avatar-group/AvatarGroup.stories.tsx +14 -0
  164. package/src/avatar-group/AvatarGroupBase.tsx +48 -20
  165. package/src/avatar-group/types.ts +23 -1
  166. package/src/composition-bar/CompositionBar.stories.tsx +70 -0
  167. package/src/composition-bar/CompositionBar.tsx +161 -0
  168. package/src/composition-bar/index.ts +2 -0
  169. package/src/composition-bar/types.ts +30 -0
  170. package/src/dot-grid-meter/DotGridMeter.stories.tsx +47 -0
  171. package/src/dot-grid-meter/DotGridMeter.tsx +71 -0
  172. package/src/dot-grid-meter/index.ts +2 -0
  173. package/src/dot-grid-meter/types.ts +36 -0
  174. package/src/index.ts +24 -0
  175. package/src/index.web.ts +24 -0
  176. package/src/profile-card/ProfileCard.stories.tsx +210 -0
  177. package/src/profile-card/ProfileCard.tsx +269 -0
  178. package/src/profile-card/index.ts +9 -0
  179. package/src/profile-card/types.ts +86 -0
  180. package/src/stat-bar/StatBar.stories.tsx +61 -0
  181. package/src/stat-bar/StatBar.tsx +126 -0
  182. package/src/stat-bar/index.ts +7 -0
  183. package/src/stat-bar/types.ts +65 -0
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.StatBar = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _reactNative = require("react-native");
9
+ var _useTheme = require("../theme/use-theme.js");
10
+ var _index = require("../typography/index.js");
11
+ var _jsxRuntime = require("react/jsx-runtime");
12
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
13
+ function clampPercent(value) {
14
+ if (Number.isNaN(value)) return 0;
15
+ return Math.max(0, Math.min(100, value));
16
+ }
17
+
18
+ /**
19
+ * A horizontal labeled value bar with two variants:
20
+ *
21
+ * - `progress` — a rounded capsule track with a proportional `value / max`
22
+ * fill, an optional top-right `icon`, and an optional min/max footer row.
23
+ * - `split` — a capsule split at `percent` (left portion active, remainder the
24
+ * track color), a bold percentage right of the label, and a two-sided footer
25
+ * of opposing values (inflow/outflow style).
26
+ *
27
+ * Colors come from the theme (the same NativeWind token pipeline that backs the
28
+ * `--*` vars) — text via `text`/`textSecondary`/`textTertiary`, the track from
29
+ * `backgroundSecondary` — with the fill overridable per-prop. Pure `<View>`
30
+ * composition, so it renders identically on web and native.
31
+ */
32
+ const StatBarComponent = props => {
33
+ const {
34
+ colors
35
+ } = (0, _useTheme.useTheme)();
36
+ const {
37
+ label,
38
+ fillColor,
39
+ trackColor,
40
+ height = 6,
41
+ icon,
42
+ style,
43
+ testID
44
+ } = props;
45
+ const fill = fillColor ?? colors.primary;
46
+ const track = trackColor ?? colors.backgroundSecondary;
47
+ const radius = height / 2;
48
+ if (props.variant === 'split') {
49
+ const {
50
+ percent,
51
+ leftValue,
52
+ rightValue,
53
+ leftColor,
54
+ rightColor
55
+ } = props;
56
+ const leftPercent = clampPercent(percent);
57
+ const activeLeft = leftColor ?? fill;
58
+ const remainder = rightColor ?? track;
59
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
60
+ style: [styles.wrap, style],
61
+ testID: testID,
62
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
63
+ style: styles.labelRow,
64
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_index.Text, {
65
+ style: [styles.label, {
66
+ color: colors.textSecondary
67
+ }],
68
+ numberOfLines: 1,
69
+ children: label
70
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_index.Text, {
71
+ style: [styles.percent, {
72
+ color: colors.text
73
+ }],
74
+ numberOfLines: 1,
75
+ children: [Math.round(leftPercent), "%"]
76
+ })]
77
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
78
+ style: [styles.track, {
79
+ height,
80
+ borderRadius: radius,
81
+ backgroundColor: remainder
82
+ }],
83
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
84
+ style: {
85
+ width: `${leftPercent}%`,
86
+ height,
87
+ borderRadius: radius,
88
+ backgroundColor: activeLeft
89
+ }
90
+ })
91
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
92
+ style: styles.footerRow,
93
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_index.Text, {
94
+ style: [styles.footerValue, {
95
+ color: colors.textTertiary
96
+ }],
97
+ numberOfLines: 1,
98
+ children: leftValue
99
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_index.Text, {
100
+ style: [styles.footerValue, {
101
+ color: colors.textTertiary
102
+ }],
103
+ numberOfLines: 1,
104
+ children: rightValue
105
+ })]
106
+ })]
107
+ });
108
+ }
109
+ const {
110
+ value,
111
+ max,
112
+ minLabel,
113
+ maxLabel
114
+ } = props;
115
+ const ratio = max > 0 ? clampPercent(value / max * 100) : 0;
116
+ const hasFooter = minLabel != null || maxLabel != null;
117
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
118
+ style: [styles.wrap, style],
119
+ testID: testID,
120
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
121
+ style: styles.labelRow,
122
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_index.Text, {
123
+ style: [styles.label, {
124
+ color: colors.textSecondary
125
+ }],
126
+ numberOfLines: 1,
127
+ children: label
128
+ }), icon != null && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
129
+ style: styles.icon,
130
+ children: icon
131
+ })]
132
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
133
+ style: [styles.track, {
134
+ height,
135
+ borderRadius: radius,
136
+ backgroundColor: track
137
+ }],
138
+ accessibilityRole: "progressbar",
139
+ accessibilityValue: {
140
+ min: 0,
141
+ max,
142
+ now: value
143
+ },
144
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
145
+ style: {
146
+ width: `${ratio}%`,
147
+ height,
148
+ borderRadius: radius,
149
+ backgroundColor: fill
150
+ }
151
+ })
152
+ }), hasFooter && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
153
+ style: styles.footerRow,
154
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_index.Text, {
155
+ style: [styles.footerValue, {
156
+ color: colors.textTertiary
157
+ }],
158
+ numberOfLines: 1,
159
+ children: minLabel ?? ''
160
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_index.Text, {
161
+ style: [styles.footerValue, {
162
+ color: colors.textTertiary
163
+ }],
164
+ numberOfLines: 1,
165
+ children: maxLabel ?? ''
166
+ })]
167
+ })]
168
+ });
169
+ };
170
+ const styles = _reactNative.StyleSheet.create({
171
+ wrap: {
172
+ gap: 8
173
+ },
174
+ labelRow: {
175
+ flexDirection: 'row',
176
+ alignItems: 'center',
177
+ justifyContent: 'space-between',
178
+ gap: 8
179
+ },
180
+ label: {
181
+ flexShrink: 1,
182
+ fontSize: 13,
183
+ fontWeight: '500'
184
+ },
185
+ percent: {
186
+ fontSize: 14,
187
+ fontWeight: '700',
188
+ letterSpacing: -0.2,
189
+ fontVariant: ['tabular-nums']
190
+ },
191
+ icon: {
192
+ marginLeft: 8
193
+ },
194
+ track: {
195
+ width: '100%',
196
+ overflow: 'hidden',
197
+ flexDirection: 'row',
198
+ borderCurve: 'continuous'
199
+ },
200
+ footerRow: {
201
+ flexDirection: 'row',
202
+ alignItems: 'center',
203
+ justifyContent: 'space-between',
204
+ gap: 8
205
+ },
206
+ footerValue: {
207
+ fontSize: 12,
208
+ fontVariant: ['tabular-nums']
209
+ }
210
+ });
211
+ const StatBar = exports.StatBar = /*#__PURE__*/(0, _react.memo)(StatBarComponent);
212
+ StatBar.displayName = 'StatBar';
213
+ //# sourceMappingURL=StatBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_useTheme","_index","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","clampPercent","value","Number","isNaN","Math","max","min","StatBarComponent","props","colors","useTheme","label","fillColor","trackColor","height","icon","style","testID","fill","primary","track","backgroundSecondary","radius","variant","percent","leftValue","rightValue","leftColor","rightColor","leftPercent","activeLeft","remainder","jsxs","View","styles","wrap","children","labelRow","jsx","Text","color","textSecondary","numberOfLines","text","round","borderRadius","backgroundColor","width","footerRow","footerValue","textTertiary","minLabel","maxLabel","ratio","hasFooter","accessibilityRole","accessibilityValue","now","StyleSheet","create","gap","flexDirection","alignItems","justifyContent","flexShrink","fontSize","fontWeight","letterSpacing","fontVariant","marginLeft","overflow","borderCurve","StatBar","exports","memo","displayName"],"sourceRoot":"../../../src","sources":["stat-bar/StatBar.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAEA,IAAAE,SAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AAAqC,IAAAI,WAAA,GAAAJ,OAAA;AAAA,SAAAD,wBAAAM,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAR,uBAAA,YAAAA,CAAAM,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAGrC,SAASkB,YAAYA,CAACC,KAAa,EAAU;EAC3C,IAAIC,MAAM,CAACC,KAAK,CAACF,KAAK,CAAC,EAAE,OAAO,CAAC;EACjC,OAAOG,IAAI,CAACC,GAAG,CAAC,CAAC,EAAED,IAAI,CAACE,GAAG,CAAC,GAAG,EAAEL,KAAK,CAAC,CAAC;AAC1C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMM,gBAAwC,GAAIC,KAAK,IAAK;EAC1D,MAAM;IAAEC;EAAO,CAAC,GAAG,IAAAC,kBAAQ,EAAC,CAAC;EAC7B,MAAM;IAAEC,KAAK;IAAEC,SAAS;IAAEC,UAAU;IAAEC,MAAM,GAAG,CAAC;IAAEC,IAAI;IAAEC,KAAK;IAAEC;EAAO,CAAC,GAAGT,KAAK;EAC/E,MAAMU,IAAI,GAAGN,SAAS,IAAIH,MAAM,CAACU,OAAO;EACxC,MAAMC,KAAK,GAAGP,UAAU,IAAIJ,MAAM,CAACY,mBAAmB;EACtD,MAAMC,MAAM,GAAGR,MAAM,GAAG,CAAC;EAEzB,IAAIN,KAAK,CAACe,OAAO,KAAK,OAAO,EAAE;IAC7B,MAAM;MAAEC,OAAO;MAAEC,SAAS;MAAEC,UAAU;MAAEC,SAAS;MAAEC;IAAW,CAAC,GAAGpB,KAAK;IACvE,MAAMqB,WAAW,GAAG7B,YAAY,CAACwB,OAAO,CAAC;IACzC,MAAMM,UAAU,GAAGH,SAAS,IAAIT,IAAI;IACpC,MAAMa,SAAS,GAAGH,UAAU,IAAIR,KAAK;IAErC,oBACE,IAAAxC,WAAA,CAAAoD,IAAA,EAACvD,YAAA,CAAAwD,IAAI;MAACjB,KAAK,EAAE,CAACkB,MAAM,CAACC,IAAI,EAAEnB,KAAK,CAAE;MAACC,MAAM,EAAEA,MAAO;MAAAmB,QAAA,gBAChD,IAAAxD,WAAA,CAAAoD,IAAA,EAACvD,YAAA,CAAAwD,IAAI;QAACjB,KAAK,EAAEkB,MAAM,CAACG,QAAS;QAAAD,QAAA,gBAC3B,IAAAxD,WAAA,CAAA0D,GAAA,EAAC3D,MAAA,CAAA4D,IAAI;UAACvB,KAAK,EAAE,CAACkB,MAAM,CAACvB,KAAK,EAAE;YAAE6B,KAAK,EAAE/B,MAAM,CAACgC;UAAc,CAAC,CAAE;UAACC,aAAa,EAAE,CAAE;UAAAN,QAAA,EAC5EzB;QAAK,CACF,CAAC,eACP,IAAA/B,WAAA,CAAAoD,IAAA,EAACrD,MAAA,CAAA4D,IAAI;UAACvB,KAAK,EAAE,CAACkB,MAAM,CAACV,OAAO,EAAE;YAAEgB,KAAK,EAAE/B,MAAM,CAACkC;UAAK,CAAC,CAAE;UAACD,aAAa,EAAE,CAAE;UAAAN,QAAA,GACrEhC,IAAI,CAACwC,KAAK,CAACf,WAAW,CAAC,EAAC,GAC3B;QAAA,CAAM,CAAC;MAAA,CACH,CAAC,eAEP,IAAAjD,WAAA,CAAA0D,GAAA,EAAC7D,YAAA,CAAAwD,IAAI;QAACjB,KAAK,EAAE,CAACkB,MAAM,CAACd,KAAK,EAAE;UAAEN,MAAM;UAAE+B,YAAY,EAAEvB,MAAM;UAAEwB,eAAe,EAAEf;QAAU,CAAC,CAAE;QAAAK,QAAA,eACxF,IAAAxD,WAAA,CAAA0D,GAAA,EAAC7D,YAAA,CAAAwD,IAAI;UACHjB,KAAK,EAAE;YAAE+B,KAAK,EAAE,GAAGlB,WAAW,GAAG;YAAEf,MAAM;YAAE+B,YAAY,EAAEvB,MAAM;YAAEwB,eAAe,EAAEhB;UAAW;QAAE,CAChG;MAAC,CACE,CAAC,eAEP,IAAAlD,WAAA,CAAAoD,IAAA,EAACvD,YAAA,CAAAwD,IAAI;QAACjB,KAAK,EAAEkB,MAAM,CAACc,SAAU;QAAAZ,QAAA,gBAC5B,IAAAxD,WAAA,CAAA0D,GAAA,EAAC3D,MAAA,CAAA4D,IAAI;UAACvB,KAAK,EAAE,CAACkB,MAAM,CAACe,WAAW,EAAE;YAAET,KAAK,EAAE/B,MAAM,CAACyC;UAAa,CAAC,CAAE;UAACR,aAAa,EAAE,CAAE;UAAAN,QAAA,EACjFX;QAAS,CACN,CAAC,eACP,IAAA7C,WAAA,CAAA0D,GAAA,EAAC3D,MAAA,CAAA4D,IAAI;UAACvB,KAAK,EAAE,CAACkB,MAAM,CAACe,WAAW,EAAE;YAAET,KAAK,EAAE/B,MAAM,CAACyC;UAAa,CAAC,CAAE;UAACR,aAAa,EAAE,CAAE;UAAAN,QAAA,EACjFV;QAAU,CACP,CAAC;MAAA,CACH,CAAC;IAAA,CACH,CAAC;EAEX;EAEA,MAAM;IAAEzB,KAAK;IAAEI,GAAG;IAAE8C,QAAQ;IAAEC;EAAS,CAAC,GAAG5C,KAAK;EAChD,MAAM6C,KAAK,GAAGhD,GAAG,GAAG,CAAC,GAAGL,YAAY,CAAEC,KAAK,GAAGI,GAAG,GAAI,GAAG,CAAC,GAAG,CAAC;EAC7D,MAAMiD,SAAS,GAAGH,QAAQ,IAAI,IAAI,IAAIC,QAAQ,IAAI,IAAI;EAEtD,oBACE,IAAAxE,WAAA,CAAAoD,IAAA,EAACvD,YAAA,CAAAwD,IAAI;IAACjB,KAAK,EAAE,CAACkB,MAAM,CAACC,IAAI,EAAEnB,KAAK,CAAE;IAACC,MAAM,EAAEA,MAAO;IAAAmB,QAAA,gBAChD,IAAAxD,WAAA,CAAAoD,IAAA,EAACvD,YAAA,CAAAwD,IAAI;MAACjB,KAAK,EAAEkB,MAAM,CAACG,QAAS;MAAAD,QAAA,gBAC3B,IAAAxD,WAAA,CAAA0D,GAAA,EAAC3D,MAAA,CAAA4D,IAAI;QAACvB,KAAK,EAAE,CAACkB,MAAM,CAACvB,KAAK,EAAE;UAAE6B,KAAK,EAAE/B,MAAM,CAACgC;QAAc,CAAC,CAAE;QAACC,aAAa,EAAE,CAAE;QAAAN,QAAA,EAC5EzB;MAAK,CACF,CAAC,EACNI,IAAI,IAAI,IAAI,iBAAI,IAAAnC,WAAA,CAAA0D,GAAA,EAAC7D,YAAA,CAAAwD,IAAI;QAACjB,KAAK,EAAEkB,MAAM,CAACnB,IAAK;QAAAqB,QAAA,EAAErB;MAAI,CAAO,CAAC;IAAA,CACpD,CAAC,eAEP,IAAAnC,WAAA,CAAA0D,GAAA,EAAC7D,YAAA,CAAAwD,IAAI;MACHjB,KAAK,EAAE,CAACkB,MAAM,CAACd,KAAK,EAAE;QAAEN,MAAM;QAAE+B,YAAY,EAAEvB,MAAM;QAAEwB,eAAe,EAAE1B;MAAM,CAAC,CAAE;MAChFmC,iBAAiB,EAAC,aAAa;MAC/BC,kBAAkB,EAAE;QAAElD,GAAG,EAAE,CAAC;QAAED,GAAG;QAAEoD,GAAG,EAAExD;MAAM,CAAE;MAAAmC,QAAA,eAEhD,IAAAxD,WAAA,CAAA0D,GAAA,EAAC7D,YAAA,CAAAwD,IAAI;QAACjB,KAAK,EAAE;UAAE+B,KAAK,EAAE,GAAGM,KAAK,GAAG;UAAEvC,MAAM;UAAE+B,YAAY,EAAEvB,MAAM;UAAEwB,eAAe,EAAE5B;QAAK;MAAE,CAAE;IAAC,CACxF,CAAC,EAENoC,SAAS,iBACR,IAAA1E,WAAA,CAAAoD,IAAA,EAACvD,YAAA,CAAAwD,IAAI;MAACjB,KAAK,EAAEkB,MAAM,CAACc,SAAU;MAAAZ,QAAA,gBAC5B,IAAAxD,WAAA,CAAA0D,GAAA,EAAC3D,MAAA,CAAA4D,IAAI;QAACvB,KAAK,EAAE,CAACkB,MAAM,CAACe,WAAW,EAAE;UAAET,KAAK,EAAE/B,MAAM,CAACyC;QAAa,CAAC,CAAE;QAACR,aAAa,EAAE,CAAE;QAAAN,QAAA,EACjFe,QAAQ,IAAI;MAAE,CACX,CAAC,eACP,IAAAvE,WAAA,CAAA0D,GAAA,EAAC3D,MAAA,CAAA4D,IAAI;QAACvB,KAAK,EAAE,CAACkB,MAAM,CAACe,WAAW,EAAE;UAAET,KAAK,EAAE/B,MAAM,CAACyC;QAAa,CAAC,CAAE;QAACR,aAAa,EAAE,CAAE;QAAAN,QAAA,EACjFgB,QAAQ,IAAI;MAAE,CACX,CAAC;IAAA,CACH,CACP;EAAA,CACG,CAAC;AAEX,CAAC;AAED,MAAMlB,MAAM,GAAGwB,uBAAU,CAACC,MAAM,CAAC;EAC/BxB,IAAI,EAAE;IAAEyB,GAAG,EAAE;EAAE,CAAC;EAChBvB,QAAQ,EAAE;IACRwB,aAAa,EAAE,KAAK;IACpBC,UAAU,EAAE,QAAQ;IACpBC,cAAc,EAAE,eAAe;IAC/BH,GAAG,EAAE;EACP,CAAC;EACDjD,KAAK,EAAE;IAAEqD,UAAU,EAAE,CAAC;IAAEC,QAAQ,EAAE,EAAE;IAAEC,UAAU,EAAE;EAAM,CAAC;EACzD1C,OAAO,EAAE;IAAEyC,QAAQ,EAAE,EAAE;IAAEC,UAAU,EAAE,KAAK;IAAEC,aAAa,EAAE,CAAC,GAAG;IAAEC,WAAW,EAAE,CAAC,cAAc;EAAE,CAAC;EAChGrD,IAAI,EAAE;IAAEsD,UAAU,EAAE;EAAE,CAAC;EACvBjD,KAAK,EAAE;IAAE2B,KAAK,EAAE,MAAM;IAAEuB,QAAQ,EAAE,QAAQ;IAAET,aAAa,EAAE,KAAK;IAAEU,WAAW,EAAE;EAAa,CAAC;EAC7FvB,SAAS,EAAE;IACTa,aAAa,EAAE,KAAK;IACpBC,UAAU,EAAE,QAAQ;IACpBC,cAAc,EAAE,eAAe;IAC/BH,GAAG,EAAE;EACP,CAAC;EACDX,WAAW,EAAE;IAAEgB,QAAQ,EAAE,EAAE;IAAEG,WAAW,EAAE,CAAC,cAAc;EAAE;AAC7D,CAAC,CAAC;AAEK,MAAMI,OAAO,GAAAC,OAAA,CAAAD,OAAA,gBAAG,IAAAE,WAAI,EAACnE,gBAAgB,CAAC;AAC7CiE,OAAO,CAACG,WAAW,GAAG,SAAS","ignoreList":[]}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "StatBar", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _StatBar.StatBar;
10
+ }
11
+ });
12
+ var _StatBar = require("./StatBar.js");
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_StatBar","require"],"sourceRoot":"../../../src","sources":["stat-bar/index.ts"],"mappings":";;;;;;;;;;;AAAA,IAAAA,QAAA,GAAAC,OAAA","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../src","sources":["stat-bar/types.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,299 @@
1
+ "use strict";
2
+
3
+ import React, { memo, useMemo } from 'react';
4
+ import { View, Pressable, StyleSheet } from 'react-native';
5
+ import { useTheme } from "../theme/use-theme.js";
6
+ import { Text } from "../typography/index.js";
7
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
8
+ const DAY_MS = 86_400_000;
9
+ const DEFAULT_NUM_DAYS = 364;
10
+ const DEFAULT_LEVELS = [1, 3, 6, 10];
11
+ const DEFAULT_MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
12
+ /** Opacity steps (low→high) used to derive the default color scale from primary. */
13
+ const DEFAULT_ALPHAS = [0.16, 0.32, 0.52, 0.75, 1];
14
+ const LABEL_FONT_SIZE = 10;
15
+ const MONTH_ROW_HEIGHT = 16;
16
+ const WEEKDAY_COL_WIDTH = 26;
17
+ const DATE_KEY_RE = /^(\d{4})-(\d{2})-(\d{2})/;
18
+ function parseDateKey(key) {
19
+ const match = DATE_KEY_RE.exec(key);
20
+ if (match) {
21
+ const year = Number(match[1]);
22
+ const month = Number(match[2]);
23
+ const day = Number(match[3]);
24
+ const ts = Date.UTC(year, month - 1, day);
25
+ return Number.isNaN(ts) ? null : ts;
26
+ }
27
+ const parsed = Date.parse(key);
28
+ return Number.isNaN(parsed) ? null : parsed;
29
+ }
30
+ function formatUtcKey(ts) {
31
+ const d = new Date(ts);
32
+ const year = d.getUTCFullYear();
33
+ const month = String(d.getUTCMonth() + 1).padStart(2, '0');
34
+ const day = String(d.getUTCDate()).padStart(2, '0');
35
+ return `${year}-${month}-${day}`;
36
+ }
37
+
38
+ /** Count of ascending thresholds `count` meets — the color-scale index. */
39
+ function levelForCount(count, levels) {
40
+ if (count <= 0) return 0;
41
+ let level = 0;
42
+ for (const threshold of levels) {
43
+ if (count >= threshold) level += 1;else break;
44
+ }
45
+ return level;
46
+ }
47
+ function parseRgb(color) {
48
+ const trimmed = color.trim();
49
+ if (trimmed.startsWith('#')) {
50
+ let hex = trimmed.slice(1);
51
+ if (hex.length === 3) hex = hex.split('').map(c => c + c).join('');
52
+ if (hex.length !== 6) return null;
53
+ const r = parseInt(hex.slice(0, 2), 16);
54
+ const g = parseInt(hex.slice(2, 4), 16);
55
+ const b = parseInt(hex.slice(4, 6), 16);
56
+ if ([r, g, b].some(v => Number.isNaN(v))) return null;
57
+ return {
58
+ r,
59
+ g,
60
+ b
61
+ };
62
+ }
63
+ const match = /rgba?\(([^)]+)\)/i.exec(trimmed);
64
+ if (!match || match[1] === undefined) return null;
65
+ const parts = match[1].split(/[\s,/]+/).filter(Boolean).map(Number);
66
+ if (parts.length < 3) return null;
67
+ const [r, g, b] = parts;
68
+ if (r === undefined || g === undefined || b === undefined) return null;
69
+ if ([r, g, b].some(v => Number.isNaN(v))) return null;
70
+ return {
71
+ r,
72
+ g,
73
+ b
74
+ };
75
+ }
76
+
77
+ /** Compose `color` at `alpha`; returns the input unchanged if it can't parse. */
78
+ function withAlpha(color, alpha) {
79
+ const rgb = parseRgb(color);
80
+ if (!rgb) return color;
81
+ return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha})`;
82
+ }
83
+ /**
84
+ * A GitHub-style contribution graph: columns of weeks × 7 weekday rows of
85
+ * rounded square cells, each colored by its day's activity level. Pure `<View>`
86
+ * composition (no SVG), rendering identically on web and native. The component
87
+ * lays out at its natural width — wrap it in a horizontal `ScrollView` for
88
+ * narrow viewports. All date math runs in UTC and the system clock is never
89
+ * read; anchor the grid with `endDate`.
90
+ */
91
+ const ActivityHeatmapComponent = ({
92
+ data,
93
+ numDays = DEFAULT_NUM_DAYS,
94
+ endDate,
95
+ levels = DEFAULT_LEVELS,
96
+ colorScale,
97
+ emptyColor,
98
+ cellSize = 12,
99
+ gap = 3,
100
+ weekStartsOn = 0,
101
+ monthLabels,
102
+ weekdayLabels,
103
+ onPressDay,
104
+ style,
105
+ testID
106
+ }) => {
107
+ const {
108
+ colors
109
+ } = useTheme();
110
+ const empty = emptyColor ?? colors.backgroundSecondary;
111
+ const scale = useMemo(() => colorScale ?? DEFAULT_ALPHAS.map(alpha => withAlpha(colors.primary, alpha)), [colorScale, colors.primary]);
112
+ const sortedLevels = useMemo(() => [...levels].sort((a, b) => a - b), [levels]);
113
+ const months = monthLabels ?? DEFAULT_MONTHS;
114
+ const grid = useMemo(() => {
115
+ // Sum counts per UTC day.
116
+ const countByKey = new Map();
117
+ let latest = null;
118
+ for (const entry of data) {
119
+ const ts = parseDateKey(entry.date);
120
+ if (ts === null) continue;
121
+ const key = formatUtcKey(ts);
122
+ countByKey.set(key, (countByKey.get(key) ?? 0) + entry.count);
123
+ if (latest === null || ts > latest) latest = ts;
124
+ }
125
+ const providedEnd = endDate ? parseDateKey(endDate) : null;
126
+ const endTs = providedEnd ?? latest;
127
+ if (endTs === null) return null;
128
+ const days = Math.max(1, Math.floor(numDays));
129
+ const rawStart = endTs - (days - 1) * DAY_MS;
130
+ // Align the first column to the start-of-week boundary.
131
+ const back = (new Date(rawStart).getUTCDay() - weekStartsOn + 7) % 7;
132
+ const gridStart = rawStart - back * DAY_MS;
133
+ const columnCount = Math.ceil((Math.floor((endTs - gridStart) / DAY_MS) + 1) / 7);
134
+ const maxColor = scale.length - 1;
135
+ const columns = [];
136
+ for (let c = 0; c < columnCount; c++) {
137
+ const column = [];
138
+ for (let r = 0; r < 7; r++) {
139
+ const ts = gridStart + (c * 7 + r) * DAY_MS;
140
+ if (ts > endTs) {
141
+ column.push(null);
142
+ continue;
143
+ }
144
+ const key = formatUtcKey(ts);
145
+ const count = countByKey.get(key) ?? 0;
146
+ const level = Math.min(levelForCount(count, sortedLevels), maxColor);
147
+ const color = count <= 0 ? empty : scale[level] ?? empty;
148
+ column.push({
149
+ key,
150
+ count,
151
+ color
152
+ });
153
+ }
154
+ columns.push(column);
155
+ }
156
+
157
+ // Month labels: first column whose leading day starts a new month.
158
+ const monthMarks = [];
159
+ let lastMonth = -1;
160
+ for (let c = 0; c < columnCount; c++) {
161
+ const firstTs = gridStart + c * 7 * DAY_MS;
162
+ const month = new Date(firstTs).getUTCMonth();
163
+ if (month !== lastMonth) {
164
+ monthMarks.push({
165
+ x: c * (cellSize + gap),
166
+ label: months[month] ?? DEFAULT_MONTHS[month] ?? ''
167
+ });
168
+ lastMonth = month;
169
+ }
170
+ }
171
+ return {
172
+ columns,
173
+ monthMarks
174
+ };
175
+ }, [data, endDate, numDays, weekStartsOn, sortedLevels, scale, empty, cellSize, gap, months]);
176
+ if (!grid) {
177
+ return /*#__PURE__*/_jsx(View, {
178
+ style: style,
179
+ testID: testID
180
+ });
181
+ }
182
+ const {
183
+ columns,
184
+ monthMarks
185
+ } = grid;
186
+ const hasWeekdayCol = Array.isArray(weekdayLabels);
187
+ const weekdayColWidth = hasWeekdayCol ? WEEKDAY_COL_WIDTH : 0;
188
+ const monthRowMarginLeft = hasWeekdayCol ? weekdayColWidth + gap : 0;
189
+ const cellRadius = Math.max(2, Math.round(cellSize * 0.25));
190
+ return /*#__PURE__*/_jsxs(View, {
191
+ style: style,
192
+ testID: testID,
193
+ children: [/*#__PURE__*/_jsx(View, {
194
+ style: [styles.monthRow, {
195
+ marginLeft: monthRowMarginLeft
196
+ }],
197
+ children: monthMarks.map((mark, i) => /*#__PURE__*/_jsx(Text, {
198
+ numberOfLines: 1,
199
+ style: [styles.label, {
200
+ left: mark.x,
201
+ color: colors.textTertiary
202
+ }],
203
+ children: mark.label
204
+ }, `${mark.label}-${i}`))
205
+ }), /*#__PURE__*/_jsxs(View, {
206
+ style: styles.body,
207
+ children: [hasWeekdayCol && /*#__PURE__*/_jsx(View, {
208
+ style: {
209
+ width: weekdayColWidth,
210
+ marginRight: gap
211
+ },
212
+ children: Array.from({
213
+ length: 7
214
+ }, (_, r) => {
215
+ const dow = (weekStartsOn + r) % 7;
216
+ return /*#__PURE__*/_jsx(View, {
217
+ style: {
218
+ height: cellSize,
219
+ marginBottom: r < 6 ? gap : 0,
220
+ justifyContent: 'center'
221
+ },
222
+ children: /*#__PURE__*/_jsx(Text, {
223
+ numberOfLines: 1,
224
+ style: [styles.weekdayLabel, {
225
+ color: colors.textTertiary
226
+ }],
227
+ children: weekdayLabels[dow] ?? ''
228
+ })
229
+ }, r);
230
+ })
231
+ }), /*#__PURE__*/_jsx(View, {
232
+ style: styles.grid,
233
+ children: columns.map((column, c) => /*#__PURE__*/_jsx(View, {
234
+ style: {
235
+ marginRight: c < columns.length - 1 ? gap : 0
236
+ },
237
+ children: column.map((cell, r) => {
238
+ const cellStyle = {
239
+ width: cellSize,
240
+ height: cellSize,
241
+ borderRadius: cellRadius,
242
+ marginBottom: r < 6 ? gap : 0
243
+ };
244
+ if (!cell) {
245
+ return /*#__PURE__*/_jsx(View, {
246
+ style: cellStyle
247
+ }, r);
248
+ }
249
+ if (onPressDay) {
250
+ const day = {
251
+ date: cell.key,
252
+ count: cell.count
253
+ };
254
+ return /*#__PURE__*/_jsx(Pressable, {
255
+ onPress: () => onPressDay(day),
256
+ accessibilityRole: "button",
257
+ accessibilityLabel: `${cell.key}: ${cell.count}`,
258
+ style: [cellStyle, styles.cell, {
259
+ backgroundColor: cell.color
260
+ }]
261
+ }, r);
262
+ }
263
+ return /*#__PURE__*/_jsx(View, {
264
+ style: [cellStyle, styles.cell, {
265
+ backgroundColor: cell.color
266
+ }]
267
+ }, r);
268
+ })
269
+ }, c))
270
+ })]
271
+ })]
272
+ });
273
+ };
274
+ const styles = StyleSheet.create({
275
+ monthRow: {
276
+ height: MONTH_ROW_HEIGHT,
277
+ position: 'relative'
278
+ },
279
+ label: {
280
+ position: 'absolute',
281
+ top: 0,
282
+ fontSize: LABEL_FONT_SIZE
283
+ },
284
+ body: {
285
+ flexDirection: 'row'
286
+ },
287
+ grid: {
288
+ flexDirection: 'row'
289
+ },
290
+ cell: {
291
+ borderCurve: 'continuous'
292
+ },
293
+ weekdayLabel: {
294
+ fontSize: LABEL_FONT_SIZE
295
+ }
296
+ });
297
+ export const ActivityHeatmap = /*#__PURE__*/memo(ActivityHeatmapComponent);
298
+ ActivityHeatmap.displayName = 'ActivityHeatmap';
299
+ //# sourceMappingURL=ActivityHeatmap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","memo","useMemo","View","Pressable","StyleSheet","useTheme","Text","jsx","_jsx","jsxs","_jsxs","DAY_MS","DEFAULT_NUM_DAYS","DEFAULT_LEVELS","DEFAULT_MONTHS","DEFAULT_ALPHAS","LABEL_FONT_SIZE","MONTH_ROW_HEIGHT","WEEKDAY_COL_WIDTH","DATE_KEY_RE","parseDateKey","key","match","exec","year","Number","month","day","ts","Date","UTC","isNaN","parsed","parse","formatUtcKey","d","getUTCFullYear","String","getUTCMonth","padStart","getUTCDate","levelForCount","count","levels","level","threshold","parseRgb","color","trimmed","trim","startsWith","hex","slice","length","split","map","c","join","r","parseInt","g","b","some","v","undefined","parts","filter","Boolean","withAlpha","alpha","rgb","ActivityHeatmapComponent","data","numDays","endDate","colorScale","emptyColor","cellSize","gap","weekStartsOn","monthLabels","weekdayLabels","onPressDay","style","testID","colors","empty","backgroundSecondary","scale","primary","sortedLevels","sort","a","months","grid","countByKey","Map","latest","entry","date","set","get","providedEnd","endTs","days","Math","max","floor","rawStart","back","getUTCDay","gridStart","columnCount","ceil","maxColor","columns","column","push","min","monthMarks","lastMonth","firstTs","x","label","hasWeekdayCol","Array","isArray","weekdayColWidth","monthRowMarginLeft","cellRadius","round","children","styles","monthRow","marginLeft","mark","i","numberOfLines","left","textTertiary","body","width","marginRight","from","_","dow","height","marginBottom","justifyContent","weekdayLabel","cell","cellStyle","borderRadius","onPress","accessibilityRole","accessibilityLabel","backgroundColor","create","position","top","fontSize","flexDirection","borderCurve","ActivityHeatmap","displayName"],"sourceRoot":"../../../src","sources":["activity-heatmap/ActivityHeatmap.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ const DATE_KEY_RE = /^(\d{4})-(\d{2})-(\d{2})/;
4
+
5
+ /**
6
+ * Normalize a date input to a `YYYY-MM-DD` key in UTC, or `null` if it can't be
7
+ * parsed. Strings already prefixed with an ISO date are sliced directly (no
8
+ * timezone shift); everything else is parsed and formatted in UTC.
9
+ */
10
+ function toDateKey(value) {
11
+ if (value instanceof Date) {
12
+ const ts = value.getTime();
13
+ if (Number.isNaN(ts)) return null;
14
+ return formatUtcKey(ts);
15
+ }
16
+ if (DATE_KEY_RE.test(value)) return value.slice(0, 10);
17
+ const parsed = Date.parse(value);
18
+ if (Number.isNaN(parsed)) return null;
19
+ return formatUtcKey(parsed);
20
+ }
21
+ function formatUtcKey(ts) {
22
+ const d = new Date(ts);
23
+ const year = d.getUTCFullYear();
24
+ const month = String(d.getUTCMonth() + 1).padStart(2, '0');
25
+ const day = String(d.getUTCDate()).padStart(2, '0');
26
+ return `${year}-${month}-${day}`;
27
+ }
28
+
29
+ /**
30
+ * Group arbitrary items by their `YYYY-MM-DD` day and count how many fall on
31
+ * each day. Returns entries sorted ascending by date — ready to hand to
32
+ * {@link ActivityHeatmap}'s `data` prop. Items whose date can't be parsed are
33
+ * skipped.
34
+ */
35
+ export function bucketByDay(items, getDate) {
36
+ const counts = new Map();
37
+ for (const item of items) {
38
+ const key = toDateKey(getDate(item));
39
+ if (key === null) continue;
40
+ counts.set(key, (counts.get(key) ?? 0) + 1);
41
+ }
42
+ return [...counts.entries()].map(([date, count]) => ({
43
+ date,
44
+ count
45
+ })).sort((a, b) => a.date < b.date ? -1 : a.date > b.date ? 1 : 0);
46
+ }
47
+ //# sourceMappingURL=bucketByDay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["DATE_KEY_RE","toDateKey","value","Date","ts","getTime","Number","isNaN","formatUtcKey","test","slice","parsed","parse","d","year","getUTCFullYear","month","String","getUTCMonth","padStart","day","getUTCDate","bucketByDay","items","getDate","counts","Map","item","key","set","get","entries","map","date","count","sort","a","b"],"sourceRoot":"../../../src","sources":["activity-heatmap/bucketByDay.ts"],"mappings":";;AAEA,MAAMA,WAAW,GAAG,0BAA0B;;AAE9C;AACA;AACA;AACA;AACA;AACA,SAASC,SAASA,CAACC,KAAoB,EAAiB;EACtD,IAAIA,KAAK,YAAYC,IAAI,EAAE;IACzB,MAAMC,EAAE,GAAGF,KAAK,CAACG,OAAO,CAAC,CAAC;IAC1B,IAAIC,MAAM,CAACC,KAAK,CAACH,EAAE,CAAC,EAAE,OAAO,IAAI;IACjC,OAAOI,YAAY,CAACJ,EAAE,CAAC;EACzB;EACA,IAAIJ,WAAW,CAACS,IAAI,CAACP,KAAK,CAAC,EAAE,OAAOA,KAAK,CAACQ,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;EACtD,MAAMC,MAAM,GAAGR,IAAI,CAACS,KAAK,CAACV,KAAK,CAAC;EAChC,IAAII,MAAM,CAACC,KAAK,CAACI,MAAM,CAAC,EAAE,OAAO,IAAI;EACrC,OAAOH,YAAY,CAACG,MAAM,CAAC;AAC7B;AAEA,SAASH,YAAYA,CAACJ,EAAU,EAAU;EACxC,MAAMS,CAAC,GAAG,IAAIV,IAAI,CAACC,EAAE,CAAC;EACtB,MAAMU,IAAI,GAAGD,CAAC,CAACE,cAAc,CAAC,CAAC;EAC/B,MAAMC,KAAK,GAAGC,MAAM,CAACJ,CAAC,CAACK,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;EAC1D,MAAMC,GAAG,GAAGH,MAAM,CAACJ,CAAC,CAACQ,UAAU,CAAC,CAAC,CAAC,CAACF,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;EACnD,OAAO,GAAGL,IAAI,IAAIE,KAAK,IAAII,GAAG,EAAE;AAClC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,WAAWA,CACzBC,KAAU,EACVC,OAAmC,EACb;EACtB,MAAMC,MAAM,GAAG,IAAIC,GAAG,CAAiB,CAAC;EACxC,KAAK,MAAMC,IAAI,IAAIJ,KAAK,EAAE;IACxB,MAAMK,GAAG,GAAG3B,SAAS,CAACuB,OAAO,CAACG,IAAI,CAAC,CAAC;IACpC,IAAIC,GAAG,KAAK,IAAI,EAAE;IAClBH,MAAM,CAACI,GAAG,CAACD,GAAG,EAAE,CAACH,MAAM,CAACK,GAAG,CAACF,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;EAC7C;EACA,OAAO,CAAC,GAAGH,MAAM,CAACM,OAAO,CAAC,CAAC,CAAC,CACzBC,GAAG,CAAC,CAAC,CAACC,IAAI,EAAEC,KAAK,CAAC,MAAM;IAAED,IAAI;IAAEC;EAAM,CAAC,CAAC,CAAC,CACzCC,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAMD,CAAC,CAACH,IAAI,GAAGI,CAAC,CAACJ,IAAI,GAAG,CAAC,CAAC,GAAGG,CAAC,CAACH,IAAI,GAAGI,CAAC,CAACJ,IAAI,GAAG,CAAC,GAAG,CAAE,CAAC;AACrE","ignoreList":[]}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ export { ActivityHeatmap } from "./ActivityHeatmap.js";
4
+ export { bucketByDay } from "./bucketByDay.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ActivityHeatmap","bucketByDay"],"sourceRoot":"../../../src","sources":["activity-heatmap/index.ts"],"mappings":";;AAAA,SAASA,eAAe,QAAQ,sBAAmB;AACnD,SAASC,WAAW,QAAQ,kBAAe","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../src","sources":["activity-heatmap/types.ts"],"mappings":"","ignoreList":[]}