@spatika/react 1.1.0 → 1.3.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 (311) hide show
  1. package/AGENTS.md +71 -0
  2. package/README.md +4 -3
  3. package/dist/composites/Card.d.ts +7 -1
  4. package/dist/composites/Card.d.ts.map +1 -1
  5. package/dist/composites/Card.js +10 -0
  6. package/dist/composites/ChartDataGrid.d.ts +33 -0
  7. package/dist/composites/ChartDataGrid.d.ts.map +1 -0
  8. package/dist/composites/ChartDataGrid.js +77 -0
  9. package/dist/composites/CoverHero.d.ts +1 -1
  10. package/dist/composites/CoverHero.d.ts.map +1 -1
  11. package/dist/composites/CoverHero.js +2 -2
  12. package/dist/composites/EntityMediaCard.d.ts +1 -1
  13. package/dist/composites/EntityMediaCard.d.ts.map +1 -1
  14. package/dist/composites/EntityMediaCard.js +12 -4
  15. package/dist/composites/EventCalendar.d.ts +72 -0
  16. package/dist/composites/EventCalendar.d.ts.map +1 -0
  17. package/dist/composites/EventCalendar.js +371 -0
  18. package/dist/composites/EventEditor.d.ts +22 -0
  19. package/dist/composites/EventEditor.d.ts.map +1 -0
  20. package/dist/composites/EventEditor.js +86 -0
  21. package/dist/composites/EventTimeline.d.ts +29 -0
  22. package/dist/composites/EventTimeline.d.ts.map +1 -0
  23. package/dist/composites/EventTimeline.js +186 -0
  24. package/dist/composites/MapChart.d.ts +24 -0
  25. package/dist/composites/MapChart.d.ts.map +1 -0
  26. package/dist/composites/MapChart.js +58 -0
  27. package/dist/composites/ProfileHero.d.ts +6 -4
  28. package/dist/composites/ProfileHero.d.ts.map +1 -1
  29. package/dist/composites/ProfileHero.js +8 -8
  30. package/dist/composites/ScatterWebGL.d.ts +22 -0
  31. package/dist/composites/ScatterWebGL.d.ts.map +1 -0
  32. package/dist/composites/ScatterWebGL.js +45 -0
  33. package/dist/composites/SiteFooter.d.ts +1 -1
  34. package/dist/composites/SiteFooter.js +1 -1
  35. package/dist/composites/SiteNav.d.ts +7 -2
  36. package/dist/composites/SiteNav.d.ts.map +1 -1
  37. package/dist/composites/SiteNav.js +9 -5
  38. package/dist/composites/StatCard.d.ts +2 -1
  39. package/dist/composites/StatCard.d.ts.map +1 -1
  40. package/dist/composites/StatCard.js +3 -3
  41. package/dist/composites/StatusDot.d.ts +1 -1
  42. package/dist/composites/Wordmark.d.ts +2 -2
  43. package/dist/composites/Wordmark.d.ts.map +1 -1
  44. package/dist/composites/cartesian-charts.d.ts +138 -0
  45. package/dist/composites/cartesian-charts.d.ts.map +1 -0
  46. package/dist/composites/cartesian-charts.js +401 -0
  47. package/dist/composites/chart-composition.d.ts +139 -0
  48. package/dist/composites/chart-composition.d.ts.map +1 -0
  49. package/dist/composites/chart-composition.js +486 -0
  50. package/dist/composites/chart-ui.d.ts +83 -0
  51. package/dist/composites/chart-ui.d.ts.map +1 -0
  52. package/dist/composites/chart-ui.js +108 -0
  53. package/dist/composites/charts-3d.d.ts +37 -0
  54. package/dist/composites/charts-3d.d.ts.map +1 -0
  55. package/dist/composites/charts-3d.js +121 -0
  56. package/dist/composites/flow-charts.d.ts +89 -0
  57. package/dist/composites/flow-charts.d.ts.map +1 -0
  58. package/dist/composites/flow-charts.js +186 -0
  59. package/dist/composites/radial-charts.d.ts +109 -0
  60. package/dist/composites/radial-charts.d.ts.map +1 -0
  61. package/dist/composites/radial-charts.js +176 -0
  62. package/dist/composites/scheduler-ui.d.ts +44 -0
  63. package/dist/composites/scheduler-ui.d.ts.map +1 -0
  64. package/dist/composites/scheduler-ui.js +71 -0
  65. package/dist/index.d.ts +68 -7
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +58 -7
  68. package/dist/lib/chart-export.d.ts +10 -0
  69. package/dist/lib/chart-export.d.ts.map +1 -0
  70. package/dist/lib/chart-export.js +102 -0
  71. package/dist/lib/charts.d.ts +235 -0
  72. package/dist/lib/charts.d.ts.map +1 -0
  73. package/dist/lib/charts.js +744 -0
  74. package/dist/lib/geo.d.ts +39 -0
  75. package/dist/lib/geo.d.ts.map +1 -0
  76. package/dist/lib/geo.js +101 -0
  77. package/dist/lib/iso.d.ts +21 -0
  78. package/dist/lib/iso.d.ts.map +1 -0
  79. package/dist/lib/iso.js +56 -0
  80. package/dist/lib/rrule.d.ts +20 -0
  81. package/dist/lib/rrule.d.ts.map +1 -0
  82. package/dist/lib/rrule.js +236 -0
  83. package/dist/lib/scheduler.d.ts +156 -0
  84. package/dist/lib/scheduler.d.ts.map +1 -0
  85. package/dist/lib/scheduler.js +502 -0
  86. package/dist/lib/webgl-scatter.d.ts +44 -0
  87. package/dist/lib/webgl-scatter.d.ts.map +1 -0
  88. package/dist/lib/webgl-scatter.js +185 -0
  89. package/dist/primitives/Accordion.d.ts +44 -20
  90. package/dist/primitives/Accordion.d.ts.map +1 -1
  91. package/dist/primitives/Accordion.js +82 -22
  92. package/dist/primitives/AppBar.d.ts +13 -0
  93. package/dist/primitives/AppBar.d.ts.map +1 -0
  94. package/dist/primitives/AppBar.js +27 -0
  95. package/dist/primitives/Autocomplete.d.ts +28 -0
  96. package/dist/primitives/Autocomplete.d.ts.map +1 -0
  97. package/dist/primitives/Autocomplete.js +118 -0
  98. package/dist/primitives/Avatar.d.ts +13 -1
  99. package/dist/primitives/Avatar.d.ts.map +1 -1
  100. package/dist/primitives/Avatar.js +17 -2
  101. package/dist/primitives/Backdrop.d.ts +17 -0
  102. package/dist/primitives/Backdrop.d.ts.map +1 -0
  103. package/dist/primitives/Backdrop.js +17 -0
  104. package/dist/primitives/BottomNavigation.d.ts +23 -0
  105. package/dist/primitives/BottomNavigation.d.ts.map +1 -0
  106. package/dist/primitives/BottomNavigation.js +30 -0
  107. package/dist/primitives/ButtonBase.d.ts +14 -0
  108. package/dist/primitives/ButtonBase.d.ts.map +1 -0
  109. package/dist/primitives/ButtonBase.js +13 -0
  110. package/dist/primitives/ButtonGroup.d.ts +25 -0
  111. package/dist/primitives/ButtonGroup.d.ts.map +1 -0
  112. package/dist/primitives/ButtonGroup.js +44 -0
  113. package/dist/primitives/CircularProgress.d.ts +16 -0
  114. package/dist/primitives/CircularProgress.d.ts.map +1 -0
  115. package/dist/primitives/CircularProgress.js +17 -0
  116. package/dist/primitives/ClickAwayListener.d.ts +16 -0
  117. package/dist/primitives/ClickAwayListener.d.ts.map +1 -0
  118. package/dist/primitives/ClickAwayListener.js +33 -0
  119. package/dist/primitives/Collapse.d.ts +19 -0
  120. package/dist/primitives/Collapse.d.ts.map +1 -0
  121. package/dist/primitives/Collapse.js +14 -0
  122. package/dist/primitives/Container.d.ts +13 -0
  123. package/dist/primitives/Container.d.ts.map +1 -0
  124. package/dist/primitives/Container.js +26 -0
  125. package/dist/primitives/Fab.d.ts +22 -0
  126. package/dist/primitives/Fab.d.ts.map +1 -0
  127. package/dist/primitives/Fab.js +42 -0
  128. package/dist/primitives/FormControl.d.ts +27 -0
  129. package/dist/primitives/FormControl.d.ts.map +1 -0
  130. package/dist/primitives/FormControl.js +24 -0
  131. package/dist/primitives/FormControlLabel.d.ts +18 -0
  132. package/dist/primitives/FormControlLabel.d.ts.map +1 -0
  133. package/dist/primitives/FormControlLabel.js +19 -0
  134. package/dist/primitives/Grid.d.ts +32 -0
  135. package/dist/primitives/Grid.d.ts.map +1 -0
  136. package/dist/primitives/Grid.js +50 -0
  137. package/dist/primitives/IconButton.d.ts +22 -0
  138. package/dist/primitives/IconButton.d.ts.map +1 -0
  139. package/dist/primitives/IconButton.js +39 -0
  140. package/dist/primitives/ImageList.d.ts +31 -0
  141. package/dist/primitives/ImageList.d.ts.map +1 -0
  142. package/dist/primitives/ImageList.js +33 -0
  143. package/dist/primitives/InputAdornment.d.ts +28 -0
  144. package/dist/primitives/InputAdornment.d.ts.map +1 -0
  145. package/dist/primitives/InputAdornment.js +13 -0
  146. package/dist/primitives/Link.d.ts +17 -0
  147. package/dist/primitives/Link.d.ts.map +1 -0
  148. package/dist/primitives/Link.js +29 -0
  149. package/dist/primitives/List.d.ts +41 -0
  150. package/dist/primitives/List.d.ts.map +1 -0
  151. package/dist/primitives/List.js +22 -0
  152. package/dist/primitives/Masonry.d.ts +14 -0
  153. package/dist/primitives/Masonry.d.ts.map +1 -0
  154. package/dist/primitives/Masonry.js +15 -0
  155. package/dist/primitives/Menu.d.ts +28 -0
  156. package/dist/primitives/Menu.d.ts.map +1 -0
  157. package/dist/primitives/Menu.js +54 -0
  158. package/dist/primitives/MobileStepper.d.ts +15 -0
  159. package/dist/primitives/MobileStepper.d.ts.map +1 -0
  160. package/dist/primitives/MobileStepper.js +8 -0
  161. package/dist/primitives/Modal.d.ts +18 -0
  162. package/dist/primitives/Modal.d.ts.map +1 -0
  163. package/dist/primitives/Modal.js +29 -0
  164. package/dist/primitives/NoSsr.d.ts +15 -0
  165. package/dist/primitives/NoSsr.d.ts.map +1 -0
  166. package/dist/primitives/NoSsr.js +19 -0
  167. package/dist/primitives/Paper.d.ts +22 -0
  168. package/dist/primitives/Paper.d.ts.map +1 -0
  169. package/dist/primitives/Paper.js +33 -0
  170. package/dist/primitives/Progress.d.ts +6 -2
  171. package/dist/primitives/Progress.d.ts.map +1 -1
  172. package/dist/primitives/Progress.js +8 -3
  173. package/dist/primitives/Snackbar.d.ts +23 -0
  174. package/dist/primitives/Snackbar.d.ts.map +1 -0
  175. package/dist/primitives/Snackbar.js +33 -0
  176. package/dist/primitives/SpeedDial.d.ts +26 -0
  177. package/dist/primitives/SpeedDial.d.ts.map +1 -0
  178. package/dist/primitives/SpeedDial.js +26 -0
  179. package/dist/primitives/Stack.d.ts +15 -0
  180. package/dist/primitives/Stack.d.ts.map +1 -0
  181. package/dist/primitives/Stack.js +45 -0
  182. package/dist/primitives/StarRating.d.ts +19 -1
  183. package/dist/primitives/StarRating.d.ts.map +1 -1
  184. package/dist/primitives/StarRating.js +36 -6
  185. package/dist/primitives/Stepper.d.ts +36 -0
  186. package/dist/primitives/Stepper.d.ts.map +1 -0
  187. package/dist/primitives/Stepper.js +53 -0
  188. package/dist/primitives/TablePagination.d.ts +16 -0
  189. package/dist/primitives/TablePagination.d.ts.map +1 -0
  190. package/dist/primitives/TablePagination.js +12 -0
  191. package/dist/primitives/TextField.d.ts +24 -0
  192. package/dist/primitives/TextField.d.ts.map +1 -0
  193. package/dist/primitives/TextField.js +19 -0
  194. package/dist/primitives/TextareaAutosize.d.ts +11 -0
  195. package/dist/primitives/TextareaAutosize.d.ts.map +1 -0
  196. package/dist/primitives/TextareaAutosize.js +26 -0
  197. package/dist/primitives/ToggleButton.d.ts +28 -0
  198. package/dist/primitives/ToggleButton.d.ts.map +1 -0
  199. package/dist/primitives/ToggleButton.js +56 -0
  200. package/dist/primitives/TransferList.d.ts +21 -0
  201. package/dist/primitives/TransferList.d.ts.map +1 -0
  202. package/dist/primitives/TransferList.js +40 -0
  203. package/dist/primitives/Typography.d.ts +23 -0
  204. package/dist/primitives/Typography.d.ts.map +1 -0
  205. package/dist/primitives/Typography.js +69 -0
  206. package/dist/primitives/transitions.d.ts +29 -0
  207. package/dist/primitives/transitions.d.ts.map +1 -0
  208. package/dist/primitives/transitions.js +52 -0
  209. package/package.json +28 -4
  210. package/skills/spatika-ui/SKILL.md +96 -0
  211. package/src/composites/Card.tsx +51 -1
  212. package/src/composites/ChartDataGrid.test.tsx +57 -0
  213. package/src/composites/ChartDataGrid.tsx +196 -0
  214. package/src/composites/CoverHero.test.tsx +38 -0
  215. package/src/composites/CoverHero.tsx +29 -22
  216. package/src/composites/EntityMediaCard.test.tsx +58 -0
  217. package/src/composites/EntityMediaCard.tsx +31 -13
  218. package/src/composites/EventCalendar.tsx +1030 -0
  219. package/src/composites/EventEditor.tsx +268 -0
  220. package/src/composites/EventTimeline.tsx +366 -0
  221. package/src/composites/MapChart.test.tsx +39 -0
  222. package/src/composites/MapChart.tsx +130 -0
  223. package/src/composites/ProfileHero.test.tsx +33 -0
  224. package/src/composites/ProfileHero.tsx +96 -79
  225. package/src/composites/ScatterWebGL.test.tsx +25 -0
  226. package/src/composites/ScatterWebGL.tsx +79 -0
  227. package/src/composites/SiteFooter.test.tsx +37 -0
  228. package/src/composites/SiteFooter.tsx +1 -1
  229. package/src/composites/SiteNav.test.tsx +46 -0
  230. package/src/composites/SiteNav.tsx +14 -4
  231. package/src/composites/StatCard.test.tsx +30 -0
  232. package/src/composites/StatCard.tsx +4 -0
  233. package/src/composites/Wordmark.test.tsx +23 -0
  234. package/src/composites/Wordmark.tsx +2 -2
  235. package/src/composites/cartesian-charts.test.tsx +52 -0
  236. package/src/composites/cartesian-charts.tsx +1287 -0
  237. package/src/composites/chart-composition.test.tsx +53 -0
  238. package/src/composites/chart-composition.tsx +898 -0
  239. package/src/composites/chart-ui.tsx +328 -0
  240. package/src/composites/charts-3d.test.tsx +25 -0
  241. package/src/composites/charts-3d.tsx +318 -0
  242. package/src/composites/charts.test.tsx +254 -0
  243. package/src/composites/chrome.test.tsx +29 -0
  244. package/src/composites/flow-charts.test.tsx +79 -0
  245. package/src/composites/flow-charts.tsx +607 -0
  246. package/src/composites/marketing.test.tsx +38 -34
  247. package/src/composites/radial-charts.test.tsx +74 -0
  248. package/src/composites/radial-charts.tsx +617 -0
  249. package/src/composites/scheduler-ui.tsx +306 -0
  250. package/src/composites/scheduler.test.tsx +280 -0
  251. package/src/index.test.ts +26 -0
  252. package/src/index.ts +287 -5
  253. package/src/lib/chart-export.test.ts +20 -0
  254. package/src/lib/chart-export.ts +99 -0
  255. package/src/lib/charts-platform.test.ts +93 -0
  256. package/src/lib/charts.test.ts +132 -0
  257. package/src/lib/charts.ts +1021 -0
  258. package/src/lib/geo.test.ts +42 -0
  259. package/src/lib/geo.ts +138 -0
  260. package/src/lib/iso.test.ts +22 -0
  261. package/src/lib/iso.ts +102 -0
  262. package/src/lib/rrule.test.ts +53 -0
  263. package/src/lib/rrule.ts +281 -0
  264. package/src/lib/scheduler.test.ts +199 -0
  265. package/src/lib/scheduler.ts +693 -0
  266. package/src/lib/tokens.test.ts +2 -2
  267. package/src/lib/webgl-scatter.test.ts +36 -0
  268. package/src/lib/webgl-scatter.ts +230 -0
  269. package/src/primitives/Accordion.tsx +218 -63
  270. package/src/primitives/AppBar.tsx +39 -0
  271. package/src/primitives/Autocomplete.tsx +236 -0
  272. package/src/primitives/Avatar.tsx +52 -1
  273. package/src/primitives/Backdrop.tsx +48 -0
  274. package/src/primitives/BottomNavigation.tsx +102 -0
  275. package/src/primitives/ButtonBase.tsx +34 -0
  276. package/src/primitives/ButtonGroup.tsx +90 -0
  277. package/src/primitives/CircularProgress.tsx +104 -0
  278. package/src/primitives/ClickAwayListener.tsx +46 -0
  279. package/src/primitives/Collapse.tsx +39 -0
  280. package/src/primitives/Container.tsx +40 -0
  281. package/src/primitives/Fab.tsx +62 -0
  282. package/src/primitives/FormControl.tsx +90 -0
  283. package/src/primitives/FormControlLabel.tsx +51 -0
  284. package/src/primitives/Grid.tsx +101 -0
  285. package/src/primitives/IconButton.tsx +59 -0
  286. package/src/primitives/ImageList.test.tsx +48 -0
  287. package/src/primitives/ImageList.tsx +112 -0
  288. package/src/primitives/InputAdornment.tsx +86 -0
  289. package/src/primitives/Link.tsx +48 -0
  290. package/src/primitives/List.tsx +121 -0
  291. package/src/primitives/Masonry.tsx +32 -0
  292. package/src/primitives/Menu.tsx +112 -0
  293. package/src/primitives/MobileStepper.tsx +64 -0
  294. package/src/primitives/Modal.tsx +70 -0
  295. package/src/primitives/NoSsr.tsx +28 -0
  296. package/src/primitives/Paper.tsx +55 -0
  297. package/src/primitives/Progress.tsx +25 -7
  298. package/src/primitives/Snackbar.tsx +83 -0
  299. package/src/primitives/SpeedDial.tsx +110 -0
  300. package/src/primitives/Stack.tsx +88 -0
  301. package/src/primitives/StarRating.tsx +87 -28
  302. package/src/primitives/Stepper.tsx +184 -0
  303. package/src/primitives/TablePagination.tsx +58 -0
  304. package/src/primitives/TextField.tsx +105 -0
  305. package/src/primitives/TextareaAutosize.tsx +49 -0
  306. package/src/primitives/ToggleButton.tsx +148 -0
  307. package/src/primitives/TransferList.tsx +110 -0
  308. package/src/primitives/Typography.tsx +90 -0
  309. package/src/primitives/mui-more.test.tsx +76 -0
  310. package/src/primitives/mui.test.tsx +134 -0
  311. package/src/primitives/transitions.tsx +120 -0
@@ -0,0 +1,186 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo, useRef, useState } from "react";
3
+ import { expandVisibleEvents } from "../lib/rrule";
4
+ import { useControllableState } from "../lib/use-controllable-state";
5
+ import { eventCanDrag, eventCanResize, eventColorStyle, formatMonthYear, getTimelineRange, layoutTimelineBars, normalizeEvents, occurrenceKey, resizeEvent, shiftByMs, shiftTimelineDate, toDate, visibleEvents, } from "../lib/scheduler";
6
+ import { EventEditor } from "./EventEditor";
7
+ import { EventResizeHandle, ResourceLegend, SchedulerShell, SchedulerToolbar, TIMELINE_SCALE_LABEL, } from "./scheduler-ui";
8
+ import { DropdownMenuItem } from "../primitives/DropdownMenu";
9
+ const LANE_HEIGHT = 28;
10
+ const LANE_GAP = 4;
11
+ const ROW_PAD = 10;
12
+ function sourceEvent(events, id) {
13
+ return events.find((event) => event.id === id);
14
+ }
15
+ function draftFromSource(source) {
16
+ return {
17
+ id: source.id,
18
+ title: source.title,
19
+ start: toDate(source.start),
20
+ end: toDate(source.end),
21
+ allDay: source.allDay,
22
+ resourceId: source.resourceId,
23
+ color: source.color,
24
+ description: source.description,
25
+ rrule: source.rrule,
26
+ };
27
+ }
28
+ function timelineTitle(scale, date, rangeStart, rangeEnd, locale) {
29
+ if (scale === "hours") {
30
+ return new Intl.DateTimeFormat(locale, { weekday: "short", month: "short", day: "numeric" }).format(date);
31
+ }
32
+ if (scale === "years") {
33
+ return `${rangeStart.getFullYear()}–${rangeEnd.getFullYear() - 1}`;
34
+ }
35
+ if (scale === "months")
36
+ return String(date.getFullYear());
37
+ return formatMonthYear(date, locale);
38
+ }
39
+ /** Horizontal resource timeline — rows are resources, bars are allocations across time. */
40
+ export function EventTimeline({ events = [], resources = [], scale: scaleProp, defaultScale = "months", onScaleChange, date: dateProp, defaultDate, onDateChange, scales = ["hours", "days", "weeks", "months", "years"], locale, readOnly = false, areEventsDraggable, areEventsResizable, onEventClick, onEventChange, onEventCreate, onEventDelete, showEventEditor = true, className, }) {
41
+ const [scale, setScale] = useControllableState({
42
+ prop: scaleProp,
43
+ defaultProp: defaultScale,
44
+ onChange: onScaleChange,
45
+ });
46
+ const [date, setDate] = useControllableState({
47
+ prop: dateProp,
48
+ defaultProp: defaultDate ?? new Date(),
49
+ onChange: onDateChange,
50
+ });
51
+ const [hiddenIds, setHiddenIds] = useState(new Set());
52
+ const [draft, setDraft] = useState(null);
53
+ const dragRef = useRef(null);
54
+ const resolvedScale = scale ?? "months";
55
+ const resolvedDate = date ?? new Date();
56
+ const range = useMemo(() => getTimelineRange(resolvedDate, resolvedScale, locale), [resolvedDate, resolvedScale, locale]);
57
+ const canDrag = !readOnly && (areEventsDraggable ?? Boolean(onEventChange));
58
+ const canResize = !readOnly && (areEventsResizable ?? Boolean(onEventChange));
59
+ const editorLocked = readOnly || Boolean(draft?.id && sourceEvent(events, draft.id)?.readOnly);
60
+ const normalized = useMemo(() => {
61
+ const visible = visibleEvents(normalizeEvents(events, resources), hiddenIds);
62
+ return expandVisibleEvents(visible, range.start, range.end, events);
63
+ }, [events, resources, hiddenIds, range.start, range.end]);
64
+ const visibleResources = resources.filter((resource) => !hiddenIds.has(resource.id));
65
+ const rows = visibleResources.length > 0
66
+ ? visibleResources
67
+ : [{ id: "__all", title: "Events", color: "blue" }];
68
+ const title = timelineTitle(resolvedScale, resolvedDate, range.start, range.end, locale);
69
+ function toggleResource(id) {
70
+ setHiddenIds((prev) => {
71
+ const next = new Set(prev);
72
+ if (next.has(id))
73
+ next.delete(id);
74
+ else
75
+ next.add(id);
76
+ return next;
77
+ });
78
+ }
79
+ function openEvent(event) {
80
+ const source = sourceEvent(events, event.id);
81
+ if (source)
82
+ onEventClick?.(source);
83
+ if (!showEventEditor)
84
+ return;
85
+ setDraft(source ? draftFromSource(source) : {
86
+ id: event.id,
87
+ title: event.title,
88
+ start: event.start,
89
+ end: event.end,
90
+ allDay: event.allDay,
91
+ resourceId: event.resourceId,
92
+ color: event.color,
93
+ description: event.description,
94
+ rrule: event.rrule,
95
+ });
96
+ }
97
+ function handlePointerDown(event, pointer) {
98
+ if (!onEventChange || !eventCanDrag(event, { readOnly, enabled: canDrag }))
99
+ return;
100
+ pointer.currentTarget.setPointerCapture?.(pointer.pointerId);
101
+ dragRef.current = { id: event.id, x: pointer.clientX, active: false };
102
+ }
103
+ function handlePointerMove(pointer) {
104
+ const drag = dragRef.current;
105
+ if (!drag)
106
+ return;
107
+ if (Math.abs(pointer.clientX - drag.x) > 6)
108
+ drag.active = true;
109
+ }
110
+ function handlePointerUp(event, pointer) {
111
+ const drag = dragRef.current;
112
+ dragRef.current = null;
113
+ if (!drag?.active || !onEventChange)
114
+ return;
115
+ const grid = pointer.currentTarget.closest("[data-scheduler-grid]");
116
+ if (!grid)
117
+ return;
118
+ const rect = grid.getBoundingClientRect();
119
+ const rangeMs = range.end.getTime() - range.start.getTime();
120
+ const deltaPx = pointer.clientX - drag.x;
121
+ const deltaMs = (deltaPx / rect.width) * rangeMs;
122
+ const source = sourceEvent(events, event.id);
123
+ if (!source)
124
+ return;
125
+ const master = normalizeEvents([source], resources)[0];
126
+ onEventChange(source, shiftByMs(master, deltaMs));
127
+ }
128
+ function commitResize(event, edge, instant) {
129
+ if (!onEventChange)
130
+ return;
131
+ const next = resizeEvent(event, edge, instant);
132
+ const source = sourceEvent(events, event.id);
133
+ if (!source)
134
+ return;
135
+ const master = normalizeEvents([source], resources)[0];
136
+ onEventChange(source, {
137
+ start: new Date(master.start.getTime() + (next.start.getTime() - event.start.getTime())),
138
+ end: new Date(master.end.getTime() + (next.end.getTime() - event.end.getTime())),
139
+ });
140
+ }
141
+ function renderBar(event) {
142
+ const resizable = eventCanResize(event, { readOnly, enabled: canResize }) && Boolean(onEventChange);
143
+ const button = (_jsx("button", { type: "button", className: "flex h-6 w-full items-center truncate rounded-md px-2 text-left text-[11px] font-semibold shadow-sm", style: eventColorStyle(event.color, "bar"), onClick: () => {
144
+ if (dragRef.current?.active)
145
+ return;
146
+ openEvent(event);
147
+ }, onPointerDown: (pointer) => handlePointerDown(event, pointer), onPointerMove: handlePointerMove, onPointerUp: (pointer) => handlePointerUp(event, pointer), children: event.title }));
148
+ if (!resizable)
149
+ return button;
150
+ return (_jsxs("div", { className: "relative h-full", children: [button, _jsx(EventResizeHandle, { event: event, edge: "start", axis: "ew", onCommit: commitResize }), _jsx(EventResizeHandle, { event: event, edge: "end", axis: "ew", onCommit: commitResize })] }));
151
+ }
152
+ return (_jsxs(SchedulerShell, { slot: "event-timeline", className: className, "aria-label": "Event timeline", children: [_jsx(SchedulerToolbar, { title: title, onPrev: () => setDate(shiftTimelineDate(resolvedDate, resolvedScale, -1)), onNext: () => setDate(shiftTimelineDate(resolvedDate, resolvedScale, 1)), onToday: () => setDate(new Date()), menuLabel: TIMELINE_SCALE_LABEL[resolvedScale], menu: scales.map((item) => (_jsx(DropdownMenuItem, { onClick: () => setScale(item), children: TIMELINE_SCALE_LABEL[item] }, item))) }), _jsx("div", { className: "overflow-x-auto", children: _jsx("div", { className: "min-w-[720px]", children: _jsxs("div", { className: "grid", style: { gridTemplateColumns: "11rem minmax(0, 1fr)" }, children: [_jsx("div", { className: "border-b border-r border-border/50 px-3 py-2 text-[10px] font-black uppercase tracking-widest text-muted-foreground", children: "Resource" }), _jsx("div", { className: "grid border-b border-border/50", style: { gridTemplateColumns: `repeat(${range.ticks.length}, minmax(0, 1fr))` }, children: range.ticks.map((tick) => (_jsx("div", { className: "border-l border-border/40 px-2 py-2 text-center text-xs font-bold text-foreground first:border-l-0", children: tick.label }, tick.date.toISOString()))) }), rows.map((resource) => {
153
+ const rowEvents = resource.id === "__all"
154
+ ? normalized
155
+ : normalized.filter((event) => event.resourceId === resource.id);
156
+ const bars = layoutTimelineBars(rowEvents, range.start, range.end);
157
+ const laneCount = Math.max(1, ...bars.map((bar) => bar.lane + 1), 1);
158
+ const height = ROW_PAD * 2 + laneCount * LANE_HEIGHT + (laneCount - 1) * LANE_GAP;
159
+ const tone = resource.color ?? (rowEvents[0]?.color ?? "blue");
160
+ return (_jsxs("div", { className: "contents", children: [_jsxs("div", { className: "flex items-center gap-2 border-b border-r border-border/40 px-3 py-2", style: { minHeight: height }, children: [_jsx("span", { className: "size-2.5 shrink-0 rounded-full", style: eventColorStyle(tone, "dot") }), _jsx("span", { className: "truncate text-sm font-semibold text-foreground", children: resource.title })] }), _jsx("div", { "data-scheduler-grid": true, "data-range-start": range.start.getTime(), "data-range-end": range.end.getTime(), className: "relative border-b border-border/40", style: {
161
+ minHeight: height,
162
+ backgroundImage: `repeating-linear-gradient(90deg, transparent, transparent calc(${100 / range.ticks.length}% - 1px), color-mix(in srgb, var(--border) 40%, transparent) calc(${100 / range.ticks.length}% - 1px), color-mix(in srgb, var(--border) 40%, transparent) ${100 / range.ticks.length}%)`,
163
+ }, children: bars.map((bar) => (_jsx("div", { className: "absolute", style: {
164
+ top: ROW_PAD + bar.lane * (LANE_HEIGHT + LANE_GAP),
165
+ left: `${bar.left}%`,
166
+ width: `${bar.width}%`,
167
+ height: LANE_HEIGHT,
168
+ }, children: renderBar(bar.event) }, occurrenceKey(bar.event)))) })] }, resource.id));
169
+ })] }) }) }), _jsx(ResourceLegend, { resources: resources, hiddenIds: hiddenIds, onToggle: toggleResource }), showEventEditor ? (_jsx(EventEditor, { open: draft != null, onOpenChange: (open) => {
170
+ if (!open)
171
+ setDraft(null);
172
+ }, draft: draft, resources: resources, readOnly: editorLocked, onSave: (event) => {
173
+ if (event.id && sourceEvent(events, event.id)) {
174
+ onEventChange?.(sourceEvent(events, event.id), event);
175
+ }
176
+ else {
177
+ onEventCreate?.(event);
178
+ }
179
+ }, onDelete: onEventDelete
180
+ ? (id) => {
181
+ const source = sourceEvent(events, id);
182
+ if (source)
183
+ onEventDelete(source);
184
+ }
185
+ : undefined })) : null] }));
186
+ }
@@ -0,0 +1,24 @@
1
+ import { type ChartMargin } from "../lib/charts";
2
+ import { type GeoJsonFeatureCollection, type GeoProjectionKind } from "../lib/geo";
3
+ export type MapShapeDatum = {
4
+ id: string | number;
5
+ value: number;
6
+ label?: string;
7
+ color?: string;
8
+ };
9
+ export type MapChartProps = {
10
+ geoData: GeoJsonFeatureCollection;
11
+ series?: Array<{
12
+ data: MapShapeDatum[];
13
+ }>;
14
+ idProperty?: string;
15
+ projection?: GeoProjectionKind;
16
+ height?: number;
17
+ width?: number;
18
+ colors?: string[];
19
+ hideLegend?: boolean;
20
+ margin?: ChartMargin;
21
+ className?: string;
22
+ };
23
+ export declare function MapChart({ geoData, series, idProperty, projection, height, width, colors, hideLegend, margin, className, }: MapChartProps): import("react").JSX.Element;
24
+ //# sourceMappingURL=MapChart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MapChart.d.ts","sourceRoot":"","sources":["../../src/composites/MapChart.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAIL,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACvB,MAAM,YAAY,CAAC;AAGpB,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,wBAAwB,CAAC;IAClC,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,aAAa,EAAE,CAAA;KAAE,CAAC,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,QAAQ,CAAC,EACvB,OAAO,EACP,MAAM,EACN,UAAiB,EACjB,UAAuB,EACvB,MAAY,EACZ,KAAK,EACL,MAAM,EACN,UAAU,EACV,MAAM,EACN,SAAS,GACV,EAAE,aAAa,+BA2Ef"}
@@ -0,0 +1,58 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { chartColor, formatChartNumber } from "../lib/charts";
3
+ import { featureId, fitFeatures, geoPath, } from "../lib/geo";
4
+ import { ChartFrame, useChartHover } from "./chart-ui";
5
+ export function MapChart({ geoData, series, idProperty = "id", projection = "mercator", height = 280, width, colors, hideLegend, margin, className, }) {
6
+ const features = geoData.features ?? [];
7
+ const data = series?.[0]?.data ?? [];
8
+ const byId = new Map(data.map((item) => [String(item.id), item]));
9
+ const values = data.map((item) => item.value);
10
+ const min = values.length ? Math.min(...values) : 0;
11
+ const max = values.length ? Math.max(...values) : 1;
12
+ const { hover, setHover, clear } = useChartHover();
13
+ const legend = hideLegend
14
+ ? undefined
15
+ : data.slice(0, 8).map((item, i) => ({
16
+ id: String(item.id),
17
+ label: item.label ?? String(item.id),
18
+ color: item.color ?? choroplethFill(item.value, min, max, i, colors),
19
+ }));
20
+ return (_jsx(ChartFrame, { slot: "map-chart", className: className, width: width, height: height, margin: margin ?? { top: 8, right: 8, bottom: 8, left: 8 }, legend: legend, hover: hover, "aria-label": "Map chart", children: ({ width: w, height: h, m }) => {
21
+ const pad = Math.min(m.left, m.right, m.top, m.bottom);
22
+ const project = fitFeatures(features, w, h, pad, projection);
23
+ return (_jsx("svg", { width: w, height: h, viewBox: `0 0 ${w} ${h}`, children: features.map((feature, i) => {
24
+ if (!feature.geometry)
25
+ return null;
26
+ const id = featureId(feature, idProperty) || String(i);
27
+ const datum = byId.get(id);
28
+ const label = datum?.label ??
29
+ (feature.properties?.name != null ? String(feature.properties.name) : id);
30
+ const fill = datum
31
+ ? (datum.color ?? choroplethFill(datum.value, min, max, i, colors))
32
+ : "color-mix(in srgb, var(--muted) 55%, transparent)";
33
+ const d = geoPath(feature.geometry, project);
34
+ if (!d)
35
+ return null;
36
+ return (_jsx("path", { d: d, fill: fill, className: "spk-chart-map-region spk-chart-mark", onMouseEnter: (event) => setHover({
37
+ x: event.nativeEvent.offsetX,
38
+ y: event.nativeEvent.offsetY,
39
+ title: label,
40
+ items: datum
41
+ ? [
42
+ {
43
+ color: fill,
44
+ label: label,
45
+ value: formatChartNumber(datum.value),
46
+ },
47
+ ]
48
+ : [{ color: fill, label: label, value: "—" }],
49
+ }), onMouseLeave: clear }, id));
50
+ }) }));
51
+ } }));
52
+ }
53
+ function choroplethFill(value, min, max, index, colors) {
54
+ const t = max === min ? 0.6 : (value - min) / (max - min);
55
+ const base = chartColor(index, colors);
56
+ const mix = Math.round(28 + t * 72);
57
+ return `color-mix(in srgb, ${base} ${mix}%, var(--muted))`;
58
+ }
@@ -24,11 +24,13 @@ export type ProfileHeroProps = {
24
24
  coverKind?: CoverPatternKind | null;
25
25
  dark?: boolean;
26
26
  warm?: boolean;
27
+ /** When false, keep the cover inside this frame (catalog previews). */
28
+ bleed?: boolean;
27
29
  };
28
30
  /**
29
- * Profile / entity hero: cover bleeds into app chrome, overlapping avatar
30
- * notches the frosted identity plate. Stacked in a narrow column; left-notched
31
- * once the plate is wide enough (container query, not viewport).
31
+ * Profile / entity hero: cover fills the frame, overlapping avatar notches
32
+ * the frosted identity plate. Stacked in a narrow column; left-notched once
33
+ * the plate is wide enough (container query, not viewport).
32
34
  */
33
- export declare function ProfileHero({ name, alias, coverUrl, avatarUrl, hideImages, statusBadges, metaLines, stats, tags, topLeading, topActions, avatarAccessory, onAvatarClick, className, coverClassName, identityClassName, children, coverSeed, coverHue, coverKind, dark, warm, }: ProfileHeroProps): import("react").JSX.Element;
35
+ export declare function ProfileHero({ name, alias, coverUrl, avatarUrl, hideImages, statusBadges, metaLines, stats, tags, topLeading, topActions, avatarAccessory, onAvatarClick, className, coverClassName, identityClassName, children, coverSeed, coverHue, coverKind, dark, warm, bleed, }: ProfileHeroProps): import("react").JSX.Element;
34
36
  //# sourceMappingURL=ProfileHero.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProfileHero.d.ts","sourceRoot":"","sources":["../../src/composites/ProfileHero.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAQvC,OAAO,EAAmB,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG9E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,eAAe,CAAC,EAAE,SAAS,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,SAAS,EACT,UAAU,EACV,YAAY,EACZ,SAAS,EACT,KAAK,EACL,IAAI,EACJ,UAAU,EACV,UAAU,EACV,eAAe,EACf,aAAa,EACb,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,SAAS,EACT,QAAc,EACd,SAAS,EACT,IAAI,EACJ,IAAI,GACL,EAAE,gBAAgB,+BAiGlB"}
1
+ {"version":3,"file":"ProfileHero.d.ts","sourceRoot":"","sources":["../../src/composites/ProfileHero.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAQvC,OAAO,EAAmB,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG9E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,eAAe,CAAC,EAAE,SAAS,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,uEAAuE;IACvE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,SAAS,EACT,UAAU,EACV,YAAY,EACZ,SAAS,EACT,KAAK,EACL,IAAI,EACJ,UAAU,EACV,UAAU,EACV,eAAe,EACf,aAAa,EACb,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,SAAS,EACT,QAAc,EACd,SAAS,EACT,IAAI,EACJ,IAAI,EACJ,KAAY,GACb,EAAE,gBAAgB,+BA+GlB"}
@@ -5,17 +5,17 @@ import { coverMutedClass, coverPlateClass, coverTitleClass, } from "../lib/cover
5
5
  import { getCoverPattern } from "../lib/cover-pattern";
6
6
  import { CoverPattern } from "./CoverPattern";
7
7
  /**
8
- * Profile / entity hero: cover bleeds into app chrome, overlapping avatar
9
- * notches the frosted identity plate. Stacked in a narrow column; left-notched
10
- * once the plate is wide enough (container query, not viewport).
8
+ * Profile / entity hero: cover fills the frame, overlapping avatar notches
9
+ * the frosted identity plate. Stacked in a narrow column; left-notched once
10
+ * the plate is wide enough (container query, not viewport).
11
11
  */
12
- export function ProfileHero({ name, alias, coverUrl, avatarUrl, hideImages, statusBadges, metaLines, stats, tags, topLeading, topActions, avatarAccessory, onAvatarClick, className, coverClassName, identityClassName, children, coverSeed, coverHue = 210, coverKind, dark, warm, }) {
12
+ export function ProfileHero({ name, alias, coverUrl, avatarUrl, hideImages, statusBadges, metaLines, stats, tags, topLeading, topActions, avatarAccessory, onAvatarClick, className, coverClassName, identityClassName, children, coverSeed, coverHue = 210, coverKind, dark, warm, bleed = true, }) {
13
13
  const initials = getInitials(name);
14
14
  const seed = coverSeed ?? name;
15
15
  const scene = getCoverPattern({ seed, hue: coverHue, dark, warm, kind: coverKind });
16
16
  const ink = scene.headerInk;
17
- return (_jsxs("div", { "data-slot": "profile-hero", className: cn("relative overflow-visible", className), children: [_jsxs("div", { className: cn("relative min-h-[9rem] overflow-hidden sm:min-h-[12rem] lg:min-h-[13rem]", coverClassName), children: [_jsxs("div", { className: "cover-media cover-media--profile sm:rounded-b-[2rem]", "aria-hidden": true, children: [!hideImages && coverUrl ? (_jsx("img", { src: coverUrl, alt: "", className: "absolute inset-0 size-full object-cover" })) : (_jsx(CoverPattern, { seed: seed, hue: coverHue, dark: dark, warm: warm, kind: coverKind })), _jsx("div", { className: "absolute inset-x-0 top-0 h-8 bg-gradient-to-b from-black/[0.04] to-transparent dark:from-black/12" }), _jsx("div", { className: "absolute inset-x-0 bottom-0 h-[22%] bg-gradient-to-t from-black/[0.03] via-transparent to-transparent dark:from-black/10" })] }), _jsxs("div", { className: "relative z-10 flex min-h-[9rem] items-start justify-between gap-2 p-3 sm:min-h-[12rem] sm:p-4 lg:min-h-[13rem]", children: [_jsx("div", { children: topLeading }), topActions ? (_jsx("div", { "data-cover-ink": ink, className: "cover-floating-shell flex items-center gap-1 p-1", children: topActions })) : null] })] }), _jsx("div", { className: "relative z-10 px-3 pb-4 sm:px-4 sm:pb-5 lg:px-8", children: _jsxs("div", { className: cn("profile-identity", identityClassName), children: [_jsx("div", { "aria-hidden": true, className: cn("pointer-events-none absolute inset-0 rounded-[1.35rem] profile-identity__plate", coverPlateClass(ink)) }), _jsxs("div", { className: "profile-identity__body", children: [_jsxs("button", { type: "button", disabled: !onAvatarClick, onClick: onAvatarClick, "aria-label": name, className: "profile-identity__avatar", children: [_jsx("span", { className: "flex items-center justify-center overflow-hidden rounded-full border-[3px] border-white bg-muted text-lg font-black leading-none text-primary shadow-[0_16px_40px_rgba(0,0,0,0.38)] dark:border-white/30", style: {
18
- width: "var(--profile-avatar-size)",
19
- height: "var(--profile-avatar-size)",
20
- }, children: !hideImages && avatarUrl ? (_jsx("img", { src: avatarUrl, alt: "", className: "size-full object-cover" })) : (initials) }), avatarAccessory] }), _jsxs("div", { className: "profile-identity__copy", children: [_jsxs("div", { className: "profile-identity__heading", children: [_jsx("h1", { className: cn("truncate text-[1.15rem] font-black leading-tight tracking-tight sm:text-2xl", coverTitleClass(ink)), children: name }), statusBadges] }), alias ? (_jsx("p", { className: cn("mt-0.5 truncate text-sm font-medium", coverMutedClass(ink)), children: alias })) : null, metaLines ? (_jsx("div", { className: cn("mt-2 space-y-1 text-sm", coverMutedClass(ink)), children: metaLines })) : null, stats ? _jsx("div", { className: "mt-3", children: stats }) : null, tags ? _jsx("div", { className: "profile-identity__tags", children: tags }) : null] })] }), children ? _jsx("div", { className: "relative z-10 px-3 pb-3 sm:px-6", children: children }) : null] }) })] }));
17
+ return (_jsxs("div", { "data-slot": "profile-hero", "data-cover-bleed": bleed ? "true" : undefined, className: cn("relative w-full", bleed ? "overflow-visible" : "overflow-hidden rounded-[1.35rem] sm:rounded-[1.75rem]", className), children: [_jsxs("div", { className: cn("cover-media cover-media--profile", bleed && "sm:rounded-b-[2rem]"), "aria-hidden": true, children: [!hideImages && coverUrl ? (_jsx("img", { src: coverUrl, alt: "", className: "absolute inset-0 size-full object-cover" })) : (_jsx(CoverPattern, { seed: seed, hue: coverHue, dark: dark, warm: warm, kind: coverKind })), _jsx("div", { className: "absolute inset-x-0 top-0 h-8 bg-gradient-to-b from-black/[0.04] to-transparent dark:from-black/12" }), _jsx("div", { className: "absolute inset-x-0 bottom-0 h-[22%] bg-gradient-to-t from-black/[0.03] via-transparent to-transparent dark:from-black/10" })] }), _jsxs("div", { className: "relative z-10 flex flex-col", children: [_jsx("div", { className: cn("relative min-h-[8.5rem] sm:min-h-[11rem] lg:min-h-[12rem]", coverClassName), children: _jsxs("div", { className: "absolute inset-x-0 top-0 z-30 flex items-start justify-between gap-2 p-3 sm:p-4", children: [_jsx("div", { children: topLeading }), topActions ? (_jsx("div", { "data-cover-ink": ink, className: "cover-floating-shell flex items-center gap-1 p-1", children: topActions })) : null] }) }), _jsx("div", { className: "relative z-20 px-3 pb-4 sm:px-4 sm:pb-5 lg:px-6", children: _jsxs("div", { className: cn("profile-identity", identityClassName), children: [_jsx("div", { "aria-hidden": true, className: cn("pointer-events-none absolute inset-0 rounded-[1.35rem] profile-identity__plate", coverPlateClass(ink)) }), _jsxs("div", { className: "profile-identity__body", children: [_jsxs("button", { type: "button", disabled: !onAvatarClick, onClick: onAvatarClick, "aria-label": name, className: "profile-identity__avatar", children: [_jsx("span", { className: "flex items-center justify-center overflow-hidden rounded-full border-[3px] border-white bg-muted text-lg font-black leading-none text-primary shadow-[0_16px_40px_rgba(0,0,0,0.38)] dark:border-white/30", style: {
18
+ width: "var(--profile-avatar-size)",
19
+ height: "var(--profile-avatar-size)",
20
+ }, children: !hideImages && avatarUrl ? (_jsx("img", { src: avatarUrl, alt: "", className: "size-full object-cover" })) : (initials) }), avatarAccessory] }), _jsxs("div", { className: "profile-identity__copy", children: [_jsxs("div", { className: "profile-identity__heading", children: [_jsx("h1", { className: cn("truncate text-[1.15rem] font-black leading-tight tracking-tight sm:text-2xl", coverTitleClass(ink)), children: name }), statusBadges] }), alias ? (_jsx("p", { className: cn("mt-0.5 truncate text-sm font-medium", coverMutedClass(ink)), children: alias })) : null, metaLines ? (_jsx("div", { className: cn("mt-2 space-y-1 text-sm", coverMutedClass(ink)), children: metaLines })) : null, stats ? _jsx("div", { className: "mt-3", children: stats }) : null, tags ? _jsx("div", { className: "profile-identity__tags", children: tags }) : null] })] }), children ? _jsx("div", { className: "relative z-10 px-3 pb-3 sm:px-6", children: children }) : null] }) })] })] }));
21
21
  }
@@ -0,0 +1,22 @@
1
+ import type { ChartLegendItem } from "./chart-ui";
2
+ type ScatterSeriesLike = {
3
+ data: Array<{
4
+ x: number;
5
+ y: number;
6
+ z?: number;
7
+ }>;
8
+ };
9
+ export declare function ScatterWebGLLayer({ width, height, series, meta, hidden, xAt, yAt, sizeAt, bubble, onUnavailable, }: {
10
+ width: number;
11
+ height: number;
12
+ series: ScatterSeriesLike[];
13
+ meta: ChartLegendItem[];
14
+ hidden: Set<string>;
15
+ xAt: (value: number) => number;
16
+ yAt: (value: number) => number;
17
+ sizeAt: (z: number) => number;
18
+ bubble: boolean;
19
+ onUnavailable?: () => void;
20
+ }): import("react").JSX.Element;
21
+ export {};
22
+ //# sourceMappingURL=ScatterWebGL.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScatterWebGL.d.ts","sourceRoot":"","sources":["../../src/composites/ScatterWebGL.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,KAAK,iBAAiB,GAAG;IACvB,IAAI,EAAE,KAAK,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,MAAM,EACN,MAAM,EACN,IAAI,EACJ,MAAM,EACN,GAAG,EACH,GAAG,EACH,MAAM,EACN,MAAM,EACN,aAAa,GACd,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,IAAI,EAAE,eAAe,EAAE,CAAC;IACxB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/B,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/B,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;CAC5B,+BAgDA"}
@@ -0,0 +1,45 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useRef } from "react";
3
+ import { createScatterGL, destroyScatterGL, drawScatterGL } from "../lib/webgl-scatter";
4
+ export function ScatterWebGLLayer({ width, height, series, meta, hidden, xAt, yAt, sizeAt, bubble, onUnavailable, }) {
5
+ const canvasRef = useRef(null);
6
+ const gpuRef = useRef(null);
7
+ useEffect(() => {
8
+ const canvas = canvasRef.current;
9
+ if (!canvas)
10
+ return;
11
+ const gpu = createScatterGL(canvas);
12
+ if (!gpu) {
13
+ onUnavailable?.();
14
+ return;
15
+ }
16
+ gpuRef.current = gpu;
17
+ return () => {
18
+ destroyScatterGL(gpu);
19
+ gpuRef.current = null;
20
+ };
21
+ }, [onUnavailable]);
22
+ useEffect(() => {
23
+ const gpu = gpuRef.current;
24
+ const canvas = canvasRef.current;
25
+ if (!gpu || !canvas)
26
+ return;
27
+ const batches = series.flatMap((item, s) => {
28
+ const info = meta[s];
29
+ if (hidden.has(info.id))
30
+ return [];
31
+ return [
32
+ {
33
+ color: info.color,
34
+ positions: item.data.map((point) => ({
35
+ x: xAt(point.x),
36
+ y: yAt(point.y),
37
+ size: bubble ? sizeAt(point.z ?? 1) * 2 : 9,
38
+ })),
39
+ },
40
+ ];
41
+ });
42
+ drawScatterGL(gpu, canvas, width, height, batches);
43
+ });
44
+ return (_jsx("canvas", { ref: canvasRef, className: "spk-chart-webgl", "data-slot": "scatter-webgl", "aria-hidden": true }));
45
+ }
@@ -12,7 +12,7 @@ export type SiteFooterProps = {
12
12
  };
13
13
  /**
14
14
  * Marketing-site footer: brand, copyright, links, optional meta chips.
15
- * Frosted surface bar with a primary hairline — matches sreelal.me.
15
+ * Frosted surface bar with a primary hairline.
16
16
  */
17
17
  export declare function SiteFooter({ brand, copyright, links, renderLink, meta, className, }: SiteFooterProps): import("react").JSX.Element;
18
18
  //# sourceMappingURL=SiteFooter.d.ts.map
@@ -3,7 +3,7 @@ import { cn } from "../lib/cn";
3
3
  const linkClass = "font-semibold text-muted-foreground transition-colors hover:text-primary";
4
4
  /**
5
5
  * Marketing-site footer: brand, copyright, links, optional meta chips.
6
- * Frosted surface bar with a primary hairline — matches sreelal.me.
6
+ * Frosted surface bar with a primary hairline.
7
7
  */
8
8
  export function SiteFooter({ brand, copyright, links = [], renderLink, meta, className, }) {
9
9
  const renderItem = (link) => {
@@ -11,10 +11,15 @@ export type SiteNavProps = {
11
11
  className?: string;
12
12
  /** Extra classes for the inner max-width row. */
13
13
  innerClassName?: string;
14
+ /**
15
+ * Pin the bar to a relatively positioned parent instead of the viewport.
16
+ * Use this in docs previews and embedded shells.
17
+ */
18
+ contained?: boolean;
14
19
  };
15
20
  /**
16
21
  * Marketing-site navbar: fixed bar, brand, desktop links, and a 3-line mobile menu.
17
- * Matches the sreelal.me chrome: transparent at rest, frosted surface after scroll.
22
+ * Transparent at rest, frosted surface after scroll.
18
23
  */
19
- export declare function SiteNav({ brand, links, renderLink, className, innerClassName, }: SiteNavProps): import("react").JSX.Element;
24
+ export declare function SiteNav({ brand, links, renderLink, className, innerClassName, contained, }: SiteNavProps): import("react").JSX.Element;
20
25
  //# sourceMappingURL=SiteNav.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SiteNav.d.ts","sourceRoot":"","sources":["../../src/composites/SiteNav.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA8B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGnE,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,mEAAmE;IACnE,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,KAAK,SAAS,CAAC;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAQF;;;GAGG;AACH,wBAAgB,OAAO,CAAC,EACtB,KAAK,EACL,KAAK,EACL,UAAU,EACV,SAAS,EACT,cAAc,GACf,EAAE,YAAY,+BAyGd"}
1
+ {"version":3,"file":"SiteNav.d.ts","sourceRoot":"","sources":["../../src/composites/SiteNav.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA8B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGnE,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,mEAAmE;IACnE,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,KAAK,SAAS,CAAC;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAQF;;;GAGG;AACH,wBAAgB,OAAO,CAAC,EACtB,KAAK,EACL,KAAK,EACL,UAAU,EACV,SAAS,EACT,cAAc,EACd,SAAiB,GAClB,EAAE,YAAY,+BA6Gd"}
@@ -5,18 +5,20 @@ const desktopLinkClass = "relative rounded-full px-3.5 py-2 text-[13px] font-bol
5
5
  const mobileLinkClass = "flex items-center rounded-2xl px-4 py-4 text-xl font-bold text-muted-foreground transition-colors hover:bg-primary/5 hover:text-primary";
6
6
  /**
7
7
  * Marketing-site navbar: fixed bar, brand, desktop links, and a 3-line mobile menu.
8
- * Matches the sreelal.me chrome: transparent at rest, frosted surface after scroll.
8
+ * Transparent at rest, frosted surface after scroll.
9
9
  */
10
- export function SiteNav({ brand, links, renderLink, className, innerClassName, }) {
11
- const [scrolled, setScrolled] = useState(false);
10
+ export function SiteNav({ brand, links, renderLink, className, innerClassName, contained = false, }) {
11
+ const [scrolled, setScrolled] = useState(contained);
12
12
  const [open, setOpen] = useState(false);
13
13
  const menuId = useId();
14
14
  useEffect(() => {
15
+ if (contained)
16
+ return;
15
17
  const onScroll = () => setScrolled(window.scrollY > 20);
16
18
  onScroll();
17
19
  window.addEventListener("scroll", onScroll, { passive: true });
18
20
  return () => window.removeEventListener("scroll", onScroll);
19
- }, []);
21
+ }, [contained]);
20
22
  useEffect(() => {
21
23
  if (!open)
22
24
  return;
@@ -34,7 +36,9 @@ export function SiteNav({ brand, links, renderLink, className, innerClassName, }
34
36
  }
35
37
  return (_jsx("a", { href: link.href, className: itemClass, onClick: close, children: link.label }));
36
38
  };
37
- return (_jsxs("nav", { "data-slot": "site-nav", "data-scrolled": scrolled ? "true" : "false", className: cn("spk-site-nav fixed inset-x-0 top-0 z-50 transition-all duration-500", scrolled
39
+ return (_jsxs("nav", { "data-slot": "site-nav", "data-scrolled": scrolled ? "true" : "false", className: cn("inset-x-0 top-0 transition-all duration-500", contained
40
+ ? "absolute z-10"
41
+ : "spk-site-nav fixed z-50", scrolled
38
42
  ? "border-b border-border/90 bg-[color-mix(in_srgb,var(--background)_88%,transparent)] shadow-[0_8px_30px_rgba(15,13,18,0.06)] backdrop-blur-xl"
39
43
  : "bg-transparent", className), children: [_jsx("div", { className: cn("mx-auto max-w-6xl px-4 sm:px-6 lg:px-8", innerClassName), children: _jsxs("div", { className: "flex h-14 items-center justify-between sm:h-16", children: [_jsx("div", { className: "flex min-w-0 items-center", children: brand }), _jsx("div", { className: "hidden items-center gap-0.5 md:flex", children: links.map((link) => (_jsx("span", { children: renderItem(link, desktopLinkClass) }, `${link.href}-${link.label}`))) }), _jsx("button", { type: "button", className: "spk-touch-target -mr-2 p-2 md:hidden", "aria-label": "Toggle menu", "aria-expanded": open, "aria-controls": menuId, onClick: () => setOpen((value) => !value), children: _jsxs("span", { className: "flex h-4 w-6 flex-col justify-between", "aria-hidden": true, children: [_jsx("span", { className: cn("block h-[2px] w-6 rounded-full bg-foreground transition-transform duration-200", open && "translate-y-[7px] rotate-45") }), _jsx("span", { className: cn("block h-[2px] w-6 rounded-full bg-foreground transition-opacity duration-200", open && "opacity-0") }), _jsx("span", { className: cn("block h-[2px] w-6 rounded-full bg-foreground transition-transform duration-200", open && "-translate-y-[7px] -rotate-45") })] }) })] }) }), open ? (_jsx("div", { id: menuId, className: "border-b border-border bg-[color-mix(in_srgb,var(--background)_95%,transparent)] shadow-2xl backdrop-blur-2xl md:hidden", children: _jsx("div", { className: "flex flex-col gap-2 px-6 py-8", children: links.map((link) => (_jsx("div", { children: renderItem(link, mobileLinkClass) }, `${link.href}-${link.label}`))) }) })) : null] }));
40
44
  }
@@ -4,6 +4,7 @@ export type StatCardProps = {
4
4
  value: string | number;
5
5
  hint?: string;
6
6
  icon?: ReactNode;
7
+ chart?: ReactNode;
7
8
  className?: string;
8
9
  /**
9
10
  * `app` — elevated app-card tile (label then value).
@@ -12,5 +13,5 @@ export type StatCardProps = {
12
13
  variant?: "app" | "metric";
13
14
  };
14
15
  /** Compact metric tile using elevated app-card surface. */
15
- export declare function StatCard({ label, value, hint, icon, className, variant, }: StatCardProps): import("react").JSX.Element;
16
+ export declare function StatCard({ label, value, hint, icon, chart, className, variant, }: StatCardProps): import("react").JSX.Element;
16
17
  //# sourceMappingURL=StatCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"StatCard.d.ts","sourceRoot":"","sources":["../../src/composites/StatCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,OAAO,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;CAC5B,CAAC;AAEF,2DAA2D;AAC3D,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,OAAe,GAChB,EAAE,aAAa,+BAgCf"}
1
+ {"version":3,"file":"StatCard.d.ts","sourceRoot":"","sources":["../../src/composites/StatCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,OAAO,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;CAC5B,CAAC;AAEF,2DAA2D;AAC3D,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,SAAS,EACT,OAAe,GAChB,EAAE,aAAa,+BAkCf"}
@@ -1,9 +1,9 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { cn } from "../lib/cn";
3
3
  /** Compact metric tile using elevated app-card surface. */
4
- export function StatCard({ label, value, hint, icon, className, variant = "app", }) {
4
+ export function StatCard({ label, value, hint, icon, chart, className, variant = "app", }) {
5
5
  if (variant === "metric") {
6
- return (_jsxs("div", { "data-slot": "stat-card", "data-variant": "metric", className: cn("flex flex-col items-center justify-center gap-1 rounded-[1.35rem] border border-border/80 bg-background/90 px-2 py-6 text-center shadow-[0_4px_24px_rgba(15,13,18,0.04)] backdrop-blur-sm", className), children: [_jsx("p", { className: "text-xl font-black text-primary sm:text-2xl", children: value }), _jsx("p", { className: "text-[10px] font-bold leading-none text-muted-foreground sm:text-[11px]", children: label }), hint ? _jsx("p", { className: "text-[10px] text-muted-foreground", children: hint }) : null] }));
6
+ return (_jsxs("div", { "data-slot": "stat-card", "data-variant": "metric", className: cn("flex flex-col items-center justify-center gap-1 rounded-[1.35rem] border border-border/80 bg-background/90 px-2 py-6 text-center shadow-[0_4px_24px_rgba(15,13,18,0.04)] backdrop-blur-sm", className), children: [_jsx("p", { className: "text-xl font-black text-primary sm:text-2xl", children: value }), _jsx("p", { className: "text-[10px] font-bold leading-none text-muted-foreground sm:text-[11px]", children: label }), hint ? _jsx("p", { className: "text-[10px] text-muted-foreground", children: hint }) : null, chart ? _jsx("div", { className: "mt-3 w-full min-w-0", children: chart }) : null] }));
7
7
  }
8
- return (_jsxs("div", { "data-slot": "stat-card", className: cn("app-stat-card p-4 sm:p-5", className), children: [_jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsx("p", { className: "text-[10px] font-black uppercase tracking-widest text-muted-foreground", children: label }), icon ? _jsx("div", { className: "text-primary", children: icon }) : null] }), _jsx("p", { className: "mt-2 text-2xl font-black tracking-tight text-foreground", children: value }), hint ? _jsx("p", { className: "mt-1 text-xs font-medium text-muted-foreground", children: hint }) : null] }));
8
+ return (_jsxs("div", { "data-slot": "stat-card", className: cn("app-stat-card p-4 sm:p-5", className), children: [_jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsx("p", { className: "text-[10px] font-black uppercase tracking-widest text-muted-foreground", children: label }), icon ? _jsx("div", { className: "text-primary", children: icon }) : null] }), _jsx("p", { className: "mt-2 text-2xl font-black tracking-tight text-foreground", children: value }), hint ? _jsx("p", { className: "mt-1 text-xs font-medium text-muted-foreground", children: hint }) : null, chart ? _jsx("div", { className: "mt-3 min-w-0", children: chart }) : null] }));
9
9
  }
@@ -1,6 +1,6 @@
1
1
  import { type VariantProps } from "class-variance-authority";
2
2
  declare const statusDotVariants: (props?: ({
3
- tone?: "danger" | "primary" | "success" | "neutral" | "warning" | null | undefined;
3
+ tone?: "primary" | "danger" | "success" | "neutral" | "warning" | null | undefined;
4
4
  pulse?: boolean | null | undefined;
5
5
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
6
6
  export declare function StatusDot({ className, tone, pulse, label, }: VariantProps<typeof statusDotVariants> & {
@@ -2,11 +2,11 @@ import type { ReactNode } from "react";
2
2
  export type WordmarkProps = {
3
3
  /** Primary name, rendered in foreground. */
4
4
  name: ReactNode;
5
- /** Trailing bit (`.me`, last name) in the marketing gradient. */
5
+ /** Trailing bit (`.io`, last name) in the marketing gradient. */
6
6
  accent?: ReactNode;
7
7
  /** Extra punctuation in primary (the period in `Name.`). */
8
8
  mark?: ReactNode;
9
- /** Unstyled trailing copy after the mark (`me` in `Sreelal.me`). */
9
+ /** Unstyled trailing copy after the mark (`io` in `Acme.io`). */
10
10
  rest?: ReactNode;
11
11
  size?: "sm" | "md" | "lg" | "display";
12
12
  as?: "span" | "h1";
@@ -1 +1 @@
1
- {"version":3,"file":"Wordmark.d.ts","sourceRoot":"","sources":["../../src/composites/Wordmark.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,MAAM,MAAM,aAAa,GAAG;IAC1B,4CAA4C;IAC5C,IAAI,EAAE,SAAS,CAAC;IAChB,iEAAiE;IACjE,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,oEAAoE;IACpE,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;IACtC,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AASF;;GAEG;AACH,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,IAAW,EACX,EAAE,EAAE,GAAY,EAChB,SAAS,GACV,EAAE,aAAa,+BASf"}
1
+ {"version":3,"file":"Wordmark.d.ts","sourceRoot":"","sources":["../../src/composites/Wordmark.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,MAAM,MAAM,aAAa,GAAG;IAC1B,4CAA4C;IAC5C,IAAI,EAAE,SAAS,CAAC;IAChB,iEAAiE;IACjE,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,iEAAiE;IACjE,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;IACtC,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AASF;;GAEG;AACH,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,IAAW,EACX,EAAE,EAAE,GAAY,EAChB,SAAS,GACV,EAAE,aAAa,+BASf"}