@blurrow/ui 0.2.0 → 0.2.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 (271) hide show
  1. package/README.md +48 -36
  2. package/dist/Accordion.d.ts +17 -0
  3. package/dist/Accordion.js +138 -0
  4. package/dist/Accordion.js.map +1 -0
  5. package/dist/Alert.d.ts +13 -0
  6. package/dist/Alert.js +69 -0
  7. package/dist/Alert.js.map +1 -0
  8. package/dist/AuthorCard.d.ts +12 -0
  9. package/dist/AuthorCard.js +57 -0
  10. package/dist/AuthorCard.js.map +1 -0
  11. package/dist/Avatar.d.ts +21 -0
  12. package/dist/Avatar.js +96 -0
  13. package/dist/Avatar.js.map +1 -0
  14. package/dist/Badge.d.ts +12 -0
  15. package/dist/Badge.js +46 -0
  16. package/dist/Badge.js.map +1 -0
  17. package/dist/Banner.d.ts +15 -0
  18. package/dist/Banner.js +68 -0
  19. package/dist/Banner.js.map +1 -0
  20. package/dist/Breadcrumb.d.ts +13 -0
  21. package/dist/Breadcrumb.js +45 -0
  22. package/dist/Breadcrumb.js.map +1 -0
  23. package/dist/Button.d.ts +19 -0
  24. package/dist/Button.js +282 -0
  25. package/dist/Button.js.map +1 -0
  26. package/dist/ButtonGroup.d.ts +19 -0
  27. package/dist/ButtonGroup.js +62 -0
  28. package/dist/ButtonGroup.js.map +1 -0
  29. package/dist/Card.d.ts +40 -0
  30. package/dist/Card.js +175 -0
  31. package/dist/Card.js.map +1 -0
  32. package/dist/CardShell.d.ts +18 -0
  33. package/dist/CardShell.js +58 -0
  34. package/dist/CardShell.js.map +1 -0
  35. package/dist/Carousel.d.ts +22 -0
  36. package/dist/Carousel.js +247 -0
  37. package/dist/Carousel.js.map +1 -0
  38. package/dist/Checkbox.d.ts +15 -0
  39. package/dist/Checkbox.js +84 -0
  40. package/dist/Checkbox.js.map +1 -0
  41. package/dist/CloseButton.d.ts +12 -0
  42. package/dist/CloseButton.js +63 -0
  43. package/dist/CloseButton.js.map +1 -0
  44. package/dist/CodeBlock.d.ts +12 -0
  45. package/dist/CodeBlock.js +221 -0
  46. package/dist/CodeBlock.js.map +1 -0
  47. package/dist/ColorPicker.d.ts +24 -0
  48. package/dist/ColorPicker.js +366 -0
  49. package/dist/ColorPicker.js.map +1 -0
  50. package/dist/Combobox.d.ts +34 -0
  51. package/dist/Combobox.js +255 -0
  52. package/dist/Combobox.js.map +1 -0
  53. package/dist/CommandPalette.d.ts +25 -0
  54. package/dist/CommandPalette.js +304 -0
  55. package/dist/CommandPalette.js.map +1 -0
  56. package/dist/ContextMenu.d.ts +16 -0
  57. package/dist/ContextMenu.js +209 -0
  58. package/dist/ContextMenu.js.map +1 -0
  59. package/dist/DataList.d.ts +15 -0
  60. package/dist/DataList.js +42 -0
  61. package/dist/DataList.js.map +1 -0
  62. package/dist/DatePicker.d.ts +65 -0
  63. package/dist/DatePicker.js +391 -0
  64. package/dist/DatePicker.js.map +1 -0
  65. package/dist/DateRangePicker.d.ts +34 -0
  66. package/dist/DateRangePicker.js +180 -0
  67. package/dist/DateRangePicker.js.map +1 -0
  68. package/dist/Drawer.d.ts +17 -0
  69. package/dist/Drawer.js +132 -0
  70. package/dist/Drawer.js.map +1 -0
  71. package/dist/DropdownMenu.d.ts +23 -0
  72. package/dist/DropdownMenu.js +185 -0
  73. package/dist/DropdownMenu.js.map +1 -0
  74. package/dist/EmptyState.d.ts +13 -0
  75. package/dist/EmptyState.js +55 -0
  76. package/dist/EmptyState.js.map +1 -0
  77. package/dist/FieldMessage.d.ts +26 -0
  78. package/dist/FieldMessage.js +95 -0
  79. package/dist/FieldMessage.js.map +1 -0
  80. package/dist/FileUpload.d.ts +32 -0
  81. package/dist/FileUpload.js +253 -0
  82. package/dist/FileUpload.js.map +1 -0
  83. package/dist/Floating.d.ts +32 -0
  84. package/dist/Floating.js +95 -0
  85. package/dist/Floating.js.map +1 -0
  86. package/dist/HoverCard.d.ts +18 -0
  87. package/dist/HoverCard.js +90 -0
  88. package/dist/HoverCard.js.map +1 -0
  89. package/dist/Input.d.ts +17 -0
  90. package/dist/Input.js +96 -0
  91. package/dist/Input.js.map +1 -0
  92. package/dist/Kbd.d.ts +9 -0
  93. package/dist/Kbd.js +24 -0
  94. package/dist/Kbd.js.map +1 -0
  95. package/dist/Modal.d.ts +15 -0
  96. package/dist/Modal.js +109 -0
  97. package/dist/Modal.js.map +1 -0
  98. package/dist/NumberInput.d.ts +23 -0
  99. package/dist/NumberInput.js +162 -0
  100. package/dist/NumberInput.js.map +1 -0
  101. package/dist/OtpInput.d.ts +26 -0
  102. package/dist/OtpInput.js +173 -0
  103. package/dist/OtpInput.js.map +1 -0
  104. package/dist/Pagination.d.ts +11 -0
  105. package/dist/Pagination.js +148 -0
  106. package/dist/Pagination.js.map +1 -0
  107. package/dist/Popover.d.ts +13 -0
  108. package/dist/Popover.js +98 -0
  109. package/dist/Popover.js.map +1 -0
  110. package/dist/Progress.d.ts +12 -0
  111. package/dist/Progress.js +61 -0
  112. package/dist/Progress.js.map +1 -0
  113. package/dist/QuoteCard.d.ts +13 -0
  114. package/dist/QuoteCard.js +92 -0
  115. package/dist/QuoteCard.js.map +1 -0
  116. package/dist/Radio.d.ts +19 -0
  117. package/dist/Radio.js +161 -0
  118. package/dist/Radio.js.map +1 -0
  119. package/dist/RadioCards.d.ts +27 -0
  120. package/dist/RadioCards.js +205 -0
  121. package/dist/RadioCards.js.map +1 -0
  122. package/dist/ReactionBar.d.ts +15 -0
  123. package/dist/ReactionBar.js +92 -0
  124. package/dist/ReactionBar.js.map +1 -0
  125. package/dist/ReadingProgress.d.ts +8 -0
  126. package/dist/ReadingProgress.js +51 -0
  127. package/dist/ReadingProgress.js.map +1 -0
  128. package/dist/ReadingTime.d.ts +9 -0
  129. package/dist/ReadingTime.js +39 -0
  130. package/dist/ReadingTime.js.map +1 -0
  131. package/dist/Select.d.ts +20 -0
  132. package/dist/Select.js +244 -0
  133. package/dist/Select.js.map +1 -0
  134. package/dist/Separator.d.ts +14 -0
  135. package/dist/Separator.js +33 -0
  136. package/dist/Separator.js.map +1 -0
  137. package/dist/ShareButtons.d.ts +10 -0
  138. package/dist/ShareButtons.js +107 -0
  139. package/dist/ShareButtons.js.map +1 -0
  140. package/dist/Sidebar.d.ts +30 -0
  141. package/dist/Sidebar.js +140 -0
  142. package/dist/Sidebar.js.map +1 -0
  143. package/dist/Skeleton.d.ts +15 -0
  144. package/dist/Skeleton.js +67 -0
  145. package/dist/Skeleton.js.map +1 -0
  146. package/dist/Slider.d.ts +27 -0
  147. package/dist/Slider.js +182 -0
  148. package/dist/Slider.js.map +1 -0
  149. package/dist/Spinner.d.ts +12 -0
  150. package/dist/Spinner.js +24 -0
  151. package/dist/Spinner.js.map +1 -0
  152. package/dist/SpotlightCard.d.ts +17 -0
  153. package/dist/SpotlightCard.js +87 -0
  154. package/dist/SpotlightCard.js.map +1 -0
  155. package/dist/Stat.d.ts +19 -0
  156. package/dist/Stat.js +71 -0
  157. package/dist/Stat.js.map +1 -0
  158. package/dist/StatCard.d.ts +24 -0
  159. package/dist/StatCard.js +212 -0
  160. package/dist/StatCard.js.map +1 -0
  161. package/dist/Steps.d.ts +14 -0
  162. package/dist/Steps.js +94 -0
  163. package/dist/Steps.js.map +1 -0
  164. package/dist/Table.d.ts +21 -0
  165. package/dist/Table.js +93 -0
  166. package/dist/Table.js.map +1 -0
  167. package/dist/TableOfContents.d.ts +17 -0
  168. package/dist/TableOfContents.js +92 -0
  169. package/dist/TableOfContents.js.map +1 -0
  170. package/dist/Tabs.d.ts +17 -0
  171. package/dist/Tabs.js +123 -0
  172. package/dist/Tabs.js.map +1 -0
  173. package/dist/TagInput.d.ts +16 -0
  174. package/dist/TagInput.js +169 -0
  175. package/dist/TagInput.js.map +1 -0
  176. package/dist/Textarea.d.ts +13 -0
  177. package/dist/Textarea.js +74 -0
  178. package/dist/Textarea.js.map +1 -0
  179. package/dist/TimePicker.d.ts +28 -0
  180. package/dist/TimePicker.js +264 -0
  181. package/dist/TimePicker.js.map +1 -0
  182. package/dist/Timeline.d.ts +19 -0
  183. package/dist/Timeline.js +76 -0
  184. package/dist/Timeline.js.map +1 -0
  185. package/dist/Toast.d.ts +18 -0
  186. package/dist/Toast.js +318 -0
  187. package/dist/Toast.js.map +1 -0
  188. package/dist/Toggle.d.ts +13 -0
  189. package/dist/Toggle.js +84 -0
  190. package/dist/Toggle.js.map +1 -0
  191. package/dist/Tooltip.d.ts +13 -0
  192. package/dist/Tooltip.js +138 -0
  193. package/dist/Tooltip.js.map +1 -0
  194. package/dist/cli.js +172 -5
  195. package/dist/index.d.ts +68 -631
  196. package/dist/index.js +67 -5558
  197. package/dist/index.js.map +1 -1
  198. package/dist/registry/Accordion.tsx +6 -6
  199. package/dist/registry/Alert.tsx +13 -10
  200. package/dist/registry/AuthorCard.tsx +7 -7
  201. package/dist/registry/Avatar.tsx +5 -5
  202. package/dist/registry/Badge.tsx +12 -15
  203. package/dist/registry/Banner.tsx +15 -18
  204. package/dist/registry/Breadcrumb.tsx +3 -3
  205. package/dist/registry/Button.tsx +58 -69
  206. package/dist/registry/ButtonGroup.tsx +9 -9
  207. package/dist/registry/Card.tsx +15 -15
  208. package/dist/registry/CardShell.tsx +6 -6
  209. package/dist/registry/Carousel.tsx +19 -15
  210. package/dist/registry/Checkbox.tsx +14 -9
  211. package/dist/registry/CloseButton.tsx +2 -2
  212. package/dist/registry/CodeBlock.tsx +15 -15
  213. package/dist/registry/ColorPicker.tsx +404 -0
  214. package/dist/registry/Combobox.tsx +318 -0
  215. package/dist/registry/CommandPalette.tsx +31 -24
  216. package/dist/registry/ContextMenu.tsx +241 -0
  217. package/dist/registry/DataList.tsx +4 -4
  218. package/dist/registry/DatePicker.tsx +494 -0
  219. package/dist/registry/DateRangePicker.tsx +232 -0
  220. package/dist/registry/Drawer.tsx +17 -15
  221. package/dist/registry/DropdownMenu.tsx +39 -77
  222. package/dist/registry/EmptyState.tsx +8 -8
  223. package/dist/registry/FieldMessage.tsx +123 -0
  224. package/dist/registry/FileUpload.tsx +318 -0
  225. package/dist/registry/Floating.tsx +134 -0
  226. package/dist/registry/HoverCard.tsx +113 -0
  227. package/dist/registry/Input.tsx +54 -43
  228. package/dist/registry/Kbd.tsx +4 -5
  229. package/dist/registry/Modal.tsx +17 -15
  230. package/dist/registry/NumberInput.tsx +183 -0
  231. package/dist/registry/OtpInput.tsx +219 -0
  232. package/dist/registry/Pagination.tsx +15 -18
  233. package/dist/registry/Popover.tsx +40 -45
  234. package/dist/registry/Progress.tsx +4 -4
  235. package/dist/registry/QuoteCard.tsx +7 -7
  236. package/dist/registry/Radio.tsx +24 -21
  237. package/dist/registry/RadioCards.tsx +247 -0
  238. package/dist/registry/ReactionBar.tsx +5 -5
  239. package/dist/registry/ReadingProgress.tsx +2 -2
  240. package/dist/registry/ReadingTime.tsx +2 -2
  241. package/dist/registry/Select.tsx +28 -53
  242. package/dist/registry/Separator.tsx +52 -0
  243. package/dist/registry/ShareButtons.tsx +2 -2
  244. package/dist/registry/Sidebar.tsx +18 -18
  245. package/dist/registry/Skeleton.tsx +1 -1
  246. package/dist/registry/Slider.tsx +229 -0
  247. package/dist/registry/Spinner.tsx +32 -0
  248. package/dist/registry/SpotlightCard.tsx +6 -6
  249. package/dist/registry/Stat.tsx +4 -4
  250. package/dist/registry/StatCard.tsx +19 -19
  251. package/dist/registry/Steps.tsx +7 -7
  252. package/dist/registry/Table.tsx +12 -10
  253. package/dist/registry/TableOfContents.tsx +8 -8
  254. package/dist/registry/Tabs.tsx +6 -6
  255. package/dist/registry/TagInput.tsx +9 -9
  256. package/dist/registry/Textarea.tsx +5 -5
  257. package/dist/registry/TimePicker.tsx +315 -0
  258. package/dist/registry/Timeline.tsx +14 -14
  259. package/dist/registry/Toast.tsx +15 -12
  260. package/dist/registry/Toggle.tsx +7 -10
  261. package/dist/registry/Tooltip.tsx +21 -73
  262. package/dist/registry/styles.css +868 -62
  263. package/dist/registry/useFloatingPanel.ts +112 -0
  264. package/dist/styles.css +868 -62
  265. package/dist/useFloatingPanel.d.ts +24 -0
  266. package/dist/useFloatingPanel.js +89 -0
  267. package/dist/useFloatingPanel.js.map +1 -0
  268. package/dist/useModalBehavior.d.ts +15 -0
  269. package/dist/useModalBehavior.js +57 -0
  270. package/dist/useModalBehavior.js.map +1 -0
  271. package/package.json +1 -1
@@ -0,0 +1,241 @@
1
+ "use client";
2
+
3
+ import React, { useEffect, useId, useRef, useState } from "react";
4
+ import type { DropdownMenuItem } from "./DropdownMenu";
5
+ import { LAYER, Portal } from "./Floating";
6
+ import { Kbd } from "./Kbd";
7
+
8
+ export type ContextMenuItem = DropdownMenuItem;
9
+
10
+ interface ContextMenuProps {
11
+ /** The area that answers a right-click */
12
+ children: React.ReactNode;
13
+ items: ContextMenuItem[];
14
+ onSelect?: (key: string) => void;
15
+ disabled?: boolean;
16
+ className?: string;
17
+ }
18
+
19
+ const PAD = 8;
20
+ const LONG_PRESS = 500;
21
+
22
+ /* The same panel as DropdownMenu, opened where you right-click instead of
23
+ under a button. A long press opens it on touch, and the context-menu
24
+ key or shift+F10 opens it from the keyboard at the focused element.
25
+ It grows out of the corner nearest the pointer and flips to stay on
26
+ screen. */
27
+ export function ContextMenu({ children, items, onSelect, disabled = false, className = "" }: ContextMenuProps) {
28
+ const uid = useId();
29
+ const areaRef = useRef<HTMLDivElement>(null);
30
+ const menuRef = useRef<HTMLDivElement | null>(null);
31
+ const [point, setPoint] = useState<{ x: number; y: number } | null>(null);
32
+ const [mounted, setMounted] = useState(false);
33
+ const [visible, setVisible] = useState(false);
34
+ const press = useRef<ReturnType<typeof setTimeout> | null>(null);
35
+ const open = point !== null;
36
+
37
+ if (open && !mounted) setMounted(true);
38
+ if (!open && visible) setVisible(false);
39
+
40
+ const enabledItems = () =>
41
+ Array.from(menuRef.current?.querySelectorAll<HTMLElement>('[role="menuitem"]:not([disabled])') ?? []);
42
+
43
+ useEffect(() => {
44
+ if (open) {
45
+ const id = requestAnimationFrame(() =>
46
+ requestAnimationFrame(() => {
47
+ setVisible(true);
48
+ menuRef.current?.querySelector<HTMLElement>('[role="menuitem"]:not([disabled])')?.focus();
49
+ }),
50
+ );
51
+ return () => cancelAnimationFrame(id);
52
+ }
53
+ const t = setTimeout(() => setMounted(false), 160);
54
+ return () => clearTimeout(t);
55
+ }, [open]);
56
+
57
+ useEffect(() => {
58
+ if (!open) return;
59
+ const shut = (e: Event) => {
60
+ if (menuRef.current?.contains(e.target as Node)) return;
61
+ setPoint(null);
62
+ };
63
+ const onScroll = () => setPoint(null);
64
+ document.addEventListener("pointerdown", shut);
65
+ window.addEventListener("scroll", onScroll, true);
66
+ window.addEventListener("resize", onScroll);
67
+ window.addEventListener("blur", onScroll);
68
+ return () => {
69
+ document.removeEventListener("pointerdown", shut);
70
+ window.removeEventListener("scroll", onScroll, true);
71
+ window.removeEventListener("resize", onScroll);
72
+ window.removeEventListener("blur", onScroll);
73
+ };
74
+ }, [open]);
75
+
76
+ /* Placed as soon as it's attached: beside the pointer, flipped left or
77
+ up if it would run off the edge. Only writes to the element, so it
78
+ can run on every render without setting state. */
79
+ const attach = (el: HTMLDivElement | null) => {
80
+ menuRef.current = el;
81
+ if (!el || !point) return;
82
+ const w = el.offsetWidth;
83
+ const h = el.offsetHeight;
84
+ const vw = document.documentElement.clientWidth;
85
+ const vh = window.innerHeight;
86
+ const flipX = point.x + w > vw - PAD;
87
+ const flipY = point.y + h > vh - PAD;
88
+ el.style.left = `${Math.max(PAD, flipX ? point.x - w : point.x)}px`;
89
+ el.style.top = `${Math.max(PAD, flipY ? point.y - h : point.y)}px`;
90
+ el.style.transformOrigin = `${flipY ? "bottom" : "top"} ${flipX ? "right" : "left"}`;
91
+ };
92
+
93
+ const openAt = (x: number, y: number) => {
94
+ if (disabled) return;
95
+ setPoint({ x, y });
96
+ };
97
+
98
+ const close = (refocus = true) => {
99
+ setPoint(null);
100
+ if (refocus) areaRef.current?.focus({ preventScroll: true });
101
+ };
102
+
103
+ const onMenuKeyDown = (e: React.KeyboardEvent) => {
104
+ const list = enabledItems();
105
+ const at = list.indexOf(document.activeElement as HTMLElement);
106
+ const go = (i: number) => list[(i + list.length) % list.length]?.focus();
107
+ switch (e.key) {
108
+ case "ArrowDown":
109
+ e.preventDefault();
110
+ go(at + 1);
111
+ break;
112
+ case "ArrowUp":
113
+ e.preventDefault();
114
+ go(at - 1);
115
+ break;
116
+ case "Home":
117
+ e.preventDefault();
118
+ go(0);
119
+ break;
120
+ case "End":
121
+ e.preventDefault();
122
+ go(list.length - 1);
123
+ break;
124
+ case "Escape":
125
+ e.preventDefault();
126
+ e.stopPropagation();
127
+ close();
128
+ break;
129
+ case "Tab":
130
+ e.preventDefault();
131
+ close();
132
+ break;
133
+ }
134
+ };
135
+
136
+ const cancelPress = () => {
137
+ if (press.current) clearTimeout(press.current);
138
+ };
139
+
140
+ return (
141
+ <>
142
+ <div
143
+ ref={areaRef}
144
+ tabIndex={0}
145
+ aria-haspopup="menu"
146
+ aria-expanded={open}
147
+ aria-controls={open ? `${uid}-menu` : undefined}
148
+ aria-describedby={`${uid}-how`}
149
+ className={["outline-none focus-visible:ring-2 focus-visible:ring-ink focus-visible:ring-offset-2 focus-visible:ring-offset-page", className].join(" ")}
150
+ onContextMenu={(e) => {
151
+ if (disabled) return;
152
+ e.preventDefault();
153
+ openAt(e.clientX, e.clientY);
154
+ }}
155
+ onKeyDown={(e) => {
156
+ if (e.key === "ContextMenu" || (e.shiftKey && e.key === "F10")) {
157
+ e.preventDefault();
158
+ const r = areaRef.current!.getBoundingClientRect();
159
+ openAt(r.left + 16, r.top + 16);
160
+ }
161
+ }}
162
+ onPointerDown={(e) => {
163
+ if (e.pointerType !== "touch") return;
164
+ const { clientX, clientY } = e;
165
+ cancelPress();
166
+ press.current = setTimeout(() => openAt(clientX, clientY), LONG_PRESS);
167
+ }}
168
+ onPointerUp={cancelPress}
169
+ onPointerMove={cancelPress}
170
+ onPointerCancel={cancelPress}
171
+ >
172
+ {children}
173
+ <span id={`${uid}-how`} className="sr-only">
174
+ right-click, long-press, or press shift f10 for options
175
+ </span>
176
+ </div>
177
+
178
+ {mounted && (
179
+ <Portal>
180
+ <div
181
+ ref={attach}
182
+ id={`${uid}-menu`}
183
+ role="menu"
184
+ onKeyDown={onMenuKeyDown}
185
+ onContextMenu={(e) => e.preventDefault()}
186
+ className="min-w-[200px] rounded-[16px] p-1.5 transition-[opacity,transform] duration-150 ease-[var(--ease-spring)]"
187
+ style={{
188
+ position: "fixed",
189
+ top: 0,
190
+ left: 0,
191
+ zIndex: LAYER.floating,
192
+ opacity: visible ? 1 : 0,
193
+ transform: visible ? "none" : "scale(0.94)",
194
+ background: "var(--panel-bezel)",
195
+ boxShadow: "var(--overlay-shadow)",
196
+ }}
197
+ >
198
+ <div className="flex flex-col rounded-[11px] bg-panel-face p-1" style={{ boxShadow: "var(--panel-face-shadow)" }}>
199
+ {items.map((item) =>
200
+ item.divider ? (
201
+ <div key={item.key} role="separator" className="mx-2 my-1 h-px bg-line" />
202
+ ) : (
203
+ <button
204
+ key={item.key}
205
+ type="button"
206
+ role="menuitem"
207
+ tabIndex={-1}
208
+ disabled={item.disabled}
209
+ onClick={() => {
210
+ onSelect?.(item.key);
211
+ close();
212
+ }}
213
+ onMouseEnter={(e) => e.currentTarget.focus()}
214
+ className={[
215
+ "group/item flex w-full cursor-pointer items-center gap-2.5 rounded-[8px] px-2.5 py-2 text-[13px] font-medium outline-none",
216
+ "transition-[background,color] duration-100 disabled:pointer-events-none disabled:opacity-35",
217
+ item.danger ? "text-danger focus:bg-danger-wash" : "text-ink-label focus:bg-surface-active/80 focus:text-ink",
218
+ ].join(" ")}
219
+ >
220
+ {item.icon && (
221
+ <span
222
+ className={[
223
+ "flex h-4 w-4 shrink-0 items-center justify-center transition-colors duration-100",
224
+ item.danger ? "text-danger-soft" : "text-ink-faint group-focus/item:text-ink-label",
225
+ ].join(" ")}
226
+ >
227
+ {item.icon}
228
+ </span>
229
+ )}
230
+ <span className="flex-1 text-left">{item.label}</span>
231
+ {item.shortcut && <Kbd className="shrink-0">{item.shortcut}</Kbd>}
232
+ </button>
233
+ ),
234
+ )}
235
+ </div>
236
+ </div>
237
+ </Portal>
238
+ )}
239
+ </>
240
+ );
241
+ }
@@ -21,7 +21,7 @@ export function DataList({ items, columns = 1, className = "" }: DataListProps)
21
21
  className={[
22
22
  // 1px gaps over a hairline-coloured face draw the grid lines, so
23
23
  // borders never double up whatever the item count
24
- "grid gap-px bg-neutral-900/[0.05] rounded-[13px] overflow-hidden",
24
+ "grid gap-px bg-ink/[0.05] rounded-[13px] overflow-hidden",
25
25
  columns === 2 ? "grid-cols-1 sm:grid-cols-2" : "grid-cols-1",
26
26
  ].join(" ")}
27
27
  style={{ boxShadow: "var(--panel-face-shadow)" }}
@@ -30,15 +30,15 @@ export function DataList({ items, columns = 1, className = "" }: DataListProps)
30
30
  <div
31
31
  key={i}
32
32
  className={[
33
- "flex flex-col gap-1.5 px-5 py-4 bg-white",
33
+ "flex flex-col gap-1.5 px-5 py-4 bg-panel-face",
34
34
  // An odd last cell in two columns spans the row instead of leaving a hole
35
35
  columns === 2 && items.length % 2 === 1 && i === items.length - 1 ? "sm:col-span-2" : "",
36
36
  ].join(" ")}
37
37
  >
38
- <dt className="text-[12px] text-neutral-500">
38
+ <dt className="text-[12px] text-ink-muted">
39
39
  {item.label}
40
40
  </dt>
41
- <dd className="min-h-6 flex items-center text-[14px] font-medium text-neutral-900 tracking-[-0.01em] tabular-nums">
41
+ <dd className="min-h-6 flex items-center text-[14px] font-medium text-ink tracking-[-0.01em] tabular-nums">
42
42
  {item.value}
43
43
  </dd>
44
44
  </div>